@kolatts/pncli 1.22.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/services/git/client.ts","../src/lib/git-context.ts","../src/services/bitbucket/client.ts","../src/services/git/commands.ts","../src/services/jira/commands.ts","../src/services/jira/client.ts","../src/lib/mime.ts","../src/services/jira/custom-fields.ts","../src/services/jira/input-schema.ts","../src/lib/input.ts","../src/services/bitbucket/commands.ts","../src/services/github/commands.ts","../src/services/github/client.ts","../src/services/confluence/commands.ts","../src/services/confluence/client.ts","../src/services/sonar/client.ts","../src/services/sonar/commands.ts","../src/services/sde/client.ts","../src/services/sde/commands.ts","../src/services/deps/commands.ts","../src/services/deps/parsers/index.ts","../src/services/deps/parsers/npm.ts","../src/services/deps/parsers/nuget.ts","../src/services/deps/parsers/maven.ts","../src/services/deps/scan.ts","../src/services/deps/semver.ts","../src/services/deps/diff.ts","../src/services/deps/clients/osv.ts","../src/services/deps/clients/sonatype.ts","../src/services/deps/clients/sonatypeiq.ts","../src/services/deps/clients/artifactory.ts","../src/services/deps/connectivity.ts","../src/services/deps/frisk.ts","../src/services/deps/outdated.ts","../src/services/deps/license-check.ts","../src/services/config/commands.ts","../src/services/ado/client/work.ts","../src/services/ado/discovery.ts","../src/services/ado/client/git.ts","../src/services/ado/client/build.ts","../src/services/ado/helpers.ts","../src/services/ado/commands/project.ts","../src/services/ado/commands/work.ts","../src/services/ado/input-schema.ts","../src/services/ado/commands/repo.ts","../src/services/ado/commands/pipeline.ts","../src/services/ado/commands/index.ts","../src/services/jenkins/client.ts","../src/services/jenkins/commands.ts","../src/services/artifactory/client.ts","../src/services/artifactory/commands.ts","../src/services/udeploy/client.ts","../src/services/udeploy/commands.ts","../src/services/checkmarx/client.ts","../src/services/checkmarx/commands.ts","../src/services/servicenow/commands.ts","../src/services/contrast/commands.ts","../src/services/sonatypeiq/commands.ts","../src/services/skills/commands.ts","../src/services/jwt/commands.ts","../src/services/openshift/commands.ts","../src/services/dynatrace/commands.ts"],"sourcesContent":["// TLS verification is disabled by default — most enterprise Data Center installs\n// sit behind corporate SSL inspection proxies that break standard certificate chains.\n// To opt back in: set PNCLI_VERIFY_TLS=1\nif (!process.env.PNCLI_VERIFY_TLS) {\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';\n}\n\nimport { Command } from 'commander';\nimport { createRequire } from 'module';\nimport { setGlobalOptions, setGlobalUser } from './lib/output.js';\nimport { ExitCode } from './lib/exitCodes.js';\nimport { loadConfig } from './lib/config.js';\nimport { registerGitCommands } from './services/git/commands.js';\nimport { registerJiraCommands } from './services/jira/commands.js';\nimport { registerBitbucketCommands } from './services/bitbucket/commands.js';\nimport { registerGitHubCommands } from './services/github/commands.js';\nimport { registerConfluenceCommands } from './services/confluence/commands.js';\nimport { registerSonarCommands } from './services/sonar/commands.js';\nimport { registerSdeCommands } from './services/sde/commands.js';\nimport { registerDepsCommands } from './services/deps/commands.js';\nimport { registerConfigCommands } from './services/config/commands.js';\nimport { registerAdoCommands } from './services/ado/commands/index.js';\nimport { registerJenkinsCommands } from './services/jenkins/commands.js';\nimport { registerArtifactoryCommands } from './services/artifactory/commands.js';\nimport { registerUdeployCommands } from './services/udeploy/commands.js';\nimport { registerCheckmarxCommands } from './services/checkmarx/commands.js';\nimport { registerServiceNowCommands } from './services/servicenow/commands.js';\nimport { registerContrastCommands } from './services/contrast/commands.js';\nimport { registerSonatypeIqCommands } from './services/sonatypeiq/commands.js';\nimport { registerSkillsCommands } from './services/skills/commands.js';\nimport { registerJwtCommands } from './services/jwt/commands.js';\nimport { registerOpenShiftCommands } from './services/openshift/commands.js';\nimport { registerDynatraceCommands } from './services/dynatrace/commands.js';\n\nconst require = createRequire(import.meta.url);\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst pkg = require('../package.json') as any;\n\nconst TAGLINE = 'One command does what three meetings couldn\\'t.';\n\nconst program = new Command();\n\nprogram\n .name('pncli')\n .description(`The Paperwork Nightmare CLI — ${TAGLINE}`)\n .version(`${pkg.version as string} — ${TAGLINE}`, '-v, --version')\n .option('--pretty', 'Human-readable formatted output', false)\n .option('--verbose', 'Include full response metadata', false)\n .option('--debug', 'Print diagnostic traces (method, URL, status) for all API calls — does not log credentials', false)\n .option('--dry-run', 'Print API requests without executing', false)\n .option('--config <path>', 'Override global config file location')\n .option('--output-file <path>', 'Write JSON output to file instead of stdout');\n\n// Propagate global options and user identity before any command runs\nprogram.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setGlobalOptions({\n pretty: Boolean(opts.pretty),\n verbose: Boolean(opts.verbose),\n debug: Boolean(opts.debug),\n outputFile: opts.outputFile as string | undefined\n });\n try {\n const config = loadConfig({ configPath: opts.config as string | undefined });\n setGlobalUser(config.user);\n } catch {\n // config may not exist yet (e.g. during `config init`) — silently skip\n }\n});\n\nregisterGitCommands(program);\nregisterJiraCommands(program);\nregisterBitbucketCommands(program);\nregisterGitHubCommands(program);\nregisterConfluenceCommands(program);\nregisterSonarCommands(program);\nregisterSdeCommands(program);\nregisterDepsCommands(program);\nregisterConfigCommands(program);\nregisterAdoCommands(program);\nregisterJenkinsCommands(program);\nregisterArtifactoryCommands(program);\nregisterUdeployCommands(program);\nregisterCheckmarxCommands(program);\nregisterServiceNowCommands(program);\nregisterContrastCommands(program);\nregisterSonatypeIqCommands(program);\nregisterSkillsCommands(program);\nregisterJwtCommands(program);\nregisterOpenShiftCommands(program);\nregisterDynatraceCommands(program);\n\nprogram.addHelpText('after', `\nServices:\n git Local git operations (status, diff, log, branch)\n deps Dependency scanning, CVE detection, license auditing\n jira Jira Data Cloud\n bitbucket Bitbucket Server\n github GitHub (PRs, reviews, comments, checks)\n confluence Confluence\n sonar SonarQube Server (quality gates, issues, metrics, hotspots)\n sde SDElements (threat modeling, countermeasures, compliance)\n ado Azure DevOps Server (work items, repos, PRs, pipelines)\n jenkins Jenkins Data Center (jobs, builds, logs)\n artifactory Artifactory (repos, artifact search, build info, properties)\n udeploy IBM UrbanCode Deploy (component versions, deployment processes)\n checkmarx Checkmarx One (projects, scans, scan statistics)\n servicenow ServiceNow (change requests)\n contrast Contrast IAST (applications, vulnerability findings)\n sonatypeiq Sonatype IQ Server (applications, organizations, policies)\n openshift OpenShift / Kubernetes (pods, events, logs, metrics)\n dynatrace Dynatrace (services, entities, problems, traces, Kubernetes workloads)\n config Manage pncli configuration\n skills Download and manage Claude Code skills\n jwt JWT token utilities (decode header and payload)\n`);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (process.exitCode !== undefined) return; // already handled by fail() or dry-run\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = ExitCode.GENERAL_ERROR;\n});\n","import { execSync, execFileSync } from 'child_process';\n\nconst DIFF_LINE_LIMIT = 5000;\n\nexport interface GitStatusResult {\n staged: string[];\n unstaged: string[];\n untracked: string[];\n}\n\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n lines: string[];\n}\n\nexport interface DiffFile {\n path: string;\n binary: boolean;\n truncated: boolean;\n hunks: DiffHunk[];\n}\n\nexport interface DiffResult {\n files: DiffFile[];\n truncated: boolean;\n}\n\nexport interface CommitEntry {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\nexport interface BranchResult {\n current: string;\n local: string[];\n remote: string[];\n}\n\nfunction exec(cmd: string, cwd: string): string {\n return execSync(cmd, { encoding: 'utf8', cwd }).trim();\n}\n\nexport function getStatus(root: string): GitStatusResult {\n const output = exec('git status --porcelain', root);\n const staged: string[] = [];\n const unstaged: string[] = [];\n const untracked: string[] = [];\n\n if (!output) return { staged, unstaged, untracked };\n\n for (const line of output.split('\\n')) {\n if (!line) continue;\n const x = line[0]!;\n const y = line[1]!;\n const file = line.slice(3);\n\n if (x === '?' && y === '?') {\n untracked.push(file);\n } else {\n if (x !== ' ' && x !== '?') staged.push(file);\n if (y !== ' ' && y !== '?') unstaged.push(file);\n }\n }\n\n return { staged, unstaged, untracked };\n}\n\nfunction parseHunkHeader(header: string): { oldStart: number; oldCount: number; newStart: number; newCount: number } {\n const match = header.match(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (!match) return { oldStart: 0, oldCount: 0, newStart: 0, newCount: 0 };\n return {\n oldStart: parseInt(match[1]!, 10),\n oldCount: parseInt(match[2] ?? '1', 10),\n newStart: parseInt(match[3]!, 10),\n newCount: parseInt(match[4] ?? '1', 10)\n };\n}\n\nfunction parseDiff(rawDiff: string): DiffResult {\n const lines = rawDiff.split('\\n');\n const files: DiffFile[] = [];\n let globalTruncated = false;\n let lineCount = 0;\n\n let currentFile: DiffFile | null = null;\n let currentHunk: DiffHunk | null = null;\n\n for (const line of lines) {\n lineCount++;\n if (lineCount > DIFF_LINE_LIMIT) {\n globalTruncated = true;\n if (currentFile) currentFile.truncated = true;\n break;\n }\n\n if (line.startsWith('diff --git ')) {\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n currentHunk = null;\n if (currentFile) files.push(currentFile);\n\n const pathMatch = line.match(/diff --git a\\/(.+) b\\/.+$/);\n currentFile = {\n path: pathMatch ? pathMatch[1]! : line,\n binary: false,\n truncated: false,\n hunks: []\n };\n continue;\n }\n\n if (!currentFile) continue;\n\n if (line.startsWith('Binary files')) {\n currentFile.binary = true;\n continue;\n }\n\n if (line.startsWith('@@ ')) {\n if (currentHunk) currentFile.hunks.push(currentHunk);\n const { oldStart, oldCount, newStart, newCount } = parseHunkHeader(line);\n currentHunk = { oldStart, oldCount, newStart, newCount, lines: [] };\n continue;\n }\n\n if (currentHunk && (line.startsWith('+') || line.startsWith('-') || line.startsWith(' '))) {\n currentHunk.lines.push(line);\n }\n }\n\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n if (currentFile) files.push(currentFile);\n\n return { files, truncated: globalTruncated };\n}\n\nexport function getDiff(root: string, opts: { staged?: boolean; file?: string }): DiffResult {\n const args = ['git', 'diff'];\n if (opts.staged) args.push('--staged');\n if (opts.file) args.push('--', opts.file);\n\n try {\n const raw = exec(args.join(' '), root);\n if (!raw) return { files: [], truncated: false };\n return parseDiff(raw);\n } catch {\n return { files: [], truncated: false };\n }\n}\n\nexport function getLog(root: string, opts: { count?: number; since?: string }): CommitEntry[] {\n const sep = '\\x1F'; // ASCII unit separator — safe in git format strings\n const fmt = `%H${sep}%an${sep}%aI${sep}%s`;\n const args = [`log`, `--format=${fmt}`];\n if (opts.count) args.push(`-n`, String(opts.count));\n if (opts.since) args.push(`--since=${opts.since}`);\n\n try {\n const output = execFileSync('git', args, { encoding: 'utf8', cwd: root }).trim();\n if (!output) return [];\n return output.split('\\n').filter(Boolean).map(line => {\n const parts = line.split(sep);\n return {\n hash: parts[0] ?? '',\n author: parts[1] ?? '',\n date: parts[2] ?? '',\n message: parts[3] ?? ''\n };\n });\n } catch {\n return [];\n }\n}\n\nexport function getBranches(root: string): BranchResult {\n const output = exec('git branch -a', root);\n const local: string[] = [];\n const remote: string[] = [];\n let current = '';\n\n for (const line of output.split('\\n')) {\n if (!line.trim()) continue;\n const isCurrent = line.startsWith('*');\n const name = line.replace(/^\\*?\\s+/, '').trim();\n\n if (name.startsWith('remotes/')) {\n remote.push(name.replace('remotes/', ''));\n } else {\n if (isCurrent) current = name;\n local.push(name);\n }\n }\n\n return { current, local, remote };\n}\n\nexport interface CommitStats {\n hash: string;\n date: string;\n author: string;\n message: string;\n filesChanged: number;\n insertions: number;\n deletions: number;\n netLines: number;\n}\n\nexport interface AuthorStats {\n author: string;\n commitCount: number;\n insertions: number;\n deletions: number;\n netLines: number;\n filesChanged: number;\n}\n\nexport interface WeeklyBreakdown {\n week: string;\n weekStart: string;\n weekEnd: string;\n authors: AuthorStats[];\n summary: {\n commitCount: number;\n totalInsertions: number;\n totalDeletions: number;\n totalNetLines: number;\n totalFilesChanged: number;\n };\n}\n\nexport interface BranchReport {\n branch: string;\n since: string | null;\n until: string | null;\n commits: CommitStats[];\n weeks: WeeklyBreakdown[];\n byAuthor: AuthorStats[];\n summary: {\n commitCount: number;\n totalInsertions: number;\n totalDeletions: number;\n totalNetLines: number;\n totalFilesChanged: number;\n };\n}\n\nexport const COMMIT_PREFIX = '__PNCLI_COMMIT__';\n\nfunction getWeekMonday(dateStr: string): string {\n const d = new Date(dateStr);\n const day = d.getUTCDay(); // 0=Sun\n const diff = day === 0 ? -6 : 1 - day;\n const monday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + diff));\n return monday.toISOString().slice(0, 10);\n}\n\nfunction getWeekSunday(mondayStr: string): string {\n const d = new Date(mondayStr);\n const sunday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + 6));\n return sunday.toISOString().slice(0, 10);\n}\n\nfunction getISOWeekLabel(mondayStr: string): string {\n const d = new Date(mondayStr);\n // Thursday of the same week determines the ISO year\n const thursday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + 3));\n const year = thursday.getUTCFullYear();\n const jan4 = new Date(Date.UTC(year, 0, 4)); // Jan 4 is always in week 1\n const jan4Monday = new Date(Date.UTC(year, 0, 4 - (jan4.getUTCDay() === 0 ? 6 : jan4.getUTCDay() - 1)));\n const weekNum = Math.round((d.getTime() - jan4Monday.getTime()) / (7 * 86400000)) + 1;\n return `${year}-W${String(weekNum).padStart(2, '0')}`;\n}\n\nfunction buildWeeklyBreakdown(commits: CommitStats[]): WeeklyBreakdown[] {\n const weekMap = new Map<string, Map<string, AuthorStats>>();\n\n for (const commit of commits) {\n const monday = getWeekMonday(commit.date);\n if (!weekMap.has(monday)) weekMap.set(monday, new Map());\n const authorMap = weekMap.get(monday)!;\n\n if (!authorMap.has(commit.author)) {\n authorMap.set(commit.author, {\n author: commit.author,\n commitCount: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0,\n filesChanged: 0\n });\n }\n\n const stats = authorMap.get(commit.author)!;\n stats.commitCount++;\n stats.insertions += commit.insertions;\n stats.deletions += commit.deletions;\n stats.netLines += commit.netLines;\n stats.filesChanged += commit.filesChanged;\n }\n\n return [...weekMap.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([monday, authorMap]) => {\n const authors = [...authorMap.values()].sort((a, b) => a.author.localeCompare(b.author));\n return {\n week: getISOWeekLabel(monday),\n weekStart: monday,\n weekEnd: getWeekSunday(monday),\n authors,\n summary: {\n commitCount: authors.reduce((s, a) => s + a.commitCount, 0),\n totalInsertions: authors.reduce((s, a) => s + a.insertions, 0),\n totalDeletions: authors.reduce((s, a) => s + a.deletions, 0),\n totalNetLines: authors.reduce((s, a) => s + a.netLines, 0),\n totalFilesChanged: authors.reduce((s, a) => s + a.filesChanged, 0)\n }\n };\n });\n}\n\nfunction buildByAuthor(commits: CommitStats[]): AuthorStats[] {\n const map = new Map<string, AuthorStats>();\n for (const commit of commits) {\n if (!map.has(commit.author)) {\n map.set(commit.author, {\n author: commit.author,\n commitCount: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0,\n filesChanged: 0\n });\n }\n const stats = map.get(commit.author)!;\n stats.commitCount++;\n stats.insertions += commit.insertions;\n stats.deletions += commit.deletions;\n stats.netLines += commit.netLines;\n stats.filesChanged += commit.filesChanged;\n }\n return [...map.values()].sort((a, b) => a.author.localeCompare(b.author));\n}\n\n// Exported for unit testing\nexport function parseBranchReportOutput(\n raw: string,\n branchName: string,\n opts: { since?: string; until?: string }\n): BranchReport {\n const commits: CommitStats[] = [];\n let current: CommitStats | null = null;\n\n for (const line of raw.split('\\n')) {\n if (line.startsWith(COMMIT_PREFIX)) {\n if (current) commits.push(current);\n const parts = line.slice(COMMIT_PREFIX.length).split('\\t');\n current = {\n hash: parts[0] ?? '',\n author: parts[1] ?? '',\n date: parts[2] ?? '',\n message: parts[3] ?? '',\n filesChanged: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0\n };\n } else if (current && /^(\\d+|-)\\t(\\d+|-)/.test(line)) {\n // numstat line: insertions\\tdeletions\\tfilename\n const [ins, del] = line.split('\\t');\n const insertions = ins === '-' ? 0 : parseInt(ins ?? '0', 10);\n const deletions = del === '-' ? 0 : parseInt(del ?? '0', 10);\n if (!isNaN(insertions) && !isNaN(deletions)) {\n current.insertions += insertions;\n current.deletions += deletions;\n current.filesChanged++;\n current.netLines = current.insertions - current.deletions;\n }\n }\n }\n\n if (current) commits.push(current);\n\n // git --since/--until uses committer date for traversal, but we display and\n // report on author date (%aI). Apply a secondary filter by author date so\n // the output is consistent with the user-supplied range. Only applied for\n // absolute YYYY-MM-DD dates; relative values like \"2 weeks ago\" are left to\n // git alone since they cannot be parsed here.\n const isAbsoluteDate = (s: string): boolean => /^\\d{4}-\\d{2}-\\d{2}/.test(s);\n const sinceDate = opts.since && isAbsoluteDate(opts.since) ? opts.since.slice(0, 10) : null;\n const untilDate = opts.until && isAbsoluteDate(opts.until) ? opts.until.slice(0, 10) : null;\n const filteredCommits = (sinceDate || untilDate)\n ? commits.filter(c => {\n const d = c.date.slice(0, 10);\n if (sinceDate && d < sinceDate) return false;\n if (untilDate && d > untilDate) return false;\n return true;\n })\n : commits;\n\n const totalInsertions = filteredCommits.reduce((sum, c) => sum + c.insertions, 0);\n const totalDeletions = filteredCommits.reduce((sum, c) => sum + c.deletions, 0);\n\n return {\n branch: branchName,\n since: opts.since ?? null,\n until: opts.until ?? null,\n commits: filteredCommits,\n weeks: buildWeeklyBreakdown(filteredCommits),\n byAuthor: buildByAuthor(filteredCommits),\n summary: {\n commitCount: filteredCommits.length,\n totalInsertions,\n totalDeletions,\n totalNetLines: totalInsertions - totalDeletions,\n totalFilesChanged: filteredCommits.reduce((sum, c) => sum + c.filesChanged, 0)\n }\n };\n}\n\n// Normalize a date-only string (YYYY-MM-DD) to include an explicit time and\n// UTC timezone component so that git's date parser uses its strict ISO 8601\n// path on all platforms. Without a timezone suffix, some git versions fall\n// back to the approxidate fuzzy parser, which can mis-parse previous-year\n// dates and exit non-zero — the silent try/catch in getBranchReport then\n// returns raw=\"\" and the report shows zero commits. Adding +00:00 forces the\n// strict parser on every git version. Strings that already contain a time\n// component are returned as-is.\nfunction normalizeGitDate(dateStr: string): string {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(dateStr)) {\n return `${dateStr}T00:00:00+00:00`;\n }\n return dateStr;\n}\n\n// Exported for unit testing — pure arg construction with no I/O\nexport function buildReportArgs(opts: { branch?: string; since?: string; until?: string; base?: string }): string[] {\n const fmt = `${COMMIT_PREFIX}%H\\t%an\\t%aI\\t%s`;\n const args = ['log', `--format=${fmt}`, '--numstat'];\n\n if (opts.since) args.push(`--since=${normalizeGitDate(opts.since)}`);\n if (opts.until) args.push(`--until=${normalizeGitDate(opts.until)}`);\n\n if (opts.base && opts.branch) {\n args.push(`${opts.base}..${opts.branch}`);\n } else if (opts.base) {\n args.push(`${opts.base}..HEAD`);\n } else if (opts.branch) {\n args.push(opts.branch);\n }\n\n return args;\n}\n\nexport function getBranchReport(\n root: string,\n opts: { branch?: string; since?: string; until?: string; base?: string }\n): BranchReport {\n const args = buildReportArgs(opts);\n\n let raw = '';\n try {\n raw = execFileSync('git', args, { encoding: 'utf8', cwd: root, maxBuffer: 200 * 1024 * 1024 }).trim();\n } catch {\n // no commits or invalid ref — return empty report\n }\n\n let branchName = opts.branch ?? '';\n if (!branchName) {\n try {\n branchName = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\n encoding: 'utf8',\n cwd: root\n }).trim();\n } catch {\n branchName = 'HEAD';\n }\n }\n\n return parseBranchReportOutput(raw, branchName, opts);\n}\n\nfunction escapeCsvField(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport function formatBranchReportCsv(report: BranchReport): string {\n const header = 'week,week_start,author,commits,insertions,deletions,net_lines,files_changed';\n const rows: string[] = [];\n\n for (const week of report.weeks) {\n for (const a of week.authors) {\n rows.push(\n [\n week.week,\n week.weekStart,\n escapeCsvField(a.author),\n a.commitCount,\n a.insertions,\n a.deletions,\n a.netLines,\n a.filesChanged\n ].join(',')\n );\n }\n }\n\n const s = report.summary;\n const totalRow = ['TOTAL', '', '', s.commitCount, s.totalInsertions, s.totalDeletions, s.totalNetLines, s.totalFilesChanged].join(',');\n\n return [header, ...rows, totalRow].join('\\n') + '\\n';\n}\n","import { execSync } from 'child_process';\nimport type { ResolvedConfig } from '../types/config.js';\n\nexport interface GitContext {\n root: string;\n branch: string;\n // Bitbucket-resolved fields\n project: string | null;\n repo: string | null;\n // Azure DevOps Server-resolved fields\n ado: { collection: string; project: string; repo: string } | null;\n // GitHub-resolved fields\n github: { owner: string; repo: string } | null;\n}\n\nexport function getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n } catch {\n return null;\n }\n}\n\nexport function getCurrentBranch(repoRoot: string): string | null {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n cwd: repoRoot\n }).trim();\n } catch {\n return null;\n }\n}\n\nexport function parseRemote(\n remoteUrl: string,\n bitbucketBaseUrl: string | undefined\n): { project: string; repo: string } | null {\n if (!bitbucketBaseUrl) return null;\n\n // Normalize base URL for comparison\n const base = bitbucketBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '');\n\n // SSH format: git@bitbucket.imagile.dev:7999/PROJ/repo.git\n const sshMatch = remoteUrl.match(/^git@([^:]+)(?::\\d+)?[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n const [, host, project, repo] = sshMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n // HTTPS format: https://bitbucket.imagile.dev/scm/PROJ/repo.git\n const httpsMatch = remoteUrl.match(/^https?:\\/\\/([^/]+)\\/scm\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (httpsMatch) {\n const [, host, project, repo] = httpsMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n return null;\n}\n\n/**\n * Parses an Azure DevOps Server git remote URL into { collection, project, repo }.\n *\n * Supported formats:\n * HTTPS : https://<host>[/<prefix>]/<collection>/<project>/_git/<repo>\n * SSH : ssh://git@<host>[:<port>][/<prefix>]/<collection>/<project>/_ssh/<repo>\n * git@<host>[:<port>]/<prefix>/<collection>/<project>/<repo>\n *\n * Strategy: find the `_git` or `_ssh` segment; walk back — the segment immediately\n * before it is the project, the one before that is the collection. Anything before\n * the collection is treated as a path prefix (e.g. /tfs/) and is ignored.\n * URL is only parsed if the host is contained in adoBaseUrl (same guard as Bitbucket).\n */\nexport function parseAdoRemote(\n remoteUrl: string,\n adoBaseUrl: string | undefined\n): { collection: string; project: string; repo: string } | null {\n if (!adoBaseUrl) return null;\n\n // Normalize base URL: extract just the hostname (without port) for comparison,\n // so that https://tfs.imagile.dev:8080 and git@tfs.imagile.dev:... both match.\n let baseHostname: string;\n try {\n const normalizedBase = /^https?:\\/\\//.test(adoBaseUrl) ? adoBaseUrl : `https://${adoBaseUrl}`;\n baseHostname = new URL(normalizedBase).hostname.toLowerCase();\n } catch {\n baseHostname = adoBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '').split(/[:/]/)[0]!.toLowerCase();\n }\n\n // Extract host from the remote URL (after stripping protocol/credentials)\n let path = remoteUrl;\n let remoteHostname = '';\n\n // ssh:// form\n const sshProtoMatch = path.match(/^ssh:\\/\\/[^@]*@?([^/:]+)(?::\\d+)?(.*)/);\n if (sshProtoMatch) {\n remoteHostname = sshProtoMatch[1]!.toLowerCase();\n path = sshProtoMatch[2]!;\n } else {\n // git@host form or https://\n const gitAtMatch = path.match(/^git@([^:]+)(?::\\d+)?:(.*)/);\n if (gitAtMatch) {\n remoteHostname = gitAtMatch[1]!.toLowerCase();\n path = '/' + gitAtMatch[2]!;\n } else {\n const httpsMatch = path.match(/^https?:\\/\\/([^/:]+)(?::\\d+)?(.*)/);\n if (httpsMatch) {\n remoteHostname = httpsMatch[1]!.toLowerCase();\n path = httpsMatch[2]!;\n }\n }\n }\n\n if (!remoteHostname || remoteHostname !== baseHostname) return null;\n\n // Strip trailing .git\n path = path.replace(/\\.git$/, '');\n\n // Find _git or _ssh segment\n const gitIdx = path.indexOf('/_git/');\n const sshIdx = path.indexOf('/_ssh/');\n const markerIdx = gitIdx !== -1 ? gitIdx : sshIdx;\n if (markerIdx === -1) return null;\n\n const repo = decodeURIComponent(path.slice(markerIdx + 6)); // skip /_git/ or /_ssh/\n if (!repo) return null;\n\n // Everything before the marker: /<prefix>/<collection>/<project>\n const before = path.slice(1, markerIdx); // strip leading /\n const parts = before.split('/').filter(Boolean);\n if (parts.length < 2) return null;\n\n const project = decodeURIComponent(parts[parts.length - 1]!);\n const collection = decodeURIComponent(parts[parts.length - 2]!);\n\n return { collection, project, repo };\n}\n\n/**\n * Parses a GitHub remote URL into { owner, repo }.\n *\n * Supported formats:\n * HTTPS : https://github.com/{owner}/{repo}[.git]\n * https://{githubHost}/{owner}/{repo}[.git]\n * SSH : git@github.com:{owner}/{repo}[.git]\n * git@{githubHost}:{owner}/{repo}[.git]\n * ssh://git@{githubHost}[:port]/{owner}/{repo}[.git]\n *\n * When baseUrl is provided (for GitHub Enterprise), only URLs matching that host are accepted.\n * When baseUrl is undefined, only github.com URLs are matched.\n */\nexport function parseGitHubRemote(\n remoteUrl: string,\n baseUrl: string | undefined\n): { owner: string; repo: string } | null {\n // Determine which host(s) to match\n let targetHost: string;\n if (baseUrl) {\n try {\n const normalizedBase = /^https?:\\/\\//i.test(baseUrl) ? baseUrl : `https://${baseUrl}`;\n const hostname = new URL(normalizedBase).hostname.toLowerCase();\n // api.github.com is the REST API host but git remotes use github.com\n targetHost = hostname === 'api.github.com' ? 'github.com' : hostname;\n } catch {\n targetHost = baseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//i, '').split(/[:/]/)[0]!.toLowerCase();\n }\n } else {\n targetHost = 'github.com';\n }\n\n // SSH format: git@{host}:{owner}/{repo}[.git]\n const sshMatch = remoteUrl.match(/^git@([^:]+):([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n const [, host, owner, repo] = sshMatch;\n if (host!.toLowerCase() === targetHost) {\n return { owner: owner!, repo: repo! };\n }\n }\n\n // ssh:// protocol form: ssh://git@{host}[:port]/{owner}/{repo}[.git]\n const sshProtoMatch = remoteUrl.match(/^ssh:\\/\\/git@([^/:]+)(?::\\d+)?\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshProtoMatch) {\n const [, host, owner, repo] = sshProtoMatch;\n if (host!.toLowerCase() === targetHost) {\n return { owner: owner!, repo: repo! };\n }\n }\n\n // HTTPS format: https://{host}/{owner}/{repo}[.git]\n const httpsMatch = remoteUrl.match(/^https?:\\/\\/([^/:]+)(?::\\d+)?\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (httpsMatch) {\n const [, host, owner, repo] = httpsMatch;\n if (host!.toLowerCase() === targetHost) {\n return { owner: owner!, repo: repo! };\n }\n }\n\n return null;\n}\n\nfunction getRemoteUrls(repoRoot: string): string[] {\n try {\n const output = execSync('git remote -v', { encoding: 'utf8', cwd: repoRoot });\n return output\n .split('\\n')\n .filter(line => line.includes('(fetch)'))\n .map(line => line.split('\\t')[1]?.split(' ')[0] ?? '')\n .filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getGitContext(config: ResolvedConfig): GitContext | null {\n const root = getRepoRoot();\n if (!root) return null;\n\n const branch = getCurrentBranch(root) ?? 'unknown';\n const remoteUrls = getRemoteUrls(root);\n\n // Bitbucket: disambiguated by /scm/ pattern\n let project: string | null = null;\n let repo: string | null = null;\n for (const url of remoteUrls) {\n const parsed = parseRemote(url, config.bitbucket.baseUrl);\n if (parsed) {\n project = parsed.project;\n repo = parsed.repo;\n break;\n }\n }\n\n // Azure DevOps Server: disambiguated by /_git/ pattern\n let adoContext: GitContext['ado'] = null;\n for (const url of remoteUrls) {\n const parsed = parseAdoRemote(url, config.ado.baseUrl);\n if (parsed) {\n adoContext = parsed;\n break;\n }\n }\n\n // GitHub: disambiguated by github.com host or configured baseUrl\n let githubContext: GitContext['github'] = null;\n for (const url of remoteUrls) {\n const parsed = parseGitHubRemote(url, config.github.baseUrl);\n if (parsed) {\n githubContext = parsed;\n break;\n }\n }\n\n return { root, branch, project, repo, ado: adoContext, github: githubContext };\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n BitbucketPR,\n BitbucketUser,\n BitbucketComment,\n BitbucketPageResponse,\n BitbucketBuildStatus,\n BitbucketRepo\n} from '../../types/bitbucket.js';\n\nconst API = '/rest/api/1.0';\n\nexport interface ListPRsOpts {\n project: string;\n repo: string;\n state?: string;\n author?: string;\n reviewer?: string;\n}\n\nexport interface CreatePROpts {\n project: string;\n repo: string;\n title: string;\n source: string;\n target: string;\n description?: string;\n reviewers?: string[];\n}\n\nexport interface UpdatePROpts {\n project: string;\n repo: string;\n id: number;\n title?: string;\n description?: string;\n reviewers?: string[];\n version: number;\n}\n\nexport interface MergePROpts {\n project: string;\n repo: string;\n id: number;\n version: number;\n strategy?: 'merge' | 'squash' | 'ff';\n deleteBranch?: boolean;\n}\n\nexport interface InlineCommentOpts {\n project: string;\n repo: string;\n prId: number;\n text: string;\n filePath: string;\n line: number;\n lineType?: 'ADDED' | 'REMOVED' | 'CONTEXT';\n}\n\nexport interface CreateRepoOpts {\n project: string;\n name: string;\n description?: string;\n}\n\nexport class BitbucketClient {\n constructor(private http: HttpClient) {}\n\n async listPRs(opts: ListPRsOpts): Promise<BitbucketPR[]> {\n return this.http.paginate<BitbucketPR>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<BitbucketPR>>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n params: {\n state: opts.state ?? 'OPEN',\n ...(opts.author ? { 'author.username': opts.author } : {}),\n start,\n limit\n }\n }\n )\n );\n }\n\n async getPR(project: string, repo: string, id: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}`\n );\n }\n\n async createPR(opts: CreatePROpts): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n description: opts.description,\n fromRef: {\n id: `refs/heads/${opts.source}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n toRef: {\n id: `refs/heads/${opts.target}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n reviewers: (opts.reviewers ?? []).map(slug => ({ user: { slug } }))\n }\n }\n );\n }\n\n async updatePR(opts: UpdatePROpts): Promise<BitbucketPR> {\n const body: Record<string, unknown> = { version: opts.version };\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (opts.reviewers) body.reviewers = opts.reviewers.map(slug => ({ user: { slug } }));\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}`,\n { method: 'PUT', body }\n );\n }\n\n async mergePR(opts: MergePROpts): Promise<BitbucketPR> {\n const params: Record<string, string | number | boolean | undefined> = {\n version: opts.version\n };\n const body: Record<string, unknown> = {};\n if (opts.strategy) body.strategyId = opts.strategy;\n if (opts.deleteBranch) body.autoSubject = true;\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}/merge`,\n { method: 'POST', params, body }\n );\n }\n\n async declinePR(project: string, repo: string, id: number, version: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}/decline`,\n { method: 'POST', params: { version } }\n );\n }\n\n async listComments(\n project: string,\n repo: string,\n prId: number,\n opts: { withReplies?: boolean; inlineOnly?: boolean; generalOnly?: boolean } = {}\n ): Promise<BitbucketComment[]> {\n const { withReplies = true, inlineOnly = false, generalOnly = false } = opts;\n\n interface Activity { action: string; comment?: BitbucketComment }\n const activities = await this.http.paginate<Activity>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<Activity>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/activities`,\n { params: { start, limit } }\n )\n );\n\n const topLevel = activities\n .filter(a => a.action === 'COMMENTED' && a.comment)\n .map(a => a.comment!);\n\n if (!withReplies) {\n return topLevel\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor);\n }\n\n // Recursively flatten nested replies, tagging each with its parentId\n function flatten(comment: BitbucketComment, parentId?: number): BitbucketComment[] {\n const node: BitbucketComment = {\n ...comment,\n comments: undefined,\n ...(parentId !== undefined ? { parentId } : {})\n };\n const replies = (comment.comments ?? []).flatMap(c => flatten(c, comment.id));\n return [node, ...replies];\n }\n\n const flat = topLevel.flatMap(c => flatten(c));\n return flat\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor)\n .sort((a, b) => a.createdDate - b.createdDate);\n }\n\n async addComment(project: string, repo: string, prId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text } }\n );\n }\n\n async addInlineComment(opts: InlineCommentOpts): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.prId}/comments`,\n {\n method: 'POST',\n body: {\n text: opts.text,\n anchor: {\n line: opts.line,\n lineType: opts.lineType ?? 'ADDED',\n fileType: 'TO',\n path: opts.filePath\n }\n }\n }\n );\n }\n\n async replyComment(project: string, repo: string, prId: number, commentId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text, parent: { id: commentId } } }\n );\n }\n\n async resolveComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}/resolve`,\n { method: 'PUT', params: { version } }\n );\n }\n\n async deleteComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}`,\n { method: 'DELETE', params: { version } }\n );\n }\n\n async getDiff(project: string, repo: string, prId: number, file?: string, contextLines?: number): Promise<string> {\n const params: Record<string, string | number | boolean | undefined> = {};\n if (contextLines !== undefined) params.contextLines = contextLines;\n\n // Bitbucket Server scopes the diff to a specific file via a URL path segment,\n // not a query parameter: /diff/{filepath}\n const diffPath = file\n ? `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/diff/${file}`\n : `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/diff`;\n\n const result = await this.http.bitbucket<{ diffs?: unknown[] } | string>(\n diffPath,\n { params }\n );\n // Return raw diff as string\n return typeof result === 'string' ? result : JSON.stringify(result);\n }\n\n async listFiles(project: string, repo: string, prId: number): Promise<string[]> {\n const result = await this.http.bitbucket<{ values?: Array<{ path: { toString: string } }> }>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/changes`,\n { params: { limit: 1000 } }\n );\n return (result.values ?? []).map(v => (typeof v.path === 'string' ? v.path : JSON.stringify(v.path)));\n }\n\n async getCurrentUser(): Promise<BitbucketUser> {\n // GET /rest/api/1.0/application-properties is a lightweight endpoint present on all\n // Bitbucket Server versions. Every authenticated REST response sets X-AUSERNAME to\n // the caller's username, which is more reliable than GET /plugins/servlet/applinks/whoami\n // — that endpoint returns an empty body for PAT/Bearer-token requests on some instances\n // (e.g. Bitbucket Server v9.4.16), causing a mis-resolved user lookup.\n const { headers } = await this.http.bitbucketRaw<{ version?: string }>(\n `${API}/application-properties`\n );\n const username = headers.get('x-ausername');\n if (!username) {\n throw new PncliError(\n 'Could not determine current Bitbucket user: X-AUSERNAME header was absent from the server response',\n 1,\n `${API}/application-properties`\n );\n }\n return this.http.bitbucket<BitbucketUser>(`${API}/users/${encodeURIComponent(username)}`);\n }\n\n async approvePR(project: string, repo: string, prId: number): Promise<unknown> {\n // POST /approve is the dedicated endpoint — no user slug required, and Bitbucket\n // Server auto-promotes the caller to reviewer if they aren't one already.\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/approve`,\n { method: 'POST' }\n );\n }\n\n async unapprovePR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/approve`,\n { method: 'DELETE' }\n );\n }\n\n async needsWorkPR(project: string, repo: string, prId: number): Promise<unknown> {\n // Bitbucket Server only allows reviewers to set NEEDS_WORK — unlike APPROVED, which\n // auto-promotes the caller to reviewer, NEEDS_WORK returns 403 for non-reviewers.\n // Resolve the current user and the PR in parallel, auto-add the user as a reviewer\n // if they aren't already, then mark needs-work using the resolved slug.\n const [currentUser, pr] = await Promise.all([\n this.getCurrentUser(),\n this.getPR(project, repo, prId),\n ]);\n\n const isReviewer = pr.reviewers.some(r => r.user.slug === currentUser.slug);\n if (!isReviewer) {\n await this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants`,\n { method: 'POST', body: { user: { name: currentUser.name }, role: 'REVIEWER' } }\n );\n }\n\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/${currentUser.slug}`,\n { method: 'PUT', body: { status: 'NEEDS_WORK' } }\n );\n }\n\n async listReviewers(project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(project, repo, prId);\n return pr.reviewers;\n }\n\n async addReviewer(project: string, repo: string, prId: number, username: string): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants`,\n { method: 'POST', body: { user: { name: username }, role: 'REVIEWER' } }\n );\n }\n\n async listBuilds(project: string, repo: string, prId: number): Promise<BitbucketBuildStatus[]> {\n // Get the latest commit on the source branch\n const commits = await this.http.bitbucket<BitbucketPageResponse<{ id: string }>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/commits`,\n { params: { limit: 1 } }\n );\n const sha = commits.values[0]?.id;\n if (!sha) return [];\n return this.getBuildStatus(sha);\n }\n\n async getBuildStatus(commit: string): Promise<BitbucketBuildStatus[]> {\n const result = await this.http.bitbucket<BitbucketPageResponse<BitbucketBuildStatus>>(\n `/rest/build-status/1.0/commits/${commit}`\n );\n return result.values ?? [];\n }\n\n async createRepo(opts: CreateRepoOpts): Promise<BitbucketRepo> {\n return this.http.bitbucket<BitbucketRepo>(\n `${API}/projects/${opts.project}/repos`,\n {\n method: 'POST',\n body: {\n name: opts.name,\n scmId: 'git',\n ...(opts.description !== undefined ? { description: opts.description } : {})\n }\n }\n );\n }\n}\n","import { Command } from 'commander';\nimport { getStatus, getDiff, getLog, getBranches, getBranchReport, formatBranchReportCsv } from './client.js';\nimport { getRepoRoot, getCurrentBranch } from '../../lib/git-context.js';\nimport { success, fail, writeRawOutput } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { BitbucketClient } from '../bitbucket/client.js';\nimport { getGitContext } from '../../lib/git-context.js';\n\nfunction requireRepoRoot(): string {\n const root = getRepoRoot();\n if (!root) throw new PncliError('Not a git repository', 1);\n return root;\n}\n\nexport function registerGitCommands(program: Command): void {\n const git = program.command('git').description('Local git operations');\n\n git\n .command('status')\n .description('Show staged, unstaged, and untracked files as JSON')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getStatus(root);\n success(data, 'git', 'status', start);\n } catch (err) {\n fail(err, 'git', 'status', start);\n }\n });\n\n git\n .command('diff')\n .description('Show diff as structured JSON')\n .option('--staged', 'Show staged changes only')\n .option('--file <path>', 'Limit diff to a specific file')\n .action((opts: { staged?: boolean; file?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getDiff(root, { staged: opts.staged, file: opts.file });\n success(data, 'git', 'diff', start);\n } catch (err) {\n fail(err, 'git', 'diff', start);\n }\n });\n\n git\n .command('log')\n .description('Show recent commits as JSON')\n .option('--count <n>', 'Number of commits to show', '10')\n .option('--since <date>', 'Show commits since date (e.g. \"2 weeks ago\")')\n .action((opts: { count?: string; since?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const count = opts.count ? parseInt(opts.count, 10) : undefined;\n const data = getLog(root, { count, since: opts.since });\n success(data, 'git', 'log', start);\n } catch (err) {\n fail(err, 'git', 'log', start);\n }\n });\n\n git\n .command('branch')\n .description('Show current branch and all local/remote branches')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getBranches(root);\n success(data, 'git', 'branch', start);\n } catch (err) {\n fail(err, 'git', 'branch', start);\n }\n });\n\n git\n .command('report')\n .description('Report lines of code and commit counts for a branch, optionally filtered by date')\n .option('--branch <name>', 'Branch to report on (defaults to current branch)')\n .option('--base <ref>', 'Base ref to compare against, e.g. \"main\" (base..branch, or base..HEAD if --branch is omitted)')\n .option('--since <date>', 'Include commits on or after this date (e.g. \"2024-01-01\")')\n .option('--until <date>', 'Include commits on or before this date (e.g. \"2024-12-31\")')\n .option('--csv', 'Output as CSV instead of JSON')\n .action((opts: { branch?: string; base?: string; since?: string; until?: string; csv?: boolean }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const report = getBranchReport(root, {\n branch: opts.branch,\n base: opts.base,\n since: opts.since,\n until: opts.until\n });\n if (opts.csv) {\n writeRawOutput(formatBranchReportCsv(report));\n } else {\n success(report, 'git', 'report', start);\n }\n } catch (err) {\n fail(err, 'git', 'report', start);\n }\n });\n\n git\n .command('current-pr')\n .description('Find the open PR for the current branch')\n .action(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n\n if (!config.bitbucket.baseUrl || !config.bitbucket.pat) {\n success(\n { message: 'Requires Bitbucket config. Available after pncli config init.' },\n 'git',\n 'current-pr',\n start\n );\n return;\n }\n\n const root = requireRepoRoot();\n const branch = getCurrentBranch(root);\n if (!branch) throw new PncliError('Could not determine current branch', 1);\n\n const ctx = getGitContext(config);\n const project = ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo = ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n if (!project || !repo) throw new PncliError('Could not determine Bitbucket project/repo', 1);\n\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const prs = await client.listPRs({ project, repo, state: 'OPEN' });\n const match = prs.find(pr => pr.fromRef.displayId === branch) ?? null;\n success(match, 'git', 'current-pr', start);\n } catch (err) {\n fail(err, 'git', 'current-pr', start);\n }\n });\n}\n","import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'fs';\nimport path from 'path';\nimport { Command } from 'commander';\nimport { JiraClient } from './client.js';\nimport { buildFieldMap, translateJql, translateFieldsInOutput, formatFieldValue } from './custom-fields.js';\nimport { JIRA_INPUT_FILE_SCHEMA, JIRA_INPUT_FILE_EXAMPLE } from './input-schema.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail, warn, writeRawOutput } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { readJsonInputFile, resolveAtFileRef, mergeWithOverrides, resolveTextInput } from '../../lib/input.js';\nimport type { CustomFieldMap } from '../../types/jira.js';\n\n/** Shape of the JSON accepted by --input-file on create-issue / update-issue. */\ninterface IssueJsonInput {\n project?: string;\n issueType?: string;\n fields?: Record<string, unknown>;\n}\n\nconst BUILTIN_ISSUE_FIELDS = new Set(['summary', 'description', 'priority', 'assignee', 'labels', 'parent']);\n\n/**\n * Splits a --input-file `fields` dictionary into Jira's built-in issue fields\n * (summary, description, priority, assignee, labels, parent) and custom fields.\n * Custom field keys resolve through fieldMap by friendly name or already-registered id;\n * an unregistered key containing no whitespace is treated as a raw Jira field id (e.g.\n * customfield_10032) and passed through untouched, so pncli stays decoupled from any\n * org's custom fields — nothing needs to be pre-registered in config to be usable here.\n * Resolves `@file` value references (see resolveAtFileRef) on every value.\n */\nexport function splitFieldsDictionary(\n fields: Record<string, unknown>,\n fieldMap: CustomFieldMap\n): { builtin: Record<string, unknown>; custom: Record<string, unknown> } {\n const builtin: Record<string, unknown> = {};\n const custom: Record<string, unknown> = {};\n for (const [rawKey, rawValue] of Object.entries(fields)) {\n const value = resolveAtFileRef(rawValue);\n const key = rawKey.toLowerCase();\n if (BUILTIN_ISSUE_FIELDS.has(key)) {\n builtin[key] = value;\n continue;\n }\n const def = fieldMap.byName.get(key) ?? fieldMap.byId.get(rawKey);\n if (def) {\n custom[def.id] = value;\n } else if (!/\\s/.test(rawKey)) {\n custom[rawKey] = value;\n } else {\n throw new PncliError(\n `Unknown custom field: \"${rawKey}\". Fields must be registered in config by friendly name or ID. Run: pncli jira fields`,\n 1\n );\n }\n }\n return { builtin, custom };\n}\n\n/** Normalizes a builtin `labels` value from either an --input-file array or a comma-separated flag string. */\nfunction normalizeLabels(value: unknown): string[] | undefined {\n if (value === undefined) return undefined;\n if (Array.isArray(value)) return value.map(v => String(v).trim());\n return String(value).split(',').map(s => s.trim()).filter(Boolean);\n}\n\nfunction getClient(program: Command): JiraClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JiraClient(http);\n}\n\nfunction getClientAndFields(program: Command): { client: JiraClient; fieldMap: CustomFieldMap; customFields: import('../../types/jira.js').CustomFieldDefinition[] } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new JiraClient(http);\n const customFields = config.jira.customFields;\n const fieldMap = buildFieldMap(customFields);\n return { client, fieldMap, customFields };\n}\n\nfunction getDefaults(program: Command): { project?: string; issueType?: string; priority?: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n return {\n project: config.defaults.jira?.project,\n issueType: config.defaults.jira?.issueType,\n priority: config.defaults.jira?.priority\n };\n}\n\n/**\n * Resolves the JQL for `jira search` from --jql or --jql-file (see resolveTextInput\n * for the shared inline/file/stdin contract). Trimmed because a --jql-file almost\n * always ends in a newline and Jira rejects the trailing whitespace.\n */\nexport function resolveJqlInput(jql: string | undefined, jqlFile: string | undefined): string {\n const raw = resolveTextInput(jql, jqlFile, 'jql');\n if (raw === undefined) throw new PncliError('Must specify --jql or --jql-file', 1);\n const trimmed = raw.trim();\n // Reported separately from the missing case: telling someone who did pass\n // --jql-file to \"specify --jql or --jql-file\" would be a lie.\n if (!trimmed) throw new PncliError('JQL query is empty', 1);\n return trimmed;\n}\n\nexport function registerJiraCommands(program: Command): void {\n const jira = program.command('jira').description('Jira Data Cloud operations');\n\n jira.command('get-issue')\n .description('Get a Jira issue by key')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const data = await client.getIssue(opts.key);\n const translated = { ...data, fields: translateFieldsInOutput(data.fields as Record<string, unknown>, fieldMap) };\n success(translated, 'jira', 'get-issue', start);\n } catch (err) { fail(err, 'jira', 'get-issue', start); }\n });\n\n jira.command('create-issue')\n .description('Create a Jira issue')\n .option('--project <key>', 'Project key')\n .option('--type <type>', 'Issue type (Bug, Story, Task, ...)')\n .option('--summary <text>', 'Issue summary (required, unless supplied via --input-file)')\n .option('--description <text>', 'Issue description')\n .option('--priority <name>', 'Priority name')\n .option('--assignee <accountId>', 'Assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--parent <key>', 'Parent issue key — sets fields.parent in the create payload')\n .option('--field <Name=value>', 'Custom field value; use Name=@file.json to read value from file (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .option('--fields-file <path>', 'Path to a JSON file mapping field names/IDs to their Jira API values')\n .option('--input-file <path>', \"JSON file describing the whole issue ({ project, issueType, fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli jira schema\")\n .action(async (opts: { project?: string; type?: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; parent?: string; field: string[]; fieldsFile?: string; inputFile?: string }) => {\n const start = Date.now();\n let fieldMap = buildFieldMap([]);\n try {\n const resolved = getClientAndFields(program);\n const client = resolved.client;\n fieldMap = resolved.fieldMap;\n const defaults = getDefaults(program);\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as IssueJsonInput) : undefined;\n const { builtin: jsonBuiltin, custom: jsonCustom } = jsonInput?.fields\n ? splitFieldsDictionary(jsonInput.fields, fieldMap)\n : { builtin: {}, custom: {} };\n\n const project = opts.project ?? jsonInput?.project ?? defaults.project;\n const issueType = opts.type ?? jsonInput?.issueType ?? defaults.issueType ?? 'Task';\n if (!project) throw new PncliError('--project required (or set defaults.jira.project in config, or \"project\" in --input-file)', 1);\n\n const flagBuiltin: Record<string, unknown> = {\n ...(opts.summary !== undefined ? { summary: opts.summary } : {}),\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.priority !== undefined ? { priority: opts.priority } : {}),\n ...(opts.assignee !== undefined ? { assignee: opts.assignee } : {}),\n ...(opts.labels !== undefined ? { labels: opts.labels } : {}),\n ...(opts.parent !== undefined ? { parent: opts.parent } : {})\n };\n const { merged: builtinFields, overrides: builtinOverrides } = mergeWithOverrides(jsonBuiltin, flagBuiltin);\n\n const summary = builtinFields.summary as string | undefined;\n if (!summary) throw new PncliError('Must specify --summary or \"fields.summary\" in --input-file', 1);\n const priority = (builtinFields.priority as string | undefined) ?? defaults.priority;\n\n const fileFields = opts.fieldsFile ? parseFieldsFile(opts.fieldsFile, fieldMap) : {};\n const flagCustom = { ...fileFields, ...parseFieldArgs(opts.field, fieldMap) };\n const { merged: customFieldValues, overrides: customOverrides } = mergeWithOverrides(jsonCustom, flagCustom);\n\n const overrides = [...builtinOverrides, ...customOverrides];\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n const data = await client.createIssue({\n project,\n issueType,\n summary,\n description: builtinFields.description as string | undefined,\n priority,\n assignee: builtinFields.assignee as string | undefined,\n labels: normalizeLabels(builtinFields.labels),\n parent: builtinFields.parent as string | undefined,\n customFieldValues\n });\n success(data, 'jira', 'create-issue', start, overrides);\n } catch (err) { fail(translateFieldErrors(err, fieldMap), 'jira', 'create-issue', start); }\n });\n\n jira.command('update-issue')\n .description('Update a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .option('--summary <text>', 'New summary')\n .option('--description <text>', 'New description')\n .option('--priority <name>', 'New priority')\n .option('--assignee <accountId>', 'New assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value; use Name=@file.json to read value from file (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .option('--fields-file <path>', 'Path to a JSON file mapping field names/IDs to their Jira API values')\n .option('--input-file <path>', \"JSON file describing fields to update ({ fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli jira schema\")\n .action(async (opts: { key: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[]; fieldsFile?: string; inputFile?: string }) => {\n const start = Date.now();\n let fieldMap = buildFieldMap([]);\n try {\n const resolved = getClientAndFields(program);\n const client = resolved.client;\n fieldMap = resolved.fieldMap;\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as IssueJsonInput) : undefined;\n const { builtin: jsonBuiltin, custom: jsonCustom } = jsonInput?.fields\n ? splitFieldsDictionary(jsonInput.fields, fieldMap)\n : { builtin: {}, custom: {} };\n\n const flagBuiltin: Record<string, unknown> = {\n ...(opts.summary !== undefined ? { summary: opts.summary } : {}),\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.priority !== undefined ? { priority: opts.priority } : {}),\n ...(opts.assignee !== undefined ? { assignee: opts.assignee } : {}),\n ...(opts.labels !== undefined ? { labels: opts.labels } : {})\n };\n const { merged: builtinFields, overrides: builtinOverrides } = mergeWithOverrides(jsonBuiltin, flagBuiltin);\n\n const fileFields = opts.fieldsFile ? parseFieldsFile(opts.fieldsFile, fieldMap) : {};\n const flagCustom = { ...fileFields, ...parseFieldArgs(opts.field, fieldMap) };\n const { merged: customFieldValues, overrides: customOverrides } = mergeWithOverrides(jsonCustom, flagCustom);\n\n const overrides = [...builtinOverrides, ...customOverrides];\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n await client.updateIssue(opts.key, {\n summary: builtinFields.summary as string | undefined,\n description: builtinFields.description as string | undefined,\n priority: builtinFields.priority as string | undefined,\n assignee: builtinFields.assignee as string | undefined,\n labels: normalizeLabels(builtinFields.labels),\n customFieldValues\n });\n success({ updated: opts.key }, 'jira', 'update-issue', start, overrides);\n } catch (err) { fail(translateFieldErrors(err, fieldMap), 'jira', 'update-issue', start); }\n });\n\n jira.command('schema')\n .description('Print the --input-file JSON schema and an example for create-issue/update-issue')\n .option('--example-only', \"Print only the runnable example JSON (no envelope) — pipeable straight into --input-file\")\n .action((opts: { exampleOnly?: boolean }) => {\n const start = Date.now();\n if (opts.exampleOnly) {\n // Bypass the success() envelope: this output is meant to be redirected straight\n // into a file and passed to --input-file, so it must be the raw JSON, not {ok,data,meta}.\n writeRawOutput(JSON.stringify(JIRA_INPUT_FILE_EXAMPLE, null, 2) + '\\n');\n return;\n }\n success({ schema: JIRA_INPUT_FILE_SCHEMA, example: JIRA_INPUT_FILE_EXAMPLE }, 'jira', 'schema', start);\n });\n\n jira.command('transition-issue')\n .description('Transition a Jira issue to a new status')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--transition <name-or-id>', 'Transition name or ID')\n .action(async (opts: { key: string; transition: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n // Resolve transition name to ID if needed\n let transitionId = opts.transition;\n if (isNaN(parseInt(opts.transition, 10))) {\n const transitions = await client.listTransitions(opts.key);\n const found = transitions.find(t => t.name.toLowerCase() === opts.transition.toLowerCase());\n if (!found) throw new PncliError(`Transition not found: ${opts.transition}`, 1);\n transitionId = found.id;\n }\n await client.transitionIssue(opts.key, transitionId);\n success({ transitioned: opts.key, transition: opts.transition }, 'jira', 'transition-issue', start);\n } catch (err) { fail(err, 'jira', 'transition-issue', start); }\n });\n\n jira.command('list-transitions')\n .description('List available transitions for an issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listTransitions(opts.key);\n success(data, 'jira', 'list-transitions', start);\n } catch (err) { fail(err, 'jira', 'list-transitions', start); }\n });\n\n jira.command('add-comment')\n .description('Add a comment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { key: string; body: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.key, opts.body);\n success(data, 'jira', 'add-comment', start);\n } catch (err) { fail(err, 'jira', 'add-comment', start); }\n });\n\n jira.command('list-comments')\n .description('List comments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.key);\n success(data, 'jira', 'list-comments', start);\n } catch (err) { fail(err, 'jira', 'list-comments', start); }\n });\n\n jira.command('search')\n .description('Search Jira issues with JQL (consider --output-file for large results)')\n .option('--jql <query>', 'JQL query string')\n .option('--jql-file <path>', \"Path to a file containing the JQL query ('-' = stdin)\")\n .option('--max-results <n>', 'Maximum number of results')\n .action(async (opts: { jql?: string; jqlFile?: string; maxResults?: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap, customFields } = getClientAndFields(program);\n const jql = resolveJqlInput(opts.jql, opts.jqlFile);\n const maxResults = opts.maxResults ? parseInt(opts.maxResults, 10) : undefined;\n const translatedJql = translateJql(jql, fieldMap);\n const data = await client.search(translatedJql, maxResults, customFields);\n const translatedIssues = data.issues.map(issue => ({\n ...issue,\n fields: translateFieldsInOutput(issue.fields as Record<string, unknown>, fieldMap)\n }));\n success({ ...data, issues: translatedIssues }, 'jira', 'search', start);\n } catch (err) { fail(err, 'jira', 'search', start); }\n });\n\n jira.command('add-label')\n .description('Add one or more labels to a Jira issue (non-destructive)')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--labels <labels>', 'Comma-separated labels to add')\n .action(async (opts: { key: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n await client.addLabels(opts.key, labels);\n success({ updated: opts.key, labelsAdded: labels }, 'jira', 'add-label', start);\n } catch (err) { fail(err, 'jira', 'add-label', start); }\n });\n\n jira.command('remove-label')\n .description('Remove one or more labels from a Jira issue (non-destructive)')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--labels <labels>', 'Comma-separated labels to remove')\n .action(async (opts: { key: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n await client.removeLabels(opts.key, labels);\n success({ updated: opts.key, labelsRemoved: labels }, 'jira', 'remove-label', start);\n } catch (err) { fail(err, 'jira', 'remove-label', start); }\n });\n\n jira.command('assign')\n .description('Assign a Jira issue to a user')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--assignee <accountId>', 'Assignee account ID')\n .action(async (opts: { key: string; assignee: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.assignIssue(opts.key, opts.assignee);\n success({ assigned: opts.key, assignee: opts.assignee }, 'jira', 'assign', start);\n } catch (err) { fail(err, 'jira', 'assign', start); }\n });\n\n jira.command('link-issue')\n .description('Link two Jira issues together')\n .requiredOption('--key <issue-key>', 'Source issue key')\n .requiredOption('--link-type <type>', 'Link type name or ID')\n .requiredOption('--target <issue-key>', 'Target issue key')\n .action(async (opts: { key: string; linkType: string; target: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.linkIssue({ key: opts.key, linkType: opts.linkType, target: opts.target });\n success({ linked: opts.key, to: opts.target, type: opts.linkType }, 'jira', 'link-issue', start);\n } catch (err) { fail(err, 'jira', 'link-issue', start); }\n });\n\n jira.command('add-attachment')\n .description('Upload a file as an attachment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .requiredOption('--file <path>', 'Path to the file to upload')\n .action(async (opts: { key: string; file: string }) => {\n const start = Date.now();\n try {\n if (!existsSync(opts.file)) throw new PncliError(`File not found: ${opts.file}`, 1);\n const client = getClient(program);\n const data = await client.uploadAttachment(opts.key, opts.file);\n success(data, 'jira', 'add-attachment', start);\n } catch (err) { fail(err, 'jira', 'add-attachment', start); }\n });\n\n jira.command('list-attachments')\n .description('List attachments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listAttachments(opts.key);\n success(data, 'jira', 'list-attachments', start);\n } catch (err) { fail(err, 'jira', 'list-attachments', start); }\n });\n\n jira.command('download-attachment')\n .description('Download a Jira issue attachment to .pncli/ (or --dir)')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .requiredOption('--attachment-id <id>', 'Attachment ID from list-attachments output')\n .option('--dir <path>', 'Output directory (default: .pncli relative to cwd)')\n .action(async (opts: { key: string; attachmentId: string; dir?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const attachments = await client.listAttachments(opts.key);\n const attachment = attachments.find(a => a.id === opts.attachmentId);\n if (!attachment) throw new PncliError(`Attachment not found: ${opts.attachmentId}`, 1);\n const outDir = opts.dir ?? path.join(process.cwd(), '.pncli');\n mkdirSync(outDir, { recursive: true });\n const outPath = path.join(outDir, path.basename(attachment.filename));\n const buffer = await client.downloadAttachment(attachment.content);\n writeFileSync(outPath, buffer);\n success({ saved: outPath, filename: attachment.filename, size: buffer.length }, 'jira', 'download-attachment', start);\n } catch (err) { fail(err, 'jira', 'download-attachment', start); }\n });\n\n jira.command('fields')\n .description('List custom fields (configured or discovered from Jira API) (consider --output-file for large results)')\n .option('--discover', 'Fetch field metadata from Jira API')\n .option('--custom-only', 'Show only custom fields (requires --discover)')\n .option('--project <key>', 'Project key — fetches allowedValues for select fields via createmeta (requires --discover)')\n .option('--issue-type <type>', 'Filter allowedValues to a specific issue type (requires --project)')\n .action(async (opts: { discover?: boolean; customOnly?: boolean; project?: string; issueType?: string }) => {\n const start = Date.now();\n try {\n if (opts.discover) {\n const client = getClient(program);\n const fields = opts.project\n ? await client.fetchFieldsWithAllowedValues(opts.project, opts.issueType)\n : await client.fetchFields();\n const result = opts.customOnly ? fields.filter(f => f.custom) : fields;\n success(result, 'jira', 'fields', start);\n } else {\n const { customFields } = getClientAndFields(program);\n success(customFields, 'jira', 'fields', start);\n }\n } catch (err) { fail(err, 'jira', 'fields', start); }\n });\n\n jira.command('list-boards')\n .description('List Agile boards for a project')\n .requiredOption('--project <key>', 'Project key')\n .action(async (opts: { project: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBoards(opts.project);\n success(data, 'jira', 'list-boards', start);\n } catch (err) { fail(err, 'jira', 'list-boards', start); }\n });\n\n jira.command('list-sprints')\n .description('List sprints for a board or project, including start/end dates')\n .option('--board <id>', 'Board ID')\n .option('--project <key>', 'Project key — resolves to that project\\'s board(s)')\n .option('--state <states>', 'Comma-separated states to filter (active,future,closed)')\n .action(async (opts: { board?: string; project?: string; state?: string }) => {\n const start = Date.now();\n try {\n if (!opts.board && !opts.project) throw new PncliError('Either --board or --project is required', 1);\n const client = getClient(program);\n const states = opts.state ? opts.state.split(',').map(s => s.trim()) : undefined;\n const data = opts.board\n ? await client.listSprintsForBoard(parseInt(opts.board, 10), states)\n : await client.listSprintsForProject(opts.project as string, states);\n success(data, 'jira', 'list-sprints', start);\n } catch (err) { fail(err, 'jira', 'list-sprints', start); }\n });\n\n jira.command('set-sprint')\n .description('Move a Jira issue into a sprint')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--sprint <id>', 'Sprint ID (from list-sprints)')\n .action(async (opts: { key: string; sprint: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.setSprint(parseInt(opts.sprint, 10), [opts.key]);\n success({ updated: opts.key, sprint: opts.sprint }, 'jira', 'set-sprint', start);\n } catch (err) { fail(err, 'jira', 'set-sprint', start); }\n });\n}\n\nexport function parseFieldArgs(\n fieldArgs: string[],\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const arg of fieldArgs) {\n const eq = arg.indexOf('=');\n if (eq === -1) throw new PncliError(`Invalid --field format (expected Name=value): ${arg}`, 1);\n const name = arg.slice(0, eq).trim();\n const value = arg.slice(eq + 1);\n const def = fieldMap.byName.get(name.toLowerCase()) ?? fieldMap.byId.get(name);\n if (!def) throw new PncliError(\n `Unknown custom field: \"${name}\". Fields must be registered in config by friendly name or ID. Run: pncli jira fields`,\n 1\n );\n if (value.startsWith('@')) {\n const filePath = value.slice(1);\n let raw: string;\n try {\n raw = readFileSync(filePath, 'utf8').trim();\n } catch (e) {\n throw new PncliError(`Cannot read file \"${filePath}\": ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n try {\n result[def.id] = JSON.parse(raw);\n } catch {\n result[def.id] = raw;\n }\n } else {\n result[def.id] = formatFieldValue(value, def.type);\n }\n }\n return result;\n}\n\nexport function parseFieldsFile(filePath: string, fieldMap: CustomFieldMap): Record<string, unknown> {\n let raw: string;\n try {\n raw = readFileSync(filePath, 'utf8');\n } catch (e) {\n throw new PncliError(`Cannot read fields file \"${filePath}\": ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new PncliError(`Fields file \"${filePath}\" must be a valid JSON object`, 1);\n }\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new PncliError(`Fields file \"${filePath}\" must be a JSON object`, 1);\n }\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(data as Record<string, unknown>)) {\n const def = fieldMap.byName.get(key.toLowerCase()) ?? fieldMap.byId.get(key);\n if (!def) throw new PncliError(\n `Unknown field in \"${filePath}\": \"${key}\". Fields must be registered in config by friendly name or ID. Run: pncli jira fields`,\n 1\n );\n result[def.id] = val;\n }\n return result;\n}\n\n/**\n * Translate customfield_XXXXX IDs in a Jira error message to their friendly names.\n * Returns the original error unchanged if no translation is possible.\n */\nfunction translateFieldErrors(err: unknown, fieldMap: CustomFieldMap): unknown {\n if (!(err instanceof PncliError) || fieldMap.byId.size === 0) return err;\n const translated = err.message.replace(/\\bcustomfield_\\d+\\b/g, (id) => {\n const def = fieldMap.byId.get(id);\n return def ? `${def.name} (${id})` : id;\n });\n if (translated === err.message) return err;\n return new PncliError(translated, err.status, err.url);\n}\n","import { readFileSync } from 'fs';\nimport { basename } from 'path';\nimport type { HttpClient } from '../../lib/http.js';\nimport { guessMimeType } from '../../lib/mime.js';\nimport type {\n JiraIssue,\n JiraTransition,\n JiraComment,\n JiraSearchResult,\n JiraFieldInfo,\n JiraAttachment,\n JiraBoard,\n JiraSprint,\n CustomFieldDefinition,\n CustomFieldType\n} from '../../types/jira.js';\n\nconst API = '/rest/api/2';\nconst AGILE_API = '/rest/agile/1.0';\n\nexport interface CreateIssueOpts {\n project: string;\n issueType: string;\n summary: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n parent?: string;\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface UpdateIssueOpts {\n summary?: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface LinkIssueOpts {\n key: string;\n linkType: string;\n target: string;\n}\n\nexport class JiraClient {\n constructor(private http: HttpClient) {}\n\n async getIssue(key: string): Promise<JiraIssue> {\n return this.http.jira<JiraIssue>(`${API}/issue/${key}`);\n }\n\n async createIssue(opts: CreateIssueOpts): Promise<JiraIssue> {\n const body: Record<string, unknown> = {\n fields: {\n project: { key: opts.project },\n issuetype: { name: opts.issueType },\n summary: opts.summary,\n ...(opts.description ? { description: opts.description } : {}),\n ...(opts.priority ? { priority: { name: opts.priority } } : {}),\n ...(opts.assignee ? { assignee: { name: opts.assignee } } : {}),\n ...(opts.labels?.length ? { labels: opts.labels } : {}),\n ...(opts.parent ? { parent: { key: opts.parent } } : {}),\n ...(opts.customFieldValues ?? {})\n }\n };\n\n const created = await this.http.jira<{ id: string; key: string }>(`${API}/issue`, {\n method: 'POST',\n body\n });\n\n return this.getIssue(created.key);\n }\n\n async updateIssue(key: string, opts: UpdateIssueOpts): Promise<void> {\n const fields: Record<string, unknown> = {};\n if (opts.summary) fields.summary = opts.summary;\n if (opts.description) fields.description = opts.description;\n if (opts.priority) fields.priority = { name: opts.priority };\n if (opts.assignee) fields.assignee = { name: opts.assignee };\n if (opts.labels?.length) fields.labels = opts.labels;\n Object.assign(fields, opts.customFieldValues ?? {});\n\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { fields }\n });\n }\n\n async listTransitions(key: string): Promise<JiraTransition[]> {\n const result = await this.http.jira<{ transitions: JiraTransition[] }>(\n `${API}/issue/${key}/transitions`\n );\n return result.transitions;\n }\n\n async transitionIssue(key: string, transitionId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/transitions`, {\n method: 'POST',\n body: { transition: { id: transitionId } }\n });\n }\n\n async addComment(key: string, text: string): Promise<JiraComment> {\n return this.http.jira<JiraComment>(`${API}/issue/${key}/comment`, {\n method: 'POST',\n body: { body: text }\n });\n }\n\n async listComments(key: string): Promise<JiraComment[]> {\n return this.http.jiraPaginate<JiraComment>(async (startAt, maxResults) => {\n const result = await this.http.jira<{ comments: JiraComment[]; total: number; startAt: number; maxResults: number }>(\n `${API}/issue/${key}/comment`,\n { params: { startAt, maxResults } }\n );\n return { ...result, values: result.comments };\n });\n }\n\n async search(jql: string, maxResults?: number, customFields?: CustomFieldDefinition[]): Promise<JiraSearchResult> {\n const standardFields = ['summary', 'status', 'priority', 'assignee', 'issuetype', 'project', 'created', 'updated', 'labels', 'reporter'];\n const fields = customFields?.length\n ? [...standardFields, ...customFields.map(f => f.id)]\n : standardFields;\n\n if (maxResults !== undefined) {\n return this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, maxResults, fields }\n });\n }\n\n // Paginate all results\n const allIssues = await this.http.jiraPaginate<JiraIssue>(async (startAt, max) => {\n const result = await this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, startAt, maxResults: max, fields }\n });\n return { ...result, values: result.issues };\n });\n\n return { issues: allIssues, total: allIssues.length, startAt: 0, maxResults: allIssues.length };\n }\n\n async fetchFields(): Promise<JiraFieldInfo[]> {\n const fields = await this.http.jira<JiraFieldInfo[]>(`${API}/field`);\n return fields.map(f => ({ ...f, pncliType: schemaToPncliType(f.schema) }));\n }\n\n async fetchFieldsWithAllowedValues(project: string, issueType?: string): Promise<JiraFieldInfo[]> {\n const fields = await this.fetchFields();\n\n type AllowedValue = { id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> };\n type CreateMetaField = { allowedValues?: AllowedValue[] };\n type CreateMetaResponse = {\n projects: Array<{\n issuetypes: Array<{\n name: string;\n fields: Record<string, CreateMetaField>;\n }>;\n }>;\n };\n\n let metaFields: Record<string, CreateMetaField> = {};\n try {\n const meta = await this.http.jira<CreateMetaResponse>(`${API}/issue/createmeta`, {\n params: { projectKeys: project, expand: 'projects.issuetypes.fields' }\n });\n metaFields = collectMetaFields(meta.projects, issueType);\n } catch {\n // createmeta returns 404 on some Jira Datacenter instances — try the paginated fallback\n try {\n metaFields = await this.fetchCreateMetaViaIssuetypes(project, issueType);\n } catch {\n // Both endpoints failed — return fields without allowedValues (pncliType still annotated)\n }\n }\n\n return fields.map(f => {\n const av = metaFields[f.id]?.allowedValues;\n return av?.length ? { ...f, allowedValues: av } : f;\n });\n }\n\n /**\n * Fallback for instances where the classic createmeta endpoint returns 404.\n * Uses the paginated endpoint available in Jira Datacenter 8.4+.\n */\n private async fetchCreateMetaViaIssuetypes(\n project: string,\n issueType?: string\n ): Promise<Record<string, { allowedValues?: Array<{ id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> }> }>> {\n type IssueTypeEntry = { id: string; name: string };\n const itList = await this.http.jira<{ values: IssueTypeEntry[] }>(\n `${API}/issue/createmeta/${encodeURIComponent(project)}/issuetypes`\n );\n\n const matchingTypes = issueType\n ? itList.values.filter(it => it.name.toLowerCase() === issueType.toLowerCase())\n : itList.values;\n\n type FieldEntry = { fieldId: string; allowedValues?: Array<{ id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> }> };\n const result: Record<string, { allowedValues?: Array<{ id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> }> }> = {};\n\n for (const it of matchingTypes) {\n const fieldList = await this.http.jira<{ values: FieldEntry[] }>(\n `${API}/issue/createmeta/${encodeURIComponent(project)}/issuetypes/${it.id}`\n );\n for (const field of fieldList.values) {\n if (!field.allowedValues?.length) continue;\n const existing = result[field.fieldId]?.allowedValues ?? [];\n const seen = new Set(existing.map((v) => v.id));\n for (const av of field.allowedValues) {\n if (!seen.has(av.id)) {\n existing.push(av);\n seen.add(av.id);\n }\n }\n result[field.fieldId] = { allowedValues: existing };\n }\n }\n\n return result;\n }\n\n async addLabels(key: string, labels: string[]): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { update: { labels: labels.map(l => ({ add: l })) } }\n });\n }\n\n async removeLabels(key: string, labels: string[]): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { update: { labels: labels.map(l => ({ remove: l })) } }\n });\n }\n\n async uploadAttachment(key: string, filePath: string): Promise<JiraAttachment[]> {\n const fileContent = readFileSync(filePath);\n const fileName = basename(filePath);\n const mimeType = guessMimeType(filePath);\n const formData = new FormData();\n formData.append('file', new Blob([fileContent], { type: mimeType }), fileName);\n return this.http.jiraUpload<JiraAttachment[]>(`${API}/issue/${key}/attachments`, formData);\n }\n\n async listAttachments(key: string): Promise<JiraAttachment[]> {\n const result = await this.http.jira<{ fields: { attachment?: JiraAttachment[] } }>(\n `${API}/issue/${key}`,\n { params: { fields: 'attachment' } }\n );\n return result.fields.attachment ?? [];\n }\n\n async downloadAttachment(contentUrl: string): Promise<Buffer> {\n return this.http.jiraBuffer(contentUrl);\n }\n\n async assignIssue(key: string, accountId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/assignee`, {\n method: 'PUT',\n body: { accountId }\n });\n }\n\n async linkIssue(opts: LinkIssueOpts): Promise<void> {\n // First, find the link type ID if a name was given\n let linkTypeId = opts.linkType;\n if (isNaN(parseInt(opts.linkType, 10))) {\n const types = await this.http.jira<{ issueLinkTypes: Array<{ id: string; name: string; inward: string; outward: string }> }>(\n `${API}/issueLinkType`\n );\n const found = types.issueLinkTypes.find(\n t => t.name.toLowerCase() === opts.linkType.toLowerCase() ||\n t.inward.toLowerCase() === opts.linkType.toLowerCase() ||\n t.outward.toLowerCase() === opts.linkType.toLowerCase()\n );\n if (!found) throw new Error(`Link type not found: ${opts.linkType}`);\n linkTypeId = found.id;\n }\n\n await this.http.jira<void>(`${API}/issueLink`, {\n method: 'POST',\n body: {\n type: { id: linkTypeId },\n inwardIssue: { key: opts.key },\n outwardIssue: { key: opts.target }\n }\n });\n }\n\n async listBoards(project: string): Promise<JiraBoard[]> {\n return this.http.jiraPaginate<JiraBoard>(async (startAt, maxResults) => {\n return this.http.jira<{ values: JiraBoard[]; total: number; startAt: number; maxResults: number }>(\n `${AGILE_API}/board`,\n { params: { projectKeyOrId: project, startAt, maxResults } }\n );\n });\n }\n\n async listSprintsForBoard(boardId: number, states?: string[]): Promise<JiraSprint[]> {\n return this.http.jiraPaginate<JiraSprint>(async (startAt, maxResults) => {\n return this.http.jira<{ values: JiraSprint[]; total: number; startAt: number; maxResults: number }>(\n `${AGILE_API}/board/${boardId}/sprint`,\n { params: { startAt, maxResults, ...(states?.length ? { state: states.join(',') } : {}) } }\n );\n });\n }\n\n async listSprintsForProject(project: string, states?: string[]): Promise<JiraSprint[]> {\n const boards = await this.listBoards(project);\n const sprints: JiraSprint[] = [];\n const seen = new Set<number>();\n for (const board of boards) {\n if (board.type !== 'scrum') continue;\n for (const sprint of await this.listSprintsForBoard(board.id, states)) {\n if (seen.has(sprint.id)) continue;\n seen.add(sprint.id);\n sprints.push(sprint);\n }\n }\n return sprints;\n }\n\n async setSprint(sprintId: number, issueKeys: string[]): Promise<void> {\n await this.http.jira<void>(`${AGILE_API}/sprint/${sprintId}/issue`, {\n method: 'POST',\n body: { issues: issueKeys }\n });\n }\n}\n\n/** Map a Jira field schema to the recommended pncli CustomFieldType. */\nfunction schemaToPncliType(schema?: { type: string; custom?: string }): CustomFieldType | undefined {\n if (!schema) return undefined;\n const custom = schema.custom ?? '';\n if (custom.includes('cascadingselect')) return 'cascading-select';\n if (custom.includes('multicheckboxes') || custom.includes('multiselect')) return 'multi-select';\n if (custom.includes('select') || custom.includes('radiobuttons')) return 'select';\n if (custom.includes('userpicker') || custom.includes('multiuserpicker')) return 'user';\n if (custom.includes('labels')) return 'labels';\n if (custom.includes('url')) return 'url';\n if (custom.includes('textarea') || custom.includes('textfield')) return 'textarea';\n if (schema.type === 'number') return 'number';\n if (schema.type === 'date') return 'date';\n if (schema.type === 'datetime') return 'datetime';\n if (schema.type === 'string') return 'string';\n return undefined;\n}\n\ntype AllowedValue = { id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> };\ntype CreateMetaProject = {\n issuetypes: Array<{\n name: string;\n fields: Record<string, { allowedValues?: AllowedValue[] }>;\n }>;\n};\n\nfunction collectMetaFields(\n projects: CreateMetaProject[],\n issueType?: string\n): Record<string, { allowedValues?: AllowedValue[] }> {\n const result: Record<string, { allowedValues?: AllowedValue[] }> = {};\n for (const proj of projects) {\n for (const it of proj.issuetypes) {\n if (issueType && it.name.toLowerCase() !== issueType.toLowerCase()) continue;\n for (const [fieldId, fieldMeta] of Object.entries(it.fields)) {\n if (!fieldMeta.allowedValues?.length) continue;\n const existing = result[fieldId]?.allowedValues ?? [];\n const seen = new Set(existing.map(v => v.id));\n for (const av of fieldMeta.allowedValues) {\n if (!seen.has(av.id)) {\n existing.push(av);\n seen.add(av.id);\n }\n }\n result[fieldId] = { allowedValues: existing };\n }\n }\n }\n return result;\n}\n","import { extname } from 'path';\n\n/**\n * Guess MIME type from file extension.\n * Falls back to application/octet-stream for unknown extensions.\n *\n * @param filePath - Path to the file (can be absolute or relative)\n * @returns MIME type string\n */\nexport function guessMimeType(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const map: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.log': 'text/plain',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.zip': 'application/zip',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.htm': 'text/html',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n };\n return map[ext] ?? 'application/octet-stream';\n}\n","import type { CustomFieldDefinition, CustomFieldMap, CustomFieldType } from '../../types/jira.js';\n\nexport function buildFieldMap(fields: CustomFieldDefinition[]): CustomFieldMap {\n const byName = new Map<string, CustomFieldDefinition>();\n const byId = new Map<string, CustomFieldDefinition>();\n for (const f of fields) {\n byName.set(f.name.toLowerCase(), f);\n byId.set(f.id, f);\n }\n return { byName, byId };\n}\n\n/**\n * Replace friendly field names with customfield_* IDs in a JQL string.\n * Splits on quoted segments to avoid replacing inside string literals.\n * Sorts field names by length descending so \"Story Points\" matches before \"Story\".\n */\nexport function translateJql(jql: string, fieldMap: CustomFieldMap): string {\n if (fieldMap.byName.size === 0) return jql;\n\n // Sort names by length descending to avoid partial matches\n const sortedNames = Array.from(fieldMap.byName.keys()).sort((a, b) => b.length - a.length);\n\n // Split on quoted segments, only translate unquoted parts\n const parts = jql.split(/([\"'][^\"']*[\"'])/);\n return parts.map((part, i) => {\n if (i % 2 === 1) return part; // inside quotes — leave as-is\n let out = part;\n for (const name of sortedNames) {\n const def = fieldMap.byName.get(name)!;\n // Match the field name as a whole word (case-insensitive), optionally quoted\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n out = out.replace(new RegExp(`(?<![\\\\w\"'])${escaped}(?![\\\\w\"'])`, 'gi'), def.id);\n }\n return out;\n }).join('');\n}\n\n/**\n * Replace customfield_* keys with friendly names in an issue fields object.\n * Returns a new object; does not mutate the original.\n */\nexport function translateFieldsInOutput(\n fields: Record<string, unknown>,\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n if (fieldMap.byId.size === 0) return fields;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n const def = fieldMap.byId.get(key);\n result[def ? def.name : key] = value;\n }\n return result;\n}\n\n/**\n * Format a CLI string value into the shape Jira's API expects for a given field type.\n *\n * For `cascading-select`, pass the parent option ID alone or `parentId:childId`\n * to also set the child option. Example: `10001` or `10001:10002`.\n */\nexport function formatFieldValue(value: string, type: CustomFieldType): unknown {\n switch (type) {\n case 'number':\n return Number(value);\n case 'select':\n return { value };\n case 'multi-select':\n return value.split(',').map(v => ({ value: v.trim() }));\n case 'option-id':\n return { id: value };\n case 'cascading-select': {\n const colon = value.indexOf(':');\n if (colon !== -1) {\n return { id: value.slice(0, colon).trim(), child: { id: value.slice(colon + 1).trim() } };\n }\n return { id: value.trim() };\n }\n case 'labels':\n return value.split(',').map(v => v.trim());\n case 'user':\n return { accountId: value };\n default:\n return value;\n }\n}\n","/**\n * JSON Schema + example for the --input-file accepted by `jira create-issue` / `update-issue`.\n * Exposed at runtime via `pncli jira schema` so callers can discover the shape without reading docs.\n */\nexport const JIRA_INPUT_FILE_SCHEMA = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'pncli Jira issue input file',\n description:\n 'Shape accepted by --input-file on `pncli jira create-issue` / `update-issue`. ' +\n 'CLI flags (--summary, --description, --priority, --field, ...) override matching keys here; ' +\n 'overridden keys are reported in meta.overrides.',\n type: 'object',\n properties: {\n project: { type: 'string', description: 'Project key (create-issue only)' },\n issueType: { type: 'string', description: 'Issue type name, e.g. Bug, Story, Task (create-issue only)' },\n fields: {\n type: 'object',\n description:\n 'Field dictionary. Built-in keys: summary, description, priority, assignee, labels, parent. ' +\n 'Any other key resolves as a custom field: a friendly name registered via `pncli jira fields`, ' +\n 'or a raw field id (e.g. customfield_10032) passed through untouched — custom fields never ' +\n 'need to be pre-registered in config. Any string value may be \"@path/to/file\" to read that ' +\n \"field's content from a file instead of inlining it (useful for large rich-text fields).\",\n additionalProperties: true\n }\n },\n additionalProperties: false\n} as const;\n\nexport const JIRA_INPUT_FILE_EXAMPLE = {\n project: 'PROJ',\n issueType: 'Bug',\n fields: {\n summary: 'Login broken on Safari',\n description: '@desc.html',\n priority: 'High',\n labels: ['frontend', 'urgent'],\n // Raw field id — passed through untouched, no pre-registration needed. A friendly\n // custom-field name (e.g. \"Story Points\") also works, but only once it's registered\n // via `pncli config set jira.customFields` / discovered with `pncli jira fields`.\n customfield_10032: '@ac.md'\n }\n};\n","import { readFileSync } from 'fs';\nimport { PncliError } from './errors.js';\n\n/**\n * Resolves free-form text content from either an inline value or a --<name>-file path.\n * A file path of '-' reads from stdin. Returns undefined if neither is provided\n * (caller decides if that is an error). Throws if both are provided.\n */\nexport function resolveTextInput(\n inline: string | undefined,\n file: string | undefined,\n optionName: string\n): string | undefined {\n if (inline !== undefined && file !== undefined) {\n throw new PncliError(`Cannot specify both --${optionName} and --${optionName}-file`, 1);\n }\n if (file !== undefined) {\n try {\n return readFileSync(file === '-' ? 0 : file, 'utf8');\n } catch (e) {\n const source = file === '-' ? 'stdin' : `file \"${file}\"`;\n throw new PncliError(`Cannot read ${optionName} ${source}: ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n }\n return inline;\n}\n\n/**\n * Reads and JSON-parses a --input-file argument. A path of '-' reads from stdin.\n * Throws a PncliError with context on read or parse failure.\n */\nexport function readJsonInputFile(filePath: string, optionName = 'input-file'): unknown {\n let raw: string;\n try {\n raw = readFileSync(filePath === '-' ? 0 : filePath, 'utf8');\n } catch (e) {\n const source = filePath === '-' ? 'stdin' : `file \"${filePath}\"`;\n throw new PncliError(`Cannot read --${optionName} ${source}: ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n try {\n return JSON.parse(raw);\n } catch (e) {\n throw new PncliError(`--${optionName} must contain valid JSON: ${(e as Error).message}`, 1);\n }\n}\n\n/**\n * If value is a string starting with '@', returns the referenced file's contents\n * (trimmed of a single trailing newline is NOT performed — callers get raw content).\n * Any other value (including non-'@' strings) is returned unchanged.\n */\nexport function resolveAtFileRef(value: unknown): unknown {\n if (typeof value !== 'string' || !value.startsWith('@')) return value;\n const filePath = value.slice(1);\n try {\n return readFileSync(filePath, 'utf8');\n } catch (e) {\n throw new PncliError(`Cannot read referenced file \"${filePath}\": ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n}\n\n/**\n * Merges a field dictionary sourced from --input-file with individual CLI flag values.\n * Flag values (fromFlags) always win when both set the same key. Returns the merged\n * record plus the list of keys where a flag overrode the JSON file's value, so callers\n * can surface that to the user instead of silently dropping the file's value.\n */\nexport function mergeWithOverrides(\n fromJson: Record<string, unknown>,\n fromFlags: Record<string, unknown>\n): { merged: Record<string, unknown>; overrides: string[] } {\n const merged: Record<string, unknown> = { ...fromJson };\n const overrides: string[] = [];\n for (const [key, value] of Object.entries(fromFlags)) {\n if (value === undefined) continue;\n if (Object.prototype.hasOwnProperty.call(fromJson, key)) overrides.push(key);\n merged[key] = value;\n }\n return { merged, overrides };\n}\n","import { Command } from 'commander';\nimport { BitbucketClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(\n program: Command,\n overrides?: { project?: string; repo?: string }\n): { client: BitbucketClient; project: string; repo: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n\n const project: string = overrides?.project ?? opts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo: string = overrides?.repo ?? opts.repo ?? ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n\n if (!project || !repo) {\n throw new PncliError(\n 'Could not determine Bitbucket project/repo. Pass --project and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, project, repo };\n}\n\nexport function registerBitbucketCommands(program: Command): void {\n const bb = program\n .command('bitbucket')\n .description('Bitbucket Server operations')\n .option('--project <key>', 'Bitbucket project key')\n .option('--repo <slug>', 'Bitbucket repository slug');\n\n // ── Repositories ──────────────────────────────────────────────────\n\n bb.command('create-repo')\n .description('Create a new repository in a project')\n .requiredOption('--name <name>', 'Repository name (slug)')\n .option('--description <desc>', 'Repository description')\n .option('--project <key>', 'Bitbucket project key (overrides parent --project)')\n .action(async (opts: { name: string; description?: string; project?: string }) => {\n const start = Date.now();\n try {\n const globalOpts = bb.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n const project: string = opts.project ?? globalOpts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n if (!project) {\n throw new PncliError('Could not determine Bitbucket project. Pass --project, or run pncli config init.', 1);\n }\n const data = await client.createRepo({ project, name: opts.name, description: opts.description });\n success(data, 'bitbucket', 'create-repo', start);\n } catch (err) { fail(err, 'bitbucket', 'create-repo', start); }\n });\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n bb.command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: OPEN|MERGED|DECLINED|ALL', 'OPEN')\n .option('--author <username>', 'Filter by author username')\n .option('--reviewer <username>', 'Filter by reviewer username')\n .action(async (opts: { state?: string; author?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listPRs({ project, repo, state: opts.state, author: opts.author, reviewer: opts.reviewer });\n success(data, 'bitbucket', 'list-prs', start);\n } catch (err) { fail(err, 'bitbucket', 'list-prs', start); }\n });\n\n bb.command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.getPR(project, repo, parseInt(opts.id, 10));\n success(data, 'bitbucket', 'get-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'get-pr', start); }\n });\n\n bb.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (defaults to config)')\n .option('--description <desc>', 'PR description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .option('--project <key>', 'Bitbucket project key (overrides parent --project; use ~username for personal repos)')\n .option('--repo <slug>', 'Bitbucket repository slug (overrides parent --repo)')\n .action(async (opts: { title: string; source: string; target?: string; description?: string; reviewers?: string; project?: string; repo?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb, { project: opts.project, repo: opts.repo });\n const config = loadConfig({ configPath: bb.optsWithGlobals().config });\n const target = opts.target ?? config.defaults.bitbucket?.targetBranch ?? 'main';\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : [];\n const data = await client.createPR({ project, repo, title: opts.title, source: opts.source, target, description: opts.description, reviewers });\n success(data, 'bitbucket', 'create-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'create-pr', start); }\n });\n\n bb.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <desc>', 'New description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : undefined;\n const data = await client.updatePR({ project, repo, id: prId, title: opts.title, description: opts.description, reviewers, version: pr.version });\n success(data, 'bitbucket', 'update-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'update-pr', start); }\n });\n\n bb.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--strategy <strategy>', 'Merge strategy: merge|squash|ff')\n .option('--delete-branch', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy?: string; deleteBranch?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.mergePR({ project, repo, id: prId, version: pr.version, strategy: opts.strategy as 'merge' | 'squash' | 'ff', deleteBranch: opts.deleteBranch });\n success(data, 'bitbucket', 'merge-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'merge-pr', start); }\n });\n\n bb.command('decline-pr')\n .description('Decline a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.declinePR(project, repo, prId, pr.version);\n success(data, 'bitbucket', 'decline-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'decline-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n bb.command('list-comments')\n .description('List comments on a pull request (includes threaded replies by default)')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--no-with-replies', 'Exclude replies; return top-level comments only')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general (non-inline) PR comments')\n .action(async (opts: { pr: string; withReplies: boolean; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listComments(project, repo, parseInt(opts.pr, 10), {\n withReplies: opts.withReplies,\n inlineOnly: opts.inlineOnly,\n generalOnly: opts.generalOnly\n });\n success(data, 'bitbucket', 'list-comments', start);\n } catch (err) { fail(err, 'bitbucket', 'list-comments', start); }\n });\n\n bb.command('add-comment')\n .description('Add a comment to a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { pr: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.addComment(project, repo, parseInt(opts.pr, 10), opts.body);\n success(data, 'bitbucket', 'add-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-comment', start); }\n });\n\n bb.command('add-inline-comment')\n .description('Add an inline comment to a file in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <type>', 'Line type: ADDED|REMOVED|CONTEXT', 'ADDED')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.addInlineComment({\n project, repo,\n prId: parseInt(opts.pr, 10),\n text: opts.body,\n filePath: opts.file,\n line: parseInt(opts.line, 10),\n lineType: opts.lineType as 'ADDED' | 'REMOVED' | 'CONTEXT'\n });\n success(data, 'bitbucket', 'add-inline-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-inline-comment', start); }\n });\n\n bb.command('reply-comment')\n .description('Reply to a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.replyComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'bitbucket', 'reply-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'reply-comment', start); }\n });\n\n bb.command('resolve-comment')\n .description('Resolve a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n await client.resolveComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ resolved: true }, 'bitbucket', 'resolve-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'resolve-comment', start); }\n });\n\n bb.command('delete-comment')\n .description('Delete a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n await client.deleteComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ deleted: true }, 'bitbucket', 'delete-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'delete-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n bb.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--file <path>', 'Limit diff to a specific file')\n .option('--context-lines <n>', 'Lines of context around changes')\n .action(async (opts: { pr: string; file?: string; contextLines?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const contextLines = opts.contextLines ? parseInt(opts.contextLines, 10) : undefined;\n const diff = await client.getDiff(project, repo, parseInt(opts.pr, 10), opts.file, contextLines);\n success({ diff }, 'bitbucket', 'diff', start);\n } catch (err) { fail(err, 'bitbucket', 'diff', start); }\n });\n\n bb.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listFiles(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-files', start);\n } catch (err) { fail(err, 'bitbucket', 'list-files', start); }\n });\n\n // ── Approvals ──────────────────────────────────────────────────────\n\n bb.command('approve')\n .description('Approve a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.approvePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'approve', start);\n } catch (err) { fail(err, 'bitbucket', 'approve', start); }\n });\n\n bb.command('unapprove')\n .description('Remove approval from a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.unapprovePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'unapprove', start);\n } catch (err) { fail(err, 'bitbucket', 'unapprove', start); }\n });\n\n bb.command('needs-work')\n .description('Mark a pull request as needs-work')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.needsWorkPR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'needs-work', start);\n } catch (err) { fail(err, 'bitbucket', 'needs-work', start); }\n });\n\n bb.command('list-reviewers')\n .description('List reviewers of a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listReviewers(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-reviewers', start);\n } catch (err) { fail(err, 'bitbucket', 'list-reviewers', start); }\n });\n\n bb.command('add-reviewer')\n .description('Add a reviewer to a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--user <username>', 'Username to add as a reviewer')\n .action(async (opts: { pr: string; user: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.addReviewer(project, repo, parseInt(opts.pr, 10), opts.user);\n success(data, 'bitbucket', 'add-reviewer', start);\n } catch (err) { fail(err, 'bitbucket', 'add-reviewer', start); }\n });\n\n // ── Build Status ───────────────────────────────────────────────────\n\n bb.command('list-builds')\n .description('List build statuses for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listBuilds(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-builds', start);\n } catch (err) { fail(err, 'bitbucket', 'list-builds', start); }\n });\n\n bb.command('get-build-status')\n .description('Get build status for a commit SHA')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(bb);\n const data = await client.getBuildStatus(opts.commit);\n success(data, 'bitbucket', 'get-build-status', start);\n } catch (err) { fail(err, 'bitbucket', 'get-build-status', start); }\n });\n}\n","import { Command, Option } from 'commander';\nimport type { ResolvedConfig } from '../../types/config.js';\nimport { GitHubClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { resolveTextInput } from '../../lib/input.js';\n\nfunction getClient(\n program: Command,\n overrides?: { owner?: string; repo?: string }\n): { client: GitHubClient; owner: string; repo: string; config: ResolvedConfig } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new GitHubClient(http);\n const ctx = getGitContext(config);\n\n const owner: string = overrides?.owner ?? opts.owner ?? ctx?.github?.owner ?? config.defaults.github?.owner ?? '';\n const repo: string = overrides?.repo ?? opts.repo ?? ctx?.github?.repo ?? config.defaults.github?.repo ?? '';\n\n if (!owner || !repo) {\n throw new PncliError(\n 'Could not determine GitHub owner/repo. Pass --owner and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, owner, repo, config };\n}\n\nexport function registerGitHubCommands(program: Command): void {\n const gh = program\n .command('github')\n .description('GitHub repository operations')\n .option('--owner <owner>', 'GitHub owner (user or org)')\n .option('--repo <repo>', 'GitHub repository name');\n\n // ── Repositories ──────────────────────────────────────────────────\n\n gh.command('create-repo')\n .description('Create a new repository (personal or org)')\n .requiredOption('--name <name>', 'Repository name')\n .option('--description <desc>', 'Repository description')\n .option('--private', 'Create as a private repository')\n .option('--auto-init', 'Initialize with a README')\n .action(async (opts: { name: string; description?: string; private?: boolean; autoInit?: boolean }) => {\n const start = Date.now();\n try {\n const globalOpts = gh.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const client = new GitHubClient(http);\n const owner: string = globalOpts.owner ?? '';\n const data = await client.createRepo({\n org: owner || undefined,\n name: opts.name,\n description: opts.description,\n private: opts.private,\n autoInit: opts.autoInit\n });\n success(data, 'github', 'create-repo', start);\n } catch (err) { fail(err, 'github', 'create-repo', start); }\n });\n\n // ── Issues ────────────────────────────────────────────────────────\n\n gh.command('create-issue')\n .description('Create a GitHub issue')\n .requiredOption('--title <title>', 'Issue title')\n .option('--body <body>', 'Issue body (markdown)')\n .option('--body-file <path>', 'Read issue body from a file (use - for stdin); overridden by --body')\n .option('--label <label>', 'Label to apply (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--assignee <login>', 'Assignee login (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .action(async (opts: { title: string; body?: string; bodyFile?: string; label: string[]; assignee: string[] }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const body = opts.body ?? resolveTextInput(undefined, opts.bodyFile, 'body');\n const data = await client.createIssue({\n owner,\n repo,\n title: opts.title,\n body,\n labels: opts.label.length ? opts.label : undefined,\n assignees: opts.assignee.length ? opts.assignee : undefined\n });\n success(data, 'github', 'create-issue', start);\n } catch (err) { fail(err, 'github', 'create-issue', start); }\n });\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n gh.command('list-prs')\n .description('List pull requests')\n .addOption(new Option('--state <state>', 'PR state').choices(['open', 'closed', 'all']).default('open'))\n .option('--head <branch>', 'Filter by head branch (user:branch)')\n .option('--base <branch>', 'Filter by base branch')\n .action(async (opts: { state?: string; head?: string; base?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listPRs({\n owner,\n repo,\n state: opts.state as 'open' | 'closed' | 'all',\n head: opts.head,\n base: opts.base\n });\n success(data, 'github', 'list-prs', start);\n } catch (err) { fail(err, 'github', 'list-prs', start); }\n });\n\n gh.command('get-pr')\n .description('Get a pull request by number')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.getPR(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'get-pr', start);\n } catch (err) { fail(err, 'github', 'get-pr', start); }\n });\n\n gh.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--head <branch>', 'Source branch (or user:branch for forks)')\n .option('--base <branch>', 'Target branch (defaults to config or main)')\n .option('--body <body>', 'PR description')\n .option('--body-file <path>', 'Read PR description from a file (use - for stdin); overridden by --body')\n .option('--draft', 'Create as draft PR')\n .option('--owner <owner>', 'GitHub owner (overrides parent --owner)')\n .option('--repo <repo>', 'GitHub repository name (overrides parent --repo)')\n .action(async (opts: { title: string; head: string; base?: string; body?: string; bodyFile?: string; draft?: boolean; owner?: string; repo?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo, config } = getClient(gh, { owner: opts.owner, repo: opts.repo });\n const base = opts.base ?? config.defaults.github?.targetBranch ?? 'main';\n const body = opts.body ?? resolveTextInput(undefined, opts.bodyFile, 'body');\n const data = await client.createPR({\n owner,\n repo,\n title: opts.title,\n head: opts.head,\n base,\n body,\n draft: opts.draft\n });\n success(data, 'github', 'create-pr', start);\n } catch (err) { fail(err, 'github', 'create-pr', start); }\n });\n\n gh.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .option('--title <title>', 'New title')\n .option('--body <body>', 'New description')\n .option('--base <branch>', 'New base branch')\n .action(async (opts: { number: string; title?: string; body?: string; base?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.updatePR({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n title: opts.title,\n body: opts.body,\n base: opts.base\n });\n success(data, 'github', 'update-pr', start);\n } catch (err) { fail(err, 'github', 'update-pr', start); }\n });\n\n gh.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .addOption(new Option('--method <method>', 'Merge method').choices(['merge', 'squash', 'rebase']).default('merge'))\n .option('--commit-title <title>', 'Commit title for merge/squash')\n .option('--commit-message <msg>', 'Commit message for merge/squash')\n .action(async (opts: { number: string; method?: string; commitTitle?: string; commitMessage?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.mergePR({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n mergeMethod: opts.method as 'merge' | 'squash' | 'rebase',\n commitTitle: opts.commitTitle,\n commitMessage: opts.commitMessage\n });\n success(data, 'github', 'merge-pr', start);\n } catch (err) { fail(err, 'github', 'merge-pr', start); }\n });\n\n gh.command('close-pr')\n .description('Close a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.closePR(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'close-pr', start);\n } catch (err) { fail(err, 'github', 'close-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n gh.command('list-comments')\n .description('List general comments on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listComments(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-comments', start);\n } catch (err) { fail(err, 'github', 'list-comments', start); }\n });\n\n gh.command('add-comment')\n .description('Add a general comment to a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { number: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.addComment(owner, repo, parseInt(opts.number, 10), opts.body);\n success(data, 'github', 'add-comment', start);\n } catch (err) { fail(err, 'github', 'add-comment', start); }\n });\n\n gh.command('list-review-comments')\n .description('List inline review comments on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listReviewComments(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-review-comments', start);\n } catch (err) { fail(err, 'github', 'list-review-comments', start); }\n });\n\n gh.command('add-inline-comment')\n .description('Add an inline review comment to a file in a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--commit <sha>', 'Commit SHA the comment is on')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .addOption(new Option('--side <side>', 'Comment side').choices(['LEFT', 'RIGHT']).default('RIGHT'))\n .action(async (opts: { number: string; commit: string; file: string; line: string; body: string; side?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.addInlineComment({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n body: opts.body,\n commitId: opts.commit,\n path: opts.file,\n line: parseInt(opts.line, 10),\n side: opts.side as 'LEFT' | 'RIGHT'\n });\n success(data, 'github', 'add-inline-comment', start);\n } catch (err) { fail(err, 'github', 'add-inline-comment', start); }\n });\n\n gh.command('reply-comment')\n .description('Reply to a review comment on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--comment-id <id>', 'Review comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { number: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.replyComment(owner, repo, parseInt(opts.number, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'github', 'reply-comment', start);\n } catch (err) { fail(err, 'github', 'reply-comment', start); }\n });\n\n gh.command('delete-comment')\n .description('Delete a general issue comment')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .action(async (opts: { commentId: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n await client.deleteComment(owner, repo, parseInt(opts.commentId, 10));\n success({ deleted: true }, 'github', 'delete-comment', start);\n } catch (err) { fail(err, 'github', 'delete-comment', start); }\n });\n\n gh.command('delete-review-comment')\n .description('Delete an inline review comment')\n .requiredOption('--comment-id <id>', 'Review comment ID')\n .action(async (opts: { commentId: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n await client.deleteReviewComment(owner, repo, parseInt(opts.commentId, 10));\n success({ deleted: true }, 'github', 'delete-review-comment', start);\n } catch (err) { fail(err, 'github', 'delete-review-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n gh.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const diff = await client.getDiff(owner, repo, parseInt(opts.number, 10));\n success({ diff }, 'github', 'diff', start);\n } catch (err) { fail(err, 'github', 'diff', start); }\n });\n\n gh.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listFiles(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-files', start);\n } catch (err) { fail(err, 'github', 'list-files', start); }\n });\n\n // ── Reviews ────────────────────────────────────────────────────────\n\n gh.command('list-reviews')\n .description('List reviews on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listReviews(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-reviews', start);\n } catch (err) { fail(err, 'github', 'list-reviews', start); }\n });\n\n gh.command('approve')\n .description('Approve a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .option('--body <text>', 'Review body text')\n .action(async (opts: { number: string; body?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.submitReview({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n event: 'APPROVE',\n body: opts.body\n });\n success(data, 'github', 'approve', start);\n } catch (err) { fail(err, 'github', 'approve', start); }\n });\n\n gh.command('request-changes')\n .description('Request changes on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--body <text>', 'Review feedback text')\n .action(async (opts: { number: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.submitReview({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n event: 'REQUEST_CHANGES',\n body: opts.body\n });\n success(data, 'github', 'request-changes', start);\n } catch (err) { fail(err, 'github', 'request-changes', start); }\n });\n\n gh.command('list-reviewers')\n .description('List requested reviewers for a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listRequestedReviewers(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-reviewers', start);\n } catch (err) { fail(err, 'github', 'list-reviewers', start); }\n });\n\n // ── Status & Checks ────────────────────────────────────────────────\n\n gh.command('get-status')\n .description('Get combined commit status for a ref (branch, tag, or SHA)')\n .requiredOption('--ref <ref>', 'Git ref (branch, tag, or commit SHA)')\n .action(async (opts: { ref: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.getCommitStatuses(owner, repo, opts.ref);\n success(data, 'github', 'get-status', start);\n } catch (err) { fail(err, 'github', 'get-status', start); }\n });\n\n gh.command('list-checks')\n .description('List check runs for a ref (branch, tag, or SHA)')\n .requiredOption('--ref <ref>', 'Git ref (branch, tag, or commit SHA)')\n .action(async (opts: { ref: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listCheckRuns(owner, repo, opts.ref);\n success(data, 'github', 'list-checks', start);\n } catch (err) { fail(err, 'github', 'list-checks', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n GitHubPR,\n GitHubComment,\n GitHubReview,\n GitHubFile,\n GitHubCombinedStatus,\n GitHubCheckRun,\n GitHubIssue,\n GitHubRepo\n} from '../../types/github.js';\n\nexport interface ListPRsOpts {\n owner: string;\n repo: string;\n state?: 'open' | 'closed' | 'all';\n head?: string;\n base?: string;\n}\n\nexport interface CreatePROpts {\n owner: string;\n repo: string;\n title: string;\n head: string;\n base: string;\n body?: string;\n draft?: boolean;\n}\n\nexport interface UpdatePROpts {\n owner: string;\n repo: string;\n pullNumber: number;\n title?: string;\n body?: string;\n state?: 'open' | 'closed';\n base?: string;\n}\n\nexport interface MergePROpts {\n owner: string;\n repo: string;\n pullNumber: number;\n commitTitle?: string;\n commitMessage?: string;\n mergeMethod?: 'merge' | 'squash' | 'rebase';\n}\n\nexport interface InlineCommentOpts {\n owner: string;\n repo: string;\n pullNumber: number;\n body: string;\n commitId: string;\n path: string;\n line: number;\n side?: 'LEFT' | 'RIGHT';\n}\n\nexport interface SubmitReviewOpts {\n owner: string;\n repo: string;\n pullNumber: number;\n event: 'APPROVE' | 'REQUEST_CHANGES' | 'COMMENT';\n body?: string;\n}\n\nexport interface CreateIssueOpts {\n owner: string;\n repo: string;\n title: string;\n body?: string;\n labels?: string[];\n assignees?: string[];\n}\n\nexport interface CreateRepoOpts {\n /** Org name for org repos; omit to create under the authenticated user */\n org?: string;\n name: string;\n description?: string;\n private?: boolean;\n autoInit?: boolean;\n}\n\nexport class GitHubClient {\n constructor(private http: HttpClient) {}\n\n async listPRs(opts: ListPRsOpts): Promise<GitHubPR[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubPR[]>(\n `/repos/${opts.owner}/${opts.repo}/pulls`,\n {\n params: {\n state: opts.state ?? 'open',\n ...(opts.head ? { head: opts.head } : {}),\n ...(opts.base ? { base: opts.base } : {}),\n per_page: perPage,\n page\n }\n }\n )\n );\n }\n\n async getPR(owner: string, repo: string, pullNumber: number): Promise<GitHubPR> {\n return this.http.github<GitHubPR>(`/repos/${owner}/${repo}/pulls/${pullNumber}`);\n }\n\n async createPR(opts: CreatePROpts): Promise<GitHubPR> {\n return this.http.github<GitHubPR>(\n `/repos/${opts.owner}/${opts.repo}/pulls`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n head: opts.head,\n base: opts.base,\n ...(opts.body !== undefined ? { body: opts.body } : {}),\n ...(opts.draft !== undefined ? { draft: opts.draft } : {})\n }\n }\n );\n }\n\n async updatePR(opts: UpdatePROpts): Promise<GitHubPR> {\n const body: Record<string, unknown> = {};\n if (opts.title !== undefined) body.title = opts.title;\n if (opts.body !== undefined) body.body = opts.body;\n if (opts.state !== undefined) body.state = opts.state;\n if (opts.base !== undefined) body.base = opts.base;\n\n return this.http.github<GitHubPR>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}`,\n { method: 'PATCH', body }\n );\n }\n\n async mergePR(opts: MergePROpts): Promise<{ sha: string; merged: boolean; message: string }> {\n const body: Record<string, unknown> = {};\n if (opts.commitTitle) body.commit_title = opts.commitTitle;\n if (opts.commitMessage) body.commit_message = opts.commitMessage;\n if (opts.mergeMethod) body.merge_method = opts.mergeMethod;\n\n return this.http.github<{ sha: string; merged: boolean; message: string }>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}/merge`,\n { method: 'PUT', body }\n );\n }\n\n async closePR(owner: string, repo: string, pullNumber: number): Promise<GitHubPR> {\n return this.updatePR({ owner, repo, pullNumber, state: 'closed' });\n }\n\n async listComments(owner: string, repo: string, pullNumber: number): Promise<GitHubComment[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubComment[]>(\n `/repos/${owner}/${repo}/issues/${pullNumber}/comments`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async addComment(owner: string, repo: string, pullNumber: number, body: string): Promise<GitHubComment> {\n return this.http.github<GitHubComment>(\n `/repos/${owner}/${repo}/issues/${pullNumber}/comments`,\n { method: 'POST', body: { body } }\n );\n }\n\n async listReviewComments(owner: string, repo: string, pullNumber: number): Promise<GitHubComment[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubComment[]>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/comments`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async addInlineComment(opts: InlineCommentOpts): Promise<GitHubComment> {\n return this.http.github<GitHubComment>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}/comments`,\n {\n method: 'POST',\n body: {\n body: opts.body,\n commit_id: opts.commitId,\n path: opts.path,\n line: opts.line,\n side: opts.side ?? 'RIGHT'\n }\n }\n );\n }\n\n async replyComment(owner: string, repo: string, pullNumber: number, commentId: number, body: string): Promise<GitHubComment> {\n return this.http.github<GitHubComment>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/comments/${commentId}/replies`,\n { method: 'POST', body: { body } }\n );\n }\n\n async deleteComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.http.github<void>(\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { method: 'DELETE' }\n );\n }\n\n async deleteReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.http.github<void>(\n `/repos/${owner}/${repo}/pulls/comments/${commentId}`,\n { method: 'DELETE' }\n );\n }\n\n async getDiff(owner: string, repo: string, pullNumber: number): Promise<string> {\n // GitHub returns diff content when Accept: application/vnd.github.v3.diff is set —\n // githubText() sets that header, so the same path as getPR gives the raw diff.\n return this.http.githubText(`/repos/${owner}/${repo}/pulls/${pullNumber}`);\n }\n\n async listFiles(owner: string, repo: string, pullNumber: number): Promise<GitHubFile[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubFile[]>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/files`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async listReviews(owner: string, repo: string, pullNumber: number): Promise<GitHubReview[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubReview[]>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/reviews`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async submitReview(opts: SubmitReviewOpts): Promise<GitHubReview> {\n return this.http.github<GitHubReview>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}/reviews`,\n {\n method: 'POST',\n body: {\n event: opts.event,\n ...(opts.body !== undefined ? { body: opts.body } : {})\n }\n }\n );\n }\n\n async listRequestedReviewers(owner: string, repo: string, pullNumber: number): Promise<{ users: GitHubReview['user'][] }> {\n return this.http.github<{ users: GitHubReview['user'][] }>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/requested_reviewers`\n );\n }\n\n async getCommitStatuses(owner: string, repo: string, ref: string): Promise<GitHubCombinedStatus> {\n return this.http.github<GitHubCombinedStatus>(`/repos/${owner}/${repo}/commits/${ref}/status`);\n }\n\n async listCheckRuns(owner: string, repo: string, ref: string): Promise<GitHubCheckRun[]> {\n // The check-runs payload is { total_count, check_runs: [] }, not a plain array,\n // so githubPaginate() can't be used — paginate manually until a short page.\n const results: GitHubCheckRun[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const result = await this.http.github<{ check_runs: GitHubCheckRun[] }>(\n `/repos/${owner}/${repo}/commits/${ref}/check-runs`,\n { params: { per_page: perPage, page } }\n );\n const runs = result.check_runs ?? [];\n results.push(...runs);\n if (runs.length < perPage) break;\n page++;\n }\n return results;\n }\n\n async createIssue(opts: CreateIssueOpts): Promise<GitHubIssue> {\n return this.http.github<GitHubIssue>(\n `/repos/${opts.owner}/${opts.repo}/issues`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n ...(opts.body !== undefined ? { body: opts.body } : {}),\n ...(opts.labels?.length ? { labels: opts.labels } : {}),\n ...(opts.assignees?.length ? { assignees: opts.assignees } : {})\n }\n }\n );\n }\n\n async createRepo(opts: CreateRepoOpts): Promise<GitHubRepo> {\n const path = opts.org ? `/orgs/${opts.org}/repos` : '/user/repos';\n return this.http.github<GitHubRepo>(path, {\n method: 'POST',\n body: {\n name: opts.name,\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.private !== undefined ? { private: opts.private } : {}),\n ...(opts.autoInit !== undefined ? { auto_init: opts.autoInit } : {})\n }\n });\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport path from 'path';\nimport { Command } from 'commander';\nimport { ConfluenceClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { resolveTextInput } from '../../lib/input.js';\n\n/**\n * When Confluence returns an XML parse error (HTTP 400 with \"at [row,col]={R,C}\"),\n * extracts the offending line from the submitted body and returns a diagnostic hint.\n * Returns null if the error doesn't match the pattern or the row is out of range.\n */\n/**\n * Resolves where a downloaded attachment is written.\n *\n * `title` comes from the Confluence API, so it is untrusted: without basename()\n * a title like `../../.gitconfig` (or an absolute path) escapes `outDir` and\n * writes anywhere the process can reach. Exported so that containment is\n * directly testable — see commands.test.ts.\n */\nexport function resolveAttachmentPath(outDir: string, title: string): string {\n // Split on both separators rather than path.basename(): on POSIX, basename()\n // does not treat `\\` as a separator, so a title from a Windows-hosted\n // Confluence would survive intact as a literal `..\\..\\file` filename. Handling\n // both makes containment independent of the platform pncli happens to run on.\n const segments = title.split(/[\\\\/]/).filter(s => s !== '' && s !== '.' && s !== '..');\n const name = segments.pop() ?? 'attachment';\n return path.join(outDir, name);\n}\n\nexport function xmlParseHint(err: unknown, bodyContent: string, convertedFromMarkdown = false): string | null {\n if (!(err instanceof Error)) return null;\n const m = err.message.match(/at \\[row,col\\]=\\{(\\d+),(\\d+)\\}/);\n if (!m) return null;\n const row = parseInt(m[1], 10);\n const col = parseInt(m[2], 10);\n const lines = bodyContent.split('\\n');\n const line = lines[row - 1];\n if (!line) return null;\n const pointer = ' '.repeat(Math.max(0, col - 1)) + '^';\n const suffix = convertedFromMarkdown ? ' (converted from Markdown)' : '';\n return `Offending line ${row}${suffix}: ${line}\\n${pointer}`;\n}\n\nfunction getClient(program: Command): ConfluenceClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.confluence.baseUrl) throw new PncliError('Confluence not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ConfluenceClient(http);\n}\n\nexport function registerConfluenceCommands(program: Command): void {\n const confluence = program.command('confluence').description('Confluence operations');\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n confluence.command('get-page')\n .description('Get a Confluence page by ID')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--expand <fields>', 'Comma-separated fields to expand', 'body.storage,version,space,ancestors')\n .action(async (opts: { id: string; expand: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPage(opts.id, opts.expand);\n success(data, 'confluence', 'get-page', start);\n } catch (err) { fail(err, 'confluence', 'get-page', start); }\n });\n\n confluence.command('get-page-by-title')\n .description('Find a Confluence page by space key and title')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .action(async (opts: { space: string; title: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageByTitle(opts.space, opts.title);\n if (!data) throw new PncliError(`Page not found: \"${opts.title}\" in space ${opts.space}`, 1);\n success(data, 'confluence', 'get-page-by-title', start);\n } catch (err) { fail(err, 'confluence', 'get-page-by-title', start); }\n });\n\n confluence.command('list-pages')\n .description('List pages in a Confluence space (consider --output-file for large results)')\n .requiredOption('--space <key>', 'Space key')\n .option('--limit <n>', 'Max total pages to return (default: all)')\n .option('--start <n>', 'Offset for first result')\n .action(async (opts: { space: string; limit?: string; start?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listPages(opts.space, {\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n start: opts.start ? parseInt(opts.start, 10) : undefined\n });\n success(data, 'confluence', 'list-pages', start);\n } catch (err) { fail(err, 'confluence', 'list-pages', start); }\n });\n\n confluence.command('get-page-children')\n .description('Get child pages of a Confluence page')\n .requiredOption('--id <page-id>', 'Parent page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageChildren(opts.id);\n success(data, 'confluence', 'get-page-children', start);\n } catch (err) { fail(err, 'confluence', 'get-page-children', start); }\n });\n\n confluence.command('get-labels')\n .description('Get labels on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getLabels(opts.id);\n success(data, 'confluence', 'get-labels', start);\n } catch (err) { fail(err, 'confluence', 'get-labels', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────────────\n\n confluence.command('search')\n .description('Search Confluence with CQL')\n .requiredOption('--cql <query>', 'CQL query string (e.g. \"space=PROJ AND type=page\")')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--start <n>', 'Offset for first result', '0')\n .option('--expand <fields>', 'Comma-separated fields to expand')\n .action(async (opts: { cql: string; limit: string; start: string; expand?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.search(opts.cql, {\n limit: parseInt(opts.limit, 10),\n start: parseInt(opts.start, 10),\n expand: opts.expand\n });\n success(data, 'confluence', 'search', start);\n } catch (err) { fail(err, 'confluence', 'search', start); }\n });\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n confluence.command('create-page')\n .description('Create a new Confluence page')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .option('--body <html>', 'Page body (storage format HTML or Markdown when --markdown is set)')\n .option('--body-file <path>', \"Path to a file containing the page body ('-' = stdin)\")\n .option('--markdown', 'Convert body from Markdown to storage format via Confluence API')\n .option('--parent-id <id>', 'Parent page ID (to nest under a page)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { space: string; title: string; body?: string; bodyFile?: string; markdown?: boolean; parentId?: string; representation: string }) => {\n const start = Date.now();\n let bodyContent: string | undefined;\n try {\n const client = getClient(program);\n const rawBody = resolveTextInput(opts.body, opts.bodyFile, 'body');\n if (rawBody === undefined) throw new PncliError('Must specify --body or --body-file', 1);\n bodyContent = opts.markdown ? await client.convertToStorage(rawBody) : rawBody;\n const representation = opts.markdown ? 'storage' : opts.representation;\n const data = await client.createPage({\n spaceKey: opts.space,\n title: opts.title,\n body: bodyContent,\n parentId: opts.parentId,\n representation\n });\n success(data, 'confluence', 'create-page', start);\n } catch (err) {\n const hint = bodyContent ? xmlParseHint(err, bodyContent, Boolean(opts.markdown)) : null;\n if (hint) {\n const msg = err instanceof Error ? err.message : String(err);\n const status = err instanceof PncliError ? err.status : 1;\n const url = err instanceof PncliError ? err.url : undefined;\n fail(new PncliError(`${msg}\\n\\n${hint}`, status, url), 'confluence', 'create-page', start);\n } else {\n fail(err, 'confluence', 'create-page', start);\n }\n }\n });\n\n confluence.command('update-page')\n .description('Update a Confluence page (fetches current version automatically)')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--title <title>', 'New page title')\n .option('--body <html>', 'New page body (storage format HTML or Markdown when --markdown is set)')\n .option('--body-file <path>', \"Path to a file containing the new page body ('-' = stdin)\")\n .option('--markdown', 'Convert body from Markdown to storage format via Confluence API')\n .option('--status <status>', 'Page status: current (default) or draft', 'current')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; title?: string; body?: string; bodyFile?: string; markdown?: boolean; status: string; representation: string }) => {\n const start = Date.now();\n let bodyContent: string | undefined;\n try {\n const client = getClient(program);\n const rawBody = resolveTextInput(opts.body, opts.bodyFile, 'body');\n bodyContent = (rawBody !== undefined && opts.markdown)\n ? await client.convertToStorage(rawBody)\n : rawBody;\n const representation = (bodyContent !== undefined && opts.markdown) ? 'storage' : opts.representation;\n const current = await client.getPage(opts.id, 'version');\n const nextVersion = current.version.number + 1;\n const data = await client.updatePage(opts.id, {\n version: nextVersion,\n title: opts.title ?? current.title,\n body: bodyContent,\n status: opts.status,\n representation\n });\n success(data, 'confluence', 'update-page', start);\n } catch (err) {\n const hint = bodyContent ? xmlParseHint(err, bodyContent, Boolean(opts.markdown)) : null;\n if (hint) {\n const msg = err instanceof Error ? err.message : String(err);\n const status = err instanceof PncliError ? err.status : 1;\n const url = err instanceof PncliError ? err.url : undefined;\n fail(new PncliError(`${msg}\\n\\n${hint}`, status, url), 'confluence', 'update-page', start);\n } else {\n fail(err, 'confluence', 'update-page', start);\n }\n }\n });\n\n confluence.command('delete-page')\n .description('Delete a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.deletePage(opts.id);\n success({ deleted: opts.id }, 'confluence', 'delete-page', start);\n } catch (err) { fail(err, 'confluence', 'delete-page', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────────────\n\n confluence.command('list-comments')\n .description('List comments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.id);\n success(data, 'confluence', 'list-comments', start);\n } catch (err) { fail(err, 'confluence', 'list-comments', start); }\n });\n\n confluence.command('add-comment')\n .description('Add a comment to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--body <text>', 'Comment body (storage format HTML)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; body: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.id, opts.body, opts.representation);\n success(data, 'confluence', 'add-comment', start);\n } catch (err) { fail(err, 'confluence', 'add-comment', start); }\n });\n\n // ── Labels ────────────────────────────────────────────────────────────────\n\n confluence.command('add-label')\n .description('Add labels to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--labels <names>', 'Comma-separated label names')\n .action(async (opts: { id: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n const data = await client.addLabel(opts.id, labels);\n success(data, 'confluence', 'add-label', start);\n } catch (err) { fail(err, 'confluence', 'add-label', start); }\n });\n\n confluence.command('remove-label')\n .description('Remove a label from a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--label <name>', 'Label name to remove')\n .action(async (opts: { id: string; label: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.removeLabel(opts.id, opts.label);\n success({ removed: opts.label, from: opts.id }, 'confluence', 'remove-label', start);\n } catch (err) { fail(err, 'confluence', 'remove-label', start); }\n });\n\n // ── Spaces ────────────────────────────────────────────────────────────────\n\n confluence.command('list-spaces')\n .description('List Confluence spaces')\n .option('--type <type>', 'Space type: global or personal')\n .option('--limit <n>', 'Max total spaces to return (default: all)')\n .action(async (opts: { type?: string; limit?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listSpaces({\n type: opts.type,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined\n });\n success(data, 'confluence', 'list-spaces', start);\n } catch (err) { fail(err, 'confluence', 'list-spaces', start); }\n });\n\n confluence.command('get-space')\n .description('Get a Confluence space by key')\n .requiredOption('--key <space-key>', 'Space key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getSpace(opts.key);\n success(data, 'confluence', 'get-space', start);\n } catch (err) { fail(err, 'confluence', 'get-space', start); }\n });\n\n // ── Attachments ───────────────────────────────────────────────────────────\n\n confluence.command('list-attachments')\n .description('List attachments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listAttachments(opts.id);\n success(data, 'confluence', 'list-attachments', start);\n } catch (err) { fail(err, 'confluence', 'list-attachments', start); }\n });\n\n confluence.command('upload-attachment')\n .description('Upload a file as an attachment to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--file <path>', 'Path to the file to upload')\n .option('--comment <text>', 'Optional comment to attach to the file version')\n .action(async (opts: { id: string; file: string; comment?: string }) => {\n const start = Date.now();\n try {\n if (!existsSync(opts.file)) throw new PncliError(`File not found: ${opts.file}`, 1);\n const client = getClient(program);\n const data = await client.uploadAttachment(opts.id, opts.file, opts.comment);\n success(data, 'confluence', 'upload-attachment', start);\n } catch (err) { fail(err, 'confluence', 'upload-attachment', start); }\n });\n\n confluence.command('download-attachment')\n .description('Download a Confluence attachment to .pncli/ (or --dir)')\n .requiredOption('--id <attachment-id>', 'Attachment content ID')\n .option('--dir <path>', 'Output directory (default: .pncli relative to cwd)')\n .action(async (opts: { id: string; dir?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const attachment = await client.getAttachment(opts.id);\n const outDir = opts.dir ?? path.join(process.cwd(), '.pncli');\n mkdirSync(outDir, { recursive: true });\n const outPath = resolveAttachmentPath(outDir, attachment.title);\n const buffer = await client.downloadAttachment(attachment);\n writeFileSync(outPath, buffer);\n success({ saved: outPath, filename: attachment.title, size: buffer.length }, 'confluence', 'download-attachment', start);\n } catch (err) { fail(err, 'confluence', 'download-attachment', start); }\n });\n\n confluence.command('delete-attachment')\n .description('Delete an attachment from Confluence by its content ID (moves it to the trash; does not permanently purge it)')\n .requiredOption('--id <attachment-id>', 'Attachment content ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.deleteAttachment(opts.id);\n success({ deleted: opts.id }, 'confluence', 'delete-attachment', start);\n } catch (err) { fail(err, 'confluence', 'delete-attachment', start); }\n });\n\n // ── History ───────────────────────────────────────────────────────────────\n\n confluence.command('get-page-history')\n .description('Get the version history metadata for a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageHistory(opts.id);\n success(data, 'confluence', 'get-page-history', start);\n } catch (err) { fail(err, 'confluence', 'get-page-history', start); }\n });\n}\n","import { readFileSync } from 'fs';\nimport { basename } from 'path';\nimport type { HttpClient } from '../../lib/http.js';\nimport { guessMimeType } from '../../lib/mime.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n ConfluencePage,\n ConfluenceSpace,\n ConfluenceComment,\n ConfluenceLabel,\n ConfluenceAttachment,\n ConfluencePageHistory,\n ConfluencePageResponse,\n ConfluenceSearchResult\n} from '../../types/confluence.js';\n\nconst API = '/rest/api';\n\nexport interface CreatePageOpts {\n spaceKey: string;\n title: string;\n body: string;\n parentId?: string;\n representation?: string;\n}\n\nexport interface UpdatePageOpts {\n version: number;\n title: string;\n body?: string;\n status?: string;\n representation?: string;\n}\n\nexport interface ListPagesOpts {\n limit?: number;\n start?: number;\n}\n\nexport interface SearchOpts {\n limit?: number;\n start?: number;\n expand?: string;\n}\n\nexport interface ListSpacesOpts {\n type?: string;\n limit?: number;\n start?: number;\n}\n\nexport class ConfluenceClient {\n constructor(private http: HttpClient) {}\n\n async getPage(id: string, expand = 'body.storage,version,space,ancestors'): Promise<ConfluencePage> {\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n params: { expand }\n });\n }\n\n async getPageByTitle(spaceKey: string, title: string): Promise<ConfluencePage | null> {\n const result = await this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, title, expand: 'body.storage,version,space', type: 'page' }\n });\n return result.results[0] ?? null;\n }\n\n async listPages(spaceKey: string, opts: ListPagesOpts = {}): Promise<ConfluencePage[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, type: 'page', expand: 'version', start: initialStart + start, limit }\n });\n }, opts.limit);\n }\n\n async getPageChildren(id: string): Promise<ConfluencePage[]> {\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content/${id}/child/page`, {\n params: { expand: 'version', start, limit }\n });\n });\n }\n\n async getLabels(id: string): Promise<ConfluenceLabel[]> {\n return this.http.confluencePaginate<ConfluenceLabel>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${id}/label`, {\n params: { start, limit }\n });\n });\n }\n\n async search(cql: string, opts: SearchOpts = {}): Promise<ConfluenceSearchResult> {\n return this.http.confluence<ConfluenceSearchResult>(`${API}/content/search`, {\n params: {\n cql,\n start: opts.start ?? 0,\n limit: opts.limit ?? 25,\n ...(opts.expand ? { expand: opts.expand } : {})\n }\n });\n }\n\n async createPage(opts: CreatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n type: 'page',\n title: opts.title,\n space: { key: opts.spaceKey },\n ancestors: opts.parentId ? [{ id: opts.parentId }] : [],\n body: {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n }\n };\n return this.http.confluence<ConfluencePage>(`${API}/content`, {\n method: 'POST',\n body\n });\n }\n\n async updatePage(id: string, opts: UpdatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n version: { number: opts.version },\n type: 'page',\n title: opts.title,\n status: opts.status ?? 'current'\n };\n if (opts.body !== undefined) {\n body.body = {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n };\n }\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n method: 'PUT',\n body\n });\n }\n\n async deletePage(id: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${id}`, { method: 'DELETE' });\n }\n\n async listComments(pageId: string): Promise<ConfluenceComment[]> {\n return this.http.confluencePaginate<ConfluenceComment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceComment>>(`${API}/content/${pageId}/child/comment`, {\n params: { expand: 'body.storage,version', start, limit }\n });\n });\n }\n\n async addComment(pageId: string, body: string, representation = 'storage'): Promise<ConfluenceComment> {\n return this.http.confluence<ConfluenceComment>(`${API}/content`, {\n method: 'POST',\n body: {\n type: 'comment',\n container: { id: pageId, type: 'page' },\n body: {\n storage: { value: body, representation }\n }\n }\n });\n }\n\n async addLabel(pageId: string, labels: string[]): Promise<ConfluenceLabel[]> {\n const body = labels.map(name => ({ prefix: 'global', name }));\n const result = await this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${pageId}/label`, {\n method: 'POST',\n body\n });\n return result.results;\n }\n\n async removeLabel(pageId: string, label: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${pageId}/label/${label}`, { method: 'DELETE' });\n }\n\n async listSpaces(opts: ListSpacesOpts = {}): Promise<ConfluenceSpace[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluenceSpace>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceSpace>>(`${API}/space`, {\n params: {\n start: initialStart + start,\n limit,\n ...(opts.type ? { type: opts.type } : {})\n }\n });\n }, opts.limit);\n }\n\n async getSpace(key: string): Promise<ConfluenceSpace> {\n return this.http.confluence<ConfluenceSpace>(`${API}/space/${key}`, {\n params: { expand: 'description.plain' }\n });\n }\n\n async listAttachments(pageId: string): Promise<ConfluenceAttachment[]> {\n return this.http.confluencePaginate<ConfluenceAttachment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceAttachment>>(`${API}/content/${pageId}/child/attachment`, {\n params: { start, limit }\n });\n });\n }\n\n async uploadAttachment(pageId: string, filePath: string, comment?: string): Promise<ConfluenceAttachment[]> {\n const fileContent = readFileSync(filePath);\n const fileName = basename(filePath);\n const mimeType = guessMimeType(filePath);\n const formData = new FormData();\n formData.append('file', new Blob([fileContent], { type: mimeType }), fileName);\n if (comment) formData.append('comment', comment);\n const result = await this.http.confluenceUpload<ConfluencePageResponse<ConfluenceAttachment>>(\n `${API}/content/${pageId}/child/attachment`,\n formData\n );\n return result.results;\n }\n\n async getAttachment(attachmentId: string): Promise<ConfluenceAttachment> {\n return this.http.confluence<ConfluenceAttachment>(`${API}/content/${attachmentId}`);\n }\n\n async downloadAttachment(attachment: ConfluenceAttachment): Promise<Buffer> {\n // `/rest/api/content/{id}` resolves any content type, so a page ID here returns\n // a page with no download link. The declared type says `download` is required,\n // so TS won't catch it — without this guard buildUrl gets undefined and throws\n // a bare TypeError instead of a PncliError with a usable exit code.\n const downloadPath = attachment._links.download;\n if (!downloadPath) {\n throw new PncliError(\n `Content ${attachment.id} has no download link — is it an attachment? (title: ${attachment.title})`,\n 1\n );\n }\n return this.http.confluenceBuffer(downloadPath);\n }\n\n async deleteAttachment(attachmentId: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${attachmentId}`, { method: 'DELETE' });\n }\n\n async getPageHistory(id: string): Promise<ConfluencePageHistory> {\n return this.http.confluence<ConfluencePageHistory>(`${API}/content/${id}/history`);\n }\n\n async convertToStorage(value: string, fromRepresentation = 'markdown'): Promise<string> {\n const result = await this.http.confluence<{ value: string; representation: string }>(\n `${API}/contentbody/convert/storage`,\n {\n method: 'POST',\n body: { value, representation: fromRepresentation }\n }\n );\n return result.value;\n }\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SonarSystemStatus,\n SonarQualityGateStatus,\n SonarIssuesResponse,\n SonarIssue,\n SonarMeasuresComponent,\n SonarProjectsResponse,\n SonarProject,\n SonarHotspotsResponse,\n SonarHotspot\n} from '../../types/sonar.js';\n\nconst API = '/api';\n\nexport interface SearchIssuesOpts {\n projectKey: string;\n severities?: string;\n types?: string;\n statuses?: string;\n branch?: string;\n resolved?: boolean;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchHotspotsOpts {\n projectKey: string;\n status?: string;\n resolution?: string;\n branch?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchProjectsOpts {\n query?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface GetMeasuresOpts {\n projectKey: string;\n metricKeys: string;\n branch?: string;\n}\n\nexport class SonarClient {\n constructor(private http: HttpClient) {}\n\n async getStatus(): Promise<SonarSystemStatus> {\n return this.http.sonar<SonarSystemStatus>(`${API}/system/status`);\n }\n\n async getQualityGate(projectKey: string, branch?: string): Promise<SonarQualityGateStatus> {\n return this.http.sonar<SonarQualityGateStatus>(`${API}/qualitygates/project_status`, {\n params: { projectKey, ...(branch ? { branch } : {}) }\n });\n }\n\n async searchIssues(opts: SearchIssuesOpts): Promise<SonarIssuesResponse> {\n return this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllIssues(opts: SearchIssuesOpts): Promise<SonarIssue[]> {\n return this.http.sonarPaginate<SonarIssue>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.total, p: resp.p, ps: resp.ps, items: resp.issues };\n });\n }\n\n async getMeasures(opts: GetMeasuresOpts): Promise<SonarMeasuresComponent> {\n return this.http.sonar<SonarMeasuresComponent>(`${API}/measures/component`, {\n params: {\n component: opts.projectKey,\n metricKeys: opts.metricKeys,\n ...(opts.branch ? { branch: opts.branch } : {})\n }\n });\n }\n\n async searchProjects(opts: SearchProjectsOpts = {}): Promise<SonarProjectsResponse> {\n return this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: {\n q: opts.query,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllProjects(query?: string): Promise<SonarProject[]> {\n return this.http.sonarPaginate<SonarProject>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: { q: query, p: page, ps: pageSize }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.components };\n });\n }\n\n async searchHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspotsResponse> {\n return this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspot[]> {\n return this.http.sonarPaginate<SonarHotspot>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.hotspots };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SonarClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nconst DEFAULT_METRICS = 'coverage,duplicated_lines_density,bugs,vulnerabilities,code_smells,sqale_rating,reliability_rating,security_rating,ncloc';\n\nfunction getClient(program: Command): { client: SonarClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sonar.baseUrl) throw new PncliError('SonarQube not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SonarClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): string {\n const project = cliProject ?? config.defaults.sonar.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sonar.project in config.');\n return project;\n}\n\nexport function registerSonarCommands(program: Command): void {\n const sonar = program.command('sonar').description('SonarQube Server operations');\n\n // ── Quality Gate ─────────────────────────────────────────────────────────\n\n sonar.command('quality-gate')\n .description('Get quality gate status for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getQualityGate(projectKey, opts.branch);\n success(data, 'sonar', 'quality-gate', start);\n } catch (err) { fail(err, 'sonar', 'quality-gate', start); }\n });\n\n // ── Issues ────────────────────────────────────────────────────────────────\n\n sonar.command('issues')\n .description('Search/list issues for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--severities <list>', 'Filter by severity: BLOCKER,CRITICAL,MAJOR,MINOR,INFO (comma-separated)')\n .option('--types <list>', 'Filter by type: BUG,VULNERABILITY,CODE_SMELL (comma-separated)')\n .option('--statuses <list>', 'Filter by status: OPEN,CONFIRMED,REOPENED,RESOLVED,CLOSED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--resolved <bool>', 'Filter resolved issues: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page (max 500)', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results; ignores --page/--page-size)')\n .action(async (opts: { project?: string; severities?: string; types?: string; statuses?: string; branch?: string; resolved?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? opts.resolved === 'true' : undefined\n };\n if (opts.all) {\n const data = await client.searchAllIssues(baseOpts);\n success(data, 'sonar', 'issues', start);\n } else {\n const data = await client.searchIssues({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'issues', start);\n }\n } catch (err) { fail(err, 'sonar', 'issues', start); }\n });\n\n // ── Measures ──────────────────────────────────────────────────────────────\n\n sonar.command('measures')\n .description('Get key metrics for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--metrics <list>', 'Comma-separated metric keys', DEFAULT_METRICS)\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; metrics: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getMeasures({\n projectKey,\n metricKeys: opts.metrics,\n branch: opts.branch\n });\n success(data, 'sonar', 'measures', start);\n } catch (err) { fail(err, 'sonar', 'measures', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sonar.command('projects')\n .description('Search/list projects')\n .option('--query <text>', 'Search query')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { query?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n if (opts.all) {\n const data = await client.searchAllProjects(opts.query);\n success(data, 'sonar', 'projects', start);\n } else {\n const data = await client.searchProjects({\n query: opts.query,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'projects', start);\n }\n } catch (err) { fail(err, 'sonar', 'projects', start); }\n });\n\n // ── Hotspots ──────────────────────────────────────────────────────────────\n\n sonar.command('hotspots')\n .description('List security hotspots for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--status <status>', 'Filter: TO_REVIEW or REVIEWED')\n .option('--resolution <list>', 'Filter: FIXED,SAFE,ACKNOWLEDGED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; status?: string; resolution?: string; branch?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch\n };\n if (opts.all) {\n const data = await client.searchAllHotspots(baseOpts);\n success(data, 'sonar', 'hotspots', start);\n } else {\n const data = await client.searchHotspots({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'hotspots', start);\n }\n } catch (err) { fail(err, 'sonar', 'hotspots', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SdeServerInfo,\n SdeUser,\n SdeProject,\n SdeTask,\n SdeThreat,\n SdePaginatedResponse\n} from '../../types/sde.js';\n\nconst API = '/api/v2';\n\nexport interface ListProjectsOpts {\n name?: string;\n slug?: string;\n search?: string;\n active?: string;\n ordering?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListTasksOpts {\n projectId: number;\n phase?: string;\n priority?: string;\n status?: string;\n assignedTo?: string;\n source?: string;\n verification?: string;\n tag?: string;\n accepted?: string;\n relevant?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListThreatsOpts {\n projectId: number;\n severity?: string;\n title?: string;\n threatId?: string;\n capecId?: string;\n componentId?: string;\n search?: string;\n ordering?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListUsersOpts {\n email?: string;\n firstName?: string;\n lastName?: string;\n isActive?: string;\n page?: number;\n pageSize?: number;\n}\n\nfunction projectParams(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n name: opts.name,\n slug: opts.slug,\n search: opts.search,\n active: opts.active,\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction taskParams(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assigned_to: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction threatParams(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n severity: opts.severity,\n title: opts.title,\n threat_id: opts.threatId,\n capec_id: opts.capecId,\n component_id: opts.componentId,\n search: opts.search,\n ordering: opts.ordering,\n page,\n page_size: pageSize\n };\n}\n\nfunction userParams(opts: Omit<ListUsersOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n email: opts.email,\n first_name: opts.firstName,\n last_name: opts.lastName,\n is_active: opts.isActive,\n page,\n page_size: pageSize\n };\n}\n\nexport class SdeClient {\n constructor(private http: HttpClient) {}\n\n async getServerInfo(): Promise<SdeServerInfo> {\n return this.http.sde<SdeServerInfo>(`${API}/server-info/`);\n }\n\n async getMe(): Promise<SdeUser> {\n return this.http.sde<SdeUser>(`${API}/users/me/`);\n }\n\n async getProject(projectId: number, expand?: string, include?: string): Promise<SdeProject> {\n return this.http.sde<SdeProject>(`${API}/projects/${projectId}/`, {\n params: { expand, include }\n });\n }\n\n async getTask(projectId: number, taskId: string, expand?: string, include?: string): Promise<SdeTask> {\n return this.http.sde<SdeTask>(`${API}/projects/${projectId}/tasks/${taskId}/`, {\n params: { expand, include }\n });\n }\n\n async listProjects(opts: ListProjectsOpts = {}): Promise<SdePaginatedResponse<SdeProject>> {\n return this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllProjects(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'> = {}): Promise<SdeProject[]> {\n return this.http.sdePaginate<SdeProject>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listTasks(opts: ListTasksOpts): Promise<SdePaginatedResponse<SdeTask>> {\n return this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllTasks(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>): Promise<SdeTask[]> {\n return this.http.sdePaginate<SdeTask>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listThreats(opts: ListThreatsOpts): Promise<SdePaginatedResponse<SdeThreat>> {\n return this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllThreats(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>): Promise<SdeThreat[]> {\n return this.http.sdePaginate<SdeThreat>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listUsers(opts: ListUsersOpts = {}): Promise<SdePaginatedResponse<SdeUser>> {\n return this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllUsers(opts: Omit<ListUsersOpts, 'page' | 'pageSize'> = {}): Promise<SdeUser[]> {\n return this.http.sdePaginate<SdeUser>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SdeClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): { client: SdeClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sde.baseUrl) throw new PncliError('SDElements not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SdeClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): number {\n const project = cliProject ?? config.defaults.sde.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sde.project in config.');\n if (!/^\\d+$/.test(project)) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n const id = parseInt(project, 10);\n if (id <= 0) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n return id;\n}\n\nfunction parsePage(val: string, flag: string): number {\n const n = parseInt(val, 10);\n if (isNaN(n) || n < 1) throw new PncliError(`Invalid ${flag}: \"${val}\". Must be a positive integer.`);\n return n;\n}\n\nfunction validateActive(val: string | undefined, allowed: string[]): string | undefined {\n if (val === undefined) return undefined;\n if (!allowed.includes(val)) {\n throw new PncliError(`Invalid --active value: \"${val}\". Allowed: ${allowed.join(', ')}.`);\n }\n return val;\n}\n\nexport function registerSdeCommands(program: Command): void {\n const sde = program.command('sde').description('SDElements operations (threat modeling, countermeasures, compliance)');\n\n // ── Server Info ───────────────────────────────────────────────────────────\n\n sde.command('server-info')\n .description('Get server version and platform info (requires super-user)')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getServerInfo();\n success(data, 'sde', 'server-info', start);\n } catch (err) { fail(err, 'sde', 'server-info', start); }\n });\n\n // ── Whoami ────────────────────────────────────────────────────────────────\n\n sde.command('whoami')\n .description('Get current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getMe();\n success(data, 'sde', 'whoami', start);\n } catch (err) { fail(err, 'sde', 'whoami', start); }\n });\n\n // ── Users ─────────────────────────────────────────────────────────────────\n\n sde.command('users')\n .description('List users')\n .option('--email <email>', 'Filter by email address')\n .option('--first-name <name>', 'Filter by first name')\n .option('--last-name <name>', 'Filter by last name')\n .option('--active <bool>', 'Filter by active status: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { email?: string; firstName?: string; lastName?: string; active?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n email: opts.email,\n firstName: opts.firstName,\n lastName: opts.lastName,\n isActive: validateActive(opts.active, ['true', 'false'])\n };\n if (opts.all) {\n const data = await client.listAllUsers(baseOpts);\n success(data, 'sde', 'users', start);\n } else {\n const data = await client.listUsers({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'users', start);\n }\n } catch (err) { fail(err, 'sde', 'users', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sde.command('projects')\n .description('List projects')\n .option('--name <name>', 'Filter by project name')\n .option('--search <text>', 'Text search on name and profile')\n .option('--active <val>', 'Filter by active status: true, false, or all')\n .option('--ordering <field>', 'Sort by: name, created, updated (prefix with - for descending)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { name?: string; search?: string; active?: string; ordering?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n name: opts.name,\n search: opts.search,\n active: validateActive(opts.active, ['true', 'false', 'all']),\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllProjects(baseOpts);\n success(data, 'sde', 'projects', start);\n } else {\n const data = await client.listProjects({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'projects', start);\n }\n } catch (err) { fail(err, 'sde', 'projects', start); }\n });\n\n // ── Project ───────────────────────────────────────────────────────────────\n\n sde.command('project')\n .description('Get a single project by ID')\n .option('--id <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .action(async (opts: { id?: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.id);\n const data = await client.getProject(projectId, opts.expand, opts.include);\n success(data, 'sde', 'project', start);\n } catch (err) { fail(err, 'sde', 'project', start); }\n });\n\n // ── Tasks ─────────────────────────────────────────────────────────────────\n\n sde.command('tasks')\n .description('List countermeasures for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--phase <slug>', 'Filter by phase slug (e.g. development, architecture-design)')\n .option('--priority <n>', 'Filter by priority (1-10)')\n .option('--status <id>', 'Filter by status ID (e.g. TS1, TS2)')\n .option('--assigned-to <email>', 'Filter by assignee email')\n .option('--source <val>', 'Filter by source: default, custom, manual, project')\n .option('--verification <val>', 'Filter by verification: pass, fail, partial, none')\n .option('--tag <name>', 'Filter by tag name')\n .option('--accepted <bool>', 'Filter by accepted status: true or false')\n .option('--relevant <bool>', 'Filter by relevant status: true or false')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references,regulation_sections')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; phase?: string; priority?: string; status?: string; assignedTo?: string; source?: string; verification?: string; tag?: string; accepted?: string; relevant?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assignedTo: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllTasks(baseOpts);\n success(data, 'sde', 'tasks', start);\n } else {\n const data = await client.listTasks({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'tasks', start);\n }\n } catch (err) { fail(err, 'sde', 'tasks', start); }\n });\n\n // ── Task ──────────────────────────────────────────────────────────────────\n\n sde.command('task')\n .description('Get a single countermeasure')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .requiredOption('--task <id>', 'Task ID (e.g. T21)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references')\n .action(async (opts: { project?: string; task: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const data = await client.getTask(projectId, opts.task, opts.expand, opts.include);\n success(data, 'sde', 'task', start);\n } catch (err) { fail(err, 'sde', 'task', start); }\n });\n\n // ── Threats ───────────────────────────────────────────────────────────────\n\n sde.command('threats')\n .description('List threats for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--severity <n>', 'Filter by severity (1-10)')\n .option('--search <text>', 'Full-text search on title and threat ID')\n .option('--ordering <field>', 'Sort by: threat__severity, threat_id, status (prefix - for descending)')\n .option('--capec-id <id>', 'Filter by CAPEC attack pattern ID')\n .option('--component-id <id>', 'Filter by component ID')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; severity?: string; search?: string; ordering?: string; capecId?: string; componentId?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n severity: opts.severity,\n search: opts.search,\n ordering: opts.ordering,\n capecId: opts.capecId,\n componentId: opts.componentId\n };\n if (opts.all) {\n const data = await client.listAllThreats(baseOpts);\n success(data, 'sde', 'threats', start);\n } else {\n const data = await client.listThreats({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'threats', start);\n }\n } catch (err) { fail(err, 'sde', 'threats', start); }\n });\n}\n","import { Command, Option } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { loadConfig } from '../../lib/config.js';\nimport type { ScanOptions, Ecosystem, FriskSource } from './types.js';\nimport { runScan } from './scan.js';\nimport { runDiff } from './diff.js';\nimport { runFrisk } from './frisk.js';\nimport { runOutdated } from './outdated.js';\nimport { runLicenseCheck } from './license-check.js';\nimport { buildConnectivityData } from './connectivity.js';\n\nexport function registerDepsCommands(program: Command): void {\n const deps = program\n .command('deps')\n .description('Dependency scanning, CVE detection, and license auditing');\n\n // ─── frisk (primary) ────────────────────────────────────────────────────────\n\n deps\n .command('frisk')\n .description('Scan all dependencies for CVEs and output remediation paths (requires OSV.dev, Sonatype OSS Index, or Sonatype IQ Server)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--direct-only', 'Only scan direct dependencies (default: include transitive)', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .addOption(new Option('--source <source>', 'Vulnerability source').choices(['osv', 'sonatype', 'sonatypeiq', 'all']).default('osv'))\n .option('--application-id <id>', 'Sonatype IQ Server application ID (required when --source sonatypeiq)')\n .action(async (opts: { ecosystem: string; directOnly: boolean; includeDev: boolean; source: string; applicationId?: string }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: !opts.directOnly,\n includeDev: opts.includeDev\n };\n const data = await runFrisk(config, scanOpts, opts.source as FriskSource, opts.applicationId);\n success(data, 'deps', 'frisk', startTime);\n } catch (err) {\n fail(err, 'deps', 'frisk', startTime);\n }\n });\n\n // ─── scan ───────────────────────────────────────────────────────────────────\n\n deps\n .command('scan')\n .description('Inventory all dependencies from manifest files (local only, no network)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-transitive', 'Include transitive dependencies', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { ecosystem: string; includeTransitive: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: opts.includeTransitive,\n includeDev: opts.includeDev\n };\n const data = runScan(config, scanOpts);\n success(data, 'deps', 'scan', startTime);\n } catch (err) {\n fail(err, 'deps', 'scan', startTime);\n }\n });\n\n // ─── diff ───────────────────────────────────────────────────────────────────\n\n deps\n .command('diff')\n .description('Show dependency changes between two git refs (local only, no network)')\n .requiredOption('--from <ref>', 'Base git ref (commit, tag, or branch)')\n .option('--to <ref>', 'Target git ref (default: working tree)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { from: string; to?: string; ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: true,\n includeDev: opts.includeDev\n };\n const data = runDiff(config, opts.from, opts.to ?? null, scanOpts);\n success(data, 'deps', 'diff', startTime);\n } catch (err) {\n fail(err, 'deps', 'diff', startTime);\n }\n });\n\n // ─── outdated ───────────────────────────────────────────────────────────────\n\n deps\n .command('outdated')\n .description('Check for newer versions available in Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--major', 'Only show major version bumps')\n .option('--minor', 'Only show minor version bumps or higher')\n .option('--patch', 'Only show patch version bumps or higher')\n .action(async (opts: { ecosystem: string; major?: boolean; minor?: boolean; patch?: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = { ecosystem: opts.ecosystem as Ecosystem | 'all' };\n const filterType = opts.major ? 'major' : opts.minor ? 'minor' : opts.patch ? 'patch' : undefined;\n const data = await runOutdated(config, scanOpts, filterType);\n success(data, 'deps', 'outdated', startTime);\n } catch (err) {\n fail(err, 'deps', 'outdated', startTime);\n }\n });\n\n // ─── license-check ──────────────────────────────────────────────────────────\n\n deps\n .command('license-check')\n .description('Report licenses for all direct dependencies via Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeDev: opts.includeDev\n };\n const data = await runLicenseCheck(config, scanOpts);\n success(data, 'deps', 'license-check', startTime);\n } catch (err) {\n fail(err, 'deps', 'license-check', startTime);\n }\n });\n\n // ─── connectivity ───────────────────────────────────────────────────────────\n\n deps\n .command('connectivity')\n .description('Test network access to Artifactory, OSV.dev, and Sonatype OSS Index, report available tier')\n .action(async (_opts: unknown, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const data = await buildConnectivityData(config);\n success(data, 'deps', 'connectivity', startTime);\n } catch (err) {\n fail(err, 'deps', 'connectivity', startTime);\n }\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execSync, execFileSync } from 'child_process';\nimport type { Package, ManifestInfo, ScanOptions, ScanData, Ecosystem } from '../types.js';\nimport { findNpmManifests, parseNpmPackages } from './npm.js';\nimport { findNugetManifests, parseNugetPackages } from './nuget.js';\nimport { findMavenManifests, parseMavenPackages } from './maven.js';\n\nfunction getRepoFiles(repoRoot: string): string[] {\n try {\n const out = execSync('git ls-files --cached --others --exclude-standard', {\n encoding: 'utf8',\n cwd: repoRoot,\n maxBuffer: 10 * 1024 * 1024\n });\n return out.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction readFile(repoRoot: string, relPath: string): string | null {\n try {\n return fs.readFileSync(path.join(repoRoot, relPath), 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction readFileAtRef(repoRoot: string, ref: string, relPath: string): string | null {\n try {\n return execFileSync('git', ['show', `${ref}:${relPath}`], {\n encoding: 'utf8',\n cwd: repoRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n });\n } catch {\n return null;\n }\n}\n\nfunction findPropsContent(\n manifestFile: string,\n readFn: (relPath: string) => string | null\n): string | null {\n // Walk up from the manifest directory to the repo root looking for Directory.Packages.props\n let dir = path.dirname(manifestFile);\n for (let depth = 0; depth < 10; depth++) {\n const candidate = dir === '.' ? 'Directory.Packages.props' : `${dir}/Directory.Packages.props`;\n const content = readFn(candidate);\n if (content) return content;\n if (dir === '.') break;\n dir = path.dirname(dir);\n }\n return null;\n}\n\nfunction parseManifests(\n manifests: ManifestInfo[],\n opts: ScanOptions,\n readFn: (relPath: string) => string | null\n): Package[] {\n const allPackages: Package[] = [];\n const seen = new Set<string>();\n\n for (const manifest of manifests) {\n const content = readFn(manifest.file);\n if (!content) continue;\n\n const lockContent = manifest.lockFile ? readFn(manifest.lockFile) ?? undefined : undefined;\n\n let pkgs: Package[] = [];\n\n if (manifest.ecosystem === 'npm') {\n pkgs = parseNpmPackages(content, manifest, opts, lockContent);\n } else if (manifest.ecosystem === 'nuget') {\n // Walk up from the manifest's directory to find the nearest Directory.Packages.props\n const propsContent = findPropsContent(manifest.file, readFn) ?? undefined;\n pkgs = parseNugetPackages(content, manifest, opts, lockContent, propsContent);\n } else if (manifest.ecosystem === 'maven') {\n pkgs = parseMavenPackages(content, manifest, opts, lockContent);\n }\n\n for (const pkg of pkgs) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}:${pkg.source}`;\n if (!seen.has(key)) {\n seen.add(key);\n allPackages.push(pkg);\n }\n }\n }\n\n return allPackages;\n}\n\nexport function scanRepo(repoRoot: string, opts: ScanOptions = {}): ScanData {\n const files = getRepoFiles(repoRoot);\n const eco = opts.ecosystem ?? 'all';\n\n const npmManifests = eco === 'all' || eco === 'npm' ? findNpmManifests(files) : [];\n const nugetManifests = eco === 'all' || eco === 'nuget' ? findNugetManifests(files) : [];\n const mavenManifests = eco === 'all' || eco === 'maven' ? findMavenManifests(files) : [];\n\n const manifests = [...npmManifests, ...nugetManifests, ...mavenManifests];\n const packages = parseManifests(manifests, opts, rel => readFile(repoRoot, rel));\n\n return buildScanData(manifests, packages);\n}\n\nexport function scanRepoAtRef(repoRoot: string, ref: string, opts: ScanOptions = {}): ScanData {\n const eco = opts.ecosystem ?? 'all';\n\n // Get file list at that ref\n let files: string[] = [];\n try {\n const out = execFileSync('git', ['ls-tree', '-r', '--name-only', ref], {\n encoding: 'utf8',\n cwd: repoRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n });\n files = out.trim().split('\\n').filter(Boolean);\n } catch {\n return buildScanData([], []);\n }\n\n const npmManifests = eco === 'all' || eco === 'npm' ? findNpmManifests(files) : [];\n const nugetManifests = eco === 'all' || eco === 'nuget' ? findNugetManifests(files) : [];\n const mavenManifests = eco === 'all' || eco === 'maven' ? findMavenManifests(files) : [];\n\n const manifests = [...npmManifests, ...nugetManifests, ...mavenManifests];\n const packages = parseManifests(manifests, opts, rel => readFileAtRef(repoRoot, ref, rel));\n\n return buildScanData(manifests, packages);\n}\n\nfunction buildScanData(manifests: ManifestInfo[], packages: Package[]): ScanData {\n const ecosystemSet = new Set<Ecosystem>(manifests.map(m => m.ecosystem));\n const byEcosystem: Record<string, number> = {};\n const byType: Record<string, number> = { direct: 0, transitive: 0 };\n const byScope: Record<string, number> = { production: 0, dev: 0 };\n\n for (const pkg of packages) {\n byEcosystem[pkg.ecosystem] = (byEcosystem[pkg.ecosystem] ?? 0) + 1;\n byType[pkg.type] = (byType[pkg.type] ?? 0) + 1;\n byScope[pkg.scope] = (byScope[pkg.scope] ?? 0) + 1;\n }\n\n return {\n ecosystems: Array.from(ecosystemSet),\n manifests,\n packages,\n summary: {\n totalPackages: packages.length,\n byEcosystem,\n byType,\n byScope\n }\n };\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\ninterface PackageLockV2Meta {\n version?: string;\n dev?: boolean;\n devOptional?: boolean;\n}\n\ninterface PackageLockV2 {\n lockfileVersion?: number;\n packages?: Record<string, PackageLockV2Meta>;\n}\n\nexport function findNpmManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Set(\n files.filter(f => {\n const base = path.basename(f);\n return base === 'package-lock.json' || base === 'yarn.lock' || base === 'pnpm-lock.yaml';\n })\n );\n\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n if (path.basename(file) !== 'package.json') continue;\n if (file.split('/').includes('node_modules')) continue;\n\n const dir = path.dirname(file);\n let lockFile: string | undefined;\n\n for (const lf of ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml']) {\n const candidate = dir === '.' ? lf : `${dir}/${lf}`;\n if (lockFiles.has(candidate)) {\n lockFile = candidate;\n break;\n }\n }\n\n manifests.push({ file, ecosystem: 'npm', lockFile });\n }\n\n return manifests;\n}\n\nexport function parseNpmPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string\n): Package[] {\n if (lockContent && manifest.lockFile) {\n const base = path.basename(manifest.lockFile);\n if (base === 'package-lock.json') {\n const pkgs = parsePackageLock(lockContent, manifest.lockFile, opts);\n if (pkgs.length > 0) return pkgs;\n } else if (base === 'yarn.lock') {\n return parseYarnLock(lockContent, manifest.lockFile, opts, content);\n } else if (base === 'pnpm-lock.yaml') {\n return parsePnpmLock(lockContent, manifest.lockFile, opts, content);\n }\n }\n return parsePackageJson(content, manifest.file, opts);\n}\n\nfunction stripVersionPrefix(v: string): string {\n return v.replace(/^[\\^~>=<* ]+/, '').split(/\\s/)[0] ?? v;\n}\n\nfunction parsePackageJson(content: string, filePath: string, opts: ScanOptions): Package[] {\n let pkg: PackageJson;\n try {\n pkg = JSON.parse(content) as PackageJson;\n } catch {\n return [];\n }\n\n const packages: Package[] = [];\n\n for (const [name, version] of Object.entries(pkg.dependencies ?? {})) {\n packages.push({\n name,\n version: stripVersionPrefix(version),\n ecosystem: 'npm',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n\n if (opts.includeDev) {\n for (const [name, version] of Object.entries(pkg.devDependencies ?? {})) {\n packages.push({\n name,\n version: stripVersionPrefix(version),\n ecosystem: 'npm',\n source: filePath,\n type: 'direct',\n scope: 'dev'\n });\n }\n }\n\n return packages;\n}\n\nfunction parsePackageLock(content: string, lockFilePath: string, opts: ScanOptions): Package[] {\n let lock: PackageLockV2;\n try {\n lock = JSON.parse(content) as PackageLockV2;\n } catch {\n return [];\n }\n\n if ((lock.lockfileVersion ?? 1) < 2 || !lock.packages) return [];\n\n const packages: Package[] = [];\n\n for (const [pkgPath, meta] of Object.entries(lock.packages)) {\n if (pkgPath === '') continue;\n if (!meta.version) continue;\n\n const isDev = meta.dev === true || meta.devOptional === true;\n if (isDev && !opts.includeDev) continue;\n\n // node_modules/express → direct\n // node_modules/express/node_modules/qs → transitive\n const withoutRoot = pkgPath.startsWith('node_modules/')\n ? pkgPath.slice('node_modules/'.length)\n : pkgPath;\n const segments = withoutRoot.split('/node_modules/');\n const isTransitive = segments.length > 1;\n if (isTransitive && !opts.includeTransitive) continue;\n\n const name = segments[segments.length - 1] ?? pkgPath;\n\n packages.push({\n name,\n version: meta.version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parseYarnLock(\n content: string,\n lockFilePath: string,\n opts: ScanOptions,\n packageJsonContent: string\n): Package[] {\n let pkgJson: PackageJson;\n try {\n pkgJson = JSON.parse(packageJsonContent) as PackageJson;\n } catch {\n pkgJson = {};\n }\n\n const directDeps = new Set(Object.keys(pkgJson.dependencies ?? {}));\n const devDeps = new Set(Object.keys(pkgJson.devDependencies ?? {}));\n const allDirectDeps = new Set([...directDeps, ...devDeps]);\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // Matches both plain and scoped packages:\n // express@^4.21.0: → express\n // \"@types/node@^18.0.0\": → @types/node\n // version \"4.21.0\"\n const blockRegex = /^\"?(@?[^@\"\\n][^\"\\n]*)@[^:]+:?\\n\\s+version \"([^\"]+)\"/gm;\n\n for (const match of content.matchAll(blockRegex)) {\n const name = match[1].trim().replace(/^\"|\"$/g, '');\n const version = match[2];\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const isDev = devDeps.has(name) && !directDeps.has(name);\n if (isDev && !opts.includeDev) continue;\n\n const isTransitive = !allDirectDeps.has(name);\n if (isTransitive && !opts.includeTransitive) continue;\n\n packages.push({\n name,\n version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parsePnpmLock(\n content: string,\n lockFilePath: string,\n opts: ScanOptions,\n packageJsonContent: string\n): Package[] {\n let pkgJson: PackageJson;\n try {\n pkgJson = JSON.parse(packageJsonContent) as PackageJson;\n } catch {\n pkgJson = {};\n }\n\n const directDeps = new Set(Object.keys(pkgJson.dependencies ?? {}));\n const devDeps = new Set(Object.keys(pkgJson.devDependencies ?? {}));\n const allDirectDeps = new Set([...directDeps, ...devDeps]);\n\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // pnpm-lock.yaml v6+ format:\n // packages:\n // /express@4.21.0: or /@types/node@18.0.0:\n // dev: false\n const blockRegex = /^\\s{2}(\\/?@?[^@\\s/][^@\\s]*)@(\\d[^:\\s]*):\\s*\\n((?:\\s{4}[^\\n]+\\n)*)/gm;\n\n for (const match of content.matchAll(blockRegex)) {\n const name = match[1].replace(/^\\//, '');\n const version = match[2];\n const attrs = match[3] ?? '';\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const isDev = devDeps.has(name) && !directDeps.has(name)\n || /^\\s+dev:\\s*true/m.test(attrs);\n if (isDev && !opts.includeDev) continue;\n\n const isTransitive = !allDirectDeps.has(name);\n if (isTransitive && !opts.includeTransitive) continue;\n\n packages.push({\n name,\n version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\nconst PROJ_EXTENSIONS = new Set(['.csproj', '.fsproj', '.vbproj']);\n\nexport function findNugetManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Map<string, string>(); // dir → lock path\n\n for (const f of files) {\n if (path.basename(f) === 'packages.lock.json') {\n lockFiles.set(path.dirname(f), f);\n }\n }\n\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n const base = path.basename(file);\n const ext = path.extname(file);\n\n if (PROJ_EXTENSIONS.has(ext) || base === 'packages.config') {\n const dir = path.dirname(file);\n const lockFile = lockFiles.get(dir);\n manifests.push({ file, ecosystem: 'nuget', lockFile });\n }\n\n if (base === 'Directory.Packages.props') {\n const dir = path.dirname(file);\n manifests.push({ file, ecosystem: 'nuget', lockFile: lockFiles.get(dir) });\n }\n }\n\n // Deduplicate: when multiple project files share the same packages.lock.json,\n // keep only one representative manifest per lock file to avoid parsing the same\n // lock multiple times and inflating package counts.\n const deduped: ManifestInfo[] = [];\n const seenLocks = new Set<string>();\n\n for (const manifest of manifests) {\n if (!manifest.lockFile) {\n deduped.push(manifest);\n continue;\n }\n if (!seenLocks.has(manifest.lockFile)) {\n seenLocks.add(manifest.lockFile);\n deduped.push(manifest);\n }\n }\n\n return deduped;\n}\n\nexport function parseNugetPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string,\n propsContent?: string\n): Package[] {\n const base = path.basename(manifest.file);\n\n if (lockContent) {\n return parsePackagesLock(lockContent, manifest.lockFile ?? manifest.file, opts);\n }\n\n if (base === 'packages.config') {\n return parsePackagesConfig(content, manifest.file);\n }\n\n if (base === 'Directory.Packages.props') {\n return parseDirectoryPackagesProps(content, manifest.file);\n }\n\n // .csproj / .fsproj / .vbproj\n return parseCsproj(content, manifest.file, propsContent);\n}\n\nfunction parseCsproj(content: string, filePath: string, propsContent?: string): Package[] {\n // Build version map from Directory.Packages.props if provided\n const centralVersions = propsContent ? extractCentralVersions(propsContent) : new Map<string, string>();\n\n const packages: Package[] = [];\n\n // Match <PackageReference Include=\"X\" Version=\"Y\" /> or multiline form\n const singleLine = /<PackageReference\\s+([^>]+?)\\/>/gi;\n const multiLine = /<PackageReference\\s+([^>]+?)>([\\s\\S]*?)<\\/PackageReference>/gi;\n\n const extractFromAttrsAndInner = (attrs: string, inner: string): void => {\n const nameMatch = /\\bInclude=\"([^\"]+)\"/i.exec(attrs);\n if (!nameMatch) return;\n const name = nameMatch[1];\n\n let version: string | undefined;\n const attrVersion = /\\bVersion=\"([^\"]+)\"/i.exec(attrs);\n if (attrVersion) {\n version = attrVersion[1];\n } else if (inner) {\n const innerVersion = /<Version>([^<]+)<\\/Version>/i.exec(inner);\n if (innerVersion) version = innerVersion[1];\n }\n\n // Fall back to central package management\n if (!version || version.startsWith('$(')) {\n version = centralVersions.get(name) ?? centralVersions.get(name.toLowerCase());\n }\n\n if (!version) return;\n\n packages.push({\n name,\n version,\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n };\n\n for (const m of content.matchAll(singleLine)) {\n extractFromAttrsAndInner(m[1], '');\n }\n for (const m of content.matchAll(multiLine)) {\n extractFromAttrsAndInner(m[1], m[2] ?? '');\n }\n\n return packages;\n}\n\nfunction extractCentralVersions(propsContent: string): Map<string, string> {\n const map = new Map<string, string>();\n const regex = /<PackageVersion\\s+Include=\"([^\"]+)\"\\s+Version=\"([^\"]+)\"/gi;\n for (const m of propsContent.matchAll(regex)) {\n map.set(m[1], m[2]);\n map.set(m[1].toLowerCase(), m[2]);\n }\n return map;\n}\n\nfunction parseDirectoryPackagesProps(content: string, filePath: string): Package[] {\n const packages: Package[] = [];\n const regex = /<PackageVersion\\s+Include=\"([^\"]+)\"\\s+Version=\"([^\"]+)\"/gi;\n for (const m of content.matchAll(regex)) {\n packages.push({\n name: m[1],\n version: m[2],\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n return packages;\n}\n\nfunction parsePackagesConfig(content: string, filePath: string): Package[] {\n const packages: Package[] = [];\n const regex = /<package\\s+id=\"([^\"]+)\"\\s+version=\"([^\"]+)\"/gi;\n for (const m of content.matchAll(regex)) {\n packages.push({\n name: m[1],\n version: m[2],\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n return packages;\n}\n\ninterface PackagesLockDep {\n resolved?: string;\n type?: string;\n dependencies?: Record<string, PackagesLockDep>;\n}\n\ninterface PackagesLockJson {\n dependencies?: Record<string, Record<string, PackagesLockDep>>;\n}\n\nfunction parsePackagesLock(content: string, filePath: string, opts: ScanOptions): Package[] {\n let lock: PackagesLockJson;\n try {\n lock = JSON.parse(content) as PackagesLockJson;\n } catch {\n return [];\n }\n\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n for (const frameworkDeps of Object.values(lock.dependencies ?? {})) {\n for (const [name, meta] of Object.entries(frameworkDeps)) {\n const version = meta.resolved ?? '';\n if (!version) continue;\n\n const isTransitive = meta.type === 'Transitive';\n if (isTransitive && !opts.includeTransitive) continue;\n\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'nuget',\n source: filePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: 'production'\n });\n }\n }\n\n return packages;\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\nexport function findMavenManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Set(files.filter(f => path.basename(f) === 'gradle.lockfile'));\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n const base = path.basename(file);\n if (base === 'pom.xml' || base === 'build.gradle' || base === 'build.gradle.kts') {\n const dir = path.dirname(file);\n const lockCandidate = dir === '.' ? 'gradle.lockfile' : `${dir}/gradle.lockfile`;\n const lockFile = lockFiles.has(lockCandidate) ? lockCandidate : undefined;\n manifests.push({ file, ecosystem: 'maven', lockFile });\n }\n }\n\n return manifests;\n}\n\nexport function parseMavenPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string\n): Package[] {\n const base = path.basename(manifest.file);\n\n if (lockContent && manifest.lockFile) {\n return parseGradleLock(lockContent, manifest.lockFile, opts);\n }\n\n if (base === 'pom.xml') {\n return parsePomXml(content, manifest.file, opts);\n }\n\n if (base === 'build.gradle' || base === 'build.gradle.kts') {\n return parseBuildGradle(content, manifest.file, opts);\n }\n\n return [];\n}\n\nfunction parsePomXml(content: string, filePath: string, opts: ScanOptions): Package[] {\n // Extract properties for variable substitution\n const props = extractPomProperties(content);\n\n // Extract dependency management versions\n const managedVersions = extractDependencyManagement(content, props);\n\n // Extract actual dependencies (skip dependencyManagement block)\n const withoutMgmt = content.replace(/<dependencyManagement>[\\s\\S]*?<\\/dependencyManagement>/gi, '');\n\n const packages: Package[] = [];\n const depRegex = /<dependency>([\\s\\S]*?)<\\/dependency>/gi;\n\n for (const match of withoutMgmt.matchAll(depRegex)) {\n const inner = match[1];\n const groupId = /<groupId>\\s*([^<\\s]+)\\s*<\\/groupId>/i.exec(inner)?.[1];\n const artifactId = /<artifactId>\\s*([^<\\s]+)\\s*<\\/artifactId>/i.exec(inner)?.[1];\n if (!groupId || !artifactId) continue;\n\n const rawVersion = /<version>\\s*([^<\\s]+)\\s*<\\/version>/i.exec(inner)?.[1];\n const resolvedVersion = resolveProperty(rawVersion ?? null, props)\n ?? managedVersions.get(`${groupId}:${artifactId}`);\n if (!resolvedVersion) continue;\n\n const scope = /<scope>\\s*([^<\\s]+)\\s*<\\/scope>/i.exec(inner)?.[1] ?? 'compile';\n const isDev = scope === 'test' || scope === 'provided';\n if (isDev && !opts.includeDev) continue;\n\n packages.push({\n name: `${groupId}:${artifactId}`,\n version: resolvedVersion,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction extractPomProperties(content: string): Map<string, string> {\n const props = new Map<string, string>();\n const propsMatch = /<properties>([\\s\\S]*?)<\\/properties>/i.exec(content);\n if (!propsMatch) return props;\n\n const propRegex = /<([a-zA-Z0-9._-]+)>\\s*([^<]+)\\s*<\\/\\1>/g;\n for (const m of propsMatch[1].matchAll(propRegex)) {\n props.set(m[1], m[2].trim());\n }\n return props;\n}\n\nfunction extractDependencyManagement(content: string, props: Map<string, string>): Map<string, string> {\n const versions = new Map<string, string>();\n const mgmtMatch = /<dependencyManagement>([\\s\\S]*?)<\\/dependencyManagement>/i.exec(content);\n if (!mgmtMatch) return versions;\n\n const depRegex = /<dependency>([\\s\\S]*?)<\\/dependency>/gi;\n for (const m of mgmtMatch[1].matchAll(depRegex)) {\n const inner = m[1];\n const groupId = /<groupId>\\s*([^<\\s]+)\\s*<\\/groupId>/i.exec(inner)?.[1];\n const artifactId = /<artifactId>\\s*([^<\\s]+)\\s*<\\/artifactId>/i.exec(inner)?.[1];\n const rawVersion = /<version>\\s*([^<\\s]+)\\s*<\\/version>/i.exec(inner)?.[1];\n if (!groupId || !artifactId || !rawVersion) continue;\n const resolved = resolveProperty(rawVersion, props);\n if (resolved) versions.set(`${groupId}:${artifactId}`, resolved);\n }\n\n return versions;\n}\n\nfunction resolveProperty(value: string | null, props: Map<string, string>): string | null {\n if (!value) return null;\n const resolved = value.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => props.get(key) ?? `\\${${key}}`);\n // If any placeholder remains unresolved, return null so callers fall through to managed versions\n return /\\$\\{[^}]+\\}/.test(resolved) ? null : resolved;\n}\n\nconst GRADLE_DEV_CONFIGS = new Set(['testImplementation', 'testCompileOnly', 'testRuntimeOnly', 'testApi']);\n\nfunction parseBuildGradle(content: string, filePath: string, opts: ScanOptions): Package[] {\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // String notation — Groovy: implementation 'g:a:v' / Kotlin DSL: implementation(\"g:a:v\")\n const stringNotation = /\\b(\\w+)\\s*\\(?\\s*['\"]([^:'\"]+):([^:'\"]+):([^'\"]+)['\"]\\s*\\)?/g;\n for (const m of content.matchAll(stringNotation)) {\n const config = m[1];\n const groupId = m[2];\n const artifactId = m[3];\n const version = m[4].split('@')[0]; // strip classifier\n\n const isDev = GRADLE_DEV_CONFIGS.has(config);\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n // Map notation: implementation group: 'x', name: 'y', version: 'z'\n const mapNotation = /\\b(\\w+)\\s+group:\\s*['\"]([^'\"]+)['\"]\\s*,\\s*name:\\s*['\"]([^'\"]+)['\"]\\s*,\\s*version:\\s*['\"]([^'\"]+)['\"]/g;\n for (const m of content.matchAll(mapNotation)) {\n const config = m[1];\n const groupId = m[2];\n const artifactId = m[3];\n const version = m[4];\n\n const isDev = GRADLE_DEV_CONFIGS.has(config);\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parseGradleLock(content: string, filePath: string, opts: ScanOptions): Package[] {\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // Format: group:artifact:version=config1,config2\n const lineRegex = /^([^:#\\s]+):([^:#\\s]+):([^=\\s]+)=(.+)$/gm;\n\n for (const m of content.matchAll(lineRegex)) {\n const groupId = m[1];\n const artifactId = m[2];\n const version = m[3];\n const configs = m[4].split(',').map(s => s.trim());\n\n const isDev = configs.every(c => GRADLE_DEV_CONFIGS.has(c));\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, ScanData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport function runScan(config: ResolvedConfig, opts: ScanOptions): ScanData {\n void config; // scan is local-only, no network\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository. deps commands require a git repo root.', 1);\n }\n return scanRepo(repoRoot, opts);\n}\n","interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n preRelease: string;\n}\n\nfunction parse(v: string): ParsedVersion {\n // Strip leading non-numeric (e.g. 'v1.0.0')\n const clean = v.replace(/^[^0-9]*/, '');\n // Split off pre-release/build metadata\n const dashIdx = clean.indexOf('-');\n const plusIdx = clean.indexOf('+');\n const metaStart = plusIdx > -1 ? plusIdx : Infinity;\n const preStart = dashIdx > -1 && dashIdx < metaStart ? dashIdx : Infinity;\n const numeric = clean.slice(0, Math.min(preStart, metaStart));\n const preRelease = preStart < Infinity\n ? clean.slice(preStart + 1, metaStart < Infinity ? metaStart : undefined)\n : '';\n const parts = numeric.split('.').map(n => parseInt(n, 10) || 0);\n return { major: parts[0] ?? 0, minor: parts[1] ?? 0, patch: parts[2] ?? 0, preRelease };\n}\n\n/** Returns negative / zero / positive like Array.sort comparators. */\nexport function compareSemver(a: string, b: string): number {\n const av = parse(a);\n const bv = parse(b);\n if (av.major !== bv.major) return av.major - bv.major;\n if (av.minor !== bv.minor) return av.minor - bv.minor;\n if (av.patch !== bv.patch) return av.patch - bv.patch;\n // A release (no pre-release) is greater than any pre-release of the same version\n if (!av.preRelease && bv.preRelease) return 1;\n if (av.preRelease && !bv.preRelease) return -1;\n if (av.preRelease && bv.preRelease) return av.preRelease.localeCompare(bv.preRelease);\n return 0;\n}\n\nexport function isNewer(current: string, latest: string): boolean {\n return compareSemver(latest, current) > 0;\n}\n\nexport function updateType(current: string, latest: string): 'major' | 'minor' | 'patch' {\n const cv = parse(current);\n const lv = parse(latest);\n if (lv.major > cv.major) return 'major';\n if (lv.minor > cv.minor) return 'minor';\n return 'patch';\n}\n\nexport function isDowngrade(from: string, to: string): boolean {\n return compareSemver(to, from) < 0;\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, DiffData, PackageChange, ChangeType, Ecosystem } from './types.js';\nimport { scanRepo, scanRepoAtRef } from './parsers/index.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { isDowngrade } from './semver.js';\n\nexport function runDiff(\n config: ResolvedConfig,\n from: string,\n to: string | null,\n opts: ScanOptions\n): DiffData {\n void config;\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n const fromScan = scanRepoAtRef(repoRoot, from, opts);\n const toScan = to ? scanRepoAtRef(repoRoot, to, opts) : scanRepo(repoRoot, opts);\n\n // Key on ecosystem:name:source to preserve multiple versions of the same package\n // (common with transitive npm deps where the same package appears at different versions)\n type PkgKey = string;\n const fromMap = new Map<PkgKey, string>(); // key → version\n const toMap = new Map<PkgKey, string>();\n\n for (const pkg of fromScan.packages) {\n const key = `${pkg.ecosystem}:${pkg.name}:${pkg.source}`;\n fromMap.set(key, pkg.version);\n }\n for (const pkg of toScan.packages) {\n const key = `${pkg.ecosystem}:${pkg.name}:${pkg.source}`;\n toMap.set(key, pkg.version);\n }\n\n const changes: PackageChange[] = [];\n const allKeys = new Set([...fromMap.keys(), ...toMap.keys()]);\n\n for (const key of allKeys) {\n const parts = key.split(':');\n const eco = parts[0] as Ecosystem;\n const source = parts[parts.length - 1] ?? '';\n const name = parts.slice(1, -1).join(':');\n const fromVer = fromMap.get(key) ?? null;\n const toVer = toMap.get(key) ?? null;\n\n let change: ChangeType;\n if (!fromVer) {\n change = 'added';\n } else if (!toVer) {\n change = 'removed';\n } else if (fromVer === toVer) {\n continue; // unchanged — omit from output\n } else {\n change = isDowngrade(fromVer, toVer) ? 'downgraded' : 'upgraded';\n }\n\n changes.push({ name, ecosystem: eco, change, from: fromVer, to: toVer, source });\n }\n\n const summary = { added: 0, removed: 0, upgraded: 0, downgraded: 0, unchanged: 0 };\n for (const c of changes) summary[c.change]++;\n // Unchanged = keys present in both maps with identical versions\n summary.unchanged = [...allKeys].filter(k => {\n const fv = fromMap.get(k);\n const tv = toMap.get(k);\n return fv !== undefined && tv !== undefined && fv === tv;\n }).length;\n\n return { from, to: to ?? 'working tree', changes, summary };\n}\n\n","import type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst OSV_URL = 'https://api.osv.dev';\nconst BATCH_SIZE = 500;\nconst TIMEOUT_MS = 30_000;\n\nconst OSV_ECOSYSTEM: Record<string, string> = {\n npm: 'npm',\n nuget: 'NuGet',\n maven: 'Maven'\n};\n\ninterface OsvQuery {\n package: { name: string; ecosystem: string };\n version: string;\n}\n\ninterface OsvRange {\n type: string;\n events?: Array<{ introduced?: string; fixed?: string; last_affected?: string }>;\n}\n\ninterface OsvAffected {\n package?: { name: string; ecosystem: string };\n ranges?: OsvRange[];\n}\n\ninterface OsvSeverityEntry {\n type: string;\n score: string;\n}\n\ninterface OsvRawVuln {\n id: string;\n summary?: string;\n aliases?: string[];\n references?: Array<{ url?: string }>;\n affected?: OsvAffected[];\n severity?: OsvSeverityEntry[];\n database_specific?: Record<string, unknown>;\n}\n\ninterface OsvBatchResponse {\n results: Array<{ vulns?: OsvRawVuln[] }>;\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkOsvConnectivity(): Promise<{ reachable: boolean; error?: string }> {\n try {\n const res = await fetchWithTimeout(`${OSV_URL}/v1/querybatch`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries: [] })\n });\n return { reachable: res.ok || res.status === 400 }; // 400 is fine, means it's up\n } catch (err) {\n return {\n reachable: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nfunction extractRemediation(vuln: OsvRawVuln, pkg: Package): OsvVulnerability['remediation'] {\n const fixedVersions: string[] = [];\n\n for (const affected of vuln.affected ?? []) {\n for (const range of affected.ranges ?? []) {\n if (range.type === 'SEMVER' || range.type === 'ECOSYSTEM') {\n for (const event of range.events ?? []) {\n if (event.fixed) fixedVersions.push(event.fixed);\n }\n }\n }\n }\n\n const unique = [...new Set(fixedVersions)];\n const fixAvailable = unique.length > 0;\n const advice = fixAvailable\n ? `Upgrade ${pkg.name} to ${unique.join(' or ')}`\n : `No fix available yet for ${pkg.name}. Monitor ${vuln.id} for updates.`;\n\n return { fixAvailable, fixedVersions: unique, advice };\n}\n\nfunction extractSeverity(vuln: OsvRawVuln): { severity: string; cvss: number | null } {\n const dbSpecific = vuln.database_specific ?? {};\n const dbSeverity = typeof dbSpecific['severity'] === 'string' ? dbSpecific['severity'] : undefined;\n\n // Some databases put numeric CVSS in database_specific.cvss\n let cvss: number | null = null;\n const rawCvss = dbSpecific['cvss'];\n if (typeof rawCvss === 'number') {\n cvss = rawCvss;\n } else if (rawCvss && typeof rawCvss === 'object' && 'score' in rawCvss) {\n const score = (rawCvss as Record<string, unknown>)['score'];\n if (typeof score === 'number') cvss = score;\n }\n\n // Try severity array for numeric scores\n for (const s of vuln.severity ?? []) {\n const score = parseFloat(s.score);\n if (!isNaN(score) && score >= 0 && score <= 10) {\n cvss = score;\n break;\n }\n }\n\n return {\n severity: dbSeverity ?? inferSeverityFromCvss(cvss),\n cvss\n };\n}\n\nfunction inferSeverityFromCvss(cvss: number | null): string {\n if (cvss === null) return 'UNKNOWN';\n if (cvss >= 9.0) return 'CRITICAL';\n if (cvss >= 7.0) return 'HIGH';\n if (cvss >= 4.0) return 'MEDIUM';\n return 'LOW';\n}\n\nfunction mapVuln(vuln: OsvRawVuln, pkg: Package): OsvVulnerability {\n const { severity, cvss } = extractSeverity(vuln);\n return {\n id: vuln.id,\n summary: vuln.summary ?? '',\n severity,\n cvss,\n aliases: vuln.aliases ?? [],\n remediation: extractRemediation(vuln, pkg),\n references: (vuln.references ?? []).map(r => r.url ?? '').filter(Boolean)\n };\n}\n\nasync function queryBatch(queries: OsvQuery[], packages: Package[]): Promise<VulnerablePackage[]> {\n const res = await fetchWithTimeout(`${OSV_URL}/v1/querybatch`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries })\n });\n\n if (!res.ok) {\n throw new Error(`OSV.dev returned HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as OsvBatchResponse;\n const vulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < data.results.length; i++) {\n const result = data.results[i];\n const pkg = packages[i];\n if (!result || !pkg) continue;\n\n const vulns = result.vulns ?? [];\n if (vulns.length === 0) continue;\n\n vulnerable.push({\n ...pkg,\n vulnerabilities: vulns.map(v => mapVuln(v, pkg))\n });\n }\n\n return vulnerable;\n}\n\nexport async function checkPackagesForVulns(packages: Package[]): Promise<VulnerablePackage[]> {\n const allVulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const chunk = packages.slice(i, i + BATCH_SIZE);\n\n const queries: OsvQuery[] = chunk.map(pkg => ({\n package: {\n name: pkg.name,\n ecosystem: OSV_ECOSYSTEM[pkg.ecosystem] ?? pkg.ecosystem\n },\n version: pkg.version\n }));\n\n const results = await queryBatch(queries, chunk);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n","import type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst SONATYPE_URL = 'https://ossindex.sonatype.org';\nconst BATCH_SIZE = 128; // OSS Index limit per request\nconst TIMEOUT_MS = 30_000;\n\ninterface SonatypeVuln {\n id: string;\n displayName: string;\n title: string;\n description: string;\n cvssScore: number;\n cvssVector?: string;\n cwe?: string;\n reference: string;\n externalReferences?: string[];\n}\n\ninterface SonatypeComponentReport {\n coordinates: string;\n description?: string;\n reference: string;\n vulnerabilities: SonatypeVuln[];\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n // Scoped packages: @scope/name → pkg:npm/%40scope/name@version\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n // pncli stores Maven names as \"groupId:artifactId\"\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction inferSeverityFromCvss(score: number): string {\n if (score >= 9.0) return 'CRITICAL';\n if (score >= 7.0) return 'HIGH';\n if (score >= 4.0) return 'MEDIUM';\n if (score > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction mapSonatypeVuln(v: SonatypeVuln, pkg: Package): OsvVulnerability {\n const refs: string[] = [v.reference, ...(v.externalReferences ?? [])].filter(Boolean);\n\n // Sonatype doesn't return fixed versions — direct user to the vulnerability reference\n const advice = `See ${v.reference} for remediation details for ${pkg.name}@${pkg.version}.`;\n\n const cvePattern = /CVE-\\d{4}-\\d+/gi;\n const searchText = [v.displayName, v.title, v.description].filter(Boolean).join(' ');\n const aliases = [...new Set([...searchText.matchAll(cvePattern)].map(m => m[0].toUpperCase()))];\n\n return {\n id: v.displayName || v.id,\n summary: v.title || v.description,\n severity: inferSeverityFromCvss(v.cvssScore),\n cvss: v.cvssScore > 0 ? v.cvssScore : null,\n aliases,\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice\n },\n references: refs\n };\n}\n\nasync function queryBatch(\n purls: string[],\n packages: Package[]\n): Promise<VulnerablePackage[]> {\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: purls })\n });\n\n if (res.status === 429) {\n throw new Error(\n 'Sonatype OSS Index is rate-limiting requests from this IP. ' +\n 'Create a free account at ossindex.sonatype.org and add your credentials to your pncli config to raise the limit.'\n );\n }\n\n if (!res.ok) {\n throw new Error(`Sonatype OSS Index returned HTTP ${res.status}`);\n }\n\n const reports = (await res.json()) as SonatypeComponentReport[];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const report of reports) {\n if (!report?.coordinates) continue;\n const pkg = purlToPackage.get(report.coordinates);\n if (!pkg) continue;\n const vulns = report.vulnerabilities ?? [];\n if (vulns.length === 0) continue;\n vulnerable.push({ ...pkg, vulnerabilities: vulns.map(v => mapSonatypeVuln(v, pkg)) });\n }\n\n return vulnerable;\n}\n\nexport async function checkSonatypeConnectivity(): Promise<{ reachable: boolean; error?: string }> {\n try {\n // Send an empty batch to verify the endpoint is reachable\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: [] })\n });\n return { reachable: res.ok || res.status === 400 };\n } catch (err) {\n return {\n reachable: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport async function checkPackagesForVulnsViaSonatype(\n packages: Package[]\n): Promise<VulnerablePackage[]> {\n const allVulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const chunk = packages.slice(i, i + BATCH_SIZE);\n const purls = chunk.map(toPurl);\n const results = await queryBatch(purls, chunk);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n","import type { ResolvedConfig } from '../../../types/config.js';\nimport type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst TIMEOUT_MS = 60_000;\nconst MAX_POLL_ATTEMPTS = 10;\nconst POLL_INTERVAL_MS = 2_000;\nconst BATCH_SIZE = 128;\n\ninterface IqConstraintReason {\n reason: string;\n reference?: {\n type: string;\n value: string;\n };\n}\n\ninterface IqConstraintViolation {\n constraintName: string;\n reasons: IqConstraintReason[];\n}\n\ninterface IqPolicyViolation {\n policyId: string;\n policyName: string;\n policyThreatCategory: string;\n policyThreatLevel: number;\n constraintViolations: IqConstraintViolation[];\n}\n\ninterface IqComponentResult {\n component: {\n packageUrl: string;\n };\n matchState: string;\n criticalVulnerabilityCount?: number;\n severeVulnerabilityCount?: number;\n moderateVulnerabilityCount?: number;\n policyData?: {\n policyViolations?: IqPolicyViolation[];\n };\n}\n\ninterface IqEvaluationResponse {\n isQueued: boolean;\n resultsUrl?: string;\n components?: IqComponentResult[];\n}\n\ninterface IqApplicationsResponse {\n applications?: Array<{ id: string; publicId: string; name: string }>;\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction buildBasicAuth(userCode: string, passcode: string): string {\n return `Basic ${Buffer.from(`${userCode}:${passcode}`).toString('base64')}`;\n}\n\nfunction threatLevelToSeverity(level: number): string {\n if (level >= 9) return 'CRITICAL';\n if (level >= 7) return 'HIGH';\n if (level >= 4) return 'MEDIUM';\n if (level > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction mapViolationToVuln(violation: IqPolicyViolation): OsvVulnerability {\n const cveRefs = violation.constraintViolations.flatMap(cv =>\n cv.reasons\n .filter(r => r.reference?.type === 'VULNERABILITY')\n .map(r => r.reference!.value)\n );\n const id = cveRefs[0] ?? violation.policyId;\n const severity = threatLevelToSeverity(violation.policyThreatLevel);\n\n return {\n id,\n summary: violation.policyName,\n severity,\n cvss: null,\n aliases: [...new Set(cveRefs)],\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice: `Policy violation: ${violation.policyName} (threat level ${violation.policyThreatLevel}). Check Sonatype IQ Server for details.`\n },\n references: []\n };\n}\n\nfunction syntheticVulnsFromCounts(\n criticalCount: number,\n severeCount: number,\n moderateCount: number,\n pkgName: string\n): OsvVulnerability[] {\n const vulns: OsvVulnerability[] = [];\n if (criticalCount > 0) {\n vulns.push({\n id: `iq-critical-${pkgName}`,\n summary: `${criticalCount} critical vulnerability(ies) detected by Sonatype IQ`,\n severity: 'CRITICAL',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (severeCount > 0) {\n vulns.push({\n id: `iq-high-${pkgName}`,\n summary: `${severeCount} severe vulnerability(ies) detected by Sonatype IQ`,\n severity: 'HIGH',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (moderateCount > 0) {\n vulns.push({\n id: `iq-medium-${pkgName}`,\n summary: `${moderateCount} moderate vulnerability(ies) detected by Sonatype IQ`,\n severity: 'MEDIUM',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n return vulns;\n}\n\nasync function resolveApplicationInternalId(\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<string> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?publicId=${encodeURIComponent(applicationId)}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n if (!res.ok) return applicationId;\n const data = await res.json() as IqApplicationsResponse;\n if (data.applications && data.applications.length > 0) {\n return data.applications[0]!.id;\n }\n return applicationId;\n}\n\nasync function pollResults(\n baseUrl: string,\n resultsUrl: string,\n auth: string\n): Promise<IqEvaluationResponse> {\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS * attempt));\n }\n\n const url = resultsUrl.startsWith('http') ? resultsUrl : `${baseUrl.replace(/\\/$/, '')}${resultsUrl}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status} polling results`);\n }\n\n const data = await res.json() as IqEvaluationResponse;\n if (!data.isQueued) return data;\n }\n\n throw new Error('Sonatype IQ Server evaluation timed out waiting for results.');\n}\n\nasync function evaluateBatch(\n purls: string[],\n packages: Package[],\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<VulnerablePackage[]> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/evaluation/applications/${encodeURIComponent(applicationId)}`;\n\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Authorization': auth, 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({ components: purls.map(p => ({ packageUrl: p })) })\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status}`);\n }\n\n let data = await res.json() as IqEvaluationResponse;\n\n if (data.isQueued && data.resultsUrl) {\n data = await pollResults(baseUrl, data.resultsUrl, auth);\n }\n\n const components = data.components ?? [];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const result of components) {\n if (!result?.component?.packageUrl) continue;\n\n const pkg = purlToPackage.get(result.component.packageUrl);\n if (!pkg) continue;\n\n const criticalCount = result.criticalVulnerabilityCount ?? 0;\n const severeCount = result.severeVulnerabilityCount ?? 0;\n const moderateCount = result.moderateVulnerabilityCount ?? 0;\n const totalVulns = criticalCount + severeCount + moderateCount;\n\n const violations = result.policyData?.policyViolations ?? [];\n const securityViolations = violations.filter(v => v.policyThreatCategory === 'SECURITY');\n\n if (securityViolations.length === 0 && totalVulns === 0) continue;\n\n const vulnerabilities: OsvVulnerability[] = securityViolations.length > 0\n ? securityViolations.map(v => mapViolationToVuln(v))\n : syntheticVulnsFromCounts(criticalCount, severeCount, moderateCount, pkg.name);\n\n vulnerable.push({ ...pkg, vulnerabilities });\n }\n\n return vulnerable;\n}\n\nexport async function checkPackagesViaIqServer(\n packages: Package[],\n applicationId: string,\n config: ResolvedConfig\n): Promise<VulnerablePackage[]> {\n const { baseUrl, userCode, passcode } = config.sonatypeiq;\n if (!baseUrl) throw new Error('Sonatype IQ Server baseUrl not configured.');\n if (!userCode || !passcode) throw new Error('Sonatype IQ Server credentials not configured.');\n\n const auth = buildBasicAuth(userCode, passcode);\n const internalId = await resolveApplicationInternalId(baseUrl, applicationId, auth);\n const allVulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const chunk = packages.slice(i, i + BATCH_SIZE);\n const purls = chunk.map(toPurl);\n const results = await evaluateBatch(purls, chunk, baseUrl, internalId, auth);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n\nexport async function checkSonatypeIqConnectivity(\n baseUrl: string,\n userCode: string,\n passcode: string\n): Promise<{ reachable: boolean; authenticated: boolean; error?: string }> {\n try {\n const auth = buildBasicAuth(userCode, passcode);\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?limit=1`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10_000);\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (res.status === 401 || res.status === 403) {\n return { reachable: true, authenticated: false, error: `Authentication failed (HTTP ${res.status})` };\n }\n\n return { reachable: true, authenticated: res.ok };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n","import type { Ecosystem, LicensedPackage, OutdatedPackage } from '../types.js';\nimport type { ArtifactoryConfig } from '../../../types/config.js';\nimport { PncliError } from '../../../lib/errors.js';\nimport { isNewer, updateType } from '../semver.js';\n\nconst TIMEOUT_MS = 15_000;\n\nasync function fetchWithTimeout(url: string, token: string): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkArtifactoryConnectivity(config: ArtifactoryConfig): Promise<{\n reachable: boolean;\n authenticated: boolean;\n configured: boolean;\n error?: string;\n}> {\n if (!config.baseUrl && !config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory is not configured'\n };\n }\n if (!config.baseUrl) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory baseUrl is not set'\n };\n }\n if (!config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory token is not set'\n };\n }\n\n try {\n const res = await fetchWithTimeout(`${config.baseUrl}/api/system/ping`, config.token);\n if (res.status === 401 || res.status === 403) {\n return {\n reachable: true,\n authenticated: false,\n configured: true,\n error: 'Artifactory token is invalid or lacks permissions'\n };\n }\n return { reachable: res.ok, authenticated: res.ok, configured: true };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n configured: true,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport function requireArtifactory(config: ArtifactoryConfig, command: string): void {\n if (!config.baseUrl && !config.token) {\n throw new PncliError(\n `${command} requires Artifactory. Add the following to ~/.pncli/config.json:\\n` +\n ` \"artifactory\": { \"baseUrl\": \"https://artifactory.imagile.dev\", \"token\": \"your-token\" }\\n` +\n `Or set PNCLI_ARTIFACTORY_BASE_URL and PNCLI_ARTIFACTORY_TOKEN environment variables.`,\n 503\n );\n }\n if (!config.baseUrl) {\n throw new PncliError(\n `${command} requires an Artifactory URL. Set artifactory.baseUrl in ~/.pncli/config.json or PNCLI_ARTIFACTORY_BASE_URL.`,\n 503\n );\n }\n if (!config.token) {\n throw new PncliError(\n `${command} requires an Artifactory token. Set artifactory.token in ~/.pncli/config.json or PNCLI_ARTIFACTORY_TOKEN.`,\n 503\n );\n }\n}\n\nfunction repoForEcosystem(config: ArtifactoryConfig, eco: Ecosystem): string | undefined {\n if (eco === 'npm') return config.npmRepo;\n if (eco === 'nuget') return config.nugetRepo;\n if (eco === 'maven') return config.mavenRepo;\n return undefined;\n}\n\nasync function getLatestNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { 'dist-tags'?: { latest?: string } };\n return data['dist-tags']?.latest ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/flatcontainer/${lower}/index.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { versions?: string[] };\n const versions = data.versions ?? [];\n return versions[versions.length - 1] ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestMaven(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n const [groupId, artifactId] = packageName.split(':');\n if (!groupId || !artifactId) return null;\n\n try {\n const res = await fetchWithTimeout(\n `${baseUrl}/api/search/latestVersion?g=${encodeURIComponent(groupId)}&a=${encodeURIComponent(artifactId)}&repos=${repoName}`,\n token\n );\n if (!res.ok) return null;\n const text = await res.text();\n return text.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function getOutdatedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<{ outdated: OutdatedPackage[]; uncheckedEcosystems: string[] }> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return { outdated: [], uncheckedEcosystems: [] };\n\n const outdated: OutdatedPackage[] = [];\n const unchecked = new Set<string>();\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n if (!repoName) {\n unchecked.add(pkg.ecosystem);\n continue;\n }\n\n let latest: string | null = null;\n if (pkg.ecosystem === 'npm') {\n latest = await getLatestNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n latest = await getLatestNuget(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'maven') {\n latest = await getLatestMaven(baseUrl, token, repoName, pkg.name);\n }\n\n if (!latest || !isNewer(pkg.version, latest)) continue;\n\n const type = updateType(pkg.version, latest);\n if (filterType) {\n const order = { major: 3, minor: 2, patch: 1 };\n if (order[type] < order[filterType]) continue;\n }\n\n outdated.push({\n name: pkg.name,\n ecosystem: pkg.ecosystem,\n current: pkg.version,\n latest,\n updateType: type,\n source: pkg.source\n });\n }\n\n return { outdated, uncheckedEcosystems: [...unchecked] };\n}\n\nasync function getLicenseNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { license?: string | { type?: string } };\n if (typeof data.license === 'string') return data.license;\n if (typeof data.license === 'object' && data.license !== null) return data.license.type ?? null;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function getLicenseNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string,\n version: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/registration/${lower}/${version}.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { licenseExpression?: string; licenseUrl?: string };\n return data.licenseExpression ?? (data.licenseUrl ? 'See licenseUrl' : null);\n } catch {\n return null;\n }\n}\n\nexport async function getLicensedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig\n): Promise<LicensedPackage[]> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return [];\n\n const result: LicensedPackage[] = [];\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n let license: string | null = null;\n\n if (repoName) {\n if (pkg.ecosystem === 'npm') {\n license = await getLicenseNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n license = await getLicenseNuget(baseUrl, token, repoName, pkg.name, pkg.version);\n }\n // Maven: fetching license from POM via Artifactory is complex — emit null\n }\n\n result.push({\n name: pkg.name,\n version: pkg.version,\n ecosystem: pkg.ecosystem,\n source: pkg.source,\n license\n });\n }\n\n return result;\n}\n","import type { ConnectivityData, Tier } from './types.js';\nimport type { ResolvedConfig } from '../../types/config.js';\nimport { checkOsvConnectivity } from './clients/osv.js';\nimport { checkArtifactoryConnectivity } from './clients/artifactory.js';\nimport { checkSonatypeConnectivity } from './clients/sonatype.js';\nimport { checkSonatypeIqConnectivity } from './clients/sonatypeiq.js';\n\ninterface TierResult {\n tier: Tier;\n osvReachable: boolean;\n artifactoryReachable: boolean;\n}\n\n// Session-level cache — not persisted to disk\nlet cachedTier: TierResult | null = null;\n\nexport async function detectTier(config: ResolvedConfig): Promise<TierResult> {\n if (cachedTier) return cachedTier;\n\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artifactoryReachable = artResult.reachable && artResult.authenticated;\n const osvReachable = osvResult.reachable;\n\n let tier: Tier = 'local';\n if (artifactoryReachable) tier = 'artifactory';\n if (osvReachable) tier = 'full';\n\n cachedTier = { tier, osvReachable, artifactoryReachable };\n return cachedTier;\n}\n\nexport function clearTierCache(): void {\n cachedTier = null;\n}\n\nexport async function checkSonatypeReachable(): Promise<boolean> {\n const result = await checkSonatypeConnectivity();\n return result.reachable;\n}\n\nexport async function buildConnectivityData(config: ResolvedConfig): Promise<ConnectivityData> {\n const iqCfg = config.sonatypeiq;\n const iqConfigured = !!(iqCfg.baseUrl && iqCfg.userCode && iqCfg.passcode);\n\n const checks = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory),\n checkSonatypeConnectivity(),\n iqConfigured\n ? checkSonatypeIqConnectivity(iqCfg.baseUrl!, iqCfg.userCode!, iqCfg.passcode!)\n : Promise.resolve(null)\n ]);\n\n const [osvResult, artResult, sonatypeResult, iqResult] = checks;\n\n const artCfg = config.artifactory;\n\n let tier: Tier = 'local';\n if (artResult.reachable && artResult.authenticated) tier = 'artifactory';\n if (osvResult.reachable || sonatypeResult.reachable) tier = 'full';\n\n cachedTier = {\n tier,\n osvReachable: osvResult.reachable,\n artifactoryReachable: artResult.reachable && artResult.authenticated\n };\n\n return {\n artifactory: {\n reachable: artResult.reachable,\n url: artCfg.baseUrl ?? '(not configured)',\n authenticated: artResult.authenticated,\n repositories: {\n npm: artCfg.npmRepo ?? '(not configured)',\n nuget: artCfg.nugetRepo ?? '(not configured)',\n maven: artCfg.mavenRepo ?? '(not configured)'\n },\n ...(artResult.error ? { error: artResult.error } : {})\n },\n osv: {\n reachable: osvResult.reachable,\n url: 'https://api.osv.dev',\n ...(osvResult.error ? { error: osvResult.error } : {})\n },\n sonatype: {\n reachable: sonatypeResult.reachable,\n url: 'https://ossindex.sonatype.org',\n ...(sonatypeResult.error ? { error: sonatypeResult.error } : {})\n },\n ...(iqConfigured && iqResult ? {\n sonatypeiq: {\n reachable: iqResult.reachable,\n authenticated: iqResult.authenticated,\n url: iqCfg.baseUrl!,\n ...(iqResult.error ? { error: iqResult.error } : {})\n }\n } : {}),\n tier,\n capabilities: {\n scan: true,\n diff: true,\n outdated: artResult.reachable && artResult.authenticated,\n licenseCheck: artResult.reachable && artResult.authenticated,\n cveCheck: osvResult.reachable || sonatypeResult.reachable || (iqResult?.reachable && iqResult?.authenticated) === true\n }\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, FriskData, FriskSource, FriskSourceError, VulnerablePackage } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { checkPackagesForVulns } from './clients/osv.js';\nimport { checkPackagesForVulnsViaSonatype } from './clients/sonatype.js';\nimport { checkPackagesViaIqServer } from './clients/sonatypeiq.js';\nimport { detectTier, checkSonatypeReachable } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nexport async function runFrisk(\n config: ResolvedConfig,\n opts: ScanOptions,\n source: FriskSource = 'osv',\n applicationId?: string\n): Promise<FriskData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Validate sonatypeiq config upfront before any network checks\n if (source === 'sonatypeiq') {\n if (!config.sonatypeiq.baseUrl || !config.sonatypeiq.userCode || !config.sonatypeiq.passcode) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires Sonatype IQ Server to be configured. Run: pncli config init',\n 1\n );\n }\n if (!applicationId) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires --application-id <id>. ' +\n 'Use \\'pncli sonatypeiq applications list\\' to find application IDs.',\n 1\n );\n }\n }\n\n const { tier: baseTier, osvReachable } = await detectTier(config);\n const sonatypeReachable = (source === 'sonatype' || source === 'all') ? await checkSonatypeReachable() : false;\n const tier = sonatypeReachable ? 'full' : baseTier;\n\n if (source === 'osv' && !osvReachable) {\n throw new PncliError(\n 'deps frisk requires OSV.dev access but api.osv.dev is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n if (source === 'sonatype' && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk --source sonatype requires Sonatype OSS Index access but ossindex.sonatype.org is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n if (source === 'all' && !osvReachable && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk requires either OSV.dev or Sonatype OSS Index access, but neither is reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n // For source=all, capture pre-check failures in sourceErrors so the LLM can see what was skipped\n const sourceErrors: FriskSourceError[] = [];\n let sourcesQueried: FriskSource[];\n\n if (source === 'all') {\n if (!osvReachable) sourceErrors.push({ source: 'osv', error: 'api.osv.dev is not reachable — run pncli deps connectivity to diagnose.' });\n if (!sonatypeReachable) sourceErrors.push({ source: 'sonatype', error: 'ossindex.sonatype.org is not reachable — run pncli deps connectivity to diagnose.' });\n sourcesQueried = [\n ...(osvReachable ? ['osv' as const] : []),\n ...(sonatypeReachable ? ['sonatype' as const] : [])\n ];\n } else {\n sourcesQueried = [source];\n }\n\n // Default frisk: include transitive deps (CVEs hide in transitive deps)\n const scanOpts: ScanOptions = {\n ...opts,\n includeTransitive: opts.includeTransitive ?? true\n };\n\n const scan = scanRepo(repoRoot, scanOpts);\n\n if (scan.packages.length === 0) {\n return { tier, source, sourcesQueried, sourceErrors, scanned: 0, vulnerable: 0, packages: [] };\n }\n\n let vulnerable: VulnerablePackage[];\n\n if (source === 'sonatypeiq') {\n vulnerable = await checkPackagesViaIqServer(scan.packages, applicationId!, config);\n } else if (source === 'sonatype') {\n vulnerable = await checkPackagesForVulnsViaSonatype(scan.packages);\n } else if (source === 'all') {\n // Use allSettled so a runtime failure from one source doesn't discard results from the other\n const [osvSettled, sonatypeSettled] = await Promise.allSettled([\n osvReachable ? checkPackagesForVulns(scan.packages) : Promise.resolve([] as VulnerablePackage[]),\n sonatypeReachable ? checkPackagesForVulnsViaSonatype(scan.packages) : Promise.resolve([] as VulnerablePackage[])\n ]);\n\n if (osvReachable) {\n if (osvSettled.status === 'rejected') {\n sourceErrors.push({ source: 'osv', error: toErrorMessage(osvSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'osv');\n }\n }\n if (sonatypeReachable) {\n if (sonatypeSettled.status === 'rejected') {\n sourceErrors.push({ source: 'sonatype', error: toErrorMessage(sonatypeSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'sonatype');\n }\n }\n\n if (sourcesQueried.length === 0) {\n throw new PncliError(\n 'All vulnerability sources failed during scanning. Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n vulnerable = mergeVulnerablePackages(\n osvSettled.status === 'fulfilled' ? osvSettled.value : [],\n sonatypeSettled.status === 'fulfilled' ? sonatypeSettled.value : []\n );\n } else {\n vulnerable = await checkPackagesForVulns(scan.packages);\n }\n\n return {\n tier,\n source,\n sourcesQueried,\n sourceErrors,\n scanned: scan.packages.length,\n vulnerable: vulnerable.length,\n packages: vulnerable\n };\n}\n\nfunction mergeVulnerablePackages(\n osvResults: VulnerablePackage[],\n sonatypeResults: VulnerablePackage[]\n): VulnerablePackage[] {\n const byKey = new Map<string, VulnerablePackage>();\n\n for (const pkg of osvResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n byKey.set(key, { ...pkg });\n }\n\n for (const pkg of sonatypeResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n const existing = byKey.get(key);\n if (existing) {\n // Merge: add Sonatype vulns not already present by ID\n const existingIds = new Set(existing.vulnerabilities.map(v => v.id));\n const newVulns = pkg.vulnerabilities.filter(v => !existingIds.has(v.id));\n existing.vulnerabilities = [...existing.vulnerabilities, ...newVulns];\n } else {\n byKey.set(key, { ...pkg });\n }\n }\n\n return [...byKey.values()];\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, OutdatedData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getOutdatedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runOutdated(\n config: ResolvedConfig,\n opts: ScanOptions,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<OutdatedData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Fail fast with a clear message if Artifactory is not configured at all\n requireArtifactory(config.artifactory, 'deps outdated');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const { outdated, uncheckedEcosystems } = await getOutdatedPackages(\n directPackages,\n config.artifactory,\n filterType\n );\n\n const summary = { total: outdated.length, major: 0, minor: 0, patch: 0 };\n for (const pkg of outdated) summary[pkg.updateType]++;\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n outdated,\n uncheckedEcosystems,\n summary\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, LicenseCheckData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getLicensedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runLicenseCheck(config: ResolvedConfig, opts: ScanOptions): Promise<LicenseCheckData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n requireArtifactory(config.artifactory, 'deps license-check');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const licensed = await getLicensedPackages(directPackages, config.artifactory);\n\n const byLicense: Record<string, number> = {};\n let unknown = 0;\n\n for (const pkg of licensed) {\n if (!pkg.license) {\n unknown++;\n } else {\n byLicense[pkg.license] = (byLicense[pkg.license] ?? 0) + 1;\n }\n }\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n packages: licensed,\n summary: {\n total: licensed.length,\n byLicense,\n unknown\n }\n };\n}\n","import { Command } from 'commander';\nimport input from '@inquirer/input';\nimport password from '@inquirer/password';\nimport confirm from '@inquirer/confirm';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n setRepoConfigValue,\n maskConfig,\n getGlobalConfigPath\n} from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { AdoCoreClient } from '../ado/client/core.js';\nimport { AdoWorkClient } from '../ado/client/work.js';\nimport { discoverFields, discoverTypes, buildDefaultAliases } from '../ado/discovery.js';\nimport { checkArtifactoryConnectivity } from '../deps/clients/artifactory.js';\nimport { success, fail, warn } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport chalk from 'chalk';\nimport fs from 'fs';\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command('config').description('Manage pncli configuration');\n\n config\n .command('init')\n .description('Setup wizard for service credentials (interactive)')\n .option('--repo', 'Write repo config (.pncli.json) instead of global config')\n .action(async (opts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.repo) {\n await initRepoConfig(start);\n } else {\n await initGlobalConfig(start);\n }\n } catch (err) {\n // Handle prompt cancellation (Ctrl+C) gracefully\n if (err instanceof Error && err.message.includes('User force closed')) {\n process.stderr.write('\\nSetup cancelled.\\n');\n process.exitCode = ExitCode.GENERAL_ERROR;\n return;\n }\n fail(err, 'config', 'init', start);\n }\n });\n\n config\n .command('show')\n .description('Print fully resolved config (PATs masked)')\n .action(() => {\n const start = Date.now();\n try {\n const resolved = loadConfig();\n success(maskConfig(resolved), 'config', 'show', start);\n } catch (err) {\n fail(err, 'config', 'show', start);\n }\n });\n\n config\n .command('set')\n .description('Set a config value by dot-notation key (e.g. jira.baseUrl https://...)')\n .argument('<key>', 'Config key in dot notation')\n .argument('<value>', 'Value to set')\n .option('--repo', 'Write to repo config (.pncli.json) instead of global config')\n .action((key: string, value: string, cmdOpts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (cmdOpts.repo) {\n setRepoConfigValue(key, value);\n success({ key, value, target: '.pncli.json' }, 'config', 'set', start);\n } else {\n const opts = program.optsWithGlobals();\n setConfigValue(key, value, opts.config);\n success({ key, value }, 'config', 'set', start);\n }\n } catch (err) {\n fail(err, 'config', 'set', start);\n }\n });\n\n config\n .command('test')\n .description('Test connectivity to configured services')\n .action(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n const http = createHttpClient(cfg);\n\n type ServiceResult = { ok: boolean; message: string } | { ok: null; message: string };\n const results: Record<string, ServiceResult> = {};\n\n if (cfg.jira.baseUrl) {\n try {\n await http.jira<unknown>('/rest/api/2/myself');\n results.jira = { ok: true, message: 'connected' };\n } catch (err) {\n results.jira = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jira = { ok: null, message: 'not configured' };\n }\n\n if (cfg.bitbucket.baseUrl) {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties');\n results.bitbucket = { ok: true, message: 'connected' };\n } catch (err) {\n results.bitbucket = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.bitbucket = { ok: null, message: 'not configured' };\n }\n\n if (cfg.github.baseUrl) {\n try {\n await http.github<unknown>('/user');\n results.github = { ok: true, message: 'connected' };\n } catch (err) {\n results.github = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.github = { ok: null, message: 'not configured' };\n }\n\n if (cfg.confluence.baseUrl) {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 } });\n results.confluence = { ok: true, message: 'connected' };\n } catch (err) {\n results.confluence = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.confluence = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonar.baseUrl) {\n try {\n await http.sonar<unknown>('/api/system/status');\n results.sonar = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonar = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonar = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sde.baseUrl) {\n try {\n await http.sde<unknown>('/api/v2/users/me/');\n results.sde = { ok: true, message: 'connected' };\n } catch (err) {\n results.sde = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sde = { ok: null, message: 'not configured' };\n }\n\n if (cfg.ado.baseUrl) {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path);\n results.ado = { ok: true, message: 'connected' };\n } catch (err) {\n results.ado = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.ado = { ok: null, message: 'not configured' };\n }\n\n if (cfg.jenkins.baseUrl && cfg.jenkins.username && cfg.jenkins.apiToken) {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' } });\n results.jenkins = { ok: true, message: 'connected' };\n } catch (err) {\n results.jenkins = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jenkins = { ok: null, message: 'not configured' };\n }\n\n if (cfg.artifactory.baseUrl) {\n try {\n await http.artifactoryText('/api/system/ping');\n results.artifactory = { ok: true, message: 'connected' };\n } catch (err) {\n results.artifactory = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.artifactory = { ok: null, message: 'not configured' };\n }\n\n if (cfg.udeploy.baseUrl && (cfg.udeploy.pat || (cfg.udeploy.username && cfg.udeploy.password))) {\n try {\n await http.udeploy<unknown>('/cli/application');\n results.udeploy = { ok: true, message: 'connected' };\n } catch (err) {\n results.udeploy = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.udeploy = { ok: null, message: 'not configured' };\n }\n\n if (cfg.checkmarx.baseUrl && cfg.checkmarx.tenantName && (cfg.checkmarx.apiKey || (cfg.checkmarx.clientId && cfg.checkmarx.clientSecret))) {\n try {\n await http.checkmarx<unknown>('/api/projects', { params: { limit: 1 } });\n results.checkmarx = { ok: true, message: 'connected' };\n } catch (err) {\n results.checkmarx = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.checkmarx = { ok: null, message: 'not configured' };\n }\n\n const snConfigured = cfg.servicenow.baseUrl && cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (snConfigured) {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n results.servicenow = { ok: true, message: 'connected' };\n } catch (err) {\n results.servicenow = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.servicenow = { ok: null, message: 'not configured' };\n }\n\n if (cfg.contrast.apiKey && cfg.contrast.serviceKey && cfg.contrast.username && cfg.contrast.orgUuid) {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 } });\n results.contrast = { ok: true, message: 'connected' };\n } catch (err) {\n results.contrast = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.contrast = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonatypeiq.baseUrl && cfg.sonatypeiq.userCode && cfg.sonatypeiq.passcode) {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n results.sonatypeiq = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonatypeiq = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonatypeiq = { ok: null, message: 'not configured' };\n }\n\n if (cfg.openshift.baseUrl && cfg.openshift.token) {\n try {\n await http.openshift<unknown>('/api/v1');\n results.openshift = { ok: true, message: 'connected' };\n } catch (err) {\n results.openshift = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.openshift = { ok: null, message: 'not configured' };\n }\n\n if (cfg.dynatrace.baseUrl && cfg.dynatrace.apiToken) {\n try {\n await http.dynatrace<unknown>('/api/v2/entities', {\n params: { entitySelector: 'type(\"SERVICE\")', pageSize: 1 }\n });\n results.dynatrace = { ok: true, message: 'connected' };\n } catch (err) {\n results.dynatrace = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.dynatrace = { ok: null, message: 'not configured' };\n }\n\n if (cfg.dynatrace.platformUrl && cfg.dynatrace.platformToken) {\n try {\n await http.dynatracePlatform<unknown>('/platform/storage/query/v1/query:execute', {\n method: 'POST',\n body: {\n query: 'fetch spans | limit 1',\n requestTimeoutMilliseconds: 5000\n },\n timeoutMs: 10_000\n });\n results.dynatrace_platform = { ok: true, message: 'connected' };\n } catch (err) {\n results.dynatrace_platform = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else if (cfg.dynatrace.platformUrl || cfg.dynatrace.platformToken) {\n results.dynatrace_platform = { ok: false, message: 'platformUrl and platformToken must both be configured' };\n } else {\n results.dynatrace_platform = { ok: null, message: 'not configured' };\n }\n\n success(results, 'config', 'test', start);\n } catch (err) {\n fail(err, 'config', 'test', start);\n }\n });\n\n config\n .command('check')\n .description('Check PAT status for every service: Blank, Valid, or Invalid')\n .option('--output <format>', 'Output format: json or table', 'json')\n .action(async (cmdOpts: { output: string }) => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n // Always bypass --dry-run: a dry-run config check is meaningless\n const http = createHttpClient(cfg, false);\n\n type CheckStatus = 'blank' | 'valid' | 'invalid' | 'error';\n type CheckResult = { status: CheckStatus; message: string };\n const results: Record<string, CheckResult> = {};\n\n function categorize(err: unknown): CheckResult {\n const status = (err as { status?: number }).status ?? -1;\n if (status === 401 || status === 403) {\n return { status: 'invalid', message: `auth rejected (${status})` };\n }\n if (status === 0) {\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n\n // Jira\n if (!cfg.jira.apiToken) {\n results.jira = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jira.baseUrl) {\n results.jira = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jira<unknown>('/rest/api/2/myself', { timeoutMs: 10_000 });\n results.jira = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jira = categorize(err);\n }\n }\n\n // Bitbucket\n if (!cfg.bitbucket.pat) {\n results.bitbucket = { status: 'blank', message: 'not configured' };\n } else if (!cfg.bitbucket.baseUrl) {\n results.bitbucket = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties', { timeoutMs: 10_000 });\n results.bitbucket = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.bitbucket = categorize(err);\n }\n }\n\n // GitHub\n if (!cfg.github.token) {\n results.github = { status: 'blank', message: 'not configured' };\n } else if (!cfg.github.baseUrl) {\n results.github = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.github<unknown>('/user', { timeoutMs: 10_000 });\n results.github = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.github = categorize(err);\n }\n }\n\n // Confluence — distinguish explicit token from Jira fallback\n if (!cfg.confluence.apiTokenExplicit && !cfg.jira.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.baseUrl) {\n results.confluence = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 }, timeoutMs: 10_000 });\n const msg = cfg.confluence.apiTokenExplicit ? 'ok' : 'ok (inherited from Jira token)';\n results.confluence = { status: 'valid', message: msg };\n } catch (err) {\n results.confluence = categorize(err);\n }\n }\n\n // SonarQube\n if (!cfg.sonar.token) {\n results.sonar = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonar.baseUrl) {\n results.sonar = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonar<unknown>('/api/system/status', { timeoutMs: 10_000 });\n results.sonar = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonar = categorize(err);\n }\n }\n\n // SDElements\n if (!cfg.sde.token) {\n results.sde = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sde.baseUrl) {\n results.sde = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sde<unknown>('/api/v2/users/me/', { timeoutMs: 10_000 });\n results.sde = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sde = categorize(err);\n }\n }\n\n // Azure DevOps\n if (!cfg.ado.pat) {\n results.ado = { status: 'blank', message: 'not configured' };\n } else if (!cfg.ado.baseUrl) {\n results.ado = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path, { timeoutMs: 10_000 });\n results.ado = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.ado = categorize(err);\n }\n }\n\n // Jenkins\n if (!cfg.jenkins.apiToken || !cfg.jenkins.username) {\n results.jenkins = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jenkins.baseUrl) {\n results.jenkins = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' }, timeoutMs: 10_000 });\n results.jenkins = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jenkins = categorize(err);\n }\n }\n\n // UDeploy\n if (!cfg.udeploy.pat && !(cfg.udeploy.username && cfg.udeploy.password)) {\n results.udeploy = { status: 'blank', message: 'not configured' };\n } else if (!cfg.udeploy.baseUrl) {\n results.udeploy = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.udeploy<unknown>('/cli/application', { timeoutMs: 10_000 });\n results.udeploy = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.udeploy = categorize(err);\n }\n }\n\n // Artifactory — reuse existing helper\n const artResult = await checkArtifactoryConnectivity(cfg.artifactory);\n if (!artResult.configured) {\n results.artifactory = { status: 'blank', message: artResult.error ?? 'not configured' };\n } else if (!artResult.authenticated) {\n results.artifactory = { status: 'invalid', message: artResult.error ?? 'auth rejected' };\n } else if (!artResult.reachable) {\n results.artifactory = { status: 'error', message: artResult.error ?? 'unreachable' };\n } else {\n results.artifactory = { status: 'valid', message: 'ok' };\n }\n\n // Checkmarx\n if (!cfg.checkmarx.tenantName || (!cfg.checkmarx.apiKey && (!cfg.checkmarx.clientId || !cfg.checkmarx.clientSecret))) {\n results.checkmarx = { status: 'blank', message: 'not configured' };\n } else if (!cfg.checkmarx.baseUrl) {\n results.checkmarx = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.checkmarx<unknown>('/api/projects', { params: { limit: 1 }, timeoutMs: 10_000 });\n results.checkmarx = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.checkmarx = categorize(err);\n }\n }\n\n // ServiceNow\n const snCreds = cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (!snCreds) {\n results.servicenow = { status: 'blank', message: 'not configured' };\n } else if (!cfg.servicenow.baseUrl) {\n results.servicenow = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 }, timeoutMs: 10_000 });\n results.servicenow = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.servicenow = categorize(err);\n }\n }\n\n // Contrast IAST\n if (!cfg.contrast.apiKey || !cfg.contrast.serviceKey || !cfg.contrast.username) {\n results.contrast = { status: 'blank', message: 'not configured' };\n } else if (!cfg.contrast.orgUuid) {\n results.contrast = { status: 'error', message: 'orgUuid not configured' };\n } else {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 }, timeoutMs: 10_000 });\n results.contrast = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.contrast = categorize(err);\n }\n }\n\n // Sonatype IQ Server\n if (!cfg.sonatypeiq.userCode || !cfg.sonatypeiq.passcode) {\n results.sonatypeiq = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonatypeiq.baseUrl) {\n results.sonatypeiq = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 }, timeoutMs: 10_000 });\n results.sonatypeiq = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonatypeiq = categorize(err);\n }\n }\n\n // OpenShift / Kubernetes\n if (!cfg.openshift.token) {\n results.openshift = { status: 'blank', message: 'not configured' };\n } else if (!cfg.openshift.baseUrl) {\n results.openshift = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.openshift<unknown>('/api/v1', { timeoutMs: 10_000 });\n results.openshift = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.openshift = categorize(err);\n }\n }\n\n if (!cfg.dynatrace.apiToken) {\n results.dynatrace = { status: 'blank', message: 'not configured' };\n } else if (!cfg.dynatrace.baseUrl) {\n results.dynatrace = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.dynatrace<unknown>('/api/v2/entities', {\n params: { entitySelector: 'type(\"SERVICE\")', pageSize: 1 },\n timeoutMs: 10_000\n });\n results.dynatrace = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.dynatrace = categorize(err);\n }\n }\n\n if (!cfg.dynatrace.platformUrl && !cfg.dynatrace.platformToken) {\n results.dynatrace_platform = { status: 'blank', message: 'not configured' };\n } else if (!cfg.dynatrace.platformUrl || !cfg.dynatrace.platformToken) {\n results.dynatrace_platform = {\n status: 'error',\n message: 'platformUrl and platformToken must both be configured'\n };\n } else {\n try {\n await http.dynatracePlatform<unknown>('/platform/storage/query/v1/query:execute', {\n method: 'POST',\n body: {\n query: 'fetch spans | limit 1',\n requestTimeoutMilliseconds: 5000\n },\n timeoutMs: 10_000\n });\n results.dynatrace_platform = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.dynatrace_platform = categorize(err);\n }\n }\n\n // Exit code: prefer AUTH_ERROR if any invalid, else NETWORK_ERROR if any errors\n const statuses = Object.values(results).map(r => r.status);\n if (statuses.includes('invalid')) process.exitCode = ExitCode.AUTH_ERROR;\n else if (statuses.includes('error')) process.exitCode = ExitCode.NETWORK_ERROR;\n\n if (cmdOpts.output === 'table') {\n // Human-readable table to stdout\n const services = ['jira', 'bitbucket', 'github', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq', 'openshift', 'dynatrace', 'dynatrace_platform'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stdout.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stdout.write('\\n');\n } else {\n // Pretty table on stderr when --pretty is set (stdout stays JSON)\n if (opts.pretty) {\n const services = ['jira', 'bitbucket', 'github', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq', 'openshift', 'dynatrace', 'dynatrace_platform'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stderr.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stderr.write('\\n');\n }\n success(results, 'config', 'check', start);\n }\n } catch (err) {\n fail(err, 'config', 'check', start);\n }\n });\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return trimmed;\n return /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n}\n\nasync function initGlobalConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init — Global configuration\\n\\n');\n\n process.stderr.write('── Identity ──────────────────────────────────────\\n');\n const userEmail = await input({\n message: 'Your email address (used across Jira, Bitbucket, etc.):',\n default: ''\n });\n\n const userId = await input({\n message: 'Your username / user ID:',\n default: ''\n });\n\n process.stderr.write('\\n── Jira ──────────────────────────────────────────\\n');\n const jiraBaseUrl = await input({\n message: 'Jira base URL (e.g. jira.imagile.dev):',\n default: ''\n });\n\n const jiraApiToken = await password({\n message: 'Jira personal access token:'\n });\n\n process.stderr.write('\\n── Bitbucket ─────────────────────────────────────\\n');\n const bitbucketBaseUrl = await input({\n message: 'Bitbucket Server base URL (e.g. bitbucket.imagile.dev):',\n default: ''\n });\n\n const bitbucketPat = await password({\n message: 'Bitbucket personal access token:'\n });\n\n process.stderr.write('\\n── GitHub ────────────────────────────────────────\\n');\n const useGitHub = await confirm({\n message: 'Configure GitHub for PR operations?',\n default: false\n });\n\n let githubBaseUrl = '';\n let githubToken = '';\n\n if (useGitHub) {\n githubBaseUrl = await input({\n message: 'GitHub API base URL\\n GitHub.com: api.github.com\\n GitHub Enterprise: <host>/api/v3\\n URL: ',\n default: ''\n });\n\n githubToken = await password({\n message: 'GitHub personal access token (classic or fine-grained):'\n });\n\n if (githubBaseUrl && githubToken) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n github: {\n baseUrl: normalizeBaseUrl(githubBaseUrl),\n token: githubToken\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.github<unknown>('/user');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to GitHub: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and token and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Confluence ────────────────────────────────────\\n');\n const confluenceBaseUrl = await input({\n message: 'Confluence base URL (e.g. confluence.imagile.dev):',\n default: ''\n });\n\n const confluenceApiToken = await password({\n message: 'Confluence personal access token:'\n });\n\n process.stderr.write('\\n── Artifactory ───────────────────────────────────\\n');\n const useArtifactory = await confirm({\n message: 'Configure Artifactory for dependency commands (deps outdated, deps license-check)?',\n default: false\n });\n\n let artifactoryBaseUrl = '';\n let artifactoryToken = '';\n let npmRepo = '';\n let nugetRepo = '';\n let mavenRepo = '';\n\n if (useArtifactory) {\n artifactoryBaseUrl = await input({\n message: 'Artifactory base URL (e.g. artifactory.imagile.dev):',\n default: ''\n });\n\n artifactoryToken = await password({\n message: 'Artifactory API token:'\n });\n\n process.stderr.write('\\nConfigure which ecosystems you use (skip any that don\\'t apply):\\n');\n\n const useNpm = await confirm({ message: ' Use npm packages from Artifactory?', default: true });\n if (useNpm) {\n npmRepo = await input({ message: ' npm repository name:', default: 'npm-remote' });\n }\n\n const useNuget = await confirm({ message: ' Use NuGet packages from Artifactory?', default: false });\n if (useNuget) {\n nugetRepo = await input({ message: ' NuGet repository name:', default: 'nuget-remote' });\n }\n\n const useMaven = await confirm({ message: ' Use Maven packages from Artifactory?', default: false });\n if (useMaven) {\n mavenRepo = await input({ message: ' Maven repository name:', default: 'libs-release' });\n }\n }\n\n process.stderr.write('\\n── SonarQube ─────────────────────────────────────\\n');\n const useSonar = await confirm({\n message: 'Configure SonarQube Server for code quality checks?',\n default: false\n });\n\n let sonarBaseUrl = '';\n let sonarToken = '';\n\n if (useSonar) {\n sonarBaseUrl = await input({\n message: 'SonarQube Server base URL (e.g. sonar.imagile.dev):',\n default: ''\n });\n\n sonarToken = await password({\n message: 'SonarQube personal access token:'\n });\n }\n\n process.stderr.write('\\n── SDElements ────────────────────────────────────\\n');\n const useSde = await confirm({\n message: 'Configure SDElements for threat modeling and countermeasure queries?',\n default: false\n });\n\n let sdeBaseUrl = '';\n let sdeToken = '';\n\n if (useSde) {\n process.stderr.write(' Connection string format: <api-token>@<base-url>\\n');\n const useSdeConnectionString = await confirm({\n message: 'Do you have a connection string to paste (token@url)?',\n default: false\n });\n\n if (useSdeConnectionString) {\n const sdeConnection = await password({\n message: 'SDElements connection string (api-token@hostname, e.g. mytoken@myorg.sdelements.com):'\n });\n const atIdx = sdeConnection.indexOf('@');\n if (atIdx > 0) {\n sdeToken = sdeConnection.slice(0, atIdx);\n sdeBaseUrl = sdeConnection.slice(atIdx + 1);\n }\n } else {\n sdeBaseUrl = await input({\n message: 'SDElements hostname\\n Cloud-hosted: imagile.sdelements.com\\n On-premise: sde.imagile.dev\\n Host: ',\n default: ''\n });\n\n sdeToken = await password({\n message: 'SDElements API token:'\n });\n }\n }\n\n process.stderr.write('\\n── Azure DevOps Server ───────────────────────────\\n');\n const useAdo = await confirm({\n message: 'Configure Azure DevOps Server for work items, repos, and pipelines?',\n default: false\n });\n\n let adoBaseUrl = '';\n let adoPat = '';\n let adoCollection = '';\n let adoProject = '';\n let adoFieldAliases: Record<string, string> = {};\n let adoDiscoveredFields: import('../../types/config.js').AdoFieldMeta[] = [];\n let adoDiscoveredTypes: import('../../types/config.js').AdoWorkItemTypeMeta[] = [];\n\n if (useAdo) {\n adoBaseUrl = await input({\n message: 'Azure DevOps Server base URL (e.g. tfs.imagile.dev or devops.imagile.dev/tfs):',\n default: ''\n });\n\n adoPat = await password({\n message: 'Azure DevOps personal access token:'\n });\n\n adoCollection = await input({\n message: 'Default collection name (e.g. DefaultCollection):',\n default: ''\n });\n\n adoProject = await input({\n message: 'Default team project name:',\n default: ''\n });\n\n // Validate connectivity before asking discovery questions\n if (adoBaseUrl && adoCollection) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n pat: adoPat || undefined,\n fieldAliases: {},\n discoveredFields: [],\n discoveredTypes: []\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n const tempCore = new AdoCoreClient(tempHttp);\n await tempCore.getConnectionData(adoCollection);\n process.stderr.write(' Connected.\\n');\n\n // Optional field/type discovery\n if (adoProject) {\n const doDiscover = await confirm({\n message: 'Discover work item types and fields from this collection now? (recommended)',\n default: true\n });\n\n if (doDiscover) {\n process.stderr.write(' Fetching work item types and fields...\\n');\n const tempWork = new AdoWorkClient(tempHttp);\n adoDiscoveredFields = await discoverFields(tempWork, adoCollection);\n process.stderr.write(` Found ${adoDiscoveredFields.length} fields.\\n`);\n adoDiscoveredTypes = await discoverTypes(tempWork, adoCollection, adoProject);\n process.stderr.write(` Found ${adoDiscoveredTypes.length} work item types.\\n`);\n\n const doAliases = await confirm({\n message: 'Save friendly aliases for common fields? (e.g. \"priority\" → reference name)',\n default: true\n });\n if (doAliases) {\n adoFieldAliases = buildDefaultAliases(adoDiscoveredFields as Parameters<typeof buildDefaultAliases>[0]);\n process.stderr.write(` Generated ${Object.keys(adoFieldAliases).length} aliases.\\n`);\n }\n }\n }\n } catch (err) {\n warn(`Could not connect to Azure DevOps: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Jenkins ───────────────────────────────────────\\n');\n const useJenkins = await confirm({\n message: 'Configure Jenkins Data Center for pipeline operations?',\n default: false\n });\n\n let jenkinsBaseUrl = '';\n let jenkinsUsername = '';\n let jenkinsApiToken = '';\n\n if (useJenkins) {\n jenkinsBaseUrl = await input({\n message: 'Jenkins base URL (e.g. jenkins.imagile.dev):',\n default: ''\n });\n\n jenkinsUsername = await input({\n message: 'Jenkins username:',\n default: ''\n });\n\n jenkinsApiToken = await password({\n message: 'Jenkins API token:'\n });\n }\n\n process.stderr.write('\\n── IBM UrbanCode Deploy ──────────────────────────\\n');\n const useUdeploy = await confirm({\n message: 'Configure IBM UrbanCode Deploy for component imports and deployment processes?',\n default: false\n });\n\n let udeployBaseUrl = '';\n let udeployPat = '';\n let udeployUsername = '';\n let udeployPassword = '';\n let udeployDefaultApp = '';\n let udeployDefaultEnv = '';\n\n if (useUdeploy) {\n udeployBaseUrl = await input({\n message: 'UDeploy base URL (e.g. ucd.imagile.dev:8443):',\n default: ''\n });\n\n udeployUsername = await input({\n message: 'UDeploy username (leave blank to use a PAT instead):',\n default: ''\n });\n\n if (udeployUsername) {\n udeployPassword = await password({\n message: 'UDeploy password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n } else {\n udeployPat = await password({\n message: 'UDeploy personal access token:'\n });\n }\n\n udeployDefaultApp = await input({\n message: 'Default application name (optional):',\n default: ''\n });\n\n udeployDefaultEnv = await input({\n message: 'Default environment name (optional):',\n default: ''\n });\n\n const hasCredentials = udeployBaseUrl && (udeployPat || (udeployUsername && udeployPassword));\n if (hasCredentials) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n pat: udeployPat || undefined,\n username: udeployUsername || undefined,\n password: udeployPassword || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.udeploy<unknown>('/cli/application');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to UDeploy: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Checkmarx ─────────────────────────────────────\\n');\n const useCheckmarx = await confirm({\n message: 'Configure Checkmarx One for vulnerability scanning?',\n default: false\n });\n\n let checkmarxBaseUrl = '';\n let checkmarxTenantName = '';\n let checkmarxApiKey = '';\n let checkmarxClientId = '';\n let checkmarxClientSecret = '';\n\n if (useCheckmarx) {\n checkmarxBaseUrl = await input({\n message: 'Checkmarx One API base URL (e.g. https://ast.checkmarx.net):',\n default: ''\n });\n\n checkmarxTenantName = await input({\n message: 'Checkmarx One tenant name (IAM realm, e.g. imagile):',\n default: ''\n });\n\n checkmarxApiKey = await password({\n message: 'Checkmarx One API key (leave blank to use an OAuth client):'\n });\n\n if (!checkmarxApiKey) {\n checkmarxClientId = await input({\n message: 'Checkmarx One OAuth client ID:',\n default: ''\n });\n\n checkmarxClientSecret = await password({\n message: 'Checkmarx One OAuth client secret:',\n validate: (v) => v.length > 0 || 'Client secret cannot be blank'\n });\n }\n\n if (checkmarxBaseUrl && checkmarxTenantName && (checkmarxApiKey || (checkmarxClientId && checkmarxClientSecret))) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n tenantName: checkmarxTenantName,\n apiKey: checkmarxApiKey || undefined,\n clientId: checkmarxClientId,\n clientSecret: checkmarxClientSecret\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.checkmarx<unknown>('/api/projects', { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Checkmarx: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── ServiceNow ────────────────────────────────────\\n');\n const useServiceNow = await confirm({\n message: 'Configure ServiceNow for change management?',\n default: false\n });\n\n let servicenowBaseUrl = '';\n let servicenowUsername = '';\n let servicenowPassword = '';\n let servicenowApiToken = '';\n\n if (useServiceNow) {\n servicenowBaseUrl = await input({\n message: 'ServiceNow instance URL (e.g. imagile.service-now.com):',\n default: ''\n });\n\n servicenowUsername = await input({\n message: 'ServiceNow username:',\n default: ''\n });\n\n const snUseToken = await confirm({\n message: 'Authenticate with an API token instead of a password?',\n default: false\n });\n\n if (snUseToken) {\n servicenowApiToken = await password({\n message: 'ServiceNow API token:',\n validate: (v) => v.length > 0 || 'Token cannot be blank'\n });\n } else {\n servicenowPassword = await password({\n message: 'ServiceNow password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n }\n\n const snHasCreds = servicenowBaseUrl && servicenowUsername && (servicenowPassword || servicenowApiToken);\n if (snHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername,\n password: servicenowPassword || undefined,\n apiToken: servicenowApiToken || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to ServiceNow: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Sonatype IQ Server ────────────────────────────\\n');\n const useSonatypeIq = await confirm({\n message: 'Configure Sonatype IQ Server for dependency vulnerability scanning?',\n default: false\n });\n\n let sonatypeIqBaseUrl = '';\n let sonatypeIqUserCode = '';\n let sonatypeIqPasscode = '';\n\n if (useSonatypeIq) {\n process.stderr.write(' User Token credentials are found in your IQ Server profile under User Token.\\n');\n\n sonatypeIqBaseUrl = await input({\n message: 'Sonatype IQ Server base URL (e.g. iq.imagile.dev):',\n default: ''\n });\n\n sonatypeIqUserCode = await input({\n message: 'User Code (from User Token):',\n default: ''\n });\n\n sonatypeIqPasscode = await password({\n message: 'Passcode (from User Token):'\n });\n\n if (sonatypeIqBaseUrl && sonatypeIqUserCode && sonatypeIqPasscode) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode,\n passcode: sonatypeIqPasscode\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Sonatype IQ Server: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Contrast IAST ─────────────────────────────────\\n');\n const useContrast = await confirm({\n message: 'Configure Contrast Security IAST for vulnerability findings?',\n default: false\n });\n\n let contrastBaseUrl = '';\n let contrastOrgUuid = '';\n let contrastUsername = '';\n let contrastApiKey = '';\n let contrastServiceKey = '';\n\n if (useContrast) {\n process.stderr.write(' Find your credentials in Contrast under User Settings → Your Keys.\\n');\n\n contrastBaseUrl = await input({\n message: 'Contrast base URL (e.g. https://app.contrastsecurity.com for cloud SaaS):',\n validate: (v: string) => v.trim() ? true : 'Base URL is required',\n default: ''\n });\n\n contrastOrgUuid = await input({\n message: 'Organization UUID:',\n default: ''\n });\n\n contrastUsername = await input({\n message: 'Username (email):',\n default: ''\n });\n\n contrastApiKey = await password({\n message: 'API key:'\n });\n\n contrastServiceKey = await password({\n message: 'Service key:'\n });\n\n const contrastHasCreds = contrastOrgUuid && contrastUsername && contrastApiKey && contrastServiceKey;\n if (contrastHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n contrast: {\n baseUrl: normalizeBaseUrl(contrastBaseUrl) || undefined,\n orgUuid: contrastOrgUuid,\n username: contrastUsername,\n apiKey: contrastApiKey,\n serviceKey: contrastServiceKey\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.contrast<unknown>(`/Contrast/api/ng/${contrastOrgUuid}/applications`, { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Contrast: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── OpenShift / Kubernetes ────────────────────────\\n');\n const useOpenShift = await confirm({\n message: 'Configure OpenShift / Kubernetes for pod health monitoring?',\n default: false\n });\n\n let openShiftBaseUrl = '';\n let openShiftToken = '';\n\n if (useOpenShift) {\n process.stderr.write(' Service account token: cat /var/run/secrets/kubernetes.io/serviceaccount/token\\n');\n\n openShiftBaseUrl = await input({\n message: 'OpenShift API server URL (e.g. https://api.cluster.imagile.dev:6443):',\n default: ''\n });\n\n openShiftToken = await password({\n message: 'Service account token:'\n });\n\n if (openShiftBaseUrl && openShiftToken) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n openshift: {\n baseUrl: normalizeBaseUrl(openShiftBaseUrl),\n token: openShiftToken\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.openshift<unknown>('/api/v1');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to OpenShift: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and token and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Dynatrace ─────────────────────────────────────\\n');\n const useDynatrace = await confirm({\n message: 'Configure Dynatrace for services, problems, workloads, and traces?',\n default: false\n });\n\n let dynatraceBaseUrl = '';\n let dynatraceApiToken = '';\n let dynatracePlatformUrl = '';\n let dynatracePlatformToken = '';\n\n if (useDynatrace) {\n dynatraceBaseUrl = await input({\n message: 'Dynatrace environment URL (e.g. https://abc12345.live.dynatrace.com):',\n default: ''\n });\n dynatraceApiToken = await password({\n message: 'Environment API token (entities.read and problems.read):'\n });\n const configureTraces = await confirm({\n message: 'Configure the latest Dynatrace platform for Grail trace queries?',\n default: false\n });\n if (configureTraces) {\n dynatracePlatformUrl = await input({\n message: 'Dynatrace platform URL (e.g. https://abc12345.apps.dynatrace.com):',\n default: ''\n });\n dynatracePlatformToken = await password({\n message: 'Platform token with Grail span read permissions:'\n });\n }\n if (dynatraceBaseUrl && dynatraceApiToken) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n dynatrace: {\n baseUrl: normalizeBaseUrl(dynatraceBaseUrl),\n apiToken: dynatraceApiToken,\n platformUrl: normalizeBaseUrl(dynatracePlatformUrl) || undefined,\n platformToken: dynatracePlatformToken || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.dynatrace<unknown>('/api/v2/entities', {\n params: { entitySelector: 'type(\"SERVICE\")', pageSize: 1 }\n });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Dynatrace: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URLs and tokens and re-run pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Defaults ──────────────────────────────────────\\n');\n const jiraProject = await input({\n message: 'Default Jira project key (optional):',\n default: ''\n });\n\n const sonarProject = useSonar ? await input({\n message: 'Default SonarQube project key (optional):',\n default: ''\n }) : '';\n\n const sdeProject = useSde ? await input({\n message: 'Default SDElements project ID (optional, numeric):',\n default: ''\n }) : '';\n\n process.stderr.write('\\n');\n const confirmed = await confirm({\n message: 'Write config to ~/.pncli/config.json?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exitCode = ExitCode.SUCCESS;\n return;\n }\n\n writeGlobalConfig({\n user: {\n email: userEmail || undefined,\n userId: userId || undefined\n },\n jira: {\n baseUrl: normalizeBaseUrl(jiraBaseUrl) || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: normalizeBaseUrl(bitbucketBaseUrl) || undefined,\n pat: bitbucketPat || undefined\n },\n ...(useGitHub && githubBaseUrl ? {\n github: {\n baseUrl: normalizeBaseUrl(githubBaseUrl),\n token: githubToken || undefined\n }\n } : {}),\n ...(confluenceBaseUrl || confluenceApiToken ? {\n confluence: {\n baseUrl: normalizeBaseUrl(confluenceBaseUrl) || undefined,\n apiToken: confluenceApiToken || undefined\n }\n } : {}),\n ...(useArtifactory ? {\n artifactory: {\n baseUrl: normalizeBaseUrl(artifactoryBaseUrl) || undefined,\n token: artifactoryToken || undefined,\n npmRepo: npmRepo || undefined,\n nugetRepo: nugetRepo || undefined,\n mavenRepo: mavenRepo || undefined\n }\n } : {}),\n ...(useSonar ? {\n sonar: {\n baseUrl: normalizeBaseUrl(sonarBaseUrl) || undefined,\n token: sonarToken || undefined\n }\n } : {}),\n ...(useSde && sdeToken && sdeBaseUrl ? {\n sde: {\n connection: `${sdeToken}@${sdeBaseUrl}`\n }\n } : {}),\n ...(useAdo && adoBaseUrl ? {\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n ...(adoPat ? { pat: adoPat } : {}),\n ...(Object.keys(adoFieldAliases).length ? { fieldAliases: adoFieldAliases } : {}),\n ...(adoDiscoveredFields.length ? { discoveredFields: adoDiscoveredFields } : {}),\n ...(adoDiscoveredTypes.length ? { discoveredTypes: adoDiscoveredTypes } : {})\n }\n } : {}),\n ...(useJenkins && jenkinsBaseUrl ? {\n jenkins: {\n baseUrl: normalizeBaseUrl(jenkinsBaseUrl),\n ...(jenkinsUsername ? { username: jenkinsUsername } : {}),\n ...(jenkinsApiToken ? { apiToken: jenkinsApiToken } : {})\n }\n } : {}),\n ...(useUdeploy && udeployBaseUrl ? {\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n ...(udeployPat ? { pat: udeployPat } : {}),\n ...(udeployUsername ? { username: udeployUsername } : {}),\n ...(udeployPassword ? { password: udeployPassword } : {})\n }\n } : {}),\n ...(useCheckmarx && checkmarxBaseUrl ? {\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n tenantName: checkmarxTenantName || undefined,\n apiKey: checkmarxApiKey || undefined,\n clientId: checkmarxClientId || undefined,\n clientSecret: checkmarxClientSecret || undefined\n }\n } : {}),\n ...(useServiceNow && servicenowBaseUrl ? {\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername || undefined,\n ...(servicenowApiToken ? { apiToken: servicenowApiToken } : {}),\n ...(servicenowPassword ? { password: servicenowPassword } : {})\n }\n } : {}),\n ...(useContrast && contrastOrgUuid ? {\n contrast: {\n ...(contrastBaseUrl ? { baseUrl: normalizeBaseUrl(contrastBaseUrl) } : {}),\n orgUuid: contrastOrgUuid,\n username: contrastUsername || undefined,\n apiKey: contrastApiKey || undefined,\n serviceKey: contrastServiceKey || undefined\n }\n } : {}),\n ...(useSonatypeIq && sonatypeIqBaseUrl ? {\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode || undefined,\n passcode: sonatypeIqPasscode || undefined\n }\n } : {}),\n ...(useOpenShift && openShiftBaseUrl ? {\n openshift: {\n baseUrl: normalizeBaseUrl(openShiftBaseUrl),\n token: openShiftToken || undefined\n }\n } : {}),\n ...(useDynatrace && dynatraceBaseUrl ? {\n dynatrace: {\n baseUrl: normalizeBaseUrl(dynatraceBaseUrl),\n apiToken: dynatraceApiToken || undefined,\n platformUrl: normalizeBaseUrl(dynatracePlatformUrl) || undefined,\n platformToken: dynatracePlatformToken || undefined\n }\n } : {}),\n defaults: {\n jira: {\n project: jiraProject || undefined\n },\n ...(useSonar && sonarProject ? {\n sonar: {\n project: sonarProject || undefined\n }\n } : {}),\n ...(useSde && sdeProject ? {\n sde: {\n project: sdeProject || undefined\n }\n } : {}),\n ...(useAdo && (adoCollection || adoProject) ? {\n ado: {\n collection: adoCollection || undefined,\n project: adoProject || undefined\n }\n } : {}),\n ...(useUdeploy && (udeployDefaultApp || udeployDefaultEnv) ? {\n udeploy: {\n application: udeployDefaultApp || undefined,\n environment: udeployDefaultEnv || undefined\n }\n } : {})\n }\n });\n\n const configPath = getGlobalConfigPath();\n warn(`Config written to ${configPath}`);\n success({ written: configPath }, 'config', 'init', start);\n}\n\nasync function initRepoConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init --repo — Repo configuration\\n\\n');\n\n const jiraProject = await input({\n message: 'Jira project key (e.g. ACME):',\n default: ''\n });\n\n const jiraIssueType = await input({\n message: 'Default issue type:',\n default: 'Story'\n });\n\n const jiraPriority = await input({\n message: 'Default priority:',\n default: 'Medium'\n });\n\n const targetBranch = await input({\n message: 'Default target branch for PRs:',\n default: 'main'\n });\n\n const adoRepoCollection = await input({\n message: 'Default Azure DevOps collection for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoProject = await input({\n message: 'Default Azure DevOps project for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoRepo = await input({\n message: 'Default Azure DevOps repo name for this repo (leave blank to auto-detect):',\n default: ''\n });\n\n const confirmed = await confirm({\n message: 'Write config to .pncli.json in repo root?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exitCode = ExitCode.SUCCESS;\n return;\n }\n\n // Warn if .pncli.json already exists\n if (fs.existsSync('.pncli.json')) {\n const overwrite = await confirm({\n message: '.pncli.json already exists. Overwrite?',\n default: false\n });\n if (!overwrite) {\n process.stderr.write('Aborted.\\n');\n process.exitCode = ExitCode.SUCCESS;\n return;\n }\n }\n\n writeRepoConfig({\n defaults: {\n jira: {\n project: jiraProject || undefined,\n issueType: jiraIssueType || undefined,\n priority: jiraPriority || undefined\n },\n bitbucket: {\n targetBranch: targetBranch || undefined\n },\n ...(adoRepoCollection || adoRepoProject || adoRepoRepo ? {\n ado: {\n collection: adoRepoCollection || undefined,\n project: adoRepoProject || undefined,\n repo: adoRepoRepo || undefined\n }\n } : {})\n }\n });\n\n success({ written: '.pncli.json' }, 'config', 'init', start);\n}\n","import { readFileSync } from 'fs';\nimport { basename } from 'path';\nimport type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoWorkItem,\n AdoWorkItemComment,\n AdoWorkItemType,\n AdoWorkItemTypeState,\n AdoField,\n AdoWiqlResult,\n AdoPageResponse,\n AdoWorkItemAttachment,\n AdoClassificationNode\n} from '../../../types/ado.js';\n\nconst API = '7.1';\nconst API_PREVIEW = '7.1-preview.4';\n\nexport interface JsonPatchOp {\n op: 'add' | 'replace' | 'remove';\n path: string;\n value?: unknown;\n}\n\nexport class AdoWorkClient {\n constructor(private http: HttpClient) {}\n\n async getWorkItem(collection: string, id: number): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}&$expand=all`\n );\n }\n\n async createWorkItem(\n collection: string,\n project: string,\n type: string,\n patch: JsonPatchOp[]\n ): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitems/${encodeURIComponent('$' + type)}?api-version=${API}`,\n { method: 'POST', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async updateWorkItem(collection: string, id: number, patch: JsonPatchOp[]): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}`,\n { method: 'PATCH', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async queryWiql(collection: string, project: string, wiql: string): Promise<AdoWiqlResult> {\n return this.http.ado<AdoWiqlResult>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/wiql?api-version=${API}`,\n { method: 'POST', body: { query: wiql } }\n );\n }\n\n async listComments(collection: string, project: string, workItemId: number): Promise<AdoWorkItemComment[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemComment>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`\n );\n return result.value ?? [];\n }\n\n async addComment(collection: string, project: string, workItemId: number, text: string): Promise<AdoWorkItemComment> {\n return this.http.ado<AdoWorkItemComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`,\n { method: 'POST', body: { text } }\n );\n }\n\n async addTags(collection: string, id: number, tags: string[]): Promise<AdoWorkItem> {\n const item = await this.getWorkItem(collection, id);\n const existing = ((item.fields as Record<string, unknown>)['System.Tags'] as string | undefined) ?? '';\n const current = existing.split(';').map(t => t.trim()).filter(Boolean);\n const lowerSet = new Set(current.map(t => t.toLowerCase()));\n const toAdd = tags.filter(t => !lowerSet.has(t.toLowerCase()));\n const merged = [...current, ...toAdd];\n const patch: JsonPatchOp[] = [{ op: 'add', path: '/fields/System.Tags', value: merged.join('; ') }];\n return this.updateWorkItem(collection, id, patch);\n }\n\n async removeTags(collection: string, id: number, tags: string[]): Promise<AdoWorkItem> {\n const item = await this.getWorkItem(collection, id);\n const existing = ((item.fields as Record<string, unknown>)['System.Tags'] as string | undefined) ?? '';\n const lower = new Set(tags.map(t => t.toLowerCase()));\n const remaining = existing.split(';').map(t => t.trim()).filter(t => t && !lower.has(t.toLowerCase()));\n const patch: JsonPatchOp[] = [{ op: 'add', path: '/fields/System.Tags', value: remaining.join('; ') }];\n return this.updateWorkItem(collection, id, patch);\n }\n\n async listWorkItemTypes(collection: string, project: string): Promise<AdoWorkItemType[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemType>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeStates(collection: string, project: string, type: string): Promise<AdoWorkItemTypeState[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemTypeState>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/states?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listFields(collection: string, project?: string): Promise<AdoField[]> {\n const scope = project\n ? `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}`\n : `/${encodeURIComponent(collection)}`;\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `${scope}/_apis/wit/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeFields(collection: string, project: string, type: string): Promise<AdoField[]> {\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listAttachments(collection: string, workItemId: number): Promise<AdoWorkItemAttachment[]> {\n const item = await this.getWorkItem(collection, workItemId);\n return (item.relations ?? [])\n .filter(r => r.rel === 'AttachedFile')\n .map(r => {\n const attrs = (r.attributes ?? {}) as Record<string, unknown>;\n return {\n id: new URL(r.url).pathname.split('/').pop() ?? '',\n name: String(attrs['name'] ?? ''),\n url: r.url,\n comment: attrs['comment'] !== undefined ? String(attrs['comment']) : undefined,\n resourceSize: typeof attrs['resourceSize'] === 'number' ? attrs['resourceSize'] : undefined,\n resourceCreatedDate: attrs['resourceCreatedDate'] !== undefined ? String(attrs['resourceCreatedDate']) : undefined,\n resourceModifiedDate: attrs['resourceModifiedDate'] !== undefined ? String(attrs['resourceModifiedDate']) : undefined\n };\n });\n }\n\n async downloadAttachment(absoluteUrl: string): Promise<Buffer> {\n return this.http.adoBuffer(absoluteUrl);\n }\n\n async listAreas(collection: string, project: string, depth = 10): Promise<AdoClassificationNode> {\n return this.http.ado<AdoClassificationNode>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/classificationnodes/areas?$depth=${depth}&api-version=${API}`\n );\n }\n\n async listIterations(collection: string, project: string, depth = 10): Promise<AdoClassificationNode> {\n return this.http.ado<AdoClassificationNode>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/classificationnodes/iterations?$depth=${depth}&api-version=${API}`\n );\n }\n\n async uploadAttachment(\n collection: string,\n workItemId: number,\n filePath: string,\n comment?: string\n ): Promise<AdoWorkItemAttachment> {\n const fileContent = readFileSync(filePath);\n const fileName = basename(filePath);\n\n // Step 1: Upload the file to ADO's attachment store.\n // ADO's /_apis/wit/attachments endpoint only accepts application/octet-stream\n // for file uploads — sending any other content type (e.g. text/plain) returns HTTP 400.\n const attachment = await this.http.adoUpload<AdoWorkItemAttachment>(\n `/${encodeURIComponent(collection)}/_apis/wit/attachments?fileName=${encodeURIComponent(fileName)}&api-version=${API}`,\n fileContent,\n 'application/octet-stream'\n );\n\n // Step 2: Link the uploaded attachment to the work item\n const relationValue: Record<string, unknown> = {\n rel: 'AttachedFile',\n url: attachment.url,\n ...(comment ? { attributes: { comment } } : {})\n };\n await this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${workItemId}?api-version=${API}`,\n { method: 'PATCH', body: [{ op: 'add', path: '/relations/-', value: relationValue }], headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n\n return attachment;\n }\n}\n","import type { AdoWorkClient } from './client/work.js';\nimport type { AdoFieldMeta, AdoWorkItemTypeMeta } from '../../types/config.js';\n\n/**\n * Discovers all work item fields in the collection and maps them to AdoFieldMeta.\n */\nexport async function discoverFields(\n client: AdoWorkClient,\n collection: string,\n project?: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listFields(collection, project);\n return fields.map(toFieldMeta);\n}\n\n/**\n * Discovers fields scoped to a specific work item type.\n */\nexport async function discoverTypeFields(\n client: AdoWorkClient,\n collection: string,\n project: string,\n type: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listTypeFields(collection, project, type);\n return fields.map(toFieldMeta);\n}\n\nfunction toFieldMeta(f: { referenceName: string; name: string; type: string; readOnly?: boolean; picklistId?: string }): AdoFieldMeta {\n return {\n referenceName: f.referenceName,\n name: f.name,\n type: f.type,\n readOnly: f.readOnly,\n ...(f.picklistId ? { picklistId: f.picklistId } : {})\n };\n}\n\n/**\n * Discovers all work item types and their valid states per type.\n */\nexport async function discoverTypes(\n client: AdoWorkClient,\n collection: string,\n project: string\n): Promise<AdoWorkItemTypeMeta[]> {\n const types = await client.listWorkItemTypes(collection, project);\n const result: AdoWorkItemTypeMeta[] = [];\n\n for (const t of types) {\n const states = await client.listTypeStates(collection, project, t.name);\n const requiredFields = (t.fields ?? [])\n .filter(f => f.alwaysRequired)\n .map(f => f.referenceName);\n result.push({\n name: t.name,\n states: states.map(s => s.name),\n requiredFields\n });\n }\n\n return result;\n}\n\n/**\n * Candidate friendly-name → reference-name pairs for the most common ADO work item fields.\n * Shared by buildDefaultAliases (filtered to fields actually discovered for a project/process)\n * and by helpers.ts's DEFAULT_ADO_FIELD_ALIASES fallback (used before any `--save` discovery\n * has run, so common fields like Description/Acceptance Criteria resolve out of the box).\n */\nexport const ADO_FIELD_ALIAS_CANDIDATES: Array<[string, string]> = [\n ['title', 'System.Title'],\n ['state', 'System.State'],\n ['assignedto', 'System.AssignedTo'],\n ['assigned-to', 'System.AssignedTo'],\n ['description', 'System.Description'],\n ['areapath', 'System.AreaPath'],\n ['area-path', 'System.AreaPath'],\n ['iterationpath', 'System.IterationPath'],\n ['iteration', 'System.IterationPath'],\n ['tags', 'System.Tags'],\n ['priority', 'Microsoft.VSTS.Common.Priority'],\n ['severity', 'Microsoft.VSTS.Common.Severity'],\n ['effort', 'Microsoft.VSTS.Scheduling.Effort'],\n ['storypoints', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['story-points', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['remainingwork', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['remaining', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['acceptancecriteria', 'Microsoft.VSTS.Common.AcceptanceCriteria'],\n ['reprosteps', 'Microsoft.VSTS.TCM.ReproSteps'],\n ['foundinsource', 'Microsoft.VSTS.Build.FoundIn']\n];\n\n/**\n * Generates a default alias map for the most common field reference names.\n * Only includes aliases for fields actually present in the discovered set.\n */\nexport function buildDefaultAliases(fields: AdoFieldMeta[]): Record<string, string> {\n const refNames = new Set(fields.map(f => f.referenceName));\n\n const aliases: Record<string, string> = {};\n for (const [alias, ref] of ADO_FIELD_ALIAS_CANDIDATES) {\n if (refNames.has(ref)) {\n aliases[alias] = ref;\n }\n }\n return aliases;\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoGitRepo,\n AdoPullRequest,\n AdoPRThread,\n AdoPRComment,\n AdoPRCompletionOptions,\n AdoGitChange,\n AdoGitDiff,\n AdoGitStatus,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoGitClient {\n constructor(private http: HttpClient) {}\n\n // ── Repositories ──────────────────────────────────────────────────\n\n async listRepos(collection: string, project: string): Promise<AdoGitRepo[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitRepo>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getRepo(collection: string, project: string, repoId: string): Promise<AdoGitRepo> {\n return this.http.ado<AdoGitRepo>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repoId)}?api-version=${API}`\n );\n }\n\n async createRepo(collection: string, project: string, name: string): Promise<AdoGitRepo> {\n return this.http.ado<AdoGitRepo>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories?api-version=${API}`,\n { method: 'POST', body: { name } }\n );\n }\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n async listPRs(\n collection: string,\n project: string,\n repo: string,\n opts: { status?: string; creatorAlias?: string; reviewerAlias?: string } = {}\n ): Promise<AdoPullRequest[]> {\n return this.http.adoPaginate<AdoPullRequest>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n 'searchCriteria.status': opts.status ?? 'active',\n ...(opts.creatorAlias ? { 'searchCriteria.creatorId': opts.creatorAlias } : {}),\n ...(opts.reviewerAlias ? { 'searchCriteria.reviewerId': opts.reviewerAlias } : {}),\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests`,\n { params }\n ) as Promise<{ data: { value: AdoPullRequest[] }; headers: Headers }>;\n });\n }\n\n async getPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`\n );\n }\n\n async createPR(\n collection: string,\n project: string,\n repo: string,\n body: {\n title: string;\n description?: string;\n sourceRefName: string;\n targetRefName: string;\n reviewers?: Array<{ id: string }>;\n isDraft?: boolean;\n }\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async updatePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: Partial<{ title: string; description: string; reviewers: Array<{ id: string }>; isDraft: boolean }>\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body }\n );\n }\n\n async completePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n lastMergeSourceCommit: string,\n completionOptions: AdoPRCompletionOptions\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n {\n method: 'PATCH',\n body: {\n status: 'completed',\n lastMergeSourceCommit: { commitId: lastMergeSourceCommit },\n completionOptions\n }\n }\n );\n }\n\n async abandonPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'abandoned' } }\n );\n }\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n async setPRVote(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n reviewerId: string,\n vote: number\n ): Promise<unknown> {\n return this.http.ado<unknown>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/reviewers/${encodeURIComponent(reviewerId)}?api-version=${API}`,\n { method: 'PUT', body: { vote } }\n );\n }\n\n async listReviewers(collection: string, project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(collection, project, repo, prId);\n return pr.reviewers;\n }\n\n // ── Threads / Comments ────────────────────────────────────────────\n\n async listThreads(collection: string, project: string, repo: string, prId: number): Promise<AdoPRThread[]> {\n const result = await this.http.ado<AdoPageResponse<AdoPRThread>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async createThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: {\n comments: Array<{ content: string; commentType?: string }>;\n status?: string;\n threadContext?: {\n filePath: string;\n rightFileStart?: { line: number; offset: number };\n rightFileEnd?: { line: number; offset: number };\n leftFileStart?: { line: number; offset: number };\n leftFileEnd?: { line: number; offset: number };\n };\n }\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async addCommentToThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n content: string\n ): Promise<AdoPRComment> {\n return this.http.ado<AdoPRComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments?api-version=${API}`,\n { method: 'POST', body: { content, commentType: 'text' } }\n );\n }\n\n async updateThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n status: string\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}?api-version=${API}`,\n { method: 'PATCH', body: { status } }\n );\n }\n\n async deleteComment(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n commentId: number\n ): Promise<void> {\n await this.http.ado<void>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments/${commentId}?api-version=${API}`,\n { method: 'DELETE' }\n );\n }\n\n // ── Diffs / Files ─────────────────────────────────────────────────\n\n async getPRDiff(collection: string, project: string, repo: string, prId: number): Promise<AdoGitDiff> {\n const pr = await this.getPR(collection, project, repo, prId);\n const sourceCommit = pr.lastMergeSourceCommit?.commitId;\n const targetCommit = pr.lastMergeTargetCommit?.commitId;\n if (!sourceCommit || !targetCommit) return { changes: [], aheadCount: 0, behindCount: 0 };\n return this.http.ado<AdoGitDiff>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/diffs/commits?baseVersion=${encodeURIComponent(targetCommit)}&baseVersionType=commit&targetVersion=${encodeURIComponent(sourceCommit)}&targetVersionType=commit&api-version=${API}`\n );\n }\n\n async getCommitStatuses(collection: string, project: string, repo: string, commitId: string): Promise<AdoGitStatus[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitStatus>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/commits/${encodeURIComponent(commitId)}/statuses?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listPRChanges(collection: string, project: string, repo: string, prId: number): Promise<AdoGitChange[]> {\n const iterations = await this.http.ado<AdoPageResponse<{ id: number }>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations?api-version=${API}`\n );\n // Get the latest iteration then its changes\n const latestId = (iterations.value ?? []).at(-1)?.id;\n if (!latestId) return [];\n const changes = await this.http.ado<{ changeEntries?: AdoGitChange[] }>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations/${latestId}/changes?api-version=${API}`\n );\n return changes.changeEntries ?? [];\n }\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoBuildDefinition,\n AdoBuild,\n AdoBuildLog,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoBuildClient {\n constructor(private http: HttpClient) {}\n\n // ── Definitions ───────────────────────────────────────────────────\n\n async listDefinitions(collection: string, project: string): Promise<AdoBuildDefinition[]> {\n return this.http.adoPaginate<AdoBuildDefinition>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions`,\n { params }\n ) as Promise<{ data: { value: AdoBuildDefinition[] }; headers: Headers }>;\n });\n }\n\n async getDefinition(collection: string, project: string, id: number): Promise<AdoBuildDefinition> {\n return this.http.ado<AdoBuildDefinition>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions/${id}?api-version=${API}`\n );\n }\n\n // ── Builds (runs) ─────────────────────────────────────────────────\n\n async queueBuild(\n collection: string,\n project: string,\n definitionId: number,\n opts: { sourceBranch?: string; parameters?: string } = {}\n ): Promise<AdoBuild> {\n const body: Record<string, unknown> = {\n definition: { id: definitionId },\n ...(opts.sourceBranch ? { sourceBranch: opts.sourceBranch } : {}),\n ...(opts.parameters ? { parameters: opts.parameters } : {})\n };\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async listBuilds(\n collection: string,\n project: string,\n opts: { definitionIds?: number[]; branchName?: string; statusFilter?: string; top?: number } = {}\n ): Promise<AdoBuild[]> {\n const baseParams: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(opts.definitionIds?.length ? { definitions: opts.definitionIds.join(',') } : {}),\n ...(opts.branchName ? { branchName: opts.branchName } : {}),\n ...(opts.statusFilter ? { statusFilter: opts.statusFilter } : {}),\n ...(opts.top ? { '$top': opts.top } : {})\n };\n\n // When top is specified, use a single request so the API-level $top limit is\n // honoured exactly. adoPaginate follows continuation tokens and can return far\n // more items than requested.\n if (opts.top) {\n const { data } = await this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds`,\n { params: baseParams }\n ) as { data: { value: AdoBuild[] }; headers: Headers };\n return (data.value ?? []).slice(0, opts.top);\n }\n\n return this.http.adoPaginate<AdoBuild>(async (token) => {\n const params = { ...baseParams, ...(token ? { continuationToken: token } : {}) };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds`,\n { params }\n ) as Promise<{ data: { value: AdoBuild[] }; headers: Headers }>;\n });\n }\n\n async getBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`\n );\n }\n\n async cancelBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'cancelling' } }\n );\n }\n\n // ── Logs ──────────────────────────────────────────────────────────\n\n async listLogs(collection: string, project: string, buildId: number): Promise<AdoBuildLog[]> {\n const result = await this.http.ado<AdoPageResponse<AdoBuildLog>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getLog(collection: string, project: string, buildId: number, logId: number): Promise<string> {\n return this.http.adoText(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs/${logId}?api-version=${API}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { log } from '../../lib/output.js';\nimport { resolveAtFileRef } from '../../lib/input.js';\nimport { ADO_FIELD_ALIAS_CANDIDATES } from './discovery.js';\nimport { AdoCoreClient } from './client/core.js';\nimport { AdoWorkClient } from './client/work.js';\nimport { AdoGitClient } from './client/git.js';\nimport { AdoBuildClient } from './client/build.js';\nimport type { JsonPatchOp } from './client/work.js';\nimport type { AdoBuild } from '../../types/ado.js';\n\nexport interface AdoContext {\n collection: string;\n project: string;\n repo: string;\n coreClient: AdoCoreClient;\n workClient: AdoWorkClient;\n gitClient: AdoGitClient;\n buildClient: AdoBuildClient;\n}\n\n/**\n * Resolves ADO (collection, project, repo) from CLI flags → git remote → config defaults.\n * Mirrors the getClient() helper in bitbucket/commands.ts.\n */\nexport function getAdoContext(program: Command, requireRepo = false): AdoContext {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const ctx = getGitContext(config);\n\n const collection: string =\n opts.collection ?? opts.organization ??\n ctx?.ado?.collection ??\n config.defaults.ado?.collection ?? '';\n\n const project: string =\n opts.project ??\n ctx?.ado?.project ??\n config.defaults.ado?.project ?? '';\n\n const repo: string =\n opts.repo ??\n ctx?.ado?.repo ??\n config.defaults.ado?.repo ?? '';\n\n if (!collection) {\n throw new PncliError(\n 'Could not determine Azure DevOps collection. Pass --collection, or run pncli config init.',\n 1\n );\n }\n\n if (!project) {\n throw new PncliError(\n 'Could not determine Azure DevOps project. Pass --project, or run pncli config init.',\n 1\n );\n }\n\n if (requireRepo && !repo) {\n throw new PncliError(\n 'Could not determine Azure DevOps repo. Pass --repo, or run from inside a checked-out ADO repo.',\n 1\n );\n }\n\n return {\n collection,\n project,\n repo,\n coreClient: new AdoCoreClient(http),\n workClient: new AdoWorkClient(http),\n gitClient: new AdoGitClient(http),\n buildClient: new AdoBuildClient(http)\n };\n}\n\n// ── Field helpers ─────────────────────────────────────────────────────\n\n/**\n * Parses repeated --field name=value arguments into a Record.\n * Accepts \"name=value\" strings (split on first =). Throws on missing `=`.\n */\nexport function parseFieldArgs(fields: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const f of fields) {\n const eq = f.indexOf('=');\n if (eq <= 0) throw new PncliError(`Invalid --field value \"${f}\". Expected format: name=value`, 1);\n result[f.slice(0, eq)] = f.slice(eq + 1);\n }\n return result;\n}\n\nconst stripSeparators = (s: string): string => s.toLowerCase().replace(/[\\s-]+/g, '');\n\n/**\n * Built-in fallback for the handful of near-universal ADO fields (Description, Acceptance\n * Criteria, Priority, ...), used when a key isn't in the user's saved fieldAliases (i.e.\n * `pncli ado work fields --save` hasn't been run yet). This is what lets Description /\n * Acceptance Criteria work out of the box via --field or --input-file without requiring\n * discovery first; a project whose process doesn't have a given field will simply get a\n * clear 400 from the ADO API, same as passing any other wrong field id.\n */\nconst DEFAULT_ADO_FIELD_ALIASES: Record<string, string> = Object.fromEntries(ADO_FIELD_ALIAS_CANDIDATES);\n\n/**\n * Resolves field keys against the loaded alias map, then builds JSON Patch ops.\n * If a key is in fieldAliases → use the reference name. Otherwise use the key as-is.\n * Falls back to a case/space/dash-insensitive alias match (aliases — both the user's saved\n * ones and the built-in defaults — are typically stored space/dash-free, e.g.\n * \"acceptancecriteria\"), so a human-friendly \"Acceptance Criteria\" key from --field or\n * --input-file still resolves without the caller needing to know that.\n */\nexport function buildFieldPatch(\n fields: Record<string, unknown>,\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n const aliases = { ...DEFAULT_ADO_FIELD_ALIASES, ...fieldAliases };\n return Object.entries(fields).map(([key, value]) => {\n let refName: string | undefined = aliases[key.toLowerCase()] ?? aliases[key];\n if (!refName) {\n const target = stripSeparators(key);\n const match = Object.entries(aliases).find(([aliasKey]) => stripSeparators(aliasKey) === target);\n refName = match?.[1];\n }\n return { op: 'add' as const, path: `/fields/${refName ?? key}`, value };\n });\n}\n\n/** Convenience: parse --field args and immediately build the patch ops. */\nexport function fieldArgsToPatch(\n fieldArgs: string[],\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n return buildFieldPatch(parseFieldArgs(fieldArgs), fieldAliases);\n}\n\nconst BUILTIN_WORK_FIELD_KEYS = new Set(['title', 'description', 'assignee', 'assignedto', 'priority']);\n\n/**\n * Splits a --input-file `fields` dictionary into the small set of built-in work item\n * fields work-create/work-update expose as their own flags (title, description, assignee,\n * priority) and everything else. Non-builtin keys (e.g. \"Acceptance Criteria\", or a raw\n * reference name like \"Microsoft.VSTS.Common.AcceptanceCriteria\") are left as-is — they\n * already resolve generically through fieldAliases (see buildFieldPatch), so no custom\n * field needs to be pre-registered in config to be usable here. Resolves `@file` value\n * references (see resolveAtFileRef) on every value.\n */\nexport function splitWorkFieldsDictionary(\n fields: Record<string, unknown>\n): { builtin: Record<string, unknown>; custom: Record<string, unknown> } {\n const builtin: Record<string, unknown> = {};\n const custom: Record<string, unknown> = {};\n for (const [rawKey, rawValue] of Object.entries(fields)) {\n const value = resolveAtFileRef(rawValue);\n const key = rawKey.toLowerCase().replace(/\\s+/g, '');\n if (BUILTIN_WORK_FIELD_KEYS.has(key)) {\n builtin[key === 'assignedto' ? 'assignee' : key] = value;\n } else {\n custom[rawKey] = value;\n }\n }\n return { builtin, custom };\n}\n\n// ── Vote constants ────────────────────────────────────────────────────\n\nexport const PR_VOTE = {\n APPROVE: 10,\n APPROVE_WITH_SUGGESTIONS: 5,\n NO_VOTE: 0,\n WAIT_FOR_AUTHOR: -5,\n REJECT: -10\n} as const;\n\n// ── Build polling ─────────────────────────────────────────────────────\n\nconst TERMINAL_STATUSES = new Set(['completed']);\n\nexport function isBuildTerminal(build: AdoBuild): boolean {\n return TERMINAL_STATUSES.has(build.status);\n}\n\nexport interface PollOpts {\n timeoutSec: number;\n pollSec: number;\n}\n\n/**\n * Polls fetchStatus() until isTerminal() returns true or timeout is reached.\n * Progress lines emitted via log() (verbose-only stderr); stdout stays clean.\n */\nexport async function pollUntilTerminal<T>(\n fetchStatus: () => Promise<T>,\n isTerminal: (s: T) => boolean,\n opts: PollOpts\n): Promise<T> {\n const deadline = Date.now() + opts.timeoutSec * 1000;\n let status = await fetchStatus();\n\n while (!isTerminal(status)) {\n if (Date.now() >= deadline) {\n throw new PncliError(\n `Timed out waiting for completion after ${opts.timeoutSec}s`,\n 1\n );\n }\n log(`Waiting ${opts.pollSec}s...`);\n await new Promise(resolve => setTimeout(resolve, opts.pollSec * 1000));\n status = await fetchStatus();\n }\n\n return status;\n}\n","import { Command } from 'commander';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoProjectCommands(ado: Command): void {\n const project = ado\n .command('project')\n .description('Azure DevOps project and collection operations');\n\n project\n .command('list-collections')\n .description('List all project collections on the server')\n .action(async () => {\n const start = Date.now();\n try {\n const { coreClient } = getAdoContext(ado);\n const data = await coreClient.listCollections();\n success(data, 'ado', 'project-list-collections', start);\n } catch (err) { fail(err, 'ado', 'project-list-collections', start); }\n });\n\n project\n .command('list')\n .description('List team projects in a collection')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.listProjects(collection);\n success(data, 'ado', 'project-list', start);\n } catch (err) { fail(err, 'ado', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a team project by name')\n .requiredOption('--name <project>', 'Project name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getProject(collection, opts.name);\n success(data, 'ado', 'project-get', start);\n } catch (err) { fail(err, 'ado', 'project-get', start); }\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { Command } from 'commander';\nimport { getAdoContext, buildFieldPatch, parseFieldArgs, splitWorkFieldsDictionary } from '../helpers.js';\nimport { discoverFields, discoverTypeFields, discoverTypes, buildDefaultAliases } from '../discovery.js';\nimport { ADO_WORK_INPUT_FILE_SCHEMA, ADO_WORK_INPUT_FILE_EXAMPLE } from '../input-schema.js';\nimport { success, fail, warn, writeRawOutput } from '../../../lib/output.js';\nimport { loadConfig, getGlobalConfigPath } from '../../../lib/config.js';\nimport { PncliError } from '../../../lib/errors.js';\nimport { readJsonInputFile, mergeWithOverrides, resolveAtFileRef } from '../../../lib/input.js';\n\n/** Shape of the JSON accepted by --input-file on work create / update. */\ninterface WorkItemJsonInput {\n type?: string;\n fields?: Record<string, unknown>;\n}\n\nexport function registerAdoWorkCommands(ado: Command): void {\n const work = ado\n .command('work')\n .description('Azure DevOps work item operations');\n\n // ── Get ───────────────────────────────────────────────────────────\n\n work\n .command('get')\n .description('Get a work item by ID')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.getWorkItem(collection, parseInt(opts.id, 10));\n success(data, 'ado', 'work-get', start);\n } catch (err) { fail(err, 'ado', 'work-get', start); }\n });\n\n // ── Create ────────────────────────────────────────────────────────\n\n work\n .command('create')\n .description('Create a work item')\n .option('--type <type>', 'Work item type (e.g. Bug, Task, User Story) (required, unless supplied via --input-file)')\n .option('--title <title>', 'Work item title (required, unless supplied via --input-file)')\n .option('--description <text>', 'Description')\n .option('--assignee <user>', 'Assigned to (display name or email)')\n .option('--priority <n>', 'Priority (1-4)')\n .option('--parent <id>', 'Parent work item ID — creates a parent link after creation')\n .option('--field <name=value>', 'Additional field (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--input-file <path>', \"JSON file describing the work item ({ type, fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli ado work schema\")\n .action(async (opts: { type?: string; title?: string; description?: string; assignee?: string; priority?: string; parent?: string; field: string[]; inputFile?: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, project, workClient } = getAdoContext(ado);\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as WorkItemJsonInput) : undefined;\n const { builtin: jsonBuiltin, custom: jsonCustom } = jsonInput?.fields\n ? splitWorkFieldsDictionary(jsonInput.fields)\n : { builtin: {}, custom: {} };\n\n const type = opts.type ?? jsonInput?.type;\n if (!type) throw new PncliError('--type required (or \"type\" in --input-file)', 1);\n\n const flagBuiltin: Record<string, unknown> = {\n ...(opts.title !== undefined ? { title: opts.title } : {}),\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.assignee !== undefined ? { assignee: opts.assignee } : {}),\n ...(opts.priority !== undefined ? { priority: opts.priority } : {})\n };\n const { merged: builtinFields, overrides: builtinOverrides } = mergeWithOverrides(jsonBuiltin, flagBuiltin);\n if (!builtinFields.title) throw new PncliError('--title required (or \"fields.Title\" in --input-file)', 1);\n\n const flagCustom = parseFieldArgs(opts.field);\n const { merged: customFields, overrides: customOverrides } = mergeWithOverrides(jsonCustom, flagCustom);\n\n const overrides = [...builtinOverrides, ...customOverrides];\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n // Empty-string flag values (e.g. an unset shell variable interpolated into --description \"\")\n // are treated as \"not provided\", matching the pre-existing CLI-only behavior — only undefined\n // and '' are filtered here, so a legitimate falsy JSON value like priority: 0 still passes.\n const hasContent = (v: unknown): boolean => v !== undefined && v !== '';\n const builtIn: Record<string, unknown> = {\n 'System.Title': builtinFields.title,\n ...(hasContent(builtinFields.description) ? { 'System.Description': builtinFields.description } : {}),\n ...(hasContent(builtinFields.assignee) ? { 'System.AssignedTo': builtinFields.assignee } : {}),\n ...(hasContent(builtinFields.priority) ? { 'Microsoft.VSTS.Common.Priority': builtinFields.priority } : {})\n };\n const extra = buildFieldPatch(customFields, config.ado.fieldAliases);\n const patch = [\n ...Object.entries(builtIn).map(([k, v]) => ({ op: 'add' as const, path: `/fields/${k}`, value: v })),\n ...extra\n ];\n const data = await workClient.createWorkItem(collection, project, type, patch);\n success(data, 'ado', 'work-create', start, overrides);\n if (opts.parent) {\n try {\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.parent}`;\n const linkPatch = [{ op: 'add' as const, path: '/relations/-', value: { rel: 'System.LinkTypes.Hierarchy-Reverse', url: targetUrl } }];\n await workClient.updateWorkItem(collection, data.id, linkPatch);\n } catch (linkErr) {\n warn(`Created #${data.id} but failed to link to parent ${opts.parent}: ${linkErr instanceof Error ? linkErr.message : linkErr}`);\n }\n }\n return;\n } catch (err) { fail(err, 'ado', 'work-create', start); }\n });\n\n // ── Update ────────────────────────────────────────────────────────\n\n work\n .command('update')\n .description('Update a work item field')\n .requiredOption('--id <n>', 'Work item ID')\n .option('--field <name=value>', 'Field to update (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--input-file <path>', \"JSON file describing fields to update ({ fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli ado work schema\")\n .action(async (opts: { id: string; field: string[]; inputFile?: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as WorkItemJsonInput) : undefined;\n // No builtin/custom split here (update has no dedicated --title/--description flags —\n // everything flows through --field), but @file refs still need resolving.\n const jsonFields = jsonInput?.fields\n ? Object.fromEntries(Object.entries(jsonInput.fields).map(([k, v]) => [k, resolveAtFileRef(v)]))\n : {};\n const flagFields = parseFieldArgs(opts.field);\n const { merged, overrides } = mergeWithOverrides(jsonFields, flagFields);\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n const patch = buildFieldPatch(merged, config.ado.fieldAliases);\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-update', start, overrides);\n } catch (err) { fail(err, 'ado', 'work-update', start); }\n });\n\n // ── Transition (wrapper over update for System.State) ─────────────\n\n work\n .command('transition')\n .description('Set the state of a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--state <state>', 'New state (e.g. Active, Resolved, Closed)')\n .action(async (opts: { id: string; state: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.State', value: opts.state }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-transition', start);\n } catch (err) { fail(err, 'ado', 'work-transition', start); }\n });\n\n // ── Assign ────────────────────────────────────────────────────────\n\n work\n .command('assign')\n .description('Assign a work item to a user')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--to <user>', 'User display name or email')\n .action(async (opts: { id: string; to: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.AssignedTo', value: opts.to }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-assign', start);\n } catch (err) { fail(err, 'ado', 'work-assign', start); }\n });\n\n // ── Link ──────────────────────────────────────────────────────────\n\n work\n .command('link')\n .description('Link two work items')\n .requiredOption('--id <a>', 'Source work item ID')\n .requiredOption('--to <b>', 'Target work item ID')\n .option('--type <rel>', 'Link type (related|parent|child|duplicate|duplicate-of)', 'related')\n .action(async (opts: { id: string; to: string; type: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n // AzDO rel strings\n const relMap: Record<string, string> = {\n related: 'System.LinkTypes.Related',\n parent: 'System.LinkTypes.Hierarchy-Reverse',\n child: 'System.LinkTypes.Hierarchy-Forward',\n duplicate: 'System.LinkTypes.Duplicate-Forward',\n 'duplicate-of': 'System.LinkTypes.Duplicate-Reverse'\n };\n const rel = relMap[opts.type] ?? opts.type;\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.to}`;\n const patch = [{ op: 'add' as const, path: '/relations/-', value: { rel, url: targetUrl } }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-link', start);\n } catch (err) { fail(err, 'ado', 'work-link', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────\n\n work\n .command('search')\n .description('Run a WIQL query (consider --output-file for large results)')\n .requiredOption('--wiql <query>', 'WIQL query string')\n .action(async (opts: { wiql: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.queryWiql(collection, project, opts.wiql);\n success(data, 'ado', 'work-search', start);\n } catch (err) { fail(err, 'ado', 'work-search', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────\n\n work\n .command('list-comments')\n .description('List comments on a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listComments(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'work-list-comments', start);\n } catch (err) { fail(err, 'ado', 'work-list-comments', start); }\n });\n\n work\n .command('add-comment')\n .description('Add a comment to a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { id: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.addComment(collection, project, parseInt(opts.id, 10), opts.body);\n success(data, 'ado', 'work-add-comment', start);\n } catch (err) { fail(err, 'ado', 'work-add-comment', start); }\n });\n\n // ── Tags ──────────────────────────────────────────────────────────\n\n work\n .command('add-tag')\n .description('Add one or more tags to a work item (non-destructive)')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--tags <tags>', 'Semicolon- or comma-separated tags to add')\n .action(async (opts: { id: string; tags: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const tags = opts.tags.split(/[;,]/).map(t => t.trim()).filter(Boolean);\n const data = await workClient.addTags(collection, parseInt(opts.id, 10), tags);\n success(data, 'ado', 'work-add-tag', start);\n } catch (err) { fail(err, 'ado', 'work-add-tag', start); }\n });\n\n work\n .command('remove-tag')\n .description('Remove one or more tags from a work item (non-destructive)')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--tags <tags>', 'Semicolon- or comma-separated tags to remove')\n .action(async (opts: { id: string; tags: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const tags = opts.tags.split(/[;,]/).map(t => t.trim()).filter(Boolean);\n const data = await workClient.removeTags(collection, parseInt(opts.id, 10), tags);\n success(data, 'ado', 'work-remove-tag', start);\n } catch (err) { fail(err, 'ado', 'work-remove-tag', start); }\n });\n\n // ── Attachments ───────────────────────────────────────────────────\n\n work\n .command('list-attachments')\n .description('List attachments on a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.listAttachments(collection, parseInt(opts.id, 10));\n success(data, 'ado', 'work-list-attachments', start);\n } catch (err) { fail(err, 'ado', 'work-list-attachments', start); }\n });\n\n work\n .command('add-attachment')\n .description('Upload a local file and attach it to a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--file <path>', 'Path to the file to upload')\n .option('--comment <text>', 'Optional comment for the attachment')\n .action(async (opts: { id: string; file: string; comment?: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.uploadAttachment(collection, parseInt(opts.id, 10), opts.file, opts.comment);\n success(data, 'ado', 'work-add-attachment', start);\n } catch (err) { fail(err, 'ado', 'work-add-attachment', start); }\n });\n\n work\n .command('download-attachment')\n .description('Download a work item attachment to .pncli/ (or --dir)')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--attachment-id <guid>', 'Attachment ID from work list-attachments output')\n .option('--dir <path>', 'Output directory (default: .pncli relative to cwd)')\n .action(async (opts: { id: string; attachmentId: string; dir?: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const attachments = await workClient.listAttachments(collection, parseInt(opts.id, 10));\n const attachment = attachments.find(a => a.id === opts.attachmentId);\n if (!attachment) throw new PncliError(`Attachment not found: ${opts.attachmentId}`, 1);\n const outDir = opts.dir ?? path.join(process.cwd(), '.pncli');\n fs.mkdirSync(outDir, { recursive: true });\n const outPath = path.join(outDir, path.basename(attachment.name));\n const buffer = await workClient.downloadAttachment(attachment.url);\n fs.writeFileSync(outPath, buffer);\n success({ saved: outPath, name: attachment.name, size: buffer.length }, 'ado', 'work-download-attachment', start);\n } catch (err) { fail(err, 'ado', 'work-download-attachment', start); }\n });\n\n // ── Areas & Iterations ────────────────────────────────────────────\n\n work\n .command('list-areas')\n .description('List classification areas for the team project (tree)')\n .option('--depth <n>', 'Depth of the area tree to retrieve', '10')\n .action(async (opts: { depth: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listAreas(collection, project, parseInt(opts.depth, 10));\n success(data, 'ado', 'work-list-areas', start);\n } catch (err) { fail(err, 'ado', 'work-list-areas', start); }\n });\n\n work\n .command('list-iterations')\n .description('List classification iterations for the team project (tree), including start/finish dates')\n .option('--depth <n>', 'Depth of the iteration tree to retrieve', '10')\n .action(async (opts: { depth: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listIterations(collection, project, parseInt(opts.depth, 10));\n success(data, 'ado', 'work-list-iterations', start);\n } catch (err) { fail(err, 'ado', 'work-list-iterations', start); }\n });\n\n // ── Type / Field discovery ────────────────────────────────────────\n\n work\n .command('types')\n .description('List work item types in the project')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered types to ~/.pncli/config.json')\n .action(async (opts: { save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n const types = await discoverTypes(workClient, collection, project);\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n existing.ado = { ...(existing.ado ?? {}), discoveredTypes: types };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${types.length} types to ${globalConfigPath}`);\n }\n success(types, 'ado', 'work-types', start);\n } catch (err) { fail(err, 'ado', 'work-types', start); }\n });\n\n work\n .command('list-states')\n .description('List valid states for a work item type')\n .requiredOption('--type <type>', 'Work item type name (e.g. Bug)')\n .action(async (opts: { type: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listTypeStates(collection, project, opts.type);\n success(data, 'ado', 'work-list-states', start);\n } catch (err) { fail(err, 'ado', 'work-list-states', start); }\n });\n\n work\n .command('fields')\n .description('List work item fields available in the collection (consider --output-file for large results)')\n .option('--type <type>', 'Scope to fields for a specific work item type (e.g. Bug)')\n .option('--custom-only', 'Exclude System.* and Microsoft.VSTS.* fields')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered fields and aliases to ~/.pncli/config.json')\n .action(async (opts: { type?: string; customOnly?: boolean; save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n // Fetch full field list (used for alias generation and --save)\n const allFields = opts.type\n ? await discoverTypeFields(workClient, collection, project, opts.type)\n : await discoverFields(workClient, collection);\n // Apply --custom-only filter only to displayed/saved output\n const fields = opts.customOnly\n ? allFields.filter(f =>\n !f.referenceName.startsWith('System.') &&\n !f.referenceName.startsWith('Microsoft.VSTS.')\n )\n : allFields;\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n // Generate aliases from the full (unfiltered) set so System/VSTS aliases are included\n const aliases = buildDefaultAliases(allFields);\n existing.ado = { ...(existing.ado ?? {}), discoveredFields: allFields, fieldAliases: aliases };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${allFields.length} fields and ${Object.keys(aliases).length} aliases to ${globalConfigPath}`);\n }\n success(fields, 'ado', 'work-fields', start);\n } catch (err) { fail(err, 'ado', 'work-fields', start); }\n });\n\n work\n .command('schema')\n .description('Print the --input-file JSON schema and an example for work create/update')\n .option('--example-only', \"Print only the runnable example JSON (no envelope) — pipeable straight into --input-file\")\n .action((opts: { exampleOnly?: boolean }) => {\n const start = Date.now();\n if (opts.exampleOnly) {\n // Bypass the success() envelope: this output is meant to be redirected straight\n // into a file and passed to --input-file, so it must be the raw JSON, not {ok,data,meta}.\n writeRawOutput(JSON.stringify(ADO_WORK_INPUT_FILE_EXAMPLE, null, 2) + '\\n');\n return;\n }\n success({ schema: ADO_WORK_INPUT_FILE_SCHEMA, example: ADO_WORK_INPUT_FILE_EXAMPLE }, 'ado', 'work-schema', start);\n });\n}\n","/**\n * JSON Schema + example for the --input-file accepted by `ado work create` / `work update`.\n * Exposed at runtime via `pncli ado work schema` so callers can discover the shape without reading docs.\n */\nexport const ADO_WORK_INPUT_FILE_SCHEMA = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'pncli Azure DevOps work item input file',\n description:\n 'Shape accepted by --input-file on `pncli ado work create` / `work update`. ' +\n 'CLI flags (--title, --description, --priority, --field, ...) override matching keys here; ' +\n 'overridden keys are reported in meta.overrides.',\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Work item type, e.g. Bug, Task, User Story (create only)' },\n fields: {\n type: 'object',\n description:\n 'Field dictionary. Built-in keys (case-insensitive): title, description, assignee, priority. ' +\n 'Any other key (e.g. \"Acceptance Criteria\", or a raw reference name like ' +\n '\"Microsoft.VSTS.Common.AcceptanceCriteria\" or a custom \"MyOrg.SomeField\") resolves through ' +\n 'the fieldAliases saved by `pncli ado work fields --save`, falling back to the key itself — ' +\n 'custom fields never need to be pre-registered to be usable here. Any string value may be ' +\n '\"@path/to/file\" to read that field\\'s content from a file instead of inlining it (useful for ' +\n 'large rich-text fields like Description or Acceptance Criteria).',\n additionalProperties: true\n }\n },\n additionalProperties: false\n} as const;\n\nexport const ADO_WORK_INPUT_FILE_EXAMPLE = {\n type: 'Bug',\n fields: {\n Title: 'Login broken on Safari',\n Description: '@desc.html',\n 'Acceptance Criteria': '@ac.md',\n Priority: 2,\n 'MyOrg.SomeCustomField': 'x'\n }\n};\n","import { Command } from 'commander';\nimport { getAdoContext, PR_VOTE } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\nimport type { AdoPRThread, AdoPRComment } from '../../../types/ado.js';\n\n/** Flatten all comments across all threads into a sorted list with threadContext attached */\nfunction flattenThreadComments(\n threads: AdoPRThread[],\n filterInlineOnly: boolean,\n filterGeneralOnly: boolean\n): Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> {\n const flat: Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> = [];\n for (const thread of threads) {\n if (thread.isDeleted) continue;\n if (filterInlineOnly && !thread.threadContext) continue;\n if (filterGeneralOnly && thread.threadContext) continue;\n for (const comment of thread.comments) {\n if (comment.isDeleted) continue;\n flat.push({ ...comment, threadId: thread.id, threadContext: thread.threadContext ?? null });\n }\n }\n return flat.sort((a, b) => a.publishedDate.localeCompare(b.publishedDate));\n}\n\nexport function registerAdoRepoCommands(ado: Command): void {\n const repo = ado\n .command('repo')\n .description('Azure DevOps repository and pull request operations');\n\n // ── Repos ─────────────────────────────────────────────────────────\n\n repo\n .command('list')\n .description('List git repositories in the project')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, gitClient } = getAdoContext(ado);\n const data = await gitClient.listRepos(collection, project);\n success(data, 'ado', 'repo-list', start);\n } catch (err) { fail(err, 'ado', 'repo-list', start); }\n });\n\n repo\n .command('create')\n .description('Create a new git repository in the project')\n .requiredOption('--name <name>', 'Repository name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const { collection, project, gitClient } = getAdoContext(ado);\n const data = await gitClient.createRepo(collection, project, opts.name);\n success(data, 'ado', 'repo-create', start);\n } catch (err) { fail(err, 'ado', 'repo-create', start); }\n });\n\n repo\n .command('get')\n .description('Get a specific repository')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, repo: repoName, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getRepo(collection, project, repoName);\n success(data, 'ado', 'repo-get', start);\n } catch (err) { fail(err, 'ado', 'repo-get', start); }\n });\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n repo\n .command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: active|abandoned|completed|all', 'active')\n .option('--creator <alias>', 'Filter by creator')\n .option('--reviewer <alias>', 'Filter by reviewer')\n .action(async (opts: { state?: string; creator?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRs(collection, project, repo, {\n status: opts.state,\n creatorAlias: opts.creator,\n reviewerAlias: opts.reviewer\n });\n success(data, 'ado', 'repo-list-prs', start);\n } catch (err) { fail(err, 'ado', 'repo-list-prs', start); }\n });\n\n repo\n .command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-get-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-get-pr', start); }\n });\n\n repo\n .command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (default: main)', 'main')\n .option('--description <text>', 'PR description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs or display names')\n .option('--draft', 'Create as a draft pull request')\n .action(async (opts: { title: string; source: string; target: string; description?: string; reviewers?: string; draft?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : [];\n const data = await gitClient.createPR(collection, project, repo, {\n title: opts.title,\n description: opts.description,\n sourceRefName: `refs/heads/${opts.source}`,\n targetRefName: `refs/heads/${opts.target}`,\n reviewers,\n ...(opts.draft !== undefined ? { isDraft: opts.draft } : {})\n });\n success(data, 'ado', 'repo-create-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-create-pr', start); }\n });\n\n repo\n .command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <text>', 'New description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs')\n .option('--draft <bool>', 'Set draft status: true|false')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string; draft?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : undefined;\n const body: Record<string, unknown> = {};\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (reviewers) body.reviewers = reviewers;\n if (opts.draft !== undefined) body.isDraft = opts.draft === 'true';\n const data = await gitClient.updatePR(collection, project, repo, parseInt(opts.id, 10), body);\n success(data, 'ado', 'repo-update-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-update-pr', start); }\n });\n\n repo\n .command('merge-pr')\n .description('Complete (merge) a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--strategy <s>', 'Merge strategy: noFastForward|squash|rebase|rebaseMerge', 'noFastForward')\n .option('--delete-source', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy: string; deleteSource?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const prId = parseInt(opts.id, 10);\n const pr = await gitClient.getPR(collection, project, repo, prId);\n const data = await gitClient.completePR(\n collection, project, repo, prId,\n pr.lastMergeSourceCommit?.commitId ?? '',\n {\n mergeStrategy: opts.strategy as 'noFastForward' | 'squash' | 'rebase' | 'rebaseMerge',\n deleteSourceBranch: opts.deleteSource ?? false\n }\n );\n success(data, 'ado', 'repo-merge-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-merge-pr', start); }\n });\n\n repo\n .command('abandon-pr')\n .description('Abandon a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.abandonPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-abandon-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-abandon-pr', start); }\n });\n\n // ── Comments (threads) ────────────────────────────────────────────\n\n repo\n .command('list-comments')\n .description('List all comments on a pull request (general + inline)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general PR comments')\n .action(async (opts: { pr: string; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const threads = await gitClient.listThreads(collection, project, repo, parseInt(opts.pr, 10));\n const flat = flattenThreadComments(threads, opts.inlineOnly ?? false, opts.generalOnly ?? false);\n success(flat, 'ado', 'repo-list-comments', start);\n } catch (err) { fail(err, 'ado', 'repo-list-comments', start); }\n });\n\n repo\n .command('add-comment')\n .description('Add a general comment to a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { pr: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active'\n });\n success(data, 'ado', 'repo-add-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-comment', start); }\n });\n\n repo\n .command('add-inline-comment')\n .description('Add an inline comment on a file in a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <side>', 'Line side: left|right (default: right)', 'right')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const lineNum = parseInt(opts.line, 10);\n const isRight = opts.lineType !== 'left';\n const lineRange = isRight\n ? { rightFileStart: { line: lineNum, offset: 1 }, rightFileEnd: { line: lineNum, offset: 1 } }\n : { leftFileStart: { line: lineNum, offset: 1 }, leftFileEnd: { line: lineNum, offset: 1 } };\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active',\n threadContext: { filePath: opts.file, ...lineRange }\n });\n success(data, 'ado', 'repo-add-inline-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-inline-comment', start); }\n });\n\n repo\n .command('reply-comment')\n .description('Reply to a comment thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; threadId: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.addCommentToThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), opts.body\n );\n success(data, 'ado', 'repo-reply-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-reply-comment', start); }\n });\n\n repo\n .command('resolve-comment')\n .description('Mark a comment thread as resolved (fixed)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .action(async (opts: { pr: string; threadId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.updateThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), 'fixed'\n );\n success(data, 'ado', 'repo-resolve-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-resolve-comment', start); }\n });\n\n repo\n .command('delete-comment')\n .description('Delete a comment from a thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .action(async (opts: { pr: string; threadId: string; commentId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n await gitClient.deleteComment(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), parseInt(opts.commentId, 10)\n );\n success({ deleted: true }, 'ado', 'repo-delete-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-delete-comment', start); }\n });\n\n // ── Files / Diffs ─────────────────────────────────────────────────\n\n repo\n .command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRChanges(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-files', start);\n } catch (err) { fail(err, 'ado', 'repo-list-files', start); }\n });\n\n repo\n .command('diff')\n .description('Show files changed in a pull request with change types and commit metadata')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--path <p>', 'Filter diff to a specific file path')\n .action(async (opts: { pr: string; path?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPRDiff(collection, project, repo, parseInt(opts.pr, 10));\n if (opts.path) {\n if (opts.path) {\n const needle = opts.path.startsWith('/') ? opts.path : `/${opts.path}`;\n data.changes = (data.changes ?? []).filter(c => c.item.path === needle);\n }\n }\n success(data, 'ado', 'repo-diff', start);\n } catch (err) { fail(err, 'ado', 'repo-diff', start); }\n });\n\n // ── Build statuses ────────────────────────────────────────────────\n\n repo\n .command('get-build-status')\n .description('Get CI/build statuses posted to a commit')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getCommitStatuses(collection, project, repo, opts.commit);\n success(data, 'ado', 'repo-get-build-status', start);\n } catch (err) { fail(err, 'ado', 'repo-get-build-status', start); }\n });\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n repo\n .command('list-reviewers')\n .description('List reviewers on a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listReviewers(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-reviewers', start);\n } catch (err) { fail(err, 'ado', 'repo-list-reviewers', start); }\n });\n\n const voteCmd = (\n name: string,\n description: string,\n vote: number,\n action: string\n ) => {\n repo\n .command(name)\n .description(description)\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const { loadConfig: lc } = await import('../../../lib/config.js');\n const config = lc({ configPath: globalOpts.config });\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n // Self-identity: use connection data\n const { AdoCoreClient } = await import('../client/core.js');\n const { createHttpClient } = await import('../../../lib/http.js');\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const coreClient = new AdoCoreClient(http);\n const me = await coreClient.getConnectionData(collection);\n const myId = me.authenticatedUser.id;\n const data = await gitClient.setPRVote(collection, project, repo, parseInt(opts.pr, 10), myId, vote);\n success(data, 'ado', action, start);\n } catch (err) { fail(err, 'ado', action, start); }\n });\n };\n\n voteCmd('approve', 'Approve a pull request', PR_VOTE.APPROVE, 'repo-approve');\n voteCmd('unapprove', 'Remove approval from a pull request', PR_VOTE.NO_VOTE, 'repo-unapprove');\n voteCmd('wait-for-author', 'Mark a pull request as waiting for author', PR_VOTE.WAIT_FOR_AUTHOR, 'repo-wait-for-author');\n\n // ── Builds for PR ─────────────────────────────────────────────────\n\n repo\n .command('list-builds')\n .description('List builds associated with a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient, buildClient } = getAdoContext(ado, true);\n const pr = await gitClient.getPR(collection, project, repo, parseInt(opts.pr, 10));\n const data = await buildClient.listBuilds(collection, project, {\n branchName: pr.sourceRefName\n });\n success(data, 'ado', 'repo-list-builds', start);\n } catch (err) { fail(err, 'ado', 'repo-list-builds', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, pollUntilTerminal, isBuildTerminal } from '../helpers.js';\nimport { success, fail, log } from '../../../lib/output.js';\nimport { ExitCode } from '../../../lib/exitCodes.js';\nimport { PncliError } from '../../../lib/errors.js';\n\nexport function registerAdoPipelineCommands(ado: Command): void {\n const pipeline = ado\n .command('pipeline')\n .description('Azure DevOps pipeline (build) operations');\n\n pipeline\n .command('list')\n .description('List pipeline definitions')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.listDefinitions(collection, project);\n success(data, 'ado', 'pipeline-list', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get a pipeline definition by ID')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getDefinition(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Queue a pipeline run')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .option('--branch <ref>', 'Source branch (e.g. refs/heads/main or main)')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the run to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds (default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { id: string; branch?: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const sourceBranch = opts.branch\n ? (opts.branch.startsWith('refs/') ? opts.branch : `refs/heads/${opts.branch}`)\n : undefined;\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const parameters = opts.parameter.length > 0\n ? JSON.stringify(Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n })))\n : undefined;\n\n let build = await buildClient.queueBuild(collection, project, parseInt(opts.id, 10), {\n sourceBranch,\n parameters\n });\n log(`Queued build #${build.id} (${build.buildNumber}) — status: ${build.status}`);\n\n if (opts.wait) {\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n log(`Waiting for build #${build.id} to complete (timeout ${timeoutSec}s, poll ${pollSec}s)...`);\n build = await pollUntilTerminal(\n () => buildClient.getBuild(collection, project, build.id),\n isBuildTerminal,\n { timeoutSec, pollSec }\n );\n if (build.result && build.result !== 'succeeded') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n }\n\n success(build, 'ado', 'pipeline-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List pipeline runs')\n .option('--definition <id>', 'Filter by definition ID')\n .option('--name <name>', 'Filter by pipeline name (resolved to definition ID; use pipeline list to see names)')\n .option('--branch <ref>', 'Filter by branch name')\n .option('--status <filter>', 'Filter by status (inProgress|completed|cancelling|...)')\n .option('--top <n>', 'Maximum results', '50')\n .action(async (opts: { definition?: string; name?: string; branch?: string; status?: string; top: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n\n let definitionId: number | undefined;\n if (opts.definition && opts.name) {\n throw new PncliError('Cannot specify both --definition and --name. Use one or the other.', 1);\n }\n if (opts.definition) {\n definitionId = parseInt(opts.definition, 10);\n if (isNaN(definitionId)) {\n throw new PncliError(`--definition must be a numeric ID. Got \"${opts.definition}\". Use --name to filter by pipeline name instead.`, 1);\n }\n } else if (opts.name) {\n const defs = await buildClient.listDefinitions(collection, project);\n const match = defs.find(d => d.name.toLowerCase() === opts.name!.toLowerCase());\n if (!match) {\n throw new PncliError(\n `Pipeline \"${opts.name}\" not found. Run 'pncli ado pipeline list' to see available pipelines.`,\n 1\n );\n }\n definitionId = match.id;\n }\n\n const data = await buildClient.listBuilds(collection, project, {\n definitionIds: definitionId !== undefined ? [definitionId] : undefined,\n branchName: opts.branch,\n statusFilter: opts.status,\n top: parseInt(opts.top, 10)\n });\n success(data, 'ado', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get a pipeline run by build ID')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('cancel-run')\n .description('Cancel a running pipeline build')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.cancelBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-cancel-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-cancel-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('List or retrieve build logs (consider --output-file for large logs)')\n .option('--build-id <n>', 'Build (run) ID — from pipeline list-runs or get-run')\n .option('--id <n>', 'Build (run) ID — alias for --build-id (kept for backwards compatibility)')\n .option('--log-id <n>', 'Specific log ID (omit to list all logs)')\n .action(async (opts: { buildId?: string; id?: string; logId?: string }) => {\n const start = Date.now();\n try {\n const rawId = opts.buildId ?? opts.id;\n if (!rawId) throw new PncliError('--build-id is required (build run ID from pipeline list-runs or get-run)', 1);\n const { collection, project, buildClient } = getAdoContext(ado);\n const buildId = parseInt(rawId, 10);\n if (opts.logId) {\n const data = await buildClient.getLog(collection, project, buildId, parseInt(opts.logId, 10));\n success({ log: data }, 'ado', 'pipeline-logs', start);\n } else {\n const data = await buildClient.listLogs(collection, project, buildId);\n success(data, 'ado', 'pipeline-logs', start);\n }\n } catch (err) { fail(err, 'ado', 'pipeline-logs', start); }\n });\n}\n","import { Command } from 'commander';\nimport { registerAdoProjectCommands } from './project.js';\nimport { registerAdoWorkCommands } from './work.js';\nimport { registerAdoRepoCommands } from './repo.js';\nimport { registerAdoPipelineCommands } from './pipeline.js';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoCommands(program: Command): void {\n const ado = program\n .command('ado')\n .description('Azure DevOps Server operations')\n .option('--collection <name>', 'Azure DevOps collection (organization)')\n .option('--organization <name>', 'Alias for --collection')\n .option('--project <name>', 'Azure DevOps team project')\n .option('--repo <name>', 'Azure DevOps git repository name');\n\n // ── Top-level commands ─────────────────────────────────────────────\n\n ado\n .command('whoami')\n .description('Show current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'whoami', start);\n } catch (err) { fail(err, 'ado', 'whoami', start); }\n });\n\n ado\n .command('connection-data')\n .description('Show raw connection data from the ADO server')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'connection-data', start);\n } catch (err) { fail(err, 'ado', 'connection-data', start); }\n });\n\n // ── Subcommand groups ──────────────────────────────────────────────\n\n registerAdoProjectCommands(ado);\n registerAdoWorkCommands(ado);\n registerAdoRepoCommands(ado);\n registerAdoPipelineCommands(ado);\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n JenkinsJob,\n JenkinsJobDetail,\n JenkinsBuild,\n JenkinsListJobsResponse,\n JenkinsQueueItem\n} from '../../types/jenkins.js';\n\n/** Converts a multi-level Jenkins job name (e.g. `A/B/C`) into the correct\n * URL path segment (e.g. `A/job/B/job/C`). Single-level names are unchanged.\n * Each segment is individually percent-encoded. */\nfunction jobPath(name: string): string {\n return name.split('/').map(encodeURIComponent).join('/job/');\n}\n\nexport class JenkinsClient {\n constructor(private http: HttpClient) {}\n\n async listJobs(folder?: string): Promise<JenkinsJob[]> {\n const endpoint = folder ? `/job/${jobPath(folder)}/api/json` : '/api/json';\n const data = await this.http.jenkins<JenkinsListJobsResponse>(\n endpoint,\n { params: { tree: 'jobs[name,url,color,description,buildable,lastBuild[number,url,result]]' } }\n );\n return data.jobs;\n }\n\n async getJob(name: string): Promise<JenkinsJobDetail> {\n return this.http.jenkins<JenkinsJobDetail>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: 'name,url,color,description,buildable,nextBuildNumber,inQueue,lastBuild[number,url,result],builds[number,url,result,duration,timestamp,building,displayName]{0,10}' } }\n );\n }\n\n async triggerBuild(\n name: string,\n params?: Record<string, string>\n ): Promise<{ queueItemId: number }> {\n const hasParams = params && Object.keys(params).length > 0;\n const endpoint = hasParams\n ? `/job/${jobPath(name)}/buildWithParameters`\n : `/job/${jobPath(name)}/build`;\n\n const res = await this.http.jenkinsRaw(endpoint, {\n method: 'POST',\n params: hasParams ? params : undefined\n });\n\n const location = res.headers.get('Location') ?? '';\n const match = location.match(/\\/queue\\/item\\/(\\d+)\\/?$/);\n if (!match) throw new PncliError('Build queued but Jenkins did not return a Location header — cannot track queue item');\n const queueItemId = parseInt(match[1]!, 10);\n return { queueItemId };\n }\n\n async getQueueItem(queueItemId: number): Promise<JenkinsQueueItem> {\n return this.http.jenkins<JenkinsQueueItem>(`/queue/item/${queueItemId}/api/json`);\n }\n\n async listBuilds(name: string, top = 25): Promise<Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[]> {\n const data = await this.http.jenkins<{ builds: Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[] }>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: `builds[number,url,result,duration,timestamp,building,displayName,fullDisplayName,description,id,queueId]{0,${top}}` } }\n );\n return data.builds ?? [];\n }\n\n async getBuild(name: string, buildNumber: number): Promise<JenkinsBuild> {\n return this.http.jenkins<JenkinsBuild>(\n `/job/${jobPath(name)}/${buildNumber}/api/json`\n );\n }\n\n async getConsoleLog(name: string, buildNumber: number): Promise<string> {\n const res = await this.http.jenkinsRaw(\n `/job/${jobPath(name)}/${buildNumber}/consoleText`,\n { method: 'GET' }\n );\n return res.text;\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { JenkinsClient } from './client.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { JenkinsBuild } from '../../types/jenkins.js';\n\nfunction getClient(program: Command): JenkinsClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.jenkins.baseUrl) throw new PncliError('Jenkins not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JenkinsClient(http);\n}\n\nasync function pollQueueItem(\n client: JenkinsClient,\n queueItemId: number,\n pollMs: number,\n timeoutMs: number\n): Promise<number> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const item = await client.getQueueItem(queueItemId);\n if (item.executable?.number !== undefined) return item.executable.number;\n if (item.why === null && !item.blocked && !item.buildable) {\n throw new PncliError('Build was cancelled while in queue', 1);\n }\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build to leave queue after ${timeoutMs / 1000}s`, 1);\n}\n\nasync function pollBuildComplete(\n client: JenkinsClient,\n jobName: string,\n buildNumber: number,\n pollMs: number,\n timeoutMs: number\n): Promise<JenkinsBuild> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const build = await client.getBuild(jobName, buildNumber);\n if (!build.building) return build;\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build #${buildNumber} to complete after ${timeoutMs / 1000}s`, 1);\n}\n\nexport function registerJenkinsCommands(program: Command): void {\n const jenkins = program.command('jenkins').description('Jenkins Data Center operations');\n const pipeline = jenkins.command('pipeline').description('Pipeline (job/build) operations');\n\n pipeline\n .command('list')\n .description('List all jobs on the Jenkins instance (or within a folder)')\n .option('--folder <name>', 'Folder name to enumerate (supports nested folders: parentFolder/childFolder)')\n .action(async (opts: { folder?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listJobs(opts.folder);\n success(data, 'jenkins', 'pipeline-list', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get details for a specific job')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getJob(opts.name);\n success(data, 'jenkins', 'pipeline-get', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Trigger a build')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the build to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds per phase (queue-wait and build-wait each get this budget; default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { name: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const params = opts.parameter.length > 0\n ? Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n }))\n : undefined;\n\n const { queueItemId } = await client.triggerBuild(opts.name, params);\n log(`Queued build (queue item #${queueItemId})`);\n\n if (!opts.wait) {\n success({ queueItemId }, 'jenkins', 'pipeline-run', start);\n return;\n }\n\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n\n log(`Waiting for build to start (timeout ${timeoutSec}s)...`);\n const buildNumber = await pollQueueItem(client, queueItemId, pollSec * 1000, timeoutSec * 1000);\n log(`Build #${buildNumber} started — waiting for completion...`);\n\n const build = await pollBuildComplete(client, opts.name, buildNumber, pollSec * 1000, timeoutSec * 1000);\n if (build.result !== null && build.result !== 'SUCCESS') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n success(build, 'jenkins', 'pipeline-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List recent builds for a job')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .option('--top <n>', 'Maximum number of builds to return (default 25)', '25')\n .action(async (opts: { name: string; top: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const top = parseInt(opts.top, 10);\n if (isNaN(top) || top <= 0) throw new PncliError(`Invalid --top \"${opts.top}\". Expected a positive integer.`, 1);\n const data = await client.listBuilds(opts.name, top);\n success(data, 'jenkins', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get details for a specific build')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const data = await client.getBuild(opts.name, buildNumber);\n success(data, 'jenkins', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('Fetch console log for a build (consider --output-file for large logs)')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const text = await client.getConsoleLog(opts.name, buildNumber);\n success({ log: text }, 'jenkins', 'pipeline-logs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-logs', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n ArtifactoryRepository,\n ArtifactoryStorageInfo,\n ArtifactoryProperties,\n ArtifactoryAqlResult,\n ArtifactoryAqlArtifact,\n ArtifactoryBuildInfo,\n ArtifactoryBuildList,\n ArtifactoryBuildRuns\n} from '../../types/artifactory.js';\n\nconst API = 'api';\n\nexport interface ListReposOpts {\n type?: 'local' | 'virtual' | 'remote' | 'federated';\n packageType?: string;\n}\n\nexport interface SearchAqlOpts {\n repo?: string;\n name?: string;\n path?: string;\n before?: string;\n after?: string;\n limit?: number;\n includeProperties?: boolean;\n}\n\nexport interface SetPropertiesOpts {\n recursive?: boolean;\n}\n\nexport class ArtifactoryClient {\n constructor(private http: HttpClient) {}\n\n async ping(): Promise<string> {\n return this.http.artifactoryText(`${API}/system/ping`);\n }\n\n async listRepos(opts: ListReposOpts = {}): Promise<ArtifactoryRepository[]> {\n return this.http.artifactory<ArtifactoryRepository[]>(`${API}/repositories`, {\n params: {\n type: opts.type,\n packageType: opts.packageType\n }\n });\n }\n\n async getStorageInfo(repo: string, path: string): Promise<ArtifactoryStorageInfo> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryStorageInfo>(`${API}/storage/${repo}/${cleanPath}`);\n }\n\n async getProperties(repo: string, path: string): Promise<ArtifactoryProperties> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryProperties>(`${API}/storage/${repo}/${cleanPath}`, {\n params: { properties: '' }\n });\n }\n\n async setProperties(repo: string, path: string, properties: Record<string, string>, opts: SetPropertiesOpts = {}): Promise<void> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n const propString = Object.entries(properties)\n .map(([k, v]) => `${k}=${v}`)\n .join(';');\n await this.http.artifactory<void>(`${API}/storage/${repo}/${cleanPath}`, {\n method: 'PUT',\n params: {\n properties: propString,\n ...(opts.recursive ? { recursive: 1 } : {})\n }\n });\n }\n\n async searchAql(opts: SearchAqlOpts = {}): Promise<ArtifactoryAqlResult<ArtifactoryAqlArtifact>> {\n const criteria: string[] = [];\n\n if (opts.repo) criteria.push(`\"repo\": {\"$eq\": \"${opts.repo}\"}`);\n if (opts.name) criteria.push(`\"name\": {\"$match\": \"${opts.name}\"}`);\n if (opts.path) criteria.push(`\"path\": {\"$match\": \"${opts.path}\"}`);\n if (opts.after) criteria.push(`\"created\": {\"$gt\": \"${opts.after}\"}`);\n if (opts.before) criteria.push(`\"created\": {\"$lt\": \"${opts.before}\"}`);\n\n const findClause = criteria.length > 0\n ? `{${criteria.join(',')}}`\n : '{}';\n\n const includeFields = opts.includeProperties\n ? '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\",\"properties\")'\n : '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\")';\n\n const sortClause = '.sort({\"$desc\": [\"created\"]})';\n const limitClause = opts.limit ? `.limit(${opts.limit})` : '.limit(100)';\n\n const aql = `items.find(${findClause})${includeFields}${sortClause}${limitClause}`;\n\n return this.http.artifactory<ArtifactoryAqlResult<ArtifactoryAqlArtifact>>(`${API}/search/aql`, {\n method: 'POST',\n body: aql,\n headers: { 'Content-Type': 'text/plain' }\n });\n }\n\n async listBuilds(opts: { timeoutMs?: number } = {}): Promise<ArtifactoryBuildList> {\n const raw = await this.http.artifactory<{ builds?: Array<{ uri: string; lastStarted: string }>; uri: string }>(`${API}/build`, { timeoutMs: opts.timeoutMs });\n const builds = (raw.builds ?? []).map(b => ({\n name: b.uri.replace(/^\\/|\\/$/g, ''),\n uri: b.uri,\n lastStarted: b.lastStarted\n }));\n const result: ArtifactoryBuildList = { builds, uri: raw.uri };\n if (builds.length === 0) {\n result.hint = 'No builds are registered in Artifactory Build Integration. Build names may differ from ADO pipeline or uDeploy component names. Use \"artifactory repos\" to list repositories, then \"artifactory search --repo <repo>\" to locate artifacts directly.';\n }\n return result;\n }\n\n async listBuildRuns(buildName: string): Promise<ArtifactoryBuildRuns> {\n return this.http.artifactory<ArtifactoryBuildRuns>(`${API}/build/${encodeURIComponent(buildName)}`);\n }\n\n async getBuildInfo(buildName: string, buildNumber: string): Promise<ArtifactoryBuildInfo> {\n return this.http.artifactory<ArtifactoryBuildInfo>(\n `${API}/build/${encodeURIComponent(buildName)}/${encodeURIComponent(buildNumber)}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { ArtifactoryClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): ArtifactoryClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.artifactory.baseUrl) throw new PncliError('Artifactory not configured. Run: pncli config init');\n if (!config.artifactory.token) throw new PncliError('Artifactory token not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ArtifactoryClient(http);\n}\n\nexport function registerArtifactoryCommands(program: Command): void {\n const art = program.command('artifactory').description('Artifactory operations');\n\n // ── Ping ──────────────────────────────────────────────────────────────────\n\n art.command('ping')\n .description('Check Artifactory connectivity and authentication')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.ping();\n success(data, 'artifactory', 'ping', start);\n } catch (err) { fail(err, 'artifactory', 'ping', start); }\n });\n\n // ── Repos ─────────────────────────────────────────────────────────────────\n\n art.command('repos')\n .description('List repositories')\n .option('--type <type>', 'Filter by type: local, virtual, remote, federated')\n .option('--package-type <type>', 'Filter by package type: npm, maven, nuget, docker, pypi, etc.')\n .action(async (opts: { type?: string; packageType?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listRepos({ type: opts.type as 'local' | 'virtual' | 'remote' | 'federated' | undefined, packageType: opts.packageType });\n success(data, 'artifactory', 'repos', start);\n } catch (err) { fail(err, 'artifactory', 'repos', start); }\n });\n\n // ── Artifact info ─────────────────────────────────────────────────────────\n\n art.command('artifact-info <repo> <path>')\n .description('Get metadata for an artifact or folder (checksums, size, timestamps)')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getStorageInfo(repo, path);\n success(data, 'artifactory', 'artifact-info', start);\n } catch (err) { fail(err, 'artifactory', 'artifact-info', start); }\n });\n\n // ── Properties get ────────────────────────────────────────────────────────\n\n art.command('properties-get <repo> <path>')\n .description('Read custom properties on an artifact')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getProperties(repo, path);\n success(data, 'artifactory', 'properties-get', start);\n } catch (err) { fail(err, 'artifactory', 'properties-get', start); }\n });\n\n // ── Properties set ────────────────────────────────────────────────────────\n\n art.command('properties-set <repo> <path> [keyvals...]')\n .description('Set custom properties on an artifact (format: key=value key=value...)')\n .option('--recursive', 'Apply recursively to folder contents', false)\n .action(async (repo: string, path: string, keyvals: string[], opts: { recursive: boolean }) => {\n const start = Date.now();\n try {\n if (!keyvals.length) throw new PncliError('Provide at least one key=value pair');\n const properties: Record<string, string> = {};\n for (const kv of keyvals) {\n const eq = kv.indexOf('=');\n if (eq < 1) throw new PncliError(`Invalid property format: \"${kv}\" — expected key=value`);\n properties[kv.slice(0, eq)] = kv.slice(eq + 1);\n }\n const client = getClient(program);\n await client.setProperties(repo, path, properties, { recursive: opts.recursive });\n success({ repo, path, properties }, 'artifactory', 'properties-set', start);\n } catch (err) { fail(err, 'artifactory', 'properties-set', start); }\n });\n\n // ── AQL search ────────────────────────────────────────────────────────────\n\n art.command('search')\n .description('Search artifacts using AQL (Artifactory Query Language) (consider --output-file for large results)')\n .option('--repo <name>', 'Filter by repository key')\n .option('--name <pattern>', 'Filter by artifact name (supports * and ? wildcards)')\n .option('--path <pattern>', 'Filter by artifact path (supports * and ? wildcards)')\n .option('--after <date>', 'Created after this date (ISO 8601, e.g. 2024-01-01)')\n .option('--before <date>', 'Created before this date (ISO 8601)')\n .option('--limit <n>', 'Maximum results to return (default: 100)', '100')\n .option('--properties', 'Include artifact properties in results', false)\n .action(async (opts: { repo?: string; name?: string; path?: string; after?: string; before?: string; limit: string; properties: boolean }) => {\n const start = Date.now();\n try {\n if (!opts.repo && !opts.name && !opts.path) {\n throw new PncliError('Provide at least one filter: --repo, --name, or --path');\n }\n const client = getClient(program);\n const data = await client.searchAql({\n repo: opts.repo,\n name: opts.name,\n path: opts.path,\n after: opts.after,\n before: opts.before,\n limit: Number.isNaN(parseInt(opts.limit, 10)) ? 100 : parseInt(opts.limit, 10),\n includeProperties: opts.properties\n });\n success(data, 'artifactory', 'search', start);\n } catch (err) { fail(err, 'artifactory', 'search', start); }\n });\n\n // ── Builds ────────────────────────────────────────────────────────────────\n\n art.command('builds')\n .description('List builds registered in Artifactory Build Integration (names may differ from ADO pipeline or uDeploy component names; use \"search --repo\" when empty)')\n .option('--timeout <s>', 'Request timeout in seconds (default 60; increase for large Artifactory instances)', '60')\n .action(async (opts: { timeout: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const timeoutSecs = parseInt(opts.timeout, 10);\n if (isNaN(timeoutSecs) || timeoutSecs <= 0) throw new PncliError('--timeout must be a positive integer (seconds)', 1);\n const timeoutMs = timeoutSecs * 1000;\n const data = await client.listBuilds({ timeoutMs });\n success(data, 'artifactory', 'builds', start);\n } catch (err) { fail(err, 'artifactory', 'builds', start); }\n });\n\n art.command('build-runs <name>')\n .description('List all run numbers for a build')\n .action(async (name: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBuildRuns(name);\n success(data, 'artifactory', 'build-runs', start);\n } catch (err) { fail(err, 'artifactory', 'build-runs', start); }\n });\n\n art.command('build-info <name> <number>')\n .description('Get build info (artifacts, dependencies, VCS revision) for a specific run')\n .action(async (name: string, number: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getBuildInfo(name, number);\n success(data, 'artifactory', 'build-info', start);\n } catch (err) { fail(err, 'artifactory', 'build-info', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n UdeployApplication,\n UdeployComponent,\n UdeployEnvironment,\n UdeployProcessRequest,\n UdeployRequestInfo,\n UdeployRequestStatus,\n UdeployVersion,\n UdeployVersionCreateResult,\n} from '../../types/udeploy.js';\n\nexport interface UdeployRunProcessOptions {\n application: string;\n applicationProcess: string;\n environment: string;\n onlyChanged?: boolean;\n versions?: Array<{ component: string; version: string }>;\n snapshot?: string;\n properties?: Record<string, string>;\n}\n\nexport class UdeployClient {\n constructor(private http: HttpClient) {}\n\n listApplications(): Promise<UdeployApplication[]> {\n return this.http.udeploy<UdeployApplication[]>('/cli/application');\n }\n\n listEnvironments(application: string): Promise<UdeployEnvironment[]> {\n return this.http.udeploy<UdeployEnvironment[]>('/cli/application/environmentsInApplication', {\n params: { application }\n });\n }\n\n listComponents(): Promise<UdeployComponent[]> {\n return this.http.udeploy<UdeployComponent[]>('/cli/component');\n }\n\n listVersions(component: string): Promise<UdeployVersion[]> {\n return this.http.udeploy<UdeployVersion[]>('/cli/component/versions', {\n params: { component }\n });\n }\n\n createVersion(component: string, name: string): Promise<UdeployVersionCreateResult> {\n return this.http.udeploy<UdeployVersionCreateResult>('/cli/version/createVersion', {\n method: 'POST',\n params: { component, name }\n });\n }\n\n finishImporting(component: string, version: string): Promise<void> {\n return this.http.udeploy<void>('/cli/version/finishedImporting', {\n method: 'POST',\n params: { component, version }\n });\n }\n\n runProcess(opts: UdeployRunProcessOptions): Promise<UdeployProcessRequest> {\n return this.http.udeploy<UdeployProcessRequest>('/cli/applicationProcessRequest/request', {\n method: 'PUT',\n body: {\n application: opts.application,\n applicationProcess: opts.applicationProcess,\n environment: opts.environment,\n onlyChanged: opts.onlyChanged ?? false,\n ...(opts.versions ? { versions: opts.versions } : {}),\n ...(opts.snapshot ? { snapshot: opts.snapshot } : {}),\n ...(opts.properties ? { properties: opts.properties } : {}),\n }\n });\n }\n\n getRequestStatus(requestId: string): Promise<UdeployRequestStatus> {\n return this.http.udeploy<UdeployRequestStatus>('/cli/applicationProcessRequest/requestStatus', {\n params: { requestId }\n });\n }\n\n getRequestInfo(requestId: string): Promise<UdeployRequestInfo> {\n return this.http.udeploy<UdeployRequestInfo>('/cli/applicationProcessRequest/requestInfo', {\n params: { requestId }\n });\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { UdeployClient } from './client.js';\n\nconst POLL_INTERVAL_MS = 5000;\nconst DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;\n\nfunction getClient(program: Command): { client: UdeployClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.udeploy.baseUrl) {\n throw new PncliError('UDeploy baseUrl not configured. Run: pncli config init', 78);\n }\n const http = createHttpClient(config, opts.dryRun);\n return { client: new UdeployClient(http), config };\n}\n\nfunction resolveApplication(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const app = cliValue ?? config.defaults.udeploy.application;\n if (!app) throw new PncliError('--application is required (or set defaults.udeploy.application in config)', 2);\n return app;\n}\n\nfunction resolveEnvironment(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const env = cliValue ?? config.defaults.udeploy.environment;\n if (!env) throw new PncliError('--environment is required (or set defaults.udeploy.environment in config)', 2);\n return env;\n}\n\nexport function registerUdeployCommands(program: Command): void {\n const udeploy = program\n .command('udeploy')\n .description('IBM UrbanCode Deploy — component versions and deployment processes')\n .option('--application <name>', 'Application name or ID')\n .option('--environment <name>', 'Environment name or ID');\n\n udeploy\n .command('apps')\n .description('List all applications')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const apps = await client.listApplications();\n success(apps, 'udeploy', 'apps', start);\n } catch (err) {\n fail(err, 'udeploy', 'apps', start);\n }\n });\n\n udeploy\n .command('environments')\n .description('List environments for an application')\n .action(async () => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const envs = await client.listEnvironments(application);\n success(envs, 'udeploy', 'environments', start);\n } catch (err) {\n fail(err, 'udeploy', 'environments', start);\n }\n });\n\n udeploy\n .command('components')\n .description('List all components')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const components = await client.listComponents();\n success(components, 'udeploy', 'components', start);\n } catch (err) {\n fail(err, 'udeploy', 'components', start);\n }\n });\n\n udeploy\n .command('versions')\n .description('List versions for a component')\n .requiredOption('--component <name>', 'Component name or ID')\n .action(async (cmdOpts: { component: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const versions = await client.listVersions(cmdOpts.component);\n success(versions, 'udeploy', 'versions', start);\n } catch (err) {\n fail(err, 'udeploy', 'versions', start);\n }\n });\n\n udeploy\n .command('import-version')\n .description('Create a component version and mark it ready for deployment')\n .requiredOption('--component <name>', 'Component name or ID')\n .requiredOption('--name <name>', 'Version name')\n .option('--no-finish', 'Skip marking the version as finished importing')\n .action(async (cmdOpts: { component: string; name: string; finish: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const created = await client.createVersion(cmdOpts.component, cmdOpts.name);\n if (cmdOpts.finish) {\n await client.finishImporting(cmdOpts.component, cmdOpts.name);\n }\n success({ ...created, finishedImporting: cmdOpts.finish }, 'udeploy', 'import-version', start);\n } catch (err) {\n fail(err, 'udeploy', 'import-version', start);\n }\n });\n\n udeploy\n .command('run')\n .description('Run an application deployment process')\n .requiredOption('--process <name>', 'Application process name or ID')\n .option('--component <name>', 'Component name (repeatable)', collect, [])\n .option('--component-version <name>', 'Component version (repeatable; positionally paired with --component)', collect, [])\n .option('--snapshot <name>', 'Snapshot name or ID (alternative to specifying versions)')\n .option('--only-changed', 'Deploy only changed components', false)\n .option('--wait', 'Poll until the process completes', false)\n .option('--timeout <ms>', 'Max wait time in milliseconds', String(DEFAULT_TIMEOUT_MS))\n .action(async (cmdOpts: {\n process: string;\n component: string[];\n componentVersion: string[];\n snapshot?: string;\n onlyChanged: boolean;\n wait: boolean;\n timeout: string;\n }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string; environment?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const environment = resolveEnvironment(config, parentOpts.environment);\n\n const components = cmdOpts.component;\n const versions = cmdOpts.componentVersion;\n const versionEntries = components.map((c, i) => ({\n component: c,\n version: versions[i] ?? 'latest'\n }));\n\n const result = await client.runProcess({\n application,\n applicationProcess: cmdOpts.process,\n environment,\n onlyChanged: cmdOpts.onlyChanged,\n ...(versionEntries.length > 0 ? { versions: versionEntries } : {}),\n ...(cmdOpts.snapshot ? { snapshot: cmdOpts.snapshot } : {}),\n });\n\n if (!cmdOpts.wait) {\n success(result, 'udeploy', 'run', start);\n return;\n }\n\n const timeoutMs = parseInt(cmdOpts.timeout, 10);\n const requestId = result.requestId;\n log(`Process started. Request ID: ${requestId}. Polling for completion...`);\n\n while (true) {\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n throw new PncliError(`Timed out after ${timeoutMs}ms waiting for request ${requestId}`, 1);\n }\n\n await sleep(POLL_INTERVAL_MS);\n\n const status = await client.getRequestStatus(requestId);\n\n if (status.status === 'CLOSED') {\n const outcome = { requestId, status: status.status, result: status.result, elapsed_ms: Date.now() - start };\n if (status.result === 'SUCCEEDED') {\n success(outcome, 'udeploy', 'run', start);\n } else {\n throw new PncliError(\n `Deployment ${status.result ?? 'failed'} (requestId: ${requestId})`,\n 1\n );\n }\n return;\n }\n\n log(`Status: ${status.status} (${Math.round((Date.now() - start) / 1000)}s elapsed)`);\n }\n } catch (err) {\n fail(err, 'udeploy', 'run', start);\n }\n });\n\n udeploy\n .command('request-status')\n .description('Get the current status of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const status = await client.getRequestStatus(cmdOpts.requestId);\n success(status, 'udeploy', 'request-status', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-status', start);\n }\n });\n\n udeploy\n .command('request-info')\n .description('Get full details of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const info = await client.getRequestInfo(cmdOpts.requestId);\n success(info, 'udeploy', 'request-info', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-info', start);\n }\n });\n}\n\nfunction collect(val: string, prev: string[]): string[] {\n return [...prev, val];\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n CxOneProject,\n CxOneProjectsResponse,\n CxOneScan,\n CxOneScansResponse,\n CxOneResultsSummary\n} from '../../types/checkmarx.js';\n\nexport class CheckmarxClient {\n constructor(private http: HttpClient) {}\n\n async listProjects(): Promise<CxOneProject[]> {\n const res = await this.http.checkmarx<CxOneProjectsResponse>('projects', { params: { limit: 100 } });\n const projects = res.projects ?? [];\n if (res.filteredTotalCount > projects.length) {\n process.stderr.write(`warning: ${res.filteredTotalCount} projects found; only showing first ${projects.length}\\n`);\n }\n return projects;\n }\n\n async getProject(id: string): Promise<CxOneProject> {\n return this.http.checkmarx<CxOneProject>(`projects/${id}`);\n }\n\n async listScans(opts: { projectId?: string; last?: number } = {}): Promise<CxOneScan[]> {\n const params: Record<string, string | number> = { limit: opts.last ?? 100 };\n if (opts.projectId) params['project-id'] = opts.projectId;\n const res = await this.http.checkmarx<CxOneScansResponse>('scans', { params });\n const scans = res.scans ?? [];\n if (res.filteredTotalCount > scans.length) {\n process.stderr.write(`warning: ${res.filteredTotalCount} scans found; only showing first ${scans.length}\\n`);\n }\n return scans;\n }\n\n async getScan(id: string): Promise<CxOneScan> {\n return this.http.checkmarx<CxOneScan>(`scans/${id}`);\n }\n\n async getScanResultsStatistics(scanId: string): Promise<CxOneResultsSummary> {\n return this.http.checkmarx<CxOneResultsSummary>('results/summary', {\n params: { 'scan-id': scanId }\n });\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { CheckmarxClient } from './client.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): CheckmarxClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.checkmarx.baseUrl) throw new PncliError('Checkmarx not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new CheckmarxClient(http);\n}\n\nexport function registerCheckmarxCommands(program: Command): void {\n const cx = program.command('checkmarx').description('Checkmarx One operations');\n const project = cx.command('project').description('Project operations');\n const scan = cx.command('scan').description('Scan operations');\n\n project\n .command('list')\n .description('List all projects')\n .action(async () => {\n const start = Date.now();\n try {\n const data = await getClient(program).listProjects();\n success(data, 'checkmarx', 'project-list', start);\n } catch (err) { fail(err, 'checkmarx', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a project by ID')\n .requiredOption('--id <id>', 'Project UUID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const data = await getClient(program).getProject(opts.id);\n success(data, 'checkmarx', 'project-get', start);\n } catch (err) { fail(err, 'checkmarx', 'project-get', start); }\n });\n\n scan\n .command('list')\n .description('List scans')\n .option('--project <id>', 'Filter by project UUID')\n .option('--last <n>', 'Return only the last N scans')\n .action(async (opts: { project?: string; last?: string }) => {\n const start = Date.now();\n try {\n const last = opts.last ? parseInt(opts.last, 10) : undefined;\n if (opts.last && isNaN(last!)) throw new PncliError(`Invalid --last \"${opts.last}\". Expected an integer.`, 1);\n const data = await getClient(program).listScans({ projectId: opts.project, last });\n success(data, 'checkmarx', 'scan-list', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-list', start); }\n });\n\n scan\n .command('get')\n .description('Get a scan by ID')\n .requiredOption('--id <id>', 'Scan UUID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const data = await getClient(program).getScan(opts.id);\n success(data, 'checkmarx', 'scan-get', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-get', start); }\n });\n\n scan\n .command('stats')\n .description('Get results statistics for a scan')\n .requiredOption('--id <id>', 'Scan UUID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const data = await getClient(program).getScanResultsStatistics(opts.id);\n success(data, 'checkmarx', 'scan-stats', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-stats', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\ninterface SnowChangeRecord {\n sys_id: string;\n number: string;\n short_description: string;\n state: string;\n priority: string;\n assigned_to?: { display_value?: string };\n assignment_group?: { display_value?: string };\n start_date?: string;\n end_date?: string;\n description?: string;\n [key: string]: unknown;\n}\n\ninterface SnowListResponse {\n result: SnowChangeRecord[];\n}\n\ninterface SnowSingleResponse {\n result: SnowChangeRecord;\n}\n\nfunction getHttp(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.servicenow.baseUrl) throw new PncliError('ServiceNow not configured. Run: pncli config init');\n return createHttpClient(config, Boolean(opts.dryRun));\n}\n\nexport function registerServiceNowCommands(program: Command): void {\n const sn = program.command('servicenow').description('ServiceNow operations');\n const change = sn.command('change').description('Change request operations');\n\n change\n .command('list')\n .description('List change requests')\n .option('--state <state>', 'Filter by state (e.g. -1=Pending, 1=Open, 2=Work in Progress, 3=Closed Complete)')\n .option('--assigned-to <user>', 'Filter by assigned user sys_id or display name')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--fields <fields>', 'Comma-separated field names to return')\n .action(async (opts: { state?: string; assignedTo?: string; limit?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string | number | boolean | undefined> = {\n sysparm_limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n sysparm_display_value: 'true',\n };\n const sanitize = (v: string) => v.replace(/\\^/g, '');\n const queries: string[] = [];\n if (opts.state !== undefined) queries.push(`state=${sanitize(opts.state)}`);\n if (opts.assignedTo) queries.push(`assigned_to=${sanitize(opts.assignedTo)}`);\n if (queries.length) params['sysparm_query'] = queries.join('^');\n if (opts.fields) params['sysparm_fields'] = opts.fields;\n\n const data = await http.servicenow<SnowListResponse>('/api/now/table/change_request', { params });\n success(data.result, 'servicenow', 'change list', start);\n } catch (err) { fail(err, 'servicenow', 'change list', start); }\n });\n\n change\n .command('get')\n .description('Get a change request by sys_id or number')\n .requiredOption('--id <id>', 'Change request sys_id or number (e.g. CHG0001234)')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n if (opts.id.toUpperCase().startsWith('CHG')) {\n const list = await http.servicenow<SnowListResponse>('/api/now/table/change_request', {\n params: { sysparm_query: `number=${opts.id}`, sysparm_display_value: 'true', sysparm_limit: 1 }\n });\n if (!list.result.length) throw new PncliError(`Change request not found: ${opts.id}`, 1);\n success(list.result[0], 'servicenow', 'change get', start);\n return;\n }\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n params: { sysparm_display_value: 'true' }\n });\n success(data.result, 'servicenow', 'change get', start);\n } catch (err) { fail(err, 'servicenow', 'change get', start); }\n });\n\n change\n .command('create')\n .description('Create a change request')\n .requiredOption('--short-description <text>', 'Short description (title)')\n .option('--description <text>', 'Full description')\n .option('--type <type>', 'Change type: normal, standard, or emergency', 'normal')\n .option('--priority <n>', 'Priority: 1=Critical, 2=High, 3=Moderate, 4=Low')\n .option('--assigned-to <user>', 'Assigned user sys_id')\n .option('--assignment-group <group>', 'Assignment group sys_id')\n .option('--start-date <datetime>', 'Planned start date (yyyy-MM-dd HH:mm:ss)')\n .option('--end-date <datetime>', 'Planned end date (yyyy-MM-dd HH:mm:ss)')\n .action(async (opts: {\n shortDescription: string;\n description?: string;\n type?: string;\n priority?: string;\n assignedTo?: string;\n assignmentGroup?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {\n short_description: opts.shortDescription,\n type: opts.type ?? 'normal'\n };\n if (opts.description) body['description'] = opts.description;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.assignmentGroup) body['assignment_group'] = opts.assignmentGroup;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n const data = await http.servicenow<SnowSingleResponse>('/api/now/table/change_request', {\n method: 'POST',\n body\n });\n success(data.result, 'servicenow', 'change create', start);\n } catch (err) { fail(err, 'servicenow', 'change create', start); }\n });\n\n change\n .command('update')\n .description('Update a change request')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--short-description <text>', 'New short description')\n .option('--description <text>', 'New description')\n .option('--state <state>', 'New state value')\n .option('--priority <n>', 'New priority')\n .option('--assigned-to <user>', 'New assigned user sys_id')\n .option('--start-date <datetime>', 'New planned start date')\n .option('--end-date <datetime>', 'New planned end date')\n .action(async (opts: {\n id: string;\n shortDescription?: string;\n description?: string;\n state?: string;\n priority?: string;\n assignedTo?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {};\n if (opts.shortDescription) body['short_description'] = opts.shortDescription;\n if (opts.description) body['description'] = opts.description;\n if (opts.state !== undefined) body['state'] = opts.state;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n if (Object.keys(body).length === 0) throw new PncliError('No fields to update. Provide at least one option besides --id.', 1);\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change update', start);\n } catch (err) { fail(err, 'servicenow', 'change update', start); }\n });\n\n change\n .command('close')\n .description('Close a change request (state=3)')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--close-notes <text>', 'Closure notes')\n .option('--close-code <code>', 'Close code (e.g. successful, unsuccessful)')\n .action(async (opts: { id: string; closeNotes?: string; closeCode?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = { state: 3 };\n if (opts.closeNotes) body['close_notes'] = opts.closeNotes;\n if (opts.closeCode) body['close_code'] = opts.closeCode;\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change close', start);\n } catch (err) { fail(err, 'servicenow', 'change close', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpAndOrg(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.contrast.apiKey || !config.contrast.serviceKey || !config.contrast.username) throw new PncliError('Contrast not configured. Run: pncli config init');\n if (!config.contrast.orgUuid) throw new PncliError('Contrast org UUID not configured. Run: pncli config set contrast.orgUuid <uuid>');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { http, orgUuid: config.contrast.orgUuid };\n}\n\nexport function registerContrastCommands(program: Command): void {\n const contrast = program.command('contrast').description('Contrast IAST operations');\n\n const apps = contrast.command('apps').description('Application operations');\n\n apps\n .command('list')\n .description('List applications in the organization')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(`/Contrast/api/ng/${orgUuid}/applications`, {\n params: {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n }\n });\n success(data, 'contrast', 'apps list', start);\n } catch (err) { fail(err, 'contrast', 'apps list', start); }\n });\n\n const findings = contrast.command('findings').description('Vulnerability findings operations');\n\n findings\n .command('list')\n .description('List vulnerability findings for an application')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .option('--severity <level>', 'Filter by severity: CRITICAL, HIGH, MEDIUM, LOW, NOTE')\n .option('--status <status>', 'Filter by status: REPORTED, CONFIRMED, SUSPICIOUS, NOT_A_PROBLEM, REMEDIATED, FIXED')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { app: string; severity?: string; status?: string; limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const params: Record<string, string | number | boolean | undefined> = {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n };\n if (opts.severity) params['severities'] = opts.severity;\n if (opts.status) params['statuses'] = opts.status;\n\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/filter`,\n { params }\n );\n success(data, 'contrast', 'findings list', start);\n } catch (err) { fail(err, 'contrast', 'findings list', start); }\n });\n\n findings\n .command('get')\n .description('Get details for a specific vulnerability finding')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .requiredOption('--trace <trace-id>', 'Trace/finding UUID')\n .action(async (opts: { app: string; trace: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/trace/${opts.trace}`\n );\n success(data, 'contrast', 'findings get', start);\n } catch (err) { fail(err, 'contrast', 'findings get', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpClient(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.sonatypeiq.baseUrl) throw new PncliError('Sonatype IQ Server baseUrl not configured. Run: pncli config init');\n if (!config.sonatypeiq.userCode || !config.sonatypeiq.passcode) throw new PncliError('Sonatype IQ Server credentials not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return http;\n}\n\nexport function registerSonatypeIqCommands(program: Command): void {\n const sonatypeiq = program.command('sonatypeiq').description('Sonatype IQ Server operations');\n\n const applications = sonatypeiq.command('applications').description('Application operations');\n\n applications\n .command('list')\n .description('List all applications in Sonatype IQ Server')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const params: Record<string, string | number | boolean | undefined> = {};\n if (opts.organizationId) params['organizationId'] = opts.organizationId;\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', { params });\n success(data, 'sonatypeiq', 'applications list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications list', startTime); }\n });\n\n applications\n .command('get')\n .description('Get an application by its public ID')\n .requiredOption('--public-id <id>', 'Application public ID')\n .action(async (opts: { publicId: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', {\n params: { publicId: opts.publicId }\n });\n success(data, 'sonatypeiq', 'applications get', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications get', startTime); }\n });\n\n const organizations = sonatypeiq.command('organizations').description('Organization operations');\n\n organizations\n .command('list')\n .description('List all organizations in Sonatype IQ Server')\n .action(async () => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/organizations');\n success(data, 'sonatypeiq', 'organizations list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'organizations list', startTime); }\n });\n\n const policies = sonatypeiq.command('policies').description('Policy operations');\n\n policies\n .command('list')\n .description('List all policies')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const path = opts.organizationId\n ? `/api/v2/policies/organization/${encodeURIComponent(opts.organizationId)}`\n : '/api/v2/policies';\n const data = await http.sonatypeiq<unknown>(path);\n success(data, 'sonatypeiq', 'policies list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'policies list', startTime); }\n });\n}\n","import { Command } from 'commander';\nimport { success, fail, warn } from '../../lib/output.js';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { fileURLToPath } from 'url';\nimport { execFileSync } from 'child_process';\nimport select from '@inquirer/select';\nimport checkbox, { Separator } from '@inquirer/checkbox';\nimport input from '@inquirer/input';\nimport { writeGlobalConfig, getGlobalConfigPath, loadJsonFile } from '../../lib/config.js';\nimport type { GlobalConfig, MarketplaceConfig } from '../../types/config.js';\n\nconst BACK = '__back__';\nconst ALL_MARKETPLACES = '__all_marketplaces__';\n\n/**\n * Injects an HTTP access token into a git clone URL.\n * - GitHub (github.com): uses the x-access-token scheme\n * https://x-access-token:<token>@github.com/owner/repo.git\n * - All other hosts (Bitbucket, self-hosted, etc.): uses the x-token-auth scheme\n * https://x-token-auth:<token>@host/path\n */\nexport function injectTokenIntoUrl(url: string, token: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`--token requires an HTTPS clone URL; got: ${url}`);\n }\n parsed.username = parsed.hostname === 'github.com' ? 'x-access-token' : 'x-token-auth';\n parsed.password = token;\n return parsed.toString();\n}\n\n/**\n * Derives a local directory name from a git clone URL by taking the last\n * path segment and stripping a trailing .git extension.\n * e.g. https://github.com/owner/my-marketplace.git → \"my-marketplace\"\n */\nexport function repoNameFromUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const segment = parsed.pathname.split('/').filter(Boolean).pop() ?? 'marketplace';\n return segment.replace(/\\.git$/i, '') || 'marketplace';\n } catch {\n return 'marketplace';\n }\n}\n\n/**\n * Returns the default local path for a marketplace clone:\n * <homedir>/.agents/marketplaces/<repoName>\n * Works cross-platform (os.homedir() resolves correctly on Windows too).\n */\nexport function defaultMarketplacePath(url: string): string {\n return path.join(os.homedir(), '.agents', 'marketplaces', repoNameFromUrl(url));\n}\n\nfunction marketplaceLabel(m: MarketplaceConfig): string {\n return m.name ?? repoNameFromUrl(m.repoUrl ?? '');\n}\n\n/** Strips injected credentials out of git error output before it reaches JSON output or logs. */\nfunction scrubToken(msg: string): string {\n return msg.replace(/x-(?:token-auth|access-token):[^@]+@/g, 'x-token-auth:***@');\n}\n\n/**\n * Throws a clear error instead of hanging when an interactive prompt would otherwise block a\n * non-TTY caller. Only stdin needs to be a TTY — pncli's stdout is JSON and piping it (to a file,\n * `jq`, etc.) is a normal, fully-interactive usage pattern.\n */\nfunction assertInteractive(hint: string): void {\n if (!process.stdin.isTTY) {\n throw new Error(`This selection requires an interactive terminal. ${hint}`);\n }\n}\n\nconst AGENT_PATHS: Record<string, { project: string; user: string }> = {\n 'github-copilot': { project: '.agents/skills', user: path.join(os.homedir(), '.agents/skills') },\n 'claude-code': { project: '.claude/skills', user: path.join(os.homedir(), '.claude/skills') },\n};\n\nfunction resolveAgentName(opts: { agent?: string; claude?: boolean }): string {\n return opts.claude ? 'claude-code' : (opts.agent ?? 'github-copilot');\n}\n\nfunction resolveAgentPaths(agentName: string): { project: string; user: string } {\n const agentConfig = AGENT_PATHS[agentName];\n if (!agentConfig) {\n throw new Error(`Unknown agent: \"${agentName}\". Use: ${Object.keys(AGENT_PATHS).join(' | ')}`);\n }\n return agentConfig;\n}\n\nfunction resolveTargetDir(opts: { agent?: string; claude?: boolean; scope?: string; target?: string }): string {\n if (opts.target) return path.resolve(opts.target);\n const agentConfig = resolveAgentPaths(resolveAgentName(opts));\n const scopePath = (opts.scope ?? 'user') === 'project' ? agentConfig.project : agentConfig.user;\n return path.resolve(scopePath);\n}\n\n// Resolve the bundled skills directory relative to this file (dist/cli.js → ../skills)\nfunction getBundledSkillsDir(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(thisFile), '..', 'skills');\n } catch {\n return '';\n }\n}\n\n/**\n * Path to the skill install metadata file inside a given skills target directory.\n */\nexport function getInstalledMetaPath(targetDir: string): string {\n return path.join(targetDir, '.pncli-installed.json');\n}\n\nexport interface InstalledSkillRecord {\n source: 'marketplace' | 'bundled';\n marketplace?: string;\n plugin?: string;\n installedFrom?: string;\n branch?: string;\n installedAt: string;\n}\n\n/**\n * Per-skill provenance file written inside each installed skill directory.\n * Self-contained alternative/supplement to the directory-level .pncli-installed.json index.\n */\nexport interface SkillOrigin {\n version: 1;\n source: 'marketplace' | 'bundled';\n marketplace?: string;\n plugin?: string;\n installedFrom?: string;\n branch?: string;\n installedAt: string;\n}\n\nconst SKILL_ORIGIN_FILENAME = 'pncli-origin.json';\n\n/**\n * Hidden subdirectory inside the skills target dir where disabled skills are stashed.\n * Starts with '.' so agents don't pick it up as a skills folder.\n */\nexport const DISABLED_SUBDIR = '.pncli-disabled';\n\nexport interface InstalledMeta {\n version: 1;\n skills: Record<string, InstalledSkillRecord>;\n disabled?: Record<string, InstalledSkillRecord>;\n}\n\n/**\n * Reads the installed-skills metadata from the target directory.\n */\nexport function readInstalledMeta(targetDir: string): InstalledMeta {\n const metaPath = getInstalledMetaPath(targetDir);\n const raw = loadJsonFile<InstalledMeta>(metaPath);\n if (raw && raw.version === 1 && raw.skills) return raw;\n return { version: 1, skills: {} };\n}\n\n/**\n * Returns the path to the per-skill origin file inside a given skill directory.\n */\nexport function getSkillOriginPath(skillDir: string): string {\n return path.join(skillDir, SKILL_ORIGIN_FILENAME);\n}\n\n/**\n * Reads the per-skill origin file, or returns null if absent/invalid.\n * Used for backward-compatible provenance lookup on skills installed before this feature.\n */\nexport function readSkillOrigin(skillDir: string): SkillOrigin | null {\n const originPath = getSkillOriginPath(skillDir);\n if (!fs.existsSync(originPath)) return null;\n try {\n const raw = JSON.parse(fs.readFileSync(originPath, 'utf8')) as SkillOrigin;\n if (raw && raw.version === 1 && raw.source) return raw;\n } catch { /* ignore parse errors */ }\n return null;\n}\n\nfunction matchesMarketplaceFilter(record: InstalledSkillRecord, filter?: string): boolean {\n return !filter || record.marketplace === filter || record.installedFrom === filter;\n}\n\n/**\n * Resolves the install record for a skill directory, preferring the directory-level\n * index and falling back to the per-skill pncli-origin.json for skills installed\n * before the index existed.\n */\nfunction resolveSkillRecord(meta: InstalledMeta, targetDir: string, skillName: string): InstalledSkillRecord | null {\n const fromMeta = meta.skills[skillName];\n if (fromMeta) return fromMeta;\n const perSkill = readSkillOrigin(path.join(targetDir, skillName));\n if (!perSkill) return null;\n return {\n source: perSkill.source,\n marketplace: perSkill.marketplace,\n plugin: perSkill.plugin,\n installedFrom: perSkill.installedFrom,\n branch: perSkill.branch,\n installedAt: perSkill.installedAt,\n };\n}\n\nfunction listActiveSkillDirs(targetDir: string): string[] {\n return fs.readdirSync(targetDir).filter(name => {\n if (name.startsWith('.')) return false;\n const p = path.join(targetDir, name);\n try { return fs.statSync(p).isDirectory(); } catch { return false; }\n });\n}\n\nexport interface DisablePluginResult {\n disabled: string[];\n alreadyDisabled: string[];\n skipped: string[];\n}\n\n/**\n * Moves every active skill belonging to `plugin` into the hidden stash directory and\n * records the move in the `disabled` map of .pncli-installed.json. Skills already\n * stashed are reported in `alreadyDisabled`; skills belonging to other plugins (or\n * not installed from a marketplace) in `skipped`. The metadata file is only written\n * when a skill actually moved.\n */\nexport function disablePluginSkills(targetDir: string, plugin: string, marketplaceFilter?: string): DisablePluginResult {\n const resolvedTarget = path.resolve(targetDir);\n const stashDir = path.join(targetDir, DISABLED_SUBDIR);\n const meta = readInstalledMeta(targetDir);\n const disabled: string[] = [];\n const alreadyDisabled: string[] = [];\n const skipped: string[] = [];\n\n for (const skillName of listActiveSkillDirs(targetDir)) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) continue;\n\n const record = resolveSkillRecord(meta, targetDir, skillName);\n if (!record || record.source !== 'marketplace') { skipped.push(skillName); continue; }\n if (!matchesMarketplaceFilter(record, marketplaceFilter) || record.plugin !== plugin) { skipped.push(skillName); continue; }\n\n const stashDest = path.join(stashDir, skillName);\n fs.mkdirSync(stashDir, { recursive: true });\n if (fs.existsSync(stashDest)) fs.rmSync(stashDest, { recursive: true, force: true });\n fs.renameSync(skillDir, stashDest);\n delete meta.skills[skillName];\n meta.disabled = meta.disabled ?? {};\n meta.disabled[skillName] = record;\n disabled.push(skillName);\n }\n\n for (const [skillName, record] of Object.entries(meta.disabled ?? {})) {\n if (record.plugin === plugin && matchesMarketplaceFilter(record, marketplaceFilter) && !disabled.includes(skillName)) {\n alreadyDisabled.push(skillName);\n }\n }\n\n if (disabled.length > 0) {\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n }\n return { disabled, alreadyDisabled, skipped };\n}\n\nexport interface EnablePluginResult {\n enabled: string[];\n stashMissing: string[];\n skipped: string[];\n hadDisabled: boolean;\n}\n\n/**\n * Moves every stashed skill belonging to `plugin` back into the skills directory and\n * returns its record to the `skills` map of .pncli-installed.json. Skills whose stash\n * directory has gone missing stay recorded in `disabled` (so metadata never claims an\n * install that isn't on disk) and are surfaced in `stashMissing` — the fix is to\n * re-install the plugin. The metadata file is only written when a skill actually moved.\n */\nexport function enablePluginSkills(targetDir: string, plugin: string, marketplaceFilter?: string): EnablePluginResult {\n const resolvedTarget = path.resolve(targetDir);\n const stashDir = path.join(targetDir, DISABLED_SUBDIR);\n const meta = readInstalledMeta(targetDir);\n const enabled: string[] = [];\n const stashMissing: string[] = [];\n const skipped: string[] = [];\n\n const disabledEntries = Object.entries(meta.disabled ?? {});\n for (const [skillName, record] of disabledEntries) {\n if (record.plugin !== plugin || !matchesMarketplaceFilter(record, marketplaceFilter)) { skipped.push(skillName); continue; }\n\n // skillName comes from user-editable JSON — reject anything that would escape targetDir.\n const dest = path.resolve(targetDir, skillName);\n if (!dest.startsWith(resolvedTarget + path.sep)) { skipped.push(skillName); continue; }\n\n const stashSrc = path.join(stashDir, skillName);\n if (!fs.existsSync(stashSrc)) {\n stashMissing.push(skillName);\n continue;\n }\n\n if (fs.existsSync(dest)) fs.rmSync(dest, { recursive: true, force: true });\n fs.renameSync(stashSrc, dest);\n meta.skills[skillName] = record;\n delete meta.disabled![skillName];\n enabled.push(skillName);\n }\n\n if (fs.existsSync(stashDir) && fs.readdirSync(stashDir).length === 0) {\n fs.rmdirSync(stashDir);\n }\n\n if (enabled.length > 0) {\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n }\n return { enabled, stashMissing, skipped, hadDisabled: disabledEntries.length > 0 };\n}\n\nexport interface PluginToggleState {\n plugin: string;\n marketplace?: string;\n activeSkills: string[];\n disabledSkills: string[];\n}\n\n/**\n * Groups the marketplace skills in a target directory by (marketplace, plugin) with\n * their enabled/disabled split. Feeds the interactive `marketplace toggle` picker.\n */\nexport function listPluginStates(targetDir: string): PluginToggleState[] {\n const meta = readInstalledMeta(targetDir);\n const byKey = new Map<string, PluginToggleState>();\n const bucketFor = (record: InstalledSkillRecord): PluginToggleState | null => {\n if (record.source !== 'marketplace' || !record.plugin) return null;\n const marketplaceName = record.marketplace ?? record.installedFrom;\n const key = `${marketplaceName ?? ''}\\u0000${record.plugin}`;\n let state = byKey.get(key);\n if (!state) {\n state = { plugin: record.plugin, marketplace: marketplaceName, activeSkills: [], disabledSkills: [] };\n byKey.set(key, state);\n }\n return state;\n };\n\n for (const skillName of listActiveSkillDirs(targetDir)) {\n const record = resolveSkillRecord(meta, targetDir, skillName);\n if (record) bucketFor(record)?.activeSkills.push(skillName);\n }\n for (const [skillName, record] of Object.entries(meta.disabled ?? {})) {\n bucketFor(record)?.disabledSkills.push(skillName);\n }\n return [...byKey.values()].sort((a, b) => a.plugin.localeCompare(b.plugin));\n}\n\n/**\n * Detects the currently checked-out branch name of a git repository at the given path.\n * Returns undefined if the path is not a git repo or is in detached-HEAD state.\n */\nexport function detectRepoBranch(repoPath: string): string | undefined {\n try {\n const result = execFileSync('git', ['-C', repoPath, 'rev-parse', '--abbrev-ref', 'HEAD'], {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return result && result !== 'HEAD' ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Records install provenance for one or more skills already copied into targetDir.\n * Writes to both the directory-level .pncli-installed.json index and a per-skill\n * pncli-origin.json inside each skill directory for self-contained traceability.\n * Shared by marketplace installs (source: 'marketplace') and bundled installs (source: 'bundled').\n */\nexport function recordInstalledSkills(targetDir: string, skillNames: string[], record: Omit<InstalledSkillRecord, 'installedAt'>): void {\n if (skillNames.length === 0) return;\n const meta = readInstalledMeta(targetDir);\n const now = new Date().toISOString();\n for (const skillName of skillNames) {\n const fullRecord: InstalledSkillRecord = { ...record, installedAt: now };\n meta.skills[skillName] = fullRecord;\n\n // Write per-skill origin file for self-contained provenance\n const skillDir = path.join(targetDir, skillName);\n if (fs.existsSync(skillDir)) {\n const origin: SkillOrigin = { version: 1, ...fullRecord };\n try {\n fs.writeFileSync(getSkillOriginPath(skillDir), JSON.stringify(origin, null, 2), 'utf8');\n } catch { /* non-fatal: directory-level index is the authoritative source */ }\n }\n }\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n}\n\n/**\n * Returns all registered marketplaces from the global config, merging the\n * legacy single `marketplace` field into the new `marketplaces` array.\n */\nexport function getAllMarketplaces(globalConfig: GlobalConfig): MarketplaceConfig[] {\n const result: MarketplaceConfig[] = [];\n if (Array.isArray(globalConfig.marketplaces)) {\n result.push(...globalConfig.marketplaces);\n }\n if (globalConfig.marketplace?.repoUrl) {\n const legacyUrl = globalConfig.marketplace.repoUrl;\n const alreadyPresent = result.some(m => m.repoUrl === legacyUrl);\n if (!alreadyPresent) {\n const existingNames = new Set(result.map(m => m.name).filter((n): n is string => !!n));\n let legacyName = globalConfig.marketplace.name ?? repoNameFromUrl(legacyUrl);\n if (existingNames.has(legacyName)) {\n let suffix = 2;\n while (existingNames.has(`${legacyName}-${suffix}`)) suffix++;\n legacyName = `${legacyName}-${suffix}`;\n }\n result.push({\n name: legacyName,\n repoUrl: globalConfig.marketplace.repoUrl,\n localPath: globalConfig.marketplace.localPath,\n token: globalConfig.marketplace.token,\n });\n }\n }\n return result;\n}\n\n/**\n * Saves an updated marketplaces array back to the global config, removing\n * the legacy `marketplace` field so it doesn't produce duplicate entries on next read.\n */\nfunction saveMarketplaces(configPath: string, existing: GlobalConfig, marketplaces: MarketplaceConfig[]): void {\n const updated: GlobalConfig = { ...existing, marketplaces };\n delete updated.marketplace;\n writeGlobalConfig(updated, configPath);\n}\n\n/**\n * Reads the global config and all registered marketplaces. If the legacy single-marketplace\n * field is still present, persists the migration immediately so every pncli upgrade transitions\n * seamlessly to the multi-marketplace format without the user re-running `marketplace add`.\n * Returns the (post-migration) config object so callers can reuse it for further writes.\n */\nfunction loadMarketplacesConfig(configPath: string): { existing: GlobalConfig; all: MarketplaceConfig[] } {\n const existing: GlobalConfig = loadJsonFile<GlobalConfig>(configPath) ?? {};\n const all = getAllMarketplaces(existing);\n if (existing.marketplace?.repoUrl) {\n saveMarketplaces(configPath, existing, all);\n warn('Migrated legacy single-marketplace config to the multi-marketplace format.');\n delete existing.marketplace;\n }\n return { existing, all };\n}\n\nfunction loadMarketplaces(configPath: string): MarketplaceConfig[] {\n return loadMarketplacesConfig(configPath).all;\n}\n\n/**\n * Adds or updates a marketplace entry in-place, refusing to silently clobber an unrelated\n * marketplace when its name or repo URL collides with an existing entry's identity.\n */\nexport function upsertMarketplace(all: MarketplaceConfig[], entry: MarketplaceConfig): void {\n const idxByUrl = all.findIndex(m => m.repoUrl === entry.repoUrl);\n const idxByName = all.findIndex(m => m.name === entry.name);\n if (idxByUrl !== -1) {\n if (idxByName !== -1 && idxByName !== idxByUrl) {\n throw new Error(`Marketplace name \"${entry.name}\" is already used by a different marketplace (${all[idxByName].repoUrl}). Choose a different --name.`);\n }\n // Re-running `add` without --token shouldn't silently wipe a previously stored token.\n all[idxByUrl] = { ...entry, token: entry.token ?? all[idxByUrl].token };\n } else if (idxByName !== -1) {\n throw new Error(`Marketplace name \"${entry.name}\" is already registered for a different repo (${all[idxByName].repoUrl}). Choose a different --name, or remove the existing marketplace first.`);\n } else {\n all.push(entry);\n }\n}\n\n/**\n * Clones (or re-clones) a marketplace repo to disk. Handles the Windows + Git Credential\n * Manager case where git writes auth warnings to stderr and exits non-zero even though the\n * clone succeeded — verified by checking that `git rev-parse HEAD` resolves at the destination.\n */\nfunction cloneOrReuseMarketplace(url: string, resolvedPath: string, opts: { branch?: string; token?: string }): void {\n const hasGit = fs.existsSync(path.join(resolvedPath, '.git'));\n if (fs.existsSync(resolvedPath) && !hasGit && fs.readdirSync(resolvedPath).length > 0) {\n throw new Error(`Directory already exists and is not a git repo: ${resolvedPath}`);\n }\n if (hasGit) {\n warn(`Directory already contains a git repo at ${resolvedPath} — skipping clone, updating config and re-installing plugins.`);\n return;\n }\n\n const branchLabel = opts.branch ?? 'remote default';\n warn(`Cloning ${url} (branch: ${branchLabel}) → ${resolvedPath}...`);\n const cloneUrl = opts.token ? injectTokenIntoUrl(url, opts.token) : url;\n const cloneArgs = ['clone'];\n if (opts.branch) cloneArgs.push('--branch', opts.branch);\n cloneArgs.push(cloneUrl, resolvedPath);\n try {\n execFileSync('git', cloneArgs, { stdio: ['inherit', 'inherit', 'pipe'] });\n } catch (e: unknown) {\n let cloneActuallySucceeded = false;\n try {\n execFileSync('git', ['-C', resolvedPath, 'rev-parse', 'HEAD'], { stdio: 'pipe' });\n cloneActuallySucceeded = true;\n } catch { /* repo not valid — fall through and re-throw original error */ }\n if (!cloneActuallySucceeded) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(scrubToken(msg));\n }\n }\n}\n\n/**\n * Pulls the latest content for a marketplace repo. Returns whether the pull brought in new changes.\n */\nfunction pullMarketplace(marketplacePath: string, repoUrl: string | undefined, token: string | undefined, marketplaceName: string): { updated: boolean } {\n warn(`Pulling latest content for \"${marketplaceName}\"...`);\n const gitArgs = ['-C', marketplacePath];\n if (repoUrl && token) {\n gitArgs.push('-c', `remote.origin.url=${injectTokenIntoUrl(repoUrl, token)}`);\n }\n gitArgs.push('pull');\n let pullOutput: string;\n try {\n pullOutput = execFileSync('git', gitArgs, { encoding: 'utf8', stdio: ['inherit', 'pipe', 'pipe'], env: { ...process.env, LANG: 'C', LC_ALL: 'C' } });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(scrubToken(msg));\n }\n const updated = !pullOutput.includes('Already up to date');\n if (pullOutput.trim() && updated) warn(pullOutput.trim());\n warn(updated ? `\"${marketplaceName}\" updated.` : `\"${marketplaceName}\" already up to date — no changes to sync.`);\n return { updated };\n}\n\n/**\n * Installs the given plugin names from a marketplace into targetDir, recording provenance.\n */\nfunction installPluginsForMarketplace(\n marketplacePath: string,\n marketplaceName: string,\n repoUrl: string | undefined,\n pluginNames: string[],\n targetDir: string\n): { results: Record<string, { installed: string[]; failed: string[] }>; totalInstalled: number } {\n const results: Record<string, { installed: string[]; failed: string[] }> = {};\n let totalInstalled = 0;\n\n const branch = detectRepoBranch(marketplacePath);\n\n for (const pluginName of pluginNames) {\n const skillsSrc = resolveSkillsSrc(marketplacePath, pluginName);\n if (!fs.existsSync(skillsSrc)) {\n results[pluginName] = { installed: [], failed: [] };\n warn(`No skills directory found for plugin \"${pluginName}\" in \"${marketplaceName}\" — skipping.`);\n continue;\n }\n const { installed, failed } = copyPluginSkills(skillsSrc, targetDir, {\n marketplace: marketplaceName,\n plugin: pluginName,\n installedFrom: repoUrl ?? '',\n branch,\n });\n results[pluginName] = { installed, failed };\n totalInstalled += installed.length;\n for (const skill of installed) {\n warn(` ${skill}: ${path.join(skillsSrc, skill)} → ${path.join(targetDir, skill)}`);\n }\n if (failed.length > 0) {\n warn(`Skipped ${failed.length} skill(s) with invalid names in \"${pluginName}\": ${failed.join(', ')}`);\n }\n }\n\n return { results, totalInstalled };\n}\n\n/**\n * Installs every plugin from a freshly cloned marketplace (used by `marketplace add`/`setup`).\n */\nfunction installAllPlugins(resolvedPath: string, marketplaceName: string, url: string, targetDir: string): { pluginResults: Record<string, { installed: string[]; failed: string[] }>; totalInstalled: number } {\n const pluginChoices = resolvePluginChoices(resolvedPath);\n if (pluginChoices.length === 0) {\n warn('No plugins found in marketplace. Check the marketplace repository structure.');\n return { pluginResults: {}, totalInstalled: 0 };\n }\n warn(`Installing ${pluginChoices.length} plugin(s) to ${targetDir}...`);\n const { results, totalInstalled } = installPluginsForMarketplace(resolvedPath, marketplaceName, url, pluginChoices.map(p => p.name), targetDir);\n return { pluginResults: results, totalInstalled };\n}\n\n/**\n * Pulls and installs plugins for one marketplace, honoring an optional plugin name filter\n * (\"all\" installs every plugin). Used by the \"sync every marketplace\" flows. Never throws —\n * problems are reported back as a `skipped` result so one bad marketplace doesn't abort the rest.\n */\nfunction syncMarketplacePlugins(m: MarketplaceConfig, targetDir: string, force: boolean, pluginFilter: string): Record<string, unknown> {\n const marketplaceName = marketplaceLabel(m);\n try {\n const marketplacePath = m.localPath;\n if (!marketplacePath || !fs.existsSync(marketplacePath)) {\n warn(`Marketplace \"${marketplaceName}\" local path not found — skipping.`);\n return { marketplace: marketplaceName, skipped: true, message: 'Local path not found.' };\n }\n\n const { updated } = pullMarketplace(marketplacePath, m.repoUrl, m.token, marketplaceName);\n if (!updated && !force) {\n return { marketplace: marketplaceName, marketplaceUpdated: false, skipped: true, message: 'No changes detected — skipping install. Use --force to reinstall anyway.' };\n }\n\n const pluginChoices = resolvePluginChoices(marketplacePath);\n if (pluginChoices.length === 0) {\n warn(`No plugins found in marketplace \"${marketplaceName}\" — skipping.`);\n return { marketplace: marketplaceName, skipped: true, message: 'No plugins found.' };\n }\n\n let pluginNames: string[];\n if (pluginFilter === 'all') {\n pluginNames = pluginChoices.map(p => p.name);\n } else if (pluginChoices.some(p => p.name === pluginFilter)) {\n pluginNames = [pluginFilter];\n } else {\n warn(`Plugin \"${pluginFilter}\" not found in \"${marketplaceName}\" — skipping.`);\n return { marketplace: marketplaceName, skipped: true, message: `Plugin \"${pluginFilter}\" not found.` };\n }\n\n const { results, totalInstalled } = installPluginsForMarketplace(marketplacePath, marketplaceName, m.repoUrl, pluginNames, targetDir);\n return { marketplace: marketplaceName, plugins: results, total: totalInstalled, marketplaceUpdated: updated };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n warn(`Marketplace \"${marketplaceName}\" failed — skipping. ${message}`);\n return { marketplace: marketplaceName, skipped: true, error: message };\n }\n}\n\ninterface MarketplaceAddOptions {\n name?: string;\n branch?: string;\n token?: string;\n agent?: string;\n claude?: boolean;\n}\n\n/**\n * Core of `marketplace add`: clones/registers the marketplace and installs all of its\n * plugins. Shared by the `add`/`setup` commands and the interactive `manage` hub.\n * Throws on failure; the callers wrap it in success/fail output.\n */\nfunction performMarketplaceAdd(url: string, localPath: string | undefined, opts: MarketplaceAddOptions): Record<string, unknown> {\n const resolvedPath = path.resolve(localPath ?? defaultMarketplacePath(url));\n const marketplaceName = opts.name ?? repoNameFromUrl(url);\n\n cloneOrReuseMarketplace(url, resolvedPath, opts);\n\n const configPath = getGlobalConfigPath();\n const { existing, all } = loadMarketplacesConfig(configPath);\n const entry: MarketplaceConfig = {\n name: marketplaceName,\n repoUrl: url,\n localPath: resolvedPath,\n ...(opts.token ? { token: opts.token } : {}),\n };\n upsertMarketplace(all, entry);\n saveMarketplaces(configPath, existing, all);\n\n const targetDir = resolveAgentPaths(resolveAgentName(opts)).user;\n\n const { pluginResults, totalInstalled } = installAllPlugins(resolvedPath, marketplaceName, url, targetDir);\n\n return {\n name: marketplaceName,\n repoUrl: url,\n localPath: resolvedPath,\n branch: opts.branch ?? null,\n tokenConfigured: !!opts.token,\n plugins: pluginResults,\n total: totalInstalled,\n target: targetDir,\n };\n}\n\n/**\n * Core of `marketplace remove`: unregisters a marketplace from the global config\n * (does not delete the local clone). Shared by the `remove` command and the\n * interactive `manage` hub. Throws when the marketplace is not found.\n */\nfunction performMarketplaceRemove(name: string): Record<string, unknown> {\n const configPath = getGlobalConfigPath();\n const { existing, all } = loadMarketplacesConfig(configPath);\n\n const idx = all.findIndex(m => m.name === name || m.repoUrl === name);\n if (idx === -1) {\n throw new Error(`Marketplace \"${name}\" not found. Run: pncli skills marketplace list`);\n }\n\n const removed = all.splice(idx, 1)[0];\n saveMarketplaces(configPath, existing, all);\n\n return {\n removed: {\n name: marketplaceLabel(removed),\n repoUrl: removed.repoUrl,\n localPath: removed.localPath,\n },\n remaining: all.length,\n };\n}\n\n/**\n * Shared implementation for `marketplace add` and `marketplace setup` (kept as a backward-compatible\n * alias) — clones/registers the marketplace and installs all of its plugins.\n */\nasync function marketplaceAddAction(url: string, localPath: string | undefined, opts: MarketplaceAddOptions, commandName: 'marketplace-add' | 'marketplace-setup'): Promise<void> {\n const start = Date.now();\n try {\n success(performMarketplaceAdd(url, localPath, opts), 'skills', commandName, start);\n } catch (err) {\n fail(err, 'skills', commandName, start);\n }\n}\n\nexport function registerSkillsCommands(program: Command): void {\n const skills = program.command('skills').description('Manage pncli Claude Code skills');\n\n skills\n .command('install')\n .description('Install pncli skills into the current repo')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override install directory (ignores --agent and --scope)')\n\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(opts.agent);\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n const resolvedTarget = path.resolve(targetDir);\n const bundledDir = getBundledSkillsDir();\n let skillDirs: string[] = [];\n\n if (bundledDir !== '') {\n try {\n skillDirs = fs.readdirSync(bundledDir).filter(name =>\n fs.existsSync(path.join(bundledDir, name, 'SKILL.md'))\n );\n } catch { /* bundledDir not readable */ }\n }\n\n if (skillDirs.length === 0) {\n throw new Error('No bundled skills found. Reinstall pncli to get the latest version: npm install -g @kolatts/pncli');\n }\n\n const installed: string[] = [];\n const failed: string[] = [];\n\n // Remove only pncli-managed skills (not user-created ones)\n for (const skillName of skillDirs) {\n const existingDir = path.resolve(targetDir, skillName);\n if (!existingDir.startsWith(resolvedTarget + path.sep)) continue;\n if (fs.existsSync(existingDir)) {\n fs.rmSync(existingDir, { recursive: true, force: true });\n }\n }\n\n warn(`Installing ${skillDirs.length} bundled skill(s) to ${targetDir}...`);\n\n for (const skillName of skillDirs) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) {\n failed.push(skillName);\n continue;\n }\n\n try {\n const mdFiles = fs.readdirSync(path.join(bundledDir, skillName))\n .filter(f => f.endsWith('.md'));\n fs.mkdirSync(skillDir, { recursive: true });\n for (const mdFile of mdFiles) {\n const content = fs.readFileSync(path.join(bundledDir, skillName, mdFile), 'utf8');\n fs.writeFileSync(path.join(skillDir, mdFile), content, 'utf8');\n }\n installed.push(skillName);\n } catch {\n failed.push(skillName);\n }\n }\n\n warn(`Installed ${installed.length} skill(s) to ${targetDir}`);\n if (failed.length > 0) {\n warn(`Failed to install: ${failed.join(', ')}`);\n }\n\n recordInstalledSkills(targetDir, installed, { source: 'bundled' });\n\n success({\n installed,\n failed,\n target: targetDir,\n total: installed.length,\n agent: opts.target ? 'custom' : opts.agent,\n scope: opts.target ? 'custom' : opts.scope,\n source: 'bundled',\n }, 'skills', 'install', start);\n } catch (err) {\n fail(err, 'skills', 'install', start);\n }\n });\n\n skills\n .command('list')\n .description('List locally installed skills')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override skills directory to scan')\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(opts.agent);\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n if (!fs.existsSync(targetDir)) {\n success({ skills: [], message: `No skills directory found at ${targetDir}. Run: pncli skills install` }, 'skills', 'list', start);\n return;\n }\n\n const meta = readInstalledMeta(targetDir);\n\n const skillDirs = fs.readdirSync(targetDir).filter(name => {\n if (name.startsWith('.')) return false;\n const skillPath = path.join(targetDir, name, 'SKILL.md');\n return fs.existsSync(skillPath);\n });\n\n const skillsList = skillDirs.map(name => {\n const content = fs.readFileSync(path.join(targetDir, name, 'SKILL.md'), 'utf8');\n const frontmatter = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n const data: Record<string, string> = {};\n const metadata: Record<string, string> = {};\n if (frontmatter) {\n let inMetadata = false;\n for (const line of frontmatter[1].split('\\n')) {\n if (line.trimEnd() === 'metadata:') { inMetadata = true; continue; }\n if (inMetadata && line.startsWith(' ')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx !== -1) {\n metadata[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n continue;\n }\n inMetadata = false;\n const colonIdx = line.indexOf(':');\n if (colonIdx === -1) continue;\n data[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n }\n return {\n name: data.name || name,\n slug: name,\n category: metadata.category || data.category || 'other',\n services: metadata.services || data.services || '',\n providers: metadata.providers || data.providers || 'none',\n userInvocable: data['user-invocable'] === 'true',\n installed: meta.skills[name] ?? null,\n };\n });\n\n success({ skills: skillsList, total: skillsList.length }, 'skills', 'list', start);\n } catch (err) {\n fail(err, 'skills', 'list', start);\n }\n });\n\n skills\n .command('uninstall')\n .description('Uninstall a skill (defaults to user scope, matching the marketplace install target; pass --scope project for skills installed via `skills install`)')\n .argument('<name>', 'Skill name to uninstall (the directory name under your skills folder)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope to uninstall from: project | user', 'user')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--target <dir>', 'Override skills directory')\n .action((name: string, opts: { agent?: string; scope?: string; claude?: boolean; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(resolveAgentName(opts));\n const scopePath = opts.scope === 'project' ? agentConfig.project : agentConfig.user;\n targetDir = path.resolve(scopePath);\n }\n\n const resolvedTarget = path.resolve(targetDir);\n const skillDir = path.resolve(targetDir, name);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) {\n throw new Error(`Invalid skill name: \"${name}\"`);\n }\n\n if (!fs.existsSync(skillDir)) {\n throw new Error(`Skill \"${name}\" not found at ${skillDir}`);\n }\n\n const meta = readInstalledMeta(targetDir);\n const record = meta.skills[name];\n\n fs.rmSync(skillDir, { recursive: true, force: true });\n\n delete meta.skills[name];\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n\n success({\n uninstalled: name,\n target: targetDir,\n wasTracked: !!record,\n ...(record ? { installedFrom: record } : {}),\n }, 'skills', 'uninstall', start);\n } catch (err) {\n fail(err, 'skills', 'uninstall', start);\n }\n });\n\n const marketplace = skills.command('marketplace').description('Manage git-hosted skills marketplaces');\n\n function withMarketplaceAddOptions(cmd: Command): Command {\n return cmd\n .argument('<url>', 'Git clone URL of the marketplace repository')\n .argument('[localPath]', 'Local directory to clone into (default: ~/.agents/marketplaces/<repo-name>)')\n .option('--name <name>', 'Human-readable name for this marketplace (default: derived from URL)')\n .option('--branch <branch>', 'Branch to clone (default: remote HEAD)')\n .option('--token <token>', 'HTTP access token for authenticated clone and pull (GitHub PAT or Bitbucket token)')\n .option('--agent <agent>', 'Target agent host for plugin install: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code');\n }\n\n withMarketplaceAddOptions(\n marketplace.command('add').description('Register a new marketplace, clone it, and install all its plugins')\n ).action((url: string, localPath: string | undefined, opts: MarketplaceAddOptions) => marketplaceAddAction(url, localPath, opts, 'marketplace-add'));\n\n // Kept as an alias for `add` for backward compatibility with existing scripts/docs.\n withMarketplaceAddOptions(\n marketplace.command('setup').description('Alias for `marketplace add` — clone a marketplace and install all its plugins')\n ).action((url: string, localPath: string | undefined, opts: MarketplaceAddOptions) => marketplaceAddAction(url, localPath, opts, 'marketplace-setup'));\n\n marketplace\n .command('list')\n .description('List all registered marketplaces')\n .action(() => {\n const start = Date.now();\n try {\n const configPath = getGlobalConfigPath();\n const all = loadMarketplaces(configPath);\n\n success({\n marketplaces: all.map(m => ({\n name: marketplaceLabel(m),\n repoUrl: m.repoUrl,\n localPath: m.localPath,\n tokenConfigured: !!m.token,\n })),\n total: all.length,\n }, 'skills', 'marketplace-list', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-list', start);\n }\n });\n\n marketplace\n .command('plugins')\n .description('List the plugins available in a registered marketplace')\n .argument('<name>', 'Marketplace name (or repo URL) to inspect')\n .action((name: string) => {\n const start = Date.now();\n try {\n const configPath = getGlobalConfigPath();\n const all = loadMarketplaces(configPath);\n const found = all.find(m => m.name === name || m.repoUrl === name);\n if (!found) {\n throw new Error(`Marketplace \"${name}\" not found. Run: pncli skills marketplace list`);\n }\n if (!found.localPath || !fs.existsSync(found.localPath)) {\n throw new Error(`Marketplace \"${marketplaceLabel(found)}\" local path not found at ${found.localPath ?? '(not set)'}. Run: pncli skills marketplace add <url>`);\n }\n\n const plugins = resolvePluginChoices(found.localPath);\n success({\n marketplace: marketplaceLabel(found),\n plugins,\n total: plugins.length,\n }, 'skills', 'marketplace-plugins', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-plugins', start);\n }\n });\n\n marketplace\n .command('remove')\n .description('Remove a registered marketplace from the config (does not delete the local clone)')\n .argument('<name>', 'Name of the marketplace to remove')\n .action((name: string) => {\n const start = Date.now();\n try {\n success(performMarketplaceRemove(name), 'skills', 'marketplace-remove', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-remove', start);\n }\n });\n\n marketplace\n .command('sync')\n .description('Pull latest marketplace content and install plugin skills (interactive picker when no plugin is given)')\n .argument('[plugin]', 'Plugin name to install, or \"all\" to install every plugin (skips interactive selection)')\n .option('--marketplace <name>', 'Marketplace name to sync, or \"all\" to sync every registered marketplace (skips interactive selection)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--force', 'Reinstall even if a marketplace has no new changes (applies to single-plugin and \"all\" installs alike)')\n .action(async (plugin: string | undefined, opts: { marketplace?: string; agent?: string; claude?: boolean; force?: boolean }) => {\n const start = Date.now();\n try {\n const configPath = getGlobalConfigPath();\n const allMarketplaces = loadMarketplaces(configPath);\n if (allMarketplaces.length === 0) {\n throw new Error('No marketplaces configured. Run: pncli skills marketplace add <url>');\n }\n\n const targetDir = resolveAgentPaths(resolveAgentName(opts)).user;\n const force = opts.force ?? false;\n\n // Non-interactive \"sync everything\" — explicit flag.\n if (opts.marketplace === 'all') {\n const results = allMarketplaces.map(m => syncMarketplacePlugins(m, targetDir, force, plugin ?? 'all'));\n success({ allMarketplaces: true, marketplaces: results, target: targetDir }, 'skills', 'marketplace-sync', start);\n return;\n }\n\n let selectedMarketplace: MarketplaceConfig | undefined;\n let selectedPlugin: string | undefined = plugin;\n const canGoBack = !opts.marketplace && allMarketplaces.length > 1;\n\n if (opts.marketplace) {\n const found = allMarketplaces.find(m => m.name === opts.marketplace || m.repoUrl === opts.marketplace);\n if (!found) {\n throw new Error(`Marketplace \"${opts.marketplace}\" not found. Run: pncli skills marketplace list`);\n }\n selectedMarketplace = found;\n } else if (allMarketplaces.length === 1) {\n selectedMarketplace = allMarketplaces[0];\n }\n\n // Interactive loop: lets the user back out of a plugin prompt and reselect the marketplace.\n for (;;) {\n if (!selectedMarketplace) {\n assertInteractive(`Multiple marketplaces are registered (${allMarketplaces.map(marketplaceLabel).join(', ')}). Pass --marketplace <name> (or --marketplace all) to run this non-interactively.`);\n const chosen = await select({\n message: 'Select a marketplace to sync:',\n choices: [\n { value: ALL_MARKETPLACES, name: 'All marketplaces — sync every plugin from every marketplace' },\n // Index-based values: labels alone aren't guaranteed unique (two marketplaces can share a derived name).\n ...allMarketplaces.map((m, i) => ({ value: String(i), name: `${marketplaceLabel(m)} — ${m.repoUrl ?? ''}` })),\n ],\n });\n if (chosen === ALL_MARKETPLACES) {\n const results = allMarketplaces.map(m => syncMarketplacePlugins(m, targetDir, force, selectedPlugin ?? 'all'));\n success({ allMarketplaces: true, marketplaces: results, target: targetDir }, 'skills', 'marketplace-sync', start);\n return;\n }\n selectedMarketplace = allMarketplaces[Number(chosen)];\n if (!selectedMarketplace) {\n throw new Error(`Marketplace \"${chosen}\" not found.`);\n }\n }\n\n const marketplaceName = marketplaceLabel(selectedMarketplace);\n const marketplacePath = selectedMarketplace.localPath;\n if (!marketplacePath || !fs.existsSync(marketplacePath)) {\n throw new Error(`Marketplace \"${marketplaceName}\" local path not found at ${marketplacePath ?? '(not set)'}. Run: pncli skills marketplace add <url>`);\n }\n\n const { updated } = pullMarketplace(marketplacePath, selectedMarketplace.repoUrl, selectedMarketplace.token, marketplaceName);\n\n const pluginChoices = resolvePluginChoices(marketplacePath);\n if (pluginChoices.length === 0) {\n throw new Error(`No plugins found in marketplace \"${marketplaceName}\". Check the marketplace repository structure.`);\n }\n\n if (!selectedPlugin) {\n assertInteractive(`Pass a plugin name (or \"all\") to run this non-interactively.`);\n const choices: { value: string; name: string }[] = [\n { value: 'all', name: 'All — install every plugin' },\n ...pluginChoices.map(p => ({ value: p.name, name: p.description ? `${p.name} — ${p.description}` : p.name })),\n ];\n if (canGoBack) {\n choices.push({ value: BACK, name: '← Back to marketplace selection' });\n }\n const chosen = await select({ message: `Select a plugin from \"${marketplaceName}\" to install:`, choices });\n if (chosen === BACK) {\n selectedMarketplace = undefined;\n continue;\n }\n selectedPlugin = chosen;\n } else if (selectedPlugin !== 'all' && !pluginChoices.some(p => p.name === selectedPlugin)) {\n throw new Error(`Plugin \"${selectedPlugin}\" not found in \"${marketplaceName}\". Available: ${pluginChoices.map(p => p.name).join(', ')}`);\n }\n\n if (!updated && !force) {\n success({\n marketplace: marketplaceName,\n marketplaceUpdated: false,\n updated: false,\n skipped: true,\n message: `No changes detected in \"${marketplaceName}\" — skipping install. Use --force to reinstall anyway.`,\n }, 'skills', 'marketplace-sync', start);\n return;\n }\n\n const pluginNames = selectedPlugin === 'all' ? pluginChoices.map(p => p.name) : [selectedPlugin];\n const { results, totalInstalled } = installPluginsForMarketplace(marketplacePath, marketplaceName, selectedMarketplace.repoUrl, pluginNames, targetDir);\n\n if (selectedPlugin === 'all') {\n success({ marketplace: marketplaceName, plugins: results, total: totalInstalled, target: targetDir, marketplaceUpdated: updated }, 'skills', 'marketplace-sync', start);\n } else {\n const single = results[selectedPlugin] ?? { installed: [], failed: [] };\n success({\n marketplace: marketplaceName,\n plugin: selectedPlugin,\n installed: single.installed,\n failed: single.failed,\n total: single.installed.length,\n target: targetDir,\n marketplaceUpdated: updated,\n }, 'skills', 'marketplace-sync', start);\n }\n return;\n }\n } catch (err) {\n fail(err, 'skills', 'marketplace-sync', start);\n }\n });\n\n marketplace\n .command('purge-plugin')\n .description('Remove all skills installed from a specific plugin (or all plugins in a marketplace)')\n .argument('<plugin>', 'Plugin name to purge, or \"all\" to remove every skill from the marketplace')\n .option('--marketplace <name>', 'Restrict purge to skills from this marketplace (by name or repo URL)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action((plugin: string, opts: { marketplace?: string; agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(resolveAgentName(opts));\n const scopePath = (opts.scope ?? 'user') === 'project' ? agentConfig.project : agentConfig.user;\n targetDir = path.resolve(scopePath);\n }\n const resolvedTarget = path.resolve(targetDir);\n\n if (!fs.existsSync(targetDir)) {\n success({ removed: [], total: 0, target: targetDir, message: 'No skills directory found.' }, 'skills', 'marketplace-purge-plugin', start);\n return;\n }\n\n const meta = readInstalledMeta(targetDir);\n const removed: string[] = [];\n const skipped: string[] = [];\n\n const skillDirs = fs.readdirSync(targetDir).filter(name => {\n if (name.startsWith('.')) return false;\n const p = path.join(targetDir, name);\n try { return fs.statSync(p).isDirectory(); } catch { return false; }\n });\n\n for (const skillName of skillDirs) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) continue;\n\n // Resolve provenance: prefer directory-level index, fall back to per-skill origin file.\n let record: InstalledSkillRecord | null = meta.skills[skillName] ?? null;\n if (!record) {\n const perSkill = readSkillOrigin(skillDir);\n if (perSkill) {\n record = {\n source: perSkill.source,\n marketplace: perSkill.marketplace,\n plugin: perSkill.plugin,\n installedFrom: perSkill.installedFrom,\n branch: perSkill.branch,\n installedAt: perSkill.installedAt,\n };\n }\n }\n\n if (!record || record.source !== 'marketplace') {\n skipped.push(skillName);\n continue;\n }\n\n const matchesMarketplace = !opts.marketplace ||\n record.marketplace === opts.marketplace ||\n record.installedFrom === opts.marketplace;\n const matchesPlugin = plugin === 'all' || record.plugin === plugin;\n\n if (!matchesMarketplace || !matchesPlugin) {\n skipped.push(skillName);\n continue;\n }\n\n fs.rmSync(skillDir, { recursive: true, force: true });\n delete meta.skills[skillName];\n removed.push(skillName);\n }\n\n if (removed.length > 0) {\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n }\n\n success({\n removed,\n skipped: skipped.length,\n total: removed.length,\n target: targetDir,\n plugin,\n ...(opts.marketplace ? { marketplace: opts.marketplace } : {}),\n }, 'skills', 'marketplace-purge-plugin', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-purge-plugin', start);\n }\n });\n\n marketplace\n .command('disable')\n .description('Temporarily deactivate a plugin\\'s skills without deleting them (re-enable with `marketplace enable`)')\n .argument('<plugin>', 'Plugin name to disable')\n .option('--marketplace <name>', 'Restrict to skills from this marketplace (by name or repo URL)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action((plugin: string, opts: { marketplace?: string; agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n const targetDir = resolveTargetDir(opts);\n if (!fs.existsSync(targetDir)) {\n success({ disabled: [], total: 0, target: targetDir, message: 'No skills directory found.' }, 'skills', 'marketplace-disable', start);\n return;\n }\n\n const result = disablePluginSkills(targetDir, plugin, opts.marketplace);\n success({\n disabled: result.disabled,\n alreadyDisabled: result.alreadyDisabled,\n skipped: result.skipped.length,\n total: result.disabled.length,\n target: targetDir,\n plugin,\n stash: path.join(targetDir, DISABLED_SUBDIR),\n ...(opts.marketplace ? { marketplace: opts.marketplace } : {}),\n }, 'skills', 'marketplace-disable', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-disable', start);\n }\n });\n\n marketplace\n .command('enable')\n .description('Re-activate a previously disabled plugin\\'s skills')\n .argument('<plugin>', 'Plugin name to enable')\n .option('--marketplace <name>', 'Restrict to skills from this marketplace (by name or repo URL)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action((plugin: string, opts: { marketplace?: string; agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n const targetDir = resolveTargetDir(opts);\n if (!fs.existsSync(targetDir)) {\n success({ enabled: [], total: 0, target: targetDir, message: 'No skills directory found.' }, 'skills', 'marketplace-enable', start);\n return;\n }\n\n const result = enablePluginSkills(targetDir, plugin, opts.marketplace);\n if (!result.hadDisabled) {\n success({ enabled: [], total: 0, target: targetDir, plugin, message: `No disabled skills found for plugin \"${plugin}\".` }, 'skills', 'marketplace-enable', start);\n return;\n }\n\n success({\n enabled: result.enabled,\n skipped: result.skipped.length,\n total: result.enabled.length,\n target: targetDir,\n plugin,\n ...(result.stashMissing.length > 0 ? {\n stashMissing: result.stashMissing,\n warning: `Skills marked disabled but missing from the stash were left as-is. Re-install the plugin (pncli skills marketplace sync ${plugin}) to restore them.`,\n } : {}),\n ...(opts.marketplace ? { marketplace: opts.marketplace } : {}),\n }, 'skills', 'marketplace-enable', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-enable', start);\n }\n });\n\n marketplace\n .command('manage')\n .description('Manage marketplaces and plugins: toggle plugins on/off, add or remove marketplaces (interactive)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action(async (opts: { agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n assertInteractive('Use `pncli skills marketplace enable|disable <plugin>`, `add <url>`, and `remove <name>` to manage non-interactively.');\n const targetDir = resolveTargetDir(opts);\n\n interface PluginChange { plugin: string; marketplace?: string; skills: string[] }\n const enabledPlugins: PluginChange[] = [];\n const disabledPlugins: PluginChange[] = [];\n const stashMissing: string[] = [];\n const addedMarketplaces: Record<string, unknown>[] = [];\n const removedMarketplaces: Record<string, unknown>[] = [];\n\n // Hub loop: each pass re-reads config and the skills dir so the menu reflects\n // whatever the previous action changed.\n for (;;) {\n const states = fs.existsSync(targetDir) ? listPluginStates(targetDir) : [];\n const registered = loadMarketplaces(getGlobalConfigPath());\n\n const action = await select({\n message: `Manage skills marketplaces (target: ${targetDir}):`,\n choices: [\n ...(states.length > 0 ? [{ value: 'toggle', name: `Toggle plugins on/off (${states.length} installed)` }] : []),\n { value: 'add', name: 'Add a marketplace' },\n ...(registered.length > 0 ? [{ value: 'remove', name: `Remove a marketplace (${registered.length} registered)` }] : []),\n { value: 'done', name: 'Done' },\n ],\n });\n if (action === 'done') break;\n\n if (action === 'toggle') {\n // Group the checkbox list by marketplace with separator headers.\n const sorted = [...states].sort((a, b) =>\n (a.marketplace ?? '').localeCompare(b.marketplace ?? '') || a.plugin.localeCompare(b.plugin));\n const choices: (Separator | { name: string; value: number; checked: boolean })[] = [];\n let lastMarketplace: string | null = null;\n sorted.forEach((state, index) => {\n const marketplaceName = state.marketplace ?? '(unknown marketplace)';\n if (marketplaceName !== lastMarketplace) {\n choices.push(new Separator(`── ${marketplaceName} ──`));\n lastMarketplace = marketplaceName;\n }\n const active = state.activeSkills.length;\n const stashed = state.disabledSkills.length;\n const skillCount =\n stashed === 0 ? `${active} skill${active === 1 ? '' : 's'}` :\n active === 0 ? `${stashed} skill${stashed === 1 ? '' : 's'}, disabled` :\n `${active} active, ${stashed} disabled`;\n choices.push({ name: `${state.plugin} (${skillCount})`, value: index, checked: active > 0 });\n });\n\n const checkedIndexes = await checkbox<number>({\n message: 'Toggle plugins (space toggles, enter applies):',\n choices,\n pageSize: 15,\n });\n const wanted = new Set(checkedIndexes);\n\n sorted.forEach((state, index) => {\n if (wanted.has(index)) {\n // Desired state: enabled. Restore any stashed skills (no-op when fully active).\n if (state.disabledSkills.length === 0) return;\n const result = enablePluginSkills(targetDir, state.plugin, state.marketplace);\n stashMissing.push(...result.stashMissing);\n if (result.enabled.length > 0) {\n enabledPlugins.push({ plugin: state.plugin, marketplace: state.marketplace, skills: result.enabled });\n }\n } else {\n // Desired state: disabled. Stash any active skills (no-op when fully stashed).\n if (state.activeSkills.length === 0) return;\n const result = disablePluginSkills(targetDir, state.plugin, state.marketplace);\n if (result.disabled.length > 0) {\n disabledPlugins.push({ plugin: state.plugin, marketplace: state.marketplace, skills: result.disabled });\n }\n }\n });\n } else if (action === 'add') {\n const url = (await input({\n message: 'Git clone URL of the marketplace repository:',\n validate: v => v.trim().length > 0 || 'URL is required',\n })).trim();\n const name = (await input({\n message: 'Marketplace name:',\n default: repoNameFromUrl(url),\n })).trim();\n addedMarketplaces.push(performMarketplaceAdd(url, undefined, {\n name: name || undefined,\n agent: opts.agent,\n claude: opts.claude,\n }));\n } else if (action === 'remove') {\n const chosen = await select({\n message: 'Remove which marketplace? (the local clone is kept on disk)',\n choices: [\n // Index-based values: labels alone aren't guaranteed unique (two marketplaces can share a derived name).\n ...registered.map((m, i) => ({ value: String(i), name: `${marketplaceLabel(m)} — ${m.repoUrl ?? ''}` })),\n { value: BACK, name: '← Back' },\n ],\n });\n if (chosen === BACK) continue;\n const target = registered[Number(chosen)];\n removedMarketplaces.push(performMarketplaceRemove(target.repoUrl ?? marketplaceLabel(target)));\n }\n }\n\n success({\n enabled: enabledPlugins,\n disabled: disabledPlugins,\n addedMarketplaces,\n removedMarketplaces,\n target: targetDir,\n ...(stashMissing.length > 0 ? {\n stashMissing,\n warning: 'Skills marked disabled but missing from the stash were left as-is. Re-install their plugin (pncli skills marketplace sync <plugin>) to restore them.',\n } : {}),\n }, 'skills', 'marketplace-manage', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-manage', start);\n }\n });\n\n skills\n .command('purge-user')\n .description('Remove all skills from the user-level skills folder for the target agent')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--force', 'Skip confirmation — remove all skills without prompting')\n .action((opts: { agent?: string; claude?: boolean; force?: boolean }) => {\n const start = Date.now();\n try {\n const userDir = resolveAgentPaths(resolveAgentName(opts)).user;\n\n if (!fs.existsSync(userDir)) {\n success({ removed: 0, target: userDir, message: 'No user-level skills directory found — nothing to purge.' }, 'skills', 'purge-user', start);\n return;\n }\n\n // Count skills before purging so the output is informative even with --force.\n const skillDirs = fs.readdirSync(userDir).filter(name => {\n if (name.startsWith('.')) return false;\n const p = path.join(userDir, name);\n try { return fs.statSync(p).isDirectory(); } catch { return false; }\n });\n\n if (skillDirs.length === 0) {\n success({ removed: 0, target: userDir, message: 'No skills found in user-level skills directory.' }, 'skills', 'purge-user', start);\n return;\n }\n\n if (!opts.force) {\n throw new Error(\n `This will remove ${skillDirs.length} skill(s) from ${userDir}: ${skillDirs.join(', ')}.\\n` +\n 'Re-run with --force to confirm, or use `pncli skills marketplace purge-plugin` to target a specific plugin.'\n );\n }\n\n for (const name of skillDirs) {\n const skillDir = path.resolve(userDir, name);\n if (!skillDir.startsWith(path.resolve(userDir) + path.sep)) continue;\n fs.rmSync(skillDir, { recursive: true, force: true });\n }\n\n // Clear the metadata index too.\n const metaPath = getInstalledMetaPath(userDir);\n if (fs.existsSync(metaPath)) {\n fs.writeFileSync(metaPath, JSON.stringify({ version: 1, skills: {} }, null, 2), 'utf8');\n }\n\n success({ removed: skillDirs.length, skills: skillDirs, target: userDir }, 'skills', 'purge-user', start);\n } catch (err) {\n fail(err, 'skills', 'purge-user', start);\n }\n });\n}\n\nexport function resolvePluginChoices(marketplacePath: string): { name: string; description: string }[] {\n const marketplaceJsonPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');\n if (fs.existsSync(marketplaceJsonPath)) {\n try {\n const meta = JSON.parse(fs.readFileSync(marketplaceJsonPath, 'utf8')) as {\n plugins?: { name: string; description?: string }[];\n };\n if (Array.isArray(meta.plugins) && meta.plugins.length > 0) {\n return meta.plugins.map(p => ({ name: p.name, description: p.description ?? '' }));\n }\n } catch { /* fallthrough to dir scan */ }\n }\n\n const pluginsDir = path.join(marketplacePath, 'plugins');\n if (fs.existsSync(pluginsDir)) {\n return fs.readdirSync(pluginsDir)\n .filter(name => fs.statSync(path.join(pluginsDir, name)).isDirectory())\n .map(name => ({ name, description: '' }));\n }\n\n return [];\n}\n\nexport function resolveSkillsSrc(marketplacePath: string, selectedPlugin: string): string {\n const pluginsBase = path.resolve(marketplacePath, 'plugins');\n const skillsSrc = path.resolve(pluginsBase, selectedPlugin, 'skills');\n if (!skillsSrc.startsWith(pluginsBase + path.sep)) {\n throw new Error(`Invalid plugin name: \"${selectedPlugin}\"`);\n }\n return skillsSrc;\n}\n\ninterface InstallMeta {\n marketplace: string;\n plugin: string;\n installedFrom: string;\n branch?: string;\n}\n\nexport function copyPluginSkills(skillsSrc: string, targetDir: string, meta?: InstallMeta): { installed: string[]; failed: string[] } {\n fs.mkdirSync(targetDir, { recursive: true });\n const resolvedTarget = path.resolve(targetDir);\n\n const skillNames = fs.readdirSync(skillsSrc).filter(name =>\n fs.statSync(path.join(skillsSrc, name)).isDirectory()\n );\n\n const installed: string[] = [];\n const failed: string[] = [];\n\n for (const skillName of skillNames) {\n const dest = path.resolve(targetDir, skillName);\n if (!dest.startsWith(resolvedTarget + path.sep)) {\n failed.push(skillName);\n continue;\n }\n fs.rmSync(dest, { recursive: true, force: true });\n fs.cpSync(path.join(skillsSrc, skillName), dest, { recursive: true });\n installed.push(skillName);\n }\n\n if (meta) {\n recordInstalledSkills(targetDir, installed, {\n source: 'marketplace',\n marketplace: meta.marketplace,\n plugin: meta.plugin,\n installedFrom: meta.installedFrom,\n ...(meta.branch ? { branch: meta.branch } : {}),\n });\n }\n\n return { installed, failed };\n}\n","import { Command } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport interface DecodedJwt {\n header: Record<string, unknown>;\n payload: Record<string, unknown>;\n signature: string;\n}\n\nfunction base64urlDecode(input: string): string {\n // Convert base64url to base64\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n return Buffer.from(padded, 'base64').toString('utf8');\n}\n\nexport function decodeJwt(token: string): DecodedJwt {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new PncliError('Invalid JWT: expected 3 dot-separated parts', 1);\n }\n\n const [rawHeader, rawPayload, signature] = parts;\n\n let header: Record<string, unknown>;\n let payload: Record<string, unknown>;\n\n try {\n header = JSON.parse(base64urlDecode(rawHeader)) as Record<string, unknown>;\n } catch {\n throw new PncliError('Invalid JWT: header is not valid JSON', 1);\n }\n\n try {\n payload = JSON.parse(base64urlDecode(rawPayload)) as Record<string, unknown>;\n } catch {\n throw new PncliError('Invalid JWT: payload is not valid JSON', 1);\n }\n\n return { header, payload, signature };\n}\n\nexport function registerJwtCommands(program: Command): void {\n const jwt = program.command('jwt').description('JWT token utilities');\n\n jwt\n .command('decode <token>')\n .description('Decode a JWT token and output header, payload, and signature as JSON')\n .action((token: string) => {\n const start = Date.now();\n try {\n const data = decodeJwt(token);\n success(data, 'jwt', 'decode', start);\n } catch (err) {\n fail(err, 'jwt', 'decode', start);\n }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\n// ── Kubernetes API response shapes ────────────────────────────────────────────\n\ninterface K8sContainerState {\n waiting?: { reason?: string; message?: string };\n running?: { startedAt?: string };\n terminated?: { exitCode?: number; reason?: string; message?: string };\n}\n\ninterface K8sContainerStatus {\n name: string;\n ready: boolean;\n restartCount: number;\n state?: K8sContainerState;\n lastState?: K8sContainerState;\n image?: string;\n}\n\ninterface K8sPodCondition {\n type: string;\n status: string;\n reason?: string;\n message?: string;\n}\n\ninterface K8sPod {\n metadata: { name: string; namespace: string; creationTimestamp?: string; labels?: Record<string, string> };\n spec: { containers?: Array<{ name: string }> };\n status: {\n phase?: string;\n reason?: string;\n message?: string;\n conditions?: K8sPodCondition[];\n containerStatuses?: K8sContainerStatus[];\n initContainerStatuses?: K8sContainerStatus[];\n startTime?: string;\n };\n}\n\ninterface K8sPodList {\n items: K8sPod[];\n}\n\ninterface K8sEvent {\n type?: string;\n reason?: string;\n message?: string;\n count?: number;\n firstTimestamp?: string;\n lastTimestamp?: string;\n eventTime?: string;\n regarding?: { kind?: string; name?: string; namespace?: string };\n involvedObject?: { kind?: string; name?: string; namespace?: string };\n source?: { component?: string };\n reportingComponent?: string;\n}\n\ninterface K8sEventList {\n items: K8sEvent[];\n}\n\ninterface K8sPodMetrics {\n metadata: { name: string };\n containers: Array<{ name: string; usage: { cpu: string; memory: string } }>;\n}\n\ninterface K8sPodMetricsList {\n items: K8sPodMetrics[];\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction containerState(s?: K8sContainerState): string {\n if (!s) return 'unknown';\n if (s.waiting) return s.waiting.reason ?? 'Waiting';\n if (s.terminated) return s.terminated.reason ?? 'Terminated';\n if (s.running) return 'Running';\n return 'unknown';\n}\n\nfunction getHttp(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.openshift.baseUrl) {\n throw new PncliError('OpenShift not configured. Run: pncli config init');\n }\n return createHttpClient(config, Boolean(opts.dryRun));\n}\n\nfunction podAge(creationTimestamp?: string): string {\n if (!creationTimestamp) return 'unknown';\n const ageMs = Date.now() - new Date(creationTimestamp).getTime();\n const ageSeconds = Math.floor(ageMs / 1000);\n if (ageSeconds < 60) return `${ageSeconds}s`;\n const ageMinutes = Math.floor(ageSeconds / 60);\n if (ageMinutes < 60) return `${ageMinutes}m`;\n const ageHours = Math.floor(ageMinutes / 60);\n if (ageHours < 24) return `${ageHours}h`;\n return `${Math.floor(ageHours / 24)}d`;\n}\n\n// ── Commands ──────────────────────────────────────────────────────────────────\n\nexport function registerOpenShiftCommands(program: Command): void {\n const oc = program.command('openshift').description('OpenShift / Kubernetes operations');\n\n oc\n .command('pods')\n .description('List pod health summary for a namespace — pre-processed for LLM analysis')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .option('--label-selector <selector>', 'Label selector (e.g. app=my-app)')\n .action(async (opts: { namespace: string; labelSelector?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string> = {};\n if (opts.labelSelector) params['labelSelector'] = opts.labelSelector;\n\n const podList = await http.openshift<K8sPodList>(\n `/api/v1/namespaces/${encodeURIComponent(opts.namespace)}/pods`,\n { params }\n );\n\n const summaryCounters = {\n total: podList.items.length,\n running: 0,\n pending: 0,\n failed: 0,\n succeeded: 0,\n unknown: 0,\n crashLoopBackOff: 0,\n oomKilled: 0,\n imagePullBackOff: 0,\n totalRestarts: 0,\n };\n\n const pods = podList.items.map(pod => {\n const phase = pod.status.phase ?? 'Unknown';\n\n // Tally phase\n switch (phase.toLowerCase()) {\n case 'running': summaryCounters.running++; break;\n case 'pending': summaryCounters.pending++; break;\n case 'failed': summaryCounters.failed++; break;\n case 'succeeded': summaryCounters.succeeded++; break;\n default: summaryCounters.unknown++; break;\n }\n\n // Process container statuses\n const allStatuses = [\n ...(pod.status.containerStatuses ?? []),\n ...(pod.status.initContainerStatuses ?? [])\n ];\n\n let podRestarts = 0;\n const containers = allStatuses.map(cs => {\n podRestarts += cs.restartCount;\n summaryCounters.totalRestarts += cs.restartCount;\n\n const currentState = containerState(cs.state);\n const lastState = containerState(cs.lastState);\n\n if (currentState === 'CrashLoopBackOff') summaryCounters.crashLoopBackOff++;\n if (currentState === 'ImagePullBackOff' || currentState === 'ErrImagePull') summaryCounters.imagePullBackOff++;\n if (lastState === 'OOMKilled' || cs.lastState?.terminated?.reason === 'OOMKilled') summaryCounters.oomKilled++;\n\n const entry: Record<string, unknown> = {\n name: cs.name,\n ready: cs.ready,\n restartCount: cs.restartCount,\n state: currentState,\n };\n if (cs.lastState?.terminated) {\n entry['lastExitCode'] = cs.lastState.terminated.exitCode;\n entry['lastReason'] = cs.lastState.terminated.reason;\n }\n return entry;\n });\n\n const readyCount = allStatuses.filter(cs => cs.ready).length;\n const totalCount = pod.spec.containers?.length ?? allStatuses.length;\n\n const entry: Record<string, unknown> = {\n name: pod.metadata.name,\n phase,\n ready: `${readyCount}/${totalCount}`,\n restartCount: podRestarts,\n age: podAge(pod.metadata.creationTimestamp),\n };\n\n // Surface top-level pod problem reason if present\n const podReason = pod.status.reason ?? pod.status.conditions?.find(c => c.status === 'False')?.reason;\n if (podReason) entry['reason'] = podReason;\n if (pod.status.message) entry['message'] = pod.status.message;\n if (containers.length > 0) entry['containers'] = containers;\n if (pod.metadata.labels && Object.keys(pod.metadata.labels).length > 0) {\n entry['labels'] = pod.metadata.labels;\n }\n\n return entry;\n });\n\n // Sort: most-problematic first (failed/pending/high-restarts)\n pods.sort((a, b) => {\n const phasePriority = (p: unknown) => {\n if (p === 'Failed') return 0;\n if (p === 'Pending') return 1;\n if (p === 'Unknown') return 2;\n return 3;\n };\n const pDiff = phasePriority(a['phase']) - phasePriority(b['phase']);\n if (pDiff !== 0) return pDiff;\n return ((b['restartCount'] as number) ?? 0) - ((a['restartCount'] as number) ?? 0);\n });\n\n success({ namespace: opts.namespace, summary: summaryCounters, pods }, 'openshift', 'pods', start);\n } catch (err) { fail(err, 'openshift', 'pods', start); }\n });\n\n oc\n .command('events')\n .description('List Warning events for a namespace — pre-filtered for LLM analysis')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .option('--field-selector <selector>', 'Additional field selector (e.g. involvedObject.name=my-pod)')\n .option('--all', 'Include Normal events in addition to Warning events', false)\n .action(async (opts: { namespace: string; fieldSelector?: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string> = {};\n\n // Build field selector: default to Warning-only unless --all\n const selectors: string[] = [];\n if (!opts.all) selectors.push('type=Warning');\n if (opts.fieldSelector) selectors.push(opts.fieldSelector);\n if (selectors.length > 0) params['fieldSelector'] = selectors.join(',');\n\n const eventList = await http.openshift<K8sEventList>(\n `/api/v1/namespaces/${encodeURIComponent(opts.namespace)}/events`,\n { params }\n );\n\n const events = eventList.items.map(ev => {\n const obj = ev.involvedObject ?? ev.regarding;\n const entry: Record<string, unknown> = {\n type: ev.type ?? 'Normal',\n reason: ev.reason,\n object: obj ? `${obj.kind ?? 'Object'}/${obj.name ?? '?'}` : undefined,\n message: ev.message,\n count: ev.count ?? 1,\n firstTime: ev.firstTimestamp ?? ev.eventTime,\n lastTime: ev.lastTimestamp ?? ev.eventTime,\n };\n const source = ev.source?.component ?? ev.reportingComponent;\n if (source) entry['source'] = source;\n return entry;\n });\n\n // Sort by count descending (highest frequency first)\n events.sort((a, b) => ((b['count'] as number) ?? 0) - ((a['count'] as number) ?? 0));\n\n success({ namespace: opts.namespace, count: events.length, events }, 'openshift', 'events', start);\n } catch (err) { fail(err, 'openshift', 'events', start); }\n });\n\n oc\n .command('logs')\n .description('Get recent log lines from a pod container')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .requiredOption('--pod <name>', 'Pod name')\n .option('--container <name>', 'Container name (defaults to first container)')\n .option('--lines <n>', 'Number of most-recent lines to return', '100')\n .option('--previous', 'Return logs from the previous container instance', false)\n .action(async (opts: { namespace: string; pod: string; container?: string; lines?: string; previous?: boolean }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const lines = opts.lines ? parseInt(opts.lines, 10) : 100;\n\n const logText = await http.openshiftText(\n `/api/v1/namespaces/${encodeURIComponent(opts.namespace)}/pods/${encodeURIComponent(opts.pod)}/log`,\n {\n lines,\n params: {\n ...(opts.container ? { container: opts.container } : {}),\n ...(opts.previous ? { previous: 'true' } : {}),\n }\n }\n );\n\n success(\n {\n pod: opts.pod,\n namespace: opts.namespace,\n container: opts.container ?? '(default)',\n previous: opts.previous ?? false,\n lines,\n log: logText,\n },\n 'openshift', 'logs', start\n );\n } catch (err) { fail(err, 'openshift', 'logs', start); }\n });\n\n oc\n .command('pod-metrics')\n .description('Get CPU and memory usage for pods in a namespace (requires metrics-server)')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .action(async (opts: { namespace: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const metricsList = await http.openshift<K8sPodMetricsList>(\n `/apis/metrics.k8s.io/v1beta1/namespaces/${encodeURIComponent(opts.namespace)}/pods`\n );\n\n const pods = metricsList.items.map(pm => ({\n name: pm.metadata.name,\n containers: pm.containers.map(c => ({\n name: c.name,\n cpu: c.usage.cpu,\n memory: c.usage.memory,\n })),\n }));\n\n success({ namespace: opts.namespace, pods }, 'openshift', 'pod-metrics', start);\n } catch (err) { fail(err, 'openshift', 'pod-metrics', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient, type HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { success, fail } from '../../lib/output.js';\n\ninterface EntityList {\n entities: unknown[];\n nextPageKey?: string;\n totalCount: number;\n}\n\ninterface ProblemList {\n problems: unknown[];\n nextPageKey?: string;\n totalCount: number;\n}\n\ninterface QueryResponse {\n state: 'NOT_STARTED' | 'RUNNING' | 'SUCCEEDED' | 'RESULT_GONE' | 'CANCELLED' | 'FAILED';\n requestToken?: string;\n result?: unknown;\n error?: { message?: string };\n}\n\nfunction getHttp(program: Command): HttpClient {\n const opts = program.optsWithGlobals();\n return createHttpClient(\n loadConfig({ configPath: opts.config as string | undefined }),\n Boolean(opts.dryRun)\n );\n}\n\nasync function allPages<T>(\n fetchPage: (nextPageKey?: string) => Promise<{ items: T[]; nextPageKey?: string; totalCount: number }>\n): Promise<{ items: T[]; totalCount: number }> {\n const items: T[] = [];\n let nextPageKey: string | undefined;\n do {\n const page = await fetchPage(nextPageKey);\n items.push(...page.items);\n nextPageKey = page.nextPageKey;\n } while (nextPageKey);\n return { items, totalCount: items.length };\n}\n\nasync function listEntities(\n http: HttpClient,\n entitySelector: string,\n opts: { from?: string; to?: string; fields?: string }\n) {\n return allPages(async (nextPageKey) => {\n const page = await http.dynatrace<EntityList>('/api/v2/entities', {\n params: nextPageKey\n ? { nextPageKey }\n : {\n entitySelector,\n from: opts.from,\n to: opts.to,\n fields: opts.fields,\n pageSize: 500\n }\n });\n return {\n items: page.entities,\n nextPageKey: page.nextPageKey,\n totalCount: page.totalCount\n };\n });\n}\n\nasync function runTraceQuery(http: HttpClient, traceId: string): Promise<unknown> {\n if (!/^[0-9a-f]{16,32}$/i.test(traceId)) {\n throw new PncliError('Trace ID must be a 16- or 32-character hexadecimal value');\n }\n const deadline = Date.now() + 60_000;\n let response = await http.dynatracePlatform<QueryResponse>(\n '/platform/storage/query/v1/query:execute',\n {\n method: 'POST',\n body: {\n query: `fetch spans | filter trace.id == \"${traceId.toLowerCase()}\" | sort start_time asc`,\n requestTimeoutMilliseconds: 5000\n },\n timeoutMs: 10000\n }\n );\n\n while (response.state === 'RUNNING' || response.state === 'NOT_STARTED') {\n if (!response.requestToken) throw new PncliError('Dynatrace did not return a query request token');\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) throw new PncliError('Dynatrace trace query did not finish within 60 seconds');\n const pollStarted = Date.now();\n response = await http.dynatracePlatform<QueryResponse>(\n '/platform/storage/query/v1/query:poll',\n {\n params: {\n 'request-token': response.requestToken,\n 'request-timeout': Math.min(5000, remainingMs)\n },\n timeoutMs: 10000\n }\n );\n if (response.state === 'RUNNING' || response.state === 'NOT_STARTED') {\n const delayMs = Math.min(1000 - (Date.now() - pollStarted), deadline - Date.now());\n if (delayMs > 0) await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n\n if (response.state !== 'SUCCEEDED') {\n throw new PncliError(response.error?.message ?? `Dynatrace trace query ${response.state.toLowerCase()}`);\n }\n return response.result;\n}\n\nexport function registerDynatraceCommands(program: Command): void {\n const dynatrace = program.command('dynatrace').description('Dynatrace observability operations');\n\n const entities = dynatrace.command('entities').description('Monitored entity operations');\n entities\n .command('list')\n .description('List monitored entities using an entity selector')\n .requiredOption('--selector <selector>', 'Dynatrace entity selector, e.g. type(\"SERVICE\")')\n .option('--from <time>', 'Start time (ISO 8601 or relative, e.g. now-2h)')\n .option('--to <time>', 'End time (ISO 8601 or relative)')\n .option('--fields <fields>', 'Additional entity fields')\n .action(async (opts: { selector: string; from?: string; to?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const data = await listEntities(getHttp(program), opts.selector, opts);\n success({ totalCount: data.totalCount, entities: data.items }, 'dynatrace', 'entities list', start);\n } catch (err) { fail(err, 'dynatrace', 'entities list', start); }\n });\n\n entities\n .command('get')\n .description('Get a monitored entity by ID')\n .requiredOption('--id <id>', 'Entity ID, e.g. SERVICE-1234567890ABCDEF')\n .option('--from <time>', 'Start time')\n .option('--to <time>', 'End time')\n .option('--fields <fields>', 'Additional entity fields')\n .action(async (opts: { id: string; from?: string; to?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const data = await getHttp(program).dynatrace<unknown>(\n `/api/v2/entities/${encodeURIComponent(opts.id)}`,\n { params: { from: opts.from, to: opts.to, fields: opts.fields } }\n );\n success(data, 'dynatrace', 'entities get', start);\n } catch (err) { fail(err, 'dynatrace', 'entities get', start); }\n });\n\n dynatrace\n .command('services')\n .description('List monitored services')\n .option('--from <time>', 'Start time')\n .option('--to <time>', 'End time')\n .action(async (opts: { from?: string; to?: string }) => {\n const start = Date.now();\n try {\n const data = await listEntities(getHttp(program), 'type(\"SERVICE\")', opts);\n success({ totalCount: data.totalCount, services: data.items }, 'dynatrace', 'services', start);\n } catch (err) { fail(err, 'dynatrace', 'services', start); }\n });\n\n dynatrace\n .command('workloads')\n .description('List monitored Kubernetes workloads')\n .option('--from <time>', 'Start time')\n .option('--to <time>', 'End time')\n .action(async (opts: { from?: string; to?: string }) => {\n const start = Date.now();\n try {\n const selector = 'type(\"CLOUD_APPLICATION\")';\n const data = await listEntities(getHttp(program), selector, opts);\n success({ totalCount: data.totalCount, workloads: data.items }, 'dynatrace', 'workloads', start);\n } catch (err) { fail(err, 'dynatrace', 'workloads', start); }\n });\n\n const problems = dynatrace.command('problems').description('Problem operations');\n problems\n .command('list')\n .description('List problems')\n .option('--from <time>', 'Start time (default: now-2h)')\n .option('--to <time>', 'End time (default: now)')\n .option('--problem-selector <selector>', 'Dynatrace problem selector')\n .option('--entity-selector <selector>', 'Affected entity selector')\n .action(async (opts: {\n from?: string;\n to?: string;\n problemSelector?: string;\n entitySelector?: string;\n }) => {\n const start = Date.now();\n try {\n const data = await allPages(async (nextPageKey) => {\n const page = await getHttp(program).dynatrace<ProblemList>('/api/v2/problems', {\n params: nextPageKey\n ? { nextPageKey }\n : {\n from: opts.from ?? 'now-2h',\n to: opts.to ?? 'now',\n problemSelector: opts.problemSelector,\n entitySelector: opts.entitySelector,\n pageSize: 500\n }\n });\n return { items: page.problems, nextPageKey: page.nextPageKey, totalCount: page.totalCount };\n });\n success({ totalCount: data.totalCount, problems: data.items }, 'dynatrace', 'problems list', start);\n } catch (err) { fail(err, 'dynatrace', 'problems list', start); }\n });\n\n problems\n .command('get')\n .description('Get a problem by ID')\n .requiredOption('--id <id>', 'Problem ID')\n .option('--fields <fields>', 'Additional fields')\n .action(async (opts: { id: string; fields?: string }) => {\n const start = Date.now();\n try {\n const data = await getHttp(program).dynatrace<unknown>(\n `/api/v2/problems/${encodeURIComponent(opts.id)}`,\n { params: { fields: opts.fields } }\n );\n success(data, 'dynatrace', 'problems get', start);\n } catch (err) { fail(err, 'dynatrace', 'problems get', start); }\n });\n\n dynatrace\n .command('trace')\n .description('Get distributed-trace spans from Grail')\n .requiredOption('--id <trace-id>', '16- or 32-character hexadecimal trace ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const result = await runTraceQuery(getHttp(program), opts.id);\n success(result, 'dynatrace', 'trace', start);\n } catch (err) { fail(err, 'dynatrace', 'trace', start); }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,WAAAA,gBAAe;AACxB,SAAS,qBAAqB;;;ACR9B,SAAS,UAAU,oBAAoB;AAEvC,IAAM,kBAAkB;AAyCxB,SAAS,KAAK,KAAa,KAAqB;AAC9C,SAAO,SAAS,KAAK,EAAE,UAAU,QAAQ,IAAI,CAAC,EAAE,KAAK;AACvD;AAEO,SAAS,UAAU,MAA+B;AACvD,QAAM,SAAS,KAAK,0BAA0B,IAAI;AAClD,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,QAAM,YAAsB,CAAC;AAE7B,MAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,UAAU,UAAU;AAElD,aAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,QAAI,CAAC,KAAM;AACX,UAAM,IAAI,KAAK,CAAC;AAChB,UAAM,IAAI,KAAK,CAAC;AAChB,UAAM,OAAO,KAAK,MAAM,CAAC;AAEzB,QAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,gBAAU,KAAK,IAAI;AAAA,IACrB,OAAO;AACL,UAAI,MAAM,OAAO,MAAM,IAAK,QAAO,KAAK,IAAI;AAC5C,UAAI,MAAM,OAAO,MAAM,IAAK,UAAS,KAAK,IAAI;AAAA,IAChD;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU,UAAU;AACvC;AAEA,SAAS,gBAAgB,QAA4F;AACnH,QAAM,QAAQ,OAAO,MAAM,4CAA4C;AACvE,MAAI,CAAC,MAAO,QAAO,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,EAAE;AACxE,SAAO;AAAA,IACL,UAAU,SAAS,MAAM,CAAC,GAAI,EAAE;AAAA,IAChC,UAAU,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AAAA,IACtC,UAAU,SAAS,MAAM,CAAC,GAAI,EAAE;AAAA,IAChC,UAAU,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,UAAU,SAA6B;AAC9C,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,QAAoB,CAAC;AAC3B,MAAI,kBAAkB;AACtB,MAAI,YAAY;AAEhB,MAAI,cAA+B;AACnC,MAAI,cAA+B;AAEnC,aAAW,QAAQ,OAAO;AACxB;AACA,QAAI,YAAY,iBAAiB;AAC/B,wBAAkB;AAClB,UAAI,YAAa,aAAY,YAAY;AACzC;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,aAAa,GAAG;AAClC,UAAI,eAAe,YAAa,aAAY,MAAM,KAAK,WAAW;AAClE,oBAAc;AACd,UAAI,YAAa,OAAM,KAAK,WAAW;AAEvC,YAAM,YAAY,KAAK,MAAM,2BAA2B;AACxD,oBAAc;AAAA,QACZ,MAAM,YAAY,UAAU,CAAC,IAAK;AAAA,QAClC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO,CAAC;AAAA,MACV;AACA;AAAA,IACF;AAEA,QAAI,CAAC,YAAa;AAElB,QAAI,KAAK,WAAW,cAAc,GAAG;AACnC,kBAAY,SAAS;AACrB;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,KAAK,GAAG;AAC1B,UAAI,YAAa,aAAY,MAAM,KAAK,WAAW;AACnD,YAAM,EAAE,UAAU,UAAU,UAAU,SAAS,IAAI,gBAAgB,IAAI;AACvE,oBAAc,EAAE,UAAU,UAAU,UAAU,UAAU,OAAO,CAAC,EAAE;AAClE;AAAA,IACF;AAEA,QAAI,gBAAgB,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,IAAI;AACzF,kBAAY,MAAM,KAAK,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,eAAe,YAAa,aAAY,MAAM,KAAK,WAAW;AAClE,MAAI,YAAa,OAAM,KAAK,WAAW;AAEvC,SAAO,EAAE,OAAO,WAAW,gBAAgB;AAC7C;AAEO,SAAS,QAAQ,MAAc,MAAuD;AAC3F,QAAM,OAAO,CAAC,OAAO,MAAM;AAC3B,MAAI,KAAK,OAAQ,MAAK,KAAK,UAAU;AACrC,MAAI,KAAK,KAAM,MAAK,KAAK,MAAM,KAAK,IAAI;AAExC,MAAI;AACF,UAAM,MAAM,KAAK,KAAK,KAAK,GAAG,GAAG,IAAI;AACrC,QAAI,CAAC,IAAK,QAAO,EAAE,OAAO,CAAC,GAAG,WAAW,MAAM;AAC/C,WAAO,UAAU,GAAG;AAAA,EACtB,QAAQ;AACN,WAAO,EAAE,OAAO,CAAC,GAAG,WAAW,MAAM;AAAA,EACvC;AACF;AAEO,SAAS,OAAO,MAAc,MAAyD;AAC5F,QAAM,MAAM;AACZ,QAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG;AACtC,QAAM,OAAO,CAAC,OAAO,YAAY,GAAG,EAAE;AACtC,MAAI,KAAK,MAAO,MAAK,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC;AAClD,MAAI,KAAK,MAAO,MAAK,KAAK,WAAW,KAAK,KAAK,EAAE;AAEjD,MAAI;AACF,UAAM,SAAS,aAAa,OAAO,MAAM,EAAE,UAAU,QAAQ,KAAK,KAAK,CAAC,EAAE,KAAK;AAC/E,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,WAAO,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,IAAI,UAAQ;AACpD,YAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,aAAO;AAAA,QACL,MAAM,MAAM,CAAC,KAAK;AAAA,QAClB,QAAQ,MAAM,CAAC,KAAK;AAAA,QACpB,MAAM,MAAM,CAAC,KAAK;AAAA,QAClB,SAAS,MAAM,CAAC,KAAK;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,YAAY,MAA4B;AACtD,QAAM,SAAS,KAAK,iBAAiB,IAAI;AACzC,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,YAAY,KAAK,WAAW,GAAG;AACrC,UAAM,OAAO,KAAK,QAAQ,WAAW,EAAE,EAAE,KAAK;AAE9C,QAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,aAAO,KAAK,KAAK,QAAQ,YAAY,EAAE,CAAC;AAAA,IAC1C,OAAO;AACL,UAAI,UAAW,WAAU;AACzB,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,OAAO,OAAO;AAClC;AAoDO,IAAM,gBAAgB;AAE7B,SAAS,cAAc,SAAyB;AAC9C,QAAM,IAAI,IAAI,KAAK,OAAO;AAC1B,QAAM,MAAM,EAAE,UAAU;AACxB,QAAM,OAAO,QAAQ,IAAI,KAAK,IAAI;AAClC,QAAM,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,eAAe,GAAG,EAAE,YAAY,GAAG,EAAE,WAAW,IAAI,IAAI,CAAC;AAC5F,SAAO,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE;AACzC;AAEA,SAAS,cAAc,WAA2B;AAChD,QAAM,IAAI,IAAI,KAAK,SAAS;AAC5B,QAAM,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,eAAe,GAAG,EAAE,YAAY,GAAG,EAAE,WAAW,IAAI,CAAC,CAAC;AACzF,SAAO,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE;AACzC;AAEA,SAAS,gBAAgB,WAA2B;AAClD,QAAM,IAAI,IAAI,KAAK,SAAS;AAE5B,QAAM,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE,eAAe,GAAG,EAAE,YAAY,GAAG,EAAE,WAAW,IAAI,CAAC,CAAC;AAC3F,QAAM,OAAO,SAAS,eAAe;AACrC,QAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;AAC1C,QAAM,aAAa,IAAI,KAAK,KAAK,IAAI,MAAM,GAAG,KAAK,KAAK,UAAU,MAAM,IAAI,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC;AACtG,QAAM,UAAU,KAAK,OAAO,EAAE,QAAQ,IAAI,WAAW,QAAQ,MAAM,IAAI,MAAS,IAAI;AACpF,SAAO,GAAG,IAAI,KAAK,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;AACrD;AAEA,SAAS,qBAAqB,SAA2C;AACvE,QAAM,UAAU,oBAAI,IAAsC;AAE1D,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,cAAc,OAAO,IAAI;AACxC,QAAI,CAAC,QAAQ,IAAI,MAAM,EAAG,SAAQ,IAAI,QAAQ,oBAAI,IAAI,CAAC;AACvD,UAAM,YAAY,QAAQ,IAAI,MAAM;AAEpC,QAAI,CAAC,UAAU,IAAI,OAAO,MAAM,GAAG;AACjC,gBAAU,IAAI,OAAO,QAAQ;AAAA,QAC3B,QAAQ,OAAO;AAAA,QACf,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,UAAU,IAAI,OAAO,MAAM;AACzC,UAAM;AACN,UAAM,cAAc,OAAO;AAC3B,UAAM,aAAa,OAAO;AAC1B,UAAM,YAAY,OAAO;AACzB,UAAM,gBAAgB,OAAO;AAAA,EAC/B;AAEA,SAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC,EACzB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EACrC,IAAI,CAAC,CAAC,QAAQ,SAAS,MAAM;AAC5B,UAAM,UAAU,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AACvF,WAAO;AAAA,MACL,MAAM,gBAAgB,MAAM;AAAA,MAC5B,WAAW;AAAA,MACX,SAAS,cAAc,MAAM;AAAA,MAC7B;AAAA,MACA,SAAS;AAAA,QACP,aAAa,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,aAAa,CAAC;AAAA,QAC1D,iBAAiB,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,YAAY,CAAC;AAAA,QAC7D,gBAAgB,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,WAAW,CAAC;AAAA,QAC3D,eAAe,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,UAAU,CAAC;AAAA,QACzD,mBAAmB,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,cAAc,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF,CAAC;AACL;AAEA,SAAS,cAAc,SAAuC;AAC5D,QAAM,MAAM,oBAAI,IAAyB;AACzC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,IAAI,IAAI,OAAO,MAAM,GAAG;AAC3B,UAAI,IAAI,OAAO,QAAQ;AAAA,QACrB,QAAQ,OAAO;AAAA,QACf,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AACA,UAAM,QAAQ,IAAI,IAAI,OAAO,MAAM;AACnC,UAAM;AACN,UAAM,cAAc,OAAO;AAC3B,UAAM,aAAa,OAAO;AAC1B,UAAM,YAAY,OAAO;AACzB,UAAM,gBAAgB,OAAO;AAAA,EAC/B;AACA,SAAO,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAC1E;AAGO,SAAS,wBACd,KACA,YACA,MACc;AACd,QAAM,UAAyB,CAAC;AAChC,MAAI,UAA8B;AAElC,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,QAAI,KAAK,WAAW,aAAa,GAAG;AAClC,UAAI,QAAS,SAAQ,KAAK,OAAO;AACjC,YAAM,QAAQ,KAAK,MAAM,cAAc,MAAM,EAAE,MAAM,GAAI;AACzD,gBAAU;AAAA,QACR,MAAM,MAAM,CAAC,KAAK;AAAA,QAClB,QAAQ,MAAM,CAAC,KAAK;AAAA,QACpB,MAAM,MAAM,CAAC,KAAK;AAAA,QAClB,SAAS,MAAM,CAAC,KAAK;AAAA,QACrB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AAAA,IACF,WAAW,WAAW,oBAAoB,KAAK,IAAI,GAAG;AAEpD,YAAM,CAAC,KAAK,GAAG,IAAI,KAAK,MAAM,GAAI;AAClC,YAAM,aAAa,QAAQ,MAAM,IAAI,SAAS,OAAO,KAAK,EAAE;AAC5D,YAAM,YAAY,QAAQ,MAAM,IAAI,SAAS,OAAO,KAAK,EAAE;AAC3D,UAAI,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,SAAS,GAAG;AAC3C,gBAAQ,cAAc;AACtB,gBAAQ,aAAa;AACrB,gBAAQ;AACR,gBAAQ,WAAW,QAAQ,aAAa,QAAQ;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAS,SAAQ,KAAK,OAAO;AAOjC,QAAM,iBAAiB,CAAC,MAAuB,qBAAqB,KAAK,CAAC;AAC1E,QAAM,YAAY,KAAK,SAAS,eAAe,KAAK,KAAK,IAAI,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI;AACvF,QAAM,YAAY,KAAK,SAAS,eAAe,KAAK,KAAK,IAAI,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI;AACvF,QAAM,kBAAmB,aAAa,YAClC,QAAQ,OAAO,OAAK;AAClB,UAAM,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE;AAC5B,QAAI,aAAa,IAAI,UAAW,QAAO;AACvC,QAAI,aAAa,IAAI,UAAW,QAAO;AACvC,WAAO;AAAA,EACT,CAAC,IACD;AAEJ,QAAM,kBAAkB,gBAAgB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC;AAChF,QAAM,iBAAiB,gBAAgB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,WAAW,CAAC;AAE9E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO,KAAK,SAAS;AAAA,IACrB,SAAS;AAAA,IACT,OAAO,qBAAqB,eAAe;AAAA,IAC3C,UAAU,cAAc,eAAe;AAAA,IACvC,SAAS;AAAA,MACP,aAAa,gBAAgB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,eAAe,kBAAkB;AAAA,MACjC,mBAAmB,gBAAgB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,cAAc,CAAC;AAAA,IAC/E;AAAA,EACF;AACF;AAUA,SAAS,iBAAiB,SAAyB;AACjD,MAAI,sBAAsB,KAAK,OAAO,GAAG;AACvC,WAAO,GAAG,OAAO;AAAA,EACnB;AACA,SAAO;AACT;AAGO,SAAS,gBAAgB,MAAoF;AAClH,QAAM,MAAM,GAAG,aAAa;AAC5B,QAAM,OAAO,CAAC,OAAO,YAAY,GAAG,IAAI,WAAW;AAEnD,MAAI,KAAK,MAAO,MAAK,KAAK,WAAW,iBAAiB,KAAK,KAAK,CAAC,EAAE;AACnE,MAAI,KAAK,MAAO,MAAK,KAAK,WAAW,iBAAiB,KAAK,KAAK,CAAC,EAAE;AAEnE,MAAI,KAAK,QAAQ,KAAK,QAAQ;AAC5B,SAAK,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE;AAAA,EAC1C,WAAW,KAAK,MAAM;AACpB,SAAK,KAAK,GAAG,KAAK,IAAI,QAAQ;AAAA,EAChC,WAAW,KAAK,QAAQ;AACtB,SAAK,KAAK,KAAK,MAAM;AAAA,EACvB;AAEA,SAAO;AACT;AAEO,SAAS,gBACd,MACA,MACc;AACd,QAAM,OAAO,gBAAgB,IAAI;AAEjC,MAAI,MAAM;AACV,MAAI;AACF,UAAM,aAAa,OAAO,MAAM,EAAE,UAAU,QAAQ,KAAK,MAAM,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,KAAK;AAAA,EACtG,QAAQ;AAAA,EAER;AAEA,MAAI,aAAa,KAAK,UAAU;AAChC,MAAI,CAAC,YAAY;AACf,QAAI;AACF,mBAAa,aAAa,OAAO,CAAC,aAAa,gBAAgB,MAAM,GAAG;AAAA,QACtE,UAAU;AAAA,QACV,KAAK;AAAA,MACP,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AACN,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,wBAAwB,KAAK,YAAY,IAAI;AACtD;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,GAAG;AAC9F,WAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,QAA8B;AAClE,QAAM,SAAS;AACf,QAAM,OAAiB,CAAC;AAExB,aAAW,QAAQ,OAAO,OAAO;AAC/B,eAAW,KAAK,KAAK,SAAS;AAC5B,WAAK;AAAA,QACH;AAAA,UACE,KAAK;AAAA,UACL,KAAK;AAAA,UACL,eAAe,EAAE,MAAM;AAAA,UACvB,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,QACJ,EAAE,KAAK,GAAG;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,OAAO;AACjB,QAAM,WAAW,CAAC,SAAS,IAAI,IAAI,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,GAAG;AAErI,SAAO,CAAC,QAAQ,GAAG,MAAM,QAAQ,EAAE,KAAK,IAAI,IAAI;AAClD;;;ACrgBA,SAAS,YAAAC,iBAAgB;AAelB,SAAS,cAA6B;AAC3C,MAAI;AACF,WAAOA,UAAS,iCAAiC,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EAC9E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,UAAiC;AAChE,MAAI;AACF,WAAOA,UAAS,mCAAmC;AAAA,MACjD,UAAU;AAAA,MACV,KAAK;AAAA,IACP,CAAC,EAAE,KAAK;AAAA,EACV,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YACd,WACA,kBAC0C;AAC1C,MAAI,CAAC,iBAAkB,QAAO;AAG9B,QAAM,OAAO,iBAAiB,QAAQ,OAAO,EAAE,EAAE,QAAQ,gBAAgB,EAAE;AAG3E,QAAM,WAAW,UAAU,MAAM,uDAAuD;AACxF,MAAI,UAAU;AACZ,UAAM,CAAC,EAAE,MAAM,SAAS,IAAI,IAAI;AAChC,QAAI,QAAQ,KAAK,SAAS,IAAI,GAAG;AAC/B,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,aAAa,UAAU,MAAM,wDAAwD;AAC3F,MAAI,YAAY;AACd,UAAM,CAAC,EAAE,MAAM,SAAS,IAAI,IAAI;AAChC,QAAI,QAAQ,KAAK,SAAS,IAAI,GAAG;AAC/B,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAeO,SAAS,eACd,WACA,YAC8D;AAC9D,MAAI,CAAC,WAAY,QAAO;AAIxB,MAAI;AACJ,MAAI;AACF,UAAM,iBAAiB,eAAe,KAAK,UAAU,IAAI,aAAa,WAAW,UAAU;AAC3F,mBAAe,IAAI,IAAI,cAAc,EAAE,SAAS,YAAY;AAAA,EAC9D,QAAQ;AACN,mBAAe,WAAW,QAAQ,OAAO,EAAE,EAAE,QAAQ,gBAAgB,EAAE,EAAE,MAAM,MAAM,EAAE,CAAC,EAAG,YAAY;AAAA,EACzG;AAGA,MAAIC,QAAO;AACX,MAAI,iBAAiB;AAGrB,QAAM,gBAAgBA,MAAK,MAAM,uCAAuC;AACxE,MAAI,eAAe;AACjB,qBAAiB,cAAc,CAAC,EAAG,YAAY;AAC/C,IAAAA,QAAO,cAAc,CAAC;AAAA,EACxB,OAAO;AAEL,UAAM,aAAaA,MAAK,MAAM,4BAA4B;AAC1D,QAAI,YAAY;AACd,uBAAiB,WAAW,CAAC,EAAG,YAAY;AAC5C,MAAAA,QAAO,MAAM,WAAW,CAAC;AAAA,IAC3B,OAAO;AACL,YAAM,aAAaA,MAAK,MAAM,mCAAmC;AACjE,UAAI,YAAY;AACd,yBAAiB,WAAW,CAAC,EAAG,YAAY;AAC5C,QAAAA,QAAO,WAAW,CAAC;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,kBAAkB,mBAAmB,aAAc,QAAO;AAG/D,EAAAA,QAAOA,MAAK,QAAQ,UAAU,EAAE;AAGhC,QAAM,SAASA,MAAK,QAAQ,QAAQ;AACpC,QAAM,SAASA,MAAK,QAAQ,QAAQ;AACpC,QAAM,YAAY,WAAW,KAAK,SAAS;AAC3C,MAAI,cAAc,GAAI,QAAO;AAE7B,QAAM,OAAO,mBAAmBA,MAAK,MAAM,YAAY,CAAC,CAAC;AACzD,MAAI,CAAC,KAAM,QAAO;AAGlB,QAAM,SAASA,MAAK,MAAM,GAAG,SAAS;AACtC,QAAM,QAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,OAAO;AAC9C,MAAI,MAAM,SAAS,EAAG,QAAO;AAE7B,QAAM,UAAU,mBAAmB,MAAM,MAAM,SAAS,CAAC,CAAE;AAC3D,QAAM,aAAa,mBAAmB,MAAM,MAAM,SAAS,CAAC,CAAE;AAE9D,SAAO,EAAE,YAAY,SAAS,KAAK;AACrC;AAeO,SAAS,kBACd,WACA,SACwC;AAExC,MAAI;AACJ,MAAI,SAAS;AACX,QAAI;AACF,YAAM,iBAAiB,gBAAgB,KAAK,OAAO,IAAI,UAAU,WAAW,OAAO;AACnF,YAAM,WAAW,IAAI,IAAI,cAAc,EAAE,SAAS,YAAY;AAE9D,mBAAa,aAAa,mBAAmB,eAAe;AAAA,IAC9D,QAAQ;AACN,mBAAa,QAAQ,QAAQ,OAAO,EAAE,EAAE,QAAQ,iBAAiB,EAAE,EAAE,MAAM,MAAM,EAAE,CAAC,EAAG,YAAY;AAAA,IACrG;AAAA,EACF,OAAO;AACL,iBAAa;AAAA,EACf;AAGA,QAAM,WAAW,UAAU,MAAM,2CAA2C;AAC5E,MAAI,UAAU;AACZ,UAAM,CAAC,EAAE,MAAM,OAAO,IAAI,IAAI;AAC9B,QAAI,KAAM,YAAY,MAAM,YAAY;AACtC,aAAO,EAAE,OAAe,KAAY;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,gBAAgB,UAAU,MAAM,8DAA8D;AACpG,MAAI,eAAe;AACjB,UAAM,CAAC,EAAE,MAAM,OAAO,IAAI,IAAI;AAC9B,QAAI,KAAM,YAAY,MAAM,YAAY;AACtC,aAAO,EAAE,OAAe,KAAY;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,aAAa,UAAU,MAAM,6DAA6D;AAChG,MAAI,YAAY;AACd,UAAM,CAAC,EAAE,MAAM,OAAO,IAAI,IAAI;AAC9B,QAAI,KAAM,YAAY,MAAM,YAAY;AACtC,aAAO,EAAE,OAAe,KAAY;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,UAA4B;AACjD,MAAI;AACF,UAAM,SAASD,UAAS,iBAAiB,EAAE,UAAU,QAAQ,KAAK,SAAS,CAAC;AAC5E,WAAO,OACJ,MAAM,IAAI,EACV,OAAO,UAAQ,KAAK,SAAS,SAAS,CAAC,EACvC,IAAI,UAAQ,KAAK,MAAM,GAAI,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,EACpD,OAAO,OAAO;AAAA,EACnB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,cAAc,QAA2C;AACvE,QAAM,OAAO,YAAY;AACzB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,SAAS,iBAAiB,IAAI,KAAK;AACzC,QAAM,aAAa,cAAc,IAAI;AAGrC,MAAI,UAAyB;AAC7B,MAAI,OAAsB;AAC1B,aAAW,OAAO,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK,OAAO,UAAU,OAAO;AACxD,QAAI,QAAQ;AACV,gBAAU,OAAO;AACjB,aAAO,OAAO;AACd;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAgC;AACpC,aAAW,OAAO,YAAY;AAC5B,UAAM,SAAS,eAAe,KAAK,OAAO,IAAI,OAAO;AACrD,QAAI,QAAQ;AACV,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAGA,MAAI,gBAAsC;AAC1C,aAAW,OAAO,YAAY;AAC5B,UAAM,SAAS,kBAAkB,KAAK,OAAO,OAAO,OAAO;AAC3D,QAAI,QAAQ;AACV,sBAAgB;AAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,YAAY,QAAQ,cAAc;AAC/E;;;ACtPA,IAAM,MAAM;AAuDL,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,QAAQ,MAA2C;AACvD,WAAO,KAAK,KAAK;AAAA,MAAsB,CAAC,OAAO,UAC7C,KAAK,KAAK;AAAA,QACR,GAAG,GAAG,aAAa,KAAK,OAAO,UAAU,KAAK,IAAI;AAAA,QAClD;AAAA,UACE,QAAQ;AAAA,YACN,OAAO,KAAK,SAAS;AAAA,YACrB,GAAI,KAAK,SAAS,EAAE,mBAAmB,KAAK,OAAO,IAAI,CAAC;AAAA,YACxD;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,SAAiB,MAAc,IAAkC;AAC3E,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,EAAE;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAA0C;AACvD,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,KAAK,OAAO,UAAU,KAAK,IAAI;AAAA,MAClD;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,OAAO,KAAK;AAAA,UACZ,aAAa,KAAK;AAAA,UAClB,SAAS;AAAA,YACP,IAAI,cAAc,KAAK,MAAM;AAAA,YAC7B,YAAY;AAAA,cACV,MAAM,KAAK;AAAA,cACX,SAAS,EAAE,KAAK,KAAK,QAAQ;AAAA,YAC/B;AAAA,UACF;AAAA,UACA,OAAO;AAAA,YACL,IAAI,cAAc,KAAK,MAAM;AAAA,YAC7B,YAAY;AAAA,cACV,MAAM,KAAK;AAAA,cACX,SAAS,EAAE,KAAK,KAAK,QAAQ;AAAA,YAC/B;AAAA,UACF;AAAA,UACA,YAAY,KAAK,aAAa,CAAC,GAAG,IAAI,WAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAA0C;AACvD,UAAM,OAAgC,EAAE,SAAS,KAAK,QAAQ;AAC9D,QAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,QAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,KAAK;AAC5D,QAAI,KAAK,UAAW,MAAK,YAAY,KAAK,UAAU,IAAI,WAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;AAEpF,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,KAAK,OAAO,UAAU,KAAK,IAAI,kBAAkB,KAAK,EAAE;AAAA,MAC3E,EAAE,QAAQ,OAAO,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAyC;AACrD,UAAM,SAAgE;AAAA,MACpE,SAAS,KAAK;AAAA,IAChB;AACA,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,SAAU,MAAK,aAAa,KAAK;AAC1C,QAAI,KAAK,aAAc,MAAK,cAAc;AAE1C,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,KAAK,OAAO,UAAU,KAAK,IAAI,kBAAkB,KAAK,EAAE;AAAA,MAC3E,EAAE,QAAQ,QAAQ,QAAQ,KAAK;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,SAAiB,MAAc,IAAY,SAAuC;AAChG,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,EAAE;AAAA,MAC5D,EAAE,QAAQ,QAAQ,QAAQ,EAAE,QAAQ,EAAE;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,SACA,MACA,MACA,OAA+E,CAAC,GACnD;AAC7B,UAAM,EAAE,cAAc,MAAM,aAAa,OAAO,cAAc,MAAM,IAAI;AAGxE,UAAM,aAAa,MAAM,KAAK,KAAK;AAAA,MAAmB,CAAC,OAAO,UAC5D,KAAK,KAAK;AAAA,QACR,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,QAC9D,EAAE,QAAQ,EAAE,OAAO,MAAM,EAAE;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,WAAW,WACd,OAAO,OAAK,EAAE,WAAW,eAAe,EAAE,OAAO,EACjD,IAAI,OAAK,EAAE,OAAQ;AAEtB,QAAI,CAAC,aAAa;AAChB,aAAO,SACJ,OAAO,OAAK,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EACrC,OAAO,OAAK,CAAC,eAAe,CAAC,EAAE,MAAM;AAAA,IAC1C;AAGA,aAAS,QAAQ,SAA2B,UAAuC;AACjF,YAAM,OAAyB;AAAA,QAC7B,GAAG;AAAA,QACH,UAAU;AAAA,QACV,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/C;AACA,YAAM,WAAW,QAAQ,YAAY,CAAC,GAAG,QAAQ,OAAK,QAAQ,GAAG,QAAQ,EAAE,CAAC;AAC5E,aAAO,CAAC,MAAM,GAAG,OAAO;AAAA,IAC1B;AAEA,UAAM,OAAO,SAAS,QAAQ,OAAK,QAAQ,CAAC,CAAC;AAC7C,WAAO,KACJ,OAAO,OAAK,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EACrC,OAAO,OAAK,CAAC,eAAe,CAAC,EAAE,MAAM,EACrC,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAAA,EACjD;AAAA,EAEA,MAAM,WAAW,SAAiB,MAAc,MAAc,MAAyC;AACrG,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,MAC9D,EAAE,QAAQ,QAAQ,MAAM,EAAE,KAAK,EAAE;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,MAAoD;AACzE,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,KAAK,OAAO,UAAU,KAAK,IAAI,kBAAkB,KAAK,IAAI;AAAA,MAC7E;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,MAAM,KAAK;AAAA,UACX,QAAQ;AAAA,YACN,MAAM,KAAK;AAAA,YACX,UAAU,KAAK,YAAY;AAAA,YAC3B,UAAU;AAAA,YACV,MAAM,KAAK;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,SAAiB,MAAc,MAAc,WAAmB,MAAyC;AAC1H,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,MAC9D,EAAE,QAAQ,QAAQ,MAAM,EAAE,MAAM,QAAQ,EAAE,IAAI,UAAU,EAAE,EAAE;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,SAAiB,MAAc,MAAc,WAAmB,SAAgC;AACnH,UAAM,KAAK,KAAK;AAAA,MACd,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI,aAAa,SAAS;AAAA,MACpF,EAAE,QAAQ,OAAO,QAAQ,EAAE,QAAQ,EAAE;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAAiB,MAAc,MAAc,WAAmB,SAAgC;AAClH,UAAM,KAAK,KAAK;AAAA,MACd,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI,aAAa,SAAS;AAAA,MACpF,EAAE,QAAQ,UAAU,QAAQ,EAAE,QAAQ,EAAE;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAAiB,MAAc,MAAc,MAAe,cAAwC;AAChH,UAAM,SAAgE,CAAC;AACvE,QAAI,iBAAiB,OAAW,QAAO,eAAe;AAItD,UAAM,WAAW,OACb,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI,SAAS,IAAI,KAC3E,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAElE,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAEA,WAAO,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AAAA,EACpE;AAAA,EAEA,MAAM,UAAU,SAAiB,MAAc,MAAiC;AAC9E,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,MAC9D,EAAE,QAAQ,EAAE,OAAO,IAAK,EAAE;AAAA,IAC5B;AACA,YAAQ,OAAO,UAAU,CAAC,GAAG,IAAI,OAAM,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO,KAAK,UAAU,EAAE,IAAI,CAAE;AAAA,EACtG;AAAA,EAEA,MAAM,iBAAyC;AAM7C,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,KAAK;AAAA,MAClC,GAAG,GAAG;AAAA,IACR;AACA,UAAM,WAAW,QAAQ,IAAI,aAAa;AAC1C,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,GAAG,GAAG;AAAA,MACR;AAAA,IACF;AACA,WAAO,KAAK,KAAK,UAAyB,GAAG,GAAG,UAAU,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EAC1F;AAAA,EAEA,MAAM,UAAU,SAAiB,MAAc,MAAgC;AAG7E,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,MAC9D,EAAE,QAAQ,OAAO;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAiB,MAAc,MAAgC;AAC/E,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,MAC9D,EAAE,QAAQ,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAiB,MAAc,MAAgC;AAK/E,UAAM,CAAC,aAAa,EAAE,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1C,KAAK,eAAe;AAAA,MACpB,KAAK,MAAM,SAAS,MAAM,IAAI;AAAA,IAChC,CAAC;AAED,UAAM,aAAa,GAAG,UAAU,KAAK,OAAK,EAAE,KAAK,SAAS,YAAY,IAAI;AAC1E,QAAI,CAAC,YAAY;AACf,YAAM,KAAK,KAAK;AAAA,QACd,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,QAC9D,EAAE,QAAQ,QAAQ,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,KAAK,GAAG,MAAM,WAAW,EAAE;AAAA,MACjF;AAAA,IACF;AAEA,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI,iBAAiB,YAAY,IAAI;AAAA,MAC/F,EAAE,QAAQ,OAAO,MAAM,EAAE,QAAQ,aAAa,EAAE;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAAiB,MAAc,MAAkC;AACnF,UAAM,KAAK,MAAM,KAAK,MAAM,SAAS,MAAM,IAAI;AAC/C,WAAO,GAAG;AAAA,EACZ;AAAA,EAEA,MAAM,YAAY,SAAiB,MAAc,MAAc,UAAoC;AACjG,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,MAC9D,EAAE,QAAQ,QAAQ,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAAiB,MAAc,MAA+C;AAE7F,UAAM,UAAU,MAAM,KAAK,KAAK;AAAA,MAC9B,GAAG,GAAG,aAAa,OAAO,UAAU,IAAI,kBAAkB,IAAI;AAAA,MAC9D,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;AAAA,IACzB;AACA,UAAM,MAAM,QAAQ,OAAO,CAAC,GAAG;AAC/B,QAAI,CAAC,IAAK,QAAO,CAAC;AAClB,WAAO,KAAK,eAAe,GAAG;AAAA,EAChC;AAAA,EAEA,MAAM,eAAe,QAAiD;AACpE,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,kCAAkC,MAAM;AAAA,IAC1C;AACA,WAAO,OAAO,UAAU,CAAC;AAAA,EAC3B;AAAA,EAEA,MAAM,WAAW,MAA8C;AAC7D,WAAO,KAAK,KAAK;AAAA,MACf,GAAG,GAAG,aAAa,KAAK,OAAO;AAAA,MAC/B;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,UACP,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACzWA,SAAS,kBAA0B;AACjC,QAAM,OAAO,YAAY;AACzB,MAAI,CAAC,KAAM,OAAM,IAAI,WAAW,wBAAwB,CAAC;AACzD,SAAO;AACT;AAEO,SAAS,oBAAoBE,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,sBAAsB;AAErE,MACG,QAAQ,QAAQ,EAChB,YAAY,oDAAoD,EAChE,OAAO,MAAM;AACZ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,OAAO,UAAU,IAAI;AAC3B,cAAQ,MAAM,OAAO,UAAU,KAAK;AAAA,IACtC,SAAS,KAAK;AACZ,WAAK,KAAK,OAAO,UAAU,KAAK;AAAA,IAClC;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,8BAA8B,EAC1C,OAAO,YAAY,0BAA0B,EAC7C,OAAO,iBAAiB,+BAA+B,EACvD,OAAO,CAAC,SAA8C;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,OAAO,QAAQ,MAAM,EAAE,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK,CAAC;AACnE,cAAQ,MAAM,OAAO,QAAQ,KAAK;AAAA,IACpC,SAAS,KAAK;AACZ,WAAK,KAAK,OAAO,QAAQ,KAAK;AAAA,IAChC;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,KAAK,EACb,YAAY,6BAA6B,EACzC,OAAO,eAAe,6BAA6B,IAAI,EACvD,OAAO,kBAAkB,8CAA8C,EACvE,OAAO,CAAC,SAA6C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,QAAQ,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AACtD,YAAM,OAAO,OAAO,MAAM,EAAE,OAAO,OAAO,KAAK,MAAM,CAAC;AACtD,cAAQ,MAAM,OAAO,OAAO,KAAK;AAAA,IACnC,SAAS,KAAK;AACZ,WAAK,KAAK,OAAO,OAAO,KAAK;AAAA,IAC/B;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,mDAAmD,EAC/D,OAAO,MAAM;AACZ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,OAAO,YAAY,IAAI;AAC7B,cAAQ,MAAM,OAAO,UAAU,KAAK;AAAA,IACtC,SAAS,KAAK;AACZ,WAAK,KAAK,OAAO,UAAU,KAAK;AAAA,IAClC;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,kFAAkF,EAC9F,OAAO,mBAAmB,kDAAkD,EAC5E,OAAO,gBAAgB,+FAA+F,EACtH,OAAO,kBAAkB,2DAA2D,EACpF,OAAO,kBAAkB,4DAA4D,EACrF,OAAO,SAAS,+BAA+B,EAC/C,OAAO,CAAC,SAA4F;AACnG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,SAAS,gBAAgB,MAAM;AAAA,QACnC,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,MACd,CAAC;AACD,UAAI,KAAK,KAAK;AACZ,uBAAe,sBAAsB,MAAM,CAAC;AAAA,MAC9C,OAAO;AACL,gBAAQ,QAAQ,OAAO,UAAU,KAAK;AAAA,MACxC;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,KAAK,OAAO,UAAU,KAAK;AAAA,IAClC;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,YAAY,EACpB,YAAY,yCAAyC,EACrD,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAOA,SAAQ,gBAAgB;AACrC,YAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AAErD,UAAI,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,UAAU,KAAK;AACtD;AAAA,UACE,EAAE,SAAS,gEAAgE;AAAA,UAC3E;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,OAAO,gBAAgB;AAC7B,YAAM,SAAS,iBAAiB,IAAI;AACpC,UAAI,CAAC,OAAQ,OAAM,IAAI,WAAW,sCAAsC,CAAC;AAEzE,YAAM,MAAM,cAAc,MAAM;AAChC,YAAM,UAAU,KAAK,WAAW,OAAO,SAAS,WAAW,WAAW;AACtE,YAAM,OAAO,KAAK,QAAQ,OAAO,SAAS,WAAW,QAAQ;AAC7D,UAAI,CAAC,WAAW,CAAC,KAAM,OAAM,IAAI,WAAW,8CAA8C,CAAC;AAE3F,YAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,YAAM,SAAS,IAAI,gBAAgB,IAAI;AACvC,YAAM,MAAM,MAAM,OAAO,QAAQ,EAAE,SAAS,MAAM,OAAO,OAAO,CAAC;AACjE,YAAM,QAAQ,IAAI,KAAK,QAAM,GAAG,QAAQ,cAAc,MAAM,KAAK;AACjE,cAAQ,OAAO,OAAO,cAAc,KAAK;AAAA,IAC3C,SAAS,KAAK;AACZ,WAAK,KAAK,OAAO,cAAc,KAAK;AAAA,IACtC;AAAA,EACF,CAAC;AACL;;;ACjJA,SAAS,gBAAAC,eAAc,YAAY,eAAe,iBAAiB;AACnE,OAAO,UAAU;;;ACDjB,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;;;ACDzB,SAAS,eAAe;AASjB,SAAS,cAAc,UAA0B;AACtD,QAAM,MAAM,QAAQ,QAAQ,EAAE,YAAY;AAC1C,QAAM,MAA8B;AAAA,IAClC,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACA,SAAO,IAAI,GAAG,KAAK;AACrB;;;ADlBA,IAAMC,OAAM;AACZ,IAAM,YAAY;AA6BX,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,SAAS,KAAiC;AAC9C,WAAO,KAAK,KAAK,KAAgB,GAAGA,IAAG,UAAU,GAAG,EAAE;AAAA,EACxD;AAAA,EAEA,MAAM,YAAY,MAA2C;AAC3D,UAAM,OAAgC;AAAA,MACpC,QAAQ;AAAA,QACN,SAAS,EAAE,KAAK,KAAK,QAAQ;AAAA,QAC7B,WAAW,EAAE,MAAM,KAAK,UAAU;AAAA,QAClC,SAAS,KAAK;AAAA,QACd,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,QAC5D,GAAI,KAAK,WAAW,EAAE,UAAU,EAAE,MAAM,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,QAC7D,GAAI,KAAK,WAAW,EAAE,UAAU,EAAE,MAAM,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,QAC7D,GAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QACrD,GAAI,KAAK,SAAS,EAAE,QAAQ,EAAE,KAAK,KAAK,OAAO,EAAE,IAAI,CAAC;AAAA,QACtD,GAAI,KAAK,qBAAqB,CAAC;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,KAAK,KAAK,KAAkC,GAAGA,IAAG,UAAU;AAAA,MAChF,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,WAAO,KAAK,SAAS,QAAQ,GAAG;AAAA,EAClC;AAAA,EAEA,MAAM,YAAY,KAAa,MAAsC;AACnE,UAAM,SAAkC,CAAC;AACzC,QAAI,KAAK,QAAS,QAAO,UAAU,KAAK;AACxC,QAAI,KAAK,YAAa,QAAO,cAAc,KAAK;AAChD,QAAI,KAAK,SAAU,QAAO,WAAW,EAAE,MAAM,KAAK,SAAS;AAC3D,QAAI,KAAK,SAAU,QAAO,WAAW,EAAE,MAAM,KAAK,SAAS;AAC3D,QAAI,KAAK,QAAQ,OAAQ,QAAO,SAAS,KAAK;AAC9C,WAAO,OAAO,QAAQ,KAAK,qBAAqB,CAAC,CAAC;AAElD,UAAM,KAAK,KAAK,KAAW,GAAGA,IAAG,UAAU,GAAG,IAAI;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,EAAE,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,KAAwC;AAC5D,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,GAAGA,IAAG,UAAU,GAAG;AAAA,IACrB;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,gBAAgB,KAAa,cAAqC;AACtE,UAAM,KAAK,KAAK,KAAW,GAAGA,IAAG,UAAU,GAAG,gBAAgB;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,EAAE,YAAY,EAAE,IAAI,aAAa,EAAE;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,KAAa,MAAoC;AAChE,WAAO,KAAK,KAAK,KAAkB,GAAGA,IAAG,UAAU,GAAG,YAAY;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,EAAE,MAAM,KAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,KAAqC;AACtD,WAAO,KAAK,KAAK,aAA0B,OAAO,SAAS,eAAe;AACxE,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,GAAGA,IAAG,UAAU,GAAG;AAAA,QACnB,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE;AAAA,MACpC;AACA,aAAO,EAAE,GAAG,QAAQ,QAAQ,OAAO,SAAS;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,KAAa,YAAqB,cAAmE;AAChH,UAAM,iBAAiB,CAAC,WAAW,UAAU,YAAY,YAAY,aAAa,WAAW,WAAW,WAAW,UAAU,UAAU;AACvI,UAAM,SAAS,cAAc,SACzB,CAAC,GAAG,gBAAgB,GAAG,aAAa,IAAI,OAAK,EAAE,EAAE,CAAC,IAClD;AAEJ,QAAI,eAAe,QAAW;AAC5B,aAAO,KAAK,KAAK,KAAuB,GAAGA,IAAG,WAAW;AAAA,QACvD,QAAQ;AAAA,QACR,MAAM,EAAE,KAAK,YAAY,OAAO;AAAA,MAClC,CAAC;AAAA,IACH;AAGA,UAAM,YAAY,MAAM,KAAK,KAAK,aAAwB,OAAO,SAAS,QAAQ;AAChF,YAAM,SAAS,MAAM,KAAK,KAAK,KAAuB,GAAGA,IAAG,WAAW;AAAA,QACrE,QAAQ;AAAA,QACR,MAAM,EAAE,KAAK,SAAS,YAAY,KAAK,OAAO;AAAA,MAChD,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,QAAQ,OAAO,OAAO;AAAA,IAC5C,CAAC;AAED,WAAO,EAAE,QAAQ,WAAW,OAAO,UAAU,QAAQ,SAAS,GAAG,YAAY,UAAU,OAAO;AAAA,EAChG;AAAA,EAEA,MAAM,cAAwC;AAC5C,UAAM,SAAS,MAAM,KAAK,KAAK,KAAsB,GAAGA,IAAG,QAAQ;AACnE,WAAO,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,WAAW,kBAAkB,EAAE,MAAM,EAAE,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAM,6BAA6B,SAAiB,WAA8C;AAChG,UAAM,SAAS,MAAM,KAAK,YAAY;AAatC,QAAI,aAA8C,CAAC;AACnD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,KAAK,KAAyB,GAAGA,IAAG,qBAAqB;AAAA,QAC/E,QAAQ,EAAE,aAAa,SAAS,QAAQ,6BAA6B;AAAA,MACvE,CAAC;AACD,mBAAa,kBAAkB,KAAK,UAAU,SAAS;AAAA,IACzD,QAAQ;AAEN,UAAI;AACF,qBAAa,MAAM,KAAK,6BAA6B,SAAS,SAAS;AAAA,MACzE,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,OAAO,IAAI,OAAK;AACrB,YAAM,KAAK,WAAW,EAAE,EAAE,GAAG;AAC7B,aAAO,IAAI,SAAS,EAAE,GAAG,GAAG,eAAe,GAAG,IAAI;AAAA,IACpD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,6BACZ,SACA,WACoJ;AAEpJ,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,GAAGA,IAAG,qBAAqB,mBAAmB,OAAO,CAAC;AAAA,IACxD;AAEA,UAAM,gBAAgB,YAClB,OAAO,OAAO,OAAO,QAAM,GAAG,KAAK,YAAY,MAAM,UAAU,YAAY,CAAC,IAC5E,OAAO;AAGX,UAAM,SAAoJ,CAAC;AAE3J,eAAW,MAAM,eAAe;AAC9B,YAAM,YAAY,MAAM,KAAK,KAAK;AAAA,QAChC,GAAGA,IAAG,qBAAqB,mBAAmB,OAAO,CAAC,eAAe,GAAG,EAAE;AAAA,MAC5E;AACA,iBAAW,SAAS,UAAU,QAAQ;AACpC,YAAI,CAAC,MAAM,eAAe,OAAQ;AAClC,cAAM,WAAW,OAAO,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAC1D,cAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC9C,mBAAW,MAAM,MAAM,eAAe;AACpC,cAAI,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG;AACpB,qBAAS,KAAK,EAAE;AAChB,iBAAK,IAAI,GAAG,EAAE;AAAA,UAChB;AAAA,QACF;AACA,eAAO,MAAM,OAAO,IAAI,EAAE,eAAe,SAAS;AAAA,MACpD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,KAAa,QAAiC;AAC5D,UAAM,KAAK,KAAK,KAAW,GAAGA,IAAG,UAAU,GAAG,IAAI;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,EAAE,QAAQ,OAAO,IAAI,QAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,KAAa,QAAiC;AAC/D,UAAM,KAAK,KAAK,KAAW,GAAGA,IAAG,UAAU,GAAG,IAAI;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,EAAE,QAAQ,OAAO,IAAI,QAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE;AAAA,IAC/D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,KAAa,UAA6C;AAC/E,UAAM,cAAc,aAAa,QAAQ;AACzC,UAAM,WAAW,SAAS,QAAQ;AAClC,UAAM,WAAW,cAAc,QAAQ;AACvC,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,SAAS,CAAC,GAAG,QAAQ;AAC7E,WAAO,KAAK,KAAK,WAA6B,GAAGA,IAAG,UAAU,GAAG,gBAAgB,QAAQ;AAAA,EAC3F;AAAA,EAEA,MAAM,gBAAgB,KAAwC;AAC5D,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,GAAGA,IAAG,UAAU,GAAG;AAAA,MACnB,EAAE,QAAQ,EAAE,QAAQ,aAAa,EAAE;AAAA,IACrC;AACA,WAAO,OAAO,OAAO,cAAc,CAAC;AAAA,EACtC;AAAA,EAEA,MAAM,mBAAmB,YAAqC;AAC5D,WAAO,KAAK,KAAK,WAAW,UAAU;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,KAAa,WAAkC;AAC/D,UAAM,KAAK,KAAK,KAAW,GAAGA,IAAG,UAAU,GAAG,aAAa;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,EAAE,UAAU;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,MAAoC;AAElD,QAAI,aAAa,KAAK;AACtB,QAAI,MAAM,SAAS,KAAK,UAAU,EAAE,CAAC,GAAG;AACtC,YAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,QAC5B,GAAGA,IAAG;AAAA,MACR;AACA,YAAM,QAAQ,MAAM,eAAe;AAAA,QACjC,OAAK,EAAE,KAAK,YAAY,MAAM,KAAK,SAAS,YAAY,KACnD,EAAE,OAAO,YAAY,MAAM,KAAK,SAAS,YAAY,KACrD,EAAE,QAAQ,YAAY,MAAM,KAAK,SAAS,YAAY;AAAA,MAC7D;AACA,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wBAAwB,KAAK,QAAQ,EAAE;AACnE,mBAAa,MAAM;AAAA,IACrB;AAEA,UAAM,KAAK,KAAK,KAAW,GAAGA,IAAG,cAAc;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,MAAM,EAAE,IAAI,WAAW;AAAA,QACvB,aAAa,EAAE,KAAK,KAAK,IAAI;AAAA,QAC7B,cAAc,EAAE,KAAK,KAAK,OAAO;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,SAAuC;AACtD,WAAO,KAAK,KAAK,aAAwB,OAAO,SAAS,eAAe;AACtE,aAAO,KAAK,KAAK;AAAA,QACf,GAAG,SAAS;AAAA,QACZ,EAAE,QAAQ,EAAE,gBAAgB,SAAS,SAAS,WAAW,EAAE;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,SAAiB,QAA0C;AACnF,WAAO,KAAK,KAAK,aAAyB,OAAO,SAAS,eAAe;AACvE,aAAO,KAAK,KAAK;AAAA,QACf,GAAG,SAAS,UAAU,OAAO;AAAA,QAC7B,EAAE,QAAQ,EAAE,SAAS,YAAY,GAAI,QAAQ,SAAS,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,IAAI,CAAC,EAAG,EAAE;AAAA,MAC5F;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,sBAAsB,SAAiB,QAA0C;AACrF,UAAM,SAAS,MAAM,KAAK,WAAW,OAAO;AAC5C,UAAM,UAAwB,CAAC;AAC/B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,SAAS,QAAS;AAC5B,iBAAW,UAAU,MAAM,KAAK,oBAAoB,MAAM,IAAI,MAAM,GAAG;AACrE,YAAI,KAAK,IAAI,OAAO,EAAE,EAAG;AACzB,aAAK,IAAI,OAAO,EAAE;AAClB,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,UAAkB,WAAoC;AACpE,UAAM,KAAK,KAAK,KAAW,GAAG,SAAS,WAAW,QAAQ,UAAU;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,UAAU;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAGA,SAAS,kBAAkB,QAAyE;AAClG,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,OAAO,UAAU;AAChC,MAAI,OAAO,SAAS,iBAAiB,EAAG,QAAO;AAC/C,MAAI,OAAO,SAAS,iBAAiB,KAAK,OAAO,SAAS,aAAa,EAAG,QAAO;AACjF,MAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,cAAc,EAAG,QAAO;AACzE,MAAI,OAAO,SAAS,YAAY,KAAK,OAAO,SAAS,iBAAiB,EAAG,QAAO;AAChF,MAAI,OAAO,SAAS,QAAQ,EAAG,QAAO;AACtC,MAAI,OAAO,SAAS,KAAK,EAAG,QAAO;AACnC,MAAI,OAAO,SAAS,UAAU,KAAK,OAAO,SAAS,WAAW,EAAG,QAAO;AACxE,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,OAAO,SAAS,OAAQ,QAAO;AACnC,MAAI,OAAO,SAAS,WAAY,QAAO;AACvC,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,SAAO;AACT;AAUA,SAAS,kBACP,UACA,WACoD;AACpD,QAAM,SAA6D,CAAC;AACpE,aAAW,QAAQ,UAAU;AAC3B,eAAW,MAAM,KAAK,YAAY;AAChC,UAAI,aAAa,GAAG,KAAK,YAAY,MAAM,UAAU,YAAY,EAAG;AACpE,iBAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,GAAG,MAAM,GAAG;AAC5D,YAAI,CAAC,UAAU,eAAe,OAAQ;AACtC,cAAM,WAAW,OAAO,OAAO,GAAG,iBAAiB,CAAC;AACpD,cAAM,OAAO,IAAI,IAAI,SAAS,IAAI,OAAK,EAAE,EAAE,CAAC;AAC5C,mBAAW,MAAM,UAAU,eAAe;AACxC,cAAI,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG;AACpB,qBAAS,KAAK,EAAE;AAChB,iBAAK,IAAI,GAAG,EAAE;AAAA,UAChB;AAAA,QACF;AACA,eAAO,OAAO,IAAI,EAAE,eAAe,SAAS;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AEjYO,SAAS,cAAc,QAAiD;AAC7E,QAAM,SAAS,oBAAI,IAAmC;AACtD,QAAM,OAAO,oBAAI,IAAmC;AACpD,aAAW,KAAK,QAAQ;AACtB,WAAO,IAAI,EAAE,KAAK,YAAY,GAAG,CAAC;AAClC,SAAK,IAAI,EAAE,IAAI,CAAC;AAAA,EAClB;AACA,SAAO,EAAE,QAAQ,KAAK;AACxB;AAOO,SAAS,aAAa,KAAa,UAAkC;AAC1E,MAAI,SAAS,OAAO,SAAS,EAAG,QAAO;AAGvC,QAAM,cAAc,MAAM,KAAK,SAAS,OAAO,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAGzF,QAAM,QAAQ,IAAI,MAAM,kBAAkB;AAC1C,SAAO,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,QAAI,IAAI,MAAM,EAAG,QAAO;AACxB,QAAI,MAAM;AACV,eAAW,QAAQ,aAAa;AAC9B,YAAM,MAAM,SAAS,OAAO,IAAI,IAAI;AAEpC,YAAM,UAAU,KAAK,QAAQ,uBAAuB,MAAM;AAC1D,YAAM,IAAI,QAAQ,IAAI,OAAO,eAAe,OAAO,eAAe,IAAI,GAAG,IAAI,EAAE;AAAA,IACjF;AACA,WAAO;AAAA,EACT,CAAC,EAAE,KAAK,EAAE;AACZ;AAMO,SAAS,wBACd,QACA,UACyB;AACzB,MAAI,SAAS,KAAK,SAAS,EAAG,QAAO;AACrC,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAM,MAAM,SAAS,KAAK,IAAI,GAAG;AACjC,WAAO,MAAM,IAAI,OAAO,GAAG,IAAI;AAAA,EACjC;AACA,SAAO;AACT;AAQO,SAAS,iBAAiB,OAAe,MAAgC;AAC9E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK;AACH,aAAO,EAAE,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,MAAM,MAAM,GAAG,EAAE,IAAI,QAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;AAAA,IACxD,KAAK;AACH,aAAO,EAAE,IAAI,MAAM;AAAA,IACrB,KAAK,oBAAoB;AACvB,YAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,UAAI,UAAU,IAAI;AAChB,eAAO,EAAE,IAAI,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;AAAA,MAC1F;AACA,aAAO,EAAE,IAAI,MAAM,KAAK,EAAE;AAAA,IAC5B;AAAA,IACA,KAAK;AACH,aAAO,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAAA,IAC3C,KAAK;AACH,aAAO,EAAE,WAAW,MAAM;AAAA,IAC5B;AACE,aAAO;AAAA,EACX;AACF;;;ACjFO,IAAM,yBAAyB;AAAA,EACpC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aACE;AAAA,EAGF,MAAM;AAAA,EACN,YAAY;AAAA,IACV,SAAS,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,IAC1E,WAAW,EAAE,MAAM,UAAU,aAAa,6DAA6D;AAAA,IACvG,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MAKF,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA,sBAAsB;AACxB;AAEO,IAAM,0BAA0B;AAAA,EACrC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ,CAAC,YAAY,QAAQ;AAAA;AAAA;AAAA;AAAA,IAI7B,mBAAmB;AAAA,EACrB;AACF;;;AC1CA,SAAS,gBAAAC,qBAAoB;AAQtB,SAAS,iBACd,QACA,MACA,YACoB;AACpB,MAAI,WAAW,UAAa,SAAS,QAAW;AAC9C,UAAM,IAAI,WAAW,yBAAyB,UAAU,UAAU,UAAU,SAAS,CAAC;AAAA,EACxF;AACA,MAAI,SAAS,QAAW;AACtB,QAAI;AACF,aAAOC,cAAa,SAAS,MAAM,IAAI,MAAM,MAAM;AAAA,IACrD,SAAS,GAAG;AACV,YAAM,SAAS,SAAS,MAAM,UAAU,SAAS,IAAI;AACrD,YAAM,IAAI,WAAW,eAAe,UAAU,IAAI,MAAM,KAAM,EAA4B,OAAO,IAAI,CAAC;AAAA,IACxG;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,kBAAkB,UAAkB,aAAa,cAAuB;AACtF,MAAI;AACJ,MAAI;AACF,UAAMA,cAAa,aAAa,MAAM,IAAI,UAAU,MAAM;AAAA,EAC5D,SAAS,GAAG;AACV,UAAM,SAAS,aAAa,MAAM,UAAU,SAAS,QAAQ;AAC7D,UAAM,IAAI,WAAW,iBAAiB,UAAU,IAAI,MAAM,KAAM,EAA4B,OAAO,IAAI,CAAC;AAAA,EAC1G;AACA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,GAAG;AACV,UAAM,IAAI,WAAW,KAAK,UAAU,6BAA8B,EAAY,OAAO,IAAI,CAAC;AAAA,EAC5F;AACF;AAOO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,WAAW,GAAG,EAAG,QAAO;AAChE,QAAM,WAAW,MAAM,MAAM,CAAC;AAC9B,MAAI;AACF,WAAOA,cAAa,UAAU,MAAM;AAAA,EACtC,SAAS,GAAG;AACV,UAAM,IAAI,WAAW,gCAAgC,QAAQ,MAAO,EAA4B,OAAO,IAAI,CAAC;AAAA,EAC9G;AACF;AAQO,SAAS,mBACd,UACA,WAC0D;AAC1D,QAAM,SAAkC,EAAE,GAAG,SAAS;AACtD,QAAM,YAAsB,CAAC;AAC7B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,QAAI,UAAU,OAAW;AACzB,QAAI,OAAO,UAAU,eAAe,KAAK,UAAU,GAAG,EAAG,WAAU,KAAK,GAAG;AAC3E,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,EAAE,QAAQ,UAAU;AAC7B;;;AL3DA,IAAM,uBAAuB,oBAAI,IAAI,CAAC,WAAW,eAAe,YAAY,YAAY,UAAU,QAAQ,CAAC;AAWpG,SAAS,sBACd,QACA,UACuE;AACvE,QAAM,UAAmC,CAAC;AAC1C,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,UAAM,QAAQ,iBAAiB,QAAQ;AACvC,UAAM,MAAM,OAAO,YAAY;AAC/B,QAAI,qBAAqB,IAAI,GAAG,GAAG;AACjC,cAAQ,GAAG,IAAI;AACf;AAAA,IACF;AACA,UAAM,MAAM,SAAS,OAAO,IAAI,GAAG,KAAK,SAAS,KAAK,IAAI,MAAM;AAChE,QAAI,KAAK;AACP,aAAO,IAAI,EAAE,IAAI;AAAA,IACnB,WAAW,CAAC,KAAK,KAAK,MAAM,GAAG;AAC7B,aAAO,MAAM,IAAI;AAAA,IACnB,OAAO;AACL,YAAM,IAAI;AAAA,QACR,0BAA0B,MAAM;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAGA,SAAS,gBAAgB,OAAsC;AAC7D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,OAAK,OAAO,CAAC,EAAE,KAAK,CAAC;AAChE,SAAO,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACnE;AAEA,SAAS,UAAUC,UAA8B;AAC/C,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,MAAI,CAAC,OAAO,KAAK,QAAS,OAAM,IAAI,WAAW,6CAA6C;AAC5F,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,IAAI,WAAW,IAAI;AAC5B;AAEA,SAAS,mBAAmBA,UAAyI;AACnK,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,MAAI,CAAC,OAAO,KAAK,QAAS,OAAM,IAAI,WAAW,6CAA6C;AAC5F,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,QAAM,SAAS,IAAI,WAAW,IAAI;AAClC,QAAM,eAAe,OAAO,KAAK;AACjC,QAAM,WAAW,cAAc,YAAY;AAC3C,SAAO,EAAE,QAAQ,UAAU,aAAa;AAC1C;AAEA,SAAS,YAAYA,UAA+E;AAClG,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,SAAO;AAAA,IACL,SAAS,OAAO,SAAS,MAAM;AAAA,IAC/B,WAAW,OAAO,SAAS,MAAM;AAAA,IACjC,UAAU,OAAO,SAAS,MAAM;AAAA,EAClC;AACF;AAOO,SAAS,gBAAgB,KAAyB,SAAqC;AAC5F,QAAM,MAAM,iBAAiB,KAAK,SAAS,KAAK;AAChD,MAAI,QAAQ,OAAW,OAAM,IAAI,WAAW,oCAAoC,CAAC;AACjF,QAAM,UAAU,IAAI,KAAK;AAGzB,MAAI,CAAC,QAAS,OAAM,IAAI,WAAW,sBAAsB,CAAC;AAC1D,SAAO;AACT;AAEO,SAAS,qBAAqBA,UAAwB;AAC3D,QAAM,OAAOA,SAAQ,QAAQ,MAAM,EAAE,YAAY,4BAA4B;AAE7E,OAAK,QAAQ,WAAW,EACrB,YAAY,yBAAyB,EACrC,eAAe,qBAAqB,2BAA2B,EAC/D,OAAO,OAAO,SAA0B;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,IAAI,mBAAmBA,QAAO;AACvD,YAAM,OAAO,MAAM,OAAO,SAAS,KAAK,GAAG;AAC3C,YAAM,aAAa,EAAE,GAAG,MAAM,QAAQ,wBAAwB,KAAK,QAAmC,QAAQ,EAAE;AAChH,cAAQ,YAAY,QAAQ,aAAa,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,aAAa,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAEH,OAAK,QAAQ,cAAc,EACxB,YAAY,qBAAqB,EACjC,OAAO,mBAAmB,aAAa,EACvC,OAAO,iBAAiB,oCAAoC,EAC5D,OAAO,oBAAoB,4DAA4D,EACvF,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,qBAAqB,eAAe,EAC3C,OAAO,0BAA0B,qBAAqB,EACtD,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,kBAAkB,kEAA6D,EACtF,OAAO,wBAAwB,gFAAgF,CAAC,KAAa,QAAkB,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAa,EAC5K,OAAO,wBAAwB,sEAAsE,EACrG,OAAO,uBAAuB,qJAAqJ,EACnL,OAAO,OAAO,SAAwN;AACrO,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,WAAW,cAAc,CAAC,CAAC;AAC/B,QAAI;AACF,YAAM,WAAW,mBAAmBA,QAAO;AAC3C,YAAM,SAAS,SAAS;AACxB,iBAAW,SAAS;AACpB,YAAM,WAAW,YAAYA,QAAO;AAEpC,YAAM,YAAY,KAAK,YAAa,kBAAkB,KAAK,SAAS,IAAuB;AAC3F,YAAM,EAAE,SAAS,aAAa,QAAQ,WAAW,IAAI,WAAW,SAC5D,sBAAsB,UAAU,QAAQ,QAAQ,IAChD,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE9B,YAAM,UAAU,KAAK,WAAW,WAAW,WAAW,SAAS;AAC/D,YAAM,YAAY,KAAK,QAAQ,WAAW,aAAa,SAAS,aAAa;AAC7E,UAAI,CAAC,QAAS,OAAM,IAAI,WAAW,6FAA6F,CAAC;AAEjI,YAAM,cAAuC;AAAA,QAC3C,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAC9D,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,QAC1E,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACjE,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACjE,GAAI,KAAK,WAAW,SAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QAC3D,GAAI,KAAK,WAAW,SAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,MAC7D;AACA,YAAM,EAAE,QAAQ,eAAe,WAAW,iBAAiB,IAAI,mBAAmB,aAAa,WAAW;AAE1G,YAAM,UAAU,cAAc;AAC9B,UAAI,CAAC,QAAS,OAAM,IAAI,WAAW,8DAA8D,CAAC;AAClG,YAAM,WAAY,cAAc,YAAmC,SAAS;AAE5E,YAAM,aAAa,KAAK,aAAa,gBAAgB,KAAK,YAAY,QAAQ,IAAI,CAAC;AACnF,YAAM,aAAa,EAAE,GAAG,YAAY,GAAG,eAAe,KAAK,OAAO,QAAQ,EAAE;AAC5E,YAAM,EAAE,QAAQ,mBAAmB,WAAW,gBAAgB,IAAI,mBAAmB,YAAY,UAAU;AAE3G,YAAM,YAAY,CAAC,GAAG,kBAAkB,GAAG,eAAe;AAC1D,UAAI,UAAU,OAAQ,MAAK,kDAAkD,UAAU,KAAK,IAAI,CAAC,EAAE;AAEnG,YAAM,OAAO,MAAM,OAAO,YAAY;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,cAAc;AAAA,QAC3B;AAAA,QACA,UAAU,cAAc;AAAA,QACxB,QAAQ,gBAAgB,cAAc,MAAM;AAAA,QAC5C,QAAQ,cAAc;AAAA,QACtB;AAAA,MACF,CAAC;AACD,cAAQ,MAAM,QAAQ,gBAAgB,OAAO,SAAS;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,qBAAqB,KAAK,QAAQ,GAAG,QAAQ,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC5F,CAAC;AAEH,OAAK,QAAQ,cAAc,EACxB,YAAY,qBAAqB,EACjC,eAAe,qBAAqB,WAAW,EAC/C,OAAO,oBAAoB,aAAa,EACxC,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,qBAAqB,cAAc,EAC1C,OAAO,0BAA0B,yBAAyB,EAC1D,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,wBAAwB,gFAAgF,CAAC,KAAa,QAAkB,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAa,EAC5K,OAAO,wBAAwB,sEAAsE,EACrG,OAAO,uBAAuB,kIAAkI,EAChK,OAAO,OAAO,SAAmL;AAChM,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,WAAW,cAAc,CAAC,CAAC;AAC/B,QAAI;AACF,YAAM,WAAW,mBAAmBA,QAAO;AAC3C,YAAM,SAAS,SAAS;AACxB,iBAAW,SAAS;AAEpB,YAAM,YAAY,KAAK,YAAa,kBAAkB,KAAK,SAAS,IAAuB;AAC3F,YAAM,EAAE,SAAS,aAAa,QAAQ,WAAW,IAAI,WAAW,SAC5D,sBAAsB,UAAU,QAAQ,QAAQ,IAChD,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE9B,YAAM,cAAuC;AAAA,QAC3C,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAC9D,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,QAC1E,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACjE,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACjE,GAAI,KAAK,WAAW,SAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,MAC7D;AACA,YAAM,EAAE,QAAQ,eAAe,WAAW,iBAAiB,IAAI,mBAAmB,aAAa,WAAW;AAE1G,YAAM,aAAa,KAAK,aAAa,gBAAgB,KAAK,YAAY,QAAQ,IAAI,CAAC;AACnF,YAAM,aAAa,EAAE,GAAG,YAAY,GAAG,eAAe,KAAK,OAAO,QAAQ,EAAE;AAC5E,YAAM,EAAE,QAAQ,mBAAmB,WAAW,gBAAgB,IAAI,mBAAmB,YAAY,UAAU;AAE3G,YAAM,YAAY,CAAC,GAAG,kBAAkB,GAAG,eAAe;AAC1D,UAAI,UAAU,OAAQ,MAAK,kDAAkD,UAAU,KAAK,IAAI,CAAC,EAAE;AAEnG,YAAM,OAAO,YAAY,KAAK,KAAK;AAAA,QACjC,SAAS,cAAc;AAAA,QACvB,aAAa,cAAc;AAAA,QAC3B,UAAU,cAAc;AAAA,QACxB,UAAU,cAAc;AAAA,QACxB,QAAQ,gBAAgB,cAAc,MAAM;AAAA,QAC5C;AAAA,MACF,CAAC;AACD,cAAQ,EAAE,SAAS,KAAK,IAAI,GAAG,QAAQ,gBAAgB,OAAO,SAAS;AAAA,IACzE,SAAS,KAAK;AAAE,WAAK,qBAAqB,KAAK,QAAQ,GAAG,QAAQ,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC5F,CAAC;AAEH,OAAK,QAAQ,QAAQ,EAClB,YAAY,iFAAiF,EAC7F,OAAO,kBAAkB,+FAA0F,EACnH,OAAO,CAAC,SAAoC;AAC3C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,KAAK,aAAa;AAGpB,qBAAe,KAAK,UAAU,yBAAyB,MAAM,CAAC,IAAI,IAAI;AACtE;AAAA,IACF;AACA,YAAQ,EAAE,QAAQ,wBAAwB,SAAS,wBAAwB,GAAG,QAAQ,UAAU,KAAK;AAAA,EACvG,CAAC;AAEH,OAAK,QAAQ,kBAAkB,EAC5B,YAAY,yCAAyC,EACrD,eAAe,qBAAqB,WAAW,EAC/C,eAAe,6BAA6B,uBAAuB,EACnE,OAAO,OAAO,SAA8C;AAC3D,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAEhC,UAAI,eAAe,KAAK;AACxB,UAAI,MAAM,SAAS,KAAK,YAAY,EAAE,CAAC,GAAG;AACxC,cAAM,cAAc,MAAM,OAAO,gBAAgB,KAAK,GAAG;AACzD,cAAM,QAAQ,YAAY,KAAK,OAAK,EAAE,KAAK,YAAY,MAAM,KAAK,WAAW,YAAY,CAAC;AAC1F,YAAI,CAAC,MAAO,OAAM,IAAI,WAAW,yBAAyB,KAAK,UAAU,IAAI,CAAC;AAC9E,uBAAe,MAAM;AAAA,MACvB;AACA,YAAM,OAAO,gBAAgB,KAAK,KAAK,YAAY;AACnD,cAAQ,EAAE,cAAc,KAAK,KAAK,YAAY,KAAK,WAAW,GAAG,QAAQ,oBAAoB,KAAK;AAAA,IACpG,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,OAAK,QAAQ,kBAAkB,EAC5B,YAAY,yCAAyC,EACrD,eAAe,qBAAqB,WAAW,EAC/C,OAAO,OAAO,SAA0B;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,gBAAgB,KAAK,GAAG;AAClD,cAAQ,MAAM,QAAQ,oBAAoB,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,OAAK,QAAQ,aAAa,EACvB,YAAY,+BAA+B,EAC3C,eAAe,qBAAqB,WAAW,EAC/C,eAAe,iBAAiB,cAAc,EAC9C,OAAO,OAAO,SAAwC;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK,KAAK,IAAI;AACxD,cAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,eAAe,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,OAAK,QAAQ,eAAe,EACzB,YAAY,+BAA+B,EAC3C,eAAe,qBAAqB,WAAW,EAC/C,OAAO,OAAO,SAA0B;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,aAAa,KAAK,GAAG;AAC/C,cAAQ,MAAM,QAAQ,iBAAiB,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,OAAK,QAAQ,QAAQ,EAClB,YAAY,wEAAwE,EACpF,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,qBAAqB,uDAAuD,EACnF,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,OAAO,SAAkE;AAC/E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,UAAU,aAAa,IAAI,mBAAmBA,QAAO;AACrE,YAAM,MAAM,gBAAgB,KAAK,KAAK,KAAK,OAAO;AAClD,YAAM,aAAa,KAAK,aAAa,SAAS,KAAK,YAAY,EAAE,IAAI;AACrE,YAAM,gBAAgB,aAAa,KAAK,QAAQ;AAChD,YAAM,OAAO,MAAM,OAAO,OAAO,eAAe,YAAY,YAAY;AACxE,YAAM,mBAAmB,KAAK,OAAO,IAAI,YAAU;AAAA,QACjD,GAAG;AAAA,QACH,QAAQ,wBAAwB,MAAM,QAAmC,QAAQ;AAAA,MACnF,EAAE;AACF,cAAQ,EAAE,GAAG,MAAM,QAAQ,iBAAiB,GAAG,QAAQ,UAAU,KAAK;AAAA,IACxE,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,UAAU,KAAK;AAAA,IAAG;AAAA,EACtD,CAAC;AAEH,OAAK,QAAQ,WAAW,EACrB,YAAY,0DAA0D,EACtE,eAAe,qBAAqB,WAAW,EAC/C,eAAe,qBAAqB,+BAA+B,EACnE,OAAO,OAAO,SAA0C;AACvD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,SAAS,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACvE,YAAM,OAAO,UAAU,KAAK,KAAK,MAAM;AACvC,cAAQ,EAAE,SAAS,KAAK,KAAK,aAAa,OAAO,GAAG,QAAQ,aAAa,KAAK;AAAA,IAChF,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,aAAa,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAEH,OAAK,QAAQ,cAAc,EACxB,YAAY,+DAA+D,EAC3E,eAAe,qBAAqB,WAAW,EAC/C,eAAe,qBAAqB,kCAAkC,EACtE,OAAO,OAAO,SAA0C;AACvD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,SAAS,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACvE,YAAM,OAAO,aAAa,KAAK,KAAK,MAAM;AAC1C,cAAQ,EAAE,SAAS,KAAK,KAAK,eAAe,OAAO,GAAG,QAAQ,gBAAgB,KAAK;AAAA,IACrF,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAEH,OAAK,QAAQ,QAAQ,EAClB,YAAY,+BAA+B,EAC3C,eAAe,qBAAqB,WAAW,EAC/C,eAAe,0BAA0B,qBAAqB,EAC9D,OAAO,OAAO,SAA4C;AACzD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,YAAY,KAAK,KAAK,KAAK,QAAQ;AAChD,cAAQ,EAAE,UAAU,KAAK,KAAK,UAAU,KAAK,SAAS,GAAG,QAAQ,UAAU,KAAK;AAAA,IAClF,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,UAAU,KAAK;AAAA,IAAG;AAAA,EACtD,CAAC;AAEH,OAAK,QAAQ,YAAY,EACtB,YAAY,+BAA+B,EAC3C,eAAe,qBAAqB,kBAAkB,EACtD,eAAe,sBAAsB,sBAAsB,EAC3D,eAAe,wBAAwB,kBAAkB,EACzD,OAAO,OAAO,SAA4D;AACzE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,UAAU,EAAE,KAAK,KAAK,KAAK,UAAU,KAAK,UAAU,QAAQ,KAAK,OAAO,CAAC;AACtF,cAAQ,EAAE,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,MAAM,KAAK,SAAS,GAAG,QAAQ,cAAc,KAAK;AAAA,IACjG,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,cAAc,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAEH,OAAK,QAAQ,gBAAgB,EAC1B,YAAY,gDAAgD,EAC5D,eAAe,qBAAqB,2BAA2B,EAC/D,eAAe,iBAAiB,4BAA4B,EAC5D,OAAO,OAAO,SAAwC;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,CAAC,WAAW,KAAK,IAAI,EAAG,OAAM,IAAI,WAAW,mBAAmB,KAAK,IAAI,IAAI,CAAC;AAClF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,iBAAiB,KAAK,KAAK,KAAK,IAAI;AAC9D,cAAQ,MAAM,QAAQ,kBAAkB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,kBAAkB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,OAAK,QAAQ,kBAAkB,EAC5B,YAAY,kCAAkC,EAC9C,eAAe,qBAAqB,2BAA2B,EAC/D,OAAO,OAAO,SAA0B;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,gBAAgB,KAAK,GAAG;AAClD,cAAQ,MAAM,QAAQ,oBAAoB,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,OAAK,QAAQ,qBAAqB,EAC/B,YAAY,wDAAwD,EACpE,eAAe,qBAAqB,2BAA2B,EAC/D,eAAe,wBAAwB,4CAA4C,EACnF,OAAO,gBAAgB,oDAAoD,EAC3E,OAAO,OAAO,SAA8D;AAC3E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,cAAc,MAAM,OAAO,gBAAgB,KAAK,GAAG;AACzD,YAAM,aAAa,YAAY,KAAK,OAAK,EAAE,OAAO,KAAK,YAAY;AACnE,UAAI,CAAC,WAAY,OAAM,IAAI,WAAW,yBAAyB,KAAK,YAAY,IAAI,CAAC;AACrF,YAAM,SAAS,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,GAAG,QAAQ;AAC5D,gBAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACrC,YAAM,UAAU,KAAK,KAAK,QAAQ,KAAK,SAAS,WAAW,QAAQ,CAAC;AACpE,YAAM,SAAS,MAAM,OAAO,mBAAmB,WAAW,OAAO;AACjE,oBAAc,SAAS,MAAM;AAC7B,cAAQ,EAAE,OAAO,SAAS,UAAU,WAAW,UAAU,MAAM,OAAO,OAAO,GAAG,QAAQ,uBAAuB,KAAK;AAAA,IACtH,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,uBAAuB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAEH,OAAK,QAAQ,QAAQ,EAClB,YAAY,wGAAwG,EACpH,OAAO,cAAc,oCAAoC,EACzD,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,mBAAmB,iGAA4F,EACtH,OAAO,uBAAuB,oEAAoE,EAClG,OAAO,OAAO,SAA6F;AAC1G,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,KAAK,UAAU;AACjB,cAAM,SAAS,UAAUA,QAAO;AAChC,cAAM,SAAS,KAAK,UAChB,MAAM,OAAO,6BAA6B,KAAK,SAAS,KAAK,SAAS,IACtE,MAAM,OAAO,YAAY;AAC7B,cAAM,SAAS,KAAK,aAAa,OAAO,OAAO,OAAK,EAAE,MAAM,IAAI;AAChE,gBAAQ,QAAQ,QAAQ,UAAU,KAAK;AAAA,MACzC,OAAO;AACL,cAAM,EAAE,aAAa,IAAI,mBAAmBA,QAAO;AACnD,gBAAQ,cAAc,QAAQ,UAAU,KAAK;AAAA,MAC/C;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,UAAU,KAAK;AAAA,IAAG;AAAA,EACtD,CAAC;AAEH,OAAK,QAAQ,aAAa,EACvB,YAAY,iCAAiC,EAC7C,eAAe,mBAAmB,aAAa,EAC/C,OAAO,OAAO,SAA8B;AAC3C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,WAAW,KAAK,OAAO;AACjD,cAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,eAAe,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,OAAK,QAAQ,cAAc,EACxB,YAAY,gEAAgE,EAC5E,OAAO,gBAAgB,UAAU,EACjC,OAAO,mBAAmB,wDAAoD,EAC9E,OAAO,oBAAoB,yDAAyD,EACpF,OAAO,OAAO,SAA+D;AAC5E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,CAAC,KAAK,SAAS,CAAC,KAAK,QAAS,OAAM,IAAI,WAAW,2CAA2C,CAAC;AACnG,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,SAAS,KAAK,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,IAAI;AACvE,YAAM,OAAO,KAAK,QACd,MAAM,OAAO,oBAAoB,SAAS,KAAK,OAAO,EAAE,GAAG,MAAM,IACjE,MAAM,OAAO,sBAAsB,KAAK,SAAmB,MAAM;AACrE,cAAQ,MAAM,QAAQ,gBAAgB,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAEH,OAAK,QAAQ,YAAY,EACtB,YAAY,iCAAiC,EAC7C,eAAe,qBAAqB,WAAW,EAC/C,eAAe,iBAAiB,+BAA+B,EAC/D,OAAO,OAAO,SAA0C;AACvD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,UAAUA,QAAO;AAChC,YAAM,OAAO,UAAU,SAAS,KAAK,QAAQ,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC;AAC5D,cAAQ,EAAE,SAAS,KAAK,KAAK,QAAQ,KAAK,OAAO,GAAG,QAAQ,cAAc,KAAK;AAAA,IACjF,SAAS,KAAK;AAAE,WAAK,KAAK,QAAQ,cAAc,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AACL;AAEO,SAAS,eACd,WACA,UACyB;AACzB,QAAM,SAAkC,CAAC;AACzC,aAAW,OAAO,WAAW;AAC3B,UAAM,KAAK,IAAI,QAAQ,GAAG;AAC1B,QAAI,OAAO,GAAI,OAAM,IAAI,WAAW,iDAAiD,GAAG,IAAI,CAAC;AAC7F,UAAM,OAAO,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK;AACnC,UAAM,QAAQ,IAAI,MAAM,KAAK,CAAC;AAC9B,UAAM,MAAM,SAAS,OAAO,IAAI,KAAK,YAAY,CAAC,KAAK,SAAS,KAAK,IAAI,IAAI;AAC7E,QAAI,CAAC,IAAK,OAAM,IAAI;AAAA,MAClB,0BAA0B,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,YAAM,WAAW,MAAM,MAAM,CAAC;AAC9B,UAAI;AACJ,UAAI;AACF,cAAMC,cAAa,UAAU,MAAM,EAAE,KAAK;AAAA,MAC5C,SAAS,GAAG;AACV,cAAM,IAAI,WAAW,qBAAqB,QAAQ,MAAO,EAA4B,OAAO,IAAI,CAAC;AAAA,MACnG;AACA,UAAI;AACF,eAAO,IAAI,EAAE,IAAI,KAAK,MAAM,GAAG;AAAA,MACjC,QAAQ;AACN,eAAO,IAAI,EAAE,IAAI;AAAA,MACnB;AAAA,IACF,OAAO;AACL,aAAO,IAAI,EAAE,IAAI,iBAAiB,OAAO,IAAI,IAAI;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,UAAkB,UAAmD;AACnG,MAAI;AACJ,MAAI;AACF,UAAMA,cAAa,UAAU,MAAM;AAAA,EACrC,SAAS,GAAG;AACV,UAAM,IAAI,WAAW,4BAA4B,QAAQ,MAAO,EAA4B,OAAO,IAAI,CAAC;AAAA,EAC1G;AACA,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,UAAM,IAAI,WAAW,gBAAgB,QAAQ,iCAAiC,CAAC;AAAA,EACjF;AACA,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG;AACpE,UAAM,IAAI,WAAW,gBAAgB,QAAQ,2BAA2B,CAAC;AAAA,EAC3E;AACA,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,IAA+B,GAAG;AACxE,UAAM,MAAM,SAAS,OAAO,IAAI,IAAI,YAAY,CAAC,KAAK,SAAS,KAAK,IAAI,GAAG;AAC3E,QAAI,CAAC,IAAK,OAAM,IAAI;AAAA,MAClB,qBAAqB,QAAQ,OAAO,GAAG;AAAA,MACvC;AAAA,IACF;AACA,WAAO,IAAI,EAAE,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AAMA,SAAS,qBAAqB,KAAc,UAAmC;AAC7E,MAAI,EAAE,eAAe,eAAe,SAAS,KAAK,SAAS,EAAG,QAAO;AACrE,QAAM,aAAa,IAAI,QAAQ,QAAQ,wBAAwB,CAAC,OAAO;AACrE,UAAM,MAAM,SAAS,KAAK,IAAI,EAAE;AAChC,WAAO,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,MAAM;AAAA,EACvC,CAAC;AACD,MAAI,eAAe,IAAI,QAAS,QAAO;AACvC,SAAO,IAAI,WAAW,YAAY,IAAI,QAAQ,IAAI,GAAG;AACvD;;;AM9jBA,SAASC,WACPC,UACA,WAC4D;AAC5D,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,QAAM,SAAS,IAAI,gBAAgB,IAAI;AACvC,QAAM,MAAM,cAAc,MAAM;AAEhC,QAAM,UAAkB,WAAW,WAAW,KAAK,WAAW,KAAK,WAAW,OAAO,SAAS,WAAW,WAAW;AACpH,QAAM,OAAe,WAAW,QAAQ,KAAK,QAAQ,KAAK,QAAQ,OAAO,SAAS,WAAW,QAAQ;AAErG,MAAI,CAAC,WAAW,CAAC,MAAM;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,SAAS,KAAK;AACjC;AAEO,SAAS,0BAA0BA,UAAwB;AAChE,QAAM,KAAKA,SACR,QAAQ,WAAW,EACnB,YAAY,6BAA6B,EACzC,OAAO,mBAAmB,uBAAuB,EACjD,OAAO,iBAAiB,2BAA2B;AAItD,KAAG,QAAQ,aAAa,EACrB,YAAY,sCAAsC,EAClD,eAAe,iBAAiB,wBAAwB,EACxD,OAAO,wBAAwB,wBAAwB,EACvD,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,OAAO,SAAmE;AAChF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,GAAG,gBAAgB;AACtC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAAO,CAAC;AAC3D,YAAM,OAAO,iBAAiB,QAAQ,QAAQ,WAAW,MAAM,CAAC;AAChE,YAAM,SAAS,IAAI,gBAAgB,IAAI;AACvC,YAAM,MAAM,cAAc,MAAM;AAChC,YAAM,UAAkB,KAAK,WAAW,WAAW,WAAW,KAAK,WAAW,OAAO,SAAS,WAAW,WAAW;AACpH,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,WAAW,oFAAoF,CAAC;AAAA,MAC5G;AACA,YAAM,OAAO,MAAM,OAAO,WAAW,EAAE,SAAS,MAAM,KAAK,MAAM,aAAa,KAAK,YAAY,CAAC;AAChG,cAAQ,MAAM,aAAa,eAAe,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,eAAe,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAIH,KAAG,QAAQ,UAAU,EAClB,YAAY,oBAAoB,EAChC,OAAO,mBAAmB,sCAAsC,MAAM,EACtE,OAAO,uBAAuB,2BAA2B,EACzD,OAAO,yBAAyB,6BAA6B,EAC7D,OAAO,OAAO,SAAiE;AAC9E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAID,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,QAAQ,EAAE,SAAS,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AACpH,cAAQ,MAAM,aAAa,YAAY,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,YAAY,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,KAAG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,MAAM,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACpE,cAAQ,MAAM,aAAa,UAAU,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,UAAU,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,KAAG,QAAQ,WAAW,EACnB,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,UAAU,EAC5C,eAAe,qBAAqB,eAAe,EACnD,OAAO,qBAAqB,oCAAoC,EAChE,OAAO,wBAAwB,gBAAgB,EAC/C,OAAO,uBAAuB,oCAAoC,EAClE,OAAO,mBAAmB,sFAAsF,EAChH,OAAO,iBAAiB,qDAAqD,EAC7E,OAAO,OAAO,SAAwI;AACrJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,IAAI,EAAE,SAAS,KAAK,SAAS,MAAM,KAAK,KAAK,CAAC;AAC1F,YAAM,SAAS,WAAW,EAAE,YAAY,GAAG,gBAAgB,EAAE,OAAO,CAAC;AACrE,YAAM,SAAS,KAAK,UAAU,OAAO,SAAS,WAAW,gBAAgB;AACzE,YAAM,YAAY,KAAK,YAAY,KAAK,UAAU,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,IAAI,CAAC;AACnF,YAAM,OAAO,MAAM,OAAO,SAAS,EAAE,SAAS,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,QAAQ,aAAa,KAAK,aAAa,UAAU,CAAC;AAC9I,cAAQ,MAAM,aAAa,aAAa,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,aAAa,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,KAAG,QAAQ,WAAW,EACnB,YAAY,uBAAuB,EACnC,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,mBAAmB,WAAW,EACrC,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,uBAAuB,oCAAoC,EAClE,OAAO,OAAO,SAAmF;AAChG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,SAAS,KAAK,IAAI,EAAE;AACjC,YAAM,KAAK,MAAM,OAAO,MAAM,SAAS,MAAM,IAAI;AACjD,YAAM,YAAY,KAAK,YAAY,KAAK,UAAU,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,IAAI;AAClF,YAAM,OAAO,MAAM,OAAO,SAAS,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO,KAAK,OAAO,aAAa,KAAK,aAAa,WAAW,SAAS,GAAG,QAAQ,CAAC;AAChJ,cAAQ,MAAM,aAAa,aAAa,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,aAAa,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,KAAG,QAAQ,UAAU,EAClB,YAAY,sBAAsB,EAClC,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,yBAAyB,iCAAiC,EACjE,OAAO,mBAAmB,kCAAkC,EAC5D,OAAO,OAAO,SAAoE;AACjF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,SAAS,KAAK,IAAI,EAAE;AACjC,YAAM,KAAK,MAAM,OAAO,MAAM,SAAS,MAAM,IAAI;AACjD,YAAM,OAAO,MAAM,OAAO,QAAQ,EAAE,SAAS,MAAM,IAAI,MAAM,SAAS,GAAG,SAAS,UAAU,KAAK,UAAuC,cAAc,KAAK,aAAa,CAAC;AACzK,cAAQ,MAAM,aAAa,YAAY,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,YAAY,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,KAAG,QAAQ,YAAY,EACpB,YAAY,wBAAwB,EACpC,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,SAAS,KAAK,IAAI,EAAE;AACjC,YAAM,KAAK,MAAM,OAAO,MAAM,SAAS,MAAM,IAAI;AACjD,YAAM,OAAO,MAAM,OAAO,UAAU,SAAS,MAAM,MAAM,GAAG,OAAO;AACnE,cAAQ,MAAM,aAAa,cAAc,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,cAAc,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAIH,KAAG,QAAQ,eAAe,EACvB,YAAY,wEAAwE,EACpF,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,qBAAqB,iDAAiD,EAC7E,OAAO,iBAAiB,kCAAkC,EAC1D,OAAO,kBAAkB,8CAA8C,EACvE,OAAO,OAAO,SAA4F;AACzG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,aAAa,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,GAAG;AAAA,QAC3E,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,MACpB,CAAC;AACD,cAAQ,MAAM,aAAa,iBAAiB,KAAK;AAAA,IACnD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,KAAG,QAAQ,aAAa,EACrB,YAAY,iCAAiC,EAC7C,eAAe,gBAAgB,iBAAiB,EAChD,eAAe,iBAAiB,cAAc,EAC9C,OAAO,OAAO,SAAuC;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,WAAW,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI;AACpF,cAAQ,MAAM,aAAa,eAAe,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,eAAe,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,KAAG,QAAQ,oBAAoB,EAC5B,YAAY,mDAAmD,EAC/D,eAAe,gBAAgB,iBAAiB,EAChD,eAAe,iBAAiB,WAAW,EAC3C,eAAe,cAAc,aAAa,EAC1C,eAAe,iBAAiB,cAAc,EAC9C,OAAO,sBAAsB,oCAAoC,OAAO,EACxE,OAAO,OAAO,SAAsF;AACnG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,iBAAiB;AAAA,QACzC;AAAA,QAAS;AAAA,QACT,MAAM,SAAS,KAAK,IAAI,EAAE;AAAA,QAC1B,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,MAAM,SAAS,KAAK,MAAM,EAAE;AAAA,QAC5B,UAAU,KAAK;AAAA,MACjB,CAAC;AACD,cAAQ,MAAM,aAAa,sBAAsB,KAAK;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,sBAAsB,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAEH,KAAG,QAAQ,eAAe,EACvB,YAAY,sCAAsC,EAClD,eAAe,gBAAgB,iBAAiB,EAChD,eAAe,qBAAqB,wBAAwB,EAC5D,eAAe,iBAAiB,YAAY,EAC5C,OAAO,OAAO,SAA0D;AACvE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,aAAa,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,GAAG,SAAS,KAAK,WAAW,EAAE,GAAG,KAAK,IAAI;AACpH,cAAQ,MAAM,aAAa,iBAAiB,KAAK;AAAA,IACnD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,KAAG,QAAQ,iBAAiB,EACzB,YAAY,qCAAqC,EACjD,eAAe,gBAAgB,iBAAiB,EAChD,eAAe,qBAAqB,YAAY,EAChD,OAAO,iBAAiB,mBAAmB,GAAG,EAC9C,OAAO,OAAO,SAA8D;AAC3E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,eAAe,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,GAAG,SAAS,KAAK,WAAW,EAAE,GAAG,SAAS,KAAK,WAAW,KAAK,EAAE,CAAC;AACjI,cAAQ,EAAE,UAAU,KAAK,GAAG,aAAa,mBAAmB,KAAK;AAAA,IACnE,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,mBAAmB,KAAK;AAAA,IAAG;AAAA,EACpE,CAAC;AAEH,KAAG,QAAQ,gBAAgB,EACxB,YAAY,oCAAoC,EAChD,eAAe,gBAAgB,iBAAiB,EAChD,eAAe,qBAAqB,YAAY,EAChD,OAAO,iBAAiB,mBAAmB,GAAG,EAC9C,OAAO,OAAO,SAA8D;AAC3E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,cAAc,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,GAAG,SAAS,KAAK,WAAW,EAAE,GAAG,SAAS,KAAK,WAAW,KAAK,EAAE,CAAC;AAChI,cAAQ,EAAE,SAAS,KAAK,GAAG,aAAa,kBAAkB,KAAK;AAAA,IACjE,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,kBAAkB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAIH,KAAG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,iBAAiB,+BAA+B,EACvD,OAAO,uBAAuB,iCAAiC,EAC/D,OAAO,OAAO,SAA+D;AAC5E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,eAAe,KAAK,eAAe,SAAS,KAAK,cAAc,EAAE,IAAI;AAC3E,YAAM,OAAO,MAAM,OAAO,QAAQ,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,YAAY;AAC/F,cAAQ,EAAE,KAAK,GAAG,aAAa,QAAQ,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,QAAQ,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAEH,KAAG,QAAQ,YAAY,EACpB,YAAY,sCAAsC,EAClD,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,UAAU,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACxE,cAAQ,MAAM,aAAa,cAAc,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,cAAc,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAIH,KAAG,QAAQ,SAAS,EACjB,YAAY,wBAAwB,EACpC,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,UAAU,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACxE,cAAQ,MAAM,aAAa,WAAW,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,WAAW,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAEH,KAAG,QAAQ,WAAW,EACnB,YAAY,qCAAqC,EACjD,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AAC1E,cAAQ,MAAM,aAAa,aAAa,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,aAAa,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,KAAG,QAAQ,YAAY,EACpB,YAAY,mCAAmC,EAC/C,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AAC1E,cAAQ,MAAM,aAAa,cAAc,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,cAAc,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,KAAG,QAAQ,gBAAgB,EACxB,YAAY,kCAAkC,EAC9C,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,cAAc,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AAC5E,cAAQ,MAAM,aAAa,kBAAkB,KAAK;AAAA,IACpD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,kBAAkB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAEH,KAAG,QAAQ,cAAc,EACtB,YAAY,kCAAkC,EAC9C,eAAe,gBAAgB,iBAAiB,EAChD,eAAe,qBAAqB,+BAA+B,EACnE,OAAO,OAAO,SAAuC;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI;AACrF,cAAQ,MAAM,aAAa,gBAAgB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,gBAAgB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAIH,KAAG,QAAQ,aAAa,EACrB,YAAY,wCAAwC,EACpD,eAAe,gBAAgB,iBAAiB,EAChD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAIA,WAAU,EAAE;AAC9C,YAAM,OAAO,MAAM,OAAO,WAAW,SAAS,MAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACzE,cAAQ,MAAM,aAAa,eAAe,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,eAAe,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,KAAG,QAAQ,kBAAkB,EAC1B,YAAY,mCAAmC,EAC/C,eAAe,kBAAkB,YAAY,EAC7C,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAIA,WAAU,EAAE;AAC/B,YAAM,OAAO,MAAM,OAAO,eAAe,KAAK,MAAM;AACpD,cAAQ,MAAM,aAAa,oBAAoB,KAAK;AAAA,IACtD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,oBAAoB,KAAK;AAAA,IAAG;AAAA,EACrE,CAAC;AACL;;;ACvXA,SAAkB,cAAc;;;ACsFzB,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,QAAQ,MAAwC;AACpD,WAAO,KAAK,KAAK;AAAA,MAAe,CAAC,MAAM,YACrC,KAAK,KAAK;AAAA,QACR,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,QACjC;AAAA,UACE,QAAQ;AAAA,YACN,OAAO,KAAK,SAAS;AAAA,YACrB,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,YACvC,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,YACvC,UAAU;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,OAAe,MAAc,YAAuC;AAC9E,WAAO,KAAK,KAAK,OAAiB,UAAU,KAAK,IAAI,IAAI,UAAU,UAAU,EAAE;AAAA,EACjF;AAAA,EAEA,MAAM,SAAS,MAAuC;AACpD,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,MACjC;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,OAAO,KAAK;AAAA,UACZ,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,UACrD,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAuC;AACpD,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,UAAU,OAAW,MAAK,QAAQ,KAAK;AAChD,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,UAAU,OAAW,MAAK,QAAQ,KAAK;AAChD,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAE9C,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU;AAAA,MAC1D,EAAE,QAAQ,SAAS,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAA+E;AAC3F,UAAM,OAAgC,CAAC;AACvC,QAAI,KAAK,YAAa,MAAK,eAAe,KAAK;AAC/C,QAAI,KAAK,cAAe,MAAK,iBAAiB,KAAK;AACnD,QAAI,KAAK,YAAa,MAAK,eAAe,KAAK;AAE/C,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU;AAAA,MAC1D,EAAE,QAAQ,OAAO,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,OAAe,MAAc,YAAuC;AAChF,WAAO,KAAK,SAAS,EAAE,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,aAAa,OAAe,MAAc,YAA8C;AAC5F,WAAO,KAAK,KAAK;AAAA,MAAe,CAAC,MAAM,YACrC,KAAK,KAAK;AAAA,QACR,UAAU,KAAK,IAAI,IAAI,WAAW,UAAU;AAAA,QAC5C,EAAE,QAAQ,EAAE,UAAU,SAAS,KAAK,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,OAAe,MAAc,YAAoB,MAAsC;AACtG,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,IAAI,IAAI,WAAW,UAAU;AAAA,MAC5C,EAAE,QAAQ,QAAQ,MAAM,EAAE,KAAK,EAAE;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,OAAe,MAAc,YAA8C;AAClG,WAAO,KAAK,KAAK;AAAA,MAAe,CAAC,MAAM,YACrC,KAAK,KAAK;AAAA,QACR,UAAU,KAAK,IAAI,IAAI,UAAU,UAAU;AAAA,QAC3C,EAAE,QAAQ,EAAE,UAAU,SAAS,KAAK,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,MAAiD;AACtE,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU;AAAA,MAC1D;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,MAAM,KAAK;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,MAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,OAAe,MAAc,YAAoB,WAAmB,MAAsC;AAC3H,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,IAAI,IAAI,UAAU,UAAU,aAAa,SAAS;AAAA,MACjE,EAAE,QAAQ,QAAQ,MAAM,EAAE,KAAK,EAAE;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,OAAe,MAAc,WAAkC;AACjF,UAAM,KAAK,KAAK;AAAA,MACd,UAAU,KAAK,IAAI,IAAI,oBAAoB,SAAS;AAAA,MACpD,EAAE,QAAQ,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,OAAe,MAAc,WAAkC;AACvF,UAAM,KAAK,KAAK;AAAA,MACd,UAAU,KAAK,IAAI,IAAI,mBAAmB,SAAS;AAAA,MACnD,EAAE,QAAQ,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,OAAe,MAAc,YAAqC;AAG9E,WAAO,KAAK,KAAK,WAAW,UAAU,KAAK,IAAI,IAAI,UAAU,UAAU,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAM,UAAU,OAAe,MAAc,YAA2C;AACtF,WAAO,KAAK,KAAK;AAAA,MAAe,CAAC,MAAM,YACrC,KAAK,KAAK;AAAA,QACR,UAAU,KAAK,IAAI,IAAI,UAAU,UAAU;AAAA,QAC3C,EAAE,QAAQ,EAAE,UAAU,SAAS,KAAK,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAe,MAAc,YAA6C;AAC1F,WAAO,KAAK,KAAK;AAAA,MAAe,CAAC,MAAM,YACrC,KAAK,KAAK;AAAA,QACR,UAAU,KAAK,IAAI,IAAI,UAAU,UAAU;AAAA,QAC3C,EAAE,QAAQ,EAAE,UAAU,SAAS,KAAK,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAA+C;AAChE,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU;AAAA,MAC1D;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,OAAO,KAAK;AAAA,UACZ,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,OAAe,MAAc,YAAgE;AACxH,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,IAAI,IAAI,UAAU,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,OAAe,MAAc,KAA4C;AAC/F,WAAO,KAAK,KAAK,OAA6B,UAAU,KAAK,IAAI,IAAI,YAAY,GAAG,SAAS;AAAA,EAC/F;AAAA,EAEA,MAAM,cAAc,OAAe,MAAc,KAAwC;AAGvF,UAAM,UAA4B,CAAC;AACnC,QAAI,OAAO;AACX,UAAM,UAAU;AAChB,WAAO,MAAM;AACX,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU,KAAK,IAAI,IAAI,YAAY,GAAG;AAAA,QACtC,EAAE,QAAQ,EAAE,UAAU,SAAS,KAAK,EAAE;AAAA,MACxC;AACA,YAAM,OAAO,OAAO,cAAc,CAAC;AACnC,cAAQ,KAAK,GAAG,IAAI;AACpB,UAAI,KAAK,SAAS,QAAS;AAC3B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,MAA6C;AAC7D,WAAO,KAAK,KAAK;AAAA,MACf,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,MACjC;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,OAAO,KAAK;AAAA,UACZ,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,UACrD,GAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,UACrD,GAAI,KAAK,WAAW,SAAS,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAA2C;AAC1D,UAAME,QAAO,KAAK,MAAM,SAAS,KAAK,GAAG,WAAW;AACpD,WAAO,KAAK,KAAK,OAAmBA,OAAM;AAAA,MACxC,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,MAAM,KAAK;AAAA,QACX,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,QAC1E,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAC9D,GAAI,KAAK,aAAa,SAAY,EAAE,WAAW,KAAK,SAAS,IAAI,CAAC;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AD5SA,SAASC,WACPC,UACA,WAC+E;AAC/E,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,QAAM,SAAS,IAAI,aAAa,IAAI;AACpC,QAAM,MAAM,cAAc,MAAM;AAEhC,QAAM,QAAgB,WAAW,SAAS,KAAK,SAAS,KAAK,QAAQ,SAAS,OAAO,SAAS,QAAQ,SAAS;AAC/G,QAAM,OAAe,WAAW,QAAQ,KAAK,QAAQ,KAAK,QAAQ,QAAQ,OAAO,SAAS,QAAQ,QAAQ;AAE1G,MAAI,CAAC,SAAS,CAAC,MAAM;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,OAAO,MAAM,OAAO;AACvC;AAEO,SAAS,uBAAuBA,UAAwB;AAC7D,QAAM,KAAKA,SACR,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,iBAAiB,wBAAwB;AAInD,KAAG,QAAQ,aAAa,EACrB,YAAY,2CAA2C,EACvD,eAAe,iBAAiB,iBAAiB,EACjD,OAAO,wBAAwB,wBAAwB,EACvD,OAAO,aAAa,gCAAgC,EACpD,OAAO,eAAe,0BAA0B,EAChD,OAAO,OAAO,SAAwF;AACrG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,GAAG,gBAAgB;AACtC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAAO,CAAC;AAC3D,YAAM,OAAO,iBAAiB,QAAQ,QAAQ,WAAW,MAAM,CAAC;AAChE,YAAM,SAAS,IAAI,aAAa,IAAI;AACpC,YAAM,QAAgB,WAAW,SAAS;AAC1C,YAAM,OAAO,MAAM,OAAO,WAAW;AAAA,QACnC,KAAK,SAAS;AAAA,QACd,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,MACjB,CAAC;AACD,cAAQ,MAAM,UAAU,eAAe,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,eAAe,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAIH,KAAG,QAAQ,cAAc,EACtB,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,aAAa,EAC/C,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,sBAAsB,qEAAqE,EAClG,OAAO,mBAAmB,+BAA+B,CAAC,GAAW,QAAkB;AAAE,QAAI,KAAK,CAAC;AAAG,WAAO;AAAA,EAAK,GAAG,CAAC,CAAa,EACnI,OAAO,sBAAsB,+BAA+B,CAAC,GAAW,QAAkB;AAAE,QAAI,KAAK,CAAC;AAAG,WAAO;AAAA,EAAK,GAAG,CAAC,CAAa,EACtI,OAAO,OAAO,SAAmG;AAChH,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAID,WAAU,EAAE;AAC5C,YAAM,OAAO,KAAK,QAAQ,iBAAiB,QAAW,KAAK,UAAU,MAAM;AAC3E,YAAM,OAAO,MAAM,OAAO,YAAY;AAAA,QACpC;AAAA,QACA;AAAA,QACA,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,QAAQ,KAAK,MAAM,SAAS,KAAK,QAAQ;AAAA,QACzC,WAAW,KAAK,SAAS,SAAS,KAAK,WAAW;AAAA,MACpD,CAAC;AACD,cAAQ,MAAM,UAAU,gBAAgB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAIH,KAAG,QAAQ,UAAU,EAClB,YAAY,oBAAoB,EAChC,UAAU,IAAI,OAAO,mBAAmB,UAAU,EAAE,QAAQ,CAAC,QAAQ,UAAU,KAAK,CAAC,EAAE,QAAQ,MAAM,CAAC,EACtG,OAAO,mBAAmB,qCAAqC,EAC/D,OAAO,mBAAmB,uBAAuB,EACjD,OAAO,OAAO,SAA2D;AACxE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,QAAQ;AAAA,QAChC;AAAA,QACA;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,MACb,CAAC;AACD,cAAQ,MAAM,UAAU,YAAY,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,YAAY,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAEH,KAAG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AACtE,cAAQ,MAAM,UAAU,UAAU,KAAK;AAAA,IACzC,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,UAAU,KAAK;AAAA,IAAG;AAAA,EACxD,CAAC;AAEH,KAAG,QAAQ,WAAW,EACnB,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,UAAU,EAC5C,eAAe,mBAAmB,0CAA0C,EAC5E,OAAO,mBAAmB,4CAA4C,EACtE,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,sBAAsB,yEAAyE,EACtG,OAAO,WAAW,oBAAoB,EACtC,OAAO,mBAAmB,yCAAyC,EACnE,OAAO,iBAAiB,kDAAkD,EAC1E,OAAO,OAAO,SAA2I;AACxJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,MAAM,OAAO,IAAIA,WAAU,IAAI,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;AAC5F,YAAM,OAAO,KAAK,QAAQ,OAAO,SAAS,QAAQ,gBAAgB;AAClE,YAAM,OAAO,KAAK,QAAQ,iBAAiB,QAAW,KAAK,UAAU,MAAM;AAC3E,YAAM,OAAO,MAAM,OAAO,SAAS;AAAA,QACjC;AAAA,QACA;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,OAAO,KAAK;AAAA,MACd,CAAC;AACD,cAAQ,MAAM,UAAU,aAAa,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,aAAa,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,KAAG,QAAQ,WAAW,EACnB,YAAY,uBAAuB,EACnC,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,mBAAmB,WAAW,EACrC,OAAO,iBAAiB,iBAAiB,EACzC,OAAO,mBAAmB,iBAAiB,EAC3C,OAAO,OAAO,SAA2E;AACxF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,SAAS;AAAA,QACjC;AAAA,QACA;AAAA,QACA,YAAY,SAAS,KAAK,QAAQ,EAAE;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,MACb,CAAC;AACD,cAAQ,MAAM,UAAU,aAAa,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,aAAa,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,KAAG,QAAQ,UAAU,EAClB,YAAY,sBAAsB,EAClC,eAAe,gBAAgB,qBAAqB,EACpD,UAAU,IAAI,OAAO,qBAAqB,cAAc,EAAE,QAAQ,CAAC,SAAS,UAAU,QAAQ,CAAC,EAAE,QAAQ,OAAO,CAAC,EACjH,OAAO,0BAA0B,+BAA+B,EAChE,OAAO,0BAA0B,iCAAiC,EAClE,OAAO,OAAO,SAA4F;AACzG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,QAAQ;AAAA,QAChC;AAAA,QACA;AAAA,QACA,YAAY,SAAS,KAAK,QAAQ,EAAE;AAAA,QACpC,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,eAAe,KAAK;AAAA,MACtB,CAAC;AACD,cAAQ,MAAM,UAAU,YAAY,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,YAAY,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAEH,KAAG,QAAQ,UAAU,EAClB,YAAY,sBAAsB,EAClC,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AACxE,cAAQ,MAAM,UAAU,YAAY,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,YAAY,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAIH,KAAG,QAAQ,eAAe,EACvB,YAAY,yCAAyC,EACrD,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,aAAa,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AAC7E,cAAQ,MAAM,UAAU,iBAAiB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,KAAG,QAAQ,aAAa,EACrB,YAAY,yCAAyC,EACrD,eAAe,gBAAgB,qBAAqB,EACpD,eAAe,iBAAiB,cAAc,EAC9C,OAAO,OAAO,SAA2C;AACxD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,WAAW,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,GAAG,KAAK,IAAI;AACtF,cAAQ,MAAM,UAAU,eAAe,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,eAAe,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,KAAG,QAAQ,sBAAsB,EAC9B,YAAY,+CAA+C,EAC3D,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,mBAAmB,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AACnF,cAAQ,MAAM,UAAU,wBAAwB,KAAK;AAAA,IACvD,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,wBAAwB,KAAK;AAAA,IAAG;AAAA,EACtE,CAAC;AAEH,KAAG,QAAQ,oBAAoB,EAC5B,YAAY,0DAA0D,EACtE,eAAe,gBAAgB,qBAAqB,EACpD,eAAe,kBAAkB,8BAA8B,EAC/D,eAAe,iBAAiB,WAAW,EAC3C,eAAe,cAAc,aAAa,EAC1C,eAAe,iBAAiB,cAAc,EAC9C,UAAU,IAAI,OAAO,iBAAiB,cAAc,EAAE,QAAQ,CAAC,QAAQ,OAAO,CAAC,EAAE,QAAQ,OAAO,CAAC,EACjG,OAAO,OAAO,SAAsG;AACnH,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,iBAAiB;AAAA,QACzC;AAAA,QACA;AAAA,QACA,YAAY,SAAS,KAAK,QAAQ,EAAE;AAAA,QACpC,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,QACX,MAAM,SAAS,KAAK,MAAM,EAAE;AAAA,QAC5B,MAAM,KAAK;AAAA,MACb,CAAC;AACD,cAAQ,MAAM,UAAU,sBAAsB,KAAK;AAAA,IACrD,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,sBAAsB,KAAK;AAAA,IAAG;AAAA,EACpE,CAAC;AAEH,KAAG,QAAQ,eAAe,EACvB,YAAY,6CAA6C,EACzD,eAAe,gBAAgB,qBAAqB,EACpD,eAAe,qBAAqB,+BAA+B,EACnE,eAAe,iBAAiB,YAAY,EAC5C,OAAO,OAAO,SAA8D;AAC3E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,aAAa,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,GAAG,SAAS,KAAK,WAAW,EAAE,GAAG,KAAK,IAAI;AACtH,cAAQ,MAAM,UAAU,iBAAiB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,KAAG,QAAQ,gBAAgB,EACxB,YAAY,gCAAgC,EAC5C,eAAe,qBAAqB,YAAY,EAChD,OAAO,OAAO,SAAgC;AAC7C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,cAAc,OAAO,MAAM,SAAS,KAAK,WAAW,EAAE,CAAC;AACpE,cAAQ,EAAE,SAAS,KAAK,GAAG,UAAU,kBAAkB,KAAK;AAAA,IAC9D,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,kBAAkB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,KAAG,QAAQ,uBAAuB,EAC/B,YAAY,iCAAiC,EAC7C,eAAe,qBAAqB,mBAAmB,EACvD,OAAO,OAAO,SAAgC;AAC7C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,oBAAoB,OAAO,MAAM,SAAS,KAAK,WAAW,EAAE,CAAC;AAC1E,cAAQ,EAAE,SAAS,KAAK,GAAG,UAAU,yBAAyB,KAAK;AAAA,IACrE,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,yBAAyB,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAIH,KAAG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AACxE,cAAQ,EAAE,KAAK,GAAG,UAAU,QAAQ,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,QAAQ,KAAK;AAAA,IAAG;AAAA,EACtD,CAAC;AAEH,KAAG,QAAQ,YAAY,EACpB,YAAY,sCAAsC,EAClD,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,UAAU,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AAC1E,cAAQ,MAAM,UAAU,cAAc,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,cAAc,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAIH,KAAG,QAAQ,cAAc,EACtB,YAAY,gCAAgC,EAC5C,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AAC5E,cAAQ,MAAM,UAAU,gBAAgB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,KAAG,QAAQ,SAAS,EACjB,YAAY,wBAAwB,EACpC,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,OAAO,SAA4C;AACzD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,aAAa;AAAA,QACrC;AAAA,QACA;AAAA,QACA,YAAY,SAAS,KAAK,QAAQ,EAAE;AAAA,QACpC,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,MACb,CAAC;AACD,cAAQ,MAAM,UAAU,WAAW,KAAK;AAAA,IAC1C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,WAAW,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAEH,KAAG,QAAQ,iBAAiB,EACzB,YAAY,mCAAmC,EAC/C,eAAe,gBAAgB,qBAAqB,EACpD,eAAe,iBAAiB,sBAAsB,EACtD,OAAO,OAAO,SAA2C;AACxD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,aAAa;AAAA,QACrC;AAAA,QACA;AAAA,QACA,YAAY,SAAS,KAAK,QAAQ,EAAE;AAAA,QACpC,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,MACb,CAAC;AACD,cAAQ,MAAM,UAAU,mBAAmB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,mBAAmB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,KAAG,QAAQ,gBAAgB,EACxB,YAAY,6CAA6C,EACzD,eAAe,gBAAgB,qBAAqB,EACpD,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,uBAAuB,OAAO,MAAM,SAAS,KAAK,QAAQ,EAAE,CAAC;AACvF,cAAQ,MAAM,UAAU,kBAAkB,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,kBAAkB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAIH,KAAG,QAAQ,YAAY,EACpB,YAAY,4DAA4D,EACxE,eAAe,eAAe,sCAAsC,EACpE,OAAO,OAAO,SAA0B;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,kBAAkB,OAAO,MAAM,KAAK,GAAG;AACjE,cAAQ,MAAM,UAAU,cAAc,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,cAAc,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAEH,KAAG,QAAQ,aAAa,EACrB,YAAY,iDAAiD,EAC7D,eAAe,eAAe,sCAAsC,EACpE,OAAO,OAAO,SAA0B;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,KAAK,IAAIA,WAAU,EAAE;AAC5C,YAAM,OAAO,MAAM,OAAO,cAAc,OAAO,MAAM,KAAK,GAAG;AAC7D,cAAQ,MAAM,UAAU,eAAe,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,UAAU,eAAe,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AACL;;;AE9aA,SAAS,cAAAE,aAAY,aAAAC,YAAW,iBAAAC,sBAAqB;AACrD,OAAOC,WAAU;;;ACDjB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,YAAAC,iBAAgB;AAezB,IAAMC,OAAM;AAmCL,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,QAAQ,IAAY,SAAS,wCAAiE;AAClG,WAAO,KAAK,KAAK,WAA2B,GAAGA,IAAG,YAAY,EAAE,IAAI;AAAA,MAClE,QAAQ,EAAE,OAAO;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,UAAkB,OAA+C;AACpF,UAAM,SAAS,MAAM,KAAK,KAAK,WAAmD,GAAGA,IAAG,YAAY;AAAA,MAClG,QAAQ,EAAE,UAAU,OAAO,QAAQ,8BAA8B,MAAM,OAAO;AAAA,IAChF,CAAC;AACD,WAAO,OAAO,QAAQ,CAAC,KAAK;AAAA,EAC9B;AAAA,EAEA,MAAM,UAAU,UAAkB,OAAsB,CAAC,GAA8B;AACrF,UAAM,eAAe,KAAK,SAAS;AACnC,WAAO,KAAK,KAAK,mBAAmC,OAAO,OAAO,UAAU;AAC1E,aAAO,KAAK,KAAK,WAAmD,GAAGA,IAAG,YAAY;AAAA,QACpF,QAAQ,EAAE,UAAU,MAAM,QAAQ,QAAQ,WAAW,OAAO,eAAe,OAAO,MAAM;AAAA,MAC1F,CAAC;AAAA,IACH,GAAG,KAAK,KAAK;AAAA,EACf;AAAA,EAEA,MAAM,gBAAgB,IAAuC;AAC3D,WAAO,KAAK,KAAK,mBAAmC,OAAO,OAAO,UAAU;AAC1E,aAAO,KAAK,KAAK,WAAmD,GAAGA,IAAG,YAAY,EAAE,eAAe;AAAA,QACrG,QAAQ,EAAE,QAAQ,WAAW,OAAO,MAAM;AAAA,MAC5C,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,IAAwC;AACtD,WAAO,KAAK,KAAK,mBAAoC,OAAO,OAAO,UAAU;AAC3E,aAAO,KAAK,KAAK,WAAoD,GAAGA,IAAG,YAAY,EAAE,UAAU;AAAA,QACjG,QAAQ,EAAE,OAAO,MAAM;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,KAAa,OAAmB,CAAC,GAAoC;AAChF,WAAO,KAAK,KAAK,WAAmC,GAAGA,IAAG,mBAAmB;AAAA,MAC3E,QAAQ;AAAA,QACN;AAAA,QACA,OAAO,KAAK,SAAS;AAAA,QACrB,OAAO,KAAK,SAAS;AAAA,QACrB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,MAA+C;AAC9D,UAAM,OAAgC;AAAA,MACpC,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,OAAO,EAAE,KAAK,KAAK,SAAS;AAAA,MAC5B,WAAW,KAAK,WAAW,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;AAAA,MACtD,MAAM;AAAA,QACJ,SAAS;AAAA,UACP,OAAO,KAAK;AAAA,UACZ,gBAAgB,KAAK,kBAAkB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,KAAK,WAA2B,GAAGA,IAAG,YAAY;AAAA,MAC5D,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,IAAY,MAA+C;AAC1E,UAAM,OAAgC;AAAA,MACpC,SAAS,EAAE,QAAQ,KAAK,QAAQ;AAAA,MAChC,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK,UAAU;AAAA,IACzB;AACA,QAAI,KAAK,SAAS,QAAW;AAC3B,WAAK,OAAO;AAAA,QACV,SAAS;AAAA,UACP,OAAO,KAAK;AAAA,UACZ,gBAAgB,KAAK,kBAAkB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,KAAK,WAA2B,GAAGA,IAAG,YAAY,EAAE,IAAI;AAAA,MAClE,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,IAA2B;AAC1C,WAAO,KAAK,KAAK,WAAiB,GAAGA,IAAG,YAAY,EAAE,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,EAChF;AAAA,EAEA,MAAM,aAAa,QAA8C;AAC/D,WAAO,KAAK,KAAK,mBAAsC,OAAO,OAAO,UAAU;AAC7E,aAAO,KAAK,KAAK,WAAsD,GAAGA,IAAG,YAAY,MAAM,kBAAkB;AAAA,QAC/G,QAAQ,EAAE,QAAQ,wBAAwB,OAAO,MAAM;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,QAAgB,MAAc,iBAAiB,WAAuC;AACrG,WAAO,KAAK,KAAK,WAA8B,GAAGA,IAAG,YAAY;AAAA,MAC/D,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,WAAW,EAAE,IAAI,QAAQ,MAAM,OAAO;AAAA,QACtC,MAAM;AAAA,UACJ,SAAS,EAAE,OAAO,MAAM,eAAe;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,QAAgB,QAA8C;AAC3E,UAAM,OAAO,OAAO,IAAI,WAAS,EAAE,QAAQ,UAAU,KAAK,EAAE;AAC5D,UAAM,SAAS,MAAM,KAAK,KAAK,WAAoD,GAAGA,IAAG,YAAY,MAAM,UAAU;AAAA,MACnH,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,YAAY,QAAgB,OAA8B;AAC9D,WAAO,KAAK,KAAK,WAAiB,GAAGA,IAAG,YAAY,MAAM,UAAU,KAAK,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,EACnG;AAAA,EAEA,MAAM,WAAW,OAAuB,CAAC,GAA+B;AACtE,UAAM,eAAe,KAAK,SAAS;AACnC,WAAO,KAAK,KAAK,mBAAoC,OAAO,OAAO,UAAU;AAC3E,aAAO,KAAK,KAAK,WAAoD,GAAGA,IAAG,UAAU;AAAA,QACnF,QAAQ;AAAA,UACN,OAAO,eAAe;AAAA,UACtB;AAAA,UACA,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH,GAAG,KAAK,KAAK;AAAA,EACf;AAAA,EAEA,MAAM,SAAS,KAAuC;AACpD,WAAO,KAAK,KAAK,WAA4B,GAAGA,IAAG,UAAU,GAAG,IAAI;AAAA,MAClE,QAAQ,EAAE,QAAQ,oBAAoB;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,QAAiD;AACrE,WAAO,KAAK,KAAK,mBAAyC,OAAO,OAAO,UAAU;AAChF,aAAO,KAAK,KAAK,WAAyD,GAAGA,IAAG,YAAY,MAAM,qBAAqB;AAAA,QACrH,QAAQ,EAAE,OAAO,MAAM;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,QAAgB,UAAkB,SAAmD;AAC1G,UAAM,cAAcC,cAAa,QAAQ;AACzC,UAAM,WAAWC,UAAS,QAAQ;AAClC,UAAM,WAAW,cAAc,QAAQ;AACvC,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,SAAS,CAAC,GAAG,QAAQ;AAC7E,QAAI,QAAS,UAAS,OAAO,WAAW,OAAO;AAC/C,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,GAAGF,IAAG,YAAY,MAAM;AAAA,MACxB;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,cAAc,cAAqD;AACvE,WAAO,KAAK,KAAK,WAAiC,GAAGA,IAAG,YAAY,YAAY,EAAE;AAAA,EACpF;AAAA,EAEA,MAAM,mBAAmB,YAAmD;AAK1E,UAAM,eAAe,WAAW,OAAO;AACvC,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI;AAAA,QACR,WAAW,WAAW,EAAE,6DAAwD,WAAW,KAAK;AAAA,QAChG;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,KAAK,iBAAiB,YAAY;AAAA,EAChD;AAAA,EAEA,MAAM,iBAAiB,cAAqC;AAC1D,WAAO,KAAK,KAAK,WAAiB,GAAGA,IAAG,YAAY,YAAY,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC1F;AAAA,EAEA,MAAM,eAAe,IAA4C;AAC/D,WAAO,KAAK,KAAK,WAAkC,GAAGA,IAAG,YAAY,EAAE,UAAU;AAAA,EACnF;AAAA,EAEA,MAAM,iBAAiB,OAAe,qBAAqB,YAA6B;AACtF,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,GAAGA,IAAG;AAAA,MACN;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,EAAE,OAAO,gBAAgB,mBAAmB;AAAA,MACpD;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AACF;;;AD5OO,SAAS,sBAAsB,QAAgB,OAAuB;AAK3E,QAAM,WAAW,MAAM,MAAM,OAAO,EAAE,OAAO,OAAK,MAAM,MAAM,MAAM,OAAO,MAAM,IAAI;AACrF,QAAM,OAAO,SAAS,IAAI,KAAK;AAC/B,SAAOG,MAAK,KAAK,QAAQ,IAAI;AAC/B;AAEO,SAAS,aAAa,KAAc,aAAqB,wBAAwB,OAAsB;AAC5G,MAAI,EAAE,eAAe,OAAQ,QAAO;AACpC,QAAM,IAAI,IAAI,QAAQ,MAAM,gCAAgC;AAC5D,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,MAAM,SAAS,EAAE,CAAC,GAAG,EAAE;AAC7B,QAAM,MAAM,SAAS,EAAE,CAAC,GAAG,EAAE;AAC7B,QAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,QAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI;AACnD,QAAM,SAAS,wBAAwB,+BAA+B;AACtE,SAAO,kBAAkB,GAAG,GAAG,MAAM,KAAK,IAAI;AAAA,EAAK,OAAO;AAC5D;AAEA,SAASC,WAAUC,UAAoC;AACrD,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,MAAI,CAAC,OAAO,WAAW,QAAS,OAAM,IAAI,WAAW,mDAAmD;AACxG,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,IAAI,iBAAiB,IAAI;AAClC;AAEO,SAAS,2BAA2BA,UAAwB;AACjE,QAAM,aAAaA,SAAQ,QAAQ,YAAY,EAAE,YAAY,uBAAuB;AAIpF,aAAW,QAAQ,UAAU,EAC1B,YAAY,6BAA6B,EACzC,eAAe,kBAAkB,SAAS,EAC1C,OAAO,qBAAqB,oCAAoC,sCAAsC,EACtG,OAAO,OAAO,SAAyC;AACtD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,QAAQ,KAAK,IAAI,KAAK,MAAM;AACtD,cAAQ,MAAM,cAAc,YAAY,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,YAAY,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,aAAW,QAAQ,mBAAmB,EACnC,YAAY,+CAA+C,EAC3D,eAAe,iBAAiB,WAAW,EAC3C,eAAe,mBAAmB,YAAY,EAC9C,OAAO,OAAO,SAA2C;AACxD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,eAAe,KAAK,OAAO,KAAK,KAAK;AAC/D,UAAI,CAAC,KAAM,OAAM,IAAI,WAAW,oBAAoB,KAAK,KAAK,cAAc,KAAK,KAAK,IAAI,CAAC;AAC3F,cAAQ,MAAM,cAAc,qBAAqB,KAAK;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,qBAAqB,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAEH,aAAW,QAAQ,YAAY,EAC5B,YAAY,6EAA6E,EACzF,eAAe,iBAAiB,WAAW,EAC3C,OAAO,eAAe,0CAA0C,EAChE,OAAO,eAAe,yBAAyB,EAC/C,OAAO,OAAO,SAA4D;AACzE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,UAAU,KAAK,OAAO;AAAA,QAC9C,OAAO,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,QAC/C,OAAO,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,MACjD,CAAC;AACD,cAAQ,MAAM,cAAc,cAAc,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,cAAc,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,aAAW,QAAQ,mBAAmB,EACnC,YAAY,sCAAsC,EAClD,eAAe,kBAAkB,gBAAgB,EACjD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,gBAAgB,KAAK,EAAE;AACjD,cAAQ,MAAM,cAAc,qBAAqB,KAAK;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,qBAAqB,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAEH,aAAW,QAAQ,YAAY,EAC5B,YAAY,iCAAiC,EAC7C,eAAe,kBAAkB,SAAS,EAC1C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,UAAU,KAAK,EAAE;AAC3C,cAAQ,MAAM,cAAc,cAAc,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,cAAc,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAIH,aAAW,QAAQ,QAAQ,EACxB,YAAY,4BAA4B,EACxC,eAAe,iBAAiB,oDAAoD,EACpF,OAAO,eAAe,6BAA6B,IAAI,EACvD,OAAO,eAAe,2BAA2B,GAAG,EACpD,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,OAAO,SAAyE;AACtF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,QACzC,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,QAC9B,OAAO,SAAS,KAAK,OAAO,EAAE;AAAA,QAC9B,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,cAAQ,MAAM,cAAc,UAAU,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,UAAU,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAIH,aAAW,QAAQ,aAAa,EAC7B,YAAY,8BAA8B,EAC1C,eAAe,iBAAiB,WAAW,EAC3C,eAAe,mBAAmB,YAAY,EAC9C,OAAO,iBAAiB,oEAAoE,EAC5F,OAAO,sBAAsB,uDAAuD,EACpF,OAAO,cAAc,iEAAiE,EACtF,OAAO,oBAAoB,uCAAuC,EAClE,OAAO,6BAA6B,0CAA0C,SAAS,EACvF,OAAO,OAAO,SAA4I;AACzJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACJ,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,UAAU,iBAAiB,KAAK,MAAM,KAAK,UAAU,MAAM;AACjE,UAAI,YAAY,OAAW,OAAM,IAAI,WAAW,sCAAsC,CAAC;AACvF,oBAAc,KAAK,WAAW,MAAM,OAAO,iBAAiB,OAAO,IAAI;AACvE,YAAM,iBAAiB,KAAK,WAAW,YAAY,KAAK;AACxD,YAAM,OAAO,MAAM,OAAO,WAAW;AAAA,QACnC,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,UAAU,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AACD,cAAQ,MAAM,cAAc,eAAe,KAAK;AAAA,IAClD,SAAS,KAAK;AACZ,YAAM,OAAO,cAAc,aAAa,KAAK,aAAa,QAAQ,KAAK,QAAQ,CAAC,IAAI;AACpF,UAAI,MAAM;AACR,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,cAAM,SAAS,eAAe,aAAa,IAAI,SAAS;AACxD,cAAM,MAAM,eAAe,aAAa,IAAI,MAAM;AAClD,aAAK,IAAI,WAAW,GAAG,GAAG;AAAA;AAAA,EAAO,IAAI,IAAI,QAAQ,GAAG,GAAG,cAAc,eAAe,KAAK;AAAA,MAC3F,OAAO;AACL,aAAK,KAAK,cAAc,eAAe,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,CAAC;AAEH,aAAW,QAAQ,aAAa,EAC7B,YAAY,kEAAkE,EAC9E,eAAe,kBAAkB,SAAS,EAC1C,OAAO,mBAAmB,gBAAgB,EAC1C,OAAO,iBAAiB,wEAAwE,EAChG,OAAO,sBAAsB,2DAA2D,EACxF,OAAO,cAAc,iEAAiE,EACtF,OAAO,qBAAqB,2CAA2C,SAAS,EAChF,OAAO,6BAA6B,0CAA0C,SAAS,EACvF,OAAO,OAAO,SAAuI;AACpJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACJ,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,UAAU,iBAAiB,KAAK,MAAM,KAAK,UAAU,MAAM;AACjE,oBAAe,YAAY,UAAa,KAAK,WACzC,MAAM,OAAO,iBAAiB,OAAO,IACrC;AACJ,YAAM,iBAAkB,gBAAgB,UAAa,KAAK,WAAY,YAAY,KAAK;AACvF,YAAM,UAAU,MAAM,OAAO,QAAQ,KAAK,IAAI,SAAS;AACvD,YAAM,cAAc,QAAQ,QAAQ,SAAS;AAC7C,YAAM,OAAO,MAAM,OAAO,WAAW,KAAK,IAAI;AAAA,QAC5C,SAAS;AAAA,QACT,OAAO,KAAK,SAAS,QAAQ;AAAA,QAC7B,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb;AAAA,MACF,CAAC;AACD,cAAQ,MAAM,cAAc,eAAe,KAAK;AAAA,IAClD,SAAS,KAAK;AACZ,YAAM,OAAO,cAAc,aAAa,KAAK,aAAa,QAAQ,KAAK,QAAQ,CAAC,IAAI;AACpF,UAAI,MAAM;AACR,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,cAAM,SAAS,eAAe,aAAa,IAAI,SAAS;AACxD,cAAM,MAAM,eAAe,aAAa,IAAI,MAAM;AAClD,aAAK,IAAI,WAAW,GAAG,GAAG;AAAA;AAAA,EAAO,IAAI,IAAI,QAAQ,GAAG,GAAG,cAAc,eAAe,KAAK;AAAA,MAC3F,OAAO;AACL,aAAK,KAAK,cAAc,eAAe,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,CAAC;AAEH,aAAW,QAAQ,aAAa,EAC7B,YAAY,0BAA0B,EACtC,eAAe,kBAAkB,SAAS,EAC1C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,WAAW,KAAK,EAAE;AAC/B,cAAQ,EAAE,SAAS,KAAK,GAAG,GAAG,cAAc,eAAe,KAAK;AAAA,IAClE,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,eAAe,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAIH,aAAW,QAAQ,eAAe,EAC/B,YAAY,oCAAoC,EAChD,eAAe,kBAAkB,SAAS,EAC1C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,aAAa,KAAK,EAAE;AAC9C,cAAQ,MAAM,cAAc,iBAAiB,KAAK;AAAA,IACpD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,iBAAiB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAEH,aAAW,QAAQ,aAAa,EAC7B,YAAY,oCAAoC,EAChD,eAAe,kBAAkB,SAAS,EAC1C,eAAe,iBAAiB,oCAAoC,EACpE,OAAO,6BAA6B,0CAA0C,SAAS,EACvF,OAAO,OAAO,SAA+D;AAC5E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,WAAW,KAAK,IAAI,KAAK,MAAM,KAAK,cAAc;AAC5E,cAAQ,MAAM,cAAc,eAAe,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,eAAe,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAIH,aAAW,QAAQ,WAAW,EAC3B,YAAY,iCAAiC,EAC7C,eAAe,kBAAkB,SAAS,EAC1C,eAAe,oBAAoB,6BAA6B,EAChE,OAAO,OAAO,SAAyC;AACtD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,SAAS,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACvE,YAAM,OAAO,MAAM,OAAO,SAAS,KAAK,IAAI,MAAM;AAClD,cAAQ,MAAM,cAAc,aAAa,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,aAAa,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,aAAW,QAAQ,cAAc,EAC9B,YAAY,uCAAuC,EACnD,eAAe,kBAAkB,SAAS,EAC1C,eAAe,kBAAkB,sBAAsB,EACvD,OAAO,OAAO,SAAwC;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,YAAY,KAAK,IAAI,KAAK,KAAK;AAC5C,cAAQ,EAAE,SAAS,KAAK,OAAO,MAAM,KAAK,GAAG,GAAG,cAAc,gBAAgB,KAAK;AAAA,IACrF,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAIH,aAAW,QAAQ,aAAa,EAC7B,YAAY,wBAAwB,EACpC,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,eAAe,2CAA2C,EACjE,OAAO,OAAO,SAA4C;AACzD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,WAAW;AAAA,QACnC,MAAM,KAAK;AAAA,QACX,OAAO,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,MACjD,CAAC;AACD,cAAQ,MAAM,cAAc,eAAe,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,eAAe,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,aAAW,QAAQ,WAAW,EAC3B,YAAY,+BAA+B,EAC3C,eAAe,qBAAqB,WAAW,EAC/C,OAAO,OAAO,SAA0B;AACvC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,SAAS,KAAK,GAAG;AAC3C,cAAQ,MAAM,cAAc,aAAa,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,aAAa,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAIH,aAAW,QAAQ,kBAAkB,EAClC,YAAY,uCAAuC,EACnD,eAAe,kBAAkB,SAAS,EAC1C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,gBAAgB,KAAK,EAAE;AACjD,cAAQ,MAAM,cAAc,oBAAoB,KAAK;AAAA,IACvD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,oBAAoB,KAAK;AAAA,IAAG;AAAA,EACtE,CAAC;AAEH,aAAW,QAAQ,mBAAmB,EACnC,YAAY,qDAAqD,EACjE,eAAe,kBAAkB,SAAS,EAC1C,eAAe,iBAAiB,4BAA4B,EAC5D,OAAO,oBAAoB,gDAAgD,EAC3E,OAAO,OAAO,SAAyD;AACtE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,CAACC,YAAW,KAAK,IAAI,EAAG,OAAM,IAAI,WAAW,mBAAmB,KAAK,IAAI,IAAI,CAAC;AAClF,YAAM,SAASF,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,iBAAiB,KAAK,IAAI,KAAK,MAAM,KAAK,OAAO;AAC3E,cAAQ,MAAM,cAAc,qBAAqB,KAAK;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,qBAAqB,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAEH,aAAW,QAAQ,qBAAqB,EACrC,YAAY,wDAAwD,EACpE,eAAe,wBAAwB,uBAAuB,EAC9D,OAAO,gBAAgB,oDAAoD,EAC3E,OAAO,OAAO,SAAuC;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,aAAa,MAAM,OAAO,cAAc,KAAK,EAAE;AACrD,YAAM,SAAS,KAAK,OAAOF,MAAK,KAAK,QAAQ,IAAI,GAAG,QAAQ;AAC5D,MAAAI,WAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACrC,YAAM,UAAU,sBAAsB,QAAQ,WAAW,KAAK;AAC9D,YAAM,SAAS,MAAM,OAAO,mBAAmB,UAAU;AACzD,MAAAC,eAAc,SAAS,MAAM;AAC7B,cAAQ,EAAE,OAAO,SAAS,UAAU,WAAW,OAAO,MAAM,OAAO,OAAO,GAAG,cAAc,uBAAuB,KAAK;AAAA,IACzH,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,uBAAuB,KAAK;AAAA,IAAG;AAAA,EACzE,CAAC;AAEH,aAAW,QAAQ,mBAAmB,EACnC,YAAY,+GAA+G,EAC3H,eAAe,wBAAwB,uBAAuB,EAC9D,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASJ,WAAUC,QAAO;AAChC,YAAM,OAAO,iBAAiB,KAAK,EAAE;AACrC,cAAQ,EAAE,SAAS,KAAK,GAAG,GAAG,cAAc,qBAAqB,KAAK;AAAA,IACxE,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,qBAAqB,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAIH,aAAW,QAAQ,kBAAkB,EAClC,YAAY,wDAAwD,EACpE,eAAe,kBAAkB,SAAS,EAC1C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,eAAe,KAAK,EAAE;AAChD,cAAQ,MAAM,cAAc,oBAAoB,KAAK;AAAA,IACvD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,oBAAoB,KAAK;AAAA,IAAG;AAAA,EACtE,CAAC;AACL;;;AEtYA,IAAMI,OAAM;AAkCL,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,YAAwC;AAC5C,WAAO,KAAK,KAAK,MAAyB,GAAGA,IAAG,gBAAgB;AAAA,EAClE;AAAA,EAEA,MAAM,eAAe,YAAoB,QAAkD;AACzF,WAAO,KAAK,KAAK,MAA8B,GAAGA,IAAG,gCAAgC;AAAA,MACnF,QAAQ,EAAE,YAAY,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,MAAsD;AACvE,WAAO,KAAK,KAAK,MAA2B,GAAGA,IAAG,kBAAkB;AAAA,MAClE,QAAQ;AAAA,QACN,eAAe,KAAK;AAAA,QACpB,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK,aAAa,SAAY,OAAO,KAAK,QAAQ,IAAI;AAAA,QAChE,GAAG,KAAK,QAAQ;AAAA,QAChB,IAAI,KAAK,YAAY;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,MAA+C;AACnE,WAAO,KAAK,KAAK,cAA0B,OAAO,MAAM,aAAa;AACnE,YAAM,OAAO,MAAM,KAAK,KAAK,MAA2B,GAAGA,IAAG,kBAAkB;AAAA,QAC9E,QAAQ;AAAA,UACN,eAAe,KAAK;AAAA,UACpB,YAAY,KAAK;AAAA,UACjB,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK,aAAa,SAAY,OAAO,KAAK,QAAQ,IAAI;AAAA,UAChE,GAAG;AAAA,UACH,IAAI;AAAA,QACN;AAAA,MACF,CAAC;AACD,aAAO,EAAE,OAAO,KAAK,OAAO,GAAG,KAAK,GAAG,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO;AAAA,IACzE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,MAAwD;AACxE,WAAO,KAAK,KAAK,MAA8B,GAAGA,IAAG,uBAAuB;AAAA,MAC1E,QAAQ;AAAA,QACN,WAAW,KAAK;AAAA,QAChB,YAAY,KAAK;AAAA,QACjB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,OAA2B,CAAC,GAAmC;AAClF,WAAO,KAAK,KAAK,MAA6B,GAAGA,IAAG,oBAAoB;AAAA,MACtE,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,GAAG,KAAK,QAAQ;AAAA,QAChB,IAAI,KAAK,YAAY;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,OAAyC;AAC/D,WAAO,KAAK,KAAK,cAA4B,OAAO,MAAM,aAAa;AACrE,YAAM,OAAO,MAAM,KAAK,KAAK,MAA6B,GAAGA,IAAG,oBAAoB;AAAA,QAClF,QAAQ,EAAE,GAAG,OAAO,GAAG,MAAM,IAAI,SAAS;AAAA,MAC5C,CAAC;AACD,aAAO,EAAE,OAAO,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,WAAW,IAAI,KAAK,OAAO,UAAU,OAAO,KAAK,WAAW;AAAA,IAChH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,MAA0D;AAC7E,WAAO,KAAK,KAAK,MAA6B,GAAGA,IAAG,oBAAoB;AAAA,MACtE,QAAQ;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,GAAG,KAAK,QAAQ;AAAA,QAChB,IAAI,KAAK,YAAY;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,MAAmD;AACzE,WAAO,KAAK,KAAK,cAA4B,OAAO,MAAM,aAAa;AACrE,YAAM,OAAO,MAAM,KAAK,KAAK,MAA6B,GAAGA,IAAG,oBAAoB;AAAA,QAClF,QAAQ;AAAA,UACN,YAAY,KAAK;AAAA,UACjB,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,QAAQ,KAAK;AAAA,UACb,GAAG;AAAA,UACH,IAAI;AAAA,QACN;AAAA,MACF,CAAC;AACD,aAAO,EAAE,OAAO,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,WAAW,IAAI,KAAK,OAAO,UAAU,OAAO,KAAK,SAAS;AAAA,IAC9G,CAAC;AAAA,EACH;AACF;;;AC/IA,IAAM,kBAAkB;AAExB,SAASC,WAAUC,UAAkF;AACnG,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,MAAI,CAAC,OAAO,MAAM,QAAS,OAAM,IAAI,WAAW,kDAAkD;AAClG,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,EAAE,QAAQ,IAAI,YAAY,IAAI,GAAG,OAAO;AACjD;AAEA,SAAS,eAAe,QAAuC,YAA6B;AAC1F,QAAM,UAAU,cAAc,OAAO,SAAS,MAAM;AACpD,MAAI,CAAC,QAAS,OAAM,IAAI,WAAW,8EAA8E;AACjH,SAAO;AACT;AAEO,SAAS,sBAAsBA,UAAwB;AAC5D,QAAM,QAAQA,SAAQ,QAAQ,OAAO,EAAE,YAAY,6BAA6B;AAIhF,QAAM,QAAQ,cAAc,EACzB,YAAY,uCAAuC,EACnD,OAAO,mBAAmB,iEAAiE,EAC3F,OAAO,mBAAmB,aAAa,EACvC,OAAO,OAAO,SAAgD;AAC7D,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAID,WAAUC,QAAO;AAC5C,YAAM,aAAa,eAAe,QAAQ,KAAK,OAAO;AACtD,YAAM,OAAO,MAAM,OAAO,eAAe,YAAY,KAAK,MAAM;AAChE,cAAQ,MAAM,SAAS,gBAAgB,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,SAAS,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAIH,QAAM,QAAQ,QAAQ,EACnB,YAAY,kCAAkC,EAC9C,OAAO,mBAAmB,iEAAiE,EAC3F,OAAO,uBAAuB,yEAAyE,EACvG,OAAO,kBAAkB,gEAAgE,EACzF,OAAO,qBAAqB,6EAA6E,EACzG,OAAO,mBAAmB,aAAa,EACvC,OAAO,qBAAqB,uCAAuC,EACnE,OAAO,cAAc,yBAAyB,GAAG,EACjD,OAAO,mBAAmB,8BAA8B,KAAK,EAC7D,OAAO,SAAS,wFAAwF,EACxG,OAAO,OAAO,SAA0K;AACvL,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAID,WAAUC,QAAO;AAC5C,YAAM,aAAa,eAAe,QAAQ,KAAK,OAAO;AACtD,YAAM,WAAW;AAAA,QACf;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK,aAAa,SAAY,KAAK,aAAa,SAAS;AAAA,MACrE;AACA,UAAI,KAAK,KAAK;AACZ,cAAM,OAAO,MAAM,OAAO,gBAAgB,QAAQ;AAClD,gBAAQ,MAAM,SAAS,UAAU,KAAK;AAAA,MACxC,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,aAAa;AAAA,UACrC,GAAG;AAAA,UACH,MAAM,SAAS,KAAK,MAAM,EAAE;AAAA,UAC5B,UAAU,SAAS,KAAK,UAAU,EAAE;AAAA,QACtC,CAAC;AACD,gBAAQ,MAAM,SAAS,UAAU,KAAK;AAAA,MACxC;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,SAAS,UAAU,KAAK;AAAA,IAAG;AAAA,EACvD,CAAC;AAIH,QAAM,QAAQ,UAAU,EACrB,YAAY,+BAA+B,EAC3C,OAAO,mBAAmB,iEAAiE,EAC3F,OAAO,oBAAoB,+BAA+B,eAAe,EACzE,OAAO,mBAAmB,aAAa,EACvC,OAAO,OAAO,SAAiE;AAC9E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAID,WAAUC,QAAO;AAC5C,YAAM,aAAa,eAAe,QAAQ,KAAK,OAAO;AACtD,YAAM,OAAO,MAAM,OAAO,YAAY;AAAA,QACpC;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,cAAQ,MAAM,SAAS,YAAY,KAAK;AAAA,IAC1C,SAAS,KAAK;AAAE,WAAK,KAAK,SAAS,YAAY,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAIH,QAAM,QAAQ,UAAU,EACrB,YAAY,sBAAsB,EAClC,OAAO,kBAAkB,cAAc,EACvC,OAAO,cAAc,yBAAyB,GAAG,EACjD,OAAO,mBAAmB,oBAAoB,KAAK,EACnD,OAAO,SAAS,4DAA4D,EAC5E,OAAO,OAAO,SAA4E;AACzF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,UAAI,KAAK,KAAK;AACZ,cAAM,OAAO,MAAM,OAAO,kBAAkB,KAAK,KAAK;AACtD,gBAAQ,MAAM,SAAS,YAAY,KAAK;AAAA,MAC1C,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,eAAe;AAAA,UACvC,OAAO,KAAK;AAAA,UACZ,MAAM,SAAS,KAAK,MAAM,EAAE;AAAA,UAC5B,UAAU,SAAS,KAAK,UAAU,EAAE;AAAA,QACtC,CAAC;AACD,gBAAQ,MAAM,SAAS,YAAY,KAAK;AAAA,MAC1C;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,SAAS,YAAY,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAIH,QAAM,QAAQ,UAAU,EACrB,YAAY,sCAAsC,EAClD,OAAO,mBAAmB,iEAAiE,EAC3F,OAAO,qBAAqB,+BAA+B,EAC3D,OAAO,uBAAuB,mDAAmD,EACjF,OAAO,mBAAmB,aAAa,EACvC,OAAO,cAAc,yBAAyB,GAAG,EACjD,OAAO,mBAAmB,oBAAoB,KAAK,EACnD,OAAO,SAAS,4DAA4D,EAC5E,OAAO,OAAO,SAAqI;AAClJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAID,WAAUC,QAAO;AAC5C,YAAM,aAAa,eAAe,QAAQ,KAAK,OAAO;AACtD,YAAM,WAAW;AAAA,QACf;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,MACf;AACA,UAAI,KAAK,KAAK;AACZ,cAAM,OAAO,MAAM,OAAO,kBAAkB,QAAQ;AACpD,gBAAQ,MAAM,SAAS,YAAY,KAAK;AAAA,MAC1C,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,eAAe;AAAA,UACvC,GAAG;AAAA,UACH,MAAM,SAAS,KAAK,MAAM,EAAE;AAAA,UAC5B,UAAU,SAAS,KAAK,UAAU,EAAE;AAAA,QACtC,CAAC;AACD,gBAAQ,MAAM,SAAS,YAAY,KAAK;AAAA,MAC1C;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,SAAS,YAAY,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AACL;;;AC1JA,IAAMC,OAAM;AAqDZ,SAAS,cAAc,MAAmD,MAAc,UAAkB;AACxG,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,SAAS,WAAW,MAAgD,MAAc,UAAkB;AAClG,SAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK;AAAA,IACnB,KAAK,KAAK;AAAA,IACV,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,SAAS,aAAa,MAAkD,MAAc,UAAkB;AACtG,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,cAAc,KAAK;AAAA,IACnB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,SAAS,WAAW,MAAgD,MAAc,UAAkB;AAClG,SAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,gBAAwC;AAC5C,WAAO,KAAK,KAAK,IAAmB,GAAGA,IAAG,eAAe;AAAA,EAC3D;AAAA,EAEA,MAAM,QAA0B;AAC9B,WAAO,KAAK,KAAK,IAAa,GAAGA,IAAG,YAAY;AAAA,EAClD;AAAA,EAEA,MAAM,WAAW,WAAmB,QAAiB,SAAuC;AAC1F,WAAO,KAAK,KAAK,IAAgB,GAAGA,IAAG,aAAa,SAAS,KAAK;AAAA,MAChE,QAAQ,EAAE,QAAQ,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,WAAmB,QAAgB,QAAiB,SAAoC;AACpG,WAAO,KAAK,KAAK,IAAa,GAAGA,IAAG,aAAa,SAAS,UAAU,MAAM,KAAK;AAAA,MAC7E,QAAQ,EAAE,QAAQ,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAAyB,CAAC,GAA8C;AACzF,WAAO,KAAK,KAAK,IAAsC,GAAGA,IAAG,cAAc;AAAA,MACzE,QAAQ,cAAc,MAAM,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG;AAAA,IAClE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,OAAoD,CAAC,GAA0B;AACnG,WAAO,KAAK,KAAK,YAAwB,OAAO,MAAM,aAAa;AACjE,YAAM,OAAO,MAAM,KAAK,KAAK,IAAsC,GAAGA,IAAG,cAAc;AAAA,QACrF,QAAQ,cAAc,MAAM,MAAM,QAAQ;AAAA,MAC5C,CAAC;AACD,aAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,MAA6D;AAC3E,WAAO,KAAK,KAAK,IAAmC,GAAGA,IAAG,aAAa,KAAK,SAAS,WAAW;AAAA,MAC9F,QAAQ,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG;AAAA,IAC/D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,MAAoE;AACrF,WAAO,KAAK,KAAK,YAAqB,OAAO,MAAM,aAAa;AAC9D,YAAM,OAAO,MAAM,KAAK,KAAK,IAAmC,GAAGA,IAAG,aAAa,KAAK,SAAS,WAAW;AAAA,QAC1G,QAAQ,WAAW,MAAM,MAAM,QAAQ;AAAA,MACzC,CAAC;AACD,aAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,MAAiE;AACjF,WAAO,KAAK,KAAK,IAAqC,GAAGA,IAAG,aAAa,KAAK,SAAS,aAAa;AAAA,MAClG,QAAQ,aAAa,MAAM,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,MAAwE;AAC3F,WAAO,KAAK,KAAK,YAAuB,OAAO,MAAM,aAAa;AAChE,YAAM,OAAO,MAAM,KAAK,KAAK,IAAqC,GAAGA,IAAG,aAAa,KAAK,SAAS,aAAa;AAAA,QAC9G,QAAQ,aAAa,MAAM,MAAM,QAAQ;AAAA,MAC3C,CAAC;AACD,aAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,OAAsB,CAAC,GAA2C;AAChF,WAAO,KAAK,KAAK,IAAmC,GAAGA,IAAG,WAAW;AAAA,MACnE,QAAQ,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG;AAAA,IAC/D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAAiD,CAAC,GAAuB;AAC1F,WAAO,KAAK,KAAK,YAAqB,OAAO,MAAM,aAAa;AAC9D,YAAM,OAAO,MAAM,KAAK,KAAK,IAAmC,GAAGA,IAAG,WAAW;AAAA,QAC/E,QAAQ,WAAW,MAAM,MAAM,QAAQ;AAAA,MACzC,CAAC;AACD,aAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAAA,IACpD,CAAC;AAAA,EACH;AACF;;;ACnMA,SAASC,WAAUC,UAAgF;AACjG,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,MAAI,CAAC,OAAO,IAAI,QAAS,OAAM,IAAI,WAAW,mDAAmD;AACjG,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,EAAE,QAAQ,IAAI,UAAU,IAAI,GAAG,OAAO;AAC/C;AAEA,SAASC,gBAAe,QAAuC,YAA6B;AAC1F,QAAM,UAAU,cAAc,OAAO,SAAS,IAAI;AAClD,MAAI,CAAC,QAAS,OAAM,IAAI,WAAW,4EAA4E;AAC/G,MAAI,CAAC,QAAQ,KAAK,OAAO,EAAG,OAAM,IAAI,WAAW,wBAAwB,OAAO,sDAAsD;AACtI,QAAM,KAAK,SAAS,SAAS,EAAE;AAC/B,MAAI,MAAM,EAAG,OAAM,IAAI,WAAW,wBAAwB,OAAO,sDAAsD;AACvH,SAAO;AACT;AAEA,SAAS,UAAU,KAAa,MAAsB;AACpD,QAAM,IAAI,SAAS,KAAK,EAAE;AAC1B,MAAI,MAAM,CAAC,KAAK,IAAI,EAAG,OAAM,IAAI,WAAW,WAAW,IAAI,MAAM,GAAG,gCAAgC;AACpG,SAAO;AACT;AAEA,SAAS,eAAe,KAAyB,SAAuC;AACtF,MAAI,QAAQ,OAAW,QAAO;AAC9B,MAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,UAAM,IAAI,WAAW,4BAA4B,GAAG,eAAe,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,EAC1F;AACA,SAAO;AACT;AAEO,SAAS,oBAAoBD,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,sEAAsE;AAIrH,MAAI,QAAQ,aAAa,EACtB,YAAY,4DAA4D,EACxE,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,OAAO,MAAM,OAAO,cAAc;AACxC,cAAQ,MAAM,OAAO,eAAe,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAIH,MAAI,QAAQ,QAAQ,EACjB,YAAY,gCAAgC,EAC5C,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,OAAO,MAAM,OAAO,MAAM;AAChC,cAAQ,MAAM,OAAO,UAAU,KAAK;AAAA,IACtC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,UAAU,KAAK;AAAA,IAAG;AAAA,EACrD,CAAC;AAIH,MAAI,QAAQ,OAAO,EAChB,YAAY,YAAY,EACxB,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,uBAAuB,sBAAsB,EACpD,OAAO,sBAAsB,qBAAqB,EAClD,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,cAAc,yBAAyB,GAAG,EACjD,OAAO,mBAAmB,oBAAoB,KAAK,EACnD,OAAO,SAAS,4DAA4D,EAC5E,OAAO,OAAO,SAAoI;AACjJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,WAAW;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,UAAU,eAAe,KAAK,QAAQ,CAAC,QAAQ,OAAO,CAAC;AAAA,MACzD;AACA,UAAI,KAAK,KAAK;AACZ,cAAM,OAAO,MAAM,OAAO,aAAa,QAAQ;AAC/C,gBAAQ,MAAM,OAAO,SAAS,KAAK;AAAA,MACrC,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,UAAU;AAAA,UAClC,GAAG;AAAA,UACH,MAAM,UAAU,KAAK,MAAM,QAAQ;AAAA,UACnC,UAAU,UAAU,KAAK,UAAU,aAAa;AAAA,QAClD,CAAC;AACD,gBAAQ,MAAM,OAAO,SAAS,KAAK;AAAA,MACrC;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,SAAS,KAAK;AAAA,IAAG;AAAA,EACpD,CAAC;AAIH,MAAI,QAAQ,UAAU,EACnB,YAAY,eAAe,EAC3B,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,kBAAkB,8CAA8C,EACvE,OAAO,sBAAsB,gEAAgE,EAC7F,OAAO,qBAAqB,2EAA2E,EACvG,OAAO,sBAAsB,iEAAiE,EAC9F,OAAO,cAAc,yBAAyB,GAAG,EACjD,OAAO,mBAAmB,oBAAoB,KAAK,EACnD,OAAO,SAAS,4DAA4D,EAC5E,OAAO,OAAO,SAAmK;AAChL,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,WAAW;AAAA,QACf,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,QAAQ,eAAe,KAAK,QAAQ,CAAC,QAAQ,SAAS,KAAK,CAAC;AAAA,QAC5D,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,MAChB;AACA,UAAI,KAAK,KAAK;AACZ,cAAM,OAAO,MAAM,OAAO,gBAAgB,QAAQ;AAClD,gBAAQ,MAAM,OAAO,YAAY,KAAK;AAAA,MACxC,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,aAAa;AAAA,UACrC,GAAG;AAAA,UACH,MAAM,UAAU,KAAK,MAAM,QAAQ;AAAA,UACnC,UAAU,UAAU,KAAK,UAAU,aAAa;AAAA,QAClD,CAAC;AACD,gBAAQ,MAAM,OAAO,YAAY,KAAK;AAAA,MACxC;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,YAAY,KAAK;AAAA,IAAG;AAAA,EACvD,CAAC;AAIH,MAAI,QAAQ,SAAS,EAClB,YAAY,4BAA4B,EACxC,OAAO,aAAa,oDAAoD,EACxE,OAAO,qBAAqB,2EAA2E,EACvG,OAAO,sBAAsB,iEAAiE,EAC9F,OAAO,OAAO,SAA6D;AAC1E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAID,WAAUC,QAAO;AAC5C,YAAM,YAAYC,gBAAe,QAAQ,KAAK,EAAE;AAChD,YAAM,OAAO,MAAM,OAAO,WAAW,WAAW,KAAK,QAAQ,KAAK,OAAO;AACzE,cAAQ,MAAM,OAAO,WAAW,KAAK;AAAA,IACvC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,WAAW,KAAK;AAAA,IAAG;AAAA,EACtD,CAAC;AAIH,MAAI,QAAQ,OAAO,EAChB,YAAY,oCAAoC,EAChD,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,kBAAkB,8DAA8D,EACvF,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,iBAAiB,qCAAqC,EAC7D,OAAO,yBAAyB,0BAA0B,EAC1D,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,wBAAwB,mDAAmD,EAClF,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,qBAAqB,mEAAmE,EAC/F,OAAO,sBAAsB,0FAA0F,EACvH,OAAO,cAAc,yBAAyB,GAAG,EACjD,OAAO,mBAAmB,oBAAoB,KAAK,EACnD,OAAO,SAAS,4DAA4D,EAC5E,OAAO,OAAO,SAAsR;AACnS,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAIF,WAAUC,QAAO;AAC5C,YAAM,YAAYC,gBAAe,QAAQ,KAAK,OAAO;AACrD,YAAM,WAAW;AAAA,QACf;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK;AAAA,QACnB,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,MAChB;AACA,UAAI,KAAK,KAAK;AACZ,cAAM,OAAO,MAAM,OAAO,aAAa,QAAQ;AAC/C,gBAAQ,MAAM,OAAO,SAAS,KAAK;AAAA,MACrC,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,UAAU;AAAA,UAClC,GAAG;AAAA,UACH,MAAM,UAAU,KAAK,MAAM,QAAQ;AAAA,UACnC,UAAU,UAAU,KAAK,UAAU,aAAa;AAAA,QAClD,CAAC;AACD,gBAAQ,MAAM,OAAO,SAAS,KAAK;AAAA,MACrC;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,SAAS,KAAK;AAAA,IAAG;AAAA,EACpD,CAAC;AAIH,MAAI,QAAQ,MAAM,EACf,YAAY,6BAA6B,EACzC,OAAO,kBAAkB,oDAAoD,EAC7E,eAAe,eAAe,oBAAoB,EAClD,OAAO,qBAAqB,mEAAmE,EAC/F,OAAO,sBAAsB,sEAAsE,EACnG,OAAO,OAAO,SAAgF;AAC7F,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAIF,WAAUC,QAAO;AAC5C,YAAM,YAAYC,gBAAe,QAAQ,KAAK,OAAO;AACrD,YAAM,OAAO,MAAM,OAAO,QAAQ,WAAW,KAAK,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjF,cAAQ,MAAM,OAAO,QAAQ,KAAK;AAAA,IACpC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,QAAQ,KAAK;AAAA,IAAG;AAAA,EACnD,CAAC;AAIH,MAAI,QAAQ,SAAS,EAClB,YAAY,4BAA4B,EACxC,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,mBAAmB,yCAAyC,EACnE,OAAO,sBAAsB,wEAAwE,EACrG,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,cAAc,yBAAyB,GAAG,EACjD,OAAO,mBAAmB,oBAAoB,KAAK,EACnD,OAAO,SAAS,4DAA4D,EAC5E,OAAO,OAAO,SAA6K;AAC1L,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAIF,WAAUC,QAAO;AAC5C,YAAM,YAAYC,gBAAe,QAAQ,KAAK,OAAO;AACrD,YAAM,WAAW;AAAA,QACf;AAAA,QACA,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,MACpB;AACA,UAAI,KAAK,KAAK;AACZ,cAAM,OAAO,MAAM,OAAO,eAAe,QAAQ;AACjD,gBAAQ,MAAM,OAAO,WAAW,KAAK;AAAA,MACvC,OAAO;AACL,cAAM,OAAO,MAAM,OAAO,YAAY;AAAA,UACpC,GAAG;AAAA,UACH,MAAM,UAAU,KAAK,MAAM,QAAQ;AAAA,UACnC,UAAU,UAAU,KAAK,UAAU,aAAa;AAAA,QAClD,CAAC;AACD,gBAAQ,MAAM,OAAO,WAAW,KAAK;AAAA,MACvC;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,WAAW,KAAK;AAAA,IAAG;AAAA,EACtD,CAAC;AACL;;;AC3QA,SAAkB,UAAAC,eAAc;;;ACAhC,OAAO,QAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,YAAAC,WAAU,gBAAAC,qBAAoB;;;ACFvC,OAAOC,WAAU;AAmBV,SAAS,iBAAiB,OAAiC;AAChE,QAAM,YAAY,IAAI;AAAA,IACpB,MAAM,OAAO,OAAK;AAChB,YAAM,OAAOA,MAAK,SAAS,CAAC;AAC5B,aAAO,SAAS,uBAAuB,SAAS,eAAe,SAAS;AAAA,IAC1E,CAAC;AAAA,EACH;AAEA,QAAM,YAA4B,CAAC;AAEnC,aAAW,QAAQ,OAAO;AACxB,QAAIA,MAAK,SAAS,IAAI,MAAM,eAAgB;AAC5C,QAAI,KAAK,MAAM,GAAG,EAAE,SAAS,cAAc,EAAG;AAE9C,UAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,QAAI;AAEJ,eAAW,MAAM,CAAC,qBAAqB,aAAa,gBAAgB,GAAG;AACrE,YAAM,YAAY,QAAQ,MAAM,KAAK,GAAG,GAAG,IAAI,EAAE;AACjD,UAAI,UAAU,IAAI,SAAS,GAAG;AAC5B,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AAEA,cAAU,KAAK,EAAE,MAAM,WAAW,OAAO,SAAS,CAAC;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,iBACd,SACA,UACA,MACA,aACW;AACX,MAAI,eAAe,SAAS,UAAU;AACpC,UAAM,OAAOA,MAAK,SAAS,SAAS,QAAQ;AAC5C,QAAI,SAAS,qBAAqB;AAChC,YAAM,OAAO,iBAAiB,aAAa,SAAS,UAAU,IAAI;AAClE,UAAI,KAAK,SAAS,EAAG,QAAO;AAAA,IAC9B,WAAW,SAAS,aAAa;AAC/B,aAAO,cAAc,aAAa,SAAS,UAAU,MAAM,OAAO;AAAA,IACpE,WAAW,SAAS,kBAAkB;AACpC,aAAO,cAAc,aAAa,SAAS,UAAU,MAAM,OAAO;AAAA,IACpE;AAAA,EACF;AACA,SAAO,iBAAiB,SAAS,SAAS,MAAM,IAAI;AACtD;AAEA,SAAS,mBAAmB,GAAmB;AAC7C,SAAO,EAAE,QAAQ,gBAAgB,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,KAAK;AACzD;AAEA,SAAS,iBAAiB,SAAiB,UAAkB,MAA8B;AACzF,MAAIC;AACJ,MAAI;AACF,IAAAA,OAAM,KAAK,MAAM,OAAO;AAAA,EAC1B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAsB,CAAC;AAE7B,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQA,KAAI,gBAAgB,CAAC,CAAC,GAAG;AACpE,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,SAAS,mBAAmB,OAAO;AAAA,MACnC,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,MAAI,KAAK,YAAY;AACnB,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQA,KAAI,mBAAmB,CAAC,CAAC,GAAG;AACvE,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,SAAS,mBAAmB,OAAO;AAAA,QACnC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAAiB,cAAsB,MAA8B;AAC7F,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,OAAK,KAAK,mBAAmB,KAAK,KAAK,CAAC,KAAK,SAAU,QAAO,CAAC;AAE/D,QAAM,WAAsB,CAAC;AAE7B,aAAW,CAAC,SAAS,IAAI,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AAC3D,QAAI,YAAY,GAAI;AACpB,QAAI,CAAC,KAAK,QAAS;AAEnB,UAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK,gBAAgB;AACxD,QAAI,SAAS,CAAC,KAAK,WAAY;AAI/B,UAAM,cAAc,QAAQ,WAAW,eAAe,IAClD,QAAQ,MAAM,gBAAgB,MAAM,IACpC;AACJ,UAAM,WAAW,YAAY,MAAM,gBAAgB;AACnD,UAAM,eAAe,SAAS,SAAS;AACvC,QAAI,gBAAgB,CAAC,KAAK,kBAAmB;AAE7C,UAAM,OAAO,SAAS,SAAS,SAAS,CAAC,KAAK;AAE9C,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,SAAS,KAAK;AAAA,MACd,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM,eAAe,eAAe;AAAA,MACpC,OAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,cACP,SACA,cACA,MACA,oBACW;AACX,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,kBAAkB;AAAA,EACzC,QAAQ;AACN,cAAU,CAAC;AAAA,EACb;AAEA,QAAM,aAAa,IAAI,IAAI,OAAO,KAAK,QAAQ,gBAAgB,CAAC,CAAC,CAAC;AAClE,QAAM,UAAU,IAAI,IAAI,OAAO,KAAK,QAAQ,mBAAmB,CAAC,CAAC,CAAC;AAClE,QAAM,gBAAgB,oBAAI,IAAI,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC;AACzD,QAAM,WAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAM7B,QAAM,aAAa;AAEnB,aAAW,SAAS,QAAQ,SAAS,UAAU,GAAG;AAChD,UAAM,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,UAAU,EAAE;AACjD,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AAEZ,UAAM,QAAQ,QAAQ,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI;AACvD,QAAI,SAAS,CAAC,KAAK,WAAY;AAE/B,UAAM,eAAe,CAAC,cAAc,IAAI,IAAI;AAC5C,QAAI,gBAAgB,CAAC,KAAK,kBAAmB;AAE7C,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM,eAAe,eAAe;AAAA,MACpC,OAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,cACP,SACA,cACA,MACA,oBACW;AACX,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,kBAAkB;AAAA,EACzC,QAAQ;AACN,cAAU,CAAC;AAAA,EACb;AAEA,QAAM,aAAa,IAAI,IAAI,OAAO,KAAK,QAAQ,gBAAgB,CAAC,CAAC,CAAC;AAClE,QAAM,UAAU,IAAI,IAAI,OAAO,KAAK,QAAQ,mBAAmB,CAAC,CAAC,CAAC;AAClE,QAAM,gBAAgB,oBAAI,IAAI,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC;AAEzD,QAAM,WAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAM7B,QAAM,aAAa;AAEnB,aAAW,SAAS,QAAQ,SAAS,UAAU,GAAG;AAChD,UAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE;AACvC,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AAEZ,UAAM,QAAQ,QAAQ,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI,KAClD,mBAAmB,KAAK,KAAK;AAClC,QAAI,SAAS,CAAC,KAAK,WAAY;AAE/B,UAAM,eAAe,CAAC,cAAc,IAAI,IAAI;AAC5C,QAAI,gBAAgB,CAAC,KAAK,kBAAmB;AAE7C,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM,eAAe,eAAe;AAAA,MACpC,OAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACjQA,OAAOC,WAAU;AAGjB,IAAM,kBAAkB,oBAAI,IAAI,CAAC,WAAW,WAAW,SAAS,CAAC;AAE1D,SAAS,mBAAmB,OAAiC;AAClE,QAAM,YAAY,oBAAI,IAAoB;AAE1C,aAAW,KAAK,OAAO;AACrB,QAAIA,MAAK,SAAS,CAAC,MAAM,sBAAsB;AAC7C,gBAAU,IAAIA,MAAK,QAAQ,CAAC,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,YAA4B,CAAC;AAEnC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAOA,MAAK,SAAS,IAAI;AAC/B,UAAM,MAAMA,MAAK,QAAQ,IAAI;AAE7B,QAAI,gBAAgB,IAAI,GAAG,KAAK,SAAS,mBAAmB;AAC1D,YAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,YAAM,WAAW,UAAU,IAAI,GAAG;AAClC,gBAAU,KAAK,EAAE,MAAM,WAAW,SAAS,SAAS,CAAC;AAAA,IACvD;AAEA,QAAI,SAAS,4BAA4B;AACvC,YAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,gBAAU,KAAK,EAAE,MAAM,WAAW,SAAS,UAAU,UAAU,IAAI,GAAG,EAAE,CAAC;AAAA,IAC3E;AAAA,EACF;AAKA,QAAM,UAA0B,CAAC;AACjC,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAW,YAAY,WAAW;AAChC,QAAI,CAAC,SAAS,UAAU;AACtB,cAAQ,KAAK,QAAQ;AACrB;AAAA,IACF;AACA,QAAI,CAAC,UAAU,IAAI,SAAS,QAAQ,GAAG;AACrC,gBAAU,IAAI,SAAS,QAAQ;AAC/B,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,SACA,UACA,MACA,aACA,cACW;AACX,QAAM,OAAOA,MAAK,SAAS,SAAS,IAAI;AAExC,MAAI,aAAa;AACf,WAAO,kBAAkB,aAAa,SAAS,YAAY,SAAS,MAAM,IAAI;AAAA,EAChF;AAEA,MAAI,SAAS,mBAAmB;AAC9B,WAAO,oBAAoB,SAAS,SAAS,IAAI;AAAA,EACnD;AAEA,MAAI,SAAS,4BAA4B;AACvC,WAAO,4BAA4B,SAAS,SAAS,IAAI;AAAA,EAC3D;AAGA,SAAO,YAAY,SAAS,SAAS,MAAM,YAAY;AACzD;AAEA,SAAS,YAAY,SAAiB,UAAkB,cAAkC;AAExF,QAAM,kBAAkB,eAAe,uBAAuB,YAAY,IAAI,oBAAI,IAAoB;AAEtG,QAAM,WAAsB,CAAC;AAG7B,QAAM,aAAa;AACnB,QAAM,YAAY;AAElB,QAAM,2BAA2B,CAAC,OAAe,UAAwB;AACvE,UAAM,YAAY,uBAAuB,KAAK,KAAK;AACnD,QAAI,CAAC,UAAW;AAChB,UAAM,OAAO,UAAU,CAAC;AAExB,QAAI;AACJ,UAAM,cAAc,uBAAuB,KAAK,KAAK;AACrD,QAAI,aAAa;AACf,gBAAU,YAAY,CAAC;AAAA,IACzB,WAAW,OAAO;AAChB,YAAM,eAAe,+BAA+B,KAAK,KAAK;AAC9D,UAAI,aAAc,WAAU,aAAa,CAAC;AAAA,IAC5C;AAGA,QAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,GAAG;AACxC,gBAAU,gBAAgB,IAAI,IAAI,KAAK,gBAAgB,IAAI,KAAK,YAAY,CAAC;AAAA,IAC/E;AAEA,QAAI,CAAC,QAAS;AAEd,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,aAAW,KAAK,QAAQ,SAAS,UAAU,GAAG;AAC5C,6BAAyB,EAAE,CAAC,GAAG,EAAE;AAAA,EACnC;AACA,aAAW,KAAK,QAAQ,SAAS,SAAS,GAAG;AAC3C,6BAAyB,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,cAA2C;AACzE,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,QAAQ;AACd,aAAW,KAAK,aAAa,SAAS,KAAK,GAAG;AAC5C,QAAI,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClB,QAAI,IAAI,EAAE,CAAC,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAiB,UAA6B;AACjF,QAAM,WAAsB,CAAC;AAC7B,QAAM,QAAQ;AACd,aAAW,KAAK,QAAQ,SAAS,KAAK,GAAG;AACvC,aAAS,KAAK;AAAA,MACZ,MAAM,EAAE,CAAC;AAAA,MACT,SAAS,EAAE,CAAC;AAAA,MACZ,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAAiB,UAA6B;AACzE,QAAM,WAAsB,CAAC;AAC7B,QAAM,QAAQ;AACd,aAAW,KAAK,QAAQ,SAAS,KAAK,GAAG;AACvC,aAAS,KAAK;AAAA,MACZ,MAAM,EAAE,CAAC;AAAA,MACT,SAAS,EAAE,CAAC;AAAA,MACZ,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAYA,SAAS,kBAAkB,SAAiB,UAAkB,MAA8B;AAC1F,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,iBAAiB,OAAO,OAAO,KAAK,gBAAgB,CAAC,CAAC,GAAG;AAClE,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,aAAa,GAAG;AACxD,YAAM,UAAU,KAAK,YAAY;AACjC,UAAI,CAAC,QAAS;AAEd,YAAM,eAAe,KAAK,SAAS;AACnC,UAAI,gBAAgB,CAAC,KAAK,kBAAmB;AAE7C,YAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,UAAI,KAAK,IAAI,GAAG,EAAG;AACnB,WAAK,IAAI,GAAG;AAEZ,eAAS,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,MAAM,eAAe,eAAe;AAAA,QACpC,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACvNA,OAAOC,WAAU;AAGV,SAAS,mBAAmB,OAAiC;AAClE,QAAM,YAAY,IAAI,IAAI,MAAM,OAAO,OAAKA,MAAK,SAAS,CAAC,MAAM,iBAAiB,CAAC;AACnF,QAAM,YAA4B,CAAC;AAEnC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAOA,MAAK,SAAS,IAAI;AAC/B,QAAI,SAAS,aAAa,SAAS,kBAAkB,SAAS,oBAAoB;AAChF,YAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,YAAM,gBAAgB,QAAQ,MAAM,oBAAoB,GAAG,GAAG;AAC9D,YAAM,WAAW,UAAU,IAAI,aAAa,IAAI,gBAAgB;AAChE,gBAAU,KAAK,EAAE,MAAM,WAAW,SAAS,SAAS,CAAC;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,SACA,UACA,MACA,aACW;AACX,QAAM,OAAOA,MAAK,SAAS,SAAS,IAAI;AAExC,MAAI,eAAe,SAAS,UAAU;AACpC,WAAO,gBAAgB,aAAa,SAAS,UAAU,IAAI;AAAA,EAC7D;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,YAAY,SAAS,SAAS,MAAM,IAAI;AAAA,EACjD;AAEA,MAAI,SAAS,kBAAkB,SAAS,oBAAoB;AAC1D,WAAO,iBAAiB,SAAS,SAAS,MAAM,IAAI;AAAA,EACtD;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,YAAY,SAAiB,UAAkB,MAA8B;AAEpF,QAAM,QAAQ,qBAAqB,OAAO;AAG1C,QAAM,kBAAkB,4BAA4B,SAAS,KAAK;AAGlE,QAAM,cAAc,QAAQ,QAAQ,4DAA4D,EAAE;AAElG,QAAM,WAAsB,CAAC;AAC7B,QAAM,WAAW;AAEjB,aAAW,SAAS,YAAY,SAAS,QAAQ,GAAG;AAClD,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,UAAU,uCAAuC,KAAK,KAAK,IAAI,CAAC;AACtE,UAAM,aAAa,6CAA6C,KAAK,KAAK,IAAI,CAAC;AAC/E,QAAI,CAAC,WAAW,CAAC,WAAY;AAE7B,UAAM,aAAa,uCAAuC,KAAK,KAAK,IAAI,CAAC;AACzE,UAAM,kBAAkB,gBAAgB,cAAc,MAAM,KAAK,KAC5D,gBAAgB,IAAI,GAAG,OAAO,IAAI,UAAU,EAAE;AACnD,QAAI,CAAC,gBAAiB;AAEtB,UAAM,QAAQ,mCAAmC,KAAK,KAAK,IAAI,CAAC,KAAK;AACrE,UAAM,QAAQ,UAAU,UAAU,UAAU;AAC5C,QAAI,SAAS,CAAC,KAAK,WAAY;AAE/B,aAAS,KAAK;AAAA,MACZ,MAAM,GAAG,OAAO,IAAI,UAAU;AAAA,MAC9B,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAsC;AAClE,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,aAAa,wCAAwC,KAAK,OAAO;AACvE,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,YAAY;AAClB,aAAW,KAAK,WAAW,CAAC,EAAE,SAAS,SAAS,GAAG;AACjD,UAAM,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAiB,OAAiD;AACrG,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,YAAY,4DAA4D,KAAK,OAAO;AAC1F,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,WAAW;AACjB,aAAW,KAAK,UAAU,CAAC,EAAE,SAAS,QAAQ,GAAG;AAC/C,UAAM,QAAQ,EAAE,CAAC;AACjB,UAAM,UAAU,uCAAuC,KAAK,KAAK,IAAI,CAAC;AACtE,UAAM,aAAa,6CAA6C,KAAK,KAAK,IAAI,CAAC;AAC/E,UAAM,aAAa,uCAAuC,KAAK,KAAK,IAAI,CAAC;AACzE,QAAI,CAAC,WAAW,CAAC,cAAc,CAAC,WAAY;AAC5C,UAAM,WAAW,gBAAgB,YAAY,KAAK;AAClD,QAAI,SAAU,UAAS,IAAI,GAAG,OAAO,IAAI,UAAU,IAAI,QAAQ;AAAA,EACjE;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsB,OAA2C;AACxF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,WAAW,MAAM,QAAQ,kBAAkB,CAAC,GAAG,QAAgB,MAAM,IAAI,GAAG,KAAK,MAAM,GAAG,GAAG;AAEnG,SAAO,cAAc,KAAK,QAAQ,IAAI,OAAO;AAC/C;AAEA,IAAM,qBAAqB,oBAAI,IAAI,CAAC,sBAAsB,mBAAmB,mBAAmB,SAAS,CAAC;AAE1G,SAAS,iBAAiB,SAAiB,UAAkB,MAA8B;AACzF,QAAM,WAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAG7B,QAAM,iBAAiB;AACvB,aAAW,KAAK,QAAQ,SAAS,cAAc,GAAG;AAChD,UAAM,SAAS,EAAE,CAAC;AAClB,UAAM,UAAU,EAAE,CAAC;AACnB,UAAM,aAAa,EAAE,CAAC;AACtB,UAAM,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAEjC,UAAM,QAAQ,mBAAmB,IAAI,MAAM;AAC3C,QAAI,SAAS,CAAC,KAAK,WAAY;AAE/B,UAAM,OAAO,GAAG,OAAO,IAAI,UAAU;AACrC,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AAEZ,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAGA,QAAM,cAAc;AACpB,aAAW,KAAK,QAAQ,SAAS,WAAW,GAAG;AAC7C,UAAM,SAAS,EAAE,CAAC;AAClB,UAAM,UAAU,EAAE,CAAC;AACnB,UAAM,aAAa,EAAE,CAAC;AACtB,UAAM,UAAU,EAAE,CAAC;AAEnB,UAAM,QAAQ,mBAAmB,IAAI,MAAM;AAC3C,QAAI,SAAS,CAAC,KAAK,WAAY;AAE/B,UAAM,OAAO,GAAG,OAAO,IAAI,UAAU;AACrC,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AAEZ,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAiB,UAAkB,MAA8B;AACxF,QAAM,WAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAG7B,QAAM,YAAY;AAElB,aAAW,KAAK,QAAQ,SAAS,SAAS,GAAG;AAC3C,UAAM,UAAU,EAAE,CAAC;AACnB,UAAM,aAAa,EAAE,CAAC;AACtB,UAAM,UAAU,EAAE,CAAC;AACnB,UAAM,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAEjD,UAAM,QAAQ,QAAQ,MAAM,OAAK,mBAAmB,IAAI,CAAC,CAAC;AAC1D,QAAI,SAAS,CAAC,KAAK,WAAY;AAE/B,UAAM,OAAO,GAAG,OAAO,IAAI,UAAU;AACrC,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AAEZ,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,QAAQ,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AH/MA,SAAS,aAAa,UAA4B;AAChD,MAAI;AACF,UAAM,MAAMC,UAAS,qDAAqD;AAAA,MACxE,UAAU;AAAA,MACV,KAAK;AAAA,MACL,WAAW,KAAK,OAAO;AAAA,IACzB,CAAC;AACD,WAAO,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EAC9C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,SAAS,UAAkB,SAAgC;AAClE,MAAI;AACF,WAAO,GAAG,aAAaC,MAAK,KAAK,UAAU,OAAO,GAAG,MAAM;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,UAAkB,KAAa,SAAgC;AACpF,MAAI;AACF,WAAOC,cAAa,OAAO,CAAC,QAAQ,GAAG,GAAG,IAAI,OAAO,EAAE,GAAG;AAAA,MACxD,UAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,WAAW,KAAK,OAAO;AAAA,IACzB,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBACP,cACA,QACe;AAEf,MAAI,MAAMD,MAAK,QAAQ,YAAY;AACnC,WAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS;AACvC,UAAM,YAAY,QAAQ,MAAM,6BAA6B,GAAG,GAAG;AACnE,UAAM,UAAU,OAAO,SAAS;AAChC,QAAI,QAAS,QAAO;AACpB,QAAI,QAAQ,IAAK;AACjB,UAAMA,MAAK,QAAQ,GAAG;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,eACP,WACA,MACA,QACW;AACX,QAAM,cAAyB,CAAC;AAChC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,YAAY,WAAW;AAChC,UAAM,UAAU,OAAO,SAAS,IAAI;AACpC,QAAI,CAAC,QAAS;AAEd,UAAM,cAAc,SAAS,WAAW,OAAO,SAAS,QAAQ,KAAK,SAAY;AAEjF,QAAI,OAAkB,CAAC;AAEvB,QAAI,SAAS,cAAc,OAAO;AAChC,aAAO,iBAAiB,SAAS,UAAU,MAAM,WAAW;AAAA,IAC9D,WAAW,SAAS,cAAc,SAAS;AAEzC,YAAM,eAAe,iBAAiB,SAAS,MAAM,MAAM,KAAK;AAChE,aAAO,mBAAmB,SAAS,UAAU,MAAM,aAAa,YAAY;AAAA,IAC9E,WAAW,SAAS,cAAc,SAAS;AACzC,aAAO,mBAAmB,SAAS,UAAU,MAAM,WAAW;AAAA,IAChE;AAEA,eAAWE,QAAO,MAAM;AACtB,YAAM,MAAM,GAAGA,KAAI,SAAS,IAAIA,KAAI,IAAI,IAAIA,KAAI,OAAO,IAAIA,KAAI,MAAM;AACrE,UAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,aAAK,IAAI,GAAG;AACZ,oBAAY,KAAKA,IAAG;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,SAAS,UAAkB,OAAoB,CAAC,GAAa;AAC3E,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,MAAM,KAAK,aAAa;AAE9B,QAAM,eAAe,QAAQ,SAAS,QAAQ,QAAQ,iBAAiB,KAAK,IAAI,CAAC;AACjF,QAAM,iBAAiB,QAAQ,SAAS,QAAQ,UAAU,mBAAmB,KAAK,IAAI,CAAC;AACvF,QAAM,iBAAiB,QAAQ,SAAS,QAAQ,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAEvF,QAAM,YAAY,CAAC,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc;AACxE,QAAM,WAAW,eAAe,WAAW,MAAM,SAAO,SAAS,UAAU,GAAG,CAAC;AAE/E,SAAO,cAAc,WAAW,QAAQ;AAC1C;AAEO,SAAS,cAAc,UAAkB,KAAa,OAAoB,CAAC,GAAa;AAC7F,QAAM,MAAM,KAAK,aAAa;AAG9B,MAAI,QAAkB,CAAC;AACvB,MAAI;AACF,UAAM,MAAMD,cAAa,OAAO,CAAC,WAAW,MAAM,eAAe,GAAG,GAAG;AAAA,MACrE,UAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,WAAW,KAAK,OAAO;AAAA,IACzB,CAAC;AACD,YAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EAC/C,QAAQ;AACN,WAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAAA,EAC7B;AAEA,QAAM,eAAe,QAAQ,SAAS,QAAQ,QAAQ,iBAAiB,KAAK,IAAI,CAAC;AACjF,QAAM,iBAAiB,QAAQ,SAAS,QAAQ,UAAU,mBAAmB,KAAK,IAAI,CAAC;AACvF,QAAM,iBAAiB,QAAQ,SAAS,QAAQ,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAEvF,QAAM,YAAY,CAAC,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc;AACxE,QAAM,WAAW,eAAe,WAAW,MAAM,SAAO,cAAc,UAAU,KAAK,GAAG,CAAC;AAEzF,SAAO,cAAc,WAAW,QAAQ;AAC1C;AAEA,SAAS,cAAc,WAA2B,UAA+B;AAC/E,QAAM,eAAe,IAAI,IAAe,UAAU,IAAI,OAAK,EAAE,SAAS,CAAC;AACvE,QAAM,cAAsC,CAAC;AAC7C,QAAM,SAAiC,EAAE,QAAQ,GAAG,YAAY,EAAE;AAClE,QAAM,UAAkC,EAAE,YAAY,GAAG,KAAK,EAAE;AAEhE,aAAWC,QAAO,UAAU;AAC1B,gBAAYA,KAAI,SAAS,KAAK,YAAYA,KAAI,SAAS,KAAK,KAAK;AACjE,WAAOA,KAAI,IAAI,KAAK,OAAOA,KAAI,IAAI,KAAK,KAAK;AAC7C,YAAQA,KAAI,KAAK,KAAK,QAAQA,KAAI,KAAK,KAAK,KAAK;AAAA,EACnD;AAEA,SAAO;AAAA,IACL,YAAY,MAAM,KAAK,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,eAAe,SAAS;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AI1JO,SAAS,QAAQ,QAAwB,MAA6B;AAC3E,OAAK;AACL,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,WAAW,uEAAuE,CAAC;AAAA,EAC/F;AACA,SAAO,SAAS,UAAU,IAAI;AAChC;;;ACNA,SAAS,MAAM,GAA0B;AAEvC,QAAM,QAAQ,EAAE,QAAQ,YAAY,EAAE;AAEtC,QAAM,UAAU,MAAM,QAAQ,GAAG;AACjC,QAAM,UAAU,MAAM,QAAQ,GAAG;AACjC,QAAM,YAAY,UAAU,KAAK,UAAU;AAC3C,QAAM,WAAW,UAAU,MAAM,UAAU,YAAY,UAAU;AACjE,QAAM,UAAU,MAAM,MAAM,GAAG,KAAK,IAAI,UAAU,SAAS,CAAC;AAC5D,QAAM,aAAa,WAAW,WAC1B,MAAM,MAAM,WAAW,GAAG,YAAY,WAAW,YAAY,MAAS,IACtE;AACJ,QAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,OAAK,SAAS,GAAG,EAAE,KAAK,CAAC;AAC9D,SAAO,EAAE,OAAO,MAAM,CAAC,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,GAAG,WAAW;AACxF;AAGO,SAAS,cAAc,GAAW,GAAmB;AAC1D,QAAM,KAAK,MAAM,CAAC;AAClB,QAAM,KAAK,MAAM,CAAC;AAClB,MAAI,GAAG,UAAU,GAAG,MAAO,QAAO,GAAG,QAAQ,GAAG;AAChD,MAAI,GAAG,UAAU,GAAG,MAAO,QAAO,GAAG,QAAQ,GAAG;AAChD,MAAI,GAAG,UAAU,GAAG,MAAO,QAAO,GAAG,QAAQ,GAAG;AAEhD,MAAI,CAAC,GAAG,cAAc,GAAG,WAAY,QAAO;AAC5C,MAAI,GAAG,cAAc,CAAC,GAAG,WAAY,QAAO;AAC5C,MAAI,GAAG,cAAc,GAAG,WAAY,QAAO,GAAG,WAAW,cAAc,GAAG,UAAU;AACpF,SAAO;AACT;AAEO,SAAS,QAAQ,SAAiB,QAAyB;AAChE,SAAO,cAAc,QAAQ,OAAO,IAAI;AAC1C;AAEO,SAAS,WAAW,SAAiB,QAA6C;AACvF,QAAM,KAAK,MAAM,OAAO;AACxB,QAAM,KAAK,MAAM,MAAM;AACvB,MAAI,GAAG,QAAQ,GAAG,MAAO,QAAO;AAChC,MAAI,GAAG,QAAQ,GAAG,MAAO,QAAO;AAChC,SAAO;AACT;AAEO,SAAS,YAAY,MAAc,IAAqB;AAC7D,SAAO,cAAc,IAAI,IAAI,IAAI;AACnC;;;AC5CO,SAAS,QACd,QACA,MACA,IACA,MACU;AACV,OAAK;AACL,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,WAAW,gCAAgC,CAAC;AAAA,EACxD;AAEA,QAAM,WAAW,cAAc,UAAU,MAAM,IAAI;AACnD,QAAM,SAAS,KAAK,cAAc,UAAU,IAAI,IAAI,IAAI,SAAS,UAAU,IAAI;AAK/E,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,QAAQ,oBAAI,IAAoB;AAEtC,aAAWC,QAAO,SAAS,UAAU;AACnC,UAAM,MAAM,GAAGA,KAAI,SAAS,IAAIA,KAAI,IAAI,IAAIA,KAAI,MAAM;AACtD,YAAQ,IAAI,KAAKA,KAAI,OAAO;AAAA,EAC9B;AACA,aAAWA,QAAO,OAAO,UAAU;AACjC,UAAM,MAAM,GAAGA,KAAI,SAAS,IAAIA,KAAI,IAAI,IAAIA,KAAI,MAAM;AACtD,UAAM,IAAI,KAAKA,KAAI,OAAO;AAAA,EAC5B;AAEA,QAAM,UAA2B,CAAC;AAClC,QAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,QAAQ,KAAK,GAAG,GAAG,MAAM,KAAK,CAAC,CAAC;AAE5D,aAAW,OAAO,SAAS;AACzB,UAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC,KAAK;AAC1C,UAAM,OAAO,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACxC,UAAM,UAAU,QAAQ,IAAI,GAAG,KAAK;AACpC,UAAM,QAAQ,MAAM,IAAI,GAAG,KAAK;AAEhC,QAAI;AACJ,QAAI,CAAC,SAAS;AACZ,eAAS;AAAA,IACX,WAAW,CAAC,OAAO;AACjB,eAAS;AAAA,IACX,WAAW,YAAY,OAAO;AAC5B;AAAA,IACF,OAAO;AACL,eAAS,YAAY,SAAS,KAAK,IAAI,eAAe;AAAA,IACxD;AAEA,YAAQ,KAAK,EAAE,MAAM,WAAW,KAAK,QAAQ,MAAM,SAAS,IAAI,OAAO,OAAO,CAAC;AAAA,EACjF;AAEA,QAAM,UAAU,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,EAAE;AACjF,aAAW,KAAK,QAAS,SAAQ,EAAE,MAAM;AAEzC,UAAQ,YAAY,CAAC,GAAG,OAAO,EAAE,OAAO,OAAK;AAC3C,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,UAAM,KAAK,MAAM,IAAI,CAAC;AACtB,WAAO,OAAO,UAAa,OAAO,UAAa,OAAO;AAAA,EACxD,CAAC,EAAE;AAEH,SAAO,EAAE,MAAM,IAAI,MAAM,gBAAgB,SAAS,QAAQ;AAC5D;;;ACtEA,IAAM,UAAU;AAChB,IAAM,aAAa;AACnB,IAAM,aAAa;AAEnB,IAAM,gBAAwC;AAAA,EAC5C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AACT;AAoCA,eAAe,iBAAiB,KAAa,MAAsC;AACjF,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,UAAU;AAC7D,MAAI;AACF,WAAO,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,CAAC;AAAA,EAChE,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAEA,eAAsB,uBAAwE;AAC5F,MAAI;AACF,UAAM,MAAM,MAAM,iBAAiB,GAAG,OAAO,kBAAkB;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,IACtC,CAAC;AACD,WAAO,EAAE,WAAW,IAAI,MAAM,IAAI,WAAW,IAAI;AAAA,EACnD,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,WAAW;AAAA,MACX,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAkBC,MAA+C;AAC3F,QAAM,gBAA0B,CAAC;AAEjC,aAAW,YAAY,KAAK,YAAY,CAAC,GAAG;AAC1C,eAAW,SAAS,SAAS,UAAU,CAAC,GAAG;AACzC,UAAI,MAAM,SAAS,YAAY,MAAM,SAAS,aAAa;AACzD,mBAAW,SAAS,MAAM,UAAU,CAAC,GAAG;AACtC,cAAI,MAAM,MAAO,eAAc,KAAK,MAAM,KAAK;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC;AACzC,QAAM,eAAe,OAAO,SAAS;AACrC,QAAM,SAAS,eACX,WAAWA,KAAI,IAAI,OAAO,OAAO,KAAK,MAAM,CAAC,KAC7C,4BAA4BA,KAAI,IAAI,aAAa,KAAK,EAAE;AAE5D,SAAO,EAAE,cAAc,eAAe,QAAQ,OAAO;AACvD;AAEA,SAAS,gBAAgB,MAA6D;AACpF,QAAM,aAAa,KAAK,qBAAqB,CAAC;AAC9C,QAAM,aAAa,OAAO,WAAW,UAAU,MAAM,WAAW,WAAW,UAAU,IAAI;AAGzF,MAAI,OAAsB;AAC1B,QAAM,UAAU,WAAW,MAAM;AACjC,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT,WAAW,WAAW,OAAO,YAAY,YAAY,WAAW,SAAS;AACvE,UAAM,QAAS,QAAoC,OAAO;AAC1D,QAAI,OAAO,UAAU,SAAU,QAAO;AAAA,EACxC;AAGA,aAAW,KAAK,KAAK,YAAY,CAAC,GAAG;AACnC,UAAM,QAAQ,WAAW,EAAE,KAAK;AAChC,QAAI,CAAC,MAAM,KAAK,KAAK,SAAS,KAAK,SAAS,IAAI;AAC9C,aAAO;AACP;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,cAAc,sBAAsB,IAAI;AAAA,IAClD;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,MAA6B;AAC1D,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,QAAQ,EAAK,QAAO;AACxB,MAAI,QAAQ,EAAK,QAAO;AACxB,MAAI,QAAQ,EAAK,QAAO;AACxB,SAAO;AACT;AAEA,SAAS,QAAQ,MAAkBA,MAAgC;AACjE,QAAM,EAAE,UAAU,KAAK,IAAI,gBAAgB,IAAI;AAC/C,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,SAAS,KAAK,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA,SAAS,KAAK,WAAW,CAAC;AAAA,IAC1B,aAAa,mBAAmB,MAAMA,IAAG;AAAA,IACzC,aAAa,KAAK,cAAc,CAAC,GAAG,IAAI,OAAK,EAAE,OAAO,EAAE,EAAE,OAAO,OAAO;AAAA,EAC1E;AACF;AAEA,eAAe,WAAW,SAAqB,UAAmD;AAChG,QAAM,MAAM,MAAM,iBAAiB,GAAG,OAAO,kBAAkB;AAAA,IAC7D,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClC,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,EAAE;AAAA,EACvD;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAM,aAAkC,CAAC;AAEzC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC5C,UAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,UAAMA,OAAM,SAAS,CAAC;AACtB,QAAI,CAAC,UAAU,CAACA,KAAK;AAErB,UAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAI,MAAM,WAAW,EAAG;AAExB,eAAW,KAAK;AAAA,MACd,GAAGA;AAAA,MACH,iBAAiB,MAAM,IAAI,OAAK,QAAQ,GAAGA,IAAG,CAAC;AAAA,IACjD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,sBAAsB,UAAmD;AAC7F,QAAM,gBAAqC,CAAC;AAE5C,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,YAAY;AACpD,UAAM,QAAQ,SAAS,MAAM,GAAG,IAAI,UAAU;AAE9C,UAAM,UAAsB,MAAM,IAAI,CAAAA,UAAQ;AAAA,MAC5C,SAAS;AAAA,QACP,MAAMA,KAAI;AAAA,QACV,WAAW,cAAcA,KAAI,SAAS,KAAKA,KAAI;AAAA,MACjD;AAAA,MACA,SAASA,KAAI;AAAA,IACf,EAAE;AAEF,UAAM,UAAU,MAAM,WAAW,SAAS,KAAK;AAC/C,kBAAc,KAAK,GAAG,OAAO;AAAA,EAC/B;AAEA,SAAO;AACT;;;AChMA,IAAM,eAAe;AACrB,IAAMC,cAAa;AACnB,IAAMC,cAAa;AAqBnB,eAAeC,kBAAiB,KAAa,MAAsC;AACjF,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAGD,WAAU;AAC7D,MAAI;AACF,WAAO,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,CAAC;AAAA,EAChE,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAEA,SAAS,OAAOE,MAAsB;AACpC,UAAQA,KAAI,WAAW;AAAA,IACrB,KAAK,OAAO;AAEV,YAAM,cAAcA,KAAI,KAAK,WAAW,GAAG,IACvCA,KAAI,KAAK,QAAQ,KAAK,KAAK,IAC3BA,KAAI;AACR,aAAO,WAAW,WAAW,IAAIA,KAAI,OAAO;AAAA,IAC9C;AAAA,IACA,KAAK;AACH,aAAO,aAAaA,KAAI,IAAI,IAAIA,KAAI,OAAO;AAAA,IAC7C,KAAK,SAAS;AAEZ,YAAM,WAAWA,KAAI,KAAK,QAAQ,GAAG;AACrC,UAAI,aAAa,IAAI;AACnB,cAAM,UAAUA,KAAI,KAAK,MAAM,GAAG,QAAQ;AAC1C,cAAM,aAAaA,KAAI,KAAK,MAAM,WAAW,CAAC;AAC9C,eAAO,aAAa,mBAAmB,OAAO,CAAC,IAAI,mBAAmB,UAAU,CAAC,IAAIA,KAAI,OAAO;AAAA,MAClG;AACA,aAAO,aAAa,mBAAmBA,KAAI,IAAI,CAAC,IAAIA,KAAI,OAAO;AAAA,IACjE;AAAA,IACA;AACE,aAAO,eAAe,mBAAmBA,KAAI,IAAI,CAAC,IAAIA,KAAI,OAAO;AAAA,EACrE;AACF;AAEA,SAASC,uBAAsB,OAAuB;AACpD,MAAI,SAAS,EAAK,QAAO;AACzB,MAAI,SAAS,EAAK,QAAO;AACzB,MAAI,SAAS,EAAK,QAAO;AACzB,MAAI,QAAQ,EAAG,QAAO;AACtB,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAiBD,MAAgC;AACxE,QAAM,OAAiB,CAAC,EAAE,WAAW,GAAI,EAAE,sBAAsB,CAAC,CAAE,EAAE,OAAO,OAAO;AAGpF,QAAM,SAAS,OAAO,EAAE,SAAS,gCAAgCA,KAAI,IAAI,IAAIA,KAAI,OAAO;AAExF,QAAM,aAAa;AACnB,QAAM,aAAa,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACnF,QAAM,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,WAAW,SAAS,UAAU,CAAC,EAAE,IAAI,OAAK,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;AAE9F,SAAO;AAAA,IACL,IAAI,EAAE,eAAe,EAAE;AAAA,IACvB,SAAS,EAAE,SAAS,EAAE;AAAA,IACtB,UAAUC,uBAAsB,EAAE,SAAS;AAAA,IAC3C,MAAM,EAAE,YAAY,IAAI,EAAE,YAAY;AAAA,IACtC;AAAA,IACA,aAAa;AAAA,MACX,cAAc;AAAA,MACd,eAAe,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEA,eAAeC,YACb,OACA,UAC8B;AAC9B,QAAM,MAAM,MAAMH,kBAAiB,GAAG,YAAY,4BAA4B;AAAA,IAC5E,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,IAC1E,MAAM,KAAK,UAAU,EAAE,aAAa,MAAM,CAAC;AAAA,EAC7C,CAAC;AAED,MAAI,IAAI,WAAW,KAAK;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,oCAAoC,IAAI,MAAM,EAAE;AAAA,EAClE;AAEA,QAAM,UAAW,MAAM,IAAI,KAAK;AAChC,QAAM,aAAkC,CAAC;AAEzC,QAAM,gBAAgB,oBAAI,IAAqB;AAC/C,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,kBAAc,IAAI,MAAM,CAAC,GAAI,SAAS,CAAC,CAAE;AAAA,EAC3C;AAEA,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,QAAQ,YAAa;AAC1B,UAAMC,OAAM,cAAc,IAAI,OAAO,WAAW;AAChD,QAAI,CAACA,KAAK;AACV,UAAM,QAAQ,OAAO,mBAAmB,CAAC;AACzC,QAAI,MAAM,WAAW,EAAG;AACxB,eAAW,KAAK,EAAE,GAAGA,MAAK,iBAAiB,MAAM,IAAI,OAAK,gBAAgB,GAAGA,IAAG,CAAC,EAAE,CAAC;AAAA,EACtF;AAEA,SAAO;AACT;AAEA,eAAsB,4BAA6E;AACjG,MAAI;AAEF,UAAM,MAAM,MAAMD,kBAAiB,GAAG,YAAY,4BAA4B;AAAA,MAC5E,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,MAC1E,MAAM,KAAK,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC;AAAA,IAC1C,CAAC;AACD,WAAO,EAAE,WAAW,IAAI,MAAM,IAAI,WAAW,IAAI;AAAA,EACnD,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,WAAW;AAAA,MACX,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD;AAAA,EACF;AACF;AAEA,eAAsB,iCACpB,UAC8B;AAC9B,QAAM,gBAAqC,CAAC;AAE5C,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAKF,aAAY;AACpD,UAAM,QAAQ,SAAS,MAAM,GAAG,IAAIA,WAAU;AAC9C,UAAM,QAAQ,MAAM,IAAI,MAAM;AAC9B,UAAM,UAAU,MAAMK,YAAW,OAAO,KAAK;AAC7C,kBAAc,KAAK,GAAG,OAAO;AAAA,EAC/B;AAEA,SAAO;AACT;;;AClKA,IAAMC,cAAa;AACnB,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAMC,cAAa;AA8CnB,eAAeC,kBAAiB,KAAa,MAAsC;AACjF,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAGF,WAAU;AAC7D,MAAI;AACF,WAAO,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,CAAC;AAAA,EAChE,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAEA,SAAS,eAAe,UAAkB,UAA0B;AAClE,SAAO,SAAS,OAAO,KAAK,GAAG,QAAQ,IAAI,QAAQ,EAAE,EAAE,SAAS,QAAQ,CAAC;AAC3E;AAEA,SAAS,sBAAsB,OAAuB;AACpD,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,QAAQ,EAAG,QAAO;AACtB,SAAO;AACT;AAEA,SAASG,QAAOC,MAAsB;AACpC,UAAQA,KAAI,WAAW;AAAA,IACrB,KAAK,OAAO;AACV,YAAM,cAAcA,KAAI,KAAK,WAAW,GAAG,IACvCA,KAAI,KAAK,QAAQ,KAAK,KAAK,IAC3BA,KAAI;AACR,aAAO,WAAW,WAAW,IAAIA,KAAI,OAAO;AAAA,IAC9C;AAAA,IACA,KAAK;AACH,aAAO,aAAaA,KAAI,IAAI,IAAIA,KAAI,OAAO;AAAA,IAC7C,KAAK,SAAS;AACZ,YAAM,WAAWA,KAAI,KAAK,QAAQ,GAAG;AACrC,UAAI,aAAa,IAAI;AACnB,cAAM,UAAUA,KAAI,KAAK,MAAM,GAAG,QAAQ;AAC1C,cAAM,aAAaA,KAAI,KAAK,MAAM,WAAW,CAAC;AAC9C,eAAO,aAAa,mBAAmB,OAAO,CAAC,IAAI,mBAAmB,UAAU,CAAC,IAAIA,KAAI,OAAO;AAAA,MAClG;AACA,aAAO,aAAa,mBAAmBA,KAAI,IAAI,CAAC,IAAIA,KAAI,OAAO;AAAA,IACjE;AAAA,IACA;AACE,aAAO,eAAe,mBAAmBA,KAAI,IAAI,CAAC,IAAIA,KAAI,OAAO;AAAA,EACrE;AACF;AAEA,SAAS,mBAAmB,WAAgD;AAC1E,QAAM,UAAU,UAAU,qBAAqB;AAAA,IAAQ,QACrD,GAAG,QACA,OAAO,OAAK,EAAE,WAAW,SAAS,eAAe,EACjD,IAAI,OAAK,EAAE,UAAW,KAAK;AAAA,EAChC;AACA,QAAM,KAAK,QAAQ,CAAC,KAAK,UAAU;AACnC,QAAM,WAAW,sBAAsB,UAAU,iBAAiB;AAElE,SAAO;AAAA,IACL;AAAA,IACA,SAAS,UAAU;AAAA,IACnB;AAAA,IACA,MAAM;AAAA,IACN,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAAA,IAC7B,aAAa;AAAA,MACX,cAAc;AAAA,MACd,eAAe,CAAC;AAAA,MAChB,QAAQ,qBAAqB,UAAU,UAAU,kBAAkB,UAAU,iBAAiB;AAAA,IAChG;AAAA,IACA,YAAY,CAAC;AAAA,EACf;AACF;AAEA,SAAS,yBACP,eACA,aACA,eACA,SACoB;AACpB,QAAM,QAA4B,CAAC;AACnC,MAAI,gBAAgB,GAAG;AACrB,UAAM,KAAK;AAAA,MACT,IAAI,eAAe,OAAO;AAAA,MAC1B,SAAS,GAAG,aAAa;AAAA,MACzB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,CAAC;AAAA,MACV,aAAa,EAAE,cAAc,OAAO,eAAe,CAAC,GAAG,QAAQ,wCAAwC;AAAA,MACvG,YAAY,CAAC;AAAA,IACf,CAAC;AAAA,EACH;AACA,MAAI,cAAc,GAAG;AACnB,UAAM,KAAK;AAAA,MACT,IAAI,WAAW,OAAO;AAAA,MACtB,SAAS,GAAG,WAAW;AAAA,MACvB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,CAAC;AAAA,MACV,aAAa,EAAE,cAAc,OAAO,eAAe,CAAC,GAAG,QAAQ,wCAAwC;AAAA,MACvG,YAAY,CAAC;AAAA,IACf,CAAC;AAAA,EACH;AACA,MAAI,gBAAgB,GAAG;AACrB,UAAM,KAAK;AAAA,MACT,IAAI,aAAa,OAAO;AAAA,MACxB,SAAS,GAAG,aAAa;AAAA,MACzB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,CAAC;AAAA,MACV,aAAa,EAAE,cAAc,OAAO,eAAe,CAAC,GAAG,QAAQ,wCAAwC;AAAA,MACvG,YAAY,CAAC;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAe,6BACb,SACA,eACA,MACiB;AACjB,QAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,iCAAiC,mBAAmB,aAAa,CAAC;AAC3G,QAAM,MAAM,MAAMF,kBAAiB,KAAK;AAAA,IACtC,QAAQ;AAAA,IACR,SAAS,EAAE,iBAAiB,MAAM,UAAU,mBAAmB;AAAA,EACjE,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,QAAO;AACpB,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACrD,WAAO,KAAK,aAAa,CAAC,EAAG;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,eAAe,YACb,SACA,YACA,MAC+B;AAC/B,WAAS,UAAU,GAAG,UAAU,mBAAmB,WAAW;AAC5D,QAAI,UAAU,GAAG;AACf,YAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,mBAAmB,OAAO,CAAC;AAAA,IAC9E;AAEA,UAAM,MAAM,WAAW,WAAW,MAAM,IAAI,aAAa,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,GAAG,UAAU;AACnG,UAAM,MAAM,MAAMA,kBAAiB,KAAK;AAAA,MACtC,QAAQ;AAAA,MACR,SAAS,EAAE,iBAAiB,MAAM,UAAU,mBAAmB;AAAA,IACjE,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,oCAAoC,IAAI,MAAM,kBAAkB;AAAA,IAClF;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,KAAK,SAAU,QAAO;AAAA,EAC7B;AAEA,QAAM,IAAI,MAAM,8DAA8D;AAChF;AAEA,eAAe,cACb,OACA,UACA,SACA,eACA,MAC8B;AAC9B,QAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,mCAAmC,mBAAmB,aAAa,CAAC;AAE7G,QAAM,MAAM,MAAMA,kBAAiB,KAAK;AAAA,IACtC,QAAQ;AAAA,IACR,SAAS,EAAE,iBAAiB,MAAM,gBAAgB,oBAAoB,UAAU,mBAAmB;AAAA,IACnG,MAAM,KAAK,UAAU,EAAE,YAAY,MAAM,IAAI,QAAM,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAAA,EAC1E,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,oCAAoC,IAAI,MAAM,EAAE;AAAA,EAClE;AAEA,MAAI,OAAO,MAAM,IAAI,KAAK;AAE1B,MAAI,KAAK,YAAY,KAAK,YAAY;AACpC,WAAO,MAAM,YAAY,SAAS,KAAK,YAAY,IAAI;AAAA,EACzD;AAEA,QAAM,aAAa,KAAK,cAAc,CAAC;AACvC,QAAM,aAAkC,CAAC;AAEzC,QAAM,gBAAgB,oBAAI,IAAqB;AAC/C,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,kBAAc,IAAI,MAAM,CAAC,GAAI,SAAS,CAAC,CAAE;AAAA,EAC3C;AAEA,aAAW,UAAU,YAAY;AAC/B,QAAI,CAAC,QAAQ,WAAW,WAAY;AAEpC,UAAME,OAAM,cAAc,IAAI,OAAO,UAAU,UAAU;AACzD,QAAI,CAACA,KAAK;AAEV,UAAM,gBAAgB,OAAO,8BAA8B;AAC3D,UAAM,cAAc,OAAO,4BAA4B;AACvD,UAAM,gBAAgB,OAAO,8BAA8B;AAC3D,UAAM,aAAa,gBAAgB,cAAc;AAEjD,UAAM,aAAa,OAAO,YAAY,oBAAoB,CAAC;AAC3D,UAAM,qBAAqB,WAAW,OAAO,OAAK,EAAE,yBAAyB,UAAU;AAEvF,QAAI,mBAAmB,WAAW,KAAK,eAAe,EAAG;AAEzD,UAAM,kBAAsC,mBAAmB,SAAS,IACpE,mBAAmB,IAAI,OAAK,mBAAmB,CAAC,CAAC,IACjD,yBAAyB,eAAe,aAAa,eAAeA,KAAI,IAAI;AAEhF,eAAW,KAAK,EAAE,GAAGA,MAAK,gBAAgB,CAAC;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,eAAsB,yBACpB,UACA,eACA,QAC8B;AAC9B,QAAM,EAAE,SAAS,UAAU,SAAS,IAAI,OAAO;AAC/C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,4CAA4C;AAC1E,MAAI,CAAC,YAAY,CAAC,SAAU,OAAM,IAAI,MAAM,gDAAgD;AAE5F,QAAM,OAAO,eAAe,UAAU,QAAQ;AAC9C,QAAM,aAAa,MAAM,6BAA6B,SAAS,eAAe,IAAI;AAClF,QAAM,gBAAqC,CAAC;AAE5C,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAKH,aAAY;AACpD,UAAM,QAAQ,SAAS,MAAM,GAAG,IAAIA,WAAU;AAC9C,UAAM,QAAQ,MAAM,IAAIE,OAAM;AAC9B,UAAM,UAAU,MAAM,cAAc,OAAO,OAAO,SAAS,YAAY,IAAI;AAC3E,kBAAc,KAAK,GAAG,OAAO;AAAA,EAC/B;AAEA,SAAO;AACT;AAEA,eAAsB,4BACpB,SACA,UACA,UACyE;AACzE,MAAI;AACF,UAAM,OAAO,eAAe,UAAU,QAAQ;AAC9C,UAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC;AACzC,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAM;AACzD,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,SAAS,EAAE,iBAAiB,MAAM,UAAU,mBAAmB;AAAA,QAC/D,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAEA,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,aAAO,EAAE,WAAW,MAAM,eAAe,OAAO,OAAO,+BAA+B,IAAI,MAAM,IAAI;AAAA,IACtG;AAEA,WAAO,EAAE,WAAW,MAAM,eAAe,IAAI,GAAG;AAAA,EAClD,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD;AAAA,EACF;AACF;;;AChUA,IAAME,cAAa;AAEnB,eAAeC,kBAAiB,KAAa,OAAkC;AAC7E,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAGD,WAAU;AAC7D,MAAI;AACF,WAAO,MAAM,MAAM,KAAK;AAAA,MACtB,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,MAC5C,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAEA,eAAsB,6BAA6B,QAKhD;AACD,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,OAAO;AACpC,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,CAAC,OAAO,OAAO;AACjB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,MAAMC,kBAAiB,GAAG,OAAO,OAAO,oBAAoB,OAAO,KAAK;AACpF,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,aAAO;AAAA,QACL,WAAW;AAAA,QACX,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,EAAE,WAAW,IAAI,IAAI,eAAe,IAAI,IAAI,YAAY,KAAK;AAAA,EACtE,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,QAA2B,SAAuB;AACnF,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,OAAO;AACpC,UAAM,IAAI;AAAA,MACR,GAAG,OAAO;AAAA;AAAA;AAAA,MAGV;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,GAAG,OAAO;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,IAAI;AAAA,MACR,GAAG,OAAO;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAA2B,KAAoC;AACvF,MAAI,QAAQ,MAAO,QAAO,OAAO;AACjC,MAAI,QAAQ,QAAS,QAAO,OAAO;AACnC,MAAI,QAAQ,QAAS,QAAO,OAAO;AACnC,SAAO;AACT;AAEA,eAAe,aACb,SACA,OACA,UACA,aACwB;AACxB,MAAI;AACF,UAAM,UAAU,YAAY,WAAW,GAAG,IACtC,YAAY,QAAQ,KAAK,KAAK,IAC9B;AACJ,UAAM,MAAM,MAAMA,kBAAiB,GAAG,OAAO,YAAY,QAAQ,IAAI,OAAO,IAAI,KAAK;AACrF,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW,GAAG,UAAU;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eACb,SACA,OACA,UACA,aACwB;AACxB,MAAI;AACF,UAAM,QAAQ,YAAY,YAAY;AACtC,UAAM,MAAM,MAAMA;AAAA,MAChB,GAAG,OAAO,iBAAiB,QAAQ,kBAAkB,KAAK;AAAA,MAC1D;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAM,WAAW,KAAK,YAAY,CAAC;AACnC,WAAO,SAAS,SAAS,SAAS,CAAC,KAAK;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eACb,SACA,OACA,UACA,aACwB;AACxB,QAAM,CAAC,SAAS,UAAU,IAAI,YAAY,MAAM,GAAG;AACnD,MAAI,CAAC,WAAW,CAAC,WAAY,QAAO;AAEpC,MAAI;AACF,UAAM,MAAM,MAAMA;AAAA,MAChB,GAAG,OAAO,+BAA+B,mBAAmB,OAAO,CAAC,MAAM,mBAAmB,UAAU,CAAC,UAAU,QAAQ;AAAA,MAC1H;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,oBACpB,UACA,QACA,YACyE;AACzE,QAAM,EAAE,SAAS,MAAM,IAAI;AAC3B,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO,EAAE,UAAU,CAAC,GAAG,qBAAqB,CAAC,EAAE;AAEvE,QAAM,WAA8B,CAAC;AACrC,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAWC,QAAO,UAAU;AAC1B,UAAM,WAAW,iBAAiB,QAAQA,KAAI,SAAS;AACvD,QAAI,CAAC,UAAU;AACb,gBAAU,IAAIA,KAAI,SAAS;AAC3B;AAAA,IACF;AAEA,QAAI,SAAwB;AAC5B,QAAIA,KAAI,cAAc,OAAO;AAC3B,eAAS,MAAM,aAAa,SAAS,OAAO,UAAUA,KAAI,IAAI;AAAA,IAChE,WAAWA,KAAI,cAAc,SAAS;AACpC,eAAS,MAAM,eAAe,SAAS,OAAO,UAAUA,KAAI,IAAI;AAAA,IAClE,WAAWA,KAAI,cAAc,SAAS;AACpC,eAAS,MAAM,eAAe,SAAS,OAAO,UAAUA,KAAI,IAAI;AAAA,IAClE;AAEA,QAAI,CAAC,UAAU,CAAC,QAAQA,KAAI,SAAS,MAAM,EAAG;AAE9C,UAAM,OAAO,WAAWA,KAAI,SAAS,MAAM;AAC3C,QAAI,YAAY;AACd,YAAM,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,EAAE;AAC7C,UAAI,MAAM,IAAI,IAAI,MAAM,UAAU,EAAG;AAAA,IACvC;AAEA,aAAS,KAAK;AAAA,MACZ,MAAMA,KAAI;AAAA,MACV,WAAWA,KAAI;AAAA,MACf,SAASA,KAAI;AAAA,MACb;AAAA,MACA,YAAY;AAAA,MACZ,QAAQA,KAAI;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,qBAAqB,CAAC,GAAG,SAAS,EAAE;AACzD;AAEA,eAAe,cACb,SACA,OACA,UACA,aACwB;AACxB,MAAI;AACF,UAAM,UAAU,YAAY,WAAW,GAAG,IACtC,YAAY,QAAQ,KAAK,KAAK,IAC9B;AACJ,UAAM,MAAM,MAAMD,kBAAiB,GAAG,OAAO,YAAY,QAAQ,IAAI,OAAO,IAAI,KAAK;AACrF,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,OAAO,KAAK,YAAY,SAAU,QAAO,KAAK;AAClD,QAAI,OAAO,KAAK,YAAY,YAAY,KAAK,YAAY,KAAM,QAAO,KAAK,QAAQ,QAAQ;AAC3F,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,gBACb,SACA,OACA,UACA,aACA,SACwB;AACxB,MAAI;AACF,UAAM,QAAQ,YAAY,YAAY;AACtC,UAAM,MAAM,MAAMA;AAAA,MAChB,GAAG,OAAO,iBAAiB,QAAQ,iBAAiB,KAAK,IAAI,OAAO;AAAA,MACpE;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,sBAAsB,KAAK,aAAa,mBAAmB;AAAA,EACzE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,oBACpB,UACA,QAC4B;AAC5B,QAAM,EAAE,SAAS,MAAM,IAAI;AAC3B,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO,CAAC;AAEhC,QAAM,SAA4B,CAAC;AAEnC,aAAWC,QAAO,UAAU;AAC1B,UAAM,WAAW,iBAAiB,QAAQA,KAAI,SAAS;AACvD,QAAI,UAAyB;AAE7B,QAAI,UAAU;AACZ,UAAIA,KAAI,cAAc,OAAO;AAC3B,kBAAU,MAAM,cAAc,SAAS,OAAO,UAAUA,KAAI,IAAI;AAAA,MAClE,WAAWA,KAAI,cAAc,SAAS;AACpC,kBAAU,MAAM,gBAAgB,SAAS,OAAO,UAAUA,KAAI,MAAMA,KAAI,OAAO;AAAA,MACjF;AAAA,IAEF;AAEA,WAAO,KAAK;AAAA,MACV,MAAMA,KAAI;AAAA,MACV,SAASA,KAAI;AAAA,MACb,WAAWA,KAAI;AAAA,MACf,QAAQA,KAAI;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AChRA,IAAI,aAAgC;AAEpC,eAAsB,WAAW,QAA6C;AAC5E,MAAI,WAAY,QAAO;AAEvB,QAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC/C,qBAAqB;AAAA,IACrB,6BAA6B,OAAO,WAAW;AAAA,EACjD,CAAC;AAED,QAAM,uBAAuB,UAAU,aAAa,UAAU;AAC9D,QAAM,eAAe,UAAU;AAE/B,MAAI,OAAa;AACjB,MAAI,qBAAsB,QAAO;AACjC,MAAI,aAAc,QAAO;AAEzB,eAAa,EAAE,MAAM,cAAc,qBAAqB;AACxD,SAAO;AACT;AAMA,eAAsB,yBAA2C;AAC/D,QAAM,SAAS,MAAM,0BAA0B;AAC/C,SAAO,OAAO;AAChB;AAEA,eAAsB,sBAAsB,QAAmD;AAC7F,QAAM,QAAQ,OAAO;AACrB,QAAM,eAAe,CAAC,EAAE,MAAM,WAAW,MAAM,YAAY,MAAM;AAEjE,QAAM,SAAS,MAAM,QAAQ,IAAI;AAAA,IAC/B,qBAAqB;AAAA,IACrB,6BAA6B,OAAO,WAAW;AAAA,IAC/C,0BAA0B;AAAA,IAC1B,eACI,4BAA4B,MAAM,SAAU,MAAM,UAAW,MAAM,QAAS,IAC5E,QAAQ,QAAQ,IAAI;AAAA,EAC1B,CAAC;AAED,QAAM,CAAC,WAAW,WAAW,gBAAgB,QAAQ,IAAI;AAEzD,QAAM,SAAS,OAAO;AAEtB,MAAI,OAAa;AACjB,MAAI,UAAU,aAAa,UAAU,cAAe,QAAO;AAC3D,MAAI,UAAU,aAAa,eAAe,UAAW,QAAO;AAE5D,eAAa;AAAA,IACX;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,sBAAsB,UAAU,aAAa,UAAU;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,WAAW,UAAU;AAAA,MACrB,KAAK,OAAO,WAAW;AAAA,MACvB,eAAe,UAAU;AAAA,MACzB,cAAc;AAAA,QACZ,KAAK,OAAO,WAAW;AAAA,QACvB,OAAO,OAAO,aAAa;AAAA,QAC3B,OAAO,OAAO,aAAa;AAAA,MAC7B;AAAA,MACA,GAAI,UAAU,QAAQ,EAAE,OAAO,UAAU,MAAM,IAAI,CAAC;AAAA,IACtD;AAAA,IACA,KAAK;AAAA,MACH,WAAW,UAAU;AAAA,MACrB,KAAK;AAAA,MACL,GAAI,UAAU,QAAQ,EAAE,OAAO,UAAU,MAAM,IAAI,CAAC;AAAA,IACtD;AAAA,IACA,UAAU;AAAA,MACR,WAAW,eAAe;AAAA,MAC1B,KAAK;AAAA,MACL,GAAI,eAAe,QAAQ,EAAE,OAAO,eAAe,MAAM,IAAI,CAAC;AAAA,IAChE;AAAA,IACA,GAAI,gBAAgB,WAAW;AAAA,MAC7B,YAAY;AAAA,QACV,WAAW,SAAS;AAAA,QACpB,eAAe,SAAS;AAAA,QACxB,KAAK,MAAM;AAAA,QACX,GAAI,SAAS,QAAQ,EAAE,OAAO,SAAS,MAAM,IAAI,CAAC;AAAA,MACpD;AAAA,IACF,IAAI,CAAC;AAAA,IACL;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,UAAU,aAAa,UAAU;AAAA,MAC3C,cAAc,UAAU,aAAa,UAAU;AAAA,MAC/C,UAAU,UAAU,aAAa,eAAe,cAAc,UAAU,aAAa,UAAU,mBAAmB;AAAA,IACpH;AAAA,EACF;AACF;;;ACpGA,SAAS,eAAe,KAAsB;AAC5C,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEA,eAAsB,SACpB,QACA,MACA,SAAsB,OACtB,eACoB;AACpB,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,WAAW,gCAAgC,CAAC;AAAA,EACxD;AAGA,MAAI,WAAW,cAAc;AAC3B,QAAI,CAAC,OAAO,WAAW,WAAW,CAAC,OAAO,WAAW,YAAY,CAAC,OAAO,WAAW,UAAU;AAC5F,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,QAEA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,UAAU,aAAa,IAAI,MAAM,WAAW,MAAM;AAChE,QAAM,oBAAqB,WAAW,cAAc,WAAW,QAAS,MAAM,uBAAuB,IAAI;AACzG,QAAM,OAAO,oBAAoB,SAAS;AAE1C,MAAI,WAAW,SAAS,CAAC,cAAc;AACrC,UAAM,IAAI;AAAA,MACR;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,cAAc,CAAC,mBAAmB;AAC/C,UAAM,IAAI;AAAA,MACR;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,CAAC,gBAAgB,CAAC,mBAAmB;AAC3D,UAAM,IAAI;AAAA,MACR;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAmC,CAAC;AAC1C,MAAI;AAEJ,MAAI,WAAW,OAAO;AACpB,QAAI,CAAC,aAAc,cAAa,KAAK,EAAE,QAAQ,OAAO,OAAO,+EAA0E,CAAC;AACxI,QAAI,CAAC,kBAAmB,cAAa,KAAK,EAAE,QAAQ,YAAY,OAAO,yFAAoF,CAAC;AAC5J,qBAAiB;AAAA,MACf,GAAI,eAAe,CAAC,KAAc,IAAI,CAAC;AAAA,MACvC,GAAI,oBAAoB,CAAC,UAAmB,IAAI,CAAC;AAAA,IACnD;AAAA,EACF,OAAO;AACL,qBAAiB,CAAC,MAAM;AAAA,EAC1B;AAGA,QAAM,WAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,mBAAmB,KAAK,qBAAqB;AAAA,EAC/C;AAEA,QAAM,OAAO,SAAS,UAAU,QAAQ;AAExC,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO,EAAE,MAAM,QAAQ,gBAAgB,cAAc,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC,EAAE;AAAA,EAC/F;AAEA,MAAI;AAEJ,MAAI,WAAW,cAAc;AAC3B,iBAAa,MAAM,yBAAyB,KAAK,UAAU,eAAgB,MAAM;AAAA,EACnF,WAAW,WAAW,YAAY;AAChC,iBAAa,MAAM,iCAAiC,KAAK,QAAQ;AAAA,EACnE,WAAW,WAAW,OAAO;AAE3B,UAAM,CAAC,YAAY,eAAe,IAAI,MAAM,QAAQ,WAAW;AAAA,MAC7D,eAAe,sBAAsB,KAAK,QAAQ,IAAI,QAAQ,QAAQ,CAAC,CAAwB;AAAA,MAC/F,oBAAoB,iCAAiC,KAAK,QAAQ,IAAI,QAAQ,QAAQ,CAAC,CAAwB;AAAA,IACjH,CAAC;AAED,QAAI,cAAc;AAChB,UAAI,WAAW,WAAW,YAAY;AACpC,qBAAa,KAAK,EAAE,QAAQ,OAAO,OAAO,eAAe,WAAW,MAAM,EAAE,CAAC;AAC7E,yBAAiB,eAAe,OAAO,OAAK,MAAM,KAAK;AAAA,MACzD;AAAA,IACF;AACA,QAAI,mBAAmB;AACrB,UAAI,gBAAgB,WAAW,YAAY;AACzC,qBAAa,KAAK,EAAE,QAAQ,YAAY,OAAO,eAAe,gBAAgB,MAAM,EAAE,CAAC;AACvF,yBAAiB,eAAe,OAAO,OAAK,MAAM,UAAU;AAAA,MAC9D;AAAA,IACF;AAEA,QAAI,eAAe,WAAW,GAAG;AAC/B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,iBAAa;AAAA,MACX,WAAW,WAAW,cAAc,WAAW,QAAQ,CAAC;AAAA,MACxD,gBAAgB,WAAW,cAAc,gBAAgB,QAAQ,CAAC;AAAA,IACpE;AAAA,EACF,OAAO;AACL,iBAAa,MAAM,sBAAsB,KAAK,QAAQ;AAAA,EACxD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,KAAK,SAAS;AAAA,IACvB,YAAY,WAAW;AAAA,IACvB,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,wBACP,YACA,iBACqB;AACrB,QAAM,QAAQ,oBAAI,IAA+B;AAEjD,aAAWC,QAAO,YAAY;AAC5B,UAAM,MAAM,GAAGA,KAAI,SAAS,IAAIA,KAAI,IAAI,IAAIA,KAAI,OAAO;AACvD,UAAM,IAAI,KAAK,EAAE,GAAGA,KAAI,CAAC;AAAA,EAC3B;AAEA,aAAWA,QAAO,iBAAiB;AACjC,UAAM,MAAM,GAAGA,KAAI,SAAS,IAAIA,KAAI,IAAI,IAAIA,KAAI,OAAO;AACvD,UAAM,WAAW,MAAM,IAAI,GAAG;AAC9B,QAAI,UAAU;AAEZ,YAAM,cAAc,IAAI,IAAI,SAAS,gBAAgB,IAAI,OAAK,EAAE,EAAE,CAAC;AACnE,YAAM,WAAWA,KAAI,gBAAgB,OAAO,OAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;AACvE,eAAS,kBAAkB,CAAC,GAAG,SAAS,iBAAiB,GAAG,QAAQ;AAAA,IACtE,OAAO;AACL,YAAM,IAAI,KAAK,EAAE,GAAGA,KAAI,CAAC;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAC3B;;;ACtKA,eAAsB,YACpB,QACA,MACA,YACuB;AACvB,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,WAAW,gCAAgC,CAAC;AAAA,EACxD;AAGA,qBAAmB,OAAO,aAAa,eAAe;AAEtD,QAAM,EAAE,qBAAqB,IAAI,MAAM,WAAW,MAAM;AACxD,MAAI,CAAC,sBAAsB;AACzB,UAAM,IAAI;AAAA,MACR,kBAAkB,OAAO,YAAY,OAAO;AAAA,MAE5C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,UAAU,EAAE,GAAG,MAAM,mBAAmB,MAAM,CAAC;AACrE,QAAM,iBAAiB,KAAK,SAAS,OAAO,OAAK,EAAE,SAAS,QAAQ;AAEpE,QAAM,EAAE,UAAU,oBAAoB,IAAI,MAAM;AAAA,IAC9C;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF;AAEA,QAAM,UAAU,EAAE,OAAO,SAAS,QAAQ,OAAO,GAAG,OAAO,GAAG,OAAO,EAAE;AACvE,aAAWC,QAAO,SAAU,SAAQA,KAAI,UAAU;AAElD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,gBAAgB,OAAO,YAAY,WAAW;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzCA,eAAsB,gBAAgB,QAAwB,MAA8C;AAC1G,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,WAAW,gCAAgC,CAAC;AAAA,EACxD;AAEA,qBAAmB,OAAO,aAAa,oBAAoB;AAE3D,QAAM,EAAE,qBAAqB,IAAI,MAAM,WAAW,MAAM;AACxD,MAAI,CAAC,sBAAsB;AACzB,UAAM,IAAI;AAAA,MACR,kBAAkB,OAAO,YAAY,OAAO;AAAA,MAE5C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,UAAU,EAAE,GAAG,MAAM,mBAAmB,MAAM,CAAC;AACrE,QAAM,iBAAiB,KAAK,SAAS,OAAO,OAAK,EAAE,SAAS,QAAQ;AAEpE,QAAM,WAAW,MAAM,oBAAoB,gBAAgB,OAAO,WAAW;AAE7E,QAAM,YAAoC,CAAC;AAC3C,MAAI,UAAU;AAEd,aAAWC,QAAO,UAAU;AAC1B,QAAI,CAACA,KAAI,SAAS;AAChB;AAAA,IACF,OAAO;AACL,gBAAUA,KAAI,OAAO,KAAK,UAAUA,KAAI,OAAO,KAAK,KAAK;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,gBAAgB,OAAO,YAAY,WAAW;AAAA,IAC9C,UAAU;AAAA,IACV,SAAS;AAAA,MACP,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AfxCO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,OAAOA,SACV,QAAQ,MAAM,EACd,YAAY,0DAA0D;AAIzE,OACG,QAAQ,OAAO,EACf,YAAY,2HAA2H,EACvI,OAAO,2BAA2B,mDAAmD,KAAK,EAC1F,OAAO,iBAAiB,+DAA+D,KAAK,EAC5F,OAAO,iBAAiB,iCAAiC,KAAK,EAC9D,UAAU,IAAIC,QAAO,qBAAqB,sBAAsB,EAAE,QAAQ,CAAC,OAAO,YAAY,cAAc,KAAK,CAAC,EAAE,QAAQ,KAAK,CAAC,EAClI,OAAO,yBAAyB,uEAAuE,EACvG,OAAO,OAAO,MAA+G,QAAiB;AAC7I,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAA6B,CAAC;AACjF,YAAM,WAAwB;AAAA,QAC5B,WAAW,KAAK;AAAA,QAChB,mBAAmB,CAAC,KAAK;AAAA,QACzB,YAAY,KAAK;AAAA,MACnB;AACA,YAAM,OAAO,MAAM,SAAS,QAAQ,UAAU,KAAK,QAAuB,KAAK,aAAa;AAC5F,cAAQ,MAAM,QAAQ,SAAS,SAAS;AAAA,IAC1C,SAAS,KAAK;AACZ,WAAK,KAAK,QAAQ,SAAS,SAAS;AAAA,IACtC;AAAA,EACF,CAAC;AAIH,OACG,QAAQ,MAAM,EACd,YAAY,yEAAyE,EACrF,OAAO,2BAA2B,mDAAmD,KAAK,EAC1F,OAAO,wBAAwB,mCAAmC,KAAK,EACvE,OAAO,iBAAiB,iCAAiC,KAAK,EAC9D,OAAO,CAAC,MAA8E,QAAiB;AACtG,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAA6B,CAAC;AACjF,YAAM,WAAwB;AAAA,QAC5B,WAAW,KAAK;AAAA,QAChB,mBAAmB,KAAK;AAAA,QACxB,YAAY,KAAK;AAAA,MACnB;AACA,YAAM,OAAO,QAAQ,QAAQ,QAAQ;AACrC,cAAQ,MAAM,QAAQ,QAAQ,SAAS;AAAA,IACzC,SAAS,KAAK;AACZ,WAAK,KAAK,QAAQ,QAAQ,SAAS;AAAA,IACrC;AAAA,EACF,CAAC;AAIH,OACG,QAAQ,MAAM,EACd,YAAY,uEAAuE,EACnF,eAAe,gBAAgB,uCAAuC,EACtE,OAAO,cAAc,wCAAwC,EAC7D,OAAO,2BAA2B,mDAAmD,KAAK,EAC1F,OAAO,iBAAiB,iCAAiC,KAAK,EAC9D,OAAO,CAAC,MAA6E,QAAiB;AACrG,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAA6B,CAAC;AACjF,YAAM,WAAwB;AAAA,QAC5B,WAAW,KAAK;AAAA,QAChB,mBAAmB;AAAA,QACnB,YAAY,KAAK;AAAA,MACnB;AACA,YAAM,OAAO,QAAQ,QAAQ,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ;AACjE,cAAQ,MAAM,QAAQ,QAAQ,SAAS;AAAA,IACzC,SAAS,KAAK;AACZ,WAAK,KAAK,QAAQ,QAAQ,SAAS;AAAA,IACrC;AAAA,EACF,CAAC;AAIH,OACG,QAAQ,UAAU,EAClB,YAAY,0EAA0E,EACtF,OAAO,2BAA2B,mDAAmD,KAAK,EAC1F,OAAO,WAAW,+BAA+B,EACjD,OAAO,WAAW,yCAAyC,EAC3D,OAAO,WAAW,yCAAyC,EAC3D,OAAO,OAAO,MAAgF,QAAiB;AAC9G,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAA6B,CAAC;AACjF,YAAM,WAAwB,EAAE,WAAW,KAAK,UAA+B;AAC/E,YAAM,aAAa,KAAK,QAAQ,UAAU,KAAK,QAAQ,UAAU,KAAK,QAAQ,UAAU;AACxF,YAAM,OAAO,MAAM,YAAY,QAAQ,UAAU,UAAU;AAC3D,cAAQ,MAAM,QAAQ,YAAY,SAAS;AAAA,IAC7C,SAAS,KAAK;AACZ,WAAK,KAAK,QAAQ,YAAY,SAAS;AAAA,IACzC;AAAA,EACF,CAAC;AAIH,OACG,QAAQ,eAAe,EACvB,YAAY,oFAAoF,EAChG,OAAO,2BAA2B,mDAAmD,KAAK,EAC1F,OAAO,iBAAiB,iCAAiC,KAAK,EAC9D,OAAO,OAAO,MAAkD,QAAiB;AAChF,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAA6B,CAAC;AACjF,YAAM,WAAwB;AAAA,QAC5B,WAAW,KAAK;AAAA,QAChB,YAAY,KAAK;AAAA,MACnB;AACA,YAAM,OAAO,MAAM,gBAAgB,QAAQ,QAAQ;AACnD,cAAQ,MAAM,QAAQ,iBAAiB,SAAS;AAAA,IAClD,SAAS,KAAK;AACZ,WAAK,KAAK,QAAQ,iBAAiB,SAAS;AAAA,IAC9C;AAAA,EACF,CAAC;AAIH,OACG,QAAQ,cAAc,EACtB,YAAY,4FAA4F,EACxG,OAAO,OAAO,OAAgB,QAAiB;AAC9C,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAA6B,CAAC;AACjF,YAAM,OAAO,MAAM,sBAAsB,MAAM;AAC/C,cAAQ,MAAM,QAAQ,gBAAgB,SAAS;AAAA,IACjD,SAAS,KAAK;AACZ,WAAK,KAAK,QAAQ,gBAAgB,SAAS;AAAA,IAC7C;AAAA,EACF,CAAC;AACL;;;AgB3JA,OAAO,WAAW;AAClB,OAAO,cAAc;AACrB,OAAO,aAAa;;;ACHpB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,YAAAC,iBAAgB;AAczB,IAAMC,OAAM;AACZ,IAAM,cAAc;AAQb,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,YAAY,YAAoB,IAAkC;AACtE,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,wBAAwB,EAAE,gBAAgBA,IAAG;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,YACA,SACA,MACA,OACsB;AACtB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,wBAAwB,mBAAmB,MAAM,IAAI,CAAC,gBAAgBA,IAAG;AAAA,MAC1I,EAAE,QAAQ,QAAQ,MAAM,OAAO,SAAS,EAAE,gBAAgB,8BAA8B,EAAE;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,YAAoB,IAAY,OAA4C;AAC/F,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,wBAAwB,EAAE,gBAAgBA,IAAG;AAAA,MAC/E,EAAE,QAAQ,SAAS,MAAM,OAAO,SAAS,EAAE,gBAAgB,8BAA8B,EAAE;AAAA,IAC7F;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,YAAoB,SAAiB,MAAsC;AACzF,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,+BAA+BA,IAAG;AAAA,MACnG,EAAE,QAAQ,QAAQ,MAAM,EAAE,OAAO,KAAK,EAAE;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,YAAoB,SAAiB,YAAmD;AACzG,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,wBAAwB,UAAU,yBAAyB,WAAW;AAAA,IACzI;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAW,YAAoB,SAAiB,YAAoB,MAA2C;AACnH,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,wBAAwB,UAAU,yBAAyB,WAAW;AAAA,MACvI,EAAE,QAAQ,QAAQ,MAAM,EAAE,KAAK,EAAE;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,YAAoB,IAAY,MAAsC;AAClF,UAAM,OAAO,MAAM,KAAK,YAAY,YAAY,EAAE;AAClD,UAAM,WAAa,KAAK,OAAmC,aAAa,KAA4B;AACpG,UAAM,UAAU,SAAS,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACrE,UAAM,WAAW,IAAI,IAAI,QAAQ,IAAI,OAAK,EAAE,YAAY,CAAC,CAAC;AAC1D,UAAM,QAAQ,KAAK,OAAO,OAAK,CAAC,SAAS,IAAI,EAAE,YAAY,CAAC,CAAC;AAC7D,UAAM,SAAS,CAAC,GAAG,SAAS,GAAG,KAAK;AACpC,UAAM,QAAuB,CAAC,EAAE,IAAI,OAAO,MAAM,uBAAuB,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;AAClG,WAAO,KAAK,eAAe,YAAY,IAAI,KAAK;AAAA,EAClD;AAAA,EAEA,MAAM,WAAW,YAAoB,IAAY,MAAsC;AACrF,UAAM,OAAO,MAAM,KAAK,YAAY,YAAY,EAAE;AAClD,UAAM,WAAa,KAAK,OAAmC,aAAa,KAA4B;AACpG,UAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,OAAK,EAAE,YAAY,CAAC,CAAC;AACpD,UAAM,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,KAAK,CAAC,MAAM,IAAI,EAAE,YAAY,CAAC,CAAC;AACrG,UAAM,QAAuB,CAAC,EAAE,IAAI,OAAO,MAAM,uBAAuB,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;AACrG,WAAO,KAAK,eAAe,YAAY,IAAI,KAAK;AAAA,EAClD;AAAA,EAEA,MAAM,kBAAkB,YAAoB,SAA6C;AACvF,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,wCAAwCA,IAAG;AAAA,IAC9G;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,eAAe,YAAoB,SAAiB,MAA+C;AACvG,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,4BAA4B,mBAAmB,IAAI,CAAC,uBAAuBA,IAAG;AAAA,IACjJ;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAW,YAAoB,SAAuC;AAC1E,UAAM,QAAQ,UACV,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,KACjE,IAAI,mBAAmB,UAAU,CAAC;AACtC,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,GAAG,KAAK,iCAAiCA,IAAG;AAAA,IAC9C;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,eAAe,YAAoB,SAAiB,MAAmC;AAC3F,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,4BAA4B,mBAAmB,IAAI,CAAC,uBAAuBA,IAAG;AAAA,IACjJ;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,gBAAgB,YAAoB,YAAsD;AAC9F,UAAM,OAAO,MAAM,KAAK,YAAY,YAAY,UAAU;AAC1D,YAAQ,KAAK,aAAa,CAAC,GACxB,OAAO,OAAK,EAAE,QAAQ,cAAc,EACpC,IAAI,OAAK;AACR,YAAM,QAAS,EAAE,cAAc,CAAC;AAChC,aAAO;AAAA,QACL,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,QAChD,MAAM,OAAO,MAAM,MAAM,KAAK,EAAE;AAAA,QAChC,KAAK,EAAE;AAAA,QACP,SAAS,MAAM,SAAS,MAAM,SAAY,OAAO,MAAM,SAAS,CAAC,IAAI;AAAA,QACrE,cAAc,OAAO,MAAM,cAAc,MAAM,WAAW,MAAM,cAAc,IAAI;AAAA,QAClF,qBAAqB,MAAM,qBAAqB,MAAM,SAAY,OAAO,MAAM,qBAAqB,CAAC,IAAI;AAAA,QACzG,sBAAsB,MAAM,sBAAsB,MAAM,SAAY,OAAO,MAAM,sBAAsB,CAAC,IAAI;AAAA,MAC9G;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,mBAAmB,aAAsC;AAC7D,WAAO,KAAK,KAAK,UAAU,WAAW;AAAA,EACxC;AAAA,EAEA,MAAM,UAAU,YAAoB,SAAiB,QAAQ,IAAoC;AAC/F,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,+CAA+C,KAAK,gBAAgBA,IAAG;AAAA,IAC1I;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,YAAoB,SAAiB,QAAQ,IAAoC;AACpG,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,oDAAoD,KAAK,gBAAgBA,IAAG;AAAA,IAC/I;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,YACA,YACA,UACA,SACgC;AAChC,UAAM,cAAcF,cAAa,QAAQ;AACzC,UAAM,WAAWC,UAAS,QAAQ;AAKlC,UAAM,aAAa,MAAM,KAAK,KAAK;AAAA,MACjC,IAAI,mBAAmB,UAAU,CAAC,mCAAmC,mBAAmB,QAAQ,CAAC,gBAAgBC,IAAG;AAAA,MACpH;AAAA,MACA;AAAA,IACF;AAGA,UAAM,gBAAyC;AAAA,MAC7C,KAAK;AAAA,MACL,KAAK,WAAW;AAAA,MAChB,GAAI,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,IAC/C;AACA,UAAM,KAAK,KAAK;AAAA,MACd,IAAI,mBAAmB,UAAU,CAAC,wBAAwB,UAAU,gBAAgBA,IAAG;AAAA,MACvF,EAAE,QAAQ,SAAS,MAAM,CAAC,EAAE,IAAI,OAAO,MAAM,gBAAgB,OAAO,cAAc,CAAC,GAAG,SAAS,EAAE,gBAAgB,8BAA8B,EAAE;AAAA,IACnJ;AAEA,WAAO;AAAA,EACT;AACF;;;ACvLA,eAAsB,eACpB,QACA,YACA,SACyB;AACzB,QAAM,SAAS,MAAM,OAAO,WAAW,YAAY,OAAO;AAC1D,SAAO,OAAO,IAAI,WAAW;AAC/B;AAKA,eAAsB,mBACpB,QACA,YACA,SACA,MACyB;AACzB,QAAM,SAAS,MAAM,OAAO,eAAe,YAAY,SAAS,IAAI;AACpE,SAAO,OAAO,IAAI,WAAW;AAC/B;AAEA,SAAS,YAAY,GAAiH;AACpI,SAAO;AAAA,IACL,eAAe,EAAE;AAAA,IACjB,MAAM,EAAE;AAAA,IACR,MAAM,EAAE;AAAA,IACR,UAAU,EAAE;AAAA,IACZ,GAAI,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,IAAI,CAAC;AAAA,EACrD;AACF;AAKA,eAAsB,cACpB,QACA,YACA,SACgC;AAChC,QAAM,QAAQ,MAAM,OAAO,kBAAkB,YAAY,OAAO;AAChE,QAAM,SAAgC,CAAC;AAEvC,aAAW,KAAK,OAAO;AACrB,UAAM,SAAS,MAAM,OAAO,eAAe,YAAY,SAAS,EAAE,IAAI;AACtE,UAAM,kBAAkB,EAAE,UAAU,CAAC,GAClC,OAAO,OAAK,EAAE,cAAc,EAC5B,IAAI,OAAK,EAAE,aAAa;AAC3B,WAAO,KAAK;AAAA,MACV,MAAM,EAAE;AAAA,MACR,QAAQ,OAAO,IAAI,OAAK,EAAE,IAAI;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAQO,IAAM,6BAAsD;AAAA,EACjE,CAAC,SAAiB,cAAc;AAAA,EAChC,CAAC,SAAiB,cAAc;AAAA,EAChC,CAAC,cAAiB,mBAAmB;AAAA,EACrC,CAAC,eAAiB,mBAAmB;AAAA,EACrC,CAAC,eAAiB,oBAAoB;AAAA,EACtC,CAAC,YAAiB,iBAAiB;AAAA,EACnC,CAAC,aAAiB,iBAAiB;AAAA,EACnC,CAAC,iBAAiB,sBAAsB;AAAA,EACxC,CAAC,aAAiB,sBAAsB;AAAA,EACxC,CAAC,QAAiB,aAAa;AAAA,EAC/B,CAAC,YAAiB,gCAAgC;AAAA,EAClD,CAAC,YAAiB,gCAAgC;AAAA,EAClD,CAAC,UAAiB,kCAAkC;AAAA,EACpD,CAAC,eAAiB,uCAAuC;AAAA,EACzD,CAAC,gBAAiB,uCAAuC;AAAA,EACzD,CAAC,iBAAiB,yCAAyC;AAAA,EAC3D,CAAC,aAAiB,yCAAyC;AAAA,EAC3D,CAAC,sBAAsB,0CAA0C;AAAA,EACjE,CAAC,cAAiB,+BAA+B;AAAA,EACjD,CAAC,iBAAiB,8BAA8B;AAClD;AAMO,SAAS,oBAAoB,QAAgD;AAClF,QAAM,WAAW,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,aAAa,CAAC;AAEzD,QAAM,UAAkC,CAAC;AACzC,aAAW,CAAC,OAAO,GAAG,KAAK,4BAA4B;AACrD,QAAI,SAAS,IAAI,GAAG,GAAG;AACrB,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;;;AFvFA,OAAO,WAAW;AAClB,OAAOC,SAAQ;AAER,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,4BAA4B;AAEjF,SACG,QAAQ,MAAM,EACd,YAAY,oDAAoD,EAChE,OAAO,UAAU,0DAA0D,EAC3E,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,KAAK,MAAM;AACb,cAAM,eAAe,KAAK;AAAA,MAC5B,OAAO;AACL,cAAM,iBAAiB,KAAK;AAAA,MAC9B;AAAA,IACF,SAAS,KAAK;AAEZ,UAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,mBAAmB,GAAG;AACrE,gBAAQ,OAAO,MAAM,sBAAsB;AAC3C,gBAAQ,WAAW,SAAS;AAC5B;AAAA,MACF;AACA,WAAK,KAAK,UAAU,QAAQ,KAAK;AAAA,IACnC;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,OAAO,MAAM;AACZ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,WAAW,WAAW;AAC5B,cAAQ,WAAW,QAAQ,GAAG,UAAU,QAAQ,KAAK;AAAA,IACvD,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,QAAQ,KAAK;AAAA,IACnC;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,wEAAwE,EACpF,SAAS,SAAS,4BAA4B,EAC9C,SAAS,WAAW,cAAc,EAClC,OAAO,UAAU,6DAA6D,EAC9E,OAAO,CAAC,KAAa,OAAe,YAAgC;AACnE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,QAAQ,MAAM;AAChB,2BAAmB,KAAK,KAAK;AAC7B,gBAAQ,EAAE,KAAK,OAAO,QAAQ,cAAc,GAAG,UAAU,OAAO,KAAK;AAAA,MACvE,OAAO;AACL,cAAM,OAAOA,SAAQ,gBAAgB;AACrC,uBAAe,KAAK,OAAO,KAAK,MAAM;AACtC,gBAAQ,EAAE,KAAK,MAAM,GAAG,UAAU,OAAO,KAAK;AAAA,MAChD;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,OAAO,KAAK;AAAA,IAClC;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,0CAA0C,EACtD,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAOA,SAAQ,gBAAgB;AACrC,YAAM,MAAM,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AAClD,YAAM,OAAO,iBAAiB,GAAG;AAGjC,YAAM,UAAyC,CAAC;AAEhD,UAAI,IAAI,KAAK,SAAS;AACpB,YAAI;AACF,gBAAM,KAAK,KAAc,oBAAoB;AAC7C,kBAAQ,OAAO,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QAClD,SAAS,KAAK;AACZ,kBAAQ,OAAO,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QACxF;AAAA,MACF,OAAO;AACL,gBAAQ,OAAO,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MACvD;AAEA,UAAI,IAAI,UAAU,SAAS;AACzB,YAAI;AACF,gBAAM,KAAK,UAAmB,sCAAsC;AACpE,kBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAY,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC7F;AAAA,MACF,OAAO;AACL,gBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC5D;AAEA,UAAI,IAAI,OAAO,SAAS;AACtB,YAAI;AACF,gBAAM,KAAK,OAAgB,OAAO;AAClC,kBAAQ,SAAS,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACpD,SAAS,KAAK;AACZ,kBAAQ,SAAS,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC1F;AAAA,MACF,OAAO;AACL,gBAAQ,SAAS,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MACzD;AAEA,UAAI,IAAI,WAAW,SAAS;AAC1B,YAAI;AACF,gBAAM,KAAK,WAAoB,mBAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AAC1E,kBAAQ,aAAa,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACxD,SAAS,KAAK;AACZ,kBAAQ,aAAa,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC9F;AAAA,MACF,OAAO;AACL,gBAAQ,aAAa,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC7D;AAEA,UAAI,IAAI,MAAM,SAAS;AACrB,YAAI;AACF,gBAAM,KAAK,MAAe,oBAAoB;AAC9C,kBAAQ,QAAQ,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACnD,SAAS,KAAK;AACZ,kBAAQ,QAAQ,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QACzF;AAAA,MACF,OAAO;AACL,gBAAQ,QAAQ,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MACxD;AAEA,UAAI,IAAI,IAAI,SAAS;AACnB,YAAI;AACF,gBAAM,KAAK,IAAa,mBAAmB;AAC3C,kBAAQ,MAAM,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACjD,SAAS,KAAK;AACZ,kBAAQ,MAAM,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QACvF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MACtD;AAEA,UAAI,IAAI,IAAI,SAAS;AACnB,YAAI;AACF,gBAAM,aAAa,IAAI,SAAS,KAAK;AACrC,gBAAMC,QAAO,aACT,IAAI,mBAAmB,UAAU,CAAC,oDAClC;AACJ,gBAAM,KAAK,IAAaA,KAAI;AAC5B,kBAAQ,MAAM,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACjD,SAAS,KAAK;AACZ,kBAAQ,MAAM,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QACvF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MACtD;AAEA,UAAI,IAAI,QAAQ,WAAW,IAAI,QAAQ,YAAY,IAAI,QAAQ,UAAU;AACvE,YAAI;AACF,gBAAM,KAAK,QAAiB,aAAa,EAAE,QAAQ,EAAE,MAAM,WAAW,EAAE,CAAC;AACzE,kBAAQ,UAAU,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACrD,SAAS,KAAK;AACZ,kBAAQ,UAAU,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC3F;AAAA,MACF,OAAO;AACL,gBAAQ,UAAU,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC1D;AAEA,UAAI,IAAI,YAAY,SAAS;AAC3B,YAAI;AACF,gBAAM,KAAK,gBAAgB,kBAAkB;AAC7C,kBAAQ,cAAc,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACzD,SAAS,KAAK;AACZ,kBAAQ,cAAc,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC/F;AAAA,MACF,OAAO;AACL,gBAAQ,cAAc,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC9D;AAEA,UAAI,IAAI,QAAQ,YAAY,IAAI,QAAQ,OAAQ,IAAI,QAAQ,YAAY,IAAI,QAAQ,WAAY;AAC9F,YAAI;AACF,gBAAM,KAAK,QAAiB,kBAAkB;AAC9C,kBAAQ,UAAU,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACrD,SAAS,KAAK;AACZ,kBAAQ,UAAU,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC3F;AAAA,MACF,OAAO;AACL,gBAAQ,UAAU,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC1D;AAEA,UAAI,IAAI,UAAU,WAAW,IAAI,UAAU,eAAe,IAAI,UAAU,UAAW,IAAI,UAAU,YAAY,IAAI,UAAU,eAAgB;AACzI,YAAI;AACF,gBAAM,KAAK,UAAmB,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AACvE,kBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAY,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC7F;AAAA,MACF,OAAO;AACL,gBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC5D;AAEA,YAAM,eAAe,IAAI,WAAW,WAAW,IAAI,WAAW,aAAa,IAAI,WAAW,YAAY,IAAI,WAAW;AACrH,UAAI,cAAc;AAChB,YAAI;AACF,gBAAM,KAAK,WAAoB,iCAAiC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,CAAC;AAChG,kBAAQ,aAAa,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACxD,SAAS,KAAK;AACZ,kBAAQ,aAAa,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC9F;AAAA,MACF,OAAO;AACL,gBAAQ,aAAa,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC7D;AAEA,UAAI,IAAI,SAAS,UAAU,IAAI,SAAS,cAAc,IAAI,SAAS,YAAY,IAAI,SAAS,SAAS;AACnG,YAAI;AACF,gBAAM,KAAK,SAAkB,oBAAoB,IAAI,SAAS,OAAO,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AAC9G,kBAAQ,WAAW,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACtD,SAAS,KAAK;AACZ,kBAAQ,WAAW,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC5F;AAAA,MACF,OAAO;AACL,gBAAQ,WAAW,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC3D;AAEA,UAAI,IAAI,WAAW,WAAW,IAAI,WAAW,YAAY,IAAI,WAAW,UAAU;AAChF,YAAI;AACF,gBAAM,KAAK,WAAoB,wBAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AAC/E,kBAAQ,aAAa,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACxD,SAAS,KAAK;AACZ,kBAAQ,aAAa,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC9F;AAAA,MACF,OAAO;AACL,gBAAQ,aAAa,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC7D;AAEA,UAAI,IAAI,UAAU,WAAW,IAAI,UAAU,OAAO;AAChD,YAAI;AACF,gBAAM,KAAK,UAAmB,SAAS;AACvC,kBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAY,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC7F;AAAA,MACF,OAAO;AACL,gBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC5D;AAEA,UAAI,IAAI,UAAU,WAAW,IAAI,UAAU,UAAU;AACnD,YAAI;AACF,gBAAM,KAAK,UAAmB,oBAAoB;AAAA,YAChD,QAAQ,EAAE,gBAAgB,mBAAmB,UAAU,EAAE;AAAA,UAC3D,CAAC;AACD,kBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAY,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QAC7F;AAAA,MACF,OAAO;AACL,gBAAQ,YAAY,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MAC5D;AAEA,UAAI,IAAI,UAAU,eAAe,IAAI,UAAU,eAAe;AAC5D,YAAI;AACF,gBAAM,KAAK,kBAA2B,4CAA4C;AAAA,YAChF,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,OAAO;AAAA,cACP,4BAA4B;AAAA,YAC9B;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AACD,kBAAQ,qBAAqB,EAAE,IAAI,MAAM,SAAS,YAAY;AAAA,QAChE,SAAS,KAAK;AACZ,kBAAQ,qBAAqB,EAAE,IAAI,OAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,QACtG;AAAA,MACF,WAAW,IAAI,UAAU,eAAe,IAAI,UAAU,eAAe;AACnE,gBAAQ,qBAAqB,EAAE,IAAI,OAAO,SAAS,wDAAwD;AAAA,MAC7G,OAAO;AACL,gBAAQ,qBAAqB,EAAE,IAAI,MAAM,SAAS,iBAAiB;AAAA,MACrE;AAEA,cAAQ,SAAS,UAAU,QAAQ,KAAK;AAAA,IAC1C,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,QAAQ,KAAK;AAAA,IACnC;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,OAAO,EACf,YAAY,8DAA8D,EAC1E,OAAO,qBAAqB,gCAAgC,MAAM,EAClE,OAAO,OAAO,YAAgC;AAC7C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AAUF,UAASC,cAAT,SAAoB,KAA2B;AAC7C,cAAM,SAAU,IAA4B,UAAU;AACtD,YAAI,WAAW,OAAO,WAAW,KAAK;AACpC,iBAAO,EAAE,QAAQ,WAAW,SAAS,kBAAkB,MAAM,IAAI;AAAA,QACnE;AACA,YAAI,WAAW,GAAG;AAChB,iBAAO,EAAE,QAAQ,SAAS,SAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAG;AAAA,QACxF;AACA,eAAO,EAAE,QAAQ,SAAS,SAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAG;AAAA,MACxF;AATS,uBAAAA;AATT,YAAM,OAAOF,SAAQ,gBAAgB;AACrC,YAAM,MAAM,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AAElD,YAAM,OAAO,iBAAiB,KAAK,KAAK;AAIxC,YAAM,UAAuC,CAAC;AAc9C,UAAI,CAAC,IAAI,KAAK,UAAU;AACtB,gBAAQ,OAAO,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MAC9D,WAAW,CAAC,IAAI,KAAK,SAAS;AAC5B,gBAAQ,OAAO,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MACtE,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,KAAc,sBAAsB,EAAE,WAAW,IAAO,CAAC;AACpE,kBAAQ,OAAO,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QAClD,SAAS,KAAK;AACZ,kBAAQ,OAAOE,YAAW,GAAG;AAAA,QAC/B;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,UAAU,KAAK;AACtB,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACnE,WAAW,CAAC,IAAI,UAAU,SAAS;AACjC,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC3E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,UAAmB,wCAAwC,EAAE,WAAW,IAAO,CAAC;AAC3F,kBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAYA,YAAW,GAAG;AAAA,QACpC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,OAAO,OAAO;AACrB,gBAAQ,SAAS,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MAChE,WAAW,CAAC,IAAI,OAAO,SAAS;AAC9B,gBAAQ,SAAS,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MACxE,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,OAAgB,SAAS,EAAE,WAAW,IAAO,CAAC;AACzD,kBAAQ,SAAS,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACpD,SAAS,KAAK;AACZ,kBAAQ,SAASA,YAAW,GAAG;AAAA,QACjC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,WAAW,oBAAoB,CAAC,IAAI,KAAK,UAAU;AAC1D,gBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACpE,WAAW,CAAC,IAAI,WAAW,UAAU;AACnC,gBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACpE,WAAW,CAAC,IAAI,WAAW,SAAS;AAClC,gBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC5E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,WAAoB,mBAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,IAAO,CAAC;AAC7F,gBAAM,MAAM,IAAI,WAAW,mBAAmB,OAAO;AACrD,kBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,IAAI;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,aAAaA,YAAW,GAAG;AAAA,QACrC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,MAAM,OAAO;AACpB,gBAAQ,QAAQ,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MAC/D,WAAW,CAAC,IAAI,MAAM,SAAS;AAC7B,gBAAQ,QAAQ,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MACvE,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,MAAe,sBAAsB,EAAE,WAAW,IAAO,CAAC;AACrE,kBAAQ,QAAQ,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACnD,SAAS,KAAK;AACZ,kBAAQ,QAAQA,YAAW,GAAG;AAAA,QAChC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,IAAI,OAAO;AAClB,gBAAQ,MAAM,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MAC7D,WAAW,CAAC,IAAI,IAAI,SAAS;AAC3B,gBAAQ,MAAM,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MACrE,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,IAAa,qBAAqB,EAAE,WAAW,IAAO,CAAC;AAClE,kBAAQ,MAAM,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACjD,SAAS,KAAK;AACZ,kBAAQ,MAAMA,YAAW,GAAG;AAAA,QAC9B;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,IAAI,KAAK;AAChB,gBAAQ,MAAM,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MAC7D,WAAW,CAAC,IAAI,IAAI,SAAS;AAC3B,gBAAQ,MAAM,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MACrE,OAAO;AACL,YAAI;AACF,gBAAM,aAAa,IAAI,SAAS,KAAK;AACrC,gBAAMD,QAAO,aACT,IAAI,mBAAmB,UAAU,CAAC,oDAClC;AACJ,gBAAM,KAAK,IAAaA,OAAM,EAAE,WAAW,IAAO,CAAC;AACnD,kBAAQ,MAAM,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACjD,SAAS,KAAK;AACZ,kBAAQ,MAAMC,YAAW,GAAG;AAAA,QAC9B;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,QAAQ,YAAY,CAAC,IAAI,QAAQ,UAAU;AAClD,gBAAQ,UAAU,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACjE,WAAW,CAAC,IAAI,QAAQ,SAAS;AAC/B,gBAAQ,UAAU,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MACzE,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,QAAiB,aAAa,EAAE,QAAQ,EAAE,MAAM,WAAW,GAAG,WAAW,IAAO,CAAC;AAC5F,kBAAQ,UAAU,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACrD,SAAS,KAAK;AACZ,kBAAQ,UAAUA,YAAW,GAAG;AAAA,QAClC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,QAAQ,OAAO,EAAE,IAAI,QAAQ,YAAY,IAAI,QAAQ,WAAW;AACvE,gBAAQ,UAAU,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACjE,WAAW,CAAC,IAAI,QAAQ,SAAS;AAC/B,gBAAQ,UAAU,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MACzE,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,QAAiB,oBAAoB,EAAE,WAAW,IAAO,CAAC;AACrE,kBAAQ,UAAU,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACrD,SAAS,KAAK;AACZ,kBAAQ,UAAUA,YAAW,GAAG;AAAA,QAClC;AAAA,MACF;AAGA,YAAM,YAAY,MAAM,6BAA6B,IAAI,WAAW;AACpE,UAAI,CAAC,UAAU,YAAY;AACzB,gBAAQ,cAAc,EAAE,QAAQ,SAAS,SAAS,UAAU,SAAS,iBAAiB;AAAA,MACxF,WAAW,CAAC,UAAU,eAAe;AACnC,gBAAQ,cAAc,EAAE,QAAQ,WAAW,SAAS,UAAU,SAAS,gBAAgB;AAAA,MACzF,WAAW,CAAC,UAAU,WAAW;AAC/B,gBAAQ,cAAc,EAAE,QAAQ,SAAS,SAAS,UAAU,SAAS,cAAc;AAAA,MACrF,OAAO;AACL,gBAAQ,cAAc,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,MACzD;AAGA,UAAI,CAAC,IAAI,UAAU,cAAe,CAAC,IAAI,UAAU,WAAW,CAAC,IAAI,UAAU,YAAY,CAAC,IAAI,UAAU,eAAgB;AACpH,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACnE,WAAW,CAAC,IAAI,UAAU,SAAS;AACjC,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC3E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,UAAmB,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,IAAO,CAAC;AAC1F,kBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAYA,YAAW,GAAG;AAAA,QACpC;AAAA,MACF;AAGA,YAAM,UAAU,IAAI,WAAW,aAAa,IAAI,WAAW,YAAY,IAAI,WAAW;AACtF,UAAI,CAAC,SAAS;AACZ,gBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACpE,WAAW,CAAC,IAAI,WAAW,SAAS;AAClC,gBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC5E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,WAAoB,iCAAiC,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,WAAW,IAAO,CAAC;AACnH,kBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACxD,SAAS,KAAK;AACZ,kBAAQ,aAAaA,YAAW,GAAG;AAAA,QACrC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,SAAS,UAAU,CAAC,IAAI,SAAS,cAAc,CAAC,IAAI,SAAS,UAAU;AAC9E,gBAAQ,WAAW,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MAClE,WAAW,CAAC,IAAI,SAAS,SAAS;AAChC,gBAAQ,WAAW,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC1E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,SAAkB,oBAAoB,IAAI,SAAS,OAAO,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,IAAO,CAAC;AACjI,kBAAQ,WAAW,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACtD,SAAS,KAAK;AACZ,kBAAQ,WAAWA,YAAW,GAAG;AAAA,QACnC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,WAAW,YAAY,CAAC,IAAI,WAAW,UAAU;AACxD,gBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACpE,WAAW,CAAC,IAAI,WAAW,SAAS;AAClC,gBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC5E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,WAAoB,wBAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,IAAO,CAAC;AAClG,kBAAQ,aAAa,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACxD,SAAS,KAAK;AACZ,kBAAQ,aAAaA,YAAW,GAAG;AAAA,QACrC;AAAA,MACF;AAGA,UAAI,CAAC,IAAI,UAAU,OAAO;AACxB,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACnE,WAAW,CAAC,IAAI,UAAU,SAAS;AACjC,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC3E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,UAAmB,WAAW,EAAE,WAAW,IAAO,CAAC;AAC9D,kBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAYA,YAAW,GAAG;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,CAAC,IAAI,UAAU,UAAU;AAC3B,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MACnE,WAAW,CAAC,IAAI,UAAU,SAAS;AACjC,gBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,yBAAyB;AAAA,MAC3E,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,UAAmB,oBAAoB;AAAA,YAChD,QAAQ,EAAE,gBAAgB,mBAAmB,UAAU,EAAE;AAAA,YACzD,WAAW;AAAA,UACb,CAAC;AACD,kBAAQ,YAAY,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QACvD,SAAS,KAAK;AACZ,kBAAQ,YAAYA,YAAW,GAAG;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,CAAC,IAAI,UAAU,eAAe,CAAC,IAAI,UAAU,eAAe;AAC9D,gBAAQ,qBAAqB,EAAE,QAAQ,SAAS,SAAS,iBAAiB;AAAA,MAC5E,WAAW,CAAC,IAAI,UAAU,eAAe,CAAC,IAAI,UAAU,eAAe;AACrE,gBAAQ,qBAAqB;AAAA,UAC3B,QAAQ;AAAA,UACR,SAAS;AAAA,QACX;AAAA,MACF,OAAO;AACL,YAAI;AACF,gBAAM,KAAK,kBAA2B,4CAA4C;AAAA,YAChF,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,OAAO;AAAA,cACP,4BAA4B;AAAA,YAC9B;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AACD,kBAAQ,qBAAqB,EAAE,QAAQ,SAAS,SAAS,KAAK;AAAA,QAChE,SAAS,KAAK;AACZ,kBAAQ,qBAAqBA,YAAW,GAAG;AAAA,QAC7C;AAAA,MACF;AAGA,YAAM,WAAW,OAAO,OAAO,OAAO,EAAE,IAAI,OAAK,EAAE,MAAM;AACzD,UAAI,SAAS,SAAS,SAAS,EAAG,SAAQ,WAAW,SAAS;AAAA,eACrD,SAAS,SAAS,OAAO,EAAG,SAAQ,WAAW,SAAS;AAEjE,UAAI,QAAQ,WAAW,SAAS;AAE9B,cAAM,WAAW,CAAC,QAAQ,aAAa,UAAU,cAAc,SAAS,OAAO,OAAO,WAAW,WAAW,eAAe,aAAa,cAAc,YAAY,cAAc,aAAa,aAAa,oBAAoB;AAC9N,cAAM,aAAa;AACnB,cAAM,cAAc;AACpB,mBAAW,OAAO,UAAU;AAC1B,gBAAM,IAAI,QAAQ,GAAG;AACrB,cAAI,CAAC,EAAG;AACR,gBAAM,QAAQ,IAAI,OAAO,UAAU;AACnC,gBAAM,gBACJ,EAAE,WAAW,UAAY,MAAM,MAAM,QAAQ,OAAO,WAAW,CAAC,IAChE,EAAE,WAAW,UAAY,MAAM,KAAK,QAAQ,OAAO,WAAW,CAAC,IAC/D,EAAE,WAAW,YAAY,MAAM,IAAI,UAAU,OAAO,WAAW,CAAC,IACvC,MAAM,OAAO,QAAQ,OAAO,WAAW,CAAC;AACnE,kBAAQ,OAAO,MAAM,KAAK,KAAK,GAAG,aAAa,GAAG,EAAE,OAAO;AAAA,CAAI;AAAA,QACjE;AACA,gBAAQ,OAAO,MAAM,IAAI;AAAA,MAC3B,OAAO;AAEL,YAAI,KAAK,QAAQ;AACf,gBAAM,WAAW,CAAC,QAAQ,aAAa,UAAU,cAAc,SAAS,OAAO,OAAO,WAAW,WAAW,eAAe,aAAa,cAAc,YAAY,cAAc,aAAa,aAAa,oBAAoB;AAC9N,gBAAM,aAAa;AACnB,gBAAM,cAAc;AACpB,qBAAW,OAAO,UAAU;AAC1B,kBAAM,IAAI,QAAQ,GAAG;AACrB,gBAAI,CAAC,EAAG;AACR,kBAAM,QAAQ,IAAI,OAAO,UAAU;AACnC,kBAAM,gBACJ,EAAE,WAAW,UAAY,MAAM,MAAM,QAAQ,OAAO,WAAW,CAAC,IAChE,EAAE,WAAW,UAAY,MAAM,KAAK,QAAQ,OAAO,WAAW,CAAC,IAC/D,EAAE,WAAW,YAAY,MAAM,IAAI,UAAU,OAAO,WAAW,CAAC,IACvC,MAAM,OAAO,QAAQ,OAAO,WAAW,CAAC;AACnE,oBAAQ,OAAO,MAAM,KAAK,KAAK,GAAG,aAAa,GAAG,EAAE,OAAO;AAAA,CAAI;AAAA,UACjE;AACA,kBAAQ,OAAO,MAAM,IAAI;AAAA,QAC3B;AACA,gBAAQ,SAAS,UAAU,SAAS,KAAK;AAAA,MAC3C;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,SAAS,KAAK;AAAA,IACpC;AAAA,EACF,CAAC;AACL;AAEA,SAAS,iBAAiB,KAAqB;AAC7C,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,gBAAgB,KAAK,OAAO,IAAI,UAAU,WAAW,OAAO;AACrE;AAEA,eAAe,iBAAiB,OAA8B;AAC5D,UAAQ,OAAO,MAAM,mDAA8C;AAEnE,UAAQ,OAAO,MAAM,8PAAsD;AAC3E,QAAM,YAAY,MAAM,MAAM;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,SAAS,MAAM,MAAM;AAAA,IACzB,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,UAAQ,OAAO,MAAM,oRAAwD;AAC7E,QAAM,cAAc,MAAM,MAAM;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,eAAe,MAAM,SAAS;AAAA,IAClC,SAAS;AAAA,EACX,CAAC;AAED,UAAQ,OAAO,MAAM,2PAAwD;AAC7E,QAAM,mBAAmB,MAAM,MAAM;AAAA,IACnC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,eAAe,MAAM,SAAS;AAAA,IAClC,SAAS;AAAA,EACX,CAAC;AAED,UAAQ,OAAO,MAAM,0QAAwD;AAC7E,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAElB,MAAI,WAAW;AACb,oBAAgB,MAAM,MAAM;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,kBAAc,MAAM,SAAS;AAAA,MAC3B,SAAS;AAAA,IACX,CAAC;AAED,QAAI,iBAAiB,aAAa;AAChC,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,QAAQ;AAAA,YACN,SAAS,iBAAiB,aAAa;AAAA,YACvC,OAAO;AAAA,UACT;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,OAAgB,OAAO;AACtC,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACvF,aAAK,0GAA0G;AAAA,MACjH;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,sPAAwD;AAC7E,QAAM,oBAAoB,MAAM,MAAM;AAAA,IACpC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,qBAAqB,MAAM,SAAS;AAAA,IACxC,SAAS;AAAA,EACX,CAAC;AAED,UAAQ,OAAO,MAAM,iPAAwD;AAC7E,QAAM,iBAAiB,MAAM,QAAQ;AAAA,IACnC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,qBAAqB;AACzB,MAAI,mBAAmB;AACvB,MAAI,UAAU;AACd,MAAI,YAAY;AAChB,MAAI,YAAY;AAEhB,MAAI,gBAAgB;AAClB,yBAAqB,MAAM,MAAM;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,uBAAmB,MAAM,SAAS;AAAA,MAChC,SAAS;AAAA,IACX,CAAC;AAED,YAAQ,OAAO,MAAM,qEAAsE;AAE3F,UAAM,SAAS,MAAM,QAAQ,EAAE,SAAS,wCAAwC,SAAS,KAAK,CAAC;AAC/F,QAAI,QAAQ;AACV,gBAAU,MAAM,MAAM,EAAE,SAAS,0BAA0B,SAAS,aAAa,CAAC;AAAA,IACpF;AAEA,UAAM,WAAW,MAAM,QAAQ,EAAE,SAAS,0CAA0C,SAAS,MAAM,CAAC;AACpG,QAAI,UAAU;AACZ,kBAAY,MAAM,MAAM,EAAE,SAAS,4BAA4B,SAAS,eAAe,CAAC;AAAA,IAC1F;AAEA,UAAM,WAAW,MAAM,QAAQ,EAAE,SAAS,0CAA0C,SAAS,MAAM,CAAC;AACpG,QAAI,UAAU;AACZ,kBAAY,MAAM,MAAM,EAAE,SAAS,4BAA4B,SAAS,eAAe,CAAC;AAAA,IAC1F;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,2PAAwD;AAC7E,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,MAAI,UAAU;AACZ,mBAAe,MAAM,MAAM;AAAA,MACzB,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,iBAAa,MAAM,SAAS;AAAA,MAC1B,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,UAAQ,OAAO,MAAM,sPAAwD;AAC7E,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,aAAa;AACjB,MAAI,WAAW;AAEf,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,sDAAsD;AAC3E,UAAM,yBAAyB,MAAM,QAAQ;AAAA,MAC3C,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,wBAAwB;AAC1B,YAAM,gBAAgB,MAAM,SAAS;AAAA,QACnC,SAAS;AAAA,MACX,CAAC;AACD,YAAM,QAAQ,cAAc,QAAQ,GAAG;AACvC,UAAI,QAAQ,GAAG;AACb,mBAAW,cAAc,MAAM,GAAG,KAAK;AACvC,qBAAa,cAAc,MAAM,QAAQ,CAAC;AAAA,MAC5C;AAAA,IACF,OAAO;AACL,mBAAa,MAAM,MAAM;AAAA,QACvB,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAED,iBAAW,MAAM,SAAS;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,yMAAwD;AAC7E,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,aAAa;AACjB,MAAI,SAAS;AACb,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,kBAA0C,CAAC;AAC/C,MAAI,sBAAsE,CAAC;AAC3E,MAAI,qBAA4E,CAAC;AAEjF,MAAI,QAAQ;AACV,iBAAa,MAAM,MAAM;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,aAAS,MAAM,SAAS;AAAA,MACtB,SAAS;AAAA,IACX,CAAC;AAED,oBAAgB,MAAM,MAAM;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,iBAAa,MAAM,MAAM;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAGD,QAAI,cAAc,eAAe;AAC/B,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,KAAK;AAAA,YACH,SAAS,iBAAiB,UAAU;AAAA,YACpC,KAAK,UAAU;AAAA,YACf,cAAc,CAAC;AAAA,YACf,kBAAkB,CAAC;AAAA,YACnB,iBAAiB,CAAC;AAAA,UACpB;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,WAAW,IAAI,cAAc,QAAQ;AAC3C,cAAM,SAAS,kBAAkB,aAAa;AAC9C,gBAAQ,OAAO,MAAM,gBAAgB;AAGrC,YAAI,YAAY;AACd,gBAAM,aAAa,MAAM,QAAQ;AAAA,YAC/B,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAED,cAAI,YAAY;AACd,oBAAQ,OAAO,MAAM,4CAA4C;AACjE,kBAAM,WAAW,IAAI,cAAc,QAAQ;AAC3C,kCAAsB,MAAM,eAAe,UAAU,aAAa;AAClE,oBAAQ,OAAO,MAAM,WAAW,oBAAoB,MAAM;AAAA,CAAY;AACtE,iCAAqB,MAAM,cAAc,UAAU,eAAe,UAAU;AAC5E,oBAAQ,OAAO,MAAM,WAAW,mBAAmB,MAAM;AAAA,CAAqB;AAE9E,kBAAM,YAAY,MAAM,QAAQ;AAAA,cAC9B,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AACD,gBAAI,WAAW;AACb,gCAAkB,oBAAoB,mBAAgE;AACtG,sBAAQ,OAAO,MAAM,eAAe,OAAO,KAAK,eAAe,EAAE,MAAM;AAAA,CAAa;AAAA,YACtF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,aAAK,sCAAsC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC7F,aAAK,gHAAgH;AAAA,MACvH;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,qQAAwD;AAC7E,QAAM,aAAa,MAAM,QAAQ;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,iBAAiB;AACrB,MAAI,kBAAkB;AACtB,MAAI,kBAAkB;AAEtB,MAAI,YAAY;AACd,qBAAiB,MAAM,MAAM;AAAA,MAC3B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,sBAAkB,MAAM,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,sBAAkB,MAAM,SAAS;AAAA,MAC/B,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,UAAQ,OAAO,MAAM,oMAAwD;AAC7E,QAAM,aAAa,MAAM,QAAQ;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,iBAAiB;AACrB,MAAI,aAAa;AACjB,MAAI,kBAAkB;AACtB,MAAI,kBAAkB;AACtB,MAAI,oBAAoB;AACxB,MAAI,oBAAoB;AAExB,MAAI,YAAY;AACd,qBAAiB,MAAM,MAAM;AAAA,MAC3B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,sBAAkB,MAAM,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,iBAAiB;AACnB,wBAAkB,MAAM,SAAS;AAAA,QAC/B,SAAS;AAAA,QACT,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK;AAAA,MACnC,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,MAAM,SAAS;AAAA,QAC1B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,wBAAoB,MAAM,MAAM;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,wBAAoB,MAAM,MAAM;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,UAAM,iBAAiB,mBAAmB,cAAe,mBAAmB;AAC5E,QAAI,gBAAgB;AAClB,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,SAAS;AAAA,YACP,SAAS,iBAAiB,cAAc;AAAA,YACxC,KAAK,cAAc;AAAA,YACnB,UAAU,mBAAmB;AAAA,YAC7B,UAAU,mBAAmB;AAAA,UAC/B;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,QAAiB,kBAAkB;AAClD,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,iCAAiC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACxF,aAAK,gHAAgH;AAAA,MACvH;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,2PAAwD;AAC7E,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,mBAAmB;AACvB,MAAI,sBAAsB;AAC1B,MAAI,kBAAkB;AACtB,MAAI,oBAAoB;AACxB,MAAI,wBAAwB;AAE5B,MAAI,cAAc;AAChB,uBAAmB,MAAM,MAAM;AAAA,MAC7B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,0BAAsB,MAAM,MAAM;AAAA,MAChC,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,sBAAkB,MAAM,SAAS;AAAA,MAC/B,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,iBAAiB;AACpB,0BAAoB,MAAM,MAAM;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAED,8BAAwB,MAAM,SAAS;AAAA,QACrC,SAAS;AAAA,QACT,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK;AAAA,MACnC,CAAC;AAAA,IACH;AAEA,QAAI,oBAAoB,wBAAwB,mBAAoB,qBAAqB,wBAAyB;AAChH,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,WAAW;AAAA,YACT,SAAS,iBAAiB,gBAAgB;AAAA,YAC1C,YAAY;AAAA,YACZ,QAAQ,mBAAmB;AAAA,YAC3B,UAAU;AAAA,YACV,cAAc;AAAA,UAChB;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,UAAmB,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AAC3E,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,mCAAmC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1F,aAAK,gHAAgH;AAAA,MACvH;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,sPAAwD;AAC7E,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,oBAAoB;AACxB,MAAI,qBAAqB;AACzB,MAAI,qBAAqB;AACzB,MAAI,qBAAqB;AAEzB,MAAI,eAAe;AACjB,wBAAoB,MAAM,MAAM;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,yBAAqB,MAAM,MAAM;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,UAAM,aAAa,MAAM,QAAQ;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,YAAY;AACd,2BAAqB,MAAM,SAAS;AAAA,QAClC,SAAS;AAAA,QACT,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK;AAAA,MACnC,CAAC;AAAA,IACH,OAAO;AACL,2BAAqB,MAAM,SAAS;AAAA,QAClC,SAAS;AAAA,QACT,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK;AAAA,MACnC,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,qBAAqB,uBAAuB,sBAAsB;AACrF,QAAI,YAAY;AACd,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,YAAY;AAAA,YACV,SAAS,iBAAiB,iBAAiB;AAAA,YAC3C,UAAU;AAAA,YACV,UAAU,sBAAsB;AAAA,YAChC,UAAU,sBAAsB;AAAA,UAClC;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,WAAoB,iCAAiC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,CAAC;AACpG,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,oCAAoC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC3F,aAAK,gHAAgH;AAAA,MACvH;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,8MAAwD;AAC7E,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,oBAAoB;AACxB,MAAI,qBAAqB;AACzB,MAAI,qBAAqB;AAEzB,MAAI,eAAe;AACjB,YAAQ,OAAO,MAAM,kFAAkF;AAEvG,wBAAoB,MAAM,MAAM;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,yBAAqB,MAAM,MAAM;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,yBAAqB,MAAM,SAAS;AAAA,MAClC,SAAS;AAAA,IACX,CAAC;AAED,QAAI,qBAAqB,sBAAsB,oBAAoB;AACjE,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,YAAY;AAAA,YACV,SAAS,iBAAiB,iBAAiB;AAAA,YAC3C,UAAU;AAAA,YACV,UAAU;AAAA,UACZ;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,WAAoB,wBAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AACnF,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,4CAA4C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACnG,aAAK,gHAAgH;AAAA,MACvH;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,uOAAwD;AAC7E,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,kBAAkB;AACtB,MAAI,kBAAkB;AACtB,MAAI,mBAAmB;AACvB,MAAI,iBAAiB;AACrB,MAAI,qBAAqB;AAEzB,MAAI,aAAa;AACf,YAAQ,OAAO,MAAM,6EAAwE;AAE7F,sBAAkB,MAAM,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,UAAU,CAAC,MAAc,EAAE,KAAK,IAAI,OAAO;AAAA,MAC3C,SAAS;AAAA,IACX,CAAC;AAED,sBAAkB,MAAM,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,uBAAmB,MAAM,MAAM;AAAA,MAC7B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,qBAAiB,MAAM,SAAS;AAAA,MAC9B,SAAS;AAAA,IACX,CAAC;AAED,yBAAqB,MAAM,SAAS;AAAA,MAClC,SAAS;AAAA,IACX,CAAC;AAED,UAAM,mBAAmB,mBAAmB,oBAAoB,kBAAkB;AAClF,QAAI,kBAAkB;AACpB,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,UAAU;AAAA,YACR,SAAS,iBAAiB,eAAe,KAAK;AAAA,YAC9C,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,SAAkB,oBAAoB,eAAe,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;AAC7G,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACzF,aAAK,wGAAwG;AAAA,MAC/G;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,0LAAwD;AAC7E,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,mBAAmB;AACvB,MAAI,iBAAiB;AAErB,MAAI,cAAc;AAChB,YAAQ,OAAO,MAAM,oFAAoF;AAEzG,uBAAmB,MAAM,MAAM;AAAA,MAC7B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,qBAAiB,MAAM,SAAS;AAAA,MAC9B,SAAS;AAAA,IACX,CAAC;AAED,QAAI,oBAAoB,gBAAgB;AACtC,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,WAAW;AAAA,YACT,SAAS,iBAAiB,gBAAgB;AAAA,YAC1C,OAAO;AAAA,UACT;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,UAAmB,SAAS;AAC3C,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,mCAAmC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1F,aAAK,0GAA0G;AAAA,MACjH;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,2PAAwD;AAC7E,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,mBAAmB;AACvB,MAAI,oBAAoB;AACxB,MAAI,uBAAuB;AAC3B,MAAI,yBAAyB;AAE7B,MAAI,cAAc;AAChB,uBAAmB,MAAM,MAAM;AAAA,MAC7B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,wBAAoB,MAAM,SAAS;AAAA,MACjC,SAAS;AAAA,IACX,CAAC;AACD,UAAM,kBAAkB,MAAM,QAAQ;AAAA,MACpC,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,QAAI,iBAAiB;AACnB,6BAAuB,MAAM,MAAM;AAAA,QACjC,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,+BAAyB,MAAM,SAAS;AAAA,QACtC,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,oBAAoB,mBAAmB;AACzC,cAAQ,OAAO,MAAM,+BAA+B;AACpD,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,GAAG,WAAW;AAAA,UACd,WAAW;AAAA,YACT,SAAS,iBAAiB,gBAAgB;AAAA,YAC1C,UAAU;AAAA,YACV,aAAa,iBAAiB,oBAAoB,KAAK;AAAA,YACvD,eAAe,0BAA0B;AAAA,UAC3C;AAAA,QACF;AACA,cAAM,WAAW,iBAAiB,UAAoD;AACtF,cAAM,SAAS,UAAmB,oBAAoB;AAAA,UACpD,QAAQ,EAAE,gBAAgB,mBAAmB,UAAU,EAAE;AAAA,QAC3D,CAAC;AACD,gBAAQ,OAAO,MAAM,gBAAgB;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,mCAAmC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAC1F,aAAK,uFAAuF;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,gQAAwD;AAC7E,QAAM,cAAc,MAAM,MAAM;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,eAAe,WAAW,MAAM,MAAM;AAAA,IAC1C,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC,IAAI;AAEL,QAAM,aAAa,SAAS,MAAM,MAAM;AAAA,IACtC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC,IAAI;AAEL,UAAQ,OAAO,MAAM,IAAI;AACzB,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,CAAC,WAAW;AACd,YAAQ,OAAO,MAAM,YAAY;AACjC,YAAQ,WAAW,SAAS;AAC5B;AAAA,EACF;AAEA,oBAAkB;AAAA,IAChB,MAAM;AAAA,MACJ,OAAO,aAAa;AAAA,MACpB,QAAQ,UAAU;AAAA,IACpB;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,iBAAiB,WAAW,KAAK;AAAA,MAC1C,UAAU,gBAAgB;AAAA,IAC5B;AAAA,IACA,WAAW;AAAA,MACT,SAAS,iBAAiB,gBAAgB,KAAK;AAAA,MAC/C,KAAK,gBAAgB;AAAA,IACvB;AAAA,IACA,GAAI,aAAa,gBAAgB;AAAA,MAC/B,QAAQ;AAAA,QACN,SAAS,iBAAiB,aAAa;AAAA,QACvC,OAAO,eAAe;AAAA,MACxB;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,qBAAqB,qBAAqB;AAAA,MAC5C,YAAY;AAAA,QACV,SAAS,iBAAiB,iBAAiB,KAAK;AAAA,QAChD,UAAU,sBAAsB;AAAA,MAClC;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,iBAAiB;AAAA,MACnB,aAAa;AAAA,QACX,SAAS,iBAAiB,kBAAkB,KAAK;AAAA,QACjD,OAAO,oBAAoB;AAAA,QAC3B,SAAS,WAAW;AAAA,QACpB,WAAW,aAAa;AAAA,QACxB,WAAW,aAAa;AAAA,MAC1B;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,WAAW;AAAA,MACb,OAAO;AAAA,QACL,SAAS,iBAAiB,YAAY,KAAK;AAAA,QAC3C,OAAO,cAAc;AAAA,MACvB;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,UAAU,YAAY,aAAa;AAAA,MACrC,KAAK;AAAA,QACH,YAAY,GAAG,QAAQ,IAAI,UAAU;AAAA,MACvC;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,UAAU,aAAa;AAAA,MACzB,KAAK;AAAA,QACH,SAAS,iBAAiB,UAAU;AAAA,QACpC,GAAI,SAAS,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA,QAChC,GAAI,OAAO,KAAK,eAAe,EAAE,SAAS,EAAE,cAAc,gBAAgB,IAAI,CAAC;AAAA,QAC/E,GAAI,oBAAoB,SAAS,EAAE,kBAAkB,oBAAoB,IAAI,CAAC;AAAA,QAC9E,GAAI,mBAAmB,SAAS,EAAE,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,MAC7E;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,cAAc,iBAAiB;AAAA,MACjC,SAAS;AAAA,QACP,SAAS,iBAAiB,cAAc;AAAA,QACxC,GAAI,kBAAkB,EAAE,UAAU,gBAAgB,IAAI,CAAC;AAAA,QACvD,GAAI,kBAAkB,EAAE,UAAU,gBAAgB,IAAI,CAAC;AAAA,MACzD;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,cAAc,iBAAiB;AAAA,MACjC,SAAS;AAAA,QACP,SAAS,iBAAiB,cAAc;AAAA,QACxC,GAAI,aAAa,EAAE,KAAK,WAAW,IAAI,CAAC;AAAA,QACxC,GAAI,kBAAkB,EAAE,UAAU,gBAAgB,IAAI,CAAC;AAAA,QACvD,GAAI,kBAAkB,EAAE,UAAU,gBAAgB,IAAI,CAAC;AAAA,MACzD;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,gBAAgB,mBAAmB;AAAA,MACrC,WAAW;AAAA,QACT,SAAS,iBAAiB,gBAAgB;AAAA,QAC1C,YAAY,uBAAuB;AAAA,QACnC,QAAQ,mBAAmB;AAAA,QAC3B,UAAU,qBAAqB;AAAA,QAC/B,cAAc,yBAAyB;AAAA,MACzC;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,iBAAiB,oBAAoB;AAAA,MACvC,YAAY;AAAA,QACV,SAAS,iBAAiB,iBAAiB;AAAA,QAC3C,UAAU,sBAAsB;AAAA,QAChC,GAAI,qBAAqB,EAAE,UAAU,mBAAmB,IAAI,CAAC;AAAA,QAC7D,GAAI,qBAAqB,EAAE,UAAU,mBAAmB,IAAI,CAAC;AAAA,MAC/D;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,eAAe,kBAAkB;AAAA,MACnC,UAAU;AAAA,QACR,GAAI,kBAAkB,EAAE,SAAS,iBAAiB,eAAe,EAAE,IAAI,CAAC;AAAA,QACxE,SAAS;AAAA,QACT,UAAU,oBAAoB;AAAA,QAC9B,QAAQ,kBAAkB;AAAA,QAC1B,YAAY,sBAAsB;AAAA,MACpC;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,iBAAiB,oBAAoB;AAAA,MACvC,YAAY;AAAA,QACV,SAAS,iBAAiB,iBAAiB;AAAA,QAC3C,UAAU,sBAAsB;AAAA,QAChC,UAAU,sBAAsB;AAAA,MAClC;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,gBAAgB,mBAAmB;AAAA,MACrC,WAAW;AAAA,QACT,SAAS,iBAAiB,gBAAgB;AAAA,QAC1C,OAAO,kBAAkB;AAAA,MAC3B;AAAA,IACF,IAAI,CAAC;AAAA,IACL,GAAI,gBAAgB,mBAAmB;AAAA,MACrC,WAAW;AAAA,QACT,SAAS,iBAAiB,gBAAgB;AAAA,QAC1C,UAAU,qBAAqB;AAAA,QAC/B,aAAa,iBAAiB,oBAAoB,KAAK;AAAA,QACvD,eAAe,0BAA0B;AAAA,MAC3C;AAAA,IACF,IAAI,CAAC;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,SAAS,eAAe;AAAA,MAC1B;AAAA,MACA,GAAI,YAAY,eAAe;AAAA,QAC7B,OAAO;AAAA,UACL,SAAS,gBAAgB;AAAA,QAC3B;AAAA,MACF,IAAI,CAAC;AAAA,MACL,GAAI,UAAU,aAAa;AAAA,QACzB,KAAK;AAAA,UACH,SAAS,cAAc;AAAA,QACzB;AAAA,MACF,IAAI,CAAC;AAAA,MACL,GAAI,WAAW,iBAAiB,cAAc;AAAA,QAC5C,KAAK;AAAA,UACH,YAAY,iBAAiB;AAAA,UAC7B,SAAS,cAAc;AAAA,QACzB;AAAA,MACF,IAAI,CAAC;AAAA,MACL,GAAI,eAAe,qBAAqB,qBAAqB;AAAA,QAC3D,SAAS;AAAA,UACP,aAAa,qBAAqB;AAAA,UAClC,aAAa,qBAAqB;AAAA,QACpC;AAAA,MACF,IAAI,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AAED,QAAM,aAAa,oBAAoB;AACvC,OAAK,qBAAqB,UAAU,EAAE;AACtC,UAAQ,EAAE,SAAS,WAAW,GAAG,UAAU,QAAQ,KAAK;AAC1D;AAEA,eAAe,eAAe,OAA8B;AAC1D,UAAQ,OAAO,MAAM,wDAAmD;AAExE,QAAM,cAAc,MAAM,MAAM;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,gBAAgB,MAAM,MAAM;AAAA,IAChC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,eAAe,MAAM,MAAM;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,eAAe,MAAM,MAAM;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,oBAAoB,MAAM,MAAM;AAAA,IACpC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,iBAAiB,MAAM,MAAM;AAAA,IACjC,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,cAAc,MAAM,MAAM;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,CAAC,WAAW;AACd,YAAQ,OAAO,MAAM,YAAY;AACjC,YAAQ,WAAW,SAAS;AAC5B;AAAA,EACF;AAGA,MAAIH,IAAG,WAAW,aAAa,GAAG;AAChC,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,WAAW;AACd,cAAQ,OAAO,MAAM,YAAY;AACjC,cAAQ,WAAW,SAAS;AAC9B;AAAA,IACA;AAAA,EACF;AAEA,kBAAgB;AAAA,IACd,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,SAAS,eAAe;AAAA,QACxB,WAAW,iBAAiB;AAAA,QAC5B,UAAU,gBAAgB;AAAA,MAC5B;AAAA,MACA,WAAW;AAAA,QACT,cAAc,gBAAgB;AAAA,MAChC;AAAA,MACA,GAAI,qBAAqB,kBAAkB,cAAc;AAAA,QACvD,KAAK;AAAA,UACH,YAAY,qBAAqB;AAAA,UACjC,SAAS,kBAAkB;AAAA,UAC3B,MAAM,eAAe;AAAA,QACvB;AAAA,MACF,IAAI,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AAED,UAAQ,EAAE,SAAS,cAAc,GAAG,UAAU,QAAQ,KAAK;AAC7D;;;AG9iDA,IAAMI,OAAM;AAEL,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAIpB,MAAM,UAAU,YAAoB,SAAwC;AAC1E,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,uCAAuCA,IAAG;AAAA,IAC7G;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAQ,YAAoB,SAAiB,QAAqC;AACtF,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,MAAM,CAAC,gBAAgBA,IAAG;AAAA,IAC3I;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAoB,SAAiB,MAAmC;AACvF,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,uCAAuCA,IAAG;AAAA,MAC3G,EAAE,QAAQ,QAAQ,MAAM,EAAE,KAAK,EAAE;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,QACJ,YACA,SACA,MACA,OAA2E,CAAC,GACjD;AAC3B,WAAO,KAAK,KAAK,YAA4B,OAAO,UAAU;AAC5D,YAAM,SAAgE;AAAA,QACpE,eAAeA;AAAA,QACf,yBAAyB,KAAK,UAAU;AAAA,QACxC,GAAI,KAAK,eAAe,EAAE,4BAA4B,KAAK,aAAa,IAAI,CAAC;AAAA,QAC7E,GAAI,KAAK,gBAAgB,EAAE,6BAA6B,KAAK,cAAc,IAAI,CAAC;AAAA,QAChF,GAAI,QAAQ,EAAE,mBAAmB,MAAM,IAAI,CAAC;AAAA,MAC9C;AACA,aAAO,KAAK,KAAK;AAAA,QACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC;AAAA,QACpH,EAAE,OAAO;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,YAAoB,SAAiB,MAAc,MAAuC;AACpG,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,gBAAgBA,IAAG;AAAA,IAC9J;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,YACA,SACA,MACA,MAQyB;AACzB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,6BAA6BA,IAAG;AAAA,MACpJ,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,YACA,SACA,MACA,MACA,MACyB;AACzB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,gBAAgBA,IAAG;AAAA,MAC5J,EAAE,QAAQ,SAAS,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,YACA,SACA,MACA,MACA,uBACA,mBACyB;AACzB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,gBAAgBA,IAAG;AAAA,MAC5J;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,uBAAuB,EAAE,UAAU,sBAAsB;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,YAAoB,SAAiB,MAAc,MAAuC;AACxG,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,gBAAgBA,IAAG;AAAA,MAC5J,EAAE,QAAQ,SAAS,MAAM,EAAE,QAAQ,YAAY,EAAE;AAAA,IACnD;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,UACJ,YACA,SACA,MACA,MACA,YACA,MACkB;AAClB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,cAAc,mBAAmB,UAAU,CAAC,gBAAgBA,IAAG;AAAA,MACxM,EAAE,QAAQ,OAAO,MAAM,EAAE,KAAK,EAAE;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,YAAoB,SAAiB,MAAc,MAAkC;AACvG,UAAM,KAAK,MAAM,KAAK,MAAM,YAAY,SAAS,MAAM,IAAI;AAC3D,WAAO,GAAG;AAAA,EACZ;AAAA;AAAA,EAIA,MAAM,YAAY,YAAoB,SAAiB,MAAc,MAAsC;AACzG,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,wBAAwBA,IAAG;AAAA,IACtK;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,aACJ,YACA,SACA,MACA,MACA,MAWsB;AACtB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,wBAAwBA,IAAG;AAAA,MACpK,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,YACA,SACA,MACA,MACA,UACA,SACuB;AACvB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,YAAY,QAAQ,yBAAyBA,IAAG;AAAA,MACzL,EAAE,QAAQ,QAAQ,MAAM,EAAE,SAAS,aAAa,OAAO,EAAE;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,YACA,SACA,MACA,MACA,UACA,QACsB;AACtB,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,YAAY,QAAQ,gBAAgBA,IAAG;AAAA,MAChL,EAAE,QAAQ,SAAS,MAAM,EAAE,OAAO,EAAE;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,YACA,SACA,MACA,MACA,UACA,WACe;AACf,UAAM,KAAK,KAAK;AAAA,MACd,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,YAAY,QAAQ,aAAa,SAAS,gBAAgBA,IAAG;AAAA,MACtM,EAAE,QAAQ,SAAS;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,UAAU,YAAoB,SAAiB,MAAc,MAAmC;AACpG,UAAM,KAAK,MAAM,KAAK,MAAM,YAAY,SAAS,MAAM,IAAI;AAC3D,UAAM,eAAe,GAAG,uBAAuB;AAC/C,UAAM,eAAe,GAAG,uBAAuB;AAC/C,QAAI,CAAC,gBAAgB,CAAC,aAAc,QAAO,EAAE,SAAS,CAAC,GAAG,YAAY,GAAG,aAAa,EAAE;AACxF,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,8BAA8B,mBAAmB,YAAY,CAAC,yCAAyC,mBAAmB,YAAY,CAAC,yCAAyCA,IAAG;AAAA,IACzS;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,YAAoB,SAAiB,MAAc,UAA2C;AACpH,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,YAAY,mBAAmB,QAAQ,CAAC,yBAAyBA,IAAG;AAAA,IAC1L;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,cAAc,YAAoB,SAAiB,MAAc,MAAuC;AAC5G,UAAM,aAAa,MAAM,KAAK,KAAK;AAAA,MACjC,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,2BAA2BA,IAAG;AAAA,IACzK;AAEA,UAAM,YAAY,WAAW,SAAS,CAAC,GAAG,GAAG,EAAE,GAAG;AAClD,QAAI,CAAC,SAAU,QAAO,CAAC;AACvB,UAAM,UAAU,MAAM,KAAK,KAAK;AAAA,MAC9B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,2BAA2B,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,eAAe,QAAQ,wBAAwBA,IAAG;AAAA,IAC7L;AACA,WAAO,QAAQ,iBAAiB,CAAC;AAAA,EACnC;AACF;;;ACvPA,IAAMC,OAAM;AAEL,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAIpB,MAAM,gBAAgB,YAAoB,SAAgD;AACxF,WAAO,KAAK,KAAK,YAAgC,OAAO,UAAU;AAChE,YAAM,SAAgE;AAAA,QACpE,eAAeA;AAAA,QACf,GAAI,QAAQ,EAAE,mBAAmB,MAAM,IAAI,CAAC;AAAA,MAC9C;AACA,aAAO,KAAK,KAAK;AAAA,QACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC;AAAA,QACjE,EAAE,OAAO;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,YAAoB,SAAiB,IAAyC;AAChG,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,4BAA4B,EAAE,gBAAgBA,IAAG;AAAA,IACpH;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,WACJ,YACA,SACA,cACA,OAAuD,CAAC,GACrC;AACnB,UAAM,OAAgC;AAAA,MACpC,YAAY,EAAE,IAAI,aAAa;AAAA,MAC/B,GAAI,KAAK,eAAe,EAAE,cAAc,KAAK,aAAa,IAAI,CAAC;AAAA,MAC/D,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,IAC3D;AACA,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,mCAAmCA,IAAG;AAAA,MACvG,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,YACA,SACA,OAA+F,CAAC,GAC3E;AACrB,UAAM,aAAoE;AAAA,MACxE,eAAeA;AAAA,MACf,GAAI,KAAK,eAAe,SAAS,EAAE,aAAa,KAAK,cAAc,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,MAClF,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,MACzD,GAAI,KAAK,eAAe,EAAE,cAAc,KAAK,aAAa,IAAI,CAAC;AAAA,MAC/D,GAAI,KAAK,MAAM,EAAE,QAAQ,KAAK,IAAI,IAAI,CAAC;AAAA,IACzC;AAKA,QAAI,KAAK,KAAK;AACZ,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,QAC/B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC;AAAA,QACjE,EAAE,QAAQ,WAAW;AAAA,MACvB;AACA,cAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG;AAAA,IAC7C;AAEA,WAAO,KAAK,KAAK,YAAsB,OAAO,UAAU;AACtD,YAAM,SAAS,EAAE,GAAG,YAAY,GAAI,QAAQ,EAAE,mBAAmB,MAAM,IAAI,CAAC,EAAG;AAC/E,aAAO,KAAK,KAAK;AAAA,QACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC;AAAA,QACjE,EAAE,OAAO;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,YAAoB,SAAiB,SAAoC;AACtF,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,uBAAuB,OAAO,gBAAgBA,IAAG;AAAA,IACpH;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,YAAoB,SAAiB,SAAoC;AACzF,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,uBAAuB,OAAO,gBAAgBA,IAAG;AAAA,MAClH,EAAE,QAAQ,SAAS,MAAM,EAAE,QAAQ,aAAa,EAAE;AAAA,IACpD;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,SAAS,YAAoB,SAAiB,SAAyC;AAC3F,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,uBAAuB,OAAO,qBAAqBA,IAAG;AAAA,IACzH;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAO,YAAoB,SAAiB,SAAiB,OAAgC;AACjG,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC,uBAAuB,OAAO,SAAS,KAAK,gBAAgBA,IAAG;AAAA,IAClI;AAAA,EACF;AACF;;;ACpFO,SAAS,cAAcC,UAAkB,cAAc,OAAmB;AAC/E,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,QAAM,MAAM,cAAc,MAAM;AAEhC,QAAM,aACJ,KAAK,cAAc,KAAK,gBACxB,KAAK,KAAK,cACV,OAAO,SAAS,KAAK,cAAc;AAErC,QAAM,UACJ,KAAK,WACL,KAAK,KAAK,WACV,OAAO,SAAS,KAAK,WAAW;AAElC,QAAM,OACJ,KAAK,QACL,KAAK,KAAK,QACV,OAAO,SAAS,KAAK,QAAQ;AAE/B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,CAAC,MAAM;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,IAAI,cAAc,IAAI;AAAA,IAClC,YAAY,IAAI,cAAc,IAAI;AAAA,IAClC,WAAW,IAAI,aAAa,IAAI;AAAA,IAChC,aAAa,IAAI,eAAe,IAAI;AAAA,EACtC;AACF;AAQO,SAASC,gBAAe,QAA0C;AACvE,QAAM,SAAiC,CAAC;AACxC,aAAW,KAAK,QAAQ;AACtB,UAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,QAAI,MAAM,EAAG,OAAM,IAAI,WAAW,0BAA0B,CAAC,kCAAkC,CAAC;AAChG,WAAO,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,MAAsB,EAAE,YAAY,EAAE,QAAQ,WAAW,EAAE;AAUpF,IAAM,4BAAoD,OAAO,YAAY,0BAA0B;AAUhG,SAAS,gBACd,QACA,cACe;AACf,QAAM,UAAU,EAAE,GAAG,2BAA2B,GAAG,aAAa;AAChE,SAAO,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAClD,QAAI,UAA8B,QAAQ,IAAI,YAAY,CAAC,KAAK,QAAQ,GAAG;AAC3E,QAAI,CAAC,SAAS;AACZ,YAAM,SAAS,gBAAgB,GAAG;AAClC,YAAM,QAAQ,OAAO,QAAQ,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,MAAM,gBAAgB,QAAQ,MAAM,MAAM;AAC/F,gBAAU,QAAQ,CAAC;AAAA,IACrB;AACA,WAAO,EAAE,IAAI,OAAgB,MAAM,WAAW,WAAW,GAAG,IAAI,MAAM;AAAA,EACxE,CAAC;AACH;AAUA,IAAM,0BAA0B,oBAAI,IAAI,CAAC,SAAS,eAAe,YAAY,cAAc,UAAU,CAAC;AAW/F,SAAS,0BACd,QACuE;AACvE,QAAM,UAAmC,CAAC;AAC1C,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,UAAM,QAAQ,iBAAiB,QAAQ;AACvC,UAAM,MAAM,OAAO,YAAY,EAAE,QAAQ,QAAQ,EAAE;AACnD,QAAI,wBAAwB,IAAI,GAAG,GAAG;AACpC,cAAQ,QAAQ,eAAe,aAAa,GAAG,IAAI;AAAA,IACrD,OAAO;AACL,aAAO,MAAM,IAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAIO,IAAM,UAAU;AAAA,EACrB,SAAS;AAAA,EACT,0BAA0B;AAAA,EAC1B,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,QAAQ;AACV;AAIA,IAAM,oBAAoB,oBAAI,IAAI,CAAC,WAAW,CAAC;AAExC,SAAS,gBAAgB,OAA0B;AACxD,SAAO,kBAAkB,IAAI,MAAM,MAAM;AAC3C;AAWA,eAAsB,kBACpB,aACA,YACA,MACY;AACZ,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,aAAa;AAChD,MAAI,SAAS,MAAM,YAAY;AAE/B,SAAO,CAAC,WAAW,MAAM,GAAG;AAC1B,QAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,YAAM,IAAI;AAAA,QACR,0CAA0C,KAAK,UAAU;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW,KAAK,OAAO,MAAM;AACjC,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,KAAK,UAAU,GAAI,CAAC;AACrE,aAAS,MAAM,YAAY;AAAA,EAC7B;AAEA,SAAO;AACT;;;ACtNO,SAAS,2BAA2B,KAAoB;AAC7D,QAAM,UAAU,IACb,QAAQ,SAAS,EACjB,YAAY,gDAAgD;AAE/D,UACG,QAAQ,kBAAkB,EAC1B,YAAY,4CAA4C,EACxD,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,WAAW,IAAI,cAAc,GAAG;AACxC,YAAM,OAAO,MAAM,WAAW,gBAAgB;AAC9C,cAAQ,MAAM,OAAO,4BAA4B,KAAK;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,4BAA4B,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,MAAM,WAAW,aAAa,UAAU;AACrD,cAAQ,MAAM,OAAO,gBAAgB,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,YAAY,4BAA4B,EACxC,eAAe,oBAAoB,cAAc,EACjD,OAAO,OAAO,SAA2B;AACxC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,MAAM,WAAW,WAAW,YAAY,KAAK,IAAI;AAC9D,cAAQ,MAAM,OAAO,eAAe,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AACL;;;AC7CA,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACGV,IAAM,6BAA6B;AAAA,EACxC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aACE;AAAA,EAGF,MAAM;AAAA,EACN,YAAY;AAAA,IACV,MAAM,EAAE,MAAM,UAAU,aAAa,2DAA2D;AAAA,IAChG,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MAOF,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA,sBAAsB;AACxB;AAEO,IAAM,8BAA8B;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,uBAAuB;AAAA,IACvB,UAAU;AAAA,IACV,yBAAyB;AAAA,EAC3B;AACF;;;ADtBO,SAAS,wBAAwB,KAAoB;AAC1D,QAAM,OAAO,IACV,QAAQ,MAAM,EACd,YAAY,mCAAmC;AAIlD,OACG,QAAQ,KAAK,EACb,YAAY,uBAAuB,EACnC,eAAe,YAAY,cAAc,EACzC,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,MAAM,WAAW,YAAY,YAAY,SAAS,KAAK,IAAI,EAAE,CAAC;AAC3E,cAAQ,MAAM,OAAO,YAAY,KAAK;AAAA,IACxC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,YAAY,KAAK;AAAA,IAAG;AAAA,EACvD,CAAC;AAIH,OACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,iBAAiB,0FAA0F,EAClH,OAAO,mBAAmB,8DAA8D,EACxF,OAAO,wBAAwB,aAAa,EAC5C,OAAO,qBAAqB,qCAAqC,EACjE,OAAO,kBAAkB,gBAAgB,EACzC,OAAO,iBAAiB,iEAA4D,EACpF,OAAO,wBAAwB,iCAAiC,CAAC,GAAW,QAAkB;AAAE,QAAI,KAAK,CAAC;AAAG,WAAO;AAAA,EAAK,GAAG,CAAC,CAAa,EAC1I,OAAO,uBAAuB,yIAAyI,EACvK,OAAO,OAAO,SAA8J;AAC3K,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAAO,CAAC;AAC3D,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAE7D,YAAM,YAAY,KAAK,YAAa,kBAAkB,KAAK,SAAS,IAA0B;AAC9F,YAAM,EAAE,SAAS,aAAa,QAAQ,WAAW,IAAI,WAAW,SAC5D,0BAA0B,UAAU,MAAM,IAC1C,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE9B,YAAM,OAAO,KAAK,QAAQ,WAAW;AACrC,UAAI,CAAC,KAAM,OAAM,IAAI,WAAW,+CAA+C,CAAC;AAEhF,YAAM,cAAuC;AAAA,QAC3C,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,QACxD,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,QAC1E,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACjE,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,MACnE;AACA,YAAM,EAAE,QAAQ,eAAe,WAAW,iBAAiB,IAAI,mBAAmB,aAAa,WAAW;AAC1G,UAAI,CAAC,cAAc,MAAO,OAAM,IAAI,WAAW,wDAAwD,CAAC;AAExG,YAAM,aAAaC,gBAAe,KAAK,KAAK;AAC5C,YAAM,EAAE,QAAQ,cAAc,WAAW,gBAAgB,IAAI,mBAAmB,YAAY,UAAU;AAEtG,YAAM,YAAY,CAAC,GAAG,kBAAkB,GAAG,eAAe;AAC1D,UAAI,UAAU,OAAQ,MAAK,kDAAkD,UAAU,KAAK,IAAI,CAAC,EAAE;AAKnG,YAAM,aAAa,CAAC,MAAwB,MAAM,UAAa,MAAM;AACrE,YAAM,UAAmC;AAAA,QACvC,gBAAgB,cAAc;AAAA,QAC9B,GAAI,WAAW,cAAc,WAAW,IAAI,EAAE,sBAAsB,cAAc,YAAY,IAAI,CAAC;AAAA,QACnG,GAAI,WAAW,cAAc,QAAQ,IAAI,EAAE,qBAAqB,cAAc,SAAS,IAAI,CAAC;AAAA,QAC5F,GAAI,WAAW,cAAc,QAAQ,IAAI,EAAE,kCAAkC,cAAc,SAAS,IAAI,CAAC;AAAA,MAC3G;AACA,YAAM,QAAQ,gBAAgB,cAAc,OAAO,IAAI,YAAY;AACnE,YAAM,QAAQ;AAAA,QACZ,GAAG,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,OAAgB,MAAM,WAAW,CAAC,IAAI,OAAO,EAAE,EAAE;AAAA,QACnG,GAAG;AAAA,MACL;AACA,YAAM,OAAO,MAAM,WAAW,eAAe,YAAY,SAAS,MAAM,KAAK;AAC7E,cAAQ,MAAM,OAAO,eAAe,OAAO,SAAS;AACpD,UAAI,KAAK,QAAQ;AACf,YAAI;AACF,gBAAM,UAAU,OAAO,IAAI,SAAS,QAAQ,OAAO,EAAE;AACrD,gBAAM,YAAY,GAAG,OAAO,IAAI,mBAAmB,UAAU,CAAC,wBAAwB,KAAK,MAAM;AACjG,gBAAM,YAAY,CAAC,EAAE,IAAI,OAAgB,MAAM,gBAAgB,OAAO,EAAE,KAAK,sCAAsC,KAAK,UAAU,EAAE,CAAC;AACrI,gBAAM,WAAW,eAAe,YAAY,KAAK,IAAI,SAAS;AAAA,QAChE,SAAS,SAAS;AAChB,eAAK,YAAY,KAAK,EAAE,iCAAiC,KAAK,MAAM,KAAK,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,EAAE;AAAA,QACjI;AAAA,MACF;AACA;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAIH,OACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,eAAe,YAAY,cAAc,EACzC,OAAO,wBAAwB,gCAAgC,CAAC,GAAW,QAAkB;AAAE,QAAI,KAAK,CAAC;AAAG,WAAO;AAAA,EAAK,GAAG,CAAC,CAAa,EACzI,OAAO,uBAAuB,sIAAsI,EACpK,OAAO,OAAO,SAA8D;AAC3E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAAO,CAAC;AAC3D,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AAEpD,YAAM,YAAY,KAAK,YAAa,kBAAkB,KAAK,SAAS,IAA0B;AAG9F,YAAM,aAAa,WAAW,SAC1B,OAAO,YAAY,OAAO,QAAQ,UAAU,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAC7F,CAAC;AACL,YAAM,aAAaA,gBAAe,KAAK,KAAK;AAC5C,YAAM,EAAE,QAAQ,UAAU,IAAI,mBAAmB,YAAY,UAAU;AACvE,UAAI,UAAU,OAAQ,MAAK,kDAAkD,UAAU,KAAK,IAAI,CAAC,EAAE;AAEnG,YAAM,QAAQ,gBAAgB,QAAQ,OAAO,IAAI,YAAY;AAC7D,YAAM,OAAO,MAAM,WAAW,eAAe,YAAY,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK;AACrF,cAAQ,MAAM,OAAO,eAAe,OAAO,SAAS;AAAA,IACtD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAIH,OACG,QAAQ,YAAY,EACpB,YAAY,8BAA8B,EAC1C,eAAe,YAAY,cAAc,EACzC,eAAe,mBAAmB,2CAA2C,EAC7E,OAAO,OAAO,SAAwC;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,QAAQ,CAAC,EAAE,IAAI,OAAgB,MAAM,wBAAwB,OAAO,KAAK,MAAM,CAAC;AACtF,YAAM,OAAO,MAAM,WAAW,eAAe,YAAY,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK;AACrF,cAAQ,MAAM,OAAO,mBAAmB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,mBAAmB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAIH,OACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,eAAe,YAAY,cAAc,EACzC,eAAe,eAAe,4BAA4B,EAC1D,OAAO,OAAO,SAAqC;AAClD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,QAAQ,CAAC,EAAE,IAAI,OAAgB,MAAM,6BAA6B,OAAO,KAAK,GAAG,CAAC;AACxF,YAAM,OAAO,MAAM,WAAW,eAAe,YAAY,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK;AACrF,cAAQ,MAAM,OAAO,eAAe,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAIH,OACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,eAAe,YAAY,qBAAqB,EAChD,eAAe,YAAY,qBAAqB,EAChD,OAAO,gBAAgB,2DAA2D,SAAS,EAC3F,OAAO,OAAO,SAAmD;AAChE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,WAAW,EAAE,YAAY,WAAW,OAAO,CAAC;AAC3D,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AAEpD,YAAM,SAAiC;AAAA,QACrC,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AACA,YAAM,MAAM,OAAO,KAAK,IAAI,KAAK,KAAK;AACtC,YAAM,UAAU,OAAO,IAAI,SAAS,QAAQ,OAAO,EAAE;AACrD,YAAM,YAAY,GAAG,OAAO,IAAI,mBAAmB,UAAU,CAAC,wBAAwB,KAAK,EAAE;AAC7F,YAAM,QAAQ,CAAC,EAAE,IAAI,OAAgB,MAAM,gBAAgB,OAAO,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC;AAC3F,YAAM,OAAO,MAAM,WAAW,eAAe,YAAY,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK;AACrF,cAAQ,MAAM,OAAO,aAAa,KAAK;AAAA,IACzC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,aAAa,KAAK;AAAA,IAAG;AAAA,EACxD,CAAC;AAIH,OACG,QAAQ,QAAQ,EAChB,YAAY,6DAA6D,EACzE,eAAe,kBAAkB,mBAAmB,EACpD,OAAO,OAAO,SAA2B;AACxC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,OAAO,MAAM,WAAW,UAAU,YAAY,SAAS,KAAK,IAAI;AACtE,cAAQ,MAAM,OAAO,eAAe,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAIH,OACG,QAAQ,eAAe,EACvB,YAAY,8BAA8B,EAC1C,eAAe,YAAY,cAAc,EACzC,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,OAAO,MAAM,WAAW,aAAa,YAAY,SAAS,SAAS,KAAK,IAAI,EAAE,CAAC;AACrF,cAAQ,MAAM,OAAO,sBAAsB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,sBAAsB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,OACG,QAAQ,aAAa,EACrB,YAAY,8BAA8B,EAC1C,eAAe,YAAY,cAAc,EACzC,eAAe,iBAAiB,cAAc,EAC9C,OAAO,OAAO,SAAuC;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,OAAO,MAAM,WAAW,WAAW,YAAY,SAAS,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI;AAC9F,cAAQ,MAAM,OAAO,oBAAoB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAIH,OACG,QAAQ,SAAS,EACjB,YAAY,uDAAuD,EACnE,eAAe,YAAY,cAAc,EACzC,eAAe,iBAAiB,2CAA2C,EAC3E,OAAO,OAAO,SAAuC;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,KAAK,KAAK,MAAM,MAAM,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACtE,YAAM,OAAO,MAAM,WAAW,QAAQ,YAAY,SAAS,KAAK,IAAI,EAAE,GAAG,IAAI;AAC7E,cAAQ,MAAM,OAAO,gBAAgB,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,OACG,QAAQ,YAAY,EACpB,YAAY,4DAA4D,EACxE,eAAe,YAAY,cAAc,EACzC,eAAe,iBAAiB,8CAA8C,EAC9E,OAAO,OAAO,SAAuC;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,KAAK,KAAK,MAAM,MAAM,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACtE,YAAM,OAAO,MAAM,WAAW,WAAW,YAAY,SAAS,KAAK,IAAI,EAAE,GAAG,IAAI;AAChF,cAAQ,MAAM,OAAO,mBAAmB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,mBAAmB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAIH,OACG,QAAQ,kBAAkB,EAC1B,YAAY,iCAAiC,EAC7C,eAAe,YAAY,cAAc,EACzC,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,MAAM,WAAW,gBAAgB,YAAY,SAAS,KAAK,IAAI,EAAE,CAAC;AAC/E,cAAQ,MAAM,OAAO,yBAAyB,KAAK;AAAA,IACrD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,yBAAyB,KAAK;AAAA,IAAG;AAAA,EACpE,CAAC;AAEH,OACG,QAAQ,gBAAgB,EACxB,YAAY,kDAAkD,EAC9D,eAAe,YAAY,cAAc,EACzC,eAAe,iBAAiB,4BAA4B,EAC5D,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,OAAO,SAAyD;AACtE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,MAAM,WAAW,iBAAiB,YAAY,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM,KAAK,OAAO;AACzG,cAAQ,MAAM,OAAO,uBAAuB,KAAK;AAAA,IACnD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,uBAAuB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,OACG,QAAQ,qBAAqB,EAC7B,YAAY,uDAAuD,EACnE,eAAe,YAAY,cAAc,EACzC,eAAe,0BAA0B,iDAAiD,EAC1F,OAAO,gBAAgB,oDAAoD,EAC3E,OAAO,OAAO,SAA6D;AAC1E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,cAAc,MAAM,WAAW,gBAAgB,YAAY,SAAS,KAAK,IAAI,EAAE,CAAC;AACtF,YAAM,aAAa,YAAY,KAAK,OAAK,EAAE,OAAO,KAAK,YAAY;AACnE,UAAI,CAAC,WAAY,OAAM,IAAI,WAAW,yBAAyB,KAAK,YAAY,IAAI,CAAC;AACrF,YAAM,SAAS,KAAK,OAAOC,MAAK,KAAK,QAAQ,IAAI,GAAG,QAAQ;AAC5D,MAAAC,IAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACxC,YAAM,UAAUD,MAAK,KAAK,QAAQA,MAAK,SAAS,WAAW,IAAI,CAAC;AAChE,YAAM,SAAS,MAAM,WAAW,mBAAmB,WAAW,GAAG;AACjE,MAAAC,IAAG,cAAc,SAAS,MAAM;AAChC,cAAQ,EAAE,OAAO,SAAS,MAAM,WAAW,MAAM,MAAM,OAAO,OAAO,GAAG,OAAO,4BAA4B,KAAK;AAAA,IAClH,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,4BAA4B,KAAK;AAAA,IAAG;AAAA,EACvE,CAAC;AAIH,OACG,QAAQ,YAAY,EACpB,YAAY,uDAAuD,EACnE,OAAO,eAAe,sCAAsC,IAAI,EAChE,OAAO,OAAO,SAA4B;AACzC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,OAAO,MAAM,WAAW,UAAU,YAAY,SAAS,SAAS,KAAK,OAAO,EAAE,CAAC;AACrF,cAAQ,MAAM,OAAO,mBAAmB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,mBAAmB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,OACG,QAAQ,iBAAiB,EACzB,YAAY,0FAA0F,EACtG,OAAO,eAAe,2CAA2C,IAAI,EACrE,OAAO,OAAO,SAA4B;AACzC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,OAAO,MAAM,WAAW,eAAe,YAAY,SAAS,SAAS,KAAK,OAAO,EAAE,CAAC;AAC1F,cAAQ,MAAM,OAAO,wBAAwB,KAAK;AAAA,IACpD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,wBAAwB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAIH,OACG,QAAQ,OAAO,EACf,YAAY,qCAAqC,EACjD,OAAO,cAAc,kDAAkD,EACvE,OAAO,UAAU,+CAA+C,EAChE,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,MAAM,cAAc,YAAY,YAAY,OAAO;AACjE,UAAI,KAAK,MAAM;AACb,cAAM,mBAAmB,oBAAoB,WAAW,MAAM;AAC9D,cAAMA,MAAK,MAAM,OAAO,IAAI;AAC5B,cAAM,WAAW,KAAK,MAAMA,IAAG,aAAa,kBAAkB,MAAM,KAAK,IAAI;AAC7E,iBAAS,MAAM,EAAE,GAAI,SAAS,OAAO,CAAC,GAAI,iBAAiB,MAAM;AACjE,QAAAA,IAAG,cAAc,kBAAkB,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,MAAM;AACnF,aAAK,SAAS,MAAM,MAAM,aAAa,gBAAgB,EAAE;AAAA,MAC3D;AACA,cAAQ,OAAO,OAAO,cAAc,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,cAAc,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAEH,OACG,QAAQ,aAAa,EACrB,YAAY,wCAAwC,EACpD,eAAe,iBAAiB,gCAAgC,EAChE,OAAO,OAAO,SAA2B;AACxC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,OAAO,MAAM,WAAW,eAAe,YAAY,SAAS,KAAK,IAAI;AAC3E,cAAQ,MAAM,OAAO,oBAAoB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,8FAA8F,EAC1G,OAAO,iBAAiB,0DAA0D,EAClF,OAAO,iBAAiB,8CAA8C,EACtE,OAAO,cAAc,kDAAkD,EACvE,OAAO,UAAU,4DAA4D,EAC7E,OAAO,OAAO,SAAkE;AAC/E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,WAAW,IAAI,cAAc,GAAG;AAC7D,YAAM,aAAa,IAAI,gBAAgB;AAEvC,YAAM,YAAY,KAAK,OACnB,MAAM,mBAAmB,YAAY,YAAY,SAAS,KAAK,IAAI,IACnE,MAAM,eAAe,YAAY,UAAU;AAE/C,YAAM,SAAS,KAAK,aAChB,UAAU;AAAA,QAAO,OACf,CAAC,EAAE,cAAc,WAAW,SAAS,KACrC,CAAC,EAAE,cAAc,WAAW,iBAAiB;AAAA,MAC/C,IACA;AACJ,UAAI,KAAK,MAAM;AACb,cAAM,mBAAmB,oBAAoB,WAAW,MAAM;AAC9D,cAAMA,MAAK,MAAM,OAAO,IAAI;AAC5B,cAAM,WAAW,KAAK,MAAMA,IAAG,aAAa,kBAAkB,MAAM,KAAK,IAAI;AAE7E,cAAM,UAAU,oBAAoB,SAAS;AAC7C,iBAAS,MAAM,EAAE,GAAI,SAAS,OAAO,CAAC,GAAI,kBAAkB,WAAW,cAAc,QAAQ;AAC7F,QAAAA,IAAG,cAAc,kBAAkB,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,MAAM;AACnF,aAAK,SAAS,UAAU,MAAM,eAAe,OAAO,KAAK,OAAO,EAAE,MAAM,eAAe,gBAAgB,EAAE;AAAA,MAC3G;AACA,cAAQ,QAAQ,OAAO,eAAe,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,0EAA0E,EACtF,OAAO,kBAAkB,+FAA0F,EACnH,OAAO,CAAC,SAAoC;AAC3C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,KAAK,aAAa;AAGpB,qBAAe,KAAK,UAAU,6BAA6B,MAAM,CAAC,IAAI,IAAI;AAC1E;AAAA,IACF;AACA,YAAQ,EAAE,QAAQ,4BAA4B,SAAS,4BAA4B,GAAG,OAAO,eAAe,KAAK;AAAA,EACnH,CAAC;AACL;;;AE9bA,SAAS,sBACP,SACA,kBACA,mBACgG;AAChG,QAAM,OAAuG,CAAC;AAC9G,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,UAAW;AACtB,QAAI,oBAAoB,CAAC,OAAO,cAAe;AAC/C,QAAI,qBAAqB,OAAO,cAAe;AAC/C,eAAW,WAAW,OAAO,UAAU;AACrC,UAAI,QAAQ,UAAW;AACvB,WAAK,KAAK,EAAE,GAAG,SAAS,UAAU,OAAO,IAAI,eAAe,OAAO,iBAAiB,KAAK,CAAC;AAAA,IAC5F;AAAA,EACF;AACA,SAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,cAAc,EAAE,aAAa,CAAC;AAC3E;AAEO,SAAS,wBAAwB,KAAoB;AAC1D,QAAM,OAAO,IACV,QAAQ,MAAM,EACd,YAAY,qDAAqD;AAIpE,OACG,QAAQ,MAAM,EACd,YAAY,sCAAsC,EAClD,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,UAAU,IAAI,cAAc,GAAG;AAC5D,YAAM,OAAO,MAAM,UAAU,UAAU,YAAY,OAAO;AAC1D,cAAQ,MAAM,OAAO,aAAa,KAAK;AAAA,IACzC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,aAAa,KAAK;AAAA,IAAG;AAAA,EACxD,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,eAAe,iBAAiB,iBAAiB,EACjD,OAAO,OAAO,SAA2B;AACxC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,UAAU,IAAI,cAAc,GAAG;AAC5D,YAAM,OAAO,MAAM,UAAU,WAAW,YAAY,SAAS,KAAK,IAAI;AACtE,cAAQ,MAAM,OAAO,eAAe,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAEH,OACG,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAM,UAAU,UAAU,IAAI,cAAc,KAAK,IAAI;AAClF,YAAM,OAAO,MAAM,UAAU,QAAQ,YAAY,SAAS,QAAQ;AAClE,cAAQ,MAAM,OAAO,YAAY,KAAK;AAAA,IACxC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,YAAY,KAAK;AAAA,IAAG;AAAA,EACvD,CAAC;AAIH,OACG,QAAQ,UAAU,EAClB,YAAY,oBAAoB,EAChC,OAAO,mBAAmB,4CAA4C,QAAQ,EAC9E,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,sBAAsB,oBAAoB,EACjD,OAAO,OAAO,SAAkE;AAC/E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAC,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,QAAQ,YAAY,SAASA,OAAM;AAAA,QAC9D,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK;AAAA,QACnB,eAAe,KAAK;AAAA,MACtB,CAAC;AACD,cAAQ,MAAM,OAAO,iBAAiB,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,eAAe,YAAY,iBAAiB,EAC5C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,MAAM,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACnF,cAAQ,MAAM,OAAO,eAAe,KAAK;AAAA,IAC3C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,eAAe,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AAEH,OACG,QAAQ,WAAW,EACnB,YAAY,uBAAuB,EACnC,eAAe,mBAAmB,UAAU,EAC5C,eAAe,qBAAqB,eAAe,EACnD,OAAO,qBAAqB,iCAAiC,MAAM,EACnE,OAAO,wBAAwB,gBAAgB,EAC/C,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,WAAW,gCAAgC,EAClD,OAAO,OAAO,SAAuH;AACpI,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,YAAY,KAAK,YACnB,KAAK,UAAU,MAAM,GAAG,EAAE,IAAI,SAAO,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE,IACvD,CAAC;AACL,YAAM,OAAO,MAAM,UAAU,SAAS,YAAY,SAASA,OAAM;AAAA,QAC/D,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,eAAe,cAAc,KAAK,MAAM;AAAA,QACxC,eAAe,cAAc,KAAK,MAAM;AAAA,QACxC;AAAA,QACA,GAAI,KAAK,UAAU,SAAY,EAAE,SAAS,KAAK,MAAM,IAAI,CAAC;AAAA,MAC5D,CAAC;AACD,cAAQ,MAAM,OAAO,kBAAkB,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,kBAAkB,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,OACG,QAAQ,WAAW,EACnB,YAAY,uBAAuB,EACnC,eAAe,YAAY,iBAAiB,EAC5C,OAAO,mBAAmB,WAAW,EACrC,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,OAAO,SAAmG;AAChH,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,YAAY,KAAK,YACnB,KAAK,UAAU,MAAM,GAAG,EAAE,IAAI,SAAO,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE,IACvD;AACJ,YAAM,OAAgC,CAAC;AACvC,UAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,UAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,KAAK;AAC5D,UAAI,UAAW,MAAK,YAAY;AAChC,UAAI,KAAK,UAAU,OAAW,MAAK,UAAU,KAAK,UAAU;AAC5D,YAAM,OAAO,MAAM,UAAU,SAAS,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,GAAG,IAAI;AAC5F,cAAQ,MAAM,OAAO,kBAAkB,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,kBAAkB,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,OACG,QAAQ,UAAU,EAClB,YAAY,iCAAiC,EAC7C,eAAe,YAAY,iBAAiB,EAC5C,OAAO,kBAAkB,2DAA2D,eAAe,EACnG,OAAO,mBAAmB,kCAAkC,EAC5D,OAAO,OAAO,SAAmE;AAChF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,SAAS,KAAK,IAAI,EAAE;AACjC,YAAM,KAAK,MAAM,UAAU,MAAM,YAAY,SAASA,OAAM,IAAI;AAChE,YAAM,OAAO,MAAM,UAAU;AAAA,QAC3B;AAAA,QAAY;AAAA,QAASA;AAAA,QAAM;AAAA,QAC3B,GAAG,uBAAuB,YAAY;AAAA,QACtC;AAAA,UACE,eAAe,KAAK;AAAA,UACpB,oBAAoB,KAAK,gBAAgB;AAAA,QAC3C;AAAA,MACF;AACA,cAAQ,MAAM,OAAO,iBAAiB,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAEH,OACG,QAAQ,YAAY,EACpB,YAAY,wBAAwB,EACpC,eAAe,YAAY,iBAAiB,EAC5C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,UAAU,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACvF,cAAQ,MAAM,OAAO,mBAAmB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,mBAAmB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAIH,OACG,QAAQ,eAAe,EACvB,YAAY,wDAAwD,EACpE,eAAe,YAAY,iBAAiB,EAC5C,OAAO,iBAAiB,kCAAkC,EAC1D,OAAO,kBAAkB,iCAAiC,EAC1D,OAAO,OAAO,SAAsE;AACnF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,UAAU,MAAM,UAAU,YAAY,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AAC5F,YAAM,OAAO,sBAAsB,SAAS,KAAK,cAAc,OAAO,KAAK,eAAe,KAAK;AAC/F,cAAQ,MAAM,OAAO,sBAAsB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,sBAAsB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,OACG,QAAQ,aAAa,EACrB,YAAY,yCAAyC,EACrD,eAAe,YAAY,iBAAiB,EAC5C,eAAe,iBAAiB,cAAc,EAC9C,OAAO,OAAO,SAAuC;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,aAAa,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,GAAG;AAAA,QAC1F,UAAU,CAAC,EAAE,SAAS,KAAK,MAAM,aAAa,OAAO,CAAC;AAAA,QACtD,QAAQ;AAAA,MACV,CAAC;AACD,cAAQ,MAAM,OAAO,oBAAoB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,OACG,QAAQ,oBAAoB,EAC5B,YAAY,mDAAmD,EAC/D,eAAe,YAAY,iBAAiB,EAC5C,eAAe,iBAAiB,WAAW,EAC3C,eAAe,cAAc,aAAa,EAC1C,eAAe,iBAAiB,cAAc,EAC9C,OAAO,sBAAsB,0CAA0C,OAAO,EAC9E,OAAO,OAAO,SAAqF;AAClG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,UAAU,SAAS,KAAK,MAAM,EAAE;AACtC,YAAM,UAAU,KAAK,aAAa;AAClC,YAAM,YAAY,UACd,EAAE,gBAAgB,EAAE,MAAM,SAAS,QAAQ,EAAE,GAAG,cAAc,EAAE,MAAM,SAAS,QAAQ,EAAE,EAAE,IAC3F,EAAE,eAAe,EAAE,MAAM,SAAS,QAAQ,EAAE,GAAG,aAAa,EAAE,MAAM,SAAS,QAAQ,EAAE,EAAE;AAC7F,YAAM,OAAO,MAAM,UAAU,aAAa,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,GAAG;AAAA,QAC1F,UAAU,CAAC,EAAE,SAAS,KAAK,MAAM,aAAa,OAAO,CAAC;AAAA,QACtD,QAAQ;AAAA,QACR,eAAe,EAAE,UAAU,KAAK,MAAM,GAAG,UAAU;AAAA,MACrD,CAAC;AACD,cAAQ,MAAM,OAAO,2BAA2B,KAAK;AAAA,IACvD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,2BAA2B,KAAK;AAAA,IAAG;AAAA,EACtE,CAAC;AAEH,OACG,QAAQ,eAAe,EACvB,YAAY,2BAA2B,EACvC,eAAe,YAAY,iBAAiB,EAC5C,eAAe,oBAAoB,WAAW,EAC9C,eAAe,iBAAiB,YAAY,EAC5C,OAAO,OAAO,SAAyD;AACtE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU;AAAA,QAC3B;AAAA,QAAY;AAAA,QAASA;AAAA,QACrB,SAAS,KAAK,IAAI,EAAE;AAAA,QAAG,SAAS,KAAK,UAAU,EAAE;AAAA,QAAG,KAAK;AAAA,MAC3D;AACA,cAAQ,MAAM,OAAO,sBAAsB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,sBAAsB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,OACG,QAAQ,iBAAiB,EACzB,YAAY,2CAA2C,EACvD,eAAe,YAAY,iBAAiB,EAC5C,eAAe,oBAAoB,WAAW,EAC9C,OAAO,OAAO,SAA2C;AACxD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU;AAAA,QAC3B;AAAA,QAAY;AAAA,QAASA;AAAA,QACrB,SAAS,KAAK,IAAI,EAAE;AAAA,QAAG,SAAS,KAAK,UAAU,EAAE;AAAA,QAAG;AAAA,MACtD;AACA,cAAQ,MAAM,OAAO,wBAAwB,KAAK;AAAA,IACpD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,wBAAwB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAEH,OACG,QAAQ,gBAAgB,EACxB,YAAY,gCAAgC,EAC5C,eAAe,YAAY,iBAAiB,EAC5C,eAAe,oBAAoB,WAAW,EAC9C,eAAe,qBAAqB,YAAY,EAChD,OAAO,OAAO,SAA8D;AAC3E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,UAAU;AAAA,QACd;AAAA,QAAY;AAAA,QAASA;AAAA,QACrB,SAAS,KAAK,IAAI,EAAE;AAAA,QAAG,SAAS,KAAK,UAAU,EAAE;AAAA,QAAG,SAAS,KAAK,WAAW,EAAE;AAAA,MACjF;AACA,cAAQ,EAAE,SAAS,KAAK,GAAG,OAAO,uBAAuB,KAAK;AAAA,IAChE,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,uBAAuB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAIH,OACG,QAAQ,YAAY,EACpB,YAAY,sCAAsC,EAClD,eAAe,YAAY,iBAAiB,EAC5C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,cAAc,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AAC3F,cAAQ,MAAM,OAAO,mBAAmB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,mBAAmB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,4EAA4E,EACxF,eAAe,YAAY,iBAAiB,EAC5C,OAAO,cAAc,qCAAqC,EAC1D,OAAO,OAAO,SAAwC;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,UAAU,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACvF,UAAI,KAAK,MAAM;AACf,YAAI,KAAK,MAAM;AACb,gBAAM,SAAS,KAAK,KAAK,WAAW,GAAG,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI;AACpE,eAAK,WAAW,KAAK,WAAW,CAAC,GAAG,OAAO,OAAK,EAAE,KAAK,SAAS,MAAM;AAAA,QACxE;AAAA,MACA;AACA,cAAQ,MAAM,OAAO,aAAa,KAAK;AAAA,IACzC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,aAAa,KAAK;AAAA,IAAG;AAAA,EACxD,CAAC;AAIH,OACG,QAAQ,kBAAkB,EAC1B,YAAY,0CAA0C,EACtD,eAAe,kBAAkB,YAAY,EAC7C,OAAO,OAAO,SAA6B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,kBAAkB,YAAY,SAASA,OAAM,KAAK,MAAM;AACrF,cAAQ,MAAM,OAAO,yBAAyB,KAAK;AAAA,IACrD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,yBAAyB,KAAK;AAAA,IAAG;AAAA,EACpE,CAAC;AAIH,OACG,QAAQ,gBAAgB,EACxB,YAAY,kCAAkC,EAC9C,eAAe,YAAY,iBAAiB,EAC5C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AACxE,YAAM,OAAO,MAAM,UAAU,cAAc,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AAC3F,cAAQ,MAAM,OAAO,uBAAuB,KAAK;AAAA,IACnD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,uBAAuB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,QAAM,UAAU,CACd,MACA,aACA,MACA,WACG;AACH,SACG,QAAQ,IAAI,EACZ,YAAY,WAAW,EACvB,eAAe,YAAY,iBAAiB,EAC5C,OAAO,OAAO,SAAyB;AACtC,YAAM,QAAQ,KAAK,IAAI;AACvB,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,EAAE,YAAY,GAAG,IAAI,MAAM,OAAO,sBAAwB;AAChE,cAAM,SAAS,GAAG,EAAE,YAAY,WAAW,OAAO,CAAC;AACnD,cAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,UAAU,IAAI,cAAc,KAAK,IAAI;AAExE,cAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,oBAAmB;AAC1D,cAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,oBAAsB;AAChE,cAAM,OAAOA,kBAAiB,QAAQ,QAAQ,WAAW,MAAM,CAAC;AAChE,cAAM,aAAa,IAAID,eAAc,IAAI;AACzC,cAAM,KAAK,MAAM,WAAW,kBAAkB,UAAU;AACxD,cAAM,OAAO,GAAG,kBAAkB;AAClC,cAAM,OAAO,MAAM,UAAU,UAAU,YAAY,SAASD,OAAM,SAAS,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI;AACnG,gBAAQ,MAAM,OAAO,QAAQ,KAAK;AAAA,MACpC,SAAS,KAAK;AAAE,aAAK,KAAK,OAAO,QAAQ,KAAK;AAAA,MAAG;AAAA,IACnD,CAAC;AAAA,EACL;AAEA,UAAQ,WAAW,0BAA0B,QAAQ,SAAS,cAAc;AAC5E,UAAQ,aAAa,uCAAuC,QAAQ,SAAS,gBAAgB;AAC7F,UAAQ,mBAAmB,6CAA6C,QAAQ,iBAAiB,sBAAsB;AAIvH,OACG,QAAQ,aAAa,EACrB,YAAY,4CAA4C,EACxD,eAAe,YAAY,iBAAiB,EAC5C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,MAAAA,OAAM,WAAW,YAAY,IAAI,cAAc,KAAK,IAAI;AACrF,YAAM,KAAK,MAAM,UAAU,MAAM,YAAY,SAASA,OAAM,SAAS,KAAK,IAAI,EAAE,CAAC;AACjF,YAAM,OAAO,MAAM,YAAY,WAAW,YAAY,SAAS;AAAA,QAC7D,YAAY,GAAG;AAAA,MACjB,CAAC;AACD,cAAQ,MAAM,OAAO,oBAAoB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AACL;;;AChaO,SAAS,4BAA4B,KAAoB;AAC9D,QAAM,WAAW,IACd,QAAQ,UAAU,EAClB,YAAY,0CAA0C;AAEzD,WACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,YAAY,IAAI,cAAc,GAAG;AAC9D,YAAM,OAAO,MAAM,YAAY,gBAAgB,YAAY,OAAO;AAClE,cAAQ,MAAM,OAAO,iBAAiB,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAEH,WACG,QAAQ,KAAK,EACb,YAAY,iCAAiC,EAC7C,eAAe,YAAY,wBAAwB,EACnD,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,YAAY,IAAI,cAAc,GAAG;AAC9D,YAAM,OAAO,MAAM,YAAY,cAAc,YAAY,SAAS,SAAS,KAAK,IAAI,EAAE,CAAC;AACvF,cAAQ,MAAM,OAAO,gBAAgB,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,WACG,QAAQ,KAAK,EACb,YAAY,sBAAsB,EAClC,eAAe,YAAY,wBAAwB,EACnD,OAAO,kBAAkB,8CAA8C,EACvE,OAAO,qBAAqB,gCAAgC,CAAC,GAAW,QAAkB;AAAE,QAAI,KAAK,CAAC;AAAG,WAAO;AAAA,EAAK,GAAG,CAAC,CAAa,EACtI,OAAO,UAAU,+CAA+C,EAChE,OAAO,iBAAiB,0CAA0C,KAAK,EACvE,OAAO,cAAc,yCAAyC,IAAI,EAClE,OAAO,OAAO,SAA8G;AAC3H,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,YAAY,IAAI,cAAc,GAAG;AAC9D,YAAM,eAAe,KAAK,SACrB,KAAK,OAAO,WAAW,OAAO,IAAI,KAAK,SAAS,cAAc,KAAK,MAAM,KAC1E;AAEJ,iBAAW,KAAK,KAAK,WAAW;AAC9B,YAAI,CAAC,EAAE,SAAS,GAAG,EAAG,OAAM,IAAI,WAAW,wBAAwB,CAAC,iCAAiC,CAAC;AAAA,MACxG;AACA,YAAM,aAAa,KAAK,UAAU,SAAS,IACvC,KAAK,UAAU,OAAO,YAAY,KAAK,UAAU,IAAI,OAAK;AACxD,cAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,eAAO,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,MACzC,CAAC,CAAC,CAAC,IACH;AAEJ,UAAI,QAAQ,MAAM,YAAY,WAAW,YAAY,SAAS,SAAS,KAAK,IAAI,EAAE,GAAG;AAAA,QACnF;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,iBAAiB,MAAM,EAAE,KAAK,MAAM,WAAW,oBAAe,MAAM,MAAM,EAAE;AAEhF,UAAI,KAAK,MAAM;AACb,cAAM,aAAa,SAAS,KAAK,SAAS,EAAE;AAC5C,cAAM,UAAU,SAAS,KAAK,MAAM,EAAE;AACtC,YAAI,MAAM,UAAU,KAAK,cAAc,EAAG,OAAM,IAAI,WAAW,sBAAsB,KAAK,OAAO,6CAA6C,CAAC;AAC/I,YAAI,MAAM,OAAO,KAAK,WAAW,EAAG,OAAM,IAAI,WAAW,mBAAmB,KAAK,IAAI,6CAA6C,CAAC;AACnI,YAAI,sBAAsB,MAAM,EAAE,yBAAyB,UAAU,WAAW,OAAO,OAAO;AAC9F,gBAAQ,MAAM;AAAA,UACZ,MAAM,YAAY,SAAS,YAAY,SAAS,MAAM,EAAE;AAAA,UACxD;AAAA,UACA,EAAE,YAAY,QAAQ;AAAA,QACxB;AACA,YAAI,MAAM,UAAU,MAAM,WAAW,aAAa;AAChD,kBAAQ,WAAW,SAAS;AAAA,QAC9B;AAAA,MACF;AAEA,cAAQ,OAAO,OAAO,gBAAgB,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,WACG,QAAQ,WAAW,EACnB,YAAY,oBAAoB,EAChC,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,iBAAiB,qFAAqF,EAC7G,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,qBAAqB,wDAAwD,EACpF,OAAO,aAAa,mBAAmB,IAAI,EAC3C,OAAO,OAAO,SAAgG;AAC7G,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,YAAY,IAAI,cAAc,GAAG;AAE9D,UAAI;AACJ,UAAI,KAAK,cAAc,KAAK,MAAM;AAChC,cAAM,IAAI,WAAW,sEAAsE,CAAC;AAAA,MAC9F;AACA,UAAI,KAAK,YAAY;AACnB,uBAAe,SAAS,KAAK,YAAY,EAAE;AAC3C,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,IAAI,WAAW,2CAA2C,KAAK,UAAU,qDAAqD,CAAC;AAAA,QACvI;AAAA,MACF,WAAW,KAAK,MAAM;AACpB,cAAM,OAAO,MAAM,YAAY,gBAAgB,YAAY,OAAO;AAClE,cAAM,QAAQ,KAAK,KAAK,OAAK,EAAE,KAAK,YAAY,MAAM,KAAK,KAAM,YAAY,CAAC;AAC9E,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI;AAAA,YACR,aAAa,KAAK,IAAI;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AACA,uBAAe,MAAM;AAAA,MACvB;AAEA,YAAM,OAAO,MAAM,YAAY,WAAW,YAAY,SAAS;AAAA,QAC7D,eAAe,iBAAiB,SAAY,CAAC,YAAY,IAAI;AAAA,QAC7D,YAAY,KAAK;AAAA,QACjB,cAAc,KAAK;AAAA,QACnB,KAAK,SAAS,KAAK,KAAK,EAAE;AAAA,MAC5B,CAAC;AACD,cAAQ,MAAM,OAAO,sBAAsB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,sBAAsB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,WACG,QAAQ,SAAS,EACjB,YAAY,gCAAgC,EAC5C,eAAe,YAAY,UAAU,EACrC,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,YAAY,IAAI,cAAc,GAAG;AAC9D,YAAM,OAAO,MAAM,YAAY,SAAS,YAAY,SAAS,SAAS,KAAK,IAAI,EAAE,CAAC;AAClF,cAAQ,MAAM,OAAO,oBAAoB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,oBAAoB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,WACG,QAAQ,YAAY,EACpB,YAAY,iCAAiC,EAC7C,eAAe,YAAY,UAAU,EACrC,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,SAAS,YAAY,IAAI,cAAc,GAAG;AAC9D,YAAM,OAAO,MAAM,YAAY,YAAY,YAAY,SAAS,SAAS,KAAK,IAAI,EAAE,CAAC;AACrF,cAAQ,MAAM,OAAO,uBAAuB,KAAK;AAAA,IACnD,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,uBAAuB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,WACG,QAAQ,MAAM,EACd,YAAY,qEAAqE,EACjF,OAAO,kBAAkB,0DAAqD,EAC9E,OAAO,YAAY,+EAA0E,EAC7F,OAAO,gBAAgB,yCAAyC,EAChE,OAAO,OAAO,SAA4D;AACzE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK,WAAW,KAAK;AACnC,UAAI,CAAC,MAAO,OAAM,IAAI,WAAW,4EAA4E,CAAC;AAC9G,YAAM,EAAE,YAAY,SAAS,YAAY,IAAI,cAAc,GAAG;AAC9D,YAAM,UAAU,SAAS,OAAO,EAAE;AAClC,UAAI,KAAK,OAAO;AACd,cAAM,OAAO,MAAM,YAAY,OAAO,YAAY,SAAS,SAAS,SAAS,KAAK,OAAO,EAAE,CAAC;AAC5F,gBAAQ,EAAE,KAAK,KAAK,GAAG,OAAO,iBAAiB,KAAK;AAAA,MACtD,OAAO;AACL,cAAM,OAAO,MAAM,YAAY,SAAS,YAAY,SAAS,OAAO;AACpE,gBAAQ,MAAM,OAAO,iBAAiB,KAAK;AAAA,MAC7C;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AACL;;;AC7KO,SAAS,oBAAoBG,UAAwB;AAC1D,QAAM,MAAMA,SACT,QAAQ,KAAK,EACb,YAAY,gCAAgC,EAC5C,OAAO,uBAAuB,wCAAwC,EACtE,OAAO,yBAAyB,wBAAwB,EACxD,OAAO,oBAAoB,2BAA2B,EACtD,OAAO,iBAAiB,kCAAkC;AAI7D,MACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,MAAM,WAAW,kBAAkB,UAAU;AAC1D,cAAQ,MAAM,OAAO,UAAU,KAAK;AAAA,IACtC,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,UAAU,KAAK;AAAA,IAAG;AAAA,EACrD,CAAC;AAEH,MACG,QAAQ,iBAAiB,EACzB,YAAY,8CAA8C,EAC1D,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,YAAY,WAAW,IAAI,cAAc,GAAG;AACpD,YAAM,OAAO,MAAM,WAAW,kBAAkB,UAAU;AAC1D,cAAQ,MAAM,OAAO,mBAAmB,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,OAAO,mBAAmB,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAIH,6BAA2B,GAAG;AAC9B,0BAAwB,GAAG;AAC3B,0BAAwB,GAAG;AAC3B,8BAA4B,GAAG;AACjC;;;ACpCA,SAAS,QAAQ,MAAsB;AACrC,SAAO,KAAK,MAAM,GAAG,EAAE,IAAI,kBAAkB,EAAE,KAAK,OAAO;AAC7D;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,SAAS,QAAwC;AACrD,UAAM,WAAW,SAAS,QAAQ,QAAQ,MAAM,CAAC,cAAc;AAC/D,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B;AAAA,MACA,EAAE,QAAQ,EAAE,MAAM,0EAA0E,EAAE;AAAA,IAChG;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAO,MAAyC;AACpD,WAAO,KAAK,KAAK;AAAA,MACf,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACrB,EAAE,QAAQ,EAAE,MAAM,oKAAoK,EAAE;AAAA,IAC1L;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,MACA,QACkC;AAClC,UAAM,YAAY,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS;AACzD,UAAM,WAAW,YACb,QAAQ,QAAQ,IAAI,CAAC,yBACrB,QAAQ,QAAQ,IAAI,CAAC;AAEzB,UAAM,MAAM,MAAM,KAAK,KAAK,WAAW,UAAU;AAAA,MAC/C,QAAQ;AAAA,MACR,QAAQ,YAAY,SAAS;AAAA,IAC/B,CAAC;AAED,UAAM,WAAW,IAAI,QAAQ,IAAI,UAAU,KAAK;AAChD,UAAM,QAAQ,SAAS,MAAM,0BAA0B;AACvD,QAAI,CAAC,MAAO,OAAM,IAAI,WAAW,0FAAqF;AACtH,UAAM,cAAc,SAAS,MAAM,CAAC,GAAI,EAAE;AAC1C,WAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,MAAM,aAAa,aAAgD;AACjE,WAAO,KAAK,KAAK,QAA0B,eAAe,WAAW,WAAW;AAAA,EAClF;AAAA,EAEA,MAAM,WAAW,MAAc,MAAM,IAA+K;AAClN,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACrB,EAAE,QAAQ,EAAE,MAAM,8GAA8G,GAAG,IAAI,EAAE;AAAA,IAC3I;AACA,WAAO,KAAK,UAAU,CAAC;AAAA,EACzB;AAAA,EAEA,MAAM,SAAS,MAAc,aAA4C;AACvE,WAAO,KAAK,KAAK;AAAA,MACf,QAAQ,QAAQ,IAAI,CAAC,IAAI,WAAW;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,MAAc,aAAsC;AACtE,UAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MAC1B,QAAQ,QAAQ,IAAI,CAAC,IAAI,WAAW;AAAA,MACpC,EAAE,QAAQ,MAAM;AAAA,IAClB;AACA,WAAO,IAAI;AAAA,EACb;AACF;;;ACzEA,SAASC,WAAUC,UAAiC;AAClD,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAC3E,MAAI,CAAC,OAAO,QAAQ,QAAS,OAAM,IAAI,WAAW,gDAAgD;AAClG,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,IAAI,cAAc,IAAI;AAC/B;AAEA,eAAe,cACb,QACA,aACA,QACA,WACiB;AACjB,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,OAAO,MAAM,OAAO,aAAa,WAAW;AAClD,QAAI,KAAK,YAAY,WAAW,OAAW,QAAO,KAAK,WAAW;AAClE,QAAI,KAAK,QAAQ,QAAQ,CAAC,KAAK,WAAW,CAAC,KAAK,WAAW;AACzD,YAAM,IAAI,WAAW,sCAAsC,CAAC;AAAA,IAC9D;AACA,UAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,MAAM,CAAC;AAAA,EAC9C;AACA,QAAM,IAAI,WAAW,oDAAoD,YAAY,GAAI,KAAK,CAAC;AACjG;AAEA,eAAe,kBACb,QACA,SACA,aACA,QACA,WACuB;AACvB,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,QAAQ,MAAM,OAAO,SAAS,SAAS,WAAW;AACxD,QAAI,CAAC,MAAM,SAAU,QAAO;AAC5B,UAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,MAAM,CAAC;AAAA,EAC9C;AACA,QAAM,IAAI,WAAW,gCAAgC,WAAW,sBAAsB,YAAY,GAAI,KAAK,CAAC;AAC9G;AAEO,SAAS,wBAAwBA,UAAwB;AAC9D,QAAM,UAAUA,SAAQ,QAAQ,SAAS,EAAE,YAAY,gCAAgC;AACvF,QAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,iCAAiC;AAE1F,WACG,QAAQ,MAAM,EACd,YAAY,4DAA4D,EACxE,OAAO,mBAAmB,8EAA8E,EACxG,OAAO,OAAO,SAA8B;AAC3C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,SAAS,KAAK,MAAM;AAC9C,cAAQ,MAAM,WAAW,iBAAiB,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,WAAW,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,WACG,QAAQ,KAAK,EACb,YAAY,gCAAgC,EAC5C,eAAe,gBAAgB,kDAAkD,EACjF,OAAO,OAAO,SAA2B;AACxC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,OAAO,KAAK,IAAI;AAC1C,cAAQ,MAAM,WAAW,gBAAgB,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,WAAW,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,WACG,QAAQ,KAAK,EACb,YAAY,iBAAiB,EAC7B,eAAe,gBAAgB,kDAAkD,EACjF,OAAO,qBAAqB,gCAAgC,CAAC,GAAW,QAAkB;AAAE,QAAI,KAAK,CAAC;AAAG,WAAO;AAAA,EAAK,GAAG,CAAC,CAAa,EACtI,OAAO,UAAU,iDAAiD,EAClE,OAAO,iBAAiB,oGAAoG,KAAK,EACjI,OAAO,cAAc,yCAAyC,IAAI,EAClE,OAAO,OAAO,SAA+F;AAC5G,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAEhC,iBAAW,KAAK,KAAK,WAAW;AAC9B,YAAI,CAAC,EAAE,SAAS,GAAG,EAAG,OAAM,IAAI,WAAW,wBAAwB,CAAC,iCAAiC,CAAC;AAAA,MACxG;AACA,YAAM,SAAS,KAAK,UAAU,SAAS,IACnC,OAAO,YAAY,KAAK,UAAU,IAAI,OAAK;AACzC,cAAM,KAAK,EAAE,QAAQ,GAAG;AACxB,eAAO,CAAC,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,MACzC,CAAC,CAAC,IACF;AAEJ,YAAM,EAAE,YAAY,IAAI,MAAM,OAAO,aAAa,KAAK,MAAM,MAAM;AACnE,UAAI,6BAA6B,WAAW,GAAG;AAE/C,UAAI,CAAC,KAAK,MAAM;AACd,gBAAQ,EAAE,YAAY,GAAG,WAAW,gBAAgB,KAAK;AACzD;AAAA,MACF;AAEA,YAAM,aAAa,SAAS,KAAK,SAAS,EAAE;AAC5C,YAAM,UAAU,SAAS,KAAK,MAAM,EAAE;AACtC,UAAI,MAAM,UAAU,KAAK,cAAc,EAAG,OAAM,IAAI,WAAW,sBAAsB,KAAK,OAAO,6CAA6C,CAAC;AAC/I,UAAI,MAAM,OAAO,KAAK,WAAW,EAAG,OAAM,IAAI,WAAW,mBAAmB,KAAK,IAAI,6CAA6C,CAAC;AAEnI,UAAI,uCAAuC,UAAU,OAAO;AAC5D,YAAM,cAAc,MAAM,cAAc,QAAQ,aAAa,UAAU,KAAM,aAAa,GAAI;AAC9F,UAAI,UAAU,WAAW,2CAAsC;AAE/D,YAAM,QAAQ,MAAM,kBAAkB,QAAQ,KAAK,MAAM,aAAa,UAAU,KAAM,aAAa,GAAI;AACvG,UAAI,MAAM,WAAW,QAAQ,MAAM,WAAW,WAAW;AACvD,gBAAQ,WAAW,SAAS;AAAA,MAC9B;AACA,cAAQ,OAAO,WAAW,gBAAgB,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,WAAW,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AAEH,WACG,QAAQ,WAAW,EACnB,YAAY,8BAA8B,EAC1C,eAAe,gBAAgB,kDAAkD,EACjF,OAAO,aAAa,mDAAmD,IAAI,EAC3E,OAAO,OAAO,SAAwC;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,MAAM,SAAS,KAAK,KAAK,EAAE;AACjC,UAAI,MAAM,GAAG,KAAK,OAAO,EAAG,OAAM,IAAI,WAAW,kBAAkB,KAAK,GAAG,mCAAmC,CAAC;AAC/G,YAAM,OAAO,MAAM,OAAO,WAAW,KAAK,MAAM,GAAG;AACnD,cAAQ,MAAM,WAAW,sBAAsB,KAAK;AAAA,IACtD,SAAS,KAAK;AAAE,WAAK,KAAK,WAAW,sBAAsB,KAAK;AAAA,IAAG;AAAA,EACrE,CAAC;AAEH,WACG,QAAQ,SAAS,EACjB,YAAY,kCAAkC,EAC9C,eAAe,gBAAgB,kDAAkD,EACjF,eAAe,gBAAgB,cAAc,EAC7C,OAAO,OAAO,SAA2C;AACxD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,cAAc,SAAS,KAAK,QAAQ,EAAE;AAC5C,UAAI,MAAM,WAAW,EAAG,OAAM,IAAI,WAAW,qBAAqB,KAAK,MAAM,2BAA2B,CAAC;AACzG,YAAM,OAAO,MAAM,OAAO,SAAS,KAAK,MAAM,WAAW;AACzD,cAAQ,MAAM,WAAW,oBAAoB,KAAK;AAAA,IACpD,SAAS,KAAK;AAAE,WAAK,KAAK,WAAW,oBAAoB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAEH,WACG,QAAQ,MAAM,EACd,YAAY,uEAAuE,EACnF,eAAe,gBAAgB,kDAAkD,EACjF,eAAe,gBAAgB,cAAc,EAC7C,OAAO,OAAO,SAA2C;AACxD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,cAAc,SAAS,KAAK,QAAQ,EAAE;AAC5C,UAAI,MAAM,WAAW,EAAG,OAAM,IAAI,WAAW,qBAAqB,KAAK,MAAM,2BAA2B,CAAC;AACzG,YAAM,OAAO,MAAM,OAAO,cAAc,KAAK,MAAM,WAAW;AAC9D,cAAQ,EAAE,KAAK,KAAK,GAAG,WAAW,iBAAiB,KAAK;AAAA,IAC1D,SAAS,KAAK;AAAE,WAAK,KAAK,WAAW,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AACL;;;ACpKA,IAAMC,OAAM;AAqBL,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,OAAwB;AAC5B,WAAO,KAAK,KAAK,gBAAgB,GAAGA,IAAG,cAAc;AAAA,EACvD;AAAA,EAEA,MAAM,UAAU,OAAsB,CAAC,GAAqC;AAC1E,WAAO,KAAK,KAAK,YAAqC,GAAGA,IAAG,iBAAiB;AAAA,MAC3E,QAAQ;AAAA,QACN,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,MAAcC,OAA+C;AAChF,UAAM,YAAYA,MAAK,WAAW,GAAG,IAAIA,MAAK,MAAM,CAAC,IAAIA;AACzD,WAAO,KAAK,KAAK,YAAoC,GAAGD,IAAG,YAAY,IAAI,IAAI,SAAS,EAAE;AAAA,EAC5F;AAAA,EAEA,MAAM,cAAc,MAAcC,OAA8C;AAC9E,UAAM,YAAYA,MAAK,WAAW,GAAG,IAAIA,MAAK,MAAM,CAAC,IAAIA;AACzD,WAAO,KAAK,KAAK,YAAmC,GAAGD,IAAG,YAAY,IAAI,IAAI,SAAS,IAAI;AAAA,MACzF,QAAQ,EAAE,YAAY,GAAG;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,MAAcC,OAAc,YAAoC,OAA0B,CAAC,GAAkB;AAC/H,UAAM,YAAYA,MAAK,WAAW,GAAG,IAAIA,MAAK,MAAM,CAAC,IAAIA;AACzD,UAAM,aAAa,OAAO,QAAQ,UAAU,EACzC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,GAAG;AACX,UAAM,KAAK,KAAK,YAAkB,GAAGD,IAAG,YAAY,IAAI,IAAI,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,YAAY;AAAA,QACZ,GAAI,KAAK,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,OAAsB,CAAC,GAA0D;AAC/F,UAAM,WAAqB,CAAC;AAE5B,QAAI,KAAK,KAAM,UAAS,KAAK,oBAAoB,KAAK,IAAI,IAAI;AAC9D,QAAI,KAAK,KAAM,UAAS,KAAK,uBAAuB,KAAK,IAAI,IAAI;AACjE,QAAI,KAAK,KAAM,UAAS,KAAK,uBAAuB,KAAK,IAAI,IAAI;AACjE,QAAI,KAAK,MAAO,UAAS,KAAK,uBAAuB,KAAK,KAAK,IAAI;AACnE,QAAI,KAAK,OAAQ,UAAS,KAAK,uBAAuB,KAAK,MAAM,IAAI;AAErE,UAAM,aAAa,SAAS,SAAS,IACjC,IAAI,SAAS,KAAK,GAAG,CAAC,MACtB;AAEJ,UAAM,gBAAgB,KAAK,oBACvB,4FACA;AAEJ,UAAM,aAAa;AACnB,UAAM,cAAc,KAAK,QAAQ,UAAU,KAAK,KAAK,MAAM;AAE3D,UAAM,MAAM,cAAc,UAAU,IAAI,aAAa,GAAG,UAAU,GAAG,WAAW;AAEhF,WAAO,KAAK,KAAK,YAA0D,GAAGA,IAAG,eAAe;AAAA,MAC9F,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS,EAAE,gBAAgB,aAAa;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,OAA+B,CAAC,GAAkC;AACjF,UAAM,MAAM,MAAM,KAAK,KAAK,YAAmF,GAAGA,IAAG,UAAU,EAAE,WAAW,KAAK,UAAU,CAAC;AAC5J,UAAM,UAAU,IAAI,UAAU,CAAC,GAAG,IAAI,QAAM;AAAA,MAC1C,MAAM,EAAE,IAAI,QAAQ,YAAY,EAAE;AAAA,MAClC,KAAK,EAAE;AAAA,MACP,aAAa,EAAE;AAAA,IACjB,EAAE;AACF,UAAM,SAA+B,EAAE,QAAQ,KAAK,IAAI,IAAI;AAC5D,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,OAAO;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,WAAkD;AACpE,WAAO,KAAK,KAAK,YAAkC,GAAGA,IAAG,UAAU,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACpG;AAAA,EAEA,MAAM,aAAa,WAAmB,aAAoD;AACxF,WAAO,KAAK,KAAK;AAAA,MACf,GAAGA,IAAG,UAAU,mBAAmB,SAAS,CAAC,IAAI,mBAAmB,WAAW,CAAC;AAAA,IAClF;AAAA,EACF;AACF;;;ACxHA,SAASE,WAAUC,UAAqC;AACtD,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,MAAI,CAAC,OAAO,YAAY,QAAS,OAAM,IAAI,WAAW,oDAAoD;AAC1G,MAAI,CAAC,OAAO,YAAY,MAAO,OAAM,IAAI,WAAW,0DAA0D;AAC9G,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,IAAI,kBAAkB,IAAI;AACnC;AAEO,SAAS,4BAA4BA,UAAwB;AAClE,QAAM,MAAMA,SAAQ,QAAQ,aAAa,EAAE,YAAY,wBAAwB;AAI/E,MAAI,QAAQ,MAAM,EACf,YAAY,mDAAmD,EAC/D,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,cAAQ,MAAM,eAAe,QAAQ,KAAK;AAAA,IAC5C,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,QAAQ,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAIH,MAAI,QAAQ,OAAO,EAChB,YAAY,mBAAmB,EAC/B,OAAO,iBAAiB,mDAAmD,EAC3E,OAAO,yBAAyB,+DAA+D,EAC/F,OAAO,OAAO,SAAkD;AAC/D,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,UAAU,EAAE,MAAM,KAAK,MAAkE,aAAa,KAAK,YAAY,CAAC;AAClJ,cAAQ,MAAM,eAAe,SAAS,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,SAAS,KAAK;AAAA,IAAG;AAAA,EAC5D,CAAC;AAIH,MAAI,QAAQ,6BAA6B,EACtC,YAAY,sEAAsE,EAClF,OAAO,OAAO,MAAcC,UAAiB;AAC5C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASF,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,eAAe,MAAMC,KAAI;AACnD,cAAQ,MAAM,eAAe,iBAAiB,KAAK;AAAA,IACrD,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,iBAAiB,KAAK;AAAA,IAAG;AAAA,EACpE,CAAC;AAIH,MAAI,QAAQ,8BAA8B,EACvC,YAAY,uCAAuC,EACnD,OAAO,OAAO,MAAcA,UAAiB;AAC5C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASF,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,cAAc,MAAMC,KAAI;AAClD,cAAQ,MAAM,eAAe,kBAAkB,KAAK;AAAA,IACtD,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,kBAAkB,KAAK;AAAA,IAAG;AAAA,EACrE,CAAC;AAIH,MAAI,QAAQ,2CAA2C,EACpD,YAAY,uEAAuE,EACnF,OAAO,eAAe,wCAAwC,KAAK,EACnE,OAAO,OAAO,MAAcA,OAAc,SAAmB,SAAiC;AAC7F,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,CAAC,QAAQ,OAAQ,OAAM,IAAI,WAAW,qCAAqC;AAC/E,YAAM,aAAqC,CAAC;AAC5C,iBAAW,MAAM,SAAS;AACxB,cAAM,KAAK,GAAG,QAAQ,GAAG;AACzB,YAAI,KAAK,EAAG,OAAM,IAAI,WAAW,6BAA6B,EAAE,6BAAwB;AACxF,mBAAW,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC;AAAA,MAC/C;AACA,YAAM,SAASF,WAAUC,QAAO;AAChC,YAAM,OAAO,cAAc,MAAMC,OAAM,YAAY,EAAE,WAAW,KAAK,UAAU,CAAC;AAChF,cAAQ,EAAE,MAAM,MAAAA,OAAM,WAAW,GAAG,eAAe,kBAAkB,KAAK;AAAA,IAC5E,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,kBAAkB,KAAK;AAAA,IAAG;AAAA,EACrE,CAAC;AAIH,MAAI,QAAQ,QAAQ,EACjB,YAAY,oGAAoG,EAChH,OAAO,iBAAiB,0BAA0B,EAClD,OAAO,oBAAoB,sDAAsD,EACjF,OAAO,oBAAoB,sDAAsD,EACjF,OAAO,kBAAkB,qDAAqD,EAC9E,OAAO,mBAAmB,qCAAqC,EAC/D,OAAO,eAAe,4CAA4C,KAAK,EACvE,OAAO,gBAAgB,0CAA0C,KAAK,EACtE,OAAO,OAAO,SAA+H;AAC5I,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM;AAC1C,cAAM,IAAI,WAAW,wDAAwD;AAAA,MAC/E;AACA,YAAM,SAASF,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,UAAU;AAAA,QAClC,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,OAAO,OAAO,MAAM,SAAS,KAAK,OAAO,EAAE,CAAC,IAAI,MAAM,SAAS,KAAK,OAAO,EAAE;AAAA,QAC7E,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AACD,cAAQ,MAAM,eAAe,UAAU,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,UAAU,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAIH,MAAI,QAAQ,QAAQ,EACjB,YAAY,yJAAyJ,EACrK,OAAO,iBAAiB,qFAAqF,IAAI,EACjH,OAAO,OAAO,SAA8B;AAC3C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,cAAc,SAAS,KAAK,SAAS,EAAE;AAC7C,UAAI,MAAM,WAAW,KAAK,eAAe,EAAG,OAAM,IAAI,WAAW,kDAAkD,CAAC;AACpH,YAAM,YAAY,cAAc;AAChC,YAAM,OAAO,MAAM,OAAO,WAAW,EAAE,UAAU,CAAC;AAClD,cAAQ,MAAM,eAAe,UAAU,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,UAAU,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,MAAI,QAAQ,mBAAmB,EAC5B,YAAY,kCAAkC,EAC9C,OAAO,OAAO,SAAiB;AAC9B,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,cAAc,IAAI;AAC5C,cAAQ,MAAM,eAAe,cAAc,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,cAAc,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,MAAI,QAAQ,4BAA4B,EACrC,YAAY,2EAA2E,EACvF,OAAO,OAAO,MAAc,WAAmB;AAC9C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAASD,WAAUC,QAAO;AAChC,YAAM,OAAO,MAAM,OAAO,aAAa,MAAM,MAAM;AACnD,cAAQ,MAAM,eAAe,cAAc,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,eAAe,cAAc,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AACL;;;AC7IO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,mBAAkD;AAChD,WAAO,KAAK,KAAK,QAA8B,kBAAkB;AAAA,EACnE;AAAA,EAEA,iBAAiB,aAAoD;AACnE,WAAO,KAAK,KAAK,QAA8B,8CAA8C;AAAA,MAC3F,QAAQ,EAAE,YAAY;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,iBAA8C;AAC5C,WAAO,KAAK,KAAK,QAA4B,gBAAgB;AAAA,EAC/D;AAAA,EAEA,aAAa,WAA8C;AACzD,WAAO,KAAK,KAAK,QAA0B,2BAA2B;AAAA,MACpE,QAAQ,EAAE,UAAU;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,WAAmB,MAAmD;AAClF,WAAO,KAAK,KAAK,QAAoC,8BAA8B;AAAA,MACjF,QAAQ;AAAA,MACR,QAAQ,EAAE,WAAW,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,WAAmB,SAAgC;AACjE,WAAO,KAAK,KAAK,QAAc,kCAAkC;AAAA,MAC/D,QAAQ;AAAA,MACR,QAAQ,EAAE,WAAW,QAAQ;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,MAAgE;AACzE,WAAO,KAAK,KAAK,QAA+B,0CAA0C;AAAA,MACxF,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,aAAa,KAAK;AAAA,QAClB,oBAAoB,KAAK;AAAA,QACzB,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK,eAAe;AAAA,QACjC,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACnD,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACnD,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,WAAkD;AACjE,WAAO,KAAK,KAAK,QAA8B,gDAAgD;AAAA,MAC7F,QAAQ,EAAE,UAAU;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,eAAe,WAAgD;AAC7D,WAAO,KAAK,KAAK,QAA4B,8CAA8C;AAAA,MACzF,QAAQ,EAAE,UAAU;AAAA,IACtB,CAAC;AAAA,EACH;AACF;;;AC9EA,IAAME,oBAAmB;AACzB,IAAM,qBAAqB,KAAK,KAAK;AAErC,SAASC,WAAUC,UAAoF;AACrG,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAAO,CAAC;AACrD,MAAI,CAAC,OAAO,QAAQ,SAAS;AAC3B,UAAM,IAAI,WAAW,0DAA0D,EAAE;AAAA,EACnF;AACA,QAAM,OAAO,iBAAiB,QAAQ,KAAK,MAAM;AACjD,SAAO,EAAE,QAAQ,IAAI,cAAc,IAAI,GAAG,OAAO;AACnD;AAEA,SAAS,mBAAmB,QAAuC,UAA2B;AAC5F,QAAM,MAAM,YAAY,OAAO,SAAS,QAAQ;AAChD,MAAI,CAAC,IAAK,OAAM,IAAI,WAAW,6EAA6E,CAAC;AAC7G,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAuC,UAA2B;AAC5F,QAAM,MAAM,YAAY,OAAO,SAAS,QAAQ;AAChD,MAAI,CAAC,IAAK,OAAM,IAAI,WAAW,6EAA6E,CAAC;AAC7G,SAAO;AACT;AAEO,SAAS,wBAAwBA,UAAwB;AAC9D,QAAM,UAAUA,SACb,QAAQ,SAAS,EACjB,YAAY,yEAAoE,EAChF,OAAO,wBAAwB,wBAAwB,EACvD,OAAO,wBAAwB,wBAAwB;AAE1D,UACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,OAAO,MAAM,OAAO,iBAAiB;AAC3C,cAAQ,MAAM,WAAW,QAAQ,KAAK;AAAA,IACxC,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,QAAQ,KAAK;AAAA,IACpC;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,cAAc,EACtB,YAAY,sCAAsC,EAClD,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAID,WAAUC,QAAO;AAC5C,YAAM,aAAa,QAAQ,KAA+B;AAC1D,YAAM,cAAc,mBAAmB,QAAQ,WAAW,WAAW;AACrE,YAAM,OAAO,MAAM,OAAO,iBAAiB,WAAW;AACtD,cAAQ,MAAM,WAAW,gBAAgB,KAAK;AAAA,IAChD,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,gBAAgB,KAAK;AAAA,IAC5C;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,YAAY,EACpB,YAAY,qBAAqB,EACjC,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,aAAa,MAAM,OAAO,eAAe;AAC/C,cAAQ,YAAY,WAAW,cAAc,KAAK;AAAA,IACpD,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,cAAc,KAAK;AAAA,IAC1C;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,UAAU,EAClB,YAAY,+BAA+B,EAC3C,eAAe,sBAAsB,sBAAsB,EAC3D,OAAO,OAAO,YAAmC;AAChD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,WAAW,MAAM,OAAO,aAAa,QAAQ,SAAS;AAC5D,cAAQ,UAAU,WAAW,YAAY,KAAK;AAAA,IAChD,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,YAAY,KAAK;AAAA,IACxC;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,gBAAgB,EACxB,YAAY,6DAA6D,EACzE,eAAe,sBAAsB,sBAAsB,EAC3D,eAAe,iBAAiB,cAAc,EAC9C,OAAO,eAAe,gDAAgD,EACtE,OAAO,OAAO,YAAkE;AAC/E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,UAAU,MAAM,OAAO,cAAc,QAAQ,WAAW,QAAQ,IAAI;AAC1E,UAAI,QAAQ,QAAQ;AAClB,cAAM,OAAO,gBAAgB,QAAQ,WAAW,QAAQ,IAAI;AAAA,MAC9D;AACA,cAAQ,EAAE,GAAG,SAAS,mBAAmB,QAAQ,OAAO,GAAG,WAAW,kBAAkB,KAAK;AAAA,IAC/F,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,kBAAkB,KAAK;AAAA,IAC9C;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,YAAY,uCAAuC,EACnD,eAAe,oBAAoB,gCAAgC,EACnE,OAAO,sBAAsB,+BAA+B,SAAS,CAAC,CAAC,EACvE,OAAO,8BAA8B,wEAAwE,SAAS,CAAC,CAAC,EACxH,OAAO,qBAAqB,0DAA0D,EACtF,OAAO,kBAAkB,kCAAkC,KAAK,EAChE,OAAO,UAAU,oCAAoC,KAAK,EAC1D,OAAO,kBAAkB,iCAAiC,OAAO,kBAAkB,CAAC,EACpF,OAAO,OAAO,YAQT;AACJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAID,WAAUC,QAAO;AAC5C,YAAM,aAAa,QAAQ,KAAqD;AAChF,YAAM,cAAc,mBAAmB,QAAQ,WAAW,WAAW;AACrE,YAAM,cAAc,mBAAmB,QAAQ,WAAW,WAAW;AAErE,YAAM,aAAa,QAAQ;AAC3B,YAAM,WAAW,QAAQ;AACzB,YAAM,iBAAiB,WAAW,IAAI,CAAC,GAAG,OAAO;AAAA,QAC/C,WAAW;AAAA,QACX,SAAS,SAAS,CAAC,KAAK;AAAA,MAC1B,EAAE;AAEF,YAAM,SAAS,MAAM,OAAO,WAAW;AAAA,QACrC;AAAA,QACA,oBAAoB,QAAQ;AAAA,QAC5B;AAAA,QACA,aAAa,QAAQ;AAAA,QACrB,GAAI,eAAe,SAAS,IAAI,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,QAChE,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MAC3D,CAAC;AAED,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,QAAQ,WAAW,OAAO,KAAK;AACvC;AAAA,MACF;AAEA,YAAM,YAAY,SAAS,QAAQ,SAAS,EAAE;AAC9C,YAAM,YAAY,OAAO;AACzB,UAAI,gCAAgC,SAAS,6BAA6B;AAE1E,aAAO,MAAM;AACX,cAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,YAAI,WAAW,WAAW;AACxB,gBAAM,IAAI,WAAW,mBAAmB,SAAS,0BAA0B,SAAS,IAAI,CAAC;AAAA,QAC3F;AAEA,cAAM,MAAMF,iBAAgB;AAE5B,cAAM,SAAS,MAAM,OAAO,iBAAiB,SAAS;AAEtD,YAAI,OAAO,WAAW,UAAU;AAC9B,gBAAM,UAAU,EAAE,WAAW,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,YAAY,KAAK,IAAI,IAAI,MAAM;AAC1G,cAAI,OAAO,WAAW,aAAa;AACjC,oBAAQ,SAAS,WAAW,OAAO,KAAK;AAAA,UAC1C,OAAO;AACL,kBAAM,IAAI;AAAA,cACR,cAAc,OAAO,UAAU,QAAQ,gBAAgB,SAAS;AAAA,cAChE;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAEA,YAAI,WAAW,OAAO,MAAM,KAAK,KAAK,OAAO,KAAK,IAAI,IAAI,SAAS,GAAI,CAAC,YAAY;AAAA,MACtF;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,OAAO,KAAK;AAAA,IACnC;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,gBAAgB,EACxB,YAAY,wDAAwD,EACpE,eAAe,qBAAqB,oCAAoC,EACxE,OAAO,OAAO,YAAmC;AAChD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAIC,WAAUC,QAAO;AACpC,YAAM,SAAS,MAAM,OAAO,iBAAiB,QAAQ,SAAS;AAC9D,cAAQ,QAAQ,WAAW,kBAAkB,KAAK;AAAA,IACpD,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,kBAAkB,KAAK;AAAA,IAC9C;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,cAAc,EACtB,YAAY,kDAAkD,EAC9D,eAAe,qBAAqB,oCAAoC,EACxE,OAAO,OAAO,YAAmC;AAChD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,OAAO,IAAID,WAAUC,QAAO;AACpC,YAAM,OAAO,MAAM,OAAO,eAAe,QAAQ,SAAS;AAC1D,cAAQ,MAAM,WAAW,gBAAgB,KAAK;AAAA,IAChD,SAAS,KAAK;AACZ,WAAK,KAAK,WAAW,gBAAgB,KAAK;AAAA,IAC5C;AAAA,EACF,CAAC;AACL;AAEA,SAAS,QAAQ,KAAa,MAA0B;AACtD,SAAO,CAAC,GAAG,MAAM,GAAG;AACtB;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;;;ACnOO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,eAAwC;AAC5C,UAAM,MAAM,MAAM,KAAK,KAAK,UAAiC,YAAY,EAAE,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;AACnG,UAAM,WAAW,IAAI,YAAY,CAAC;AAClC,QAAI,IAAI,qBAAqB,SAAS,QAAQ;AAC5C,cAAQ,OAAO,MAAM,YAAY,IAAI,kBAAkB,uCAAuC,SAAS,MAAM;AAAA,CAAI;AAAA,IACnH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,IAAmC;AAClD,WAAO,KAAK,KAAK,UAAwB,YAAY,EAAE,EAAE;AAAA,EAC3D;AAAA,EAEA,MAAM,UAAU,OAA8C,CAAC,GAAyB;AACtF,UAAM,SAA0C,EAAE,OAAO,KAAK,QAAQ,IAAI;AAC1E,QAAI,KAAK,UAAW,QAAO,YAAY,IAAI,KAAK;AAChD,UAAM,MAAM,MAAM,KAAK,KAAK,UAA8B,SAAS,EAAE,OAAO,CAAC;AAC7E,UAAM,QAAQ,IAAI,SAAS,CAAC;AAC5B,QAAI,IAAI,qBAAqB,MAAM,QAAQ;AACzC,cAAQ,OAAO,MAAM,YAAY,IAAI,kBAAkB,oCAAoC,MAAM,MAAM;AAAA,CAAI;AAAA,IAC7G;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,IAAgC;AAC5C,WAAO,KAAK,KAAK,UAAqB,SAAS,EAAE,EAAE;AAAA,EACrD;AAAA,EAEA,MAAM,yBAAyB,QAA8C;AAC3E,WAAO,KAAK,KAAK,UAA+B,mBAAmB;AAAA,MACjE,QAAQ,EAAE,WAAW,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;;;ACtCA,SAASC,YAAUC,UAAmC;AACpD,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAC3E,MAAI,CAAC,OAAO,UAAU,QAAS,OAAM,IAAI,WAAW,kDAAkD;AACtG,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,IAAI,gBAAgB,IAAI;AACjC;AAEO,SAAS,0BAA0BA,UAAwB;AAChE,QAAM,KAAKA,SAAQ,QAAQ,WAAW,EAAE,YAAY,0BAA0B;AAC9E,QAAM,UAAU,GAAG,QAAQ,SAAS,EAAE,YAAY,oBAAoB;AACtE,QAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,YAAY,iBAAiB;AAE7D,UACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,YAAY;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAMD,YAAUC,QAAO,EAAE,aAAa;AACnD,cAAQ,MAAM,aAAa,gBAAgB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,gBAAgB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC,eAAe,aAAa,cAAc,EAC1C,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAMD,YAAUC,QAAO,EAAE,WAAW,KAAK,EAAE;AACxD,cAAQ,MAAM,aAAa,eAAe,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,eAAe,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,YAAY,EACxB,OAAO,kBAAkB,wBAAwB,EACjD,OAAO,cAAc,8BAA8B,EACnD,OAAO,OAAO,SAA8C;AAC3D,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,KAAK,OAAO,SAAS,KAAK,MAAM,EAAE,IAAI;AACnD,UAAI,KAAK,QAAQ,MAAM,IAAK,EAAG,OAAM,IAAI,WAAW,mBAAmB,KAAK,IAAI,2BAA2B,CAAC;AAC5G,YAAM,OAAO,MAAMD,YAAUC,QAAO,EAAE,UAAU,EAAE,WAAW,KAAK,SAAS,KAAK,CAAC;AACjF,cAAQ,MAAM,aAAa,aAAa,KAAK;AAAA,IAC/C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,aAAa,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,OACG,QAAQ,KAAK,EACb,YAAY,kBAAkB,EAC9B,eAAe,aAAa,WAAW,EACvC,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAMD,YAAUC,QAAO,EAAE,QAAQ,KAAK,EAAE;AACrD,cAAQ,MAAM,aAAa,YAAY,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,YAAY,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,OACG,QAAQ,OAAO,EACf,YAAY,mCAAmC,EAC/C,eAAe,aAAa,WAAW,EACvC,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAMD,YAAUC,QAAO,EAAE,yBAAyB,KAAK,EAAE;AACtE,cAAQ,MAAM,aAAa,cAAc,KAAK;AAAA,IAChD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,cAAc,KAAK;AAAA,IAAG;AAAA,EAC/D,CAAC;AACL;;;ACrDA,SAAS,QAAQC,UAAkB;AACjC,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAC3E,MAAI,CAAC,OAAO,WAAW,QAAS,OAAM,IAAI,WAAW,mDAAmD;AACxG,SAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AACtD;AAEO,SAAS,2BAA2BA,UAAwB;AACjE,QAAM,KAAKA,SAAQ,QAAQ,YAAY,EAAE,YAAY,uBAAuB;AAC5E,QAAM,SAAS,GAAG,QAAQ,QAAQ,EAAE,YAAY,2BAA2B;AAE3E,SACG,QAAQ,MAAM,EACd,YAAY,sBAAsB,EAClC,OAAO,mBAAmB,kFAAkF,EAC5G,OAAO,wBAAwB,gDAAgD,EAC/E,OAAO,eAAe,6BAA6B,IAAI,EACvD,OAAO,qBAAqB,uCAAuC,EACnE,OAAO,OAAO,SAAmF;AAChG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,QAAQA,QAAO;AAC5B,YAAM,SAAgE;AAAA,QACpE,eAAe,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,QACvD,uBAAuB;AAAA,MACzB;AACA,YAAM,WAAW,CAAC,MAAc,EAAE,QAAQ,OAAO,EAAE;AACnD,YAAM,UAAoB,CAAC;AAC3B,UAAI,KAAK,UAAU,OAAW,SAAQ,KAAK,SAAS,SAAS,KAAK,KAAK,CAAC,EAAE;AAC1E,UAAI,KAAK,WAAY,SAAQ,KAAK,eAAe,SAAS,KAAK,UAAU,CAAC,EAAE;AAC5E,UAAI,QAAQ,OAAQ,QAAO,eAAe,IAAI,QAAQ,KAAK,GAAG;AAC9D,UAAI,KAAK,OAAQ,QAAO,gBAAgB,IAAI,KAAK;AAEjD,YAAM,OAAO,MAAM,KAAK,WAA6B,iCAAiC,EAAE,OAAO,CAAC;AAChG,cAAQ,KAAK,QAAQ,cAAc,eAAe,KAAK;AAAA,IACzD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,eAAe,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,0CAA0C,EACtD,eAAe,aAAa,mDAAmD,EAC/E,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,QAAQA,QAAO;AAC5B,UAAI,KAAK,GAAG,YAAY,EAAE,WAAW,KAAK,GAAG;AAC3C,cAAM,OAAO,MAAM,KAAK,WAA6B,iCAAiC;AAAA,UACpF,QAAQ,EAAE,eAAe,UAAU,KAAK,EAAE,IAAI,uBAAuB,QAAQ,eAAe,EAAE;AAAA,QAChG,CAAC;AACD,YAAI,CAAC,KAAK,OAAO,OAAQ,OAAM,IAAI,WAAW,6BAA6B,KAAK,EAAE,IAAI,CAAC;AACvF,gBAAQ,KAAK,OAAO,CAAC,GAAG,cAAc,cAAc,KAAK;AACzD;AAAA,MACF;AACA,YAAM,OAAO,MAAM,KAAK,WAA+B,iCAAiC,KAAK,EAAE,IAAI;AAAA,QACjG,QAAQ,EAAE,uBAAuB,OAAO;AAAA,MAC1C,CAAC;AACD,cAAQ,KAAK,QAAQ,cAAc,cAAc,KAAK;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,cAAc,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,eAAe,8BAA8B,2BAA2B,EACxE,OAAO,wBAAwB,kBAAkB,EACjD,OAAO,iBAAiB,+CAA+C,QAAQ,EAC/E,OAAO,kBAAkB,iDAAiD,EAC1E,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,8BAA8B,yBAAyB,EAC9D,OAAO,2BAA2B,0CAA0C,EAC5E,OAAO,yBAAyB,wCAAwC,EACxE,OAAO,OAAO,SAST;AACJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,QAAQA,QAAO;AAC5B,YAAM,OAAgC;AAAA,QACpC,mBAAmB,KAAK;AAAA,QACxB,MAAM,KAAK,QAAQ;AAAA,MACrB;AACA,UAAI,KAAK,YAAa,MAAK,aAAa,IAAI,KAAK;AACjD,UAAI,KAAK,SAAU,MAAK,UAAU,IAAI,KAAK;AAC3C,UAAI,KAAK,WAAY,MAAK,aAAa,IAAI,KAAK;AAChD,UAAI,KAAK,gBAAiB,MAAK,kBAAkB,IAAI,KAAK;AAC1D,UAAI,KAAK,UAAW,MAAK,YAAY,IAAI,KAAK;AAC9C,UAAI,KAAK,QAAS,MAAK,UAAU,IAAI,KAAK;AAE1C,YAAM,OAAO,MAAM,KAAK,WAA+B,iCAAiC;AAAA,QACtF,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,QAAQ,cAAc,iBAAiB,KAAK;AAAA,IAC3D,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,iBAAiB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,eAAe,iBAAiB,uBAAuB,EACvD,OAAO,8BAA8B,uBAAuB,EAC5D,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,mBAAmB,iBAAiB,EAC3C,OAAO,kBAAkB,cAAc,EACvC,OAAO,wBAAwB,0BAA0B,EACzD,OAAO,2BAA2B,wBAAwB,EAC1D,OAAO,yBAAyB,sBAAsB,EACtD,OAAO,OAAO,SAST;AACJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,QAAQA,QAAO;AAC5B,YAAM,OAAgC,CAAC;AACvC,UAAI,KAAK,iBAAkB,MAAK,mBAAmB,IAAI,KAAK;AAC5D,UAAI,KAAK,YAAa,MAAK,aAAa,IAAI,KAAK;AACjD,UAAI,KAAK,UAAU,OAAW,MAAK,OAAO,IAAI,KAAK;AACnD,UAAI,KAAK,SAAU,MAAK,UAAU,IAAI,KAAK;AAC3C,UAAI,KAAK,WAAY,MAAK,aAAa,IAAI,KAAK;AAChD,UAAI,KAAK,UAAW,MAAK,YAAY,IAAI,KAAK;AAC9C,UAAI,KAAK,QAAS,MAAK,UAAU,IAAI,KAAK;AAE1C,UAAI,OAAO,KAAK,IAAI,EAAE,WAAW,EAAG,OAAM,IAAI,WAAW,kEAAkE,CAAC;AAE5H,YAAM,OAAO,MAAM,KAAK,WAA+B,iCAAiC,KAAK,EAAE,IAAI;AAAA,QACjG,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,QAAQ,cAAc,iBAAiB,KAAK;AAAA,IAC3D,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,iBAAiB,KAAK;AAAA,IAAG;AAAA,EACnE,CAAC;AAEH,SACG,QAAQ,OAAO,EACf,YAAY,kCAAkC,EAC9C,eAAe,iBAAiB,uBAAuB,EACvD,OAAO,wBAAwB,eAAe,EAC9C,OAAO,uBAAuB,4CAA4C,EAC1E,OAAO,OAAO,SAAkE;AAC/E,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,QAAQA,QAAO;AAC5B,YAAM,OAAgC,EAAE,OAAO,EAAE;AACjD,UAAI,KAAK,WAAY,MAAK,aAAa,IAAI,KAAK;AAChD,UAAI,KAAK,UAAW,MAAK,YAAY,IAAI,KAAK;AAE9C,YAAM,OAAO,MAAM,KAAK,WAA+B,iCAAiC,KAAK,EAAE,IAAI;AAAA,QACjG,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,QAAQ,cAAc,gBAAgB,KAAK;AAAA,IAC1D,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AACL;;;AC9LA,SAAS,cAAcC,UAAkB;AACvC,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAC3E,MAAI,CAAC,OAAO,SAAS,UAAU,CAAC,OAAO,SAAS,cAAc,CAAC,OAAO,SAAS,SAAU,OAAM,IAAI,WAAW,iDAAiD;AAC/J,MAAI,CAAC,OAAO,SAAS,QAAS,OAAM,IAAI,WAAW,iFAAiF;AACpI,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO,EAAE,MAAM,SAAS,OAAO,SAAS,QAAQ;AAClD;AAEO,SAAS,yBAAyBA,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,0BAA0B;AAEnF,QAAM,OAAO,SAAS,QAAQ,MAAM,EAAE,YAAY,wBAAwB;AAE1E,OACG,QAAQ,MAAM,EACd,YAAY,uCAAuC,EACnD,OAAO,eAAe,6BAA6B,IAAI,EACvD,OAAO,gBAAgB,qBAAqB,GAAG,EAC/C,OAAO,OAAO,SAA8C;AAC3D,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,MAAM,QAAQ,IAAI,cAAcA,QAAO;AAC/C,YAAM,OAAO,MAAM,KAAK,SAAkB,oBAAoB,OAAO,iBAAiB;AAAA,QACpF,QAAQ;AAAA,UACN,OAAO,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,UAC/C,QAAQ,KAAK,SAAS,SAAS,KAAK,QAAQ,EAAE,IAAI;AAAA,QACpD;AAAA,MACF,CAAC;AACD,cAAQ,MAAM,YAAY,aAAa,KAAK;AAAA,IAC9C,SAAS,KAAK;AAAE,WAAK,KAAK,YAAY,aAAa,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,QAAM,WAAW,SAAS,QAAQ,UAAU,EAAE,YAAY,mCAAmC;AAE7F,WACG,QAAQ,MAAM,EACd,YAAY,gDAAgD,EAC5D,eAAe,kBAAkB,uBAAuB,EACxD,OAAO,sBAAsB,uDAAuD,EACpF,OAAO,qBAAqB,qFAAqF,EACjH,OAAO,eAAe,6BAA6B,IAAI,EACvD,OAAO,gBAAgB,qBAAqB,GAAG,EAC/C,OAAO,OAAO,SAA+F;AAC5G,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,MAAM,QAAQ,IAAI,cAAcA,QAAO;AAC/C,YAAM,SAAgE;AAAA,QACpE,OAAO,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,QAC/C,QAAQ,KAAK,SAAS,SAAS,KAAK,QAAQ,EAAE,IAAI;AAAA,MACpD;AACA,UAAI,KAAK,SAAU,QAAO,YAAY,IAAI,KAAK;AAC/C,UAAI,KAAK,OAAQ,QAAO,UAAU,IAAI,KAAK;AAE3C,YAAM,OAAO,MAAM,KAAK;AAAA,QACtB,oBAAoB,OAAO,WAAW,KAAK,GAAG;AAAA,QAC9C,EAAE,OAAO;AAAA,MACX;AACA,cAAQ,MAAM,YAAY,iBAAiB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,YAAY,iBAAiB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,WACG,QAAQ,KAAK,EACb,YAAY,kDAAkD,EAC9D,eAAe,kBAAkB,uBAAuB,EACxD,eAAe,sBAAsB,oBAAoB,EACzD,OAAO,OAAO,SAAyC;AACtD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,EAAE,MAAM,QAAQ,IAAI,cAAcA,QAAO;AAC/C,YAAM,OAAO,MAAM,KAAK;AAAA,QACtB,oBAAoB,OAAO,WAAW,KAAK,GAAG,UAAU,KAAK,KAAK;AAAA,MACpE;AACA,cAAQ,MAAM,YAAY,gBAAgB,KAAK;AAAA,IACjD,SAAS,KAAK;AAAE,WAAK,KAAK,YAAY,gBAAgB,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AACL;;;AC7EA,SAAS,cAAcC,UAAkB;AACvC,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAC3E,MAAI,CAAC,OAAO,WAAW,QAAS,OAAM,IAAI,WAAW,mEAAmE;AACxH,MAAI,CAAC,OAAO,WAAW,YAAY,CAAC,OAAO,WAAW,SAAU,OAAM,IAAI,WAAW,uEAAuE;AAC5J,QAAM,OAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO;AACT;AAEO,SAAS,2BAA2BA,UAAwB;AACjE,QAAM,aAAaA,SAAQ,QAAQ,YAAY,EAAE,YAAY,+BAA+B;AAE5F,QAAM,eAAe,WAAW,QAAQ,cAAc,EAAE,YAAY,wBAAwB;AAE5F,eACG,QAAQ,MAAM,EACd,YAAY,6CAA6C,EACzD,OAAO,0BAA0B,2BAA2B,EAC5D,OAAO,OAAO,SAAsC;AACnD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,OAAO,cAAcA,QAAO;AAClC,YAAM,SAAgE,CAAC;AACvE,UAAI,KAAK,eAAgB,QAAO,gBAAgB,IAAI,KAAK;AACzD,YAAM,OAAO,MAAM,KAAK,WAAoB,wBAAwB,EAAE,OAAO,CAAC;AAC9E,cAAQ,MAAM,cAAc,qBAAqB,SAAS;AAAA,IAC5D,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,qBAAqB,SAAS;AAAA,IAAG;AAAA,EAC3E,CAAC;AAEH,eACG,QAAQ,KAAK,EACb,YAAY,qCAAqC,EACjD,eAAe,oBAAoB,uBAAuB,EAC1D,OAAO,OAAO,SAA+B;AAC5C,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,OAAO,cAAcA,QAAO;AAClC,YAAM,OAAO,MAAM,KAAK,WAAoB,wBAAwB;AAAA,QAClE,QAAQ,EAAE,UAAU,KAAK,SAAS;AAAA,MACpC,CAAC;AACD,cAAQ,MAAM,cAAc,oBAAoB,SAAS;AAAA,IAC3D,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,oBAAoB,SAAS;AAAA,IAAG;AAAA,EAC1E,CAAC;AAEH,QAAM,gBAAgB,WAAW,QAAQ,eAAe,EAAE,YAAY,yBAAyB;AAE/F,gBACG,QAAQ,MAAM,EACd,YAAY,8CAA8C,EAC1D,OAAO,YAAY;AAClB,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,OAAO,cAAcA,QAAO;AAClC,YAAM,OAAO,MAAM,KAAK,WAAoB,uBAAuB;AACnE,cAAQ,MAAM,cAAc,sBAAsB,SAAS;AAAA,IAC7D,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,sBAAsB,SAAS;AAAA,IAAG;AAAA,EAC5E,CAAC;AAEH,QAAM,WAAW,WAAW,QAAQ,UAAU,EAAE,YAAY,mBAAmB;AAE/E,WACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,0BAA0B,2BAA2B,EAC5D,OAAO,OAAO,SAAsC;AACnD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,OAAO,cAAcA,QAAO;AAClC,YAAMC,QAAO,KAAK,iBACd,iCAAiC,mBAAmB,KAAK,cAAc,CAAC,KACxE;AACJ,YAAM,OAAO,MAAM,KAAK,WAAoBA,KAAI;AAChD,cAAQ,MAAM,cAAc,iBAAiB,SAAS;AAAA,IACxD,SAAS,KAAK;AAAE,WAAK,KAAK,cAAc,iBAAiB,SAAS;AAAA,IAAG;AAAA,EACvE,CAAC;AACL;;;AC/EA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,SAAS,gBAAAC,qBAAoB;AAC7B,OAAO,YAAY;AACnB,OAAO,YAAY,iBAAiB;AACpC,OAAOC,YAAW;AAIlB,IAAM,OAAO;AACb,IAAM,mBAAmB;AASlB,SAAS,mBAAmB,KAAa,OAAuB;AACrE,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,GAAG;AAAA,EACtB,QAAQ;AACN,UAAM,IAAI,MAAM,6CAA6C,GAAG,EAAE;AAAA,EACpE;AACA,SAAO,WAAW,OAAO,aAAa,eAAe,mBAAmB;AACxE,SAAO,WAAW;AAClB,SAAO,OAAO,SAAS;AACzB;AAOO,SAAS,gBAAgB,KAAqB;AACnD,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,UAAU,OAAO,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK;AACpE,WAAO,QAAQ,QAAQ,WAAW,EAAE,KAAK;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,uBAAuB,KAAqB;AAC1D,SAAOC,MAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,gBAAgB,gBAAgB,GAAG,CAAC;AAChF;AAEA,SAAS,iBAAiB,GAA8B;AACtD,SAAO,EAAE,QAAQ,gBAAgB,EAAE,WAAW,EAAE;AAClD;AAGA,SAAS,WAAW,KAAqB;AACvC,SAAO,IAAI,QAAQ,yCAAyC,mBAAmB;AACjF;AAOA,SAAS,kBAAkB,MAAoB;AAC7C,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAM,IAAI,MAAM,oDAAoD,IAAI,EAAE;AAAA,EAC5E;AACF;AAEA,IAAM,cAAiE;AAAA,EACrE,kBAAkB,EAAE,SAAS,kBAAmB,MAAMA,MAAK,KAAK,GAAG,QAAQ,GAAG,gBAAgB,EAAE;AAAA,EAChG,eAAkB,EAAE,SAAS,kBAAoB,MAAMA,MAAK,KAAK,GAAG,QAAQ,GAAG,gBAAgB,EAAE;AACnG;AAEA,SAAS,iBAAiB,MAAoD;AAC5E,SAAO,KAAK,SAAS,gBAAiB,KAAK,SAAS;AACtD;AAEA,SAAS,kBAAkB,WAAsD;AAC/E,QAAM,cAAc,YAAY,SAAS;AACzC,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,mBAAmB,SAAS,WAAW,OAAO,KAAK,WAAW,EAAE,KAAK,KAAK,CAAC,EAAE;AAAA,EAC/F;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAqF;AAC7G,MAAI,KAAK,OAAQ,QAAOA,MAAK,QAAQ,KAAK,MAAM;AAChD,QAAM,cAAc,kBAAkB,iBAAiB,IAAI,CAAC;AAC5D,QAAM,aAAa,KAAK,SAAS,YAAY,YAAY,YAAY,UAAU,YAAY;AAC3F,SAAOA,MAAK,QAAQ,SAAS;AAC/B;AAGA,SAAS,sBAA8B;AACrC,MAAI;AACF,UAAM,WAAW,cAAc,YAAY,GAAG;AAC9C,WAAOA,MAAK,QAAQA,MAAK,QAAQ,QAAQ,GAAG,MAAM,QAAQ;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,qBAAqB,WAA2B;AAC9D,SAAOA,MAAK,KAAK,WAAW,uBAAuB;AACrD;AAyBA,IAAM,wBAAwB;AAMvB,IAAM,kBAAkB;AAWxB,SAAS,kBAAkB,WAAkC;AAClE,QAAM,WAAW,qBAAqB,SAAS;AAC/C,QAAM,MAAM,aAA4B,QAAQ;AAChD,MAAI,OAAO,IAAI,YAAY,KAAK,IAAI,OAAQ,QAAO;AACnD,SAAO,EAAE,SAAS,GAAG,QAAQ,CAAC,EAAE;AAClC;AAKO,SAAS,mBAAmB,UAA0B;AAC3D,SAAOA,MAAK,KAAK,UAAU,qBAAqB;AAClD;AAMO,SAAS,gBAAgB,UAAsC;AACpE,QAAM,aAAa,mBAAmB,QAAQ;AAC9C,MAAI,CAACC,IAAG,WAAW,UAAU,EAAG,QAAO;AACvC,MAAI;AACF,UAAM,MAAM,KAAK,MAAMA,IAAG,aAAa,YAAY,MAAM,CAAC;AAC1D,QAAI,OAAO,IAAI,YAAY,KAAK,IAAI,OAAQ,QAAO;AAAA,EACrD,QAAQ;AAAA,EAA4B;AACpC,SAAO;AACT;AAEA,SAAS,yBAAyB,QAA8B,QAA0B;AACxF,SAAO,CAAC,UAAU,OAAO,gBAAgB,UAAU,OAAO,kBAAkB;AAC9E;AAOA,SAAS,mBAAmB,MAAqB,WAAmB,WAAgD;AAClH,QAAM,WAAW,KAAK,OAAO,SAAS;AACtC,MAAI,SAAU,QAAO;AACrB,QAAM,WAAW,gBAAgBD,MAAK,KAAK,WAAW,SAAS,CAAC;AAChE,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,aAAa,SAAS;AAAA,IACtB,QAAQ,SAAS;AAAA,IACjB,eAAe,SAAS;AAAA,IACxB,QAAQ,SAAS;AAAA,IACjB,aAAa,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,oBAAoB,WAA6B;AACxD,SAAOC,IAAG,YAAY,SAAS,EAAE,OAAO,UAAQ;AAC9C,QAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AACjC,UAAM,IAAID,MAAK,KAAK,WAAW,IAAI;AACnC,QAAI;AAAE,aAAOC,IAAG,SAAS,CAAC,EAAE,YAAY;AAAA,IAAG,QAAQ;AAAE,aAAO;AAAA,IAAO;AAAA,EACrE,CAAC;AACH;AAeO,SAAS,oBAAoB,WAAmB,QAAgB,mBAAiD;AACtH,QAAM,iBAAiBD,MAAK,QAAQ,SAAS;AAC7C,QAAM,WAAWA,MAAK,KAAK,WAAW,eAAe;AACrD,QAAM,OAAO,kBAAkB,SAAS;AACxC,QAAM,WAAqB,CAAC;AAC5B,QAAM,kBAA4B,CAAC;AACnC,QAAM,UAAoB,CAAC;AAE3B,aAAW,aAAa,oBAAoB,SAAS,GAAG;AACtD,UAAM,WAAWA,MAAK,QAAQ,WAAW,SAAS;AAClD,QAAI,CAAC,SAAS,WAAW,iBAAiBA,MAAK,GAAG,EAAG;AAErD,UAAM,SAAS,mBAAmB,MAAM,WAAW,SAAS;AAC5D,QAAI,CAAC,UAAU,OAAO,WAAW,eAAe;AAAE,cAAQ,KAAK,SAAS;AAAG;AAAA,IAAU;AACrF,QAAI,CAAC,yBAAyB,QAAQ,iBAAiB,KAAK,OAAO,WAAW,QAAQ;AAAE,cAAQ,KAAK,SAAS;AAAG;AAAA,IAAU;AAE3H,UAAM,YAAYA,MAAK,KAAK,UAAU,SAAS;AAC/C,IAAAC,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAC1C,QAAIA,IAAG,WAAW,SAAS,EAAG,CAAAA,IAAG,OAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnF,IAAAA,IAAG,WAAW,UAAU,SAAS;AACjC,WAAO,KAAK,OAAO,SAAS;AAC5B,SAAK,WAAW,KAAK,YAAY,CAAC;AAClC,SAAK,SAAS,SAAS,IAAI;AAC3B,aAAS,KAAK,SAAS;AAAA,EACzB;AAEA,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,GAAG;AACrE,QAAI,OAAO,WAAW,UAAU,yBAAyB,QAAQ,iBAAiB,KAAK,CAAC,SAAS,SAAS,SAAS,GAAG;AACpH,sBAAgB,KAAK,SAAS;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,IAAAA,IAAG,cAAc,qBAAqB,SAAS,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AAAA,EACzF;AACA,SAAO,EAAE,UAAU,iBAAiB,QAAQ;AAC9C;AAgBO,SAAS,mBAAmB,WAAmB,QAAgB,mBAAgD;AACpH,QAAM,iBAAiBD,MAAK,QAAQ,SAAS;AAC7C,QAAM,WAAWA,MAAK,KAAK,WAAW,eAAe;AACrD,QAAM,OAAO,kBAAkB,SAAS;AACxC,QAAM,UAAoB,CAAC;AAC3B,QAAM,eAAyB,CAAC;AAChC,QAAM,UAAoB,CAAC;AAE3B,QAAM,kBAAkB,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC;AAC1D,aAAW,CAAC,WAAW,MAAM,KAAK,iBAAiB;AACjD,QAAI,OAAO,WAAW,UAAU,CAAC,yBAAyB,QAAQ,iBAAiB,GAAG;AAAE,cAAQ,KAAK,SAAS;AAAG;AAAA,IAAU;AAG3H,UAAM,OAAOA,MAAK,QAAQ,WAAW,SAAS;AAC9C,QAAI,CAAC,KAAK,WAAW,iBAAiBA,MAAK,GAAG,GAAG;AAAE,cAAQ,KAAK,SAAS;AAAG;AAAA,IAAU;AAEtF,UAAM,WAAWA,MAAK,KAAK,UAAU,SAAS;AAC9C,QAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,mBAAa,KAAK,SAAS;AAC3B;AAAA,IACF;AAEA,QAAIA,IAAG,WAAW,IAAI,EAAG,CAAAA,IAAG,OAAO,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACzE,IAAAA,IAAG,WAAW,UAAU,IAAI;AAC5B,SAAK,OAAO,SAAS,IAAI;AACzB,WAAO,KAAK,SAAU,SAAS;AAC/B,YAAQ,KAAK,SAAS;AAAA,EACxB;AAEA,MAAIA,IAAG,WAAW,QAAQ,KAAKA,IAAG,YAAY,QAAQ,EAAE,WAAW,GAAG;AACpE,IAAAA,IAAG,UAAU,QAAQ;AAAA,EACvB;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAAA,IAAG,cAAc,qBAAqB,SAAS,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AAAA,EACzF;AACA,SAAO,EAAE,SAAS,cAAc,SAAS,aAAa,gBAAgB,SAAS,EAAE;AACnF;AAaO,SAAS,iBAAiB,WAAwC;AACvE,QAAM,OAAO,kBAAkB,SAAS;AACxC,QAAM,QAAQ,oBAAI,IAA+B;AACjD,QAAM,YAAY,CAAC,WAA2D;AAC5E,QAAI,OAAO,WAAW,iBAAiB,CAAC,OAAO,OAAQ,QAAO;AAC9D,UAAM,kBAAkB,OAAO,eAAe,OAAO;AACrD,UAAM,MAAM,GAAG,mBAAmB,EAAE,KAAS,OAAO,MAAM;AAC1D,QAAI,QAAQ,MAAM,IAAI,GAAG;AACzB,QAAI,CAAC,OAAO;AACV,cAAQ,EAAE,QAAQ,OAAO,QAAQ,aAAa,iBAAiB,cAAc,CAAC,GAAG,gBAAgB,CAAC,EAAE;AACpG,YAAM,IAAI,KAAK,KAAK;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAEA,aAAW,aAAa,oBAAoB,SAAS,GAAG;AACtD,UAAM,SAAS,mBAAmB,MAAM,WAAW,SAAS;AAC5D,QAAI,OAAQ,WAAU,MAAM,GAAG,aAAa,KAAK,SAAS;AAAA,EAC5D;AACA,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,GAAG;AACrE,cAAU,MAAM,GAAG,eAAe,KAAK,SAAS;AAAA,EAClD;AACA,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAC5E;AAMO,SAAS,iBAAiB,UAAsC;AACrE,MAAI;AACF,UAAM,SAASC,cAAa,OAAO,CAAC,MAAM,UAAU,aAAa,gBAAgB,MAAM,GAAG;AAAA,MACxF,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC,EAAE,KAAK;AACR,WAAO,UAAU,WAAW,SAAS,SAAS;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQO,SAAS,sBAAsB,WAAmB,YAAsB,QAAyD;AACtI,MAAI,WAAW,WAAW,EAAG;AAC7B,QAAM,OAAO,kBAAkB,SAAS;AACxC,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,aAAW,aAAa,YAAY;AAClC,UAAM,aAAmC,EAAE,GAAG,QAAQ,aAAa,IAAI;AACvE,SAAK,OAAO,SAAS,IAAI;AAGzB,UAAM,WAAWF,MAAK,KAAK,WAAW,SAAS;AAC/C,QAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,YAAM,SAAsB,EAAE,SAAS,GAAG,GAAG,WAAW;AACxD,UAAI;AACF,QAAAA,IAAG,cAAc,mBAAmB,QAAQ,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,MAAM;AAAA,MACxF,QAAQ;AAAA,MAAqE;AAAA,IAC/E;AAAA,EACF;AACA,EAAAA,IAAG,cAAc,qBAAqB,SAAS,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AACzF;AAMO,SAAS,mBAAmB,cAAiD;AAClF,QAAM,SAA8B,CAAC;AACrC,MAAI,MAAM,QAAQ,aAAa,YAAY,GAAG;AAC5C,WAAO,KAAK,GAAG,aAAa,YAAY;AAAA,EAC1C;AACA,MAAI,aAAa,aAAa,SAAS;AACrC,UAAM,YAAY,aAAa,YAAY;AAC3C,UAAM,iBAAiB,OAAO,KAAK,OAAK,EAAE,YAAY,SAAS;AAC/D,QAAI,CAAC,gBAAgB;AACnB,YAAM,gBAAgB,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,IAAI,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC,CAAC;AACrF,UAAI,aAAa,aAAa,YAAY,QAAQ,gBAAgB,SAAS;AAC3E,UAAI,cAAc,IAAI,UAAU,GAAG;AACjC,YAAI,SAAS;AACb,eAAO,cAAc,IAAI,GAAG,UAAU,IAAI,MAAM,EAAE,EAAG;AACrD,qBAAa,GAAG,UAAU,IAAI,MAAM;AAAA,MACtC;AACA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,aAAa,YAAY;AAAA,QAClC,WAAW,aAAa,YAAY;AAAA,QACpC,OAAO,aAAa,YAAY;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,iBAAiB,YAAoB,UAAwB,cAAyC;AAC7G,QAAM,UAAwB,EAAE,GAAG,UAAU,aAAa;AAC1D,SAAO,QAAQ;AACf,oBAAkB,SAAS,UAAU;AACvC;AAQA,SAAS,uBAAuB,YAA0E;AACxG,QAAM,WAAyB,aAA2B,UAAU,KAAK,CAAC;AAC1E,QAAM,MAAM,mBAAmB,QAAQ;AACvC,MAAI,SAAS,aAAa,SAAS;AACjC,qBAAiB,YAAY,UAAU,GAAG;AAC1C,SAAK,4EAA4E;AACjF,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,EAAE,UAAU,IAAI;AACzB;AAEA,SAAS,iBAAiB,YAAyC;AACjE,SAAO,uBAAuB,UAAU,EAAE;AAC5C;AAMO,SAAS,kBAAkB,KAA0B,OAAgC;AAC1F,QAAM,WAAW,IAAI,UAAU,OAAK,EAAE,YAAY,MAAM,OAAO;AAC/D,QAAM,YAAY,IAAI,UAAU,OAAK,EAAE,SAAS,MAAM,IAAI;AAC1D,MAAI,aAAa,IAAI;AACnB,QAAI,cAAc,MAAM,cAAc,UAAU;AAC9C,YAAM,IAAI,MAAM,qBAAqB,MAAM,IAAI,iDAAiD,IAAI,SAAS,EAAE,OAAO,+BAA+B;AAAA,IACvJ;AAEA,QAAI,QAAQ,IAAI,EAAE,GAAG,OAAO,OAAO,MAAM,SAAS,IAAI,QAAQ,EAAE,MAAM;AAAA,EACxE,WAAW,cAAc,IAAI;AAC3B,UAAM,IAAI,MAAM,qBAAqB,MAAM,IAAI,iDAAiD,IAAI,SAAS,EAAE,OAAO,yEAAyE;AAAA,EACjM,OAAO;AACL,QAAI,KAAK,KAAK;AAAA,EAChB;AACF;AAOA,SAAS,wBAAwB,KAAa,cAAsB,MAAiD;AACnH,QAAM,SAASA,IAAG,WAAWD,MAAK,KAAK,cAAc,MAAM,CAAC;AAC5D,MAAIC,IAAG,WAAW,YAAY,KAAK,CAAC,UAAUA,IAAG,YAAY,YAAY,EAAE,SAAS,GAAG;AACrF,UAAM,IAAI,MAAM,mDAAmD,YAAY,EAAE;AAAA,EACnF;AACA,MAAI,QAAQ;AACV,SAAK,4CAA4C,YAAY,oEAA+D;AAC5H;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,UAAU;AACnC,OAAK,WAAW,GAAG,aAAa,WAAW,YAAO,YAAY,KAAK;AACnE,QAAM,WAAW,KAAK,QAAQ,mBAAmB,KAAK,KAAK,KAAK,IAAI;AACpE,QAAM,YAAY,CAAC,OAAO;AAC1B,MAAI,KAAK,OAAQ,WAAU,KAAK,YAAY,KAAK,MAAM;AACvD,YAAU,KAAK,UAAU,YAAY;AACrC,MAAI;AACF,IAAAC,cAAa,OAAO,WAAW,EAAE,OAAO,CAAC,WAAW,WAAW,MAAM,EAAE,CAAC;AAAA,EAC1E,SAAS,GAAY;AACnB,QAAI,yBAAyB;AAC7B,QAAI;AACF,MAAAA,cAAa,OAAO,CAAC,MAAM,cAAc,aAAa,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAChF,+BAAyB;AAAA,IAC3B,QAAQ;AAAA,IAAkE;AAC1E,QAAI,CAAC,wBAAwB;AAC3B,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,YAAM,IAAI,MAAM,WAAW,GAAG,CAAC;AAAA,IACjC;AAAA,EACF;AACF;AAKA,SAAS,gBAAgB,iBAAyB,SAA6B,OAA2B,iBAA+C;AACvJ,OAAK,+BAA+B,eAAe,MAAM;AACzD,QAAM,UAAU,CAAC,MAAM,eAAe;AACtC,MAAI,WAAW,OAAO;AACpB,YAAQ,KAAK,MAAM,qBAAqB,mBAAmB,SAAS,KAAK,CAAC,EAAE;AAAA,EAC9E;AACA,UAAQ,KAAK,MAAM;AACnB,MAAI;AACJ,MAAI;AACF,iBAAaA,cAAa,OAAO,SAAS,EAAE,UAAU,QAAQ,OAAO,CAAC,WAAW,QAAQ,MAAM,GAAG,KAAK,EAAE,GAAG,QAAQ,KAAK,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC;AAAA,EACrJ,SAAS,GAAY;AACnB,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,IAAI,MAAM,WAAW,GAAG,CAAC;AAAA,EACjC;AACA,QAAM,UAAU,CAAC,WAAW,SAAS,oBAAoB;AACzD,MAAI,WAAW,KAAK,KAAK,QAAS,MAAK,WAAW,KAAK,CAAC;AACxD,OAAK,UAAU,IAAI,eAAe,eAAe,IAAI,eAAe,iDAA4C;AAChH,SAAO,EAAE,QAAQ;AACnB;AAKA,SAAS,6BACP,iBACA,iBACA,SACA,aACA,WACgG;AAChG,QAAM,UAAqE,CAAC;AAC5E,MAAI,iBAAiB;AAErB,QAAM,SAAS,iBAAiB,eAAe;AAE/C,aAAW,cAAc,aAAa;AACpC,UAAM,YAAY,iBAAiB,iBAAiB,UAAU;AAC9D,QAAI,CAACD,IAAG,WAAW,SAAS,GAAG;AAC7B,cAAQ,UAAU,IAAI,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE;AAClD,WAAK,yCAAyC,UAAU,SAAS,eAAe,oBAAe;AAC/F;AAAA,IACF;AACA,UAAM,EAAE,WAAW,OAAO,IAAI,iBAAiB,WAAW,WAAW;AAAA,MACnE,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,eAAe,WAAW;AAAA,MAC1B;AAAA,IACF,CAAC;AACD,YAAQ,UAAU,IAAI,EAAE,WAAW,OAAO;AAC1C,sBAAkB,UAAU;AAC5B,eAAW,SAAS,WAAW;AAC7B,WAAK,KAAK,KAAK,KAAKD,MAAK,KAAK,WAAW,KAAK,CAAC,WAAMA,MAAK,KAAK,WAAW,KAAK,CAAC,EAAE;AAAA,IACpF;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,WAAK,WAAW,OAAO,MAAM,oCAAoC,UAAU,MAAM,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IACtG;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,eAAe;AACnC;AAKA,SAAS,kBAAkB,cAAsB,iBAAyB,KAAa,WAAyH;AAC9M,QAAM,gBAAgB,qBAAqB,YAAY;AACvD,MAAI,cAAc,WAAW,GAAG;AAC9B,SAAK,8EAA8E;AACnF,WAAO,EAAE,eAAe,CAAC,GAAG,gBAAgB,EAAE;AAAA,EAChD;AACA,OAAK,cAAc,cAAc,MAAM,iBAAiB,SAAS,KAAK;AACtE,QAAM,EAAE,SAAS,eAAe,IAAI,6BAA6B,cAAc,iBAAiB,KAAK,cAAc,IAAI,OAAK,EAAE,IAAI,GAAG,SAAS;AAC9I,SAAO,EAAE,eAAe,SAAS,eAAe;AAClD;AAOA,SAAS,uBAAuB,GAAsB,WAAmB,OAAgB,cAA+C;AACtI,QAAM,kBAAkB,iBAAiB,CAAC;AAC1C,MAAI;AACF,UAAM,kBAAkB,EAAE;AAC1B,QAAI,CAAC,mBAAmB,CAACC,IAAG,WAAW,eAAe,GAAG;AACvD,WAAK,gBAAgB,eAAe,yCAAoC;AACxE,aAAO,EAAE,aAAa,iBAAiB,SAAS,MAAM,SAAS,wBAAwB;AAAA,IACzF;AAEA,UAAM,EAAE,QAAQ,IAAI,gBAAgB,iBAAiB,EAAE,SAAS,EAAE,OAAO,eAAe;AACxF,QAAI,CAAC,WAAW,CAAC,OAAO;AACtB,aAAO,EAAE,aAAa,iBAAiB,oBAAoB,OAAO,SAAS,MAAM,SAAS,gFAA2E;AAAA,IACvK;AAEA,UAAM,gBAAgB,qBAAqB,eAAe;AAC1D,QAAI,cAAc,WAAW,GAAG;AAC9B,WAAK,oCAAoC,eAAe,oBAAe;AACvE,aAAO,EAAE,aAAa,iBAAiB,SAAS,MAAM,SAAS,oBAAoB;AAAA,IACrF;AAEA,QAAI;AACJ,QAAI,iBAAiB,OAAO;AAC1B,oBAAc,cAAc,IAAI,OAAK,EAAE,IAAI;AAAA,IAC7C,WAAW,cAAc,KAAK,OAAK,EAAE,SAAS,YAAY,GAAG;AAC3D,oBAAc,CAAC,YAAY;AAAA,IAC7B,OAAO;AACL,WAAK,WAAW,YAAY,mBAAmB,eAAe,oBAAe;AAC7E,aAAO,EAAE,aAAa,iBAAiB,SAAS,MAAM,SAAS,WAAW,YAAY,eAAe;AAAA,IACvG;AAEA,UAAM,EAAE,SAAS,eAAe,IAAI,6BAA6B,iBAAiB,iBAAiB,EAAE,SAAS,aAAa,SAAS;AACpI,WAAO,EAAE,aAAa,iBAAiB,SAAS,SAAS,OAAO,gBAAgB,oBAAoB,QAAQ;AAAA,EAC9G,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,SAAK,gBAAgB,eAAe,6BAAwB,OAAO,EAAE;AACrE,WAAO,EAAE,aAAa,iBAAiB,SAAS,MAAM,OAAO,QAAQ;AAAA,EACvE;AACF;AAeA,SAAS,sBAAsB,KAAa,WAA+B,MAAsD;AAC/H,QAAM,eAAeD,MAAK,QAAQ,aAAa,uBAAuB,GAAG,CAAC;AAC1E,QAAM,kBAAkB,KAAK,QAAQ,gBAAgB,GAAG;AAExD,0BAAwB,KAAK,cAAc,IAAI;AAE/C,QAAM,aAAa,oBAAoB;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,uBAAuB,UAAU;AAC3D,QAAM,QAA2B;AAAA,IAC/B,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,EAC5C;AACA,oBAAkB,KAAK,KAAK;AAC5B,mBAAiB,YAAY,UAAU,GAAG;AAE1C,QAAM,YAAY,kBAAkB,iBAAiB,IAAI,CAAC,EAAE;AAE5D,QAAM,EAAE,eAAe,eAAe,IAAI,kBAAkB,cAAc,iBAAiB,KAAK,SAAS;AAEzG,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ,KAAK,UAAU;AAAA,IACvB,iBAAiB,CAAC,CAAC,KAAK;AAAA,IACxB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAOA,SAAS,yBAAyB,MAAuC;AACvE,QAAM,aAAa,oBAAoB;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,uBAAuB,UAAU;AAE3D,QAAM,MAAM,IAAI,UAAU,OAAK,EAAE,SAAS,QAAQ,EAAE,YAAY,IAAI;AACpE,MAAI,QAAQ,IAAI;AACd,UAAM,IAAI,MAAM,gBAAgB,IAAI,iDAAiD;AAAA,EACvF;AAEA,QAAM,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;AACpC,mBAAiB,YAAY,UAAU,GAAG;AAE1C,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM,iBAAiB,OAAO;AAAA,MAC9B,SAAS,QAAQ;AAAA,MACjB,WAAW,QAAQ;AAAA,IACrB;AAAA,IACA,WAAW,IAAI;AAAA,EACjB;AACF;AAMA,eAAe,qBAAqB,KAAa,WAA+B,MAA6B,aAAqE;AAChL,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI;AACF,YAAQ,sBAAsB,KAAK,WAAW,IAAI,GAAG,UAAU,aAAa,KAAK;AAAA,EACnF,SAAS,KAAK;AACZ,SAAK,KAAK,UAAU,aAAa,KAAK;AAAA,EACxC;AACF;AAEO,SAAS,uBAAuBG,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,iCAAiC;AAEtF,SACG,QAAQ,SAAS,EACjB,YAAY,4CAA4C,EACxD,OAAO,mBAAmB,mDAAmD,gBAAgB,EAC7F,OAAO,mBAAmB,sCAAsC,SAAS,EACzE,OAAO,kBAAkB,0DAA0D,EAEnF,OAAO,CAAC,SAA4D;AACnE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI;AACJ,UAAI,KAAK,QAAQ;AACf,oBAAYH,MAAK,QAAQ,KAAK,MAAM;AAAA,MACtC,OAAO;AACL,cAAM,cAAc,kBAAkB,KAAK,KAAK;AAChD,cAAM,YAAY,KAAK,UAAU,SAAS,YAAY,OAAO,YAAY;AACzE,oBAAYA,MAAK,QAAQ,SAAS;AAAA,MACpC;AAEA,YAAM,iBAAiBA,MAAK,QAAQ,SAAS;AAC7C,YAAM,aAAa,oBAAoB;AACvC,UAAI,YAAsB,CAAC;AAE3B,UAAI,eAAe,IAAI;AACrB,YAAI;AACF,sBAAYC,IAAG,YAAY,UAAU,EAAE;AAAA,YAAO,UAC5CA,IAAG,WAAWD,MAAK,KAAK,YAAY,MAAM,UAAU,CAAC;AAAA,UACvD;AAAA,QACF,QAAQ;AAAA,QAAgC;AAAA,MAC1C;AAEA,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,IAAI,MAAM,mGAAmG;AAAA,MACrH;AAEA,YAAM,YAAsB,CAAC;AAC7B,YAAM,SAAmB,CAAC;AAG1B,iBAAW,aAAa,WAAW;AACjC,cAAM,cAAcA,MAAK,QAAQ,WAAW,SAAS;AACrD,YAAI,CAAC,YAAY,WAAW,iBAAiBA,MAAK,GAAG,EAAG;AACxD,YAAIC,IAAG,WAAW,WAAW,GAAG;AAC9B,UAAAA,IAAG,OAAO,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,WAAK,cAAc,UAAU,MAAM,wBAAwB,SAAS,KAAK;AAEzE,iBAAW,aAAa,WAAW;AACjC,cAAM,WAAWD,MAAK,QAAQ,WAAW,SAAS;AAClD,YAAI,CAAC,SAAS,WAAW,iBAAiBA,MAAK,GAAG,GAAG;AACnD,iBAAO,KAAK,SAAS;AACrB;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,UAAUC,IAAG,YAAYD,MAAK,KAAK,YAAY,SAAS,CAAC,EAC5D,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC;AAChC,UAAAC,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAC1C,qBAAW,UAAU,SAAS;AAC5B,kBAAM,UAAUA,IAAG,aAAaD,MAAK,KAAK,YAAY,WAAW,MAAM,GAAG,MAAM;AAChF,YAAAC,IAAG,cAAcD,MAAK,KAAK,UAAU,MAAM,GAAG,SAAS,MAAM;AAAA,UAC/D;AACA,oBAAU,KAAK,SAAS;AAAA,QAC1B,QAAQ;AACN,iBAAO,KAAK,SAAS;AAAA,QACvB;AAAA,MACF;AAEA,WAAK,aAAa,UAAU,MAAM,gBAAgB,SAAS,EAAE;AAC7D,UAAI,OAAO,SAAS,GAAG;AACrB,aAAK,sBAAsB,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,MAChD;AAEA,4BAAsB,WAAW,WAAW,EAAE,QAAQ,UAAU,CAAC;AAEjE,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,OAAO,UAAU;AAAA,QACjB,OAAO,KAAK,SAAS,WAAW,KAAK;AAAA,QACrC,OAAO,KAAK,SAAS,WAAW,KAAK;AAAA,QACrC,QAAQ;AAAA,MACV,GAAG,UAAU,WAAW,KAAK;AAAA,IAC/B,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,WAAW,KAAK;AAAA,IACtC;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,mBAAmB,mDAAmD,gBAAgB,EAC7F,OAAO,mBAAmB,sCAAsC,SAAS,EACzE,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,CAAC,SAA4D;AACnE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI;AACJ,UAAI,KAAK,QAAQ;AACf,oBAAYA,MAAK,QAAQ,KAAK,MAAM;AAAA,MACtC,OAAO;AACL,cAAM,cAAc,kBAAkB,KAAK,KAAK;AAChD,cAAM,YAAY,KAAK,UAAU,SAAS,YAAY,OAAO,YAAY;AACzE,oBAAYA,MAAK,QAAQ,SAAS;AAAA,MACpC;AAEA,UAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B,gBAAQ,EAAE,QAAQ,CAAC,GAAG,SAAS,gCAAgC,SAAS,8BAA8B,GAAG,UAAU,QAAQ,KAAK;AAChI;AAAA,MACF;AAEA,YAAM,OAAO,kBAAkB,SAAS;AAExC,YAAM,YAAYA,IAAG,YAAY,SAAS,EAAE,OAAO,UAAQ;AACzD,YAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AACjC,cAAM,YAAYD,MAAK,KAAK,WAAW,MAAM,UAAU;AACvD,eAAOC,IAAG,WAAW,SAAS;AAAA,MAChC,CAAC;AAED,YAAM,aAAa,UAAU,IAAI,UAAQ;AACvC,cAAM,UAAUA,IAAG,aAAaD,MAAK,KAAK,WAAW,MAAM,UAAU,GAAG,MAAM;AAC9E,cAAM,cAAc,QAAQ,MAAM,6BAA6B;AAC/D,cAAM,OAA+B,CAAC;AACtC,cAAM,WAAmC,CAAC;AAC1C,YAAI,aAAa;AACf,cAAI,aAAa;AACjB,qBAAW,QAAQ,YAAY,CAAC,EAAE,MAAM,IAAI,GAAG;AAC7C,gBAAI,KAAK,QAAQ,MAAM,aAAa;AAAE,2BAAa;AAAM;AAAA,YAAU;AACnE,gBAAI,cAAc,KAAK,WAAW,IAAI,GAAG;AACvC,oBAAMI,YAAW,KAAK,QAAQ,GAAG;AACjC,kBAAIA,cAAa,IAAI;AACnB,yBAAS,KAAK,MAAM,GAAGA,SAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,MAAMA,YAAW,CAAC,EAAE,KAAK;AAAA,cAC3E;AACA;AAAA,YACF;AACA,yBAAa;AACb,kBAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,gBAAI,aAAa,GAAI;AACrB,iBAAK,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAAA,UACvE;AAAA,QACF;AACA,eAAO;AAAA,UACL,MAAM,KAAK,QAAQ;AAAA,UACnB,MAAM;AAAA,UACN,UAAU,SAAS,YAAY,KAAK,YAAY;AAAA,UAChD,UAAU,SAAS,YAAY,KAAK,YAAY;AAAA,UAChD,WAAW,SAAS,aAAa,KAAK,aAAa;AAAA,UACnD,eAAe,KAAK,gBAAgB,MAAM;AAAA,UAC1C,WAAW,KAAK,OAAO,IAAI,KAAK;AAAA,QAClC;AAAA,MACF,CAAC;AAED,cAAQ,EAAE,QAAQ,YAAY,OAAO,WAAW,OAAO,GAAG,UAAU,QAAQ,KAAK;AAAA,IACnF,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,QAAQ,KAAK;AAAA,IACnC;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,WAAW,EACnB,YAAY,qJAAqJ,EACjK,SAAS,UAAU,uEAAuE,EAC1F,OAAO,mBAAmB,mDAAmD,gBAAgB,EAC7F,OAAO,mBAAmB,wDAAwD,MAAM,EACxF,OAAO,YAAY,mCAAmC,EACtD,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,CAAC,MAAc,SAAgF;AACrG,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI;AACJ,UAAI,KAAK,QAAQ;AACf,oBAAYJ,MAAK,QAAQ,KAAK,MAAM;AAAA,MACtC,OAAO;AACL,cAAM,cAAc,kBAAkB,iBAAiB,IAAI,CAAC;AAC5D,cAAM,YAAY,KAAK,UAAU,YAAY,YAAY,UAAU,YAAY;AAC/E,oBAAYA,MAAK,QAAQ,SAAS;AAAA,MACpC;AAEA,YAAM,iBAAiBA,MAAK,QAAQ,SAAS;AAC7C,YAAM,WAAWA,MAAK,QAAQ,WAAW,IAAI;AAC7C,UAAI,CAAC,SAAS,WAAW,iBAAiBA,MAAK,GAAG,GAAG;AACnD,cAAM,IAAI,MAAM,wBAAwB,IAAI,GAAG;AAAA,MACjD;AAEA,UAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,cAAM,IAAI,MAAM,UAAU,IAAI,kBAAkB,QAAQ,EAAE;AAAA,MAC5D;AAEA,YAAM,OAAO,kBAAkB,SAAS;AACxC,YAAM,SAAS,KAAK,OAAO,IAAI;AAE/B,MAAAA,IAAG,OAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAEpD,aAAO,KAAK,OAAO,IAAI;AACvB,MAAAA,IAAG,cAAc,qBAAqB,SAAS,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AAEvF,cAAQ;AAAA,QACN,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,YAAY,CAAC,CAAC;AAAA,QACd,GAAI,SAAS,EAAE,eAAe,OAAO,IAAI,CAAC;AAAA,MAC5C,GAAG,UAAU,aAAa,KAAK;AAAA,IACjC,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,aAAa,KAAK;AAAA,IACxC;AAAA,EACF,CAAC;AAEH,QAAM,cAAc,OAAO,QAAQ,aAAa,EAAE,YAAY,uCAAuC;AAErG,WAAS,0BAA0B,KAAuB;AACxD,WAAO,IACJ,SAAS,SAAS,6CAA6C,EAC/D,SAAS,eAAe,6EAA6E,EACrG,OAAO,iBAAiB,sEAAsE,EAC9F,OAAO,qBAAqB,wCAAwC,EACpE,OAAO,mBAAmB,oFAAoF,EAC9G,OAAO,mBAAmB,8FAA8F,EACxH,OAAO,YAAY,mCAAmC;AAAA,EAC3D;AAEA;AAAA,IACE,YAAY,QAAQ,KAAK,EAAE,YAAY,mEAAmE;AAAA,EAC5G,EAAE,OAAO,CAAC,KAAa,WAA+B,SAAgC,qBAAqB,KAAK,WAAW,MAAM,iBAAiB,CAAC;AAGnJ;AAAA,IACE,YAAY,QAAQ,OAAO,EAAE,YAAY,oFAA+E;AAAA,EAC1H,EAAE,OAAO,CAAC,KAAa,WAA+B,SAAgC,qBAAqB,KAAK,WAAW,MAAM,mBAAmB,CAAC;AAErJ,cACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,OAAO,MAAM;AACZ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,oBAAoB;AACvC,YAAM,MAAM,iBAAiB,UAAU;AAEvC,cAAQ;AAAA,QACN,cAAc,IAAI,IAAI,QAAM;AAAA,UAC1B,MAAM,iBAAiB,CAAC;AAAA,UACxB,SAAS,EAAE;AAAA,UACX,WAAW,EAAE;AAAA,UACb,iBAAiB,CAAC,CAAC,EAAE;AAAA,QACvB,EAAE;AAAA,QACF,OAAO,IAAI;AAAA,MACb,GAAG,UAAU,oBAAoB,KAAK;AAAA,IACxC,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,oBAAoB,KAAK;AAAA,IAC/C;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,SAAS,EACjB,YAAY,wDAAwD,EACpE,SAAS,UAAU,2CAA2C,EAC9D,OAAO,CAAC,SAAiB;AACxB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,oBAAoB;AACvC,YAAM,MAAM,iBAAiB,UAAU;AACvC,YAAM,QAAQ,IAAI,KAAK,OAAK,EAAE,SAAS,QAAQ,EAAE,YAAY,IAAI;AACjE,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,gBAAgB,IAAI,iDAAiD;AAAA,MACvF;AACA,UAAI,CAAC,MAAM,aAAa,CAACA,IAAG,WAAW,MAAM,SAAS,GAAG;AACvD,cAAM,IAAI,MAAM,gBAAgB,iBAAiB,KAAK,CAAC,6BAA6B,MAAM,aAAa,WAAW,2CAA2C;AAAA,MAC/J;AAEA,YAAM,UAAU,qBAAqB,MAAM,SAAS;AACpD,cAAQ;AAAA,QACN,aAAa,iBAAiB,KAAK;AAAA,QACnC;AAAA,QACA,OAAO,QAAQ;AAAA,MACjB,GAAG,UAAU,uBAAuB,KAAK;AAAA,IAC3C,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,uBAAuB,KAAK;AAAA,IAClD;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,QAAQ,EAChB,YAAY,mFAAmF,EAC/F,SAAS,UAAU,mCAAmC,EACtD,OAAO,CAAC,SAAiB;AACxB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,cAAQ,yBAAyB,IAAI,GAAG,UAAU,sBAAsB,KAAK;AAAA,IAC/E,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,sBAAsB,KAAK;AAAA,IACjD;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,MAAM,EACd,YAAY,wGAAwG,EACpH,SAAS,YAAY,wFAAwF,EAC7G,OAAO,wBAAwB,uGAAuG,EACtI,OAAO,mBAAmB,2EAA2E,EACrG,OAAO,YAAY,mCAAmC,EACtD,OAAO,WAAW,wGAAwG,EAC1H,OAAO,OAAO,QAA4B,SAAsF;AAC/H,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,aAAa,oBAAoB;AACvC,YAAM,kBAAkB,iBAAiB,UAAU;AACnD,UAAI,gBAAgB,WAAW,GAAG;AAChC,cAAM,IAAI,MAAM,qEAAqE;AAAA,MACvF;AAEA,YAAM,YAAY,kBAAkB,iBAAiB,IAAI,CAAC,EAAE;AAC5D,YAAM,QAAQ,KAAK,SAAS;AAG5B,UAAI,KAAK,gBAAgB,OAAO;AAC9B,cAAM,UAAU,gBAAgB,IAAI,OAAK,uBAAuB,GAAG,WAAW,OAAO,UAAU,KAAK,CAAC;AACrG,gBAAQ,EAAE,iBAAiB,MAAM,cAAc,SAAS,QAAQ,UAAU,GAAG,UAAU,oBAAoB,KAAK;AAChH;AAAA,MACF;AAEA,UAAI;AACJ,UAAI,iBAAqC;AACzC,YAAM,YAAY,CAAC,KAAK,eAAe,gBAAgB,SAAS;AAEhE,UAAI,KAAK,aAAa;AACpB,cAAM,QAAQ,gBAAgB,KAAK,OAAK,EAAE,SAAS,KAAK,eAAe,EAAE,YAAY,KAAK,WAAW;AACrG,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,MAAM,gBAAgB,KAAK,WAAW,iDAAiD;AAAA,QACnG;AACA,8BAAsB;AAAA,MACxB,WAAW,gBAAgB,WAAW,GAAG;AACvC,8BAAsB,gBAAgB,CAAC;AAAA,MACzC;AAGA,iBAAS;AACP,YAAI,CAAC,qBAAqB;AACxB,4BAAkB,yCAAyC,gBAAgB,IAAI,gBAAgB,EAAE,KAAK,IAAI,CAAC,oFAAoF;AAC/L,gBAAM,SAAS,MAAM,OAAO;AAAA,YAC1B,SAAS;AAAA,YACT,SAAS;AAAA,cACP,EAAE,OAAO,kBAAkB,MAAM,mEAA8D;AAAA;AAAA,cAE/F,GAAG,gBAAgB,IAAI,CAAC,GAAG,OAAO,EAAE,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,iBAAiB,CAAC,CAAC,WAAM,EAAE,WAAW,EAAE,GAAG,EAAE;AAAA,YAC9G;AAAA,UACF,CAAC;AACD,cAAI,WAAW,kBAAkB;AAC/B,kBAAMI,WAAU,gBAAgB,IAAI,OAAK,uBAAuB,GAAG,WAAW,OAAO,kBAAkB,KAAK,CAAC;AAC7G,oBAAQ,EAAE,iBAAiB,MAAM,cAAcA,UAAS,QAAQ,UAAU,GAAG,UAAU,oBAAoB,KAAK;AAChH;AAAA,UACF;AACA,gCAAsB,gBAAgB,OAAO,MAAM,CAAC;AACpD,cAAI,CAAC,qBAAqB;AACxB,kBAAM,IAAI,MAAM,gBAAgB,MAAM,cAAc;AAAA,UACtD;AAAA,QACF;AAEA,cAAM,kBAAkB,iBAAiB,mBAAmB;AAC5D,cAAM,kBAAkB,oBAAoB;AAC5C,YAAI,CAAC,mBAAmB,CAACJ,IAAG,WAAW,eAAe,GAAG;AACvD,gBAAM,IAAI,MAAM,gBAAgB,eAAe,6BAA6B,mBAAmB,WAAW,2CAA2C;AAAA,QACvJ;AAEA,cAAM,EAAE,QAAQ,IAAI,gBAAgB,iBAAiB,oBAAoB,SAAS,oBAAoB,OAAO,eAAe;AAE5H,cAAM,gBAAgB,qBAAqB,eAAe;AAC1D,YAAI,cAAc,WAAW,GAAG;AAC9B,gBAAM,IAAI,MAAM,oCAAoC,eAAe,gDAAgD;AAAA,QACrH;AAEA,YAAI,CAAC,gBAAgB;AACnB,4BAAkB,8DAA8D;AAChF,gBAAM,UAA6C;AAAA,YACjD,EAAE,OAAO,OAAO,MAAM,kCAA6B;AAAA,YACnD,GAAG,cAAc,IAAI,QAAM,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,cAAc,GAAG,EAAE,IAAI,WAAM,EAAE,WAAW,KAAK,EAAE,KAAK,EAAE;AAAA,UAC9G;AACA,cAAI,WAAW;AACb,oBAAQ,KAAK,EAAE,OAAO,MAAM,MAAM,uCAAkC,CAAC;AAAA,UACvE;AACA,gBAAM,SAAS,MAAM,OAAO,EAAE,SAAS,yBAAyB,eAAe,iBAAiB,QAAQ,CAAC;AACzG,cAAI,WAAW,MAAM;AACnB,kCAAsB;AACtB;AAAA,UACF;AACA,2BAAiB;AAAA,QACnB,WAAW,mBAAmB,SAAS,CAAC,cAAc,KAAK,OAAK,EAAE,SAAS,cAAc,GAAG;AAC1F,gBAAM,IAAI,MAAM,WAAW,cAAc,mBAAmB,eAAe,iBAAiB,cAAc,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,QACzI;AAEA,YAAI,CAAC,WAAW,CAAC,OAAO;AACtB,kBAAQ;AAAA,YACN,aAAa;AAAA,YACb,oBAAoB;AAAA,YACpB,SAAS;AAAA,YACT,SAAS;AAAA,YACT,SAAS,2BAA2B,eAAe;AAAA,UACrD,GAAG,UAAU,oBAAoB,KAAK;AACtC;AAAA,QACF;AAEA,cAAM,cAAc,mBAAmB,QAAQ,cAAc,IAAI,OAAK,EAAE,IAAI,IAAI,CAAC,cAAc;AAC/F,cAAM,EAAE,SAAS,eAAe,IAAI,6BAA6B,iBAAiB,iBAAiB,oBAAoB,SAAS,aAAa,SAAS;AAEtJ,YAAI,mBAAmB,OAAO;AAC5B,kBAAQ,EAAE,aAAa,iBAAiB,SAAS,SAAS,OAAO,gBAAgB,QAAQ,WAAW,oBAAoB,QAAQ,GAAG,UAAU,oBAAoB,KAAK;AAAA,QACxK,OAAO;AACL,gBAAM,SAAS,QAAQ,cAAc,KAAK,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE;AACtE,kBAAQ;AAAA,YACN,aAAa;AAAA,YACb,QAAQ;AAAA,YACR,WAAW,OAAO;AAAA,YAClB,QAAQ,OAAO;AAAA,YACf,OAAO,OAAO,UAAU;AAAA,YACxB,QAAQ;AAAA,YACR,oBAAoB;AAAA,UACtB,GAAG,UAAU,oBAAoB,KAAK;AAAA,QACxC;AACA;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,oBAAoB,KAAK;AAAA,IAC/C;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,cAAc,EACtB,YAAY,sFAAsF,EAClG,SAAS,YAAY,2EAA2E,EAChG,OAAO,wBAAwB,sEAAsE,EACrG,OAAO,mBAAmB,2EAA2E,EACrG,OAAO,YAAY,mCAAmC,EACtD,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,CAAC,QAAgB,SAAsG;AAC7H,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI;AACJ,UAAI,KAAK,QAAQ;AACf,oBAAYD,MAAK,QAAQ,KAAK,MAAM;AAAA,MACtC,OAAO;AACL,cAAM,cAAc,kBAAkB,iBAAiB,IAAI,CAAC;AAC5D,cAAM,aAAa,KAAK,SAAS,YAAY,YAAY,YAAY,UAAU,YAAY;AAC3F,oBAAYA,MAAK,QAAQ,SAAS;AAAA,MACpC;AACA,YAAM,iBAAiBA,MAAK,QAAQ,SAAS;AAE7C,UAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B,gBAAQ,EAAE,SAAS,CAAC,GAAG,OAAO,GAAG,QAAQ,WAAW,SAAS,6BAA6B,GAAG,UAAU,4BAA4B,KAAK;AACxI;AAAA,MACF;AAEA,YAAM,OAAO,kBAAkB,SAAS;AACxC,YAAM,UAAoB,CAAC;AAC3B,YAAM,UAAoB,CAAC;AAE3B,YAAM,YAAYA,IAAG,YAAY,SAAS,EAAE,OAAO,UAAQ;AACzD,YAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AACjC,cAAM,IAAID,MAAK,KAAK,WAAW,IAAI;AACnC,YAAI;AAAE,iBAAOC,IAAG,SAAS,CAAC,EAAE,YAAY;AAAA,QAAG,QAAQ;AAAE,iBAAO;AAAA,QAAO;AAAA,MACrE,CAAC;AAED,iBAAW,aAAa,WAAW;AACjC,cAAM,WAAWD,MAAK,QAAQ,WAAW,SAAS;AAClD,YAAI,CAAC,SAAS,WAAW,iBAAiBA,MAAK,GAAG,EAAG;AAGrD,YAAI,SAAsC,KAAK,OAAO,SAAS,KAAK;AACpE,YAAI,CAAC,QAAQ;AACX,gBAAM,WAAW,gBAAgB,QAAQ;AACzC,cAAI,UAAU;AACZ,qBAAS;AAAA,cACP,QAAQ,SAAS;AAAA,cACjB,aAAa,SAAS;AAAA,cACtB,QAAQ,SAAS;AAAA,cACjB,eAAe,SAAS;AAAA,cACxB,QAAQ,SAAS;AAAA,cACjB,aAAa,SAAS;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,UAAU,OAAO,WAAW,eAAe;AAC9C,kBAAQ,KAAK,SAAS;AACtB;AAAA,QACF;AAEA,cAAM,qBAAqB,CAAC,KAAK,eAC/B,OAAO,gBAAgB,KAAK,eAC5B,OAAO,kBAAkB,KAAK;AAChC,cAAM,gBAAgB,WAAW,SAAS,OAAO,WAAW;AAE5D,YAAI,CAAC,sBAAsB,CAAC,eAAe;AACzC,kBAAQ,KAAK,SAAS;AACtB;AAAA,QACF;AAEA,QAAAC,IAAG,OAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACpD,eAAO,KAAK,OAAO,SAAS;AAC5B,gBAAQ,KAAK,SAAS;AAAA,MACxB;AAEA,UAAI,QAAQ,SAAS,GAAG;AACtB,QAAAA,IAAG,cAAc,qBAAqB,SAAS,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AAAA,MACzF;AAEA,cAAQ;AAAA,QACN;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,OAAO,QAAQ;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,MAC9D,GAAG,UAAU,4BAA4B,KAAK;AAAA,IAChD,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,4BAA4B,KAAK;AAAA,IACvD;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,SAAS,EACjB,YAAY,sGAAuG,EACnH,SAAS,YAAY,wBAAwB,EAC7C,OAAO,wBAAwB,gEAAgE,EAC/F,OAAO,mBAAmB,2EAA2E,EACrG,OAAO,YAAY,mCAAmC,EACtD,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,CAAC,QAAgB,SAAsG;AAC7H,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,YAAY,iBAAiB,IAAI;AACvC,UAAI,CAACA,IAAG,WAAW,SAAS,GAAG;AAC7B,gBAAQ,EAAE,UAAU,CAAC,GAAG,OAAO,GAAG,QAAQ,WAAW,SAAS,6BAA6B,GAAG,UAAU,uBAAuB,KAAK;AACpI;AAAA,MACF;AAEA,YAAM,SAAS,oBAAoB,WAAW,QAAQ,KAAK,WAAW;AACtE,cAAQ;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,iBAAiB,OAAO;AAAA,QACxB,SAAS,OAAO,QAAQ;AAAA,QACxB,OAAO,OAAO,SAAS;AAAA,QACvB,QAAQ;AAAA,QACR;AAAA,QACA,OAAOD,MAAK,KAAK,WAAW,eAAe;AAAA,QAC3C,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,MAC9D,GAAG,UAAU,uBAAuB,KAAK;AAAA,IAC3C,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,uBAAuB,KAAK;AAAA,IAClD;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,QAAQ,EAChB,YAAY,mDAAoD,EAChE,SAAS,YAAY,uBAAuB,EAC5C,OAAO,wBAAwB,gEAAgE,EAC/F,OAAO,mBAAmB,2EAA2E,EACrG,OAAO,YAAY,mCAAmC,EACtD,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,CAAC,QAAgB,SAAsG;AAC7H,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,YAAY,iBAAiB,IAAI;AACvC,UAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B,gBAAQ,EAAE,SAAS,CAAC,GAAG,OAAO,GAAG,QAAQ,WAAW,SAAS,6BAA6B,GAAG,UAAU,sBAAsB,KAAK;AAClI;AAAA,MACF;AAEA,YAAM,SAAS,mBAAmB,WAAW,QAAQ,KAAK,WAAW;AACrE,UAAI,CAAC,OAAO,aAAa;AACvB,gBAAQ,EAAE,SAAS,CAAC,GAAG,OAAO,GAAG,QAAQ,WAAW,QAAQ,SAAS,wCAAwC,MAAM,KAAK,GAAG,UAAU,sBAAsB,KAAK;AAChK;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO,QAAQ;AAAA,QACxB,OAAO,OAAO,QAAQ;AAAA,QACtB,QAAQ;AAAA,QACR;AAAA,QACA,GAAI,OAAO,aAAa,SAAS,IAAI;AAAA,UACnC,cAAc,OAAO;AAAA,UACrB,SAAS,2HAA2H,MAAM;AAAA,QAC5I,IAAI,CAAC;AAAA,QACL,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,MAC9D,GAAG,UAAU,sBAAsB,KAAK;AAAA,IAC1C,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,sBAAsB,KAAK;AAAA,IACjD;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,QAAQ,EAChB,YAAY,kGAAkG,EAC9G,OAAO,mBAAmB,2EAA2E,EACrG,OAAO,YAAY,mCAAmC,EACtD,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,OAAO,SAAgF;AAC7F,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,wBAAkB,uHAAuH;AACzI,YAAM,YAAY,iBAAiB,IAAI;AAGvC,YAAM,iBAAiC,CAAC;AACxC,YAAM,kBAAkC,CAAC;AACzC,YAAM,eAAyB,CAAC;AAChC,YAAM,oBAA+C,CAAC;AACtD,YAAM,sBAAiD,CAAC;AAIxD,iBAAS;AACP,cAAM,SAASA,IAAG,WAAW,SAAS,IAAI,iBAAiB,SAAS,IAAI,CAAC;AACzE,cAAM,aAAa,iBAAiB,oBAAoB,CAAC;AAEzD,cAAM,SAAS,MAAM,OAAO;AAAA,UAC1B,SAAS,uCAAuC,SAAS;AAAA,UACzD,SAAS;AAAA,YACP,GAAI,OAAO,SAAS,IAAI,CAAC,EAAE,OAAO,UAAU,MAAM,0BAA0B,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC;AAAA,YAC7G,EAAE,OAAO,OAAO,MAAM,oBAAoB;AAAA,YAC1C,GAAI,WAAW,SAAS,IAAI,CAAC,EAAE,OAAO,UAAU,MAAM,yBAAyB,WAAW,MAAM,eAAe,CAAC,IAAI,CAAC;AAAA,YACrH,EAAE,OAAO,QAAQ,MAAM,OAAO;AAAA,UAChC;AAAA,QACF,CAAC;AACD,YAAI,WAAW,OAAQ;AAEvB,YAAI,WAAW,UAAU;AAEvB,gBAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,OACjC,EAAE,eAAe,IAAI,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAC9F,gBAAM,UAA6E,CAAC;AACpF,cAAI,kBAAiC;AACrC,iBAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,kBAAM,kBAAkB,MAAM,eAAe;AAC7C,gBAAI,oBAAoB,iBAAiB;AACvC,sBAAQ,KAAK,IAAI,UAAU,gBAAM,eAAe,eAAK,CAAC;AACtD,gCAAkB;AAAA,YACpB;AACA,kBAAM,SAAS,MAAM,aAAa;AAClC,kBAAM,UAAU,MAAM,eAAe;AACrC,kBAAM,aACJ,YAAY,IAAI,GAAG,MAAM,SAAS,WAAW,IAAI,KAAK,GAAG,KACzD,WAAW,IAAI,GAAG,OAAO,SAAS,YAAY,IAAI,KAAK,GAAG,eAC1D,GAAG,MAAM,YAAY,OAAO;AAC9B,oBAAQ,KAAK,EAAE,MAAM,GAAG,MAAM,MAAM,KAAK,UAAU,KAAK,OAAO,OAAO,SAAS,SAAS,EAAE,CAAC;AAAA,UAC7F,CAAC;AAED,gBAAM,iBAAiB,MAAM,SAAiB;AAAA,YAC5C,SAAS;AAAA,YACT;AAAA,YACA,UAAU;AAAA,UACZ,CAAC;AACD,gBAAM,SAAS,IAAI,IAAI,cAAc;AAErC,iBAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,gBAAI,OAAO,IAAI,KAAK,GAAG;AAErB,kBAAI,MAAM,eAAe,WAAW,EAAG;AACvC,oBAAM,SAAS,mBAAmB,WAAW,MAAM,QAAQ,MAAM,WAAW;AAC5E,2BAAa,KAAK,GAAG,OAAO,YAAY;AACxC,kBAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,+BAAe,KAAK,EAAE,QAAQ,MAAM,QAAQ,aAAa,MAAM,aAAa,QAAQ,OAAO,QAAQ,CAAC;AAAA,cACtG;AAAA,YACF,OAAO;AAEL,kBAAI,MAAM,aAAa,WAAW,EAAG;AACrC,oBAAM,SAAS,oBAAoB,WAAW,MAAM,QAAQ,MAAM,WAAW;AAC7E,kBAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,gCAAgB,KAAK,EAAE,QAAQ,MAAM,QAAQ,aAAa,MAAM,aAAa,QAAQ,OAAO,SAAS,CAAC;AAAA,cACxG;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,WAAW,WAAW,OAAO;AAC3B,gBAAM,OAAO,MAAMK,OAAM;AAAA,YACvB,SAAS;AAAA,YACT,UAAU,OAAK,EAAE,KAAK,EAAE,SAAS,KAAK;AAAA,UACxC,CAAC,GAAG,KAAK;AACT,gBAAM,QAAQ,MAAMA,OAAM;AAAA,YACxB,SAAS;AAAA,YACT,SAAS,gBAAgB,GAAG;AAAA,UAC9B,CAAC,GAAG,KAAK;AACT,4BAAkB,KAAK,sBAAsB,KAAK,QAAW;AAAA,YAC3D,MAAM,QAAQ;AAAA,YACd,OAAO,KAAK;AAAA,YACZ,QAAQ,KAAK;AAAA,UACf,CAAC,CAAC;AAAA,QACJ,WAAW,WAAW,UAAU;AAC9B,gBAAM,SAAS,MAAM,OAAO;AAAA,YAC1B,SAAS;AAAA,YACT,SAAS;AAAA;AAAA,cAEP,GAAG,WAAW,IAAI,CAAC,GAAG,OAAO,EAAE,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,iBAAiB,CAAC,CAAC,WAAM,EAAE,WAAW,EAAE,GAAG,EAAE;AAAA,cACvG,EAAE,OAAO,MAAM,MAAM,cAAS;AAAA,YAChC;AAAA,UACF,CAAC;AACD,cAAI,WAAW,KAAM;AACrB,gBAAM,SAAS,WAAW,OAAO,MAAM,CAAC;AACxC,8BAAoB,KAAK,yBAAyB,OAAO,WAAW,iBAAiB,MAAM,CAAC,CAAC;AAAA,QAC/F;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,GAAI,aAAa,SAAS,IAAI;AAAA,UAC5B;AAAA,UACA,SAAS;AAAA,QACX,IAAI,CAAC;AAAA,MACP,GAAG,UAAU,sBAAsB,KAAK;AAAA,IAC1C,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,sBAAsB,KAAK;AAAA,IACjD;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,YAAY,EACpB,YAAY,0EAA0E,EACtF,OAAO,mBAAmB,2EAA2E,EACrG,OAAO,YAAY,mCAAmC,EACtD,OAAO,WAAW,8DAAyD,EAC3E,OAAO,CAAC,SAAgE;AACvE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,UAAU,kBAAkB,iBAAiB,IAAI,CAAC,EAAE;AAE1D,UAAI,CAACL,IAAG,WAAW,OAAO,GAAG;AAC3B,gBAAQ,EAAE,SAAS,GAAG,QAAQ,SAAS,SAAS,gEAA2D,GAAG,UAAU,cAAc,KAAK;AAC3I;AAAA,MACF;AAGA,YAAM,YAAYA,IAAG,YAAY,OAAO,EAAE,OAAO,UAAQ;AACvD,YAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AACjC,cAAM,IAAID,MAAK,KAAK,SAAS,IAAI;AACjC,YAAI;AAAE,iBAAOC,IAAG,SAAS,CAAC,EAAE,YAAY;AAAA,QAAG,QAAQ;AAAE,iBAAO;AAAA,QAAO;AAAA,MACrE,CAAC;AAED,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,EAAE,SAAS,GAAG,QAAQ,SAAS,SAAS,kDAAkD,GAAG,UAAU,cAAc,KAAK;AAClI;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,OAAO;AACf,cAAM,IAAI;AAAA,UACR,oBAAoB,UAAU,MAAM,kBAAkB,OAAO,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA,QAExF;AAAA,MACF;AAEA,iBAAW,QAAQ,WAAW;AAC5B,cAAM,WAAWD,MAAK,QAAQ,SAAS,IAAI;AAC3C,YAAI,CAAC,SAAS,WAAWA,MAAK,QAAQ,OAAO,IAAIA,MAAK,GAAG,EAAG;AAC5D,QAAAC,IAAG,OAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACtD;AAGA,YAAM,WAAW,qBAAqB,OAAO;AAC7C,UAAIA,IAAG,WAAW,QAAQ,GAAG;AAC3B,QAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM;AAAA,MACxF;AAEA,cAAQ,EAAE,SAAS,UAAU,QAAQ,QAAQ,WAAW,QAAQ,QAAQ,GAAG,UAAU,cAAc,KAAK;AAAA,IAC1G,SAAS,KAAK;AACZ,WAAK,KAAK,UAAU,cAAc,KAAK;AAAA,IACzC;AAAA,EACF,CAAC;AACL;AAEO,SAAS,qBAAqB,iBAAkE;AACrG,QAAM,sBAAsBD,MAAK,KAAK,iBAAiB,kBAAkB,kBAAkB;AAC3F,MAAIC,IAAG,WAAW,mBAAmB,GAAG;AACtC,QAAI;AACF,YAAM,OAAO,KAAK,MAAMA,IAAG,aAAa,qBAAqB,MAAM,CAAC;AAGpE,UAAI,MAAM,QAAQ,KAAK,OAAO,KAAK,KAAK,QAAQ,SAAS,GAAG;AAC1D,eAAO,KAAK,QAAQ,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,eAAe,GAAG,EAAE;AAAA,MACnF;AAAA,IACF,QAAQ;AAAA,IAAgC;AAAA,EAC1C;AAEA,QAAM,aAAaD,MAAK,KAAK,iBAAiB,SAAS;AACvD,MAAIC,IAAG,WAAW,UAAU,GAAG;AAC7B,WAAOA,IAAG,YAAY,UAAU,EAC7B,OAAO,UAAQA,IAAG,SAASD,MAAK,KAAK,YAAY,IAAI,CAAC,EAAE,YAAY,CAAC,EACrE,IAAI,WAAS,EAAE,MAAM,aAAa,GAAG,EAAE;AAAA,EAC5C;AAEA,SAAO,CAAC;AACV;AAEO,SAAS,iBAAiB,iBAAyB,gBAAgC;AACxF,QAAM,cAAcA,MAAK,QAAQ,iBAAiB,SAAS;AAC3D,QAAM,YAAYA,MAAK,QAAQ,aAAa,gBAAgB,QAAQ;AACpE,MAAI,CAAC,UAAU,WAAW,cAAcA,MAAK,GAAG,GAAG;AACjD,UAAM,IAAI,MAAM,yBAAyB,cAAc,GAAG;AAAA,EAC5D;AACA,SAAO;AACT;AASO,SAAS,iBAAiB,WAAmB,WAAmB,MAA+D;AACpI,EAAAC,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC3C,QAAM,iBAAiBD,MAAK,QAAQ,SAAS;AAE7C,QAAM,aAAaC,IAAG,YAAY,SAAS,EAAE;AAAA,IAAO,UAClDA,IAAG,SAASD,MAAK,KAAK,WAAW,IAAI,CAAC,EAAE,YAAY;AAAA,EACtD;AAEA,QAAM,YAAsB,CAAC;AAC7B,QAAM,SAAmB,CAAC;AAE1B,aAAW,aAAa,YAAY;AAClC,UAAM,OAAOA,MAAK,QAAQ,WAAW,SAAS;AAC9C,QAAI,CAAC,KAAK,WAAW,iBAAiBA,MAAK,GAAG,GAAG;AAC/C,aAAO,KAAK,SAAS;AACrB;AAAA,IACF;AACA,IAAAC,IAAG,OAAO,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAChD,IAAAA,IAAG,OAAOD,MAAK,KAAK,WAAW,SAAS,GAAG,MAAM,EAAE,WAAW,KAAK,CAAC;AACpE,cAAU,KAAK,SAAS;AAAA,EAC1B;AAEA,MAAI,MAAM;AACR,0BAAsB,WAAW,WAAW;AAAA,MAC1C,QAAQ;AAAA,MACR,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,eAAe,KAAK;AAAA,MACpB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,WAAW,OAAO;AAC7B;;;ACniDA,SAAS,gBAAgBO,QAAuB;AAE9C,QAAM,SAASA,OAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AACzD,QAAM,SAAS,SAAS,IAAI,QAAQ,IAAK,OAAO,SAAS,KAAM,CAAC;AAChE,SAAO,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,MAAM;AACtD;AAEO,SAAS,UAAU,OAA2B;AACnD,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,WAAW,+CAA+C,CAAC;AAAA,EACvE;AAEA,QAAM,CAAC,WAAW,YAAY,SAAS,IAAI;AAE3C,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,aAAS,KAAK,MAAM,gBAAgB,SAAS,CAAC;AAAA,EAChD,QAAQ;AACN,UAAM,IAAI,WAAW,yCAAyC,CAAC;AAAA,EACjE;AAEA,MAAI;AACF,cAAU,KAAK,MAAM,gBAAgB,UAAU,CAAC;AAAA,EAClD,QAAQ;AACN,UAAM,IAAI,WAAW,0CAA0C,CAAC;AAAA,EAClE;AAEA,SAAO,EAAE,QAAQ,SAAS,UAAU;AACtC;AAEO,SAAS,oBAAoBC,UAAwB;AAC1D,QAAM,MAAMA,SAAQ,QAAQ,KAAK,EAAE,YAAY,qBAAqB;AAEpE,MACG,QAAQ,gBAAgB,EACxB,YAAY,sEAAsE,EAClF,OAAO,CAAC,UAAkB;AACzB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,UAAU,KAAK;AAC5B,cAAQ,MAAM,OAAO,UAAU,KAAK;AAAA,IACtC,SAAS,KAAK;AACZ,WAAK,KAAK,OAAO,UAAU,KAAK;AAAA,IAClC;AAAA,EACF,CAAC;AACL;;;ACmBA,SAAS,eAAe,GAA+B;AACrD,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,QAAS,QAAO,EAAE,QAAQ,UAAU;AAC1C,MAAI,EAAE,WAAY,QAAO,EAAE,WAAW,UAAU;AAChD,MAAI,EAAE,QAAS,QAAO;AACtB,SAAO;AACT;AAEA,SAASC,SAAQC,UAAkB;AACjC,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,QAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAC3E,MAAI,CAAC,OAAO,UAAU,SAAS;AAC7B,UAAM,IAAI,WAAW,kDAAkD;AAAA,EACzE;AACA,SAAO,iBAAiB,QAAQ,QAAQ,KAAK,MAAM,CAAC;AACtD;AAEA,SAAS,OAAO,mBAAoC;AAClD,MAAI,CAAC,kBAAmB,QAAO;AAC/B,QAAM,QAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,iBAAiB,EAAE,QAAQ;AAC/D,QAAM,aAAa,KAAK,MAAM,QAAQ,GAAI;AAC1C,MAAI,aAAa,GAAI,QAAO,GAAG,UAAU;AACzC,QAAM,aAAa,KAAK,MAAM,aAAa,EAAE;AAC7C,MAAI,aAAa,GAAI,QAAO,GAAG,UAAU;AACzC,QAAM,WAAW,KAAK,MAAM,aAAa,EAAE;AAC3C,MAAI,WAAW,GAAI,QAAO,GAAG,QAAQ;AACrC,SAAO,GAAG,KAAK,MAAM,WAAW,EAAE,CAAC;AACrC;AAIO,SAAS,0BAA0BA,UAAwB;AAChE,QAAM,KAAKA,SAAQ,QAAQ,WAAW,EAAE,YAAY,mCAAmC;AAEvF,KACG,QAAQ,MAAM,EACd,YAAY,+EAA0E,EACtF,eAAe,oBAAoB,sBAAsB,EACzD,OAAO,+BAA+B,kCAAkC,EACxE,OAAO,OAAO,SAAwD;AACrE,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAOD,SAAQC,QAAO;AAC5B,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,cAAe,QAAO,eAAe,IAAI,KAAK;AAEvD,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB,sBAAsB,mBAAmB,KAAK,SAAS,CAAC;AAAA,QACxD,EAAE,OAAO;AAAA,MACX;AAEA,YAAM,kBAAkB;AAAA,QACtB,OAAO,QAAQ,MAAM;AAAA,QACrB,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,SAAS;AAAA,QACT,kBAAkB;AAAA,QAClB,WAAW;AAAA,QACX,kBAAkB;AAAA,QAClB,eAAe;AAAA,MACjB;AAEA,YAAM,OAAO,QAAQ,MAAM,IAAI,SAAO;AACpC,cAAM,QAAQ,IAAI,OAAO,SAAS;AAGlC,gBAAQ,MAAM,YAAY,GAAG;AAAA,UAC3B,KAAK;AAAW,4BAAgB;AAAW;AAAA,UAC3C,KAAK;AAAW,4BAAgB;AAAW;AAAA,UAC3C,KAAK;AAAU,4BAAgB;AAAU;AAAA,UACzC,KAAK;AAAa,4BAAgB;AAAa;AAAA,UAC/C;AAAS,4BAAgB;AAAW;AAAA,QACtC;AAGA,cAAM,cAAc;AAAA,UAClB,GAAI,IAAI,OAAO,qBAAqB,CAAC;AAAA,UACrC,GAAI,IAAI,OAAO,yBAAyB,CAAC;AAAA,QAC3C;AAEA,YAAI,cAAc;AAClB,cAAM,aAAa,YAAY,IAAI,QAAM;AACvC,yBAAe,GAAG;AAClB,0BAAgB,iBAAiB,GAAG;AAEpC,gBAAM,eAAe,eAAe,GAAG,KAAK;AAC5C,gBAAM,YAAY,eAAe,GAAG,SAAS;AAE7C,cAAI,iBAAiB,mBAAoB,iBAAgB;AACzD,cAAI,iBAAiB,sBAAsB,iBAAiB,eAAgB,iBAAgB;AAC5F,cAAI,cAAc,eAAe,GAAG,WAAW,YAAY,WAAW,YAAa,iBAAgB;AAEnG,gBAAMC,SAAiC;AAAA,YACrC,MAAM,GAAG;AAAA,YACT,OAAO,GAAG;AAAA,YACV,cAAc,GAAG;AAAA,YACjB,OAAO;AAAA,UACT;AACA,cAAI,GAAG,WAAW,YAAY;AAC5B,YAAAA,OAAM,cAAc,IAAI,GAAG,UAAU,WAAW;AAChD,YAAAA,OAAM,YAAY,IAAI,GAAG,UAAU,WAAW;AAAA,UAChD;AACA,iBAAOA;AAAA,QACT,CAAC;AAED,cAAM,aAAa,YAAY,OAAO,QAAM,GAAG,KAAK,EAAE;AACtD,cAAM,aAAa,IAAI,KAAK,YAAY,UAAU,YAAY;AAE9D,cAAM,QAAiC;AAAA,UACrC,MAAM,IAAI,SAAS;AAAA,UACnB;AAAA,UACA,OAAO,GAAG,UAAU,IAAI,UAAU;AAAA,UAClC,cAAc;AAAA,UACd,KAAK,OAAO,IAAI,SAAS,iBAAiB;AAAA,QAC5C;AAGA,cAAM,YAAY,IAAI,OAAO,UAAU,IAAI,OAAO,YAAY,KAAK,OAAK,EAAE,WAAW,OAAO,GAAG;AAC/F,YAAI,UAAW,OAAM,QAAQ,IAAI;AACjC,YAAI,IAAI,OAAO,QAAS,OAAM,SAAS,IAAI,IAAI,OAAO;AACtD,YAAI,WAAW,SAAS,EAAG,OAAM,YAAY,IAAI;AACjD,YAAI,IAAI,SAAS,UAAU,OAAO,KAAK,IAAI,SAAS,MAAM,EAAE,SAAS,GAAG;AACtE,gBAAM,QAAQ,IAAI,IAAI,SAAS;AAAA,QACjC;AAEA,eAAO;AAAA,MACT,CAAC;AAGD,WAAK,KAAK,CAAC,GAAG,MAAM;AAClB,cAAM,gBAAgB,CAAC,MAAe;AACpC,cAAI,MAAM,SAAU,QAAO;AAC3B,cAAI,MAAM,UAAW,QAAO;AAC5B,cAAI,MAAM,UAAW,QAAO;AAC5B,iBAAO;AAAA,QACT;AACA,cAAM,QAAQ,cAAc,EAAE,OAAO,CAAC,IAAI,cAAc,EAAE,OAAO,CAAC;AAClE,YAAI,UAAU,EAAG,QAAO;AACxB,gBAAS,EAAE,cAAc,KAAgB,MAAO,EAAE,cAAc,KAAgB;AAAA,MAClF,CAAC;AAED,cAAQ,EAAE,WAAW,KAAK,WAAW,SAAS,iBAAiB,KAAK,GAAG,aAAa,QAAQ,KAAK;AAAA,IACnG,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,QAAQ,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAEH,KACG,QAAQ,QAAQ,EAChB,YAAY,0EAAqE,EACjF,eAAe,oBAAoB,sBAAsB,EACzD,OAAO,+BAA+B,6DAA6D,EACnG,OAAO,SAAS,uDAAuD,KAAK,EAC5E,OAAO,OAAO,SAAuE;AACpF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAOF,SAAQC,QAAO;AAC5B,YAAM,SAAiC,CAAC;AAGxC,YAAM,YAAsB,CAAC;AAC7B,UAAI,CAAC,KAAK,IAAK,WAAU,KAAK,cAAc;AAC5C,UAAI,KAAK,cAAe,WAAU,KAAK,KAAK,aAAa;AACzD,UAAI,UAAU,SAAS,EAAG,QAAO,eAAe,IAAI,UAAU,KAAK,GAAG;AAEtE,YAAM,YAAY,MAAM,KAAK;AAAA,QAC3B,sBAAsB,mBAAmB,KAAK,SAAS,CAAC;AAAA,QACxD,EAAE,OAAO;AAAA,MACX;AAEA,YAAM,SAAS,UAAU,MAAM,IAAI,QAAM;AACvC,cAAM,MAAM,GAAG,kBAAkB,GAAG;AACpC,cAAM,QAAiC;AAAA,UACrC,MAAM,GAAG,QAAQ;AAAA,UACjB,QAAQ,GAAG;AAAA,UACX,QAAQ,MAAM,GAAG,IAAI,QAAQ,QAAQ,IAAI,IAAI,QAAQ,GAAG,KAAK;AAAA,UAC7D,SAAS,GAAG;AAAA,UACZ,OAAO,GAAG,SAAS;AAAA,UACnB,WAAW,GAAG,kBAAkB,GAAG;AAAA,UACnC,UAAU,GAAG,iBAAiB,GAAG;AAAA,QACnC;AACA,cAAM,SAAS,GAAG,QAAQ,aAAa,GAAG;AAC1C,YAAI,OAAQ,OAAM,QAAQ,IAAI;AAC9B,eAAO;AAAA,MACT,CAAC;AAGD,aAAO,KAAK,CAAC,GAAG,OAAQ,EAAE,OAAO,KAAgB,MAAO,EAAE,OAAO,KAAgB,EAAE;AAEnF,cAAQ,EAAE,WAAW,KAAK,WAAW,OAAO,OAAO,QAAQ,OAAO,GAAG,aAAa,UAAU,KAAK;AAAA,IACnG,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,UAAU,KAAK;AAAA,IAAG;AAAA,EAC3D,CAAC;AAEH,KACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,eAAe,oBAAoB,sBAAsB,EACzD,eAAe,gBAAgB,UAAU,EACzC,OAAO,sBAAsB,8CAA8C,EAC3E,OAAO,eAAe,yCAAyC,KAAK,EACpE,OAAO,cAAc,oDAAoD,KAAK,EAC9E,OAAO,OAAO,SAAqG;AAClH,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAOD,SAAQC,QAAO;AAC5B,YAAM,QAAQ,KAAK,QAAQ,SAAS,KAAK,OAAO,EAAE,IAAI;AAEtD,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB,sBAAsB,mBAAmB,KAAK,SAAS,CAAC,SAAS,mBAAmB,KAAK,GAAG,CAAC;AAAA,QAC7F;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,YACN,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,YACtD,GAAI,KAAK,WAAW,EAAE,UAAU,OAAO,IAAI,CAAC;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAEA;AAAA,QACE;AAAA,UACE,KAAK,KAAK;AAAA,UACV,WAAW,KAAK;AAAA,UAChB,WAAW,KAAK,aAAa;AAAA,UAC7B,UAAU,KAAK,YAAY;AAAA,UAC3B;AAAA,UACA,KAAK;AAAA,QACP;AAAA,QACA;AAAA,QAAa;AAAA,QAAQ;AAAA,MACvB;AAAA,IACF,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,QAAQ,KAAK;AAAA,IAAG;AAAA,EACzD,CAAC;AAEH,KACG,QAAQ,aAAa,EACrB,YAAY,4EAA4E,EACxF,eAAe,oBAAoB,sBAAsB,EACzD,OAAO,OAAO,SAAgC;AAC7C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAOD,SAAQC,QAAO;AAC5B,YAAM,cAAc,MAAM,KAAK;AAAA,QAC7B,2CAA2C,mBAAmB,KAAK,SAAS,CAAC;AAAA,MAC/E;AAEA,YAAM,OAAO,YAAY,MAAM,IAAI,SAAO;AAAA,QACxC,MAAM,GAAG,SAAS;AAAA,QAClB,YAAY,GAAG,WAAW,IAAI,QAAM;AAAA,UAClC,MAAM,EAAE;AAAA,UACR,KAAK,EAAE,MAAM;AAAA,UACb,QAAQ,EAAE,MAAM;AAAA,QAClB,EAAE;AAAA,MACJ,EAAE;AAEF,cAAQ,EAAE,WAAW,KAAK,WAAW,KAAK,GAAG,aAAa,eAAe,KAAK;AAAA,IAChF,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,eAAe,KAAK;AAAA,IAAG;AAAA,EAChE,CAAC;AACL;;;ACpTA,SAASE,SAAQC,UAA8B;AAC7C,QAAM,OAAOA,SAAQ,gBAAgB;AACrC,SAAO;AAAA,IACL,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAAA,IAC5D,QAAQ,KAAK,MAAM;AAAA,EACrB;AACF;AAEA,eAAe,SACb,WAC6C;AAC7C,QAAM,QAAa,CAAC;AACpB,MAAI;AACJ,KAAG;AACD,UAAM,OAAO,MAAM,UAAU,WAAW;AACxC,UAAM,KAAK,GAAG,KAAK,KAAK;AACxB,kBAAc,KAAK;AAAA,EACrB,SAAS;AACT,SAAO,EAAE,OAAO,YAAY,MAAM,OAAO;AAC3C;AAEA,eAAe,aACb,MACA,gBACA,MACA;AACA,SAAO,SAAS,OAAO,gBAAgB;AACrC,UAAM,OAAO,MAAM,KAAK,UAAsB,oBAAoB;AAAA,MAChE,QAAQ,cACJ,EAAE,YAAY,IACd;AAAA,QACE;AAAA,QACA,MAAM,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,QAAQ,KAAK;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,IACN,CAAC;AACD,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,cAAc,MAAkB,SAAmC;AAChF,MAAI,CAAC,qBAAqB,KAAK,OAAO,GAAG;AACvC,UAAM,IAAI,WAAW,0DAA0D;AAAA,EACjF;AACA,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,MAAI,WAAW,MAAM,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,OAAO,qCAAqC,QAAQ,YAAY,CAAC;AAAA,QACjE,4BAA4B;AAAA,MAC9B;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO,SAAS,UAAU,aAAa,SAAS,UAAU,eAAe;AACvE,QAAI,CAAC,SAAS,aAAc,OAAM,IAAI,WAAW,gDAAgD;AACjG,UAAM,cAAc,WAAW,KAAK,IAAI;AACxC,QAAI,eAAe,EAAG,OAAM,IAAI,WAAW,wDAAwD;AACnG,UAAM,cAAc,KAAK,IAAI;AAC7B,eAAW,MAAM,KAAK;AAAA,MACpB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,UACN,iBAAiB,SAAS;AAAA,UAC1B,mBAAmB,KAAK,IAAI,KAAM,WAAW;AAAA,QAC/C;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,SAAS,UAAU,aAAa,SAAS,UAAU,eAAe;AACpE,YAAM,UAAU,KAAK,IAAI,OAAQ,KAAK,IAAI,IAAI,cAAc,WAAW,KAAK,IAAI,CAAC;AACjF,UAAI,UAAU,EAAG,OAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,OAAO,CAAC;AAAA,IAC5E;AAAA,EACF;AAEA,MAAI,SAAS,UAAU,aAAa;AAClC,UAAM,IAAI,WAAW,SAAS,OAAO,WAAW,yBAAyB,SAAS,MAAM,YAAY,CAAC,EAAE;AAAA,EACzG;AACA,SAAO,SAAS;AAClB;AAEO,SAAS,0BAA0BA,UAAwB;AAChE,QAAM,YAAYA,SAAQ,QAAQ,WAAW,EAAE,YAAY,oCAAoC;AAE/F,QAAM,WAAW,UAAU,QAAQ,UAAU,EAAE,YAAY,6BAA6B;AACxF,WACG,QAAQ,MAAM,EACd,YAAY,kDAAkD,EAC9D,eAAe,yBAAyB,iDAAiD,EACzF,OAAO,iBAAiB,gDAAgD,EACxE,OAAO,eAAe,iCAAiC,EACvD,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,OAAO,SAA4E;AACzF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAM,aAAaD,SAAQC,QAAO,GAAG,KAAK,UAAU,IAAI;AACrE,cAAQ,EAAE,YAAY,KAAK,YAAY,UAAU,KAAK,MAAM,GAAG,aAAa,iBAAiB,KAAK;AAAA,IACpG,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,WACG,QAAQ,KAAK,EACb,YAAY,8BAA8B,EAC1C,eAAe,aAAa,0CAA0C,EACtE,OAAO,iBAAiB,YAAY,EACpC,OAAO,eAAe,UAAU,EAChC,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,OAAO,SAAsE;AACnF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAMD,SAAQC,QAAO,EAAE;AAAA,QAClC,oBAAoB,mBAAmB,KAAK,EAAE,CAAC;AAAA,QAC/C,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,IAAI,QAAQ,KAAK,OAAO,EAAE;AAAA,MAClE;AACA,cAAQ,MAAM,aAAa,gBAAgB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,gBAAgB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,YACG,QAAQ,UAAU,EAClB,YAAY,yBAAyB,EACrC,OAAO,iBAAiB,YAAY,EACpC,OAAO,eAAe,UAAU,EAChC,OAAO,OAAO,SAAyC;AACtD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAM,aAAaD,SAAQC,QAAO,GAAG,mBAAmB,IAAI;AACzE,cAAQ,EAAE,YAAY,KAAK,YAAY,UAAU,KAAK,MAAM,GAAG,aAAa,YAAY,KAAK;AAAA,IAC/F,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,YAAY,KAAK;AAAA,IAAG;AAAA,EAC7D,CAAC;AAEH,YACG,QAAQ,WAAW,EACnB,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,YAAY,EACpC,OAAO,eAAe,UAAU,EAChC,OAAO,OAAO,SAAyC;AACtD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,WAAW;AACjB,YAAM,OAAO,MAAM,aAAaD,SAAQC,QAAO,GAAG,UAAU,IAAI;AAChE,cAAQ,EAAE,YAAY,KAAK,YAAY,WAAW,KAAK,MAAM,GAAG,aAAa,aAAa,KAAK;AAAA,IACjG,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,aAAa,KAAK;AAAA,IAAG;AAAA,EAC9D,CAAC;AAEH,QAAM,WAAW,UAAU,QAAQ,UAAU,EAAE,YAAY,oBAAoB;AAC/E,WACG,QAAQ,MAAM,EACd,YAAY,eAAe,EAC3B,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,eAAe,yBAAyB,EAC/C,OAAO,iCAAiC,4BAA4B,EACpE,OAAO,gCAAgC,0BAA0B,EACjE,OAAO,OAAO,SAKT;AACJ,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,OAAO,gBAAgB;AACjD,cAAM,OAAO,MAAMD,SAAQC,QAAO,EAAE,UAAuB,oBAAoB;AAAA,UAC7E,QAAQ,cACJ,EAAE,YAAY,IACd;AAAA,YACE,MAAM,KAAK,QAAQ;AAAA,YACnB,IAAI,KAAK,MAAM;AAAA,YACf,iBAAiB,KAAK;AAAA,YACtB,gBAAgB,KAAK;AAAA,YACrB,UAAU;AAAA,UACZ;AAAA,QACN,CAAC;AACD,eAAO,EAAE,OAAO,KAAK,UAAU,aAAa,KAAK,aAAa,YAAY,KAAK,WAAW;AAAA,MAC5F,CAAC;AACD,cAAQ,EAAE,YAAY,KAAK,YAAY,UAAU,KAAK,MAAM,GAAG,aAAa,iBAAiB,KAAK;AAAA,IACpG,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,iBAAiB,KAAK;AAAA,IAAG;AAAA,EAClE,CAAC;AAEH,WACG,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC,eAAe,aAAa,YAAY,EACxC,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,OAAO,SAA0C;AACvD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAMD,SAAQC,QAAO,EAAE;AAAA,QAClC,oBAAoB,mBAAmB,KAAK,EAAE,CAAC;AAAA,QAC/C,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,EAAE;AAAA,MACpC;AACA,cAAQ,MAAM,aAAa,gBAAgB,KAAK;AAAA,IAClD,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,gBAAgB,KAAK;AAAA,IAAG;AAAA,EACjE,CAAC;AAEH,YACG,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD,eAAe,mBAAmB,0CAA0C,EAC5E,OAAO,OAAO,SAAyB;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,MAAM,cAAcD,SAAQC,QAAO,GAAG,KAAK,EAAE;AAC5D,cAAQ,QAAQ,aAAa,SAAS,KAAK;AAAA,IAC7C,SAAS,KAAK;AAAE,WAAK,KAAK,aAAa,SAAS,KAAK;AAAA,IAAG;AAAA,EAC1D,CAAC;AACL;;;A9D7OA,IAAI,CAAC,QAAQ,IAAI,kBAAkB;AACjC,UAAQ,IAAI,+BAA+B;AAC7C;AA6BA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAE7C,IAAM,MAAMA,SAAQ,iBAAiB;AAErC,IAAM,UAAU;AAEhB,IAAM,UAAU,IAAIC,SAAQ;AAE5B,QACG,KAAK,OAAO,EACZ,YAAY,sCAAiC,OAAO,EAAE,EACtD,QAAQ,GAAG,IAAI,OAAiB,WAAM,OAAO,IAAI,eAAe,EAChE,OAAO,YAAY,mCAAmC,KAAK,EAC3D,OAAO,aAAa,kCAAkC,KAAK,EAC3D,OAAO,WAAW,mGAA8F,KAAK,EACrH,OAAO,aAAa,wCAAwC,KAAK,EACjE,OAAO,mBAAmB,sCAAsC,EAChE,OAAO,wBAAwB,6CAA6C;AAG/E,QAAQ,KAAK,aAAa,CAAC,gBAAgB;AACzC,QAAM,OAAO,YAAY,gBAAgB;AACzC,mBAAiB;AAAA,IACf,QAAQ,QAAQ,KAAK,MAAM;AAAA,IAC3B,SAAS,QAAQ,KAAK,OAAO;AAAA,IAC7B,OAAO,QAAQ,KAAK,KAAK;AAAA,IACzB,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,MAAI;AACF,UAAM,SAAS,WAAW,EAAE,YAAY,KAAK,OAA6B,CAAC;AAC3E,kBAAc,OAAO,IAAI;AAAA,EAC3B,QAAQ;AAAA,EAER;AACF,CAAC;AAED,oBAAoB,OAAO;AAC3B,qBAAqB,OAAO;AAC5B,0BAA0B,OAAO;AACjC,uBAAuB,OAAO;AAC9B,2BAA2B,OAAO;AAClC,sBAAsB,OAAO;AAC7B,oBAAoB,OAAO;AAC3B,qBAAqB,OAAO;AAC5B,uBAAuB,OAAO;AAC9B,oBAAoB,OAAO;AAC3B,wBAAwB,OAAO;AAC/B,4BAA4B,OAAO;AACnC,wBAAwB,OAAO;AAC/B,0BAA0B,OAAO;AACjC,2BAA2B,OAAO;AAClC,yBAAyB,OAAO;AAChC,2BAA2B,OAAO;AAClC,uBAAuB,OAAO;AAC9B,oBAAoB,OAAO;AAC3B,0BAA0B,OAAO;AACjC,0BAA0B,OAAO;AAEjC,QAAQ,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAuB5B;AAED,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,QAAiB;AACvD,MAAI,QAAQ,aAAa,OAAW;AACpC,UAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,UAAQ,WAAW,SAAS;AAC9B,CAAC;","names":["Command","execSync","path","program","readFileSync","API","readFileSync","readFileSync","program","readFileSync","getClient","program","path","getClient","program","existsSync","mkdirSync","writeFileSync","path","readFileSync","basename","API","readFileSync","basename","path","getClient","program","existsSync","mkdirSync","writeFileSync","API","getClient","program","API","getClient","program","resolveProject","Option","path","execSync","execFileSync","path","pkg","path","path","execSync","path","execFileSync","pkg","pkg","pkg","BATCH_SIZE","TIMEOUT_MS","fetchWithTimeout","pkg","inferSeverityFromCvss","queryBatch","TIMEOUT_MS","BATCH_SIZE","fetchWithTimeout","toPurl","pkg","TIMEOUT_MS","fetchWithTimeout","pkg","pkg","pkg","pkg","program","Option","readFileSync","basename","API","fs","program","path","categorize","API","API","program","parseFieldArgs","fs","path","parseFieldArgs","path","fs","repo","AdoCoreClient","createHttpClient","program","getClient","program","API","path","getClient","program","path","POLL_INTERVAL_MS","getClient","program","getClient","program","program","program","program","path","fs","path","execFileSync","input","path","fs","execFileSync","program","colonIdx","results","input","input","program","getHttp","program","entry","getHttp","program","require","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/services/git/client.ts","../src/lib/git-context.ts","../src/services/bitbucket/client.ts","../src/services/git/commands.ts","../src/services/jira/commands.ts","../src/services/jira/client.ts","../src/lib/mime.ts","../src/services/jira/custom-fields.ts","../src/services/jira/input-schema.ts","../src/lib/input.ts","../src/services/bitbucket/commands.ts","../src/services/github/commands.ts","../src/services/github/client.ts","../src/services/confluence/commands.ts","../src/services/confluence/client.ts","../src/services/sonar/client.ts","../src/services/sonar/commands.ts","../src/services/sde/client.ts","../src/services/sde/commands.ts","../src/services/deps/commands.ts","../src/services/deps/parsers/index.ts","../src/services/deps/parsers/npm.ts","../src/services/deps/parsers/nuget.ts","../src/services/deps/parsers/maven.ts","../src/services/deps/scan.ts","../src/services/deps/semver.ts","../src/services/deps/diff.ts","../src/services/deps/clients/osv.ts","../src/services/deps/clients/sonatype.ts","../src/services/deps/clients/sonatypeiq.ts","../src/services/deps/clients/artifactory.ts","../src/services/deps/connectivity.ts","../src/services/deps/frisk.ts","../src/services/deps/outdated.ts","../src/services/deps/license-check.ts","../src/services/config/commands.ts","../src/services/ado/client/work.ts","../src/services/ado/discovery.ts","../src/services/ado/client/git.ts","../src/services/ado/client/build.ts","../src/services/ado/helpers.ts","../src/services/ado/commands/project.ts","../src/services/ado/commands/work.ts","../src/services/ado/input-schema.ts","../src/services/ado/commands/repo.ts","../src/services/ado/commands/pipeline.ts","../src/services/ado/commands/index.ts","../src/services/jenkins/client.ts","../src/services/jenkins/commands.ts","../src/services/artifactory/client.ts","../src/services/artifactory/commands.ts","../src/services/udeploy/client.ts","../src/services/udeploy/commands.ts","../src/services/checkmarx/client.ts","../src/services/checkmarx/commands.ts","../src/services/servicenow/commands.ts","../src/services/contrast/commands.ts","../src/services/sonatypeiq/commands.ts","../src/services/skills/commands.ts","../src/services/jwt/commands.ts","../src/services/openshift/commands.ts","../src/services/dynatrace/commands.ts","../src/services/logscale/commands.ts"],"sourcesContent":["// TLS verification is disabled by default — most enterprise Data Center installs\n// sit behind corporate SSL inspection proxies that break standard certificate chains.\n// To opt back in: set PNCLI_VERIFY_TLS=1\nif (!process.env.PNCLI_VERIFY_TLS) {\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';\n}\n\nimport { Command } from 'commander';\nimport { createRequire } from 'module';\nimport { setGlobalOptions, setGlobalUser } from './lib/output.js';\nimport { ExitCode } from './lib/exitCodes.js';\nimport { loadConfig } from './lib/config.js';\nimport { registerGitCommands } from './services/git/commands.js';\nimport { registerJiraCommands } from './services/jira/commands.js';\nimport { registerBitbucketCommands } from './services/bitbucket/commands.js';\nimport { registerGitHubCommands } from './services/github/commands.js';\nimport { registerConfluenceCommands } from './services/confluence/commands.js';\nimport { registerSonarCommands } from './services/sonar/commands.js';\nimport { registerSdeCommands } from './services/sde/commands.js';\nimport { registerDepsCommands } from './services/deps/commands.js';\nimport { registerConfigCommands } from './services/config/commands.js';\nimport { registerAdoCommands } from './services/ado/commands/index.js';\nimport { registerJenkinsCommands } from './services/jenkins/commands.js';\nimport { registerArtifactoryCommands } from './services/artifactory/commands.js';\nimport { registerUdeployCommands } from './services/udeploy/commands.js';\nimport { registerCheckmarxCommands } from './services/checkmarx/commands.js';\nimport { registerServiceNowCommands } from './services/servicenow/commands.js';\nimport { registerContrastCommands } from './services/contrast/commands.js';\nimport { registerSonatypeIqCommands } from './services/sonatypeiq/commands.js';\nimport { registerSkillsCommands } from './services/skills/commands.js';\nimport { registerJwtCommands } from './services/jwt/commands.js';\nimport { registerOpenShiftCommands } from './services/openshift/commands.js';\nimport { registerDynatraceCommands } from './services/dynatrace/commands.js';\nimport { registerLogscaleCommands } from './services/logscale/commands.js';\n\nconst require = createRequire(import.meta.url);\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst pkg = require('../package.json') as any;\n\nconst TAGLINE = 'One command does what three meetings couldn\\'t.';\n\nconst program = new Command();\n\nprogram\n .name('pncli')\n .description(`The Paperwork Nightmare CLI — ${TAGLINE}`)\n .version(`${pkg.version as string} — ${TAGLINE}`, '-v, --version')\n .option('--pretty', 'Human-readable formatted output', false)\n .option('--verbose', 'Include full response metadata', false)\n .option('--debug', 'Print diagnostic traces (method, URL, status) for all API calls — does not log credentials', false)\n .option('--dry-run', 'Print API requests without executing', false)\n .option('--config <path>', 'Override global config file location')\n .option('--output-file <path>', 'Write JSON output to file instead of stdout');\n\n// Propagate global options and user identity before any command runs\nprogram.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setGlobalOptions({\n pretty: Boolean(opts.pretty),\n verbose: Boolean(opts.verbose),\n debug: Boolean(opts.debug),\n outputFile: opts.outputFile as string | undefined\n });\n try {\n const config = loadConfig({ configPath: opts.config as string | undefined });\n setGlobalUser(config.user);\n } catch {\n // config may not exist yet (e.g. during `config init`) — silently skip\n }\n});\n\nregisterGitCommands(program);\nregisterJiraCommands(program);\nregisterBitbucketCommands(program);\nregisterGitHubCommands(program);\nregisterConfluenceCommands(program);\nregisterSonarCommands(program);\nregisterSdeCommands(program);\nregisterDepsCommands(program);\nregisterConfigCommands(program);\nregisterAdoCommands(program);\nregisterJenkinsCommands(program);\nregisterArtifactoryCommands(program);\nregisterUdeployCommands(program);\nregisterCheckmarxCommands(program);\nregisterServiceNowCommands(program);\nregisterContrastCommands(program);\nregisterSonatypeIqCommands(program);\nregisterSkillsCommands(program);\nregisterJwtCommands(program);\nregisterOpenShiftCommands(program);\nregisterDynatraceCommands(program);\nregisterLogscaleCommands(program);\n\nprogram.addHelpText('after', `\nServices:\n git Local git operations (status, diff, log, branch)\n deps Dependency scanning, CVE detection, license auditing\n jira Jira Data Cloud\n bitbucket Bitbucket Server\n github GitHub (PRs, reviews, comments, checks)\n confluence Confluence\n sonar SonarQube Server (quality gates, issues, metrics, hotspots)\n sde SDElements (threat modeling, countermeasures, compliance)\n ado Azure DevOps Server (work items, repos, PRs, pipelines)\n jenkins Jenkins Data Center (jobs, builds, logs)\n artifactory Artifactory (repos, artifact search, build info, properties)\n udeploy IBM UrbanCode Deploy (component versions, deployment processes)\n checkmarx Checkmarx One (projects, scans, scan statistics)\n servicenow ServiceNow (change requests)\n contrast Contrast IAST (applications, vulnerability findings)\n sonatypeiq Sonatype IQ Server (applications, organizations, policies)\n openshift OpenShift / Kubernetes (pods, events, logs, metrics)\n dynatrace Dynatrace (services, entities, problems, traces, Kubernetes workloads)\n logscale LogScale (log query, repositories)\n config Manage pncli configuration\n skills Download and manage Claude Code skills\n jwt JWT token utilities (decode header and payload)\n`);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n if (process.exitCode !== undefined) return; // already handled by fail() or dry-run\n process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = ExitCode.GENERAL_ERROR;\n});\n","import { execSync, execFileSync } from 'child_process';\n\nconst DIFF_LINE_LIMIT = 5000;\n\nexport interface GitStatusResult {\n staged: string[];\n unstaged: string[];\n untracked: string[];\n}\n\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n lines: string[];\n}\n\nexport interface DiffFile {\n path: string;\n binary: boolean;\n truncated: boolean;\n hunks: DiffHunk[];\n}\n\nexport interface DiffResult {\n files: DiffFile[];\n truncated: boolean;\n}\n\nexport interface CommitEntry {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\nexport interface BranchResult {\n current: string;\n local: string[];\n remote: string[];\n}\n\nfunction exec(cmd: string, cwd: string): string {\n return execSync(cmd, { encoding: 'utf8', cwd }).trim();\n}\n\nexport function getStatus(root: string): GitStatusResult {\n const output = exec('git status --porcelain', root);\n const staged: string[] = [];\n const unstaged: string[] = [];\n const untracked: string[] = [];\n\n if (!output) return { staged, unstaged, untracked };\n\n for (const line of output.split('\\n')) {\n if (!line) continue;\n const x = line[0]!;\n const y = line[1]!;\n const file = line.slice(3);\n\n if (x === '?' && y === '?') {\n untracked.push(file);\n } else {\n if (x !== ' ' && x !== '?') staged.push(file);\n if (y !== ' ' && y !== '?') unstaged.push(file);\n }\n }\n\n return { staged, unstaged, untracked };\n}\n\nfunction parseHunkHeader(header: string): { oldStart: number; oldCount: number; newStart: number; newCount: number } {\n const match = header.match(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (!match) return { oldStart: 0, oldCount: 0, newStart: 0, newCount: 0 };\n return {\n oldStart: parseInt(match[1]!, 10),\n oldCount: parseInt(match[2] ?? '1', 10),\n newStart: parseInt(match[3]!, 10),\n newCount: parseInt(match[4] ?? '1', 10)\n };\n}\n\nfunction parseDiff(rawDiff: string): DiffResult {\n const lines = rawDiff.split('\\n');\n const files: DiffFile[] = [];\n let globalTruncated = false;\n let lineCount = 0;\n\n let currentFile: DiffFile | null = null;\n let currentHunk: DiffHunk | null = null;\n\n for (const line of lines) {\n lineCount++;\n if (lineCount > DIFF_LINE_LIMIT) {\n globalTruncated = true;\n if (currentFile) currentFile.truncated = true;\n break;\n }\n\n if (line.startsWith('diff --git ')) {\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n currentHunk = null;\n if (currentFile) files.push(currentFile);\n\n const pathMatch = line.match(/diff --git a\\/(.+) b\\/.+$/);\n currentFile = {\n path: pathMatch ? pathMatch[1]! : line,\n binary: false,\n truncated: false,\n hunks: []\n };\n continue;\n }\n\n if (!currentFile) continue;\n\n if (line.startsWith('Binary files')) {\n currentFile.binary = true;\n continue;\n }\n\n if (line.startsWith('@@ ')) {\n if (currentHunk) currentFile.hunks.push(currentHunk);\n const { oldStart, oldCount, newStart, newCount } = parseHunkHeader(line);\n currentHunk = { oldStart, oldCount, newStart, newCount, lines: [] };\n continue;\n }\n\n if (currentHunk && (line.startsWith('+') || line.startsWith('-') || line.startsWith(' '))) {\n currentHunk.lines.push(line);\n }\n }\n\n if (currentHunk && currentFile) currentFile.hunks.push(currentHunk);\n if (currentFile) files.push(currentFile);\n\n return { files, truncated: globalTruncated };\n}\n\nexport function getDiff(root: string, opts: { staged?: boolean; file?: string }): DiffResult {\n const args = ['git', 'diff'];\n if (opts.staged) args.push('--staged');\n if (opts.file) args.push('--', opts.file);\n\n try {\n const raw = exec(args.join(' '), root);\n if (!raw) return { files: [], truncated: false };\n return parseDiff(raw);\n } catch {\n return { files: [], truncated: false };\n }\n}\n\nexport function getLog(root: string, opts: { count?: number; since?: string }): CommitEntry[] {\n const sep = '\\x1F'; // ASCII unit separator — safe in git format strings\n const fmt = `%H${sep}%an${sep}%aI${sep}%s`;\n const args = [`log`, `--format=${fmt}`];\n if (opts.count) args.push(`-n`, String(opts.count));\n if (opts.since) args.push(`--since=${opts.since}`);\n\n try {\n const output = execFileSync('git', args, { encoding: 'utf8', cwd: root }).trim();\n if (!output) return [];\n return output.split('\\n').filter(Boolean).map(line => {\n const parts = line.split(sep);\n return {\n hash: parts[0] ?? '',\n author: parts[1] ?? '',\n date: parts[2] ?? '',\n message: parts[3] ?? ''\n };\n });\n } catch {\n return [];\n }\n}\n\nexport function getBranches(root: string): BranchResult {\n const output = exec('git branch -a', root);\n const local: string[] = [];\n const remote: string[] = [];\n let current = '';\n\n for (const line of output.split('\\n')) {\n if (!line.trim()) continue;\n const isCurrent = line.startsWith('*');\n const name = line.replace(/^\\*?\\s+/, '').trim();\n\n if (name.startsWith('remotes/')) {\n remote.push(name.replace('remotes/', ''));\n } else {\n if (isCurrent) current = name;\n local.push(name);\n }\n }\n\n return { current, local, remote };\n}\n\nexport interface CommitStats {\n hash: string;\n date: string;\n author: string;\n message: string;\n filesChanged: number;\n insertions: number;\n deletions: number;\n netLines: number;\n}\n\nexport interface AuthorStats {\n author: string;\n commitCount: number;\n insertions: number;\n deletions: number;\n netLines: number;\n filesChanged: number;\n}\n\nexport interface WeeklyBreakdown {\n week: string;\n weekStart: string;\n weekEnd: string;\n authors: AuthorStats[];\n summary: {\n commitCount: number;\n totalInsertions: number;\n totalDeletions: number;\n totalNetLines: number;\n totalFilesChanged: number;\n };\n}\n\nexport interface BranchReport {\n branch: string;\n since: string | null;\n until: string | null;\n commits: CommitStats[];\n weeks: WeeklyBreakdown[];\n byAuthor: AuthorStats[];\n summary: {\n commitCount: number;\n totalInsertions: number;\n totalDeletions: number;\n totalNetLines: number;\n totalFilesChanged: number;\n };\n}\n\nexport const COMMIT_PREFIX = '__PNCLI_COMMIT__';\n\nfunction getWeekMonday(dateStr: string): string {\n const d = new Date(dateStr);\n const day = d.getUTCDay(); // 0=Sun\n const diff = day === 0 ? -6 : 1 - day;\n const monday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + diff));\n return monday.toISOString().slice(0, 10);\n}\n\nfunction getWeekSunday(mondayStr: string): string {\n const d = new Date(mondayStr);\n const sunday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + 6));\n return sunday.toISOString().slice(0, 10);\n}\n\nfunction getISOWeekLabel(mondayStr: string): string {\n const d = new Date(mondayStr);\n // Thursday of the same week determines the ISO year\n const thursday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + 3));\n const year = thursday.getUTCFullYear();\n const jan4 = new Date(Date.UTC(year, 0, 4)); // Jan 4 is always in week 1\n const jan4Monday = new Date(Date.UTC(year, 0, 4 - (jan4.getUTCDay() === 0 ? 6 : jan4.getUTCDay() - 1)));\n const weekNum = Math.round((d.getTime() - jan4Monday.getTime()) / (7 * 86400000)) + 1;\n return `${year}-W${String(weekNum).padStart(2, '0')}`;\n}\n\nfunction buildWeeklyBreakdown(commits: CommitStats[]): WeeklyBreakdown[] {\n const weekMap = new Map<string, Map<string, AuthorStats>>();\n\n for (const commit of commits) {\n const monday = getWeekMonday(commit.date);\n if (!weekMap.has(monday)) weekMap.set(monday, new Map());\n const authorMap = weekMap.get(monday)!;\n\n if (!authorMap.has(commit.author)) {\n authorMap.set(commit.author, {\n author: commit.author,\n commitCount: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0,\n filesChanged: 0\n });\n }\n\n const stats = authorMap.get(commit.author)!;\n stats.commitCount++;\n stats.insertions += commit.insertions;\n stats.deletions += commit.deletions;\n stats.netLines += commit.netLines;\n stats.filesChanged += commit.filesChanged;\n }\n\n return [...weekMap.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([monday, authorMap]) => {\n const authors = [...authorMap.values()].sort((a, b) => a.author.localeCompare(b.author));\n return {\n week: getISOWeekLabel(monday),\n weekStart: monday,\n weekEnd: getWeekSunday(monday),\n authors,\n summary: {\n commitCount: authors.reduce((s, a) => s + a.commitCount, 0),\n totalInsertions: authors.reduce((s, a) => s + a.insertions, 0),\n totalDeletions: authors.reduce((s, a) => s + a.deletions, 0),\n totalNetLines: authors.reduce((s, a) => s + a.netLines, 0),\n totalFilesChanged: authors.reduce((s, a) => s + a.filesChanged, 0)\n }\n };\n });\n}\n\nfunction buildByAuthor(commits: CommitStats[]): AuthorStats[] {\n const map = new Map<string, AuthorStats>();\n for (const commit of commits) {\n if (!map.has(commit.author)) {\n map.set(commit.author, {\n author: commit.author,\n commitCount: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0,\n filesChanged: 0\n });\n }\n const stats = map.get(commit.author)!;\n stats.commitCount++;\n stats.insertions += commit.insertions;\n stats.deletions += commit.deletions;\n stats.netLines += commit.netLines;\n stats.filesChanged += commit.filesChanged;\n }\n return [...map.values()].sort((a, b) => a.author.localeCompare(b.author));\n}\n\n// Exported for unit testing\nexport function parseBranchReportOutput(\n raw: string,\n branchName: string,\n opts: { since?: string; until?: string }\n): BranchReport {\n const commits: CommitStats[] = [];\n let current: CommitStats | null = null;\n\n for (const line of raw.split('\\n')) {\n if (line.startsWith(COMMIT_PREFIX)) {\n if (current) commits.push(current);\n const parts = line.slice(COMMIT_PREFIX.length).split('\\t');\n current = {\n hash: parts[0] ?? '',\n author: parts[1] ?? '',\n date: parts[2] ?? '',\n message: parts[3] ?? '',\n filesChanged: 0,\n insertions: 0,\n deletions: 0,\n netLines: 0\n };\n } else if (current && /^(\\d+|-)\\t(\\d+|-)/.test(line)) {\n // numstat line: insertions\\tdeletions\\tfilename\n const [ins, del] = line.split('\\t');\n const insertions = ins === '-' ? 0 : parseInt(ins ?? '0', 10);\n const deletions = del === '-' ? 0 : parseInt(del ?? '0', 10);\n if (!isNaN(insertions) && !isNaN(deletions)) {\n current.insertions += insertions;\n current.deletions += deletions;\n current.filesChanged++;\n current.netLines = current.insertions - current.deletions;\n }\n }\n }\n\n if (current) commits.push(current);\n\n // git --since/--until uses committer date for traversal, but we display and\n // report on author date (%aI). Apply a secondary filter by author date so\n // the output is consistent with the user-supplied range. Only applied for\n // absolute YYYY-MM-DD dates; relative values like \"2 weeks ago\" are left to\n // git alone since they cannot be parsed here.\n const isAbsoluteDate = (s: string): boolean => /^\\d{4}-\\d{2}-\\d{2}/.test(s);\n const sinceDate = opts.since && isAbsoluteDate(opts.since) ? opts.since.slice(0, 10) : null;\n const untilDate = opts.until && isAbsoluteDate(opts.until) ? opts.until.slice(0, 10) : null;\n const filteredCommits = (sinceDate || untilDate)\n ? commits.filter(c => {\n const d = c.date.slice(0, 10);\n if (sinceDate && d < sinceDate) return false;\n if (untilDate && d > untilDate) return false;\n return true;\n })\n : commits;\n\n const totalInsertions = filteredCommits.reduce((sum, c) => sum + c.insertions, 0);\n const totalDeletions = filteredCommits.reduce((sum, c) => sum + c.deletions, 0);\n\n return {\n branch: branchName,\n since: opts.since ?? null,\n until: opts.until ?? null,\n commits: filteredCommits,\n weeks: buildWeeklyBreakdown(filteredCommits),\n byAuthor: buildByAuthor(filteredCommits),\n summary: {\n commitCount: filteredCommits.length,\n totalInsertions,\n totalDeletions,\n totalNetLines: totalInsertions - totalDeletions,\n totalFilesChanged: filteredCommits.reduce((sum, c) => sum + c.filesChanged, 0)\n }\n };\n}\n\n// Normalize a date-only string (YYYY-MM-DD) to include an explicit time and\n// UTC timezone component so that git's date parser uses its strict ISO 8601\n// path on all platforms. Without a timezone suffix, some git versions fall\n// back to the approxidate fuzzy parser, which can mis-parse previous-year\n// dates and exit non-zero — the silent try/catch in getBranchReport then\n// returns raw=\"\" and the report shows zero commits. Adding +00:00 forces the\n// strict parser on every git version. Strings that already contain a time\n// component are returned as-is.\nfunction normalizeGitDate(dateStr: string): string {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(dateStr)) {\n return `${dateStr}T00:00:00+00:00`;\n }\n return dateStr;\n}\n\n// Exported for unit testing — pure arg construction with no I/O\nexport function buildReportArgs(opts: { branch?: string; since?: string; until?: string; base?: string }): string[] {\n const fmt = `${COMMIT_PREFIX}%H\\t%an\\t%aI\\t%s`;\n const args = ['log', `--format=${fmt}`, '--numstat'];\n\n if (opts.since) args.push(`--since=${normalizeGitDate(opts.since)}`);\n if (opts.until) args.push(`--until=${normalizeGitDate(opts.until)}`);\n\n if (opts.base && opts.branch) {\n args.push(`${opts.base}..${opts.branch}`);\n } else if (opts.base) {\n args.push(`${opts.base}..HEAD`);\n } else if (opts.branch) {\n args.push(opts.branch);\n }\n\n return args;\n}\n\nexport function getBranchReport(\n root: string,\n opts: { branch?: string; since?: string; until?: string; base?: string }\n): BranchReport {\n const args = buildReportArgs(opts);\n\n let raw = '';\n try {\n raw = execFileSync('git', args, { encoding: 'utf8', cwd: root, maxBuffer: 200 * 1024 * 1024 }).trim();\n } catch {\n // no commits or invalid ref — return empty report\n }\n\n let branchName = opts.branch ?? '';\n if (!branchName) {\n try {\n branchName = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\n encoding: 'utf8',\n cwd: root\n }).trim();\n } catch {\n branchName = 'HEAD';\n }\n }\n\n return parseBranchReportOutput(raw, branchName, opts);\n}\n\nfunction escapeCsvField(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport function formatBranchReportCsv(report: BranchReport): string {\n const header = 'week,week_start,author,commits,insertions,deletions,net_lines,files_changed';\n const rows: string[] = [];\n\n for (const week of report.weeks) {\n for (const a of week.authors) {\n rows.push(\n [\n week.week,\n week.weekStart,\n escapeCsvField(a.author),\n a.commitCount,\n a.insertions,\n a.deletions,\n a.netLines,\n a.filesChanged\n ].join(',')\n );\n }\n }\n\n const s = report.summary;\n const totalRow = ['TOTAL', '', '', s.commitCount, s.totalInsertions, s.totalDeletions, s.totalNetLines, s.totalFilesChanged].join(',');\n\n return [header, ...rows, totalRow].join('\\n') + '\\n';\n}\n","import { execSync } from 'child_process';\nimport type { ResolvedConfig } from '../types/config.js';\n\nexport interface GitContext {\n root: string;\n branch: string;\n // Bitbucket-resolved fields\n project: string | null;\n repo: string | null;\n // Azure DevOps Server-resolved fields\n ado: { collection: string; project: string; repo: string } | null;\n // GitHub-resolved fields\n github: { owner: string; repo: string } | null;\n}\n\nexport function getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n } catch {\n return null;\n }\n}\n\nexport function getCurrentBranch(repoRoot: string): string | null {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf8',\n cwd: repoRoot\n }).trim();\n } catch {\n return null;\n }\n}\n\nexport function parseRemote(\n remoteUrl: string,\n bitbucketBaseUrl: string | undefined\n): { project: string; repo: string } | null {\n if (!bitbucketBaseUrl) return null;\n\n // Normalize base URL for comparison\n const base = bitbucketBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '');\n\n // SSH format: git@bitbucket.imagile.dev:7999/PROJ/repo.git\n const sshMatch = remoteUrl.match(/^git@([^:]+)(?::\\d+)?[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n const [, host, project, repo] = sshMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n // HTTPS format: https://bitbucket.imagile.dev/scm/PROJ/repo.git\n const httpsMatch = remoteUrl.match(/^https?:\\/\\/([^/]+)\\/scm\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (httpsMatch) {\n const [, host, project, repo] = httpsMatch;\n if (host && base.includes(host)) {\n return { project, repo };\n }\n }\n\n return null;\n}\n\n/**\n * Parses an Azure DevOps Server git remote URL into { collection, project, repo }.\n *\n * Supported formats:\n * HTTPS : https://<host>[/<prefix>]/<collection>/<project>/_git/<repo>\n * SSH : ssh://git@<host>[:<port>][/<prefix>]/<collection>/<project>/_ssh/<repo>\n * git@<host>[:<port>]/<prefix>/<collection>/<project>/<repo>\n *\n * Strategy: find the `_git` or `_ssh` segment; walk back — the segment immediately\n * before it is the project, the one before that is the collection. Anything before\n * the collection is treated as a path prefix (e.g. /tfs/) and is ignored.\n * URL is only parsed if the host is contained in adoBaseUrl (same guard as Bitbucket).\n */\nexport function parseAdoRemote(\n remoteUrl: string,\n adoBaseUrl: string | undefined\n): { collection: string; project: string; repo: string } | null {\n if (!adoBaseUrl) return null;\n\n // Normalize base URL: extract just the hostname (without port) for comparison,\n // so that https://tfs.imagile.dev:8080 and git@tfs.imagile.dev:... both match.\n let baseHostname: string;\n try {\n const normalizedBase = /^https?:\\/\\//.test(adoBaseUrl) ? adoBaseUrl : `https://${adoBaseUrl}`;\n baseHostname = new URL(normalizedBase).hostname.toLowerCase();\n } catch {\n baseHostname = adoBaseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//, '').split(/[:/]/)[0]!.toLowerCase();\n }\n\n // Extract host from the remote URL (after stripping protocol/credentials)\n let path = remoteUrl;\n let remoteHostname = '';\n\n // ssh:// form\n const sshProtoMatch = path.match(/^ssh:\\/\\/[^@]*@?([^/:]+)(?::\\d+)?(.*)/);\n if (sshProtoMatch) {\n remoteHostname = sshProtoMatch[1]!.toLowerCase();\n path = sshProtoMatch[2]!;\n } else {\n // git@host form or https://\n const gitAtMatch = path.match(/^git@([^:]+)(?::\\d+)?:(.*)/);\n if (gitAtMatch) {\n remoteHostname = gitAtMatch[1]!.toLowerCase();\n path = '/' + gitAtMatch[2]!;\n } else {\n const httpsMatch = path.match(/^https?:\\/\\/([^/:]+)(?::\\d+)?(.*)/);\n if (httpsMatch) {\n remoteHostname = httpsMatch[1]!.toLowerCase();\n path = httpsMatch[2]!;\n }\n }\n }\n\n if (!remoteHostname || remoteHostname !== baseHostname) return null;\n\n // Strip trailing .git\n path = path.replace(/\\.git$/, '');\n\n // Find _git or _ssh segment\n const gitIdx = path.indexOf('/_git/');\n const sshIdx = path.indexOf('/_ssh/');\n const markerIdx = gitIdx !== -1 ? gitIdx : sshIdx;\n if (markerIdx === -1) return null;\n\n const repo = decodeURIComponent(path.slice(markerIdx + 6)); // skip /_git/ or /_ssh/\n if (!repo) return null;\n\n // Everything before the marker: /<prefix>/<collection>/<project>\n const before = path.slice(1, markerIdx); // strip leading /\n const parts = before.split('/').filter(Boolean);\n if (parts.length < 2) return null;\n\n const project = decodeURIComponent(parts[parts.length - 1]!);\n const collection = decodeURIComponent(parts[parts.length - 2]!);\n\n return { collection, project, repo };\n}\n\n/**\n * Parses a GitHub remote URL into { owner, repo }.\n *\n * Supported formats:\n * HTTPS : https://github.com/{owner}/{repo}[.git]\n * https://{githubHost}/{owner}/{repo}[.git]\n * SSH : git@github.com:{owner}/{repo}[.git]\n * git@{githubHost}:{owner}/{repo}[.git]\n * ssh://git@{githubHost}[:port]/{owner}/{repo}[.git]\n *\n * When baseUrl is provided (for GitHub Enterprise), only URLs matching that host are accepted.\n * When baseUrl is undefined, only github.com URLs are matched.\n */\nexport function parseGitHubRemote(\n remoteUrl: string,\n baseUrl: string | undefined\n): { owner: string; repo: string } | null {\n // Determine which host(s) to match\n let targetHost: string;\n if (baseUrl) {\n try {\n const normalizedBase = /^https?:\\/\\//i.test(baseUrl) ? baseUrl : `https://${baseUrl}`;\n const hostname = new URL(normalizedBase).hostname.toLowerCase();\n // api.github.com is the REST API host but git remotes use github.com\n targetHost = hostname === 'api.github.com' ? 'github.com' : hostname;\n } catch {\n targetHost = baseUrl.replace(/\\/$/, '').replace(/^https?:\\/\\//i, '').split(/[:/]/)[0]!.toLowerCase();\n }\n } else {\n targetHost = 'github.com';\n }\n\n // SSH format: git@{host}:{owner}/{repo}[.git]\n const sshMatch = remoteUrl.match(/^git@([^:]+):([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n const [, host, owner, repo] = sshMatch;\n if (host!.toLowerCase() === targetHost) {\n return { owner: owner!, repo: repo! };\n }\n }\n\n // ssh:// protocol form: ssh://git@{host}[:port]/{owner}/{repo}[.git]\n const sshProtoMatch = remoteUrl.match(/^ssh:\\/\\/git@([^/:]+)(?::\\d+)?\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshProtoMatch) {\n const [, host, owner, repo] = sshProtoMatch;\n if (host!.toLowerCase() === targetHost) {\n return { owner: owner!, repo: repo! };\n }\n }\n\n // HTTPS format: https://{host}/{owner}/{repo}[.git]\n const httpsMatch = remoteUrl.match(/^https?:\\/\\/([^/:]+)(?::\\d+)?\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (httpsMatch) {\n const [, host, owner, repo] = httpsMatch;\n if (host!.toLowerCase() === targetHost) {\n return { owner: owner!, repo: repo! };\n }\n }\n\n return null;\n}\n\nfunction getRemoteUrls(repoRoot: string): string[] {\n try {\n const output = execSync('git remote -v', { encoding: 'utf8', cwd: repoRoot });\n return output\n .split('\\n')\n .filter(line => line.includes('(fetch)'))\n .map(line => line.split('\\t')[1]?.split(' ')[0] ?? '')\n .filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getGitContext(config: ResolvedConfig): GitContext | null {\n const root = getRepoRoot();\n if (!root) return null;\n\n const branch = getCurrentBranch(root) ?? 'unknown';\n const remoteUrls = getRemoteUrls(root);\n\n // Bitbucket: disambiguated by /scm/ pattern\n let project: string | null = null;\n let repo: string | null = null;\n for (const url of remoteUrls) {\n const parsed = parseRemote(url, config.bitbucket.baseUrl);\n if (parsed) {\n project = parsed.project;\n repo = parsed.repo;\n break;\n }\n }\n\n // Azure DevOps Server: disambiguated by /_git/ pattern\n let adoContext: GitContext['ado'] = null;\n for (const url of remoteUrls) {\n const parsed = parseAdoRemote(url, config.ado.baseUrl);\n if (parsed) {\n adoContext = parsed;\n break;\n }\n }\n\n // GitHub: disambiguated by github.com host or configured baseUrl\n let githubContext: GitContext['github'] = null;\n for (const url of remoteUrls) {\n const parsed = parseGitHubRemote(url, config.github.baseUrl);\n if (parsed) {\n githubContext = parsed;\n break;\n }\n }\n\n return { root, branch, project, repo, ado: adoContext, github: githubContext };\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n BitbucketPR,\n BitbucketUser,\n BitbucketComment,\n BitbucketPageResponse,\n BitbucketBuildStatus,\n BitbucketRepo\n} from '../../types/bitbucket.js';\n\nconst API = '/rest/api/1.0';\n\nexport interface ListPRsOpts {\n project: string;\n repo: string;\n state?: string;\n author?: string;\n reviewer?: string;\n}\n\nexport interface CreatePROpts {\n project: string;\n repo: string;\n title: string;\n source: string;\n target: string;\n description?: string;\n reviewers?: string[];\n}\n\nexport interface UpdatePROpts {\n project: string;\n repo: string;\n id: number;\n title?: string;\n description?: string;\n reviewers?: string[];\n version: number;\n}\n\nexport interface MergePROpts {\n project: string;\n repo: string;\n id: number;\n version: number;\n strategy?: 'merge' | 'squash' | 'ff';\n deleteBranch?: boolean;\n}\n\nexport interface InlineCommentOpts {\n project: string;\n repo: string;\n prId: number;\n text: string;\n filePath: string;\n line: number;\n lineType?: 'ADDED' | 'REMOVED' | 'CONTEXT';\n}\n\nexport interface CreateRepoOpts {\n project: string;\n name: string;\n description?: string;\n}\n\nexport class BitbucketClient {\n constructor(private http: HttpClient) {}\n\n async listPRs(opts: ListPRsOpts): Promise<BitbucketPR[]> {\n return this.http.paginate<BitbucketPR>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<BitbucketPR>>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n params: {\n state: opts.state ?? 'OPEN',\n ...(opts.author ? { 'author.username': opts.author } : {}),\n start,\n limit\n }\n }\n )\n );\n }\n\n async getPR(project: string, repo: string, id: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}`\n );\n }\n\n async createPR(opts: CreatePROpts): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n description: opts.description,\n fromRef: {\n id: `refs/heads/${opts.source}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n toRef: {\n id: `refs/heads/${opts.target}`,\n repository: {\n slug: opts.repo,\n project: { key: opts.project }\n }\n },\n reviewers: (opts.reviewers ?? []).map(slug => ({ user: { slug } }))\n }\n }\n );\n }\n\n async updatePR(opts: UpdatePROpts): Promise<BitbucketPR> {\n const body: Record<string, unknown> = { version: opts.version };\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (opts.reviewers) body.reviewers = opts.reviewers.map(slug => ({ user: { slug } }));\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}`,\n { method: 'PUT', body }\n );\n }\n\n async mergePR(opts: MergePROpts): Promise<BitbucketPR> {\n const params: Record<string, string | number | boolean | undefined> = {\n version: opts.version\n };\n const body: Record<string, unknown> = {};\n if (opts.strategy) body.strategyId = opts.strategy;\n if (opts.deleteBranch) body.autoSubject = true;\n\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.id}/merge`,\n { method: 'POST', params, body }\n );\n }\n\n async declinePR(project: string, repo: string, id: number, version: number): Promise<BitbucketPR> {\n return this.http.bitbucket<BitbucketPR>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${id}/decline`,\n { method: 'POST', params: { version } }\n );\n }\n\n async listComments(\n project: string,\n repo: string,\n prId: number,\n opts: { withReplies?: boolean; inlineOnly?: boolean; generalOnly?: boolean } = {}\n ): Promise<BitbucketComment[]> {\n const { withReplies = true, inlineOnly = false, generalOnly = false } = opts;\n\n interface Activity { action: string; comment?: BitbucketComment }\n const activities = await this.http.paginate<Activity>((start, limit) =>\n this.http.bitbucket<BitbucketPageResponse<Activity>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/activities`,\n { params: { start, limit } }\n )\n );\n\n const topLevel = activities\n .filter(a => a.action === 'COMMENTED' && a.comment)\n .map(a => a.comment!);\n\n if (!withReplies) {\n return topLevel\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor);\n }\n\n // Recursively flatten nested replies, tagging each with its parentId\n function flatten(comment: BitbucketComment, parentId?: number): BitbucketComment[] {\n const node: BitbucketComment = {\n ...comment,\n comments: undefined,\n ...(parentId !== undefined ? { parentId } : {})\n };\n const replies = (comment.comments ?? []).flatMap(c => flatten(c, comment.id));\n return [node, ...replies];\n }\n\n const flat = topLevel.flatMap(c => flatten(c));\n return flat\n .filter(c => !inlineOnly || !!c.anchor)\n .filter(c => !generalOnly || !c.anchor)\n .sort((a, b) => a.createdDate - b.createdDate);\n }\n\n async addComment(project: string, repo: string, prId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text } }\n );\n }\n\n async addInlineComment(opts: InlineCommentOpts): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${opts.project}/repos/${opts.repo}/pull-requests/${opts.prId}/comments`,\n {\n method: 'POST',\n body: {\n text: opts.text,\n anchor: {\n line: opts.line,\n lineType: opts.lineType ?? 'ADDED',\n fileType: 'TO',\n path: opts.filePath\n }\n }\n }\n );\n }\n\n async replyComment(project: string, repo: string, prId: number, commentId: number, text: string): Promise<BitbucketComment> {\n return this.http.bitbucket<BitbucketComment>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments`,\n { method: 'POST', body: { text, parent: { id: commentId } } }\n );\n }\n\n async resolveComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}/resolve`,\n { method: 'PUT', params: { version } }\n );\n }\n\n async deleteComment(project: string, repo: string, prId: number, commentId: number, version: number): Promise<void> {\n await this.http.bitbucket<void>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/comments/${commentId}`,\n { method: 'DELETE', params: { version } }\n );\n }\n\n async getDiff(project: string, repo: string, prId: number, file?: string, contextLines?: number): Promise<string> {\n const params: Record<string, string | number | boolean | undefined> = {};\n if (contextLines !== undefined) params.contextLines = contextLines;\n\n // Bitbucket Server scopes the diff to a specific file via a URL path segment,\n // not a query parameter: /diff/{filepath}\n const diffPath = file\n ? `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/diff/${file}`\n : `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/diff`;\n\n const result = await this.http.bitbucket<{ diffs?: unknown[] } | string>(\n diffPath,\n { params }\n );\n // Return raw diff as string\n return typeof result === 'string' ? result : JSON.stringify(result);\n }\n\n async listFiles(project: string, repo: string, prId: number): Promise<string[]> {\n const result = await this.http.bitbucket<{ values?: Array<{ path: { toString: string } }> }>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/changes`,\n { params: { limit: 1000 } }\n );\n return (result.values ?? []).map(v => (typeof v.path === 'string' ? v.path : JSON.stringify(v.path)));\n }\n\n async getCurrentUser(): Promise<BitbucketUser> {\n // GET /rest/api/1.0/application-properties is a lightweight endpoint present on all\n // Bitbucket Server versions. Every authenticated REST response sets X-AUSERNAME to\n // the caller's username, which is more reliable than GET /plugins/servlet/applinks/whoami\n // — that endpoint returns an empty body for PAT/Bearer-token requests on some instances\n // (e.g. Bitbucket Server v9.4.16), causing a mis-resolved user lookup.\n const { headers } = await this.http.bitbucketRaw<{ version?: string }>(\n `${API}/application-properties`\n );\n const username = headers.get('x-ausername');\n if (!username) {\n throw new PncliError(\n 'Could not determine current Bitbucket user: X-AUSERNAME header was absent from the server response',\n 1,\n `${API}/application-properties`\n );\n }\n return this.http.bitbucket<BitbucketUser>(`${API}/users/${encodeURIComponent(username)}`);\n }\n\n async approvePR(project: string, repo: string, prId: number): Promise<unknown> {\n // POST /approve is the dedicated endpoint — no user slug required, and Bitbucket\n // Server auto-promotes the caller to reviewer if they aren't one already.\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/approve`,\n { method: 'POST' }\n );\n }\n\n async unapprovePR(project: string, repo: string, prId: number): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/approve`,\n { method: 'DELETE' }\n );\n }\n\n async needsWorkPR(project: string, repo: string, prId: number): Promise<unknown> {\n // Bitbucket Server only allows reviewers to set NEEDS_WORK — unlike APPROVED, which\n // auto-promotes the caller to reviewer, NEEDS_WORK returns 403 for non-reviewers.\n // Resolve the current user and the PR in parallel, auto-add the user as a reviewer\n // if they aren't already, then mark needs-work using the resolved slug.\n const [currentUser, pr] = await Promise.all([\n this.getCurrentUser(),\n this.getPR(project, repo, prId),\n ]);\n\n const isReviewer = pr.reviewers.some(r => r.user.slug === currentUser.slug);\n if (!isReviewer) {\n await this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants`,\n { method: 'POST', body: { user: { name: currentUser.name }, role: 'REVIEWER' } }\n );\n }\n\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants/${currentUser.slug}`,\n { method: 'PUT', body: { status: 'NEEDS_WORK' } }\n );\n }\n\n async listReviewers(project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(project, repo, prId);\n return pr.reviewers;\n }\n\n async addReviewer(project: string, repo: string, prId: number, username: string): Promise<unknown> {\n return this.http.bitbucket<unknown>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/participants`,\n { method: 'POST', body: { user: { name: username }, role: 'REVIEWER' } }\n );\n }\n\n async listBuilds(project: string, repo: string, prId: number): Promise<BitbucketBuildStatus[]> {\n // Get the latest commit on the source branch\n const commits = await this.http.bitbucket<BitbucketPageResponse<{ id: string }>>(\n `${API}/projects/${project}/repos/${repo}/pull-requests/${prId}/commits`,\n { params: { limit: 1 } }\n );\n const sha = commits.values[0]?.id;\n if (!sha) return [];\n return this.getBuildStatus(sha);\n }\n\n async getBuildStatus(commit: string): Promise<BitbucketBuildStatus[]> {\n const result = await this.http.bitbucket<BitbucketPageResponse<BitbucketBuildStatus>>(\n `/rest/build-status/1.0/commits/${commit}`\n );\n return result.values ?? [];\n }\n\n async createRepo(opts: CreateRepoOpts): Promise<BitbucketRepo> {\n return this.http.bitbucket<BitbucketRepo>(\n `${API}/projects/${opts.project}/repos`,\n {\n method: 'POST',\n body: {\n name: opts.name,\n scmId: 'git',\n ...(opts.description !== undefined ? { description: opts.description } : {})\n }\n }\n );\n }\n}\n","import { Command } from 'commander';\nimport { getStatus, getDiff, getLog, getBranches, getBranchReport, formatBranchReportCsv } from './client.js';\nimport { getRepoRoot, getCurrentBranch } from '../../lib/git-context.js';\nimport { success, fail, writeRawOutput } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { BitbucketClient } from '../bitbucket/client.js';\nimport { getGitContext } from '../../lib/git-context.js';\n\nfunction requireRepoRoot(): string {\n const root = getRepoRoot();\n if (!root) throw new PncliError('Not a git repository', 1);\n return root;\n}\n\nexport function registerGitCommands(program: Command): void {\n const git = program.command('git').description('Local git operations');\n\n git\n .command('status')\n .description('Show staged, unstaged, and untracked files as JSON')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getStatus(root);\n success(data, 'git', 'status', start);\n } catch (err) {\n fail(err, 'git', 'status', start);\n }\n });\n\n git\n .command('diff')\n .description('Show diff as structured JSON')\n .option('--staged', 'Show staged changes only')\n .option('--file <path>', 'Limit diff to a specific file')\n .action((opts: { staged?: boolean; file?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getDiff(root, { staged: opts.staged, file: opts.file });\n success(data, 'git', 'diff', start);\n } catch (err) {\n fail(err, 'git', 'diff', start);\n }\n });\n\n git\n .command('log')\n .description('Show recent commits as JSON')\n .option('--count <n>', 'Number of commits to show', '10')\n .option('--since <date>', 'Show commits since date (e.g. \"2 weeks ago\")')\n .action((opts: { count?: string; since?: string }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const count = opts.count ? parseInt(opts.count, 10) : undefined;\n const data = getLog(root, { count, since: opts.since });\n success(data, 'git', 'log', start);\n } catch (err) {\n fail(err, 'git', 'log', start);\n }\n });\n\n git\n .command('branch')\n .description('Show current branch and all local/remote branches')\n .action(() => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const data = getBranches(root);\n success(data, 'git', 'branch', start);\n } catch (err) {\n fail(err, 'git', 'branch', start);\n }\n });\n\n git\n .command('report')\n .description('Report lines of code and commit counts for a branch, optionally filtered by date')\n .option('--branch <name>', 'Branch to report on (defaults to current branch)')\n .option('--base <ref>', 'Base ref to compare against, e.g. \"main\" (base..branch, or base..HEAD if --branch is omitted)')\n .option('--since <date>', 'Include commits on or after this date (e.g. \"2024-01-01\")')\n .option('--until <date>', 'Include commits on or before this date (e.g. \"2024-12-31\")')\n .option('--csv', 'Output as CSV instead of JSON')\n .action((opts: { branch?: string; base?: string; since?: string; until?: string; csv?: boolean }) => {\n const start = Date.now();\n try {\n const root = requireRepoRoot();\n const report = getBranchReport(root, {\n branch: opts.branch,\n base: opts.base,\n since: opts.since,\n until: opts.until\n });\n if (opts.csv) {\n writeRawOutput(formatBranchReportCsv(report));\n } else {\n success(report, 'git', 'report', start);\n }\n } catch (err) {\n fail(err, 'git', 'report', start);\n }\n });\n\n git\n .command('current-pr')\n .description('Find the open PR for the current branch')\n .action(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n\n if (!config.bitbucket.baseUrl || !config.bitbucket.pat) {\n success(\n { message: 'Requires Bitbucket config. Available after pncli config init.' },\n 'git',\n 'current-pr',\n start\n );\n return;\n }\n\n const root = requireRepoRoot();\n const branch = getCurrentBranch(root);\n if (!branch) throw new PncliError('Could not determine current branch', 1);\n\n const ctx = getGitContext(config);\n const project = ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo = ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n if (!project || !repo) throw new PncliError('Could not determine Bitbucket project/repo', 1);\n\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const prs = await client.listPRs({ project, repo, state: 'OPEN' });\n const match = prs.find(pr => pr.fromRef.displayId === branch) ?? null;\n success(match, 'git', 'current-pr', start);\n } catch (err) {\n fail(err, 'git', 'current-pr', start);\n }\n });\n}\n","import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'fs';\nimport path from 'path';\nimport { Command } from 'commander';\nimport { JiraClient } from './client.js';\nimport { buildFieldMap, translateJql, translateFieldsInOutput, formatFieldValue } from './custom-fields.js';\nimport { JIRA_INPUT_FILE_SCHEMA, JIRA_INPUT_FILE_EXAMPLE } from './input-schema.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail, warn, writeRawOutput } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { readJsonInputFile, resolveAtFileRef, mergeWithOverrides, resolveTextInput } from '../../lib/input.js';\nimport type { CustomFieldMap } from '../../types/jira.js';\n\n/** Shape of the JSON accepted by --input-file on create-issue / update-issue. */\ninterface IssueJsonInput {\n project?: string;\n issueType?: string;\n fields?: Record<string, unknown>;\n}\n\nconst BUILTIN_ISSUE_FIELDS = new Set(['summary', 'description', 'priority', 'assignee', 'labels', 'parent']);\n\n/**\n * Splits a --input-file `fields` dictionary into Jira's built-in issue fields\n * (summary, description, priority, assignee, labels, parent) and custom fields.\n * Custom field keys resolve through fieldMap by friendly name or already-registered id;\n * an unregistered key containing no whitespace is treated as a raw Jira field id (e.g.\n * customfield_10032) and passed through untouched, so pncli stays decoupled from any\n * org's custom fields — nothing needs to be pre-registered in config to be usable here.\n * Resolves `@file` value references (see resolveAtFileRef) on every value.\n */\nexport function splitFieldsDictionary(\n fields: Record<string, unknown>,\n fieldMap: CustomFieldMap\n): { builtin: Record<string, unknown>; custom: Record<string, unknown> } {\n const builtin: Record<string, unknown> = {};\n const custom: Record<string, unknown> = {};\n for (const [rawKey, rawValue] of Object.entries(fields)) {\n const value = resolveAtFileRef(rawValue);\n const key = rawKey.toLowerCase();\n if (BUILTIN_ISSUE_FIELDS.has(key)) {\n builtin[key] = value;\n continue;\n }\n const def = fieldMap.byName.get(key) ?? fieldMap.byId.get(rawKey);\n if (def) {\n custom[def.id] = value;\n } else if (!/\\s/.test(rawKey)) {\n custom[rawKey] = value;\n } else {\n throw new PncliError(\n `Unknown custom field: \"${rawKey}\". Fields must be registered in config by friendly name or ID. Run: pncli jira fields`,\n 1\n );\n }\n }\n return { builtin, custom };\n}\n\n/** Normalizes a builtin `labels` value from either an --input-file array or a comma-separated flag string. */\nfunction normalizeLabels(value: unknown): string[] | undefined {\n if (value === undefined) return undefined;\n if (Array.isArray(value)) return value.map(v => String(v).trim());\n return String(value).split(',').map(s => s.trim()).filter(Boolean);\n}\n\nfunction getClient(program: Command): JiraClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JiraClient(http);\n}\n\nfunction getClientAndFields(program: Command): { client: JiraClient; fieldMap: CustomFieldMap; customFields: import('../../types/jira.js').CustomFieldDefinition[] } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.jira.baseUrl) throw new PncliError('Jira not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new JiraClient(http);\n const customFields = config.jira.customFields;\n const fieldMap = buildFieldMap(customFields);\n return { client, fieldMap, customFields };\n}\n\nfunction getDefaults(program: Command): { project?: string; issueType?: string; priority?: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n return {\n project: config.defaults.jira?.project,\n issueType: config.defaults.jira?.issueType,\n priority: config.defaults.jira?.priority\n };\n}\n\n/**\n * Resolves the JQL for `jira search` from --jql or --jql-file (see resolveTextInput\n * for the shared inline/file/stdin contract). Trimmed because a --jql-file almost\n * always ends in a newline and Jira rejects the trailing whitespace.\n */\nexport function resolveJqlInput(jql: string | undefined, jqlFile: string | undefined): string {\n const raw = resolveTextInput(jql, jqlFile, 'jql');\n if (raw === undefined) throw new PncliError('Must specify --jql or --jql-file', 1);\n const trimmed = raw.trim();\n // Reported separately from the missing case: telling someone who did pass\n // --jql-file to \"specify --jql or --jql-file\" would be a lie.\n if (!trimmed) throw new PncliError('JQL query is empty', 1);\n return trimmed;\n}\n\nexport function registerJiraCommands(program: Command): void {\n const jira = program.command('jira').description('Jira Data Cloud operations');\n\n jira.command('get-issue')\n .description('Get a Jira issue by key')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap } = getClientAndFields(program);\n const data = await client.getIssue(opts.key);\n const translated = { ...data, fields: translateFieldsInOutput(data.fields as Record<string, unknown>, fieldMap) };\n success(translated, 'jira', 'get-issue', start);\n } catch (err) { fail(err, 'jira', 'get-issue', start); }\n });\n\n jira.command('create-issue')\n .description('Create a Jira issue')\n .option('--project <key>', 'Project key')\n .option('--type <type>', 'Issue type (Bug, Story, Task, ...)')\n .option('--summary <text>', 'Issue summary (required, unless supplied via --input-file)')\n .option('--description <text>', 'Issue description')\n .option('--priority <name>', 'Priority name')\n .option('--assignee <accountId>', 'Assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--parent <key>', 'Parent issue key — sets fields.parent in the create payload')\n .option('--field <Name=value>', 'Custom field value; use Name=@file.json to read value from file (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .option('--fields-file <path>', 'Path to a JSON file mapping field names/IDs to their Jira API values')\n .option('--input-file <path>', \"JSON file describing the whole issue ({ project, issueType, fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli jira schema\")\n .action(async (opts: { project?: string; type?: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; parent?: string; field: string[]; fieldsFile?: string; inputFile?: string }) => {\n const start = Date.now();\n let fieldMap = buildFieldMap([]);\n try {\n const resolved = getClientAndFields(program);\n const client = resolved.client;\n fieldMap = resolved.fieldMap;\n const defaults = getDefaults(program);\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as IssueJsonInput) : undefined;\n const { builtin: jsonBuiltin, custom: jsonCustom } = jsonInput?.fields\n ? splitFieldsDictionary(jsonInput.fields, fieldMap)\n : { builtin: {}, custom: {} };\n\n const project = opts.project ?? jsonInput?.project ?? defaults.project;\n const issueType = opts.type ?? jsonInput?.issueType ?? defaults.issueType ?? 'Task';\n if (!project) throw new PncliError('--project required (or set defaults.jira.project in config, or \"project\" in --input-file)', 1);\n\n const flagBuiltin: Record<string, unknown> = {\n ...(opts.summary !== undefined ? { summary: opts.summary } : {}),\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.priority !== undefined ? { priority: opts.priority } : {}),\n ...(opts.assignee !== undefined ? { assignee: opts.assignee } : {}),\n ...(opts.labels !== undefined ? { labels: opts.labels } : {}),\n ...(opts.parent !== undefined ? { parent: opts.parent } : {})\n };\n const { merged: builtinFields, overrides: builtinOverrides } = mergeWithOverrides(jsonBuiltin, flagBuiltin);\n\n const summary = builtinFields.summary as string | undefined;\n if (!summary) throw new PncliError('Must specify --summary or \"fields.summary\" in --input-file', 1);\n const priority = (builtinFields.priority as string | undefined) ?? defaults.priority;\n\n const fileFields = opts.fieldsFile ? parseFieldsFile(opts.fieldsFile, fieldMap) : {};\n const flagCustom = { ...fileFields, ...parseFieldArgs(opts.field, fieldMap) };\n const { merged: customFieldValues, overrides: customOverrides } = mergeWithOverrides(jsonCustom, flagCustom);\n\n const overrides = [...builtinOverrides, ...customOverrides];\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n const data = await client.createIssue({\n project,\n issueType,\n summary,\n description: builtinFields.description as string | undefined,\n priority,\n assignee: builtinFields.assignee as string | undefined,\n labels: normalizeLabels(builtinFields.labels),\n parent: builtinFields.parent as string | undefined,\n customFieldValues\n });\n success(data, 'jira', 'create-issue', start, overrides);\n } catch (err) { fail(translateFieldErrors(err, fieldMap), 'jira', 'create-issue', start); }\n });\n\n jira.command('update-issue')\n .description('Update a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .option('--summary <text>', 'New summary')\n .option('--description <text>', 'New description')\n .option('--priority <name>', 'New priority')\n .option('--assignee <accountId>', 'New assignee account ID')\n .option('--labels <labels>', 'Comma-separated labels')\n .option('--field <Name=value>', 'Custom field value; use Name=@file.json to read value from file (repeatable)', (val: string, acc: string[]) => [...acc, val], [] as string[])\n .option('--fields-file <path>', 'Path to a JSON file mapping field names/IDs to their Jira API values')\n .option('--input-file <path>', \"JSON file describing fields to update ({ fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli jira schema\")\n .action(async (opts: { key: string; summary?: string; description?: string; priority?: string; assignee?: string; labels?: string; field: string[]; fieldsFile?: string; inputFile?: string }) => {\n const start = Date.now();\n let fieldMap = buildFieldMap([]);\n try {\n const resolved = getClientAndFields(program);\n const client = resolved.client;\n fieldMap = resolved.fieldMap;\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as IssueJsonInput) : undefined;\n const { builtin: jsonBuiltin, custom: jsonCustom } = jsonInput?.fields\n ? splitFieldsDictionary(jsonInput.fields, fieldMap)\n : { builtin: {}, custom: {} };\n\n const flagBuiltin: Record<string, unknown> = {\n ...(opts.summary !== undefined ? { summary: opts.summary } : {}),\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.priority !== undefined ? { priority: opts.priority } : {}),\n ...(opts.assignee !== undefined ? { assignee: opts.assignee } : {}),\n ...(opts.labels !== undefined ? { labels: opts.labels } : {})\n };\n const { merged: builtinFields, overrides: builtinOverrides } = mergeWithOverrides(jsonBuiltin, flagBuiltin);\n\n const fileFields = opts.fieldsFile ? parseFieldsFile(opts.fieldsFile, fieldMap) : {};\n const flagCustom = { ...fileFields, ...parseFieldArgs(opts.field, fieldMap) };\n const { merged: customFieldValues, overrides: customOverrides } = mergeWithOverrides(jsonCustom, flagCustom);\n\n const overrides = [...builtinOverrides, ...customOverrides];\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n await client.updateIssue(opts.key, {\n summary: builtinFields.summary as string | undefined,\n description: builtinFields.description as string | undefined,\n priority: builtinFields.priority as string | undefined,\n assignee: builtinFields.assignee as string | undefined,\n labels: normalizeLabels(builtinFields.labels),\n customFieldValues\n });\n success({ updated: opts.key }, 'jira', 'update-issue', start, overrides);\n } catch (err) { fail(translateFieldErrors(err, fieldMap), 'jira', 'update-issue', start); }\n });\n\n jira.command('schema')\n .description('Print the --input-file JSON schema and an example for create-issue/update-issue')\n .option('--example-only', \"Print only the runnable example JSON (no envelope) — pipeable straight into --input-file\")\n .action((opts: { exampleOnly?: boolean }) => {\n const start = Date.now();\n if (opts.exampleOnly) {\n // Bypass the success() envelope: this output is meant to be redirected straight\n // into a file and passed to --input-file, so it must be the raw JSON, not {ok,data,meta}.\n writeRawOutput(JSON.stringify(JIRA_INPUT_FILE_EXAMPLE, null, 2) + '\\n');\n return;\n }\n success({ schema: JIRA_INPUT_FILE_SCHEMA, example: JIRA_INPUT_FILE_EXAMPLE }, 'jira', 'schema', start);\n });\n\n jira.command('transition-issue')\n .description('Transition a Jira issue to a new status')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--transition <name-or-id>', 'Transition name or ID')\n .action(async (opts: { key: string; transition: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n // Resolve transition name to ID if needed\n let transitionId = opts.transition;\n if (isNaN(parseInt(opts.transition, 10))) {\n const transitions = await client.listTransitions(opts.key);\n const found = transitions.find(t => t.name.toLowerCase() === opts.transition.toLowerCase());\n if (!found) throw new PncliError(`Transition not found: ${opts.transition}`, 1);\n transitionId = found.id;\n }\n await client.transitionIssue(opts.key, transitionId);\n success({ transitioned: opts.key, transition: opts.transition }, 'jira', 'transition-issue', start);\n } catch (err) { fail(err, 'jira', 'transition-issue', start); }\n });\n\n jira.command('list-transitions')\n .description('List available transitions for an issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listTransitions(opts.key);\n success(data, 'jira', 'list-transitions', start);\n } catch (err) { fail(err, 'jira', 'list-transitions', start); }\n });\n\n jira.command('add-comment')\n .description('Add a comment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { key: string; body: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.key, opts.body);\n success(data, 'jira', 'add-comment', start);\n } catch (err) { fail(err, 'jira', 'add-comment', start); }\n });\n\n jira.command('list-comments')\n .description('List comments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.key);\n success(data, 'jira', 'list-comments', start);\n } catch (err) { fail(err, 'jira', 'list-comments', start); }\n });\n\n jira.command('search')\n .description('Search Jira issues with JQL (consider --output-file for large results)')\n .option('--jql <query>', 'JQL query string')\n .option('--jql-file <path>', \"Path to a file containing the JQL query ('-' = stdin)\")\n .option('--max-results <n>', 'Maximum number of results')\n .action(async (opts: { jql?: string; jqlFile?: string; maxResults?: string }) => {\n const start = Date.now();\n try {\n const { client, fieldMap, customFields } = getClientAndFields(program);\n const jql = resolveJqlInput(opts.jql, opts.jqlFile);\n const maxResults = opts.maxResults ? parseInt(opts.maxResults, 10) : undefined;\n const translatedJql = translateJql(jql, fieldMap);\n const data = await client.search(translatedJql, maxResults, customFields);\n const translatedIssues = data.issues.map(issue => ({\n ...issue,\n fields: translateFieldsInOutput(issue.fields as Record<string, unknown>, fieldMap)\n }));\n success({ ...data, issues: translatedIssues }, 'jira', 'search', start);\n } catch (err) { fail(err, 'jira', 'search', start); }\n });\n\n jira.command('add-label')\n .description('Add one or more labels to a Jira issue (non-destructive)')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--labels <labels>', 'Comma-separated labels to add')\n .action(async (opts: { key: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n await client.addLabels(opts.key, labels);\n success({ updated: opts.key, labelsAdded: labels }, 'jira', 'add-label', start);\n } catch (err) { fail(err, 'jira', 'add-label', start); }\n });\n\n jira.command('remove-label')\n .description('Remove one or more labels from a Jira issue (non-destructive)')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--labels <labels>', 'Comma-separated labels to remove')\n .action(async (opts: { key: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n await client.removeLabels(opts.key, labels);\n success({ updated: opts.key, labelsRemoved: labels }, 'jira', 'remove-label', start);\n } catch (err) { fail(err, 'jira', 'remove-label', start); }\n });\n\n jira.command('assign')\n .description('Assign a Jira issue to a user')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--assignee <accountId>', 'Assignee account ID')\n .action(async (opts: { key: string; assignee: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.assignIssue(opts.key, opts.assignee);\n success({ assigned: opts.key, assignee: opts.assignee }, 'jira', 'assign', start);\n } catch (err) { fail(err, 'jira', 'assign', start); }\n });\n\n jira.command('link-issue')\n .description('Link two Jira issues together')\n .requiredOption('--key <issue-key>', 'Source issue key')\n .requiredOption('--link-type <type>', 'Link type name or ID')\n .requiredOption('--target <issue-key>', 'Target issue key')\n .action(async (opts: { key: string; linkType: string; target: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.linkIssue({ key: opts.key, linkType: opts.linkType, target: opts.target });\n success({ linked: opts.key, to: opts.target, type: opts.linkType }, 'jira', 'link-issue', start);\n } catch (err) { fail(err, 'jira', 'link-issue', start); }\n });\n\n jira.command('add-attachment')\n .description('Upload a file as an attachment to a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .requiredOption('--file <path>', 'Path to the file to upload')\n .action(async (opts: { key: string; file: string }) => {\n const start = Date.now();\n try {\n if (!existsSync(opts.file)) throw new PncliError(`File not found: ${opts.file}`, 1);\n const client = getClient(program);\n const data = await client.uploadAttachment(opts.key, opts.file);\n success(data, 'jira', 'add-attachment', start);\n } catch (err) { fail(err, 'jira', 'add-attachment', start); }\n });\n\n jira.command('list-attachments')\n .description('List attachments on a Jira issue')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listAttachments(opts.key);\n success(data, 'jira', 'list-attachments', start);\n } catch (err) { fail(err, 'jira', 'list-attachments', start); }\n });\n\n jira.command('download-attachment')\n .description('Download a Jira issue attachment to .pncli/ (or --dir)')\n .requiredOption('--key <issue-key>', 'Issue key (e.g. PROJ-123)')\n .requiredOption('--attachment-id <id>', 'Attachment ID from list-attachments output')\n .option('--dir <path>', 'Output directory (default: .pncli relative to cwd)')\n .action(async (opts: { key: string; attachmentId: string; dir?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const attachments = await client.listAttachments(opts.key);\n const attachment = attachments.find(a => a.id === opts.attachmentId);\n if (!attachment) throw new PncliError(`Attachment not found: ${opts.attachmentId}`, 1);\n const outDir = opts.dir ?? path.join(process.cwd(), '.pncli');\n mkdirSync(outDir, { recursive: true });\n const outPath = path.join(outDir, path.basename(attachment.filename));\n const buffer = await client.downloadAttachment(attachment.content);\n writeFileSync(outPath, buffer);\n success({ saved: outPath, filename: attachment.filename, size: buffer.length }, 'jira', 'download-attachment', start);\n } catch (err) { fail(err, 'jira', 'download-attachment', start); }\n });\n\n jira.command('fields')\n .description('List custom fields (configured or discovered from Jira API) (consider --output-file for large results)')\n .option('--discover', 'Fetch field metadata from Jira API')\n .option('--custom-only', 'Show only custom fields (requires --discover)')\n .option('--project <key>', 'Project key — fetches allowedValues for select fields via createmeta (requires --discover)')\n .option('--issue-type <type>', 'Filter allowedValues to a specific issue type (requires --project)')\n .action(async (opts: { discover?: boolean; customOnly?: boolean; project?: string; issueType?: string }) => {\n const start = Date.now();\n try {\n if (opts.discover) {\n const client = getClient(program);\n const fields = opts.project\n ? await client.fetchFieldsWithAllowedValues(opts.project, opts.issueType)\n : await client.fetchFields();\n const result = opts.customOnly ? fields.filter(f => f.custom) : fields;\n success(result, 'jira', 'fields', start);\n } else {\n const { customFields } = getClientAndFields(program);\n success(customFields, 'jira', 'fields', start);\n }\n } catch (err) { fail(err, 'jira', 'fields', start); }\n });\n\n jira.command('list-boards')\n .description('List Agile boards for a project')\n .requiredOption('--project <key>', 'Project key')\n .action(async (opts: { project: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBoards(opts.project);\n success(data, 'jira', 'list-boards', start);\n } catch (err) { fail(err, 'jira', 'list-boards', start); }\n });\n\n jira.command('list-sprints')\n .description('List sprints for a board or project, including start/end dates')\n .option('--board <id>', 'Board ID')\n .option('--project <key>', 'Project key — resolves to that project\\'s board(s)')\n .option('--state <states>', 'Comma-separated states to filter (active,future,closed)')\n .action(async (opts: { board?: string; project?: string; state?: string }) => {\n const start = Date.now();\n try {\n if (!opts.board && !opts.project) throw new PncliError('Either --board or --project is required', 1);\n const client = getClient(program);\n const states = opts.state ? opts.state.split(',').map(s => s.trim()) : undefined;\n const data = opts.board\n ? await client.listSprintsForBoard(parseInt(opts.board, 10), states)\n : await client.listSprintsForProject(opts.project as string, states);\n success(data, 'jira', 'list-sprints', start);\n } catch (err) { fail(err, 'jira', 'list-sprints', start); }\n });\n\n jira.command('set-sprint')\n .description('Move a Jira issue into a sprint')\n .requiredOption('--key <issue-key>', 'Issue key')\n .requiredOption('--sprint <id>', 'Sprint ID (from list-sprints)')\n .action(async (opts: { key: string; sprint: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.setSprint(parseInt(opts.sprint, 10), [opts.key]);\n success({ updated: opts.key, sprint: opts.sprint }, 'jira', 'set-sprint', start);\n } catch (err) { fail(err, 'jira', 'set-sprint', start); }\n });\n}\n\nexport function parseFieldArgs(\n fieldArgs: string[],\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const arg of fieldArgs) {\n const eq = arg.indexOf('=');\n if (eq === -1) throw new PncliError(`Invalid --field format (expected Name=value): ${arg}`, 1);\n const name = arg.slice(0, eq).trim();\n const value = arg.slice(eq + 1);\n const def = fieldMap.byName.get(name.toLowerCase()) ?? fieldMap.byId.get(name);\n if (!def) throw new PncliError(\n `Unknown custom field: \"${name}\". Fields must be registered in config by friendly name or ID. Run: pncli jira fields`,\n 1\n );\n if (value.startsWith('@')) {\n const filePath = value.slice(1);\n let raw: string;\n try {\n raw = readFileSync(filePath, 'utf8').trim();\n } catch (e) {\n throw new PncliError(`Cannot read file \"${filePath}\": ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n try {\n result[def.id] = JSON.parse(raw);\n } catch {\n result[def.id] = raw;\n }\n } else {\n result[def.id] = formatFieldValue(value, def.type);\n }\n }\n return result;\n}\n\nexport function parseFieldsFile(filePath: string, fieldMap: CustomFieldMap): Record<string, unknown> {\n let raw: string;\n try {\n raw = readFileSync(filePath, 'utf8');\n } catch (e) {\n throw new PncliError(`Cannot read fields file \"${filePath}\": ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new PncliError(`Fields file \"${filePath}\" must be a valid JSON object`, 1);\n }\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new PncliError(`Fields file \"${filePath}\" must be a JSON object`, 1);\n }\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(data as Record<string, unknown>)) {\n const def = fieldMap.byName.get(key.toLowerCase()) ?? fieldMap.byId.get(key);\n if (!def) throw new PncliError(\n `Unknown field in \"${filePath}\": \"${key}\". Fields must be registered in config by friendly name or ID. Run: pncli jira fields`,\n 1\n );\n result[def.id] = val;\n }\n return result;\n}\n\n/**\n * Translate customfield_XXXXX IDs in a Jira error message to their friendly names.\n * Returns the original error unchanged if no translation is possible.\n */\nfunction translateFieldErrors(err: unknown, fieldMap: CustomFieldMap): unknown {\n if (!(err instanceof PncliError) || fieldMap.byId.size === 0) return err;\n const translated = err.message.replace(/\\bcustomfield_\\d+\\b/g, (id) => {\n const def = fieldMap.byId.get(id);\n return def ? `${def.name} (${id})` : id;\n });\n if (translated === err.message) return err;\n return new PncliError(translated, err.status, err.url);\n}\n","import { readFileSync } from 'fs';\nimport { basename } from 'path';\nimport type { HttpClient } from '../../lib/http.js';\nimport { guessMimeType } from '../../lib/mime.js';\nimport type {\n JiraIssue,\n JiraTransition,\n JiraComment,\n JiraSearchResult,\n JiraFieldInfo,\n JiraAttachment,\n JiraBoard,\n JiraSprint,\n CustomFieldDefinition,\n CustomFieldType\n} from '../../types/jira.js';\n\nconst API = '/rest/api/2';\nconst AGILE_API = '/rest/agile/1.0';\n\nexport interface CreateIssueOpts {\n project: string;\n issueType: string;\n summary: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n parent?: string;\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface UpdateIssueOpts {\n summary?: string;\n description?: string;\n priority?: string;\n assignee?: string;\n labels?: string[];\n customFieldValues?: Record<string, unknown>;\n}\n\nexport interface LinkIssueOpts {\n key: string;\n linkType: string;\n target: string;\n}\n\nexport class JiraClient {\n constructor(private http: HttpClient) {}\n\n async getIssue(key: string): Promise<JiraIssue> {\n return this.http.jira<JiraIssue>(`${API}/issue/${key}`);\n }\n\n async createIssue(opts: CreateIssueOpts): Promise<JiraIssue> {\n const body: Record<string, unknown> = {\n fields: {\n project: { key: opts.project },\n issuetype: { name: opts.issueType },\n summary: opts.summary,\n ...(opts.description ? { description: opts.description } : {}),\n ...(opts.priority ? { priority: { name: opts.priority } } : {}),\n ...(opts.assignee ? { assignee: { name: opts.assignee } } : {}),\n ...(opts.labels?.length ? { labels: opts.labels } : {}),\n ...(opts.parent ? { parent: { key: opts.parent } } : {}),\n ...(opts.customFieldValues ?? {})\n }\n };\n\n const created = await this.http.jira<{ id: string; key: string }>(`${API}/issue`, {\n method: 'POST',\n body\n });\n\n return this.getIssue(created.key);\n }\n\n async updateIssue(key: string, opts: UpdateIssueOpts): Promise<void> {\n const fields: Record<string, unknown> = {};\n if (opts.summary) fields.summary = opts.summary;\n if (opts.description) fields.description = opts.description;\n if (opts.priority) fields.priority = { name: opts.priority };\n if (opts.assignee) fields.assignee = { name: opts.assignee };\n if (opts.labels?.length) fields.labels = opts.labels;\n Object.assign(fields, opts.customFieldValues ?? {});\n\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { fields }\n });\n }\n\n async listTransitions(key: string): Promise<JiraTransition[]> {\n const result = await this.http.jira<{ transitions: JiraTransition[] }>(\n `${API}/issue/${key}/transitions`\n );\n return result.transitions;\n }\n\n async transitionIssue(key: string, transitionId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/transitions`, {\n method: 'POST',\n body: { transition: { id: transitionId } }\n });\n }\n\n async addComment(key: string, text: string): Promise<JiraComment> {\n return this.http.jira<JiraComment>(`${API}/issue/${key}/comment`, {\n method: 'POST',\n body: { body: text }\n });\n }\n\n async listComments(key: string): Promise<JiraComment[]> {\n return this.http.jiraPaginate<JiraComment>(async (startAt, maxResults) => {\n const result = await this.http.jira<{ comments: JiraComment[]; total: number; startAt: number; maxResults: number }>(\n `${API}/issue/${key}/comment`,\n { params: { startAt, maxResults } }\n );\n return { ...result, values: result.comments };\n });\n }\n\n async search(jql: string, maxResults?: number, customFields?: CustomFieldDefinition[]): Promise<JiraSearchResult> {\n const standardFields = ['summary', 'status', 'priority', 'assignee', 'issuetype', 'project', 'created', 'updated', 'labels', 'reporter'];\n const fields = customFields?.length\n ? [...standardFields, ...customFields.map(f => f.id)]\n : standardFields;\n\n if (maxResults !== undefined) {\n return this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, maxResults, fields }\n });\n }\n\n // Paginate all results\n const allIssues = await this.http.jiraPaginate<JiraIssue>(async (startAt, max) => {\n const result = await this.http.jira<JiraSearchResult>(`${API}/search`, {\n method: 'POST',\n body: { jql, startAt, maxResults: max, fields }\n });\n return { ...result, values: result.issues };\n });\n\n return { issues: allIssues, total: allIssues.length, startAt: 0, maxResults: allIssues.length };\n }\n\n async fetchFields(): Promise<JiraFieldInfo[]> {\n const fields = await this.http.jira<JiraFieldInfo[]>(`${API}/field`);\n return fields.map(f => ({ ...f, pncliType: schemaToPncliType(f.schema) }));\n }\n\n async fetchFieldsWithAllowedValues(project: string, issueType?: string): Promise<JiraFieldInfo[]> {\n const fields = await this.fetchFields();\n\n type AllowedValue = { id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> };\n type CreateMetaField = { allowedValues?: AllowedValue[] };\n type CreateMetaResponse = {\n projects: Array<{\n issuetypes: Array<{\n name: string;\n fields: Record<string, CreateMetaField>;\n }>;\n }>;\n };\n\n let metaFields: Record<string, CreateMetaField> = {};\n try {\n const meta = await this.http.jira<CreateMetaResponse>(`${API}/issue/createmeta`, {\n params: { projectKeys: project, expand: 'projects.issuetypes.fields' }\n });\n metaFields = collectMetaFields(meta.projects, issueType);\n } catch {\n // createmeta returns 404 on some Jira Datacenter instances — try the paginated fallback\n try {\n metaFields = await this.fetchCreateMetaViaIssuetypes(project, issueType);\n } catch {\n // Both endpoints failed — return fields without allowedValues (pncliType still annotated)\n }\n }\n\n return fields.map(f => {\n const av = metaFields[f.id]?.allowedValues;\n return av?.length ? { ...f, allowedValues: av } : f;\n });\n }\n\n /**\n * Fallback for instances where the classic createmeta endpoint returns 404.\n * Uses the paginated endpoint available in Jira Datacenter 8.4+.\n */\n private async fetchCreateMetaViaIssuetypes(\n project: string,\n issueType?: string\n ): Promise<Record<string, { allowedValues?: Array<{ id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> }> }>> {\n type IssueTypeEntry = { id: string; name: string };\n const itList = await this.http.jira<{ values: IssueTypeEntry[] }>(\n `${API}/issue/createmeta/${encodeURIComponent(project)}/issuetypes`\n );\n\n const matchingTypes = issueType\n ? itList.values.filter(it => it.name.toLowerCase() === issueType.toLowerCase())\n : itList.values;\n\n type FieldEntry = { fieldId: string; allowedValues?: Array<{ id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> }> };\n const result: Record<string, { allowedValues?: Array<{ id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> }> }> = {};\n\n for (const it of matchingTypes) {\n const fieldList = await this.http.jira<{ values: FieldEntry[] }>(\n `${API}/issue/createmeta/${encodeURIComponent(project)}/issuetypes/${it.id}`\n );\n for (const field of fieldList.values) {\n if (!field.allowedValues?.length) continue;\n const existing = result[field.fieldId]?.allowedValues ?? [];\n const seen = new Set(existing.map((v) => v.id));\n for (const av of field.allowedValues) {\n if (!seen.has(av.id)) {\n existing.push(av);\n seen.add(av.id);\n }\n }\n result[field.fieldId] = { allowedValues: existing };\n }\n }\n\n return result;\n }\n\n async addLabels(key: string, labels: string[]): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { update: { labels: labels.map(l => ({ add: l })) } }\n });\n }\n\n async removeLabels(key: string, labels: string[]): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}`, {\n method: 'PUT',\n body: { update: { labels: labels.map(l => ({ remove: l })) } }\n });\n }\n\n async uploadAttachment(key: string, filePath: string): Promise<JiraAttachment[]> {\n const fileContent = readFileSync(filePath);\n const fileName = basename(filePath);\n const mimeType = guessMimeType(filePath);\n const formData = new FormData();\n formData.append('file', new Blob([fileContent], { type: mimeType }), fileName);\n return this.http.jiraUpload<JiraAttachment[]>(`${API}/issue/${key}/attachments`, formData);\n }\n\n async listAttachments(key: string): Promise<JiraAttachment[]> {\n const result = await this.http.jira<{ fields: { attachment?: JiraAttachment[] } }>(\n `${API}/issue/${key}`,\n { params: { fields: 'attachment' } }\n );\n return result.fields.attachment ?? [];\n }\n\n async downloadAttachment(contentUrl: string): Promise<Buffer> {\n return this.http.jiraBuffer(contentUrl);\n }\n\n async assignIssue(key: string, accountId: string): Promise<void> {\n await this.http.jira<void>(`${API}/issue/${key}/assignee`, {\n method: 'PUT',\n body: { accountId }\n });\n }\n\n async linkIssue(opts: LinkIssueOpts): Promise<void> {\n // First, find the link type ID if a name was given\n let linkTypeId = opts.linkType;\n if (isNaN(parseInt(opts.linkType, 10))) {\n const types = await this.http.jira<{ issueLinkTypes: Array<{ id: string; name: string; inward: string; outward: string }> }>(\n `${API}/issueLinkType`\n );\n const found = types.issueLinkTypes.find(\n t => t.name.toLowerCase() === opts.linkType.toLowerCase() ||\n t.inward.toLowerCase() === opts.linkType.toLowerCase() ||\n t.outward.toLowerCase() === opts.linkType.toLowerCase()\n );\n if (!found) throw new Error(`Link type not found: ${opts.linkType}`);\n linkTypeId = found.id;\n }\n\n await this.http.jira<void>(`${API}/issueLink`, {\n method: 'POST',\n body: {\n type: { id: linkTypeId },\n inwardIssue: { key: opts.key },\n outwardIssue: { key: opts.target }\n }\n });\n }\n\n async listBoards(project: string): Promise<JiraBoard[]> {\n return this.http.jiraPaginate<JiraBoard>(async (startAt, maxResults) => {\n return this.http.jira<{ values: JiraBoard[]; total: number; startAt: number; maxResults: number }>(\n `${AGILE_API}/board`,\n { params: { projectKeyOrId: project, startAt, maxResults } }\n );\n });\n }\n\n async listSprintsForBoard(boardId: number, states?: string[]): Promise<JiraSprint[]> {\n return this.http.jiraPaginate<JiraSprint>(async (startAt, maxResults) => {\n return this.http.jira<{ values: JiraSprint[]; total: number; startAt: number; maxResults: number }>(\n `${AGILE_API}/board/${boardId}/sprint`,\n { params: { startAt, maxResults, ...(states?.length ? { state: states.join(',') } : {}) } }\n );\n });\n }\n\n async listSprintsForProject(project: string, states?: string[]): Promise<JiraSprint[]> {\n const boards = await this.listBoards(project);\n const sprints: JiraSprint[] = [];\n const seen = new Set<number>();\n for (const board of boards) {\n if (board.type !== 'scrum') continue;\n for (const sprint of await this.listSprintsForBoard(board.id, states)) {\n if (seen.has(sprint.id)) continue;\n seen.add(sprint.id);\n sprints.push(sprint);\n }\n }\n return sprints;\n }\n\n async setSprint(sprintId: number, issueKeys: string[]): Promise<void> {\n await this.http.jira<void>(`${AGILE_API}/sprint/${sprintId}/issue`, {\n method: 'POST',\n body: { issues: issueKeys }\n });\n }\n}\n\n/** Map a Jira field schema to the recommended pncli CustomFieldType. */\nfunction schemaToPncliType(schema?: { type: string; custom?: string }): CustomFieldType | undefined {\n if (!schema) return undefined;\n const custom = schema.custom ?? '';\n if (custom.includes('cascadingselect')) return 'cascading-select';\n if (custom.includes('multicheckboxes') || custom.includes('multiselect')) return 'multi-select';\n if (custom.includes('select') || custom.includes('radiobuttons')) return 'select';\n if (custom.includes('userpicker') || custom.includes('multiuserpicker')) return 'user';\n if (custom.includes('labels')) return 'labels';\n if (custom.includes('url')) return 'url';\n if (custom.includes('textarea') || custom.includes('textfield')) return 'textarea';\n if (schema.type === 'number') return 'number';\n if (schema.type === 'date') return 'date';\n if (schema.type === 'datetime') return 'datetime';\n if (schema.type === 'string') return 'string';\n return undefined;\n}\n\ntype AllowedValue = { id: string; value?: string; name?: string; children?: Array<{ id: string; value: string }> };\ntype CreateMetaProject = {\n issuetypes: Array<{\n name: string;\n fields: Record<string, { allowedValues?: AllowedValue[] }>;\n }>;\n};\n\nfunction collectMetaFields(\n projects: CreateMetaProject[],\n issueType?: string\n): Record<string, { allowedValues?: AllowedValue[] }> {\n const result: Record<string, { allowedValues?: AllowedValue[] }> = {};\n for (const proj of projects) {\n for (const it of proj.issuetypes) {\n if (issueType && it.name.toLowerCase() !== issueType.toLowerCase()) continue;\n for (const [fieldId, fieldMeta] of Object.entries(it.fields)) {\n if (!fieldMeta.allowedValues?.length) continue;\n const existing = result[fieldId]?.allowedValues ?? [];\n const seen = new Set(existing.map(v => v.id));\n for (const av of fieldMeta.allowedValues) {\n if (!seen.has(av.id)) {\n existing.push(av);\n seen.add(av.id);\n }\n }\n result[fieldId] = { allowedValues: existing };\n }\n }\n }\n return result;\n}\n","import { extname } from 'path';\n\n/**\n * Guess MIME type from file extension.\n * Falls back to application/octet-stream for unknown extensions.\n *\n * @param filePath - Path to the file (can be absolute or relative)\n * @returns MIME type string\n */\nexport function guessMimeType(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const map: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.log': 'text/plain',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.zip': 'application/zip',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.htm': 'text/html',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n };\n return map[ext] ?? 'application/octet-stream';\n}\n","import type { CustomFieldDefinition, CustomFieldMap, CustomFieldType } from '../../types/jira.js';\n\nexport function buildFieldMap(fields: CustomFieldDefinition[]): CustomFieldMap {\n const byName = new Map<string, CustomFieldDefinition>();\n const byId = new Map<string, CustomFieldDefinition>();\n for (const f of fields) {\n byName.set(f.name.toLowerCase(), f);\n byId.set(f.id, f);\n }\n return { byName, byId };\n}\n\n/**\n * Replace friendly field names with customfield_* IDs in a JQL string.\n * Splits on quoted segments to avoid replacing inside string literals.\n * Sorts field names by length descending so \"Story Points\" matches before \"Story\".\n */\nexport function translateJql(jql: string, fieldMap: CustomFieldMap): string {\n if (fieldMap.byName.size === 0) return jql;\n\n // Sort names by length descending to avoid partial matches\n const sortedNames = Array.from(fieldMap.byName.keys()).sort((a, b) => b.length - a.length);\n\n // Split on quoted segments, only translate unquoted parts\n const parts = jql.split(/([\"'][^\"']*[\"'])/);\n return parts.map((part, i) => {\n if (i % 2 === 1) return part; // inside quotes — leave as-is\n let out = part;\n for (const name of sortedNames) {\n const def = fieldMap.byName.get(name)!;\n // Match the field name as a whole word (case-insensitive), optionally quoted\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n out = out.replace(new RegExp(`(?<![\\\\w\"'])${escaped}(?![\\\\w\"'])`, 'gi'), def.id);\n }\n return out;\n }).join('');\n}\n\n/**\n * Replace customfield_* keys with friendly names in an issue fields object.\n * Returns a new object; does not mutate the original.\n */\nexport function translateFieldsInOutput(\n fields: Record<string, unknown>,\n fieldMap: CustomFieldMap\n): Record<string, unknown> {\n if (fieldMap.byId.size === 0) return fields;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n const def = fieldMap.byId.get(key);\n result[def ? def.name : key] = value;\n }\n return result;\n}\n\n/**\n * Format a CLI string value into the shape Jira's API expects for a given field type.\n *\n * For `cascading-select`, pass the parent option ID alone or `parentId:childId`\n * to also set the child option. Example: `10001` or `10001:10002`.\n */\nexport function formatFieldValue(value: string, type: CustomFieldType): unknown {\n switch (type) {\n case 'number':\n return Number(value);\n case 'select':\n return { value };\n case 'multi-select':\n return value.split(',').map(v => ({ value: v.trim() }));\n case 'option-id':\n return { id: value };\n case 'cascading-select': {\n const colon = value.indexOf(':');\n if (colon !== -1) {\n return { id: value.slice(0, colon).trim(), child: { id: value.slice(colon + 1).trim() } };\n }\n return { id: value.trim() };\n }\n case 'labels':\n return value.split(',').map(v => v.trim());\n case 'user':\n return { accountId: value };\n default:\n return value;\n }\n}\n","/**\n * JSON Schema + example for the --input-file accepted by `jira create-issue` / `update-issue`.\n * Exposed at runtime via `pncli jira schema` so callers can discover the shape without reading docs.\n */\nexport const JIRA_INPUT_FILE_SCHEMA = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'pncli Jira issue input file',\n description:\n 'Shape accepted by --input-file on `pncli jira create-issue` / `update-issue`. ' +\n 'CLI flags (--summary, --description, --priority, --field, ...) override matching keys here; ' +\n 'overridden keys are reported in meta.overrides.',\n type: 'object',\n properties: {\n project: { type: 'string', description: 'Project key (create-issue only)' },\n issueType: { type: 'string', description: 'Issue type name, e.g. Bug, Story, Task (create-issue only)' },\n fields: {\n type: 'object',\n description:\n 'Field dictionary. Built-in keys: summary, description, priority, assignee, labels, parent. ' +\n 'Any other key resolves as a custom field: a friendly name registered via `pncli jira fields`, ' +\n 'or a raw field id (e.g. customfield_10032) passed through untouched — custom fields never ' +\n 'need to be pre-registered in config. Any string value may be \"@path/to/file\" to read that ' +\n \"field's content from a file instead of inlining it (useful for large rich-text fields).\",\n additionalProperties: true\n }\n },\n additionalProperties: false\n} as const;\n\nexport const JIRA_INPUT_FILE_EXAMPLE = {\n project: 'PROJ',\n issueType: 'Bug',\n fields: {\n summary: 'Login broken on Safari',\n description: '@desc.html',\n priority: 'High',\n labels: ['frontend', 'urgent'],\n // Raw field id — passed through untouched, no pre-registration needed. A friendly\n // custom-field name (e.g. \"Story Points\") also works, but only once it's registered\n // via `pncli config set jira.customFields` / discovered with `pncli jira fields`.\n customfield_10032: '@ac.md'\n }\n};\n","import { readFileSync } from 'fs';\nimport { PncliError } from './errors.js';\n\n/**\n * Resolves free-form text content from either an inline value or a --<name>-file path.\n * A file path of '-' reads from stdin. Returns undefined if neither is provided\n * (caller decides if that is an error). Throws if both are provided.\n */\nexport function resolveTextInput(\n inline: string | undefined,\n file: string | undefined,\n optionName: string\n): string | undefined {\n if (inline !== undefined && file !== undefined) {\n throw new PncliError(`Cannot specify both --${optionName} and --${optionName}-file`, 1);\n }\n if (file !== undefined) {\n try {\n return readFileSync(file === '-' ? 0 : file, 'utf8');\n } catch (e) {\n const source = file === '-' ? 'stdin' : `file \"${file}\"`;\n throw new PncliError(`Cannot read ${optionName} ${source}: ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n }\n return inline;\n}\n\n/**\n * Reads and JSON-parses a --input-file argument. A path of '-' reads from stdin.\n * Throws a PncliError with context on read or parse failure.\n */\nexport function readJsonInputFile(filePath: string, optionName = 'input-file'): unknown {\n let raw: string;\n try {\n raw = readFileSync(filePath === '-' ? 0 : filePath, 'utf8');\n } catch (e) {\n const source = filePath === '-' ? 'stdin' : `file \"${filePath}\"`;\n throw new PncliError(`Cannot read --${optionName} ${source}: ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n try {\n return JSON.parse(raw);\n } catch (e) {\n throw new PncliError(`--${optionName} must contain valid JSON: ${(e as Error).message}`, 1);\n }\n}\n\n/**\n * If value is a string starting with '@', returns the referenced file's contents\n * (trimmed of a single trailing newline is NOT performed — callers get raw content).\n * Any other value (including non-'@' strings) is returned unchanged.\n */\nexport function resolveAtFileRef(value: unknown): unknown {\n if (typeof value !== 'string' || !value.startsWith('@')) return value;\n const filePath = value.slice(1);\n try {\n return readFileSync(filePath, 'utf8');\n } catch (e) {\n throw new PncliError(`Cannot read referenced file \"${filePath}\": ${(e as NodeJS.ErrnoException).message}`, 1);\n }\n}\n\n/**\n * Merges a field dictionary sourced from --input-file with individual CLI flag values.\n * Flag values (fromFlags) always win when both set the same key. Returns the merged\n * record plus the list of keys where a flag overrode the JSON file's value, so callers\n * can surface that to the user instead of silently dropping the file's value.\n */\nexport function mergeWithOverrides(\n fromJson: Record<string, unknown>,\n fromFlags: Record<string, unknown>\n): { merged: Record<string, unknown>; overrides: string[] } {\n const merged: Record<string, unknown> = { ...fromJson };\n const overrides: string[] = [];\n for (const [key, value] of Object.entries(fromFlags)) {\n if (value === undefined) continue;\n if (Object.prototype.hasOwnProperty.call(fromJson, key)) overrides.push(key);\n merged[key] = value;\n }\n return { merged, overrides };\n}\n","import { Command } from 'commander';\nimport { BitbucketClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(\n program: Command,\n overrides?: { project?: string; repo?: string }\n): { client: BitbucketClient; project: string; repo: string } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n\n const project: string = overrides?.project ?? opts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n const repo: string = overrides?.repo ?? opts.repo ?? ctx?.repo ?? config.defaults.bitbucket?.repo ?? '';\n\n if (!project || !repo) {\n throw new PncliError(\n 'Could not determine Bitbucket project/repo. Pass --project and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, project, repo };\n}\n\nexport function registerBitbucketCommands(program: Command): void {\n const bb = program\n .command('bitbucket')\n .description('Bitbucket Server operations')\n .option('--project <key>', 'Bitbucket project key')\n .option('--repo <slug>', 'Bitbucket repository slug');\n\n // ── Repositories ──────────────────────────────────────────────────\n\n bb.command('create-repo')\n .description('Create a new repository in a project')\n .requiredOption('--name <name>', 'Repository name (slug)')\n .option('--description <desc>', 'Repository description')\n .option('--project <key>', 'Bitbucket project key (overrides parent --project)')\n .action(async (opts: { name: string; description?: string; project?: string }) => {\n const start = Date.now();\n try {\n const globalOpts = bb.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const client = new BitbucketClient(http);\n const ctx = getGitContext(config);\n const project: string = opts.project ?? globalOpts.project ?? ctx?.project ?? config.defaults.bitbucket?.project ?? '';\n if (!project) {\n throw new PncliError('Could not determine Bitbucket project. Pass --project, or run pncli config init.', 1);\n }\n const data = await client.createRepo({ project, name: opts.name, description: opts.description });\n success(data, 'bitbucket', 'create-repo', start);\n } catch (err) { fail(err, 'bitbucket', 'create-repo', start); }\n });\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n bb.command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: OPEN|MERGED|DECLINED|ALL', 'OPEN')\n .option('--author <username>', 'Filter by author username')\n .option('--reviewer <username>', 'Filter by reviewer username')\n .action(async (opts: { state?: string; author?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listPRs({ project, repo, state: opts.state, author: opts.author, reviewer: opts.reviewer });\n success(data, 'bitbucket', 'list-prs', start);\n } catch (err) { fail(err, 'bitbucket', 'list-prs', start); }\n });\n\n bb.command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.getPR(project, repo, parseInt(opts.id, 10));\n success(data, 'bitbucket', 'get-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'get-pr', start); }\n });\n\n bb.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (defaults to config)')\n .option('--description <desc>', 'PR description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .option('--project <key>', 'Bitbucket project key (overrides parent --project; use ~username for personal repos)')\n .option('--repo <slug>', 'Bitbucket repository slug (overrides parent --repo)')\n .action(async (opts: { title: string; source: string; target?: string; description?: string; reviewers?: string; project?: string; repo?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb, { project: opts.project, repo: opts.repo });\n const config = loadConfig({ configPath: bb.optsWithGlobals().config });\n const target = opts.target ?? config.defaults.bitbucket?.targetBranch ?? 'main';\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : [];\n const data = await client.createPR({ project, repo, title: opts.title, source: opts.source, target, description: opts.description, reviewers });\n success(data, 'bitbucket', 'create-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'create-pr', start); }\n });\n\n bb.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <desc>', 'New description')\n .option('--reviewers <users>', 'Comma-separated reviewer usernames')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const reviewers = opts.reviewers ? opts.reviewers.split(',').map(s => s.trim()) : undefined;\n const data = await client.updatePR({ project, repo, id: prId, title: opts.title, description: opts.description, reviewers, version: pr.version });\n success(data, 'bitbucket', 'update-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'update-pr', start); }\n });\n\n bb.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .option('--strategy <strategy>', 'Merge strategy: merge|squash|ff')\n .option('--delete-branch', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy?: string; deleteBranch?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.mergePR({ project, repo, id: prId, version: pr.version, strategy: opts.strategy as 'merge' | 'squash' | 'ff', deleteBranch: opts.deleteBranch });\n success(data, 'bitbucket', 'merge-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'merge-pr', start); }\n });\n\n bb.command('decline-pr')\n .description('Decline a pull request')\n .requiredOption('--id <pr-id>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const prId = parseInt(opts.id, 10);\n const pr = await client.getPR(project, repo, prId);\n const data = await client.declinePR(project, repo, prId, pr.version);\n success(data, 'bitbucket', 'decline-pr', start);\n } catch (err) { fail(err, 'bitbucket', 'decline-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n bb.command('list-comments')\n .description('List comments on a pull request (includes threaded replies by default)')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--no-with-replies', 'Exclude replies; return top-level comments only')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general (non-inline) PR comments')\n .action(async (opts: { pr: string; withReplies: boolean; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listComments(project, repo, parseInt(opts.pr, 10), {\n withReplies: opts.withReplies,\n inlineOnly: opts.inlineOnly,\n generalOnly: opts.generalOnly\n });\n success(data, 'bitbucket', 'list-comments', start);\n } catch (err) { fail(err, 'bitbucket', 'list-comments', start); }\n });\n\n bb.command('add-comment')\n .description('Add a comment to a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { pr: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.addComment(project, repo, parseInt(opts.pr, 10), opts.body);\n success(data, 'bitbucket', 'add-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-comment', start); }\n });\n\n bb.command('add-inline-comment')\n .description('Add an inline comment to a file in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <type>', 'Line type: ADDED|REMOVED|CONTEXT', 'ADDED')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.addInlineComment({\n project, repo,\n prId: parseInt(opts.pr, 10),\n text: opts.body,\n filePath: opts.file,\n line: parseInt(opts.line, 10),\n lineType: opts.lineType as 'ADDED' | 'REMOVED' | 'CONTEXT'\n });\n success(data, 'bitbucket', 'add-inline-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'add-inline-comment', start); }\n });\n\n bb.command('reply-comment')\n .description('Reply to a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.replyComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'bitbucket', 'reply-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'reply-comment', start); }\n });\n\n bb.command('resolve-comment')\n .description('Resolve a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n await client.resolveComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ resolved: true }, 'bitbucket', 'resolve-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'resolve-comment', start); }\n });\n\n bb.command('delete-comment')\n .description('Delete a comment on a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .option('--version <n>', 'Comment version', '0')\n .action(async (opts: { pr: string; commentId: string; version?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n await client.deleteComment(project, repo, parseInt(opts.pr, 10), parseInt(opts.commentId, 10), parseInt(opts.version ?? '0', 10));\n success({ deleted: true }, 'bitbucket', 'delete-comment', start);\n } catch (err) { fail(err, 'bitbucket', 'delete-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n bb.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .option('--file <path>', 'Limit diff to a specific file')\n .option('--context-lines <n>', 'Lines of context around changes')\n .action(async (opts: { pr: string; file?: string; contextLines?: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const contextLines = opts.contextLines ? parseInt(opts.contextLines, 10) : undefined;\n const diff = await client.getDiff(project, repo, parseInt(opts.pr, 10), opts.file, contextLines);\n success({ diff }, 'bitbucket', 'diff', start);\n } catch (err) { fail(err, 'bitbucket', 'diff', start); }\n });\n\n bb.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listFiles(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-files', start);\n } catch (err) { fail(err, 'bitbucket', 'list-files', start); }\n });\n\n // ── Approvals ──────────────────────────────────────────────────────\n\n bb.command('approve')\n .description('Approve a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.approvePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'approve', start);\n } catch (err) { fail(err, 'bitbucket', 'approve', start); }\n });\n\n bb.command('unapprove')\n .description('Remove approval from a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.unapprovePR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'unapprove', start);\n } catch (err) { fail(err, 'bitbucket', 'unapprove', start); }\n });\n\n bb.command('needs-work')\n .description('Mark a pull request as needs-work')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.needsWorkPR(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'needs-work', start);\n } catch (err) { fail(err, 'bitbucket', 'needs-work', start); }\n });\n\n bb.command('list-reviewers')\n .description('List reviewers of a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listReviewers(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-reviewers', start);\n } catch (err) { fail(err, 'bitbucket', 'list-reviewers', start); }\n });\n\n bb.command('add-reviewer')\n .description('Add a reviewer to a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .requiredOption('--user <username>', 'Username to add as a reviewer')\n .action(async (opts: { pr: string; user: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.addReviewer(project, repo, parseInt(opts.pr, 10), opts.user);\n success(data, 'bitbucket', 'add-reviewer', start);\n } catch (err) { fail(err, 'bitbucket', 'add-reviewer', start); }\n });\n\n // ── Build Status ───────────────────────────────────────────────────\n\n bb.command('list-builds')\n .description('List build statuses for a pull request')\n .requiredOption('--pr <pr-id>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { client, project, repo } = getClient(bb);\n const data = await client.listBuilds(project, repo, parseInt(opts.pr, 10));\n success(data, 'bitbucket', 'list-builds', start);\n } catch (err) { fail(err, 'bitbucket', 'list-builds', start); }\n });\n\n bb.command('get-build-status')\n .description('Get build status for a commit SHA')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(bb);\n const data = await client.getBuildStatus(opts.commit);\n success(data, 'bitbucket', 'get-build-status', start);\n } catch (err) { fail(err, 'bitbucket', 'get-build-status', start); }\n });\n}\n","import { Command, Option } from 'commander';\nimport type { ResolvedConfig } from '../../types/config.js';\nimport { GitHubClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { resolveTextInput } from '../../lib/input.js';\n\nfunction getClient(\n program: Command,\n overrides?: { owner?: string; repo?: string }\n): { client: GitHubClient; owner: string; repo: string; config: ResolvedConfig } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const client = new GitHubClient(http);\n const ctx = getGitContext(config);\n\n const owner: string = overrides?.owner ?? opts.owner ?? ctx?.github?.owner ?? config.defaults.github?.owner ?? '';\n const repo: string = overrides?.repo ?? opts.repo ?? ctx?.github?.repo ?? config.defaults.github?.repo ?? '';\n\n if (!owner || !repo) {\n throw new PncliError(\n 'Could not determine GitHub owner/repo. Pass --owner and --repo, or run pncli config init.',\n 1\n );\n }\n\n return { client, owner, repo, config };\n}\n\nexport function registerGitHubCommands(program: Command): void {\n const gh = program\n .command('github')\n .description('GitHub repository operations')\n .option('--owner <owner>', 'GitHub owner (user or org)')\n .option('--repo <repo>', 'GitHub repository name');\n\n // ── Repositories ──────────────────────────────────────────────────\n\n gh.command('create-repo')\n .description('Create a new repository (personal or org)')\n .requiredOption('--name <name>', 'Repository name')\n .option('--description <desc>', 'Repository description')\n .option('--private', 'Create as a private repository')\n .option('--auto-init', 'Initialize with a README')\n .action(async (opts: { name: string; description?: string; private?: boolean; autoInit?: boolean }) => {\n const start = Date.now();\n try {\n const globalOpts = gh.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const client = new GitHubClient(http);\n const owner: string = globalOpts.owner ?? '';\n const data = await client.createRepo({\n org: owner || undefined,\n name: opts.name,\n description: opts.description,\n private: opts.private,\n autoInit: opts.autoInit\n });\n success(data, 'github', 'create-repo', start);\n } catch (err) { fail(err, 'github', 'create-repo', start); }\n });\n\n // ── Issues ────────────────────────────────────────────────────────\n\n gh.command('create-issue')\n .description('Create a GitHub issue')\n .requiredOption('--title <title>', 'Issue title')\n .option('--body <body>', 'Issue body (markdown)')\n .option('--body-file <path>', 'Read issue body from a file (use - for stdin); overridden by --body')\n .option('--label <label>', 'Label to apply (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--assignee <login>', 'Assignee login (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .action(async (opts: { title: string; body?: string; bodyFile?: string; label: string[]; assignee: string[] }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const body = opts.body ?? resolveTextInput(undefined, opts.bodyFile, 'body');\n const data = await client.createIssue({\n owner,\n repo,\n title: opts.title,\n body,\n labels: opts.label.length ? opts.label : undefined,\n assignees: opts.assignee.length ? opts.assignee : undefined\n });\n success(data, 'github', 'create-issue', start);\n } catch (err) { fail(err, 'github', 'create-issue', start); }\n });\n\n // ── Pull Requests ──────────────────────────────────────────────────\n\n gh.command('list-prs')\n .description('List pull requests')\n .addOption(new Option('--state <state>', 'PR state').choices(['open', 'closed', 'all']).default('open'))\n .option('--head <branch>', 'Filter by head branch (user:branch)')\n .option('--base <branch>', 'Filter by base branch')\n .action(async (opts: { state?: string; head?: string; base?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listPRs({\n owner,\n repo,\n state: opts.state as 'open' | 'closed' | 'all',\n head: opts.head,\n base: opts.base\n });\n success(data, 'github', 'list-prs', start);\n } catch (err) { fail(err, 'github', 'list-prs', start); }\n });\n\n gh.command('get-pr')\n .description('Get a pull request by number')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.getPR(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'get-pr', start);\n } catch (err) { fail(err, 'github', 'get-pr', start); }\n });\n\n gh.command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--head <branch>', 'Source branch (or user:branch for forks)')\n .option('--base <branch>', 'Target branch (defaults to config or main)')\n .option('--body <body>', 'PR description')\n .option('--body-file <path>', 'Read PR description from a file (use - for stdin); overridden by --body')\n .option('--draft', 'Create as draft PR')\n .option('--owner <owner>', 'GitHub owner (overrides parent --owner)')\n .option('--repo <repo>', 'GitHub repository name (overrides parent --repo)')\n .action(async (opts: { title: string; head: string; base?: string; body?: string; bodyFile?: string; draft?: boolean; owner?: string; repo?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo, config } = getClient(gh, { owner: opts.owner, repo: opts.repo });\n const base = opts.base ?? config.defaults.github?.targetBranch ?? 'main';\n const body = opts.body ?? resolveTextInput(undefined, opts.bodyFile, 'body');\n const data = await client.createPR({\n owner,\n repo,\n title: opts.title,\n head: opts.head,\n base,\n body,\n draft: opts.draft\n });\n success(data, 'github', 'create-pr', start);\n } catch (err) { fail(err, 'github', 'create-pr', start); }\n });\n\n gh.command('update-pr')\n .description('Update a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .option('--title <title>', 'New title')\n .option('--body <body>', 'New description')\n .option('--base <branch>', 'New base branch')\n .action(async (opts: { number: string; title?: string; body?: string; base?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.updatePR({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n title: opts.title,\n body: opts.body,\n base: opts.base\n });\n success(data, 'github', 'update-pr', start);\n } catch (err) { fail(err, 'github', 'update-pr', start); }\n });\n\n gh.command('merge-pr')\n .description('Merge a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .addOption(new Option('--method <method>', 'Merge method').choices(['merge', 'squash', 'rebase']).default('merge'))\n .option('--commit-title <title>', 'Commit title for merge/squash')\n .option('--commit-message <msg>', 'Commit message for merge/squash')\n .action(async (opts: { number: string; method?: string; commitTitle?: string; commitMessage?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.mergePR({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n mergeMethod: opts.method as 'merge' | 'squash' | 'rebase',\n commitTitle: opts.commitTitle,\n commitMessage: opts.commitMessage\n });\n success(data, 'github', 'merge-pr', start);\n } catch (err) { fail(err, 'github', 'merge-pr', start); }\n });\n\n gh.command('close-pr')\n .description('Close a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.closePR(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'close-pr', start);\n } catch (err) { fail(err, 'github', 'close-pr', start); }\n });\n\n // ── Comments ───────────────────────────────────────────────────────\n\n gh.command('list-comments')\n .description('List general comments on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listComments(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-comments', start);\n } catch (err) { fail(err, 'github', 'list-comments', start); }\n });\n\n gh.command('add-comment')\n .description('Add a general comment to a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { number: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.addComment(owner, repo, parseInt(opts.number, 10), opts.body);\n success(data, 'github', 'add-comment', start);\n } catch (err) { fail(err, 'github', 'add-comment', start); }\n });\n\n gh.command('list-review-comments')\n .description('List inline review comments on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listReviewComments(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-review-comments', start);\n } catch (err) { fail(err, 'github', 'list-review-comments', start); }\n });\n\n gh.command('add-inline-comment')\n .description('Add an inline review comment to a file in a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--commit <sha>', 'Commit SHA the comment is on')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .addOption(new Option('--side <side>', 'Comment side').choices(['LEFT', 'RIGHT']).default('RIGHT'))\n .action(async (opts: { number: string; commit: string; file: string; line: string; body: string; side?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.addInlineComment({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n body: opts.body,\n commitId: opts.commit,\n path: opts.file,\n line: parseInt(opts.line, 10),\n side: opts.side as 'LEFT' | 'RIGHT'\n });\n success(data, 'github', 'add-inline-comment', start);\n } catch (err) { fail(err, 'github', 'add-inline-comment', start); }\n });\n\n gh.command('reply-comment')\n .description('Reply to a review comment on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--comment-id <id>', 'Review comment ID to reply to')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { number: string; commentId: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.replyComment(owner, repo, parseInt(opts.number, 10), parseInt(opts.commentId, 10), opts.body);\n success(data, 'github', 'reply-comment', start);\n } catch (err) { fail(err, 'github', 'reply-comment', start); }\n });\n\n gh.command('delete-comment')\n .description('Delete a general issue comment')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .action(async (opts: { commentId: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n await client.deleteComment(owner, repo, parseInt(opts.commentId, 10));\n success({ deleted: true }, 'github', 'delete-comment', start);\n } catch (err) { fail(err, 'github', 'delete-comment', start); }\n });\n\n gh.command('delete-review-comment')\n .description('Delete an inline review comment')\n .requiredOption('--comment-id <id>', 'Review comment ID')\n .action(async (opts: { commentId: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n await client.deleteReviewComment(owner, repo, parseInt(opts.commentId, 10));\n success({ deleted: true }, 'github', 'delete-review-comment', start);\n } catch (err) { fail(err, 'github', 'delete-review-comment', start); }\n });\n\n // ── Diff / Files ───────────────────────────────────────────────────\n\n gh.command('diff')\n .description('Get unified diff for a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const diff = await client.getDiff(owner, repo, parseInt(opts.number, 10));\n success({ diff }, 'github', 'diff', start);\n } catch (err) { fail(err, 'github', 'diff', start); }\n });\n\n gh.command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listFiles(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-files', start);\n } catch (err) { fail(err, 'github', 'list-files', start); }\n });\n\n // ── Reviews ────────────────────────────────────────────────────────\n\n gh.command('list-reviews')\n .description('List reviews on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listReviews(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-reviews', start);\n } catch (err) { fail(err, 'github', 'list-reviews', start); }\n });\n\n gh.command('approve')\n .description('Approve a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .option('--body <text>', 'Review body text')\n .action(async (opts: { number: string; body?: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.submitReview({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n event: 'APPROVE',\n body: opts.body\n });\n success(data, 'github', 'approve', start);\n } catch (err) { fail(err, 'github', 'approve', start); }\n });\n\n gh.command('request-changes')\n .description('Request changes on a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .requiredOption('--body <text>', 'Review feedback text')\n .action(async (opts: { number: string; body: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.submitReview({\n owner,\n repo,\n pullNumber: parseInt(opts.number, 10),\n event: 'REQUEST_CHANGES',\n body: opts.body\n });\n success(data, 'github', 'request-changes', start);\n } catch (err) { fail(err, 'github', 'request-changes', start); }\n });\n\n gh.command('list-reviewers')\n .description('List requested reviewers for a pull request')\n .requiredOption('--number <n>', 'Pull request number')\n .action(async (opts: { number: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listRequestedReviewers(owner, repo, parseInt(opts.number, 10));\n success(data, 'github', 'list-reviewers', start);\n } catch (err) { fail(err, 'github', 'list-reviewers', start); }\n });\n\n // ── Status & Checks ────────────────────────────────────────────────\n\n gh.command('get-status')\n .description('Get combined commit status for a ref (branch, tag, or SHA)')\n .requiredOption('--ref <ref>', 'Git ref (branch, tag, or commit SHA)')\n .action(async (opts: { ref: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.getCommitStatuses(owner, repo, opts.ref);\n success(data, 'github', 'get-status', start);\n } catch (err) { fail(err, 'github', 'get-status', start); }\n });\n\n gh.command('list-checks')\n .description('List check runs for a ref (branch, tag, or SHA)')\n .requiredOption('--ref <ref>', 'Git ref (branch, tag, or commit SHA)')\n .action(async (opts: { ref: string }) => {\n const start = Date.now();\n try {\n const { client, owner, repo } = getClient(gh);\n const data = await client.listCheckRuns(owner, repo, opts.ref);\n success(data, 'github', 'list-checks', start);\n } catch (err) { fail(err, 'github', 'list-checks', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n GitHubPR,\n GitHubComment,\n GitHubReview,\n GitHubFile,\n GitHubCombinedStatus,\n GitHubCheckRun,\n GitHubIssue,\n GitHubRepo\n} from '../../types/github.js';\n\nexport interface ListPRsOpts {\n owner: string;\n repo: string;\n state?: 'open' | 'closed' | 'all';\n head?: string;\n base?: string;\n}\n\nexport interface CreatePROpts {\n owner: string;\n repo: string;\n title: string;\n head: string;\n base: string;\n body?: string;\n draft?: boolean;\n}\n\nexport interface UpdatePROpts {\n owner: string;\n repo: string;\n pullNumber: number;\n title?: string;\n body?: string;\n state?: 'open' | 'closed';\n base?: string;\n}\n\nexport interface MergePROpts {\n owner: string;\n repo: string;\n pullNumber: number;\n commitTitle?: string;\n commitMessage?: string;\n mergeMethod?: 'merge' | 'squash' | 'rebase';\n}\n\nexport interface InlineCommentOpts {\n owner: string;\n repo: string;\n pullNumber: number;\n body: string;\n commitId: string;\n path: string;\n line: number;\n side?: 'LEFT' | 'RIGHT';\n}\n\nexport interface SubmitReviewOpts {\n owner: string;\n repo: string;\n pullNumber: number;\n event: 'APPROVE' | 'REQUEST_CHANGES' | 'COMMENT';\n body?: string;\n}\n\nexport interface CreateIssueOpts {\n owner: string;\n repo: string;\n title: string;\n body?: string;\n labels?: string[];\n assignees?: string[];\n}\n\nexport interface CreateRepoOpts {\n /** Org name for org repos; omit to create under the authenticated user */\n org?: string;\n name: string;\n description?: string;\n private?: boolean;\n autoInit?: boolean;\n}\n\nexport class GitHubClient {\n constructor(private http: HttpClient) {}\n\n async listPRs(opts: ListPRsOpts): Promise<GitHubPR[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubPR[]>(\n `/repos/${opts.owner}/${opts.repo}/pulls`,\n {\n params: {\n state: opts.state ?? 'open',\n ...(opts.head ? { head: opts.head } : {}),\n ...(opts.base ? { base: opts.base } : {}),\n per_page: perPage,\n page\n }\n }\n )\n );\n }\n\n async getPR(owner: string, repo: string, pullNumber: number): Promise<GitHubPR> {\n return this.http.github<GitHubPR>(`/repos/${owner}/${repo}/pulls/${pullNumber}`);\n }\n\n async createPR(opts: CreatePROpts): Promise<GitHubPR> {\n return this.http.github<GitHubPR>(\n `/repos/${opts.owner}/${opts.repo}/pulls`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n head: opts.head,\n base: opts.base,\n ...(opts.body !== undefined ? { body: opts.body } : {}),\n ...(opts.draft !== undefined ? { draft: opts.draft } : {})\n }\n }\n );\n }\n\n async updatePR(opts: UpdatePROpts): Promise<GitHubPR> {\n const body: Record<string, unknown> = {};\n if (opts.title !== undefined) body.title = opts.title;\n if (opts.body !== undefined) body.body = opts.body;\n if (opts.state !== undefined) body.state = opts.state;\n if (opts.base !== undefined) body.base = opts.base;\n\n return this.http.github<GitHubPR>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}`,\n { method: 'PATCH', body }\n );\n }\n\n async mergePR(opts: MergePROpts): Promise<{ sha: string; merged: boolean; message: string }> {\n const body: Record<string, unknown> = {};\n if (opts.commitTitle) body.commit_title = opts.commitTitle;\n if (opts.commitMessage) body.commit_message = opts.commitMessage;\n if (opts.mergeMethod) body.merge_method = opts.mergeMethod;\n\n return this.http.github<{ sha: string; merged: boolean; message: string }>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}/merge`,\n { method: 'PUT', body }\n );\n }\n\n async closePR(owner: string, repo: string, pullNumber: number): Promise<GitHubPR> {\n return this.updatePR({ owner, repo, pullNumber, state: 'closed' });\n }\n\n async listComments(owner: string, repo: string, pullNumber: number): Promise<GitHubComment[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubComment[]>(\n `/repos/${owner}/${repo}/issues/${pullNumber}/comments`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async addComment(owner: string, repo: string, pullNumber: number, body: string): Promise<GitHubComment> {\n return this.http.github<GitHubComment>(\n `/repos/${owner}/${repo}/issues/${pullNumber}/comments`,\n { method: 'POST', body: { body } }\n );\n }\n\n async listReviewComments(owner: string, repo: string, pullNumber: number): Promise<GitHubComment[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubComment[]>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/comments`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async addInlineComment(opts: InlineCommentOpts): Promise<GitHubComment> {\n return this.http.github<GitHubComment>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}/comments`,\n {\n method: 'POST',\n body: {\n body: opts.body,\n commit_id: opts.commitId,\n path: opts.path,\n line: opts.line,\n side: opts.side ?? 'RIGHT'\n }\n }\n );\n }\n\n async replyComment(owner: string, repo: string, pullNumber: number, commentId: number, body: string): Promise<GitHubComment> {\n return this.http.github<GitHubComment>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/comments/${commentId}/replies`,\n { method: 'POST', body: { body } }\n );\n }\n\n async deleteComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.http.github<void>(\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { method: 'DELETE' }\n );\n }\n\n async deleteReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.http.github<void>(\n `/repos/${owner}/${repo}/pulls/comments/${commentId}`,\n { method: 'DELETE' }\n );\n }\n\n async getDiff(owner: string, repo: string, pullNumber: number): Promise<string> {\n // GitHub returns diff content when Accept: application/vnd.github.v3.diff is set —\n // githubText() sets that header, so the same path as getPR gives the raw diff.\n return this.http.githubText(`/repos/${owner}/${repo}/pulls/${pullNumber}`);\n }\n\n async listFiles(owner: string, repo: string, pullNumber: number): Promise<GitHubFile[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubFile[]>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/files`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async listReviews(owner: string, repo: string, pullNumber: number): Promise<GitHubReview[]> {\n return this.http.githubPaginate((page, perPage) =>\n this.http.github<GitHubReview[]>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/reviews`,\n { params: { per_page: perPage, page } }\n )\n );\n }\n\n async submitReview(opts: SubmitReviewOpts): Promise<GitHubReview> {\n return this.http.github<GitHubReview>(\n `/repos/${opts.owner}/${opts.repo}/pulls/${opts.pullNumber}/reviews`,\n {\n method: 'POST',\n body: {\n event: opts.event,\n ...(opts.body !== undefined ? { body: opts.body } : {})\n }\n }\n );\n }\n\n async listRequestedReviewers(owner: string, repo: string, pullNumber: number): Promise<{ users: GitHubReview['user'][] }> {\n return this.http.github<{ users: GitHubReview['user'][] }>(\n `/repos/${owner}/${repo}/pulls/${pullNumber}/requested_reviewers`\n );\n }\n\n async getCommitStatuses(owner: string, repo: string, ref: string): Promise<GitHubCombinedStatus> {\n return this.http.github<GitHubCombinedStatus>(`/repos/${owner}/${repo}/commits/${ref}/status`);\n }\n\n async listCheckRuns(owner: string, repo: string, ref: string): Promise<GitHubCheckRun[]> {\n // The check-runs payload is { total_count, check_runs: [] }, not a plain array,\n // so githubPaginate() can't be used — paginate manually until a short page.\n const results: GitHubCheckRun[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const result = await this.http.github<{ check_runs: GitHubCheckRun[] }>(\n `/repos/${owner}/${repo}/commits/${ref}/check-runs`,\n { params: { per_page: perPage, page } }\n );\n const runs = result.check_runs ?? [];\n results.push(...runs);\n if (runs.length < perPage) break;\n page++;\n }\n return results;\n }\n\n async createIssue(opts: CreateIssueOpts): Promise<GitHubIssue> {\n return this.http.github<GitHubIssue>(\n `/repos/${opts.owner}/${opts.repo}/issues`,\n {\n method: 'POST',\n body: {\n title: opts.title,\n ...(opts.body !== undefined ? { body: opts.body } : {}),\n ...(opts.labels?.length ? { labels: opts.labels } : {}),\n ...(opts.assignees?.length ? { assignees: opts.assignees } : {})\n }\n }\n );\n }\n\n async createRepo(opts: CreateRepoOpts): Promise<GitHubRepo> {\n const path = opts.org ? `/orgs/${opts.org}/repos` : '/user/repos';\n return this.http.github<GitHubRepo>(path, {\n method: 'POST',\n body: {\n name: opts.name,\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.private !== undefined ? { private: opts.private } : {}),\n ...(opts.autoInit !== undefined ? { auto_init: opts.autoInit } : {})\n }\n });\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport path from 'path';\nimport { Command } from 'commander';\nimport { ConfluenceClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { resolveTextInput } from '../../lib/input.js';\n\n/**\n * When Confluence returns an XML parse error (HTTP 400 with \"at [row,col]={R,C}\"),\n * extracts the offending line from the submitted body and returns a diagnostic hint.\n * Returns null if the error doesn't match the pattern or the row is out of range.\n */\n/**\n * Resolves where a downloaded attachment is written.\n *\n * `title` comes from the Confluence API, so it is untrusted: without basename()\n * a title like `../../.gitconfig` (or an absolute path) escapes `outDir` and\n * writes anywhere the process can reach. Exported so that containment is\n * directly testable — see commands.test.ts.\n */\nexport function resolveAttachmentPath(outDir: string, title: string): string {\n // Split on both separators rather than path.basename(): on POSIX, basename()\n // does not treat `\\` as a separator, so a title from a Windows-hosted\n // Confluence would survive intact as a literal `..\\..\\file` filename. Handling\n // both makes containment independent of the platform pncli happens to run on.\n const segments = title.split(/[\\\\/]/).filter(s => s !== '' && s !== '.' && s !== '..');\n const name = segments.pop() ?? 'attachment';\n return path.join(outDir, name);\n}\n\nexport function xmlParseHint(err: unknown, bodyContent: string, convertedFromMarkdown = false): string | null {\n if (!(err instanceof Error)) return null;\n const m = err.message.match(/at \\[row,col\\]=\\{(\\d+),(\\d+)\\}/);\n if (!m) return null;\n const row = parseInt(m[1], 10);\n const col = parseInt(m[2], 10);\n const lines = bodyContent.split('\\n');\n const line = lines[row - 1];\n if (!line) return null;\n const pointer = ' '.repeat(Math.max(0, col - 1)) + '^';\n const suffix = convertedFromMarkdown ? ' (converted from Markdown)' : '';\n return `Offending line ${row}${suffix}: ${line}\\n${pointer}`;\n}\n\nfunction getClient(program: Command): ConfluenceClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.confluence.baseUrl) throw new PncliError('Confluence not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ConfluenceClient(http);\n}\n\nexport function registerConfluenceCommands(program: Command): void {\n const confluence = program.command('confluence').description('Confluence operations');\n\n // ── Read ──────────────────────────────────────────────────────────────────\n\n confluence.command('get-page')\n .description('Get a Confluence page by ID')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--expand <fields>', 'Comma-separated fields to expand', 'body.storage,version,space,ancestors')\n .action(async (opts: { id: string; expand: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPage(opts.id, opts.expand);\n success(data, 'confluence', 'get-page', start);\n } catch (err) { fail(err, 'confluence', 'get-page', start); }\n });\n\n confluence.command('get-page-by-title')\n .description('Find a Confluence page by space key and title')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .action(async (opts: { space: string; title: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageByTitle(opts.space, opts.title);\n if (!data) throw new PncliError(`Page not found: \"${opts.title}\" in space ${opts.space}`, 1);\n success(data, 'confluence', 'get-page-by-title', start);\n } catch (err) { fail(err, 'confluence', 'get-page-by-title', start); }\n });\n\n confluence.command('list-pages')\n .description('List pages in a Confluence space (consider --output-file for large results)')\n .requiredOption('--space <key>', 'Space key')\n .option('--limit <n>', 'Max total pages to return (default: all)')\n .option('--start <n>', 'Offset for first result')\n .action(async (opts: { space: string; limit?: string; start?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listPages(opts.space, {\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n start: opts.start ? parseInt(opts.start, 10) : undefined\n });\n success(data, 'confluence', 'list-pages', start);\n } catch (err) { fail(err, 'confluence', 'list-pages', start); }\n });\n\n confluence.command('get-page-children')\n .description('Get child pages of a Confluence page')\n .requiredOption('--id <page-id>', 'Parent page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageChildren(opts.id);\n success(data, 'confluence', 'get-page-children', start);\n } catch (err) { fail(err, 'confluence', 'get-page-children', start); }\n });\n\n confluence.command('get-labels')\n .description('Get labels on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getLabels(opts.id);\n success(data, 'confluence', 'get-labels', start);\n } catch (err) { fail(err, 'confluence', 'get-labels', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────────────\n\n confluence.command('search')\n .description('Search Confluence with CQL')\n .requiredOption('--cql <query>', 'CQL query string (e.g. \"space=PROJ AND type=page\")')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--start <n>', 'Offset for first result', '0')\n .option('--expand <fields>', 'Comma-separated fields to expand')\n .action(async (opts: { cql: string; limit: string; start: string; expand?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.search(opts.cql, {\n limit: parseInt(opts.limit, 10),\n start: parseInt(opts.start, 10),\n expand: opts.expand\n });\n success(data, 'confluence', 'search', start);\n } catch (err) { fail(err, 'confluence', 'search', start); }\n });\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n confluence.command('create-page')\n .description('Create a new Confluence page')\n .requiredOption('--space <key>', 'Space key')\n .requiredOption('--title <title>', 'Page title')\n .option('--body <html>', 'Page body (storage format HTML or Markdown when --markdown is set)')\n .option('--body-file <path>', \"Path to a file containing the page body ('-' = stdin)\")\n .option('--markdown', 'Convert body from Markdown to storage format via Confluence API')\n .option('--parent-id <id>', 'Parent page ID (to nest under a page)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { space: string; title: string; body?: string; bodyFile?: string; markdown?: boolean; parentId?: string; representation: string }) => {\n const start = Date.now();\n let bodyContent: string | undefined;\n try {\n const client = getClient(program);\n const rawBody = resolveTextInput(opts.body, opts.bodyFile, 'body');\n if (rawBody === undefined) throw new PncliError('Must specify --body or --body-file', 1);\n bodyContent = opts.markdown ? await client.convertToStorage(rawBody) : rawBody;\n const representation = opts.markdown ? 'storage' : opts.representation;\n const data = await client.createPage({\n spaceKey: opts.space,\n title: opts.title,\n body: bodyContent,\n parentId: opts.parentId,\n representation\n });\n success(data, 'confluence', 'create-page', start);\n } catch (err) {\n const hint = bodyContent ? xmlParseHint(err, bodyContent, Boolean(opts.markdown)) : null;\n if (hint) {\n const msg = err instanceof Error ? err.message : String(err);\n const status = err instanceof PncliError ? err.status : 1;\n const url = err instanceof PncliError ? err.url : undefined;\n fail(new PncliError(`${msg}\\n\\n${hint}`, status, url), 'confluence', 'create-page', start);\n } else {\n fail(err, 'confluence', 'create-page', start);\n }\n }\n });\n\n confluence.command('update-page')\n .description('Update a Confluence page (fetches current version automatically)')\n .requiredOption('--id <page-id>', 'Page ID')\n .option('--title <title>', 'New page title')\n .option('--body <html>', 'New page body (storage format HTML or Markdown when --markdown is set)')\n .option('--body-file <path>', \"Path to a file containing the new page body ('-' = stdin)\")\n .option('--markdown', 'Convert body from Markdown to storage format via Confluence API')\n .option('--status <status>', 'Page status: current (default) or draft', 'current')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; title?: string; body?: string; bodyFile?: string; markdown?: boolean; status: string; representation: string }) => {\n const start = Date.now();\n let bodyContent: string | undefined;\n try {\n const client = getClient(program);\n const rawBody = resolveTextInput(opts.body, opts.bodyFile, 'body');\n bodyContent = (rawBody !== undefined && opts.markdown)\n ? await client.convertToStorage(rawBody)\n : rawBody;\n const representation = (bodyContent !== undefined && opts.markdown) ? 'storage' : opts.representation;\n const current = await client.getPage(opts.id, 'version');\n const nextVersion = current.version.number + 1;\n const data = await client.updatePage(opts.id, {\n version: nextVersion,\n title: opts.title ?? current.title,\n body: bodyContent,\n status: opts.status,\n representation\n });\n success(data, 'confluence', 'update-page', start);\n } catch (err) {\n const hint = bodyContent ? xmlParseHint(err, bodyContent, Boolean(opts.markdown)) : null;\n if (hint) {\n const msg = err instanceof Error ? err.message : String(err);\n const status = err instanceof PncliError ? err.status : 1;\n const url = err instanceof PncliError ? err.url : undefined;\n fail(new PncliError(`${msg}\\n\\n${hint}`, status, url), 'confluence', 'update-page', start);\n } else {\n fail(err, 'confluence', 'update-page', start);\n }\n }\n });\n\n confluence.command('delete-page')\n .description('Delete a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.deletePage(opts.id);\n success({ deleted: opts.id }, 'confluence', 'delete-page', start);\n } catch (err) { fail(err, 'confluence', 'delete-page', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────────────\n\n confluence.command('list-comments')\n .description('List comments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listComments(opts.id);\n success(data, 'confluence', 'list-comments', start);\n } catch (err) { fail(err, 'confluence', 'list-comments', start); }\n });\n\n confluence.command('add-comment')\n .description('Add a comment to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--body <text>', 'Comment body (storage format HTML)')\n .option('--representation <format>', 'Body format: storage (default) or wiki', 'storage')\n .action(async (opts: { id: string; body: string; representation: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.addComment(opts.id, opts.body, opts.representation);\n success(data, 'confluence', 'add-comment', start);\n } catch (err) { fail(err, 'confluence', 'add-comment', start); }\n });\n\n // ── Labels ────────────────────────────────────────────────────────────────\n\n confluence.command('add-label')\n .description('Add labels to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--labels <names>', 'Comma-separated label names')\n .action(async (opts: { id: string; labels: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const labels = opts.labels.split(',').map(s => s.trim()).filter(Boolean);\n const data = await client.addLabel(opts.id, labels);\n success(data, 'confluence', 'add-label', start);\n } catch (err) { fail(err, 'confluence', 'add-label', start); }\n });\n\n confluence.command('remove-label')\n .description('Remove a label from a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--label <name>', 'Label name to remove')\n .action(async (opts: { id: string; label: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.removeLabel(opts.id, opts.label);\n success({ removed: opts.label, from: opts.id }, 'confluence', 'remove-label', start);\n } catch (err) { fail(err, 'confluence', 'remove-label', start); }\n });\n\n // ── Spaces ────────────────────────────────────────────────────────────────\n\n confluence.command('list-spaces')\n .description('List Confluence spaces')\n .option('--type <type>', 'Space type: global or personal')\n .option('--limit <n>', 'Max total spaces to return (default: all)')\n .action(async (opts: { type?: string; limit?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listSpaces({\n type: opts.type,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined\n });\n success(data, 'confluence', 'list-spaces', start);\n } catch (err) { fail(err, 'confluence', 'list-spaces', start); }\n });\n\n confluence.command('get-space')\n .description('Get a Confluence space by key')\n .requiredOption('--key <space-key>', 'Space key')\n .action(async (opts: { key: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getSpace(opts.key);\n success(data, 'confluence', 'get-space', start);\n } catch (err) { fail(err, 'confluence', 'get-space', start); }\n });\n\n // ── Attachments ───────────────────────────────────────────────────────────\n\n confluence.command('list-attachments')\n .description('List attachments on a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listAttachments(opts.id);\n success(data, 'confluence', 'list-attachments', start);\n } catch (err) { fail(err, 'confluence', 'list-attachments', start); }\n });\n\n confluence.command('upload-attachment')\n .description('Upload a file as an attachment to a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .requiredOption('--file <path>', 'Path to the file to upload')\n .option('--comment <text>', 'Optional comment to attach to the file version')\n .action(async (opts: { id: string; file: string; comment?: string }) => {\n const start = Date.now();\n try {\n if (!existsSync(opts.file)) throw new PncliError(`File not found: ${opts.file}`, 1);\n const client = getClient(program);\n const data = await client.uploadAttachment(opts.id, opts.file, opts.comment);\n success(data, 'confluence', 'upload-attachment', start);\n } catch (err) { fail(err, 'confluence', 'upload-attachment', start); }\n });\n\n confluence.command('download-attachment')\n .description('Download a Confluence attachment to .pncli/ (or --dir)')\n .requiredOption('--id <attachment-id>', 'Attachment content ID')\n .option('--dir <path>', 'Output directory (default: .pncli relative to cwd)')\n .action(async (opts: { id: string; dir?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const attachment = await client.getAttachment(opts.id);\n const outDir = opts.dir ?? path.join(process.cwd(), '.pncli');\n mkdirSync(outDir, { recursive: true });\n const outPath = resolveAttachmentPath(outDir, attachment.title);\n const buffer = await client.downloadAttachment(attachment);\n writeFileSync(outPath, buffer);\n success({ saved: outPath, filename: attachment.title, size: buffer.length }, 'confluence', 'download-attachment', start);\n } catch (err) { fail(err, 'confluence', 'download-attachment', start); }\n });\n\n confluence.command('delete-attachment')\n .description('Delete an attachment from Confluence by its content ID (moves it to the trash; does not permanently purge it)')\n .requiredOption('--id <attachment-id>', 'Attachment content ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n await client.deleteAttachment(opts.id);\n success({ deleted: opts.id }, 'confluence', 'delete-attachment', start);\n } catch (err) { fail(err, 'confluence', 'delete-attachment', start); }\n });\n\n // ── History ───────────────────────────────────────────────────────────────\n\n confluence.command('get-page-history')\n .description('Get the version history metadata for a Confluence page')\n .requiredOption('--id <page-id>', 'Page ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getPageHistory(opts.id);\n success(data, 'confluence', 'get-page-history', start);\n } catch (err) { fail(err, 'confluence', 'get-page-history', start); }\n });\n}\n","import { readFileSync } from 'fs';\nimport { basename } from 'path';\nimport type { HttpClient } from '../../lib/http.js';\nimport { guessMimeType } from '../../lib/mime.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n ConfluencePage,\n ConfluenceSpace,\n ConfluenceComment,\n ConfluenceLabel,\n ConfluenceAttachment,\n ConfluencePageHistory,\n ConfluencePageResponse,\n ConfluenceSearchResult\n} from '../../types/confluence.js';\n\nconst API = '/rest/api';\n\nexport interface CreatePageOpts {\n spaceKey: string;\n title: string;\n body: string;\n parentId?: string;\n representation?: string;\n}\n\nexport interface UpdatePageOpts {\n version: number;\n title: string;\n body?: string;\n status?: string;\n representation?: string;\n}\n\nexport interface ListPagesOpts {\n limit?: number;\n start?: number;\n}\n\nexport interface SearchOpts {\n limit?: number;\n start?: number;\n expand?: string;\n}\n\nexport interface ListSpacesOpts {\n type?: string;\n limit?: number;\n start?: number;\n}\n\nexport class ConfluenceClient {\n constructor(private http: HttpClient) {}\n\n async getPage(id: string, expand = 'body.storage,version,space,ancestors'): Promise<ConfluencePage> {\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n params: { expand }\n });\n }\n\n async getPageByTitle(spaceKey: string, title: string): Promise<ConfluencePage | null> {\n const result = await this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, title, expand: 'body.storage,version,space', type: 'page' }\n });\n return result.results[0] ?? null;\n }\n\n async listPages(spaceKey: string, opts: ListPagesOpts = {}): Promise<ConfluencePage[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content`, {\n params: { spaceKey, type: 'page', expand: 'version', start: initialStart + start, limit }\n });\n }, opts.limit);\n }\n\n async getPageChildren(id: string): Promise<ConfluencePage[]> {\n return this.http.confluencePaginate<ConfluencePage>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluencePage>>(`${API}/content/${id}/child/page`, {\n params: { expand: 'version', start, limit }\n });\n });\n }\n\n async getLabels(id: string): Promise<ConfluenceLabel[]> {\n return this.http.confluencePaginate<ConfluenceLabel>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${id}/label`, {\n params: { start, limit }\n });\n });\n }\n\n async search(cql: string, opts: SearchOpts = {}): Promise<ConfluenceSearchResult> {\n return this.http.confluence<ConfluenceSearchResult>(`${API}/content/search`, {\n params: {\n cql,\n start: opts.start ?? 0,\n limit: opts.limit ?? 25,\n ...(opts.expand ? { expand: opts.expand } : {})\n }\n });\n }\n\n async createPage(opts: CreatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n type: 'page',\n title: opts.title,\n space: { key: opts.spaceKey },\n ancestors: opts.parentId ? [{ id: opts.parentId }] : [],\n body: {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n }\n };\n return this.http.confluence<ConfluencePage>(`${API}/content`, {\n method: 'POST',\n body\n });\n }\n\n async updatePage(id: string, opts: UpdatePageOpts): Promise<ConfluencePage> {\n const body: Record<string, unknown> = {\n version: { number: opts.version },\n type: 'page',\n title: opts.title,\n status: opts.status ?? 'current'\n };\n if (opts.body !== undefined) {\n body.body = {\n storage: {\n value: opts.body,\n representation: opts.representation ?? 'storage'\n }\n };\n }\n return this.http.confluence<ConfluencePage>(`${API}/content/${id}`, {\n method: 'PUT',\n body\n });\n }\n\n async deletePage(id: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${id}`, { method: 'DELETE' });\n }\n\n async listComments(pageId: string): Promise<ConfluenceComment[]> {\n return this.http.confluencePaginate<ConfluenceComment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceComment>>(`${API}/content/${pageId}/child/comment`, {\n params: { expand: 'body.storage,version', start, limit }\n });\n });\n }\n\n async addComment(pageId: string, body: string, representation = 'storage'): Promise<ConfluenceComment> {\n return this.http.confluence<ConfluenceComment>(`${API}/content`, {\n method: 'POST',\n body: {\n type: 'comment',\n container: { id: pageId, type: 'page' },\n body: {\n storage: { value: body, representation }\n }\n }\n });\n }\n\n async addLabel(pageId: string, labels: string[]): Promise<ConfluenceLabel[]> {\n const body = labels.map(name => ({ prefix: 'global', name }));\n const result = await this.http.confluence<ConfluencePageResponse<ConfluenceLabel>>(`${API}/content/${pageId}/label`, {\n method: 'POST',\n body\n });\n return result.results;\n }\n\n async removeLabel(pageId: string, label: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${pageId}/label/${label}`, { method: 'DELETE' });\n }\n\n async listSpaces(opts: ListSpacesOpts = {}): Promise<ConfluenceSpace[]> {\n const initialStart = opts.start ?? 0;\n return this.http.confluencePaginate<ConfluenceSpace>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceSpace>>(`${API}/space`, {\n params: {\n start: initialStart + start,\n limit,\n ...(opts.type ? { type: opts.type } : {})\n }\n });\n }, opts.limit);\n }\n\n async getSpace(key: string): Promise<ConfluenceSpace> {\n return this.http.confluence<ConfluenceSpace>(`${API}/space/${key}`, {\n params: { expand: 'description.plain' }\n });\n }\n\n async listAttachments(pageId: string): Promise<ConfluenceAttachment[]> {\n return this.http.confluencePaginate<ConfluenceAttachment>(async (start, limit) => {\n return this.http.confluence<ConfluencePageResponse<ConfluenceAttachment>>(`${API}/content/${pageId}/child/attachment`, {\n params: { start, limit }\n });\n });\n }\n\n async uploadAttachment(pageId: string, filePath: string, comment?: string): Promise<ConfluenceAttachment[]> {\n const fileContent = readFileSync(filePath);\n const fileName = basename(filePath);\n const mimeType = guessMimeType(filePath);\n const formData = new FormData();\n formData.append('file', new Blob([fileContent], { type: mimeType }), fileName);\n if (comment) formData.append('comment', comment);\n const result = await this.http.confluenceUpload<ConfluencePageResponse<ConfluenceAttachment>>(\n `${API}/content/${pageId}/child/attachment`,\n formData\n );\n return result.results;\n }\n\n async getAttachment(attachmentId: string): Promise<ConfluenceAttachment> {\n return this.http.confluence<ConfluenceAttachment>(`${API}/content/${attachmentId}`);\n }\n\n async downloadAttachment(attachment: ConfluenceAttachment): Promise<Buffer> {\n // `/rest/api/content/{id}` resolves any content type, so a page ID here returns\n // a page with no download link. The declared type says `download` is required,\n // so TS won't catch it — without this guard buildUrl gets undefined and throws\n // a bare TypeError instead of a PncliError with a usable exit code.\n const downloadPath = attachment._links.download;\n if (!downloadPath) {\n throw new PncliError(\n `Content ${attachment.id} has no download link — is it an attachment? (title: ${attachment.title})`,\n 1\n );\n }\n return this.http.confluenceBuffer(downloadPath);\n }\n\n async deleteAttachment(attachmentId: string): Promise<void> {\n return this.http.confluence<void>(`${API}/content/${attachmentId}`, { method: 'DELETE' });\n }\n\n async getPageHistory(id: string): Promise<ConfluencePageHistory> {\n return this.http.confluence<ConfluencePageHistory>(`${API}/content/${id}/history`);\n }\n\n async convertToStorage(value: string, fromRepresentation = 'markdown'): Promise<string> {\n const result = await this.http.confluence<{ value: string; representation: string }>(\n `${API}/contentbody/convert/storage`,\n {\n method: 'POST',\n body: { value, representation: fromRepresentation }\n }\n );\n return result.value;\n }\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SonarSystemStatus,\n SonarQualityGateStatus,\n SonarIssuesResponse,\n SonarIssue,\n SonarMeasuresComponent,\n SonarProjectsResponse,\n SonarProject,\n SonarHotspotsResponse,\n SonarHotspot\n} from '../../types/sonar.js';\n\nconst API = '/api';\n\nexport interface SearchIssuesOpts {\n projectKey: string;\n severities?: string;\n types?: string;\n statuses?: string;\n branch?: string;\n resolved?: boolean;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchHotspotsOpts {\n projectKey: string;\n status?: string;\n resolution?: string;\n branch?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface SearchProjectsOpts {\n query?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface GetMeasuresOpts {\n projectKey: string;\n metricKeys: string;\n branch?: string;\n}\n\nexport class SonarClient {\n constructor(private http: HttpClient) {}\n\n async getStatus(): Promise<SonarSystemStatus> {\n return this.http.sonar<SonarSystemStatus>(`${API}/system/status`);\n }\n\n async getQualityGate(projectKey: string, branch?: string): Promise<SonarQualityGateStatus> {\n return this.http.sonar<SonarQualityGateStatus>(`${API}/qualitygates/project_status`, {\n params: { projectKey, ...(branch ? { branch } : {}) }\n });\n }\n\n async searchIssues(opts: SearchIssuesOpts): Promise<SonarIssuesResponse> {\n return this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllIssues(opts: SearchIssuesOpts): Promise<SonarIssue[]> {\n return this.http.sonarPaginate<SonarIssue>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarIssuesResponse>(`${API}/issues/search`, {\n params: {\n componentKeys: opts.projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? String(opts.resolved) : undefined,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.total, p: resp.p, ps: resp.ps, items: resp.issues };\n });\n }\n\n async getMeasures(opts: GetMeasuresOpts): Promise<SonarMeasuresComponent> {\n return this.http.sonar<SonarMeasuresComponent>(`${API}/measures/component`, {\n params: {\n component: opts.projectKey,\n metricKeys: opts.metricKeys,\n ...(opts.branch ? { branch: opts.branch } : {})\n }\n });\n }\n\n async searchProjects(opts: SearchProjectsOpts = {}): Promise<SonarProjectsResponse> {\n return this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: {\n q: opts.query,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllProjects(query?: string): Promise<SonarProject[]> {\n return this.http.sonarPaginate<SonarProject>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarProjectsResponse>(`${API}/projects/search`, {\n params: { q: query, p: page, ps: pageSize }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.components };\n });\n }\n\n async searchHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspotsResponse> {\n return this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: opts.page ?? 1,\n ps: opts.pageSize ?? 100\n }\n });\n }\n\n async searchAllHotspots(opts: SearchHotspotsOpts): Promise<SonarHotspot[]> {\n return this.http.sonarPaginate<SonarHotspot>(async (page, pageSize) => {\n const resp = await this.http.sonar<SonarHotspotsResponse>(`${API}/hotspots/search`, {\n params: {\n projectKey: opts.projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch,\n p: page,\n ps: pageSize\n }\n });\n return { total: resp.paging.total, p: resp.paging.pageIndex, ps: resp.paging.pageSize, items: resp.hotspots };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SonarClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nconst DEFAULT_METRICS = 'coverage,duplicated_lines_density,bugs,vulnerabilities,code_smells,sqale_rating,reliability_rating,security_rating,ncloc';\n\nfunction getClient(program: Command): { client: SonarClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sonar.baseUrl) throw new PncliError('SonarQube not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SonarClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): string {\n const project = cliProject ?? config.defaults.sonar.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sonar.project in config.');\n return project;\n}\n\nexport function registerSonarCommands(program: Command): void {\n const sonar = program.command('sonar').description('SonarQube Server operations');\n\n // ── Quality Gate ─────────────────────────────────────────────────────────\n\n sonar.command('quality-gate')\n .description('Get quality gate status for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getQualityGate(projectKey, opts.branch);\n success(data, 'sonar', 'quality-gate', start);\n } catch (err) { fail(err, 'sonar', 'quality-gate', start); }\n });\n\n // ── Issues ────────────────────────────────────────────────────────────────\n\n sonar.command('issues')\n .description('Search/list issues for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--severities <list>', 'Filter by severity: BLOCKER,CRITICAL,MAJOR,MINOR,INFO (comma-separated)')\n .option('--types <list>', 'Filter by type: BUG,VULNERABILITY,CODE_SMELL (comma-separated)')\n .option('--statuses <list>', 'Filter by status: OPEN,CONFIRMED,REOPENED,RESOLVED,CLOSED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--resolved <bool>', 'Filter resolved issues: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page (max 500)', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results; ignores --page/--page-size)')\n .action(async (opts: { project?: string; severities?: string; types?: string; statuses?: string; branch?: string; resolved?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n severities: opts.severities,\n types: opts.types,\n statuses: opts.statuses,\n branch: opts.branch,\n resolved: opts.resolved !== undefined ? opts.resolved === 'true' : undefined\n };\n if (opts.all) {\n const data = await client.searchAllIssues(baseOpts);\n success(data, 'sonar', 'issues', start);\n } else {\n const data = await client.searchIssues({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'issues', start);\n }\n } catch (err) { fail(err, 'sonar', 'issues', start); }\n });\n\n // ── Measures ──────────────────────────────────────────────────────────────\n\n sonar.command('measures')\n .description('Get key metrics for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--metrics <list>', 'Comma-separated metric keys', DEFAULT_METRICS)\n .option('--branch <name>', 'Branch name')\n .action(async (opts: { project?: string; metrics: string; branch?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const data = await client.getMeasures({\n projectKey,\n metricKeys: opts.metrics,\n branch: opts.branch\n });\n success(data, 'sonar', 'measures', start);\n } catch (err) { fail(err, 'sonar', 'measures', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sonar.command('projects')\n .description('Search/list projects')\n .option('--query <text>', 'Search query')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { query?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n if (opts.all) {\n const data = await client.searchAllProjects(opts.query);\n success(data, 'sonar', 'projects', start);\n } else {\n const data = await client.searchProjects({\n query: opts.query,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'projects', start);\n }\n } catch (err) { fail(err, 'sonar', 'projects', start); }\n });\n\n // ── Hotspots ──────────────────────────────────────────────────────────────\n\n sonar.command('hotspots')\n .description('List security hotspots for a project')\n .option('--project <key>', 'SonarQube project key (or set defaults.sonar.project in config)')\n .option('--status <status>', 'Filter: TO_REVIEW or REVIEWED')\n .option('--resolution <list>', 'Filter: FIXED,SAFE,ACKNOWLEDGED (comma-separated)')\n .option('--branch <name>', 'Branch name')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; status?: string; resolution?: string; branch?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectKey = resolveProject(config, opts.project);\n const baseOpts = {\n projectKey,\n status: opts.status,\n resolution: opts.resolution,\n branch: opts.branch\n };\n if (opts.all) {\n const data = await client.searchAllHotspots(baseOpts);\n success(data, 'sonar', 'hotspots', start);\n } else {\n const data = await client.searchHotspots({\n ...baseOpts,\n page: parseInt(opts.page, 10),\n pageSize: parseInt(opts.pageSize, 10)\n });\n success(data, 'sonar', 'hotspots', start);\n }\n } catch (err) { fail(err, 'sonar', 'hotspots', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n SdeServerInfo,\n SdeUser,\n SdeProject,\n SdeTask,\n SdeThreat,\n SdePaginatedResponse\n} from '../../types/sde.js';\n\nconst API = '/api/v2';\n\nexport interface ListProjectsOpts {\n name?: string;\n slug?: string;\n search?: string;\n active?: string;\n ordering?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListTasksOpts {\n projectId: number;\n phase?: string;\n priority?: string;\n status?: string;\n assignedTo?: string;\n source?: string;\n verification?: string;\n tag?: string;\n accepted?: string;\n relevant?: string;\n expand?: string;\n include?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListThreatsOpts {\n projectId: number;\n severity?: string;\n title?: string;\n threatId?: string;\n capecId?: string;\n componentId?: string;\n search?: string;\n ordering?: string;\n page?: number;\n pageSize?: number;\n}\n\nexport interface ListUsersOpts {\n email?: string;\n firstName?: string;\n lastName?: string;\n isActive?: string;\n page?: number;\n pageSize?: number;\n}\n\nfunction projectParams(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n name: opts.name,\n slug: opts.slug,\n search: opts.search,\n active: opts.active,\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction taskParams(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assigned_to: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include,\n page,\n page_size: pageSize\n };\n}\n\nfunction threatParams(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n severity: opts.severity,\n title: opts.title,\n threat_id: opts.threatId,\n capec_id: opts.capecId,\n component_id: opts.componentId,\n search: opts.search,\n ordering: opts.ordering,\n page,\n page_size: pageSize\n };\n}\n\nfunction userParams(opts: Omit<ListUsersOpts, 'page' | 'pageSize'>, page: number, pageSize: number) {\n return {\n email: opts.email,\n first_name: opts.firstName,\n last_name: opts.lastName,\n is_active: opts.isActive,\n page,\n page_size: pageSize\n };\n}\n\nexport class SdeClient {\n constructor(private http: HttpClient) {}\n\n async getServerInfo(): Promise<SdeServerInfo> {\n return this.http.sde<SdeServerInfo>(`${API}/server-info/`);\n }\n\n async getMe(): Promise<SdeUser> {\n return this.http.sde<SdeUser>(`${API}/users/me/`);\n }\n\n async getProject(projectId: number, expand?: string, include?: string): Promise<SdeProject> {\n return this.http.sde<SdeProject>(`${API}/projects/${projectId}/`, {\n params: { expand, include }\n });\n }\n\n async getTask(projectId: number, taskId: string, expand?: string, include?: string): Promise<SdeTask> {\n return this.http.sde<SdeTask>(`${API}/projects/${projectId}/tasks/${taskId}/`, {\n params: { expand, include }\n });\n }\n\n async listProjects(opts: ListProjectsOpts = {}): Promise<SdePaginatedResponse<SdeProject>> {\n return this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllProjects(opts: Omit<ListProjectsOpts, 'page' | 'pageSize'> = {}): Promise<SdeProject[]> {\n return this.http.sdePaginate<SdeProject>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeProject>>(`${API}/projects/`, {\n params: projectParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listTasks(opts: ListTasksOpts): Promise<SdePaginatedResponse<SdeTask>> {\n return this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllTasks(opts: Omit<ListTasksOpts, 'page' | 'pageSize'>): Promise<SdeTask[]> {\n return this.http.sdePaginate<SdeTask>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeTask>>(`${API}/projects/${opts.projectId}/tasks/`, {\n params: taskParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listThreats(opts: ListThreatsOpts): Promise<SdePaginatedResponse<SdeThreat>> {\n return this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllThreats(opts: Omit<ListThreatsOpts, 'page' | 'pageSize'>): Promise<SdeThreat[]> {\n return this.http.sdePaginate<SdeThreat>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeThreat>>(`${API}/projects/${opts.projectId}/threats/`, {\n params: threatParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n\n async listUsers(opts: ListUsersOpts = {}): Promise<SdePaginatedResponse<SdeUser>> {\n return this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, opts.page ?? 1, opts.pageSize ?? 100)\n });\n }\n\n async listAllUsers(opts: Omit<ListUsersOpts, 'page' | 'pageSize'> = {}): Promise<SdeUser[]> {\n return this.http.sdePaginate<SdeUser>(async (page, pageSize) => {\n const resp = await this.http.sde<SdePaginatedResponse<SdeUser>>(`${API}/users/`, {\n params: userParams(opts, page, pageSize)\n });\n return { count: resp.count, results: resp.results };\n });\n }\n}\n","import { Command } from 'commander';\nimport { SdeClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): { client: SdeClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.sde.baseUrl) throw new PncliError('SDElements not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { client: new SdeClient(http), config };\n}\n\nfunction resolveProject(config: ReturnType<typeof loadConfig>, cliProject?: string): number {\n const project = cliProject ?? config.defaults.sde.project;\n if (!project) throw new PncliError('No project specified. Use --project or set defaults.sde.project in config.');\n if (!/^\\d+$/.test(project)) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n const id = parseInt(project, 10);\n if (id <= 0) throw new PncliError(`Invalid project ID: \"${project}\". SDElements project IDs must be positive integers.`);\n return id;\n}\n\nfunction parsePage(val: string, flag: string): number {\n const n = parseInt(val, 10);\n if (isNaN(n) || n < 1) throw new PncliError(`Invalid ${flag}: \"${val}\". Must be a positive integer.`);\n return n;\n}\n\nfunction validateActive(val: string | undefined, allowed: string[]): string | undefined {\n if (val === undefined) return undefined;\n if (!allowed.includes(val)) {\n throw new PncliError(`Invalid --active value: \"${val}\". Allowed: ${allowed.join(', ')}.`);\n }\n return val;\n}\n\nexport function registerSdeCommands(program: Command): void {\n const sde = program.command('sde').description('SDElements operations (threat modeling, countermeasures, compliance)');\n\n // ── Server Info ───────────────────────────────────────────────────────────\n\n sde.command('server-info')\n .description('Get server version and platform info (requires super-user)')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getServerInfo();\n success(data, 'sde', 'server-info', start);\n } catch (err) { fail(err, 'sde', 'server-info', start); }\n });\n\n // ── Whoami ────────────────────────────────────────────────────────────────\n\n sde.command('whoami')\n .description('Get current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const data = await client.getMe();\n success(data, 'sde', 'whoami', start);\n } catch (err) { fail(err, 'sde', 'whoami', start); }\n });\n\n // ── Users ─────────────────────────────────────────────────────────────────\n\n sde.command('users')\n .description('List users')\n .option('--email <email>', 'Filter by email address')\n .option('--first-name <name>', 'Filter by first name')\n .option('--last-name <name>', 'Filter by last name')\n .option('--active <bool>', 'Filter by active status: true or false')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { email?: string; firstName?: string; lastName?: string; active?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n email: opts.email,\n firstName: opts.firstName,\n lastName: opts.lastName,\n isActive: validateActive(opts.active, ['true', 'false'])\n };\n if (opts.all) {\n const data = await client.listAllUsers(baseOpts);\n success(data, 'sde', 'users', start);\n } else {\n const data = await client.listUsers({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'users', start);\n }\n } catch (err) { fail(err, 'sde', 'users', start); }\n });\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n sde.command('projects')\n .description('List projects')\n .option('--name <name>', 'Filter by project name')\n .option('--search <text>', 'Text search on name and profile')\n .option('--active <val>', 'Filter by active status: true, false, or all')\n .option('--ordering <field>', 'Sort by: name, created, updated (prefix with - for descending)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { name?: string; search?: string; active?: string; ordering?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const baseOpts = {\n name: opts.name,\n search: opts.search,\n active: validateActive(opts.active, ['true', 'false', 'all']),\n ordering: opts.ordering,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllProjects(baseOpts);\n success(data, 'sde', 'projects', start);\n } else {\n const data = await client.listProjects({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'projects', start);\n }\n } catch (err) { fail(err, 'sde', 'projects', start); }\n });\n\n // ── Project ───────────────────────────────────────────────────────────────\n\n sde.command('project')\n .description('Get a single project by ID')\n .option('--id <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): application,business_unit,creator')\n .option('--include <fields>', 'Include extra fields (comma-separated): task_counts,permissions')\n .action(async (opts: { id?: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.id);\n const data = await client.getProject(projectId, opts.expand, opts.include);\n success(data, 'sde', 'project', start);\n } catch (err) { fail(err, 'sde', 'project', start); }\n });\n\n // ── Tasks ─────────────────────────────────────────────────────────────────\n\n sde.command('tasks')\n .description('List countermeasures for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--phase <slug>', 'Filter by phase slug (e.g. development, architecture-design)')\n .option('--priority <n>', 'Filter by priority (1-10)')\n .option('--status <id>', 'Filter by status ID (e.g. TS1, TS2)')\n .option('--assigned-to <email>', 'Filter by assignee email')\n .option('--source <val>', 'Filter by source: default, custom, manual, project')\n .option('--verification <val>', 'Filter by verification: pass, fail, partial, none')\n .option('--tag <name>', 'Filter by tag name')\n .option('--accepted <bool>', 'Filter by accepted status: true or false')\n .option('--relevant <bool>', 'Filter by relevant status: true or false')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references,regulation_sections')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; phase?: string; priority?: string; status?: string; assignedTo?: string; source?: string; verification?: string; tag?: string; accepted?: string; relevant?: string; expand?: string; include?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n phase: opts.phase,\n priority: opts.priority,\n status: opts.status,\n assignedTo: opts.assignedTo,\n source: opts.source,\n verification: opts.verification,\n tag: opts.tag,\n accepted: opts.accepted,\n relevant: opts.relevant,\n expand: opts.expand,\n include: opts.include\n };\n if (opts.all) {\n const data = await client.listAllTasks(baseOpts);\n success(data, 'sde', 'tasks', start);\n } else {\n const data = await client.listTasks({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'tasks', start);\n }\n } catch (err) { fail(err, 'sde', 'tasks', start); }\n });\n\n // ── Task ──────────────────────────────────────────────────────────────────\n\n sde.command('task')\n .description('Get a single countermeasure')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .requiredOption('--task <id>', 'Task ID (e.g. T21)')\n .option('--expand <fields>', 'Expand nested fields (comma-separated): status,phase,problem,text')\n .option('--include <fields>', 'Include extra fields (comma-separated): how_tos,last_note,references')\n .action(async (opts: { project?: string; task: string; expand?: string; include?: string }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const data = await client.getTask(projectId, opts.task, opts.expand, opts.include);\n success(data, 'sde', 'task', start);\n } catch (err) { fail(err, 'sde', 'task', start); }\n });\n\n // ── Threats ───────────────────────────────────────────────────────────────\n\n sde.command('threats')\n .description('List threats for a project')\n .option('--project <id>', 'Project ID (or set defaults.sde.project in config)')\n .option('--severity <n>', 'Filter by severity (1-10)')\n .option('--search <text>', 'Full-text search on title and threat ID')\n .option('--ordering <field>', 'Sort by: threat__severity, threat_id, status (prefix - for descending)')\n .option('--capec-id <id>', 'Filter by CAPEC attack pattern ID')\n .option('--component-id <id>', 'Filter by component ID')\n .option('--page <n>', 'Page number (1-based)', '1')\n .option('--page-size <n>', 'Results per page', '100')\n .option('--all', 'Fetch all pages (consider --output-file for large results)')\n .action(async (opts: { project?: string; severity?: string; search?: string; ordering?: string; capecId?: string; componentId?: string; page: string; pageSize: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const projectId = resolveProject(config, opts.project);\n const baseOpts = {\n projectId,\n severity: opts.severity,\n search: opts.search,\n ordering: opts.ordering,\n capecId: opts.capecId,\n componentId: opts.componentId\n };\n if (opts.all) {\n const data = await client.listAllThreats(baseOpts);\n success(data, 'sde', 'threats', start);\n } else {\n const data = await client.listThreats({\n ...baseOpts,\n page: parsePage(opts.page, '--page'),\n pageSize: parsePage(opts.pageSize, '--page-size')\n });\n success(data, 'sde', 'threats', start);\n }\n } catch (err) { fail(err, 'sde', 'threats', start); }\n });\n}\n","import { Command, Option } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { loadConfig } from '../../lib/config.js';\nimport type { ScanOptions, Ecosystem, FriskSource } from './types.js';\nimport { runScan } from './scan.js';\nimport { runDiff } from './diff.js';\nimport { runFrisk } from './frisk.js';\nimport { runOutdated } from './outdated.js';\nimport { runLicenseCheck } from './license-check.js';\nimport { buildConnectivityData } from './connectivity.js';\n\nexport function registerDepsCommands(program: Command): void {\n const deps = program\n .command('deps')\n .description('Dependency scanning, CVE detection, and license auditing');\n\n // ─── frisk (primary) ────────────────────────────────────────────────────────\n\n deps\n .command('frisk')\n .description('Scan all dependencies for CVEs and output remediation paths (requires OSV.dev, Sonatype OSS Index, or Sonatype IQ Server)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--direct-only', 'Only scan direct dependencies (default: include transitive)', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .addOption(new Option('--source <source>', 'Vulnerability source').choices(['osv', 'sonatype', 'sonatypeiq', 'all']).default('osv'))\n .option('--application-id <id>', 'Sonatype IQ Server application ID (required when --source sonatypeiq)')\n .action(async (opts: { ecosystem: string; directOnly: boolean; includeDev: boolean; source: string; applicationId?: string }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: !opts.directOnly,\n includeDev: opts.includeDev\n };\n const data = await runFrisk(config, scanOpts, opts.source as FriskSource, opts.applicationId);\n success(data, 'deps', 'frisk', startTime);\n } catch (err) {\n fail(err, 'deps', 'frisk', startTime);\n }\n });\n\n // ─── scan ───────────────────────────────────────────────────────────────────\n\n deps\n .command('scan')\n .description('Inventory all dependencies from manifest files (local only, no network)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-transitive', 'Include transitive dependencies', false)\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { ecosystem: string; includeTransitive: boolean; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: opts.includeTransitive,\n includeDev: opts.includeDev\n };\n const data = runScan(config, scanOpts);\n success(data, 'deps', 'scan', startTime);\n } catch (err) {\n fail(err, 'deps', 'scan', startTime);\n }\n });\n\n // ─── diff ───────────────────────────────────────────────────────────────────\n\n deps\n .command('diff')\n .description('Show dependency changes between two git refs (local only, no network)')\n .requiredOption('--from <ref>', 'Base git ref (commit, tag, or branch)')\n .option('--to <ref>', 'Target git ref (default: working tree)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action((opts: { from: string; to?: string; ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeTransitive: true,\n includeDev: opts.includeDev\n };\n const data = runDiff(config, opts.from, opts.to ?? null, scanOpts);\n success(data, 'deps', 'diff', startTime);\n } catch (err) {\n fail(err, 'deps', 'diff', startTime);\n }\n });\n\n // ─── outdated ───────────────────────────────────────────────────────────────\n\n deps\n .command('outdated')\n .description('Check for newer versions available in Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--major', 'Only show major version bumps')\n .option('--minor', 'Only show minor version bumps or higher')\n .option('--patch', 'Only show patch version bumps or higher')\n .action(async (opts: { ecosystem: string; major?: boolean; minor?: boolean; patch?: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = { ecosystem: opts.ecosystem as Ecosystem | 'all' };\n const filterType = opts.major ? 'major' : opts.minor ? 'minor' : opts.patch ? 'patch' : undefined;\n const data = await runOutdated(config, scanOpts, filterType);\n success(data, 'deps', 'outdated', startTime);\n } catch (err) {\n fail(err, 'deps', 'outdated', startTime);\n }\n });\n\n // ─── license-check ──────────────────────────────────────────────────────────\n\n deps\n .command('license-check')\n .description('Report licenses for all direct dependencies via Artifactory (requires Artifactory)')\n .option('--ecosystem <ecosystem>', 'Filter to one ecosystem: npm, nuget, maven, all', 'all')\n .option('--include-dev', 'Include dev/test dependencies', false)\n .action(async (opts: { ecosystem: string; includeDev: boolean }, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const scanOpts: ScanOptions = {\n ecosystem: opts.ecosystem as Ecosystem | 'all',\n includeDev: opts.includeDev\n };\n const data = await runLicenseCheck(config, scanOpts);\n success(data, 'deps', 'license-check', startTime);\n } catch (err) {\n fail(err, 'deps', 'license-check', startTime);\n }\n });\n\n // ─── connectivity ───────────────────────────────────────────────────────────\n\n deps\n .command('connectivity')\n .description('Test network access to Artifactory, OSV.dev, and Sonatype OSS Index, report available tier')\n .action(async (_opts: unknown, cmd: Command) => {\n const startTime = Date.now();\n try {\n const globalOpts = cmd.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config as string | undefined });\n const data = await buildConnectivityData(config);\n success(data, 'deps', 'connectivity', startTime);\n } catch (err) {\n fail(err, 'deps', 'connectivity', startTime);\n }\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execSync, execFileSync } from 'child_process';\nimport type { Package, ManifestInfo, ScanOptions, ScanData, Ecosystem } from '../types.js';\nimport { findNpmManifests, parseNpmPackages } from './npm.js';\nimport { findNugetManifests, parseNugetPackages } from './nuget.js';\nimport { findMavenManifests, parseMavenPackages } from './maven.js';\n\nfunction getRepoFiles(repoRoot: string): string[] {\n try {\n const out = execSync('git ls-files --cached --others --exclude-standard', {\n encoding: 'utf8',\n cwd: repoRoot,\n maxBuffer: 10 * 1024 * 1024\n });\n return out.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\nfunction readFile(repoRoot: string, relPath: string): string | null {\n try {\n return fs.readFileSync(path.join(repoRoot, relPath), 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction readFileAtRef(repoRoot: string, ref: string, relPath: string): string | null {\n try {\n return execFileSync('git', ['show', `${ref}:${relPath}`], {\n encoding: 'utf8',\n cwd: repoRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n });\n } catch {\n return null;\n }\n}\n\nfunction findPropsContent(\n manifestFile: string,\n readFn: (relPath: string) => string | null\n): string | null {\n // Walk up from the manifest directory to the repo root looking for Directory.Packages.props\n let dir = path.dirname(manifestFile);\n for (let depth = 0; depth < 10; depth++) {\n const candidate = dir === '.' ? 'Directory.Packages.props' : `${dir}/Directory.Packages.props`;\n const content = readFn(candidate);\n if (content) return content;\n if (dir === '.') break;\n dir = path.dirname(dir);\n }\n return null;\n}\n\nfunction parseManifests(\n manifests: ManifestInfo[],\n opts: ScanOptions,\n readFn: (relPath: string) => string | null\n): Package[] {\n const allPackages: Package[] = [];\n const seen = new Set<string>();\n\n for (const manifest of manifests) {\n const content = readFn(manifest.file);\n if (!content) continue;\n\n const lockContent = manifest.lockFile ? readFn(manifest.lockFile) ?? undefined : undefined;\n\n let pkgs: Package[] = [];\n\n if (manifest.ecosystem === 'npm') {\n pkgs = parseNpmPackages(content, manifest, opts, lockContent);\n } else if (manifest.ecosystem === 'nuget') {\n // Walk up from the manifest's directory to find the nearest Directory.Packages.props\n const propsContent = findPropsContent(manifest.file, readFn) ?? undefined;\n pkgs = parseNugetPackages(content, manifest, opts, lockContent, propsContent);\n } else if (manifest.ecosystem === 'maven') {\n pkgs = parseMavenPackages(content, manifest, opts, lockContent);\n }\n\n for (const pkg of pkgs) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}:${pkg.source}`;\n if (!seen.has(key)) {\n seen.add(key);\n allPackages.push(pkg);\n }\n }\n }\n\n return allPackages;\n}\n\nexport function scanRepo(repoRoot: string, opts: ScanOptions = {}): ScanData {\n const files = getRepoFiles(repoRoot);\n const eco = opts.ecosystem ?? 'all';\n\n const npmManifests = eco === 'all' || eco === 'npm' ? findNpmManifests(files) : [];\n const nugetManifests = eco === 'all' || eco === 'nuget' ? findNugetManifests(files) : [];\n const mavenManifests = eco === 'all' || eco === 'maven' ? findMavenManifests(files) : [];\n\n const manifests = [...npmManifests, ...nugetManifests, ...mavenManifests];\n const packages = parseManifests(manifests, opts, rel => readFile(repoRoot, rel));\n\n return buildScanData(manifests, packages);\n}\n\nexport function scanRepoAtRef(repoRoot: string, ref: string, opts: ScanOptions = {}): ScanData {\n const eco = opts.ecosystem ?? 'all';\n\n // Get file list at that ref\n let files: string[] = [];\n try {\n const out = execFileSync('git', ['ls-tree', '-r', '--name-only', ref], {\n encoding: 'utf8',\n cwd: repoRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n });\n files = out.trim().split('\\n').filter(Boolean);\n } catch {\n return buildScanData([], []);\n }\n\n const npmManifests = eco === 'all' || eco === 'npm' ? findNpmManifests(files) : [];\n const nugetManifests = eco === 'all' || eco === 'nuget' ? findNugetManifests(files) : [];\n const mavenManifests = eco === 'all' || eco === 'maven' ? findMavenManifests(files) : [];\n\n const manifests = [...npmManifests, ...nugetManifests, ...mavenManifests];\n const packages = parseManifests(manifests, opts, rel => readFileAtRef(repoRoot, ref, rel));\n\n return buildScanData(manifests, packages);\n}\n\nfunction buildScanData(manifests: ManifestInfo[], packages: Package[]): ScanData {\n const ecosystemSet = new Set<Ecosystem>(manifests.map(m => m.ecosystem));\n const byEcosystem: Record<string, number> = {};\n const byType: Record<string, number> = { direct: 0, transitive: 0 };\n const byScope: Record<string, number> = { production: 0, dev: 0 };\n\n for (const pkg of packages) {\n byEcosystem[pkg.ecosystem] = (byEcosystem[pkg.ecosystem] ?? 0) + 1;\n byType[pkg.type] = (byType[pkg.type] ?? 0) + 1;\n byScope[pkg.scope] = (byScope[pkg.scope] ?? 0) + 1;\n }\n\n return {\n ecosystems: Array.from(ecosystemSet),\n manifests,\n packages,\n summary: {\n totalPackages: packages.length,\n byEcosystem,\n byType,\n byScope\n }\n };\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\ninterface PackageLockV2Meta {\n version?: string;\n dev?: boolean;\n devOptional?: boolean;\n}\n\ninterface PackageLockV2 {\n lockfileVersion?: number;\n packages?: Record<string, PackageLockV2Meta>;\n}\n\nexport function findNpmManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Set(\n files.filter(f => {\n const base = path.basename(f);\n return base === 'package-lock.json' || base === 'yarn.lock' || base === 'pnpm-lock.yaml';\n })\n );\n\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n if (path.basename(file) !== 'package.json') continue;\n if (file.split('/').includes('node_modules')) continue;\n\n const dir = path.dirname(file);\n let lockFile: string | undefined;\n\n for (const lf of ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml']) {\n const candidate = dir === '.' ? lf : `${dir}/${lf}`;\n if (lockFiles.has(candidate)) {\n lockFile = candidate;\n break;\n }\n }\n\n manifests.push({ file, ecosystem: 'npm', lockFile });\n }\n\n return manifests;\n}\n\nexport function parseNpmPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string\n): Package[] {\n if (lockContent && manifest.lockFile) {\n const base = path.basename(manifest.lockFile);\n if (base === 'package-lock.json') {\n const pkgs = parsePackageLock(lockContent, manifest.lockFile, opts);\n if (pkgs.length > 0) return pkgs;\n } else if (base === 'yarn.lock') {\n return parseYarnLock(lockContent, manifest.lockFile, opts, content);\n } else if (base === 'pnpm-lock.yaml') {\n return parsePnpmLock(lockContent, manifest.lockFile, opts, content);\n }\n }\n return parsePackageJson(content, manifest.file, opts);\n}\n\nfunction stripVersionPrefix(v: string): string {\n return v.replace(/^[\\^~>=<* ]+/, '').split(/\\s/)[0] ?? v;\n}\n\nfunction parsePackageJson(content: string, filePath: string, opts: ScanOptions): Package[] {\n let pkg: PackageJson;\n try {\n pkg = JSON.parse(content) as PackageJson;\n } catch {\n return [];\n }\n\n const packages: Package[] = [];\n\n for (const [name, version] of Object.entries(pkg.dependencies ?? {})) {\n packages.push({\n name,\n version: stripVersionPrefix(version),\n ecosystem: 'npm',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n\n if (opts.includeDev) {\n for (const [name, version] of Object.entries(pkg.devDependencies ?? {})) {\n packages.push({\n name,\n version: stripVersionPrefix(version),\n ecosystem: 'npm',\n source: filePath,\n type: 'direct',\n scope: 'dev'\n });\n }\n }\n\n return packages;\n}\n\nfunction parsePackageLock(content: string, lockFilePath: string, opts: ScanOptions): Package[] {\n let lock: PackageLockV2;\n try {\n lock = JSON.parse(content) as PackageLockV2;\n } catch {\n return [];\n }\n\n if ((lock.lockfileVersion ?? 1) < 2 || !lock.packages) return [];\n\n const packages: Package[] = [];\n\n for (const [pkgPath, meta] of Object.entries(lock.packages)) {\n if (pkgPath === '') continue;\n if (!meta.version) continue;\n\n const isDev = meta.dev === true || meta.devOptional === true;\n if (isDev && !opts.includeDev) continue;\n\n // node_modules/express → direct\n // node_modules/express/node_modules/qs → transitive\n const withoutRoot = pkgPath.startsWith('node_modules/')\n ? pkgPath.slice('node_modules/'.length)\n : pkgPath;\n const segments = withoutRoot.split('/node_modules/');\n const isTransitive = segments.length > 1;\n if (isTransitive && !opts.includeTransitive) continue;\n\n const name = segments[segments.length - 1] ?? pkgPath;\n\n packages.push({\n name,\n version: meta.version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parseYarnLock(\n content: string,\n lockFilePath: string,\n opts: ScanOptions,\n packageJsonContent: string\n): Package[] {\n let pkgJson: PackageJson;\n try {\n pkgJson = JSON.parse(packageJsonContent) as PackageJson;\n } catch {\n pkgJson = {};\n }\n\n const directDeps = new Set(Object.keys(pkgJson.dependencies ?? {}));\n const devDeps = new Set(Object.keys(pkgJson.devDependencies ?? {}));\n const allDirectDeps = new Set([...directDeps, ...devDeps]);\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // Matches both plain and scoped packages:\n // express@^4.21.0: → express\n // \"@types/node@^18.0.0\": → @types/node\n // version \"4.21.0\"\n const blockRegex = /^\"?(@?[^@\"\\n][^\"\\n]*)@[^:]+:?\\n\\s+version \"([^\"]+)\"/gm;\n\n for (const match of content.matchAll(blockRegex)) {\n const name = match[1].trim().replace(/^\"|\"$/g, '');\n const version = match[2];\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const isDev = devDeps.has(name) && !directDeps.has(name);\n if (isDev && !opts.includeDev) continue;\n\n const isTransitive = !allDirectDeps.has(name);\n if (isTransitive && !opts.includeTransitive) continue;\n\n packages.push({\n name,\n version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parsePnpmLock(\n content: string,\n lockFilePath: string,\n opts: ScanOptions,\n packageJsonContent: string\n): Package[] {\n let pkgJson: PackageJson;\n try {\n pkgJson = JSON.parse(packageJsonContent) as PackageJson;\n } catch {\n pkgJson = {};\n }\n\n const directDeps = new Set(Object.keys(pkgJson.dependencies ?? {}));\n const devDeps = new Set(Object.keys(pkgJson.devDependencies ?? {}));\n const allDirectDeps = new Set([...directDeps, ...devDeps]);\n\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // pnpm-lock.yaml v6+ format:\n // packages:\n // /express@4.21.0: or /@types/node@18.0.0:\n // dev: false\n const blockRegex = /^\\s{2}(\\/?@?[^@\\s/][^@\\s]*)@(\\d[^:\\s]*):\\s*\\n((?:\\s{4}[^\\n]+\\n)*)/gm;\n\n for (const match of content.matchAll(blockRegex)) {\n const name = match[1].replace(/^\\//, '');\n const version = match[2];\n const attrs = match[3] ?? '';\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const isDev = devDeps.has(name) && !directDeps.has(name)\n || /^\\s+dev:\\s*true/m.test(attrs);\n if (isDev && !opts.includeDev) continue;\n\n const isTransitive = !allDirectDeps.has(name);\n if (isTransitive && !opts.includeTransitive) continue;\n\n packages.push({\n name,\n version,\n ecosystem: 'npm',\n source: lockFilePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\nconst PROJ_EXTENSIONS = new Set(['.csproj', '.fsproj', '.vbproj']);\n\nexport function findNugetManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Map<string, string>(); // dir → lock path\n\n for (const f of files) {\n if (path.basename(f) === 'packages.lock.json') {\n lockFiles.set(path.dirname(f), f);\n }\n }\n\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n const base = path.basename(file);\n const ext = path.extname(file);\n\n if (PROJ_EXTENSIONS.has(ext) || base === 'packages.config') {\n const dir = path.dirname(file);\n const lockFile = lockFiles.get(dir);\n manifests.push({ file, ecosystem: 'nuget', lockFile });\n }\n\n if (base === 'Directory.Packages.props') {\n const dir = path.dirname(file);\n manifests.push({ file, ecosystem: 'nuget', lockFile: lockFiles.get(dir) });\n }\n }\n\n // Deduplicate: when multiple project files share the same packages.lock.json,\n // keep only one representative manifest per lock file to avoid parsing the same\n // lock multiple times and inflating package counts.\n const deduped: ManifestInfo[] = [];\n const seenLocks = new Set<string>();\n\n for (const manifest of manifests) {\n if (!manifest.lockFile) {\n deduped.push(manifest);\n continue;\n }\n if (!seenLocks.has(manifest.lockFile)) {\n seenLocks.add(manifest.lockFile);\n deduped.push(manifest);\n }\n }\n\n return deduped;\n}\n\nexport function parseNugetPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string,\n propsContent?: string\n): Package[] {\n const base = path.basename(manifest.file);\n\n if (lockContent) {\n return parsePackagesLock(lockContent, manifest.lockFile ?? manifest.file, opts);\n }\n\n if (base === 'packages.config') {\n return parsePackagesConfig(content, manifest.file);\n }\n\n if (base === 'Directory.Packages.props') {\n return parseDirectoryPackagesProps(content, manifest.file);\n }\n\n // .csproj / .fsproj / .vbproj\n return parseCsproj(content, manifest.file, propsContent);\n}\n\nfunction parseCsproj(content: string, filePath: string, propsContent?: string): Package[] {\n // Build version map from Directory.Packages.props if provided\n const centralVersions = propsContent ? extractCentralVersions(propsContent) : new Map<string, string>();\n\n const packages: Package[] = [];\n\n // Match <PackageReference Include=\"X\" Version=\"Y\" /> or multiline form\n const singleLine = /<PackageReference\\s+([^>]+?)\\/>/gi;\n const multiLine = /<PackageReference\\s+([^>]+?)>([\\s\\S]*?)<\\/PackageReference>/gi;\n\n const extractFromAttrsAndInner = (attrs: string, inner: string): void => {\n const nameMatch = /\\bInclude=\"([^\"]+)\"/i.exec(attrs);\n if (!nameMatch) return;\n const name = nameMatch[1];\n\n let version: string | undefined;\n const attrVersion = /\\bVersion=\"([^\"]+)\"/i.exec(attrs);\n if (attrVersion) {\n version = attrVersion[1];\n } else if (inner) {\n const innerVersion = /<Version>([^<]+)<\\/Version>/i.exec(inner);\n if (innerVersion) version = innerVersion[1];\n }\n\n // Fall back to central package management\n if (!version || version.startsWith('$(')) {\n version = centralVersions.get(name) ?? centralVersions.get(name.toLowerCase());\n }\n\n if (!version) return;\n\n packages.push({\n name,\n version,\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n };\n\n for (const m of content.matchAll(singleLine)) {\n extractFromAttrsAndInner(m[1], '');\n }\n for (const m of content.matchAll(multiLine)) {\n extractFromAttrsAndInner(m[1], m[2] ?? '');\n }\n\n return packages;\n}\n\nfunction extractCentralVersions(propsContent: string): Map<string, string> {\n const map = new Map<string, string>();\n const regex = /<PackageVersion\\s+Include=\"([^\"]+)\"\\s+Version=\"([^\"]+)\"/gi;\n for (const m of propsContent.matchAll(regex)) {\n map.set(m[1], m[2]);\n map.set(m[1].toLowerCase(), m[2]);\n }\n return map;\n}\n\nfunction parseDirectoryPackagesProps(content: string, filePath: string): Package[] {\n const packages: Package[] = [];\n const regex = /<PackageVersion\\s+Include=\"([^\"]+)\"\\s+Version=\"([^\"]+)\"/gi;\n for (const m of content.matchAll(regex)) {\n packages.push({\n name: m[1],\n version: m[2],\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n return packages;\n}\n\nfunction parsePackagesConfig(content: string, filePath: string): Package[] {\n const packages: Package[] = [];\n const regex = /<package\\s+id=\"([^\"]+)\"\\s+version=\"([^\"]+)\"/gi;\n for (const m of content.matchAll(regex)) {\n packages.push({\n name: m[1],\n version: m[2],\n ecosystem: 'nuget',\n source: filePath,\n type: 'direct',\n scope: 'production'\n });\n }\n return packages;\n}\n\ninterface PackagesLockDep {\n resolved?: string;\n type?: string;\n dependencies?: Record<string, PackagesLockDep>;\n}\n\ninterface PackagesLockJson {\n dependencies?: Record<string, Record<string, PackagesLockDep>>;\n}\n\nfunction parsePackagesLock(content: string, filePath: string, opts: ScanOptions): Package[] {\n let lock: PackagesLockJson;\n try {\n lock = JSON.parse(content) as PackagesLockJson;\n } catch {\n return [];\n }\n\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n for (const frameworkDeps of Object.values(lock.dependencies ?? {})) {\n for (const [name, meta] of Object.entries(frameworkDeps)) {\n const version = meta.resolved ?? '';\n if (!version) continue;\n\n const isTransitive = meta.type === 'Transitive';\n if (isTransitive && !opts.includeTransitive) continue;\n\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'nuget',\n source: filePath,\n type: isTransitive ? 'transitive' : 'direct',\n scope: 'production'\n });\n }\n }\n\n return packages;\n}\n","import path from 'path';\nimport type { Package, ManifestInfo, ScanOptions } from '../types.js';\n\nexport function findMavenManifests(files: string[]): ManifestInfo[] {\n const lockFiles = new Set(files.filter(f => path.basename(f) === 'gradle.lockfile'));\n const manifests: ManifestInfo[] = [];\n\n for (const file of files) {\n const base = path.basename(file);\n if (base === 'pom.xml' || base === 'build.gradle' || base === 'build.gradle.kts') {\n const dir = path.dirname(file);\n const lockCandidate = dir === '.' ? 'gradle.lockfile' : `${dir}/gradle.lockfile`;\n const lockFile = lockFiles.has(lockCandidate) ? lockCandidate : undefined;\n manifests.push({ file, ecosystem: 'maven', lockFile });\n }\n }\n\n return manifests;\n}\n\nexport function parseMavenPackages(\n content: string,\n manifest: ManifestInfo,\n opts: ScanOptions,\n lockContent?: string\n): Package[] {\n const base = path.basename(manifest.file);\n\n if (lockContent && manifest.lockFile) {\n return parseGradleLock(lockContent, manifest.lockFile, opts);\n }\n\n if (base === 'pom.xml') {\n return parsePomXml(content, manifest.file, opts);\n }\n\n if (base === 'build.gradle' || base === 'build.gradle.kts') {\n return parseBuildGradle(content, manifest.file, opts);\n }\n\n return [];\n}\n\nfunction parsePomXml(content: string, filePath: string, opts: ScanOptions): Package[] {\n // Extract properties for variable substitution\n const props = extractPomProperties(content);\n\n // Extract dependency management versions\n const managedVersions = extractDependencyManagement(content, props);\n\n // Extract actual dependencies (skip dependencyManagement block)\n const withoutMgmt = content.replace(/<dependencyManagement>[\\s\\S]*?<\\/dependencyManagement>/gi, '');\n\n const packages: Package[] = [];\n const depRegex = /<dependency>([\\s\\S]*?)<\\/dependency>/gi;\n\n for (const match of withoutMgmt.matchAll(depRegex)) {\n const inner = match[1];\n const groupId = /<groupId>\\s*([^<\\s]+)\\s*<\\/groupId>/i.exec(inner)?.[1];\n const artifactId = /<artifactId>\\s*([^<\\s]+)\\s*<\\/artifactId>/i.exec(inner)?.[1];\n if (!groupId || !artifactId) continue;\n\n const rawVersion = /<version>\\s*([^<\\s]+)\\s*<\\/version>/i.exec(inner)?.[1];\n const resolvedVersion = resolveProperty(rawVersion ?? null, props)\n ?? managedVersions.get(`${groupId}:${artifactId}`);\n if (!resolvedVersion) continue;\n\n const scope = /<scope>\\s*([^<\\s]+)\\s*<\\/scope>/i.exec(inner)?.[1] ?? 'compile';\n const isDev = scope === 'test' || scope === 'provided';\n if (isDev && !opts.includeDev) continue;\n\n packages.push({\n name: `${groupId}:${artifactId}`,\n version: resolvedVersion,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction extractPomProperties(content: string): Map<string, string> {\n const props = new Map<string, string>();\n const propsMatch = /<properties>([\\s\\S]*?)<\\/properties>/i.exec(content);\n if (!propsMatch) return props;\n\n const propRegex = /<([a-zA-Z0-9._-]+)>\\s*([^<]+)\\s*<\\/\\1>/g;\n for (const m of propsMatch[1].matchAll(propRegex)) {\n props.set(m[1], m[2].trim());\n }\n return props;\n}\n\nfunction extractDependencyManagement(content: string, props: Map<string, string>): Map<string, string> {\n const versions = new Map<string, string>();\n const mgmtMatch = /<dependencyManagement>([\\s\\S]*?)<\\/dependencyManagement>/i.exec(content);\n if (!mgmtMatch) return versions;\n\n const depRegex = /<dependency>([\\s\\S]*?)<\\/dependency>/gi;\n for (const m of mgmtMatch[1].matchAll(depRegex)) {\n const inner = m[1];\n const groupId = /<groupId>\\s*([^<\\s]+)\\s*<\\/groupId>/i.exec(inner)?.[1];\n const artifactId = /<artifactId>\\s*([^<\\s]+)\\s*<\\/artifactId>/i.exec(inner)?.[1];\n const rawVersion = /<version>\\s*([^<\\s]+)\\s*<\\/version>/i.exec(inner)?.[1];\n if (!groupId || !artifactId || !rawVersion) continue;\n const resolved = resolveProperty(rawVersion, props);\n if (resolved) versions.set(`${groupId}:${artifactId}`, resolved);\n }\n\n return versions;\n}\n\nfunction resolveProperty(value: string | null, props: Map<string, string>): string | null {\n if (!value) return null;\n const resolved = value.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => props.get(key) ?? `\\${${key}}`);\n // If any placeholder remains unresolved, return null so callers fall through to managed versions\n return /\\$\\{[^}]+\\}/.test(resolved) ? null : resolved;\n}\n\nconst GRADLE_DEV_CONFIGS = new Set(['testImplementation', 'testCompileOnly', 'testRuntimeOnly', 'testApi']);\n\nfunction parseBuildGradle(content: string, filePath: string, opts: ScanOptions): Package[] {\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // String notation — Groovy: implementation 'g:a:v' / Kotlin DSL: implementation(\"g:a:v\")\n const stringNotation = /\\b(\\w+)\\s*\\(?\\s*['\"]([^:'\"]+):([^:'\"]+):([^'\"]+)['\"]\\s*\\)?/g;\n for (const m of content.matchAll(stringNotation)) {\n const config = m[1];\n const groupId = m[2];\n const artifactId = m[3];\n const version = m[4].split('@')[0]; // strip classifier\n\n const isDev = GRADLE_DEV_CONFIGS.has(config);\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n // Map notation: implementation group: 'x', name: 'y', version: 'z'\n const mapNotation = /\\b(\\w+)\\s+group:\\s*['\"]([^'\"]+)['\"]\\s*,\\s*name:\\s*['\"]([^'\"]+)['\"]\\s*,\\s*version:\\s*['\"]([^'\"]+)['\"]/g;\n for (const m of content.matchAll(mapNotation)) {\n const config = m[1];\n const groupId = m[2];\n const artifactId = m[3];\n const version = m[4];\n\n const isDev = GRADLE_DEV_CONFIGS.has(config);\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n\nfunction parseGradleLock(content: string, filePath: string, opts: ScanOptions): Package[] {\n const packages: Package[] = [];\n const seen = new Set<string>();\n\n // Format: group:artifact:version=config1,config2\n const lineRegex = /^([^:#\\s]+):([^:#\\s]+):([^=\\s]+)=(.+)$/gm;\n\n for (const m of content.matchAll(lineRegex)) {\n const groupId = m[1];\n const artifactId = m[2];\n const version = m[3];\n const configs = m[4].split(',').map(s => s.trim());\n\n const isDev = configs.every(c => GRADLE_DEV_CONFIGS.has(c));\n if (isDev && !opts.includeDev) continue;\n\n const name = `${groupId}:${artifactId}`;\n const key = `${name}@${version}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n packages.push({\n name,\n version,\n ecosystem: 'maven',\n source: filePath,\n type: 'direct',\n scope: isDev ? 'dev' : 'production'\n });\n }\n\n return packages;\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, ScanData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport function runScan(config: ResolvedConfig, opts: ScanOptions): ScanData {\n void config; // scan is local-only, no network\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository. deps commands require a git repo root.', 1);\n }\n return scanRepo(repoRoot, opts);\n}\n","interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n preRelease: string;\n}\n\nfunction parse(v: string): ParsedVersion {\n // Strip leading non-numeric (e.g. 'v1.0.0')\n const clean = v.replace(/^[^0-9]*/, '');\n // Split off pre-release/build metadata\n const dashIdx = clean.indexOf('-');\n const plusIdx = clean.indexOf('+');\n const metaStart = plusIdx > -1 ? plusIdx : Infinity;\n const preStart = dashIdx > -1 && dashIdx < metaStart ? dashIdx : Infinity;\n const numeric = clean.slice(0, Math.min(preStart, metaStart));\n const preRelease = preStart < Infinity\n ? clean.slice(preStart + 1, metaStart < Infinity ? metaStart : undefined)\n : '';\n const parts = numeric.split('.').map(n => parseInt(n, 10) || 0);\n return { major: parts[0] ?? 0, minor: parts[1] ?? 0, patch: parts[2] ?? 0, preRelease };\n}\n\n/** Returns negative / zero / positive like Array.sort comparators. */\nexport function compareSemver(a: string, b: string): number {\n const av = parse(a);\n const bv = parse(b);\n if (av.major !== bv.major) return av.major - bv.major;\n if (av.minor !== bv.minor) return av.minor - bv.minor;\n if (av.patch !== bv.patch) return av.patch - bv.patch;\n // A release (no pre-release) is greater than any pre-release of the same version\n if (!av.preRelease && bv.preRelease) return 1;\n if (av.preRelease && !bv.preRelease) return -1;\n if (av.preRelease && bv.preRelease) return av.preRelease.localeCompare(bv.preRelease);\n return 0;\n}\n\nexport function isNewer(current: string, latest: string): boolean {\n return compareSemver(latest, current) > 0;\n}\n\nexport function updateType(current: string, latest: string): 'major' | 'minor' | 'patch' {\n const cv = parse(current);\n const lv = parse(latest);\n if (lv.major > cv.major) return 'major';\n if (lv.minor > cv.minor) return 'minor';\n return 'patch';\n}\n\nexport function isDowngrade(from: string, to: string): boolean {\n return compareSemver(to, from) < 0;\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, DiffData, PackageChange, ChangeType, Ecosystem } from './types.js';\nimport { scanRepo, scanRepoAtRef } from './parsers/index.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { isDowngrade } from './semver.js';\n\nexport function runDiff(\n config: ResolvedConfig,\n from: string,\n to: string | null,\n opts: ScanOptions\n): DiffData {\n void config;\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n const fromScan = scanRepoAtRef(repoRoot, from, opts);\n const toScan = to ? scanRepoAtRef(repoRoot, to, opts) : scanRepo(repoRoot, opts);\n\n // Key on ecosystem:name:source to preserve multiple versions of the same package\n // (common with transitive npm deps where the same package appears at different versions)\n type PkgKey = string;\n const fromMap = new Map<PkgKey, string>(); // key → version\n const toMap = new Map<PkgKey, string>();\n\n for (const pkg of fromScan.packages) {\n const key = `${pkg.ecosystem}:${pkg.name}:${pkg.source}`;\n fromMap.set(key, pkg.version);\n }\n for (const pkg of toScan.packages) {\n const key = `${pkg.ecosystem}:${pkg.name}:${pkg.source}`;\n toMap.set(key, pkg.version);\n }\n\n const changes: PackageChange[] = [];\n const allKeys = new Set([...fromMap.keys(), ...toMap.keys()]);\n\n for (const key of allKeys) {\n const parts = key.split(':');\n const eco = parts[0] as Ecosystem;\n const source = parts[parts.length - 1] ?? '';\n const name = parts.slice(1, -1).join(':');\n const fromVer = fromMap.get(key) ?? null;\n const toVer = toMap.get(key) ?? null;\n\n let change: ChangeType;\n if (!fromVer) {\n change = 'added';\n } else if (!toVer) {\n change = 'removed';\n } else if (fromVer === toVer) {\n continue; // unchanged — omit from output\n } else {\n change = isDowngrade(fromVer, toVer) ? 'downgraded' : 'upgraded';\n }\n\n changes.push({ name, ecosystem: eco, change, from: fromVer, to: toVer, source });\n }\n\n const summary = { added: 0, removed: 0, upgraded: 0, downgraded: 0, unchanged: 0 };\n for (const c of changes) summary[c.change]++;\n // Unchanged = keys present in both maps with identical versions\n summary.unchanged = [...allKeys].filter(k => {\n const fv = fromMap.get(k);\n const tv = toMap.get(k);\n return fv !== undefined && tv !== undefined && fv === tv;\n }).length;\n\n return { from, to: to ?? 'working tree', changes, summary };\n}\n\n","import type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst OSV_URL = 'https://api.osv.dev';\nconst BATCH_SIZE = 500;\nconst TIMEOUT_MS = 30_000;\n\nconst OSV_ECOSYSTEM: Record<string, string> = {\n npm: 'npm',\n nuget: 'NuGet',\n maven: 'Maven'\n};\n\ninterface OsvQuery {\n package: { name: string; ecosystem: string };\n version: string;\n}\n\ninterface OsvRange {\n type: string;\n events?: Array<{ introduced?: string; fixed?: string; last_affected?: string }>;\n}\n\ninterface OsvAffected {\n package?: { name: string; ecosystem: string };\n ranges?: OsvRange[];\n}\n\ninterface OsvSeverityEntry {\n type: string;\n score: string;\n}\n\ninterface OsvRawVuln {\n id: string;\n summary?: string;\n aliases?: string[];\n references?: Array<{ url?: string }>;\n affected?: OsvAffected[];\n severity?: OsvSeverityEntry[];\n database_specific?: Record<string, unknown>;\n}\n\ninterface OsvBatchResponse {\n results: Array<{ vulns?: OsvRawVuln[] }>;\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkOsvConnectivity(): Promise<{ reachable: boolean; error?: string }> {\n try {\n const res = await fetchWithTimeout(`${OSV_URL}/v1/querybatch`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries: [] })\n });\n return { reachable: res.ok || res.status === 400 }; // 400 is fine, means it's up\n } catch (err) {\n return {\n reachable: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nfunction extractRemediation(vuln: OsvRawVuln, pkg: Package): OsvVulnerability['remediation'] {\n const fixedVersions: string[] = [];\n\n for (const affected of vuln.affected ?? []) {\n for (const range of affected.ranges ?? []) {\n if (range.type === 'SEMVER' || range.type === 'ECOSYSTEM') {\n for (const event of range.events ?? []) {\n if (event.fixed) fixedVersions.push(event.fixed);\n }\n }\n }\n }\n\n const unique = [...new Set(fixedVersions)];\n const fixAvailable = unique.length > 0;\n const advice = fixAvailable\n ? `Upgrade ${pkg.name} to ${unique.join(' or ')}`\n : `No fix available yet for ${pkg.name}. Monitor ${vuln.id} for updates.`;\n\n return { fixAvailable, fixedVersions: unique, advice };\n}\n\nfunction extractSeverity(vuln: OsvRawVuln): { severity: string; cvss: number | null } {\n const dbSpecific = vuln.database_specific ?? {};\n const dbSeverity = typeof dbSpecific['severity'] === 'string' ? dbSpecific['severity'] : undefined;\n\n // Some databases put numeric CVSS in database_specific.cvss\n let cvss: number | null = null;\n const rawCvss = dbSpecific['cvss'];\n if (typeof rawCvss === 'number') {\n cvss = rawCvss;\n } else if (rawCvss && typeof rawCvss === 'object' && 'score' in rawCvss) {\n const score = (rawCvss as Record<string, unknown>)['score'];\n if (typeof score === 'number') cvss = score;\n }\n\n // Try severity array for numeric scores\n for (const s of vuln.severity ?? []) {\n const score = parseFloat(s.score);\n if (!isNaN(score) && score >= 0 && score <= 10) {\n cvss = score;\n break;\n }\n }\n\n return {\n severity: dbSeverity ?? inferSeverityFromCvss(cvss),\n cvss\n };\n}\n\nfunction inferSeverityFromCvss(cvss: number | null): string {\n if (cvss === null) return 'UNKNOWN';\n if (cvss >= 9.0) return 'CRITICAL';\n if (cvss >= 7.0) return 'HIGH';\n if (cvss >= 4.0) return 'MEDIUM';\n return 'LOW';\n}\n\nfunction mapVuln(vuln: OsvRawVuln, pkg: Package): OsvVulnerability {\n const { severity, cvss } = extractSeverity(vuln);\n return {\n id: vuln.id,\n summary: vuln.summary ?? '',\n severity,\n cvss,\n aliases: vuln.aliases ?? [],\n remediation: extractRemediation(vuln, pkg),\n references: (vuln.references ?? []).map(r => r.url ?? '').filter(Boolean)\n };\n}\n\nasync function queryBatch(queries: OsvQuery[], packages: Package[]): Promise<VulnerablePackage[]> {\n const res = await fetchWithTimeout(`${OSV_URL}/v1/querybatch`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries })\n });\n\n if (!res.ok) {\n throw new Error(`OSV.dev returned HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as OsvBatchResponse;\n const vulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < data.results.length; i++) {\n const result = data.results[i];\n const pkg = packages[i];\n if (!result || !pkg) continue;\n\n const vulns = result.vulns ?? [];\n if (vulns.length === 0) continue;\n\n vulnerable.push({\n ...pkg,\n vulnerabilities: vulns.map(v => mapVuln(v, pkg))\n });\n }\n\n return vulnerable;\n}\n\nexport async function checkPackagesForVulns(packages: Package[]): Promise<VulnerablePackage[]> {\n const allVulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const chunk = packages.slice(i, i + BATCH_SIZE);\n\n const queries: OsvQuery[] = chunk.map(pkg => ({\n package: {\n name: pkg.name,\n ecosystem: OSV_ECOSYSTEM[pkg.ecosystem] ?? pkg.ecosystem\n },\n version: pkg.version\n }));\n\n const results = await queryBatch(queries, chunk);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n","import type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst SONATYPE_URL = 'https://ossindex.sonatype.org';\nconst BATCH_SIZE = 128; // OSS Index limit per request\nconst TIMEOUT_MS = 30_000;\n\ninterface SonatypeVuln {\n id: string;\n displayName: string;\n title: string;\n description: string;\n cvssScore: number;\n cvssVector?: string;\n cwe?: string;\n reference: string;\n externalReferences?: string[];\n}\n\ninterface SonatypeComponentReport {\n coordinates: string;\n description?: string;\n reference: string;\n vulnerabilities: SonatypeVuln[];\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n // Scoped packages: @scope/name → pkg:npm/%40scope/name@version\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n // pncli stores Maven names as \"groupId:artifactId\"\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction inferSeverityFromCvss(score: number): string {\n if (score >= 9.0) return 'CRITICAL';\n if (score >= 7.0) return 'HIGH';\n if (score >= 4.0) return 'MEDIUM';\n if (score > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction mapSonatypeVuln(v: SonatypeVuln, pkg: Package): OsvVulnerability {\n const refs: string[] = [v.reference, ...(v.externalReferences ?? [])].filter(Boolean);\n\n // Sonatype doesn't return fixed versions — direct user to the vulnerability reference\n const advice = `See ${v.reference} for remediation details for ${pkg.name}@${pkg.version}.`;\n\n const cvePattern = /CVE-\\d{4}-\\d+/gi;\n const searchText = [v.displayName, v.title, v.description].filter(Boolean).join(' ');\n const aliases = [...new Set([...searchText.matchAll(cvePattern)].map(m => m[0].toUpperCase()))];\n\n return {\n id: v.displayName || v.id,\n summary: v.title || v.description,\n severity: inferSeverityFromCvss(v.cvssScore),\n cvss: v.cvssScore > 0 ? v.cvssScore : null,\n aliases,\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice\n },\n references: refs\n };\n}\n\nasync function queryBatch(\n purls: string[],\n packages: Package[]\n): Promise<VulnerablePackage[]> {\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: purls })\n });\n\n if (res.status === 429) {\n throw new Error(\n 'Sonatype OSS Index is rate-limiting requests from this IP. ' +\n 'Create a free account at ossindex.sonatype.org and add your credentials to your pncli config to raise the limit.'\n );\n }\n\n if (!res.ok) {\n throw new Error(`Sonatype OSS Index returned HTTP ${res.status}`);\n }\n\n const reports = (await res.json()) as SonatypeComponentReport[];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const report of reports) {\n if (!report?.coordinates) continue;\n const pkg = purlToPackage.get(report.coordinates);\n if (!pkg) continue;\n const vulns = report.vulnerabilities ?? [];\n if (vulns.length === 0) continue;\n vulnerable.push({ ...pkg, vulnerabilities: vulns.map(v => mapSonatypeVuln(v, pkg)) });\n }\n\n return vulnerable;\n}\n\nexport async function checkSonatypeConnectivity(): Promise<{ reachable: boolean; error?: string }> {\n try {\n // Send an empty batch to verify the endpoint is reachable\n const res = await fetchWithTimeout(`${SONATYPE_URL}/api/v3/component-report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ coordinates: [] })\n });\n return { reachable: res.ok || res.status === 400 };\n } catch (err) {\n return {\n reachable: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport async function checkPackagesForVulnsViaSonatype(\n packages: Package[]\n): Promise<VulnerablePackage[]> {\n const allVulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const chunk = packages.slice(i, i + BATCH_SIZE);\n const purls = chunk.map(toPurl);\n const results = await queryBatch(purls, chunk);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n","import type { ResolvedConfig } from '../../../types/config.js';\nimport type { Package, OsvVulnerability, VulnerablePackage } from '../types.js';\n\nconst TIMEOUT_MS = 60_000;\nconst MAX_POLL_ATTEMPTS = 10;\nconst POLL_INTERVAL_MS = 2_000;\nconst BATCH_SIZE = 128;\n\ninterface IqConstraintReason {\n reason: string;\n reference?: {\n type: string;\n value: string;\n };\n}\n\ninterface IqConstraintViolation {\n constraintName: string;\n reasons: IqConstraintReason[];\n}\n\ninterface IqPolicyViolation {\n policyId: string;\n policyName: string;\n policyThreatCategory: string;\n policyThreatLevel: number;\n constraintViolations: IqConstraintViolation[];\n}\n\ninterface IqComponentResult {\n component: {\n packageUrl: string;\n };\n matchState: string;\n criticalVulnerabilityCount?: number;\n severeVulnerabilityCount?: number;\n moderateVulnerabilityCount?: number;\n policyData?: {\n policyViolations?: IqPolicyViolation[];\n };\n}\n\ninterface IqEvaluationResponse {\n isQueued: boolean;\n resultsUrl?: string;\n components?: IqComponentResult[];\n}\n\ninterface IqApplicationsResponse {\n applications?: Array<{ id: string; publicId: string; name: string }>;\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction buildBasicAuth(userCode: string, passcode: string): string {\n return `Basic ${Buffer.from(`${userCode}:${passcode}`).toString('base64')}`;\n}\n\nfunction threatLevelToSeverity(level: number): string {\n if (level >= 9) return 'CRITICAL';\n if (level >= 7) return 'HIGH';\n if (level >= 4) return 'MEDIUM';\n if (level > 0) return 'LOW';\n return 'UNKNOWN';\n}\n\nfunction toPurl(pkg: Package): string {\n switch (pkg.ecosystem) {\n case 'npm': {\n const encodedName = pkg.name.startsWith('@')\n ? pkg.name.replace('@', '%40')\n : pkg.name;\n return `pkg:npm/${encodedName}@${pkg.version}`;\n }\n case 'nuget':\n return `pkg:nuget/${pkg.name}@${pkg.version}`;\n case 'maven': {\n const colonIdx = pkg.name.indexOf(':');\n if (colonIdx !== -1) {\n const groupId = pkg.name.slice(0, colonIdx);\n const artifactId = pkg.name.slice(colonIdx + 1);\n return `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${pkg.version}`;\n }\n return `pkg:maven/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n default:\n return `pkg:generic/${encodeURIComponent(pkg.name)}@${pkg.version}`;\n }\n}\n\nfunction mapViolationToVuln(violation: IqPolicyViolation): OsvVulnerability {\n const cveRefs = violation.constraintViolations.flatMap(cv =>\n cv.reasons\n .filter(r => r.reference?.type === 'VULNERABILITY')\n .map(r => r.reference!.value)\n );\n const id = cveRefs[0] ?? violation.policyId;\n const severity = threatLevelToSeverity(violation.policyThreatLevel);\n\n return {\n id,\n summary: violation.policyName,\n severity,\n cvss: null,\n aliases: [...new Set(cveRefs)],\n remediation: {\n fixAvailable: false,\n fixedVersions: [],\n advice: `Policy violation: ${violation.policyName} (threat level ${violation.policyThreatLevel}). Check Sonatype IQ Server for details.`\n },\n references: []\n };\n}\n\nfunction syntheticVulnsFromCounts(\n criticalCount: number,\n severeCount: number,\n moderateCount: number,\n pkgName: string\n): OsvVulnerability[] {\n const vulns: OsvVulnerability[] = [];\n if (criticalCount > 0) {\n vulns.push({\n id: `iq-critical-${pkgName}`,\n summary: `${criticalCount} critical vulnerability(ies) detected by Sonatype IQ`,\n severity: 'CRITICAL',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (severeCount > 0) {\n vulns.push({\n id: `iq-high-${pkgName}`,\n summary: `${severeCount} severe vulnerability(ies) detected by Sonatype IQ`,\n severity: 'HIGH',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n if (moderateCount > 0) {\n vulns.push({\n id: `iq-medium-${pkgName}`,\n summary: `${moderateCount} moderate vulnerability(ies) detected by Sonatype IQ`,\n severity: 'MEDIUM',\n cvss: null,\n aliases: [],\n remediation: { fixAvailable: false, fixedVersions: [], advice: 'Check Sonatype IQ Server for details.' },\n references: []\n });\n }\n return vulns;\n}\n\nasync function resolveApplicationInternalId(\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<string> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?publicId=${encodeURIComponent(applicationId)}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n if (!res.ok) return applicationId;\n const data = await res.json() as IqApplicationsResponse;\n if (data.applications && data.applications.length > 0) {\n return data.applications[0]!.id;\n }\n return applicationId;\n}\n\nasync function pollResults(\n baseUrl: string,\n resultsUrl: string,\n auth: string\n): Promise<IqEvaluationResponse> {\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS * attempt));\n }\n\n const url = resultsUrl.startsWith('http') ? resultsUrl : `${baseUrl.replace(/\\/$/, '')}${resultsUrl}`;\n const res = await fetchWithTimeout(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' }\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status} polling results`);\n }\n\n const data = await res.json() as IqEvaluationResponse;\n if (!data.isQueued) return data;\n }\n\n throw new Error('Sonatype IQ Server evaluation timed out waiting for results.');\n}\n\nasync function evaluateBatch(\n purls: string[],\n packages: Package[],\n baseUrl: string,\n applicationId: string,\n auth: string\n): Promise<VulnerablePackage[]> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/evaluation/applications/${encodeURIComponent(applicationId)}`;\n\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Authorization': auth, 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({ components: purls.map(p => ({ packageUrl: p })) })\n });\n\n if (!res.ok) {\n throw new Error(`Sonatype IQ Server returned HTTP ${res.status}`);\n }\n\n let data = await res.json() as IqEvaluationResponse;\n\n if (data.isQueued && data.resultsUrl) {\n data = await pollResults(baseUrl, data.resultsUrl, auth);\n }\n\n const components = data.components ?? [];\n const vulnerable: VulnerablePackage[] = [];\n\n const purlToPackage = new Map<string, Package>();\n for (let i = 0; i < purls.length; i++) {\n purlToPackage.set(purls[i]!, packages[i]!);\n }\n\n for (const result of components) {\n if (!result?.component?.packageUrl) continue;\n\n const pkg = purlToPackage.get(result.component.packageUrl);\n if (!pkg) continue;\n\n const criticalCount = result.criticalVulnerabilityCount ?? 0;\n const severeCount = result.severeVulnerabilityCount ?? 0;\n const moderateCount = result.moderateVulnerabilityCount ?? 0;\n const totalVulns = criticalCount + severeCount + moderateCount;\n\n const violations = result.policyData?.policyViolations ?? [];\n const securityViolations = violations.filter(v => v.policyThreatCategory === 'SECURITY');\n\n if (securityViolations.length === 0 && totalVulns === 0) continue;\n\n const vulnerabilities: OsvVulnerability[] = securityViolations.length > 0\n ? securityViolations.map(v => mapViolationToVuln(v))\n : syntheticVulnsFromCounts(criticalCount, severeCount, moderateCount, pkg.name);\n\n vulnerable.push({ ...pkg, vulnerabilities });\n }\n\n return vulnerable;\n}\n\nexport async function checkPackagesViaIqServer(\n packages: Package[],\n applicationId: string,\n config: ResolvedConfig\n): Promise<VulnerablePackage[]> {\n const { baseUrl, userCode, passcode } = config.sonatypeiq;\n if (!baseUrl) throw new Error('Sonatype IQ Server baseUrl not configured.');\n if (!userCode || !passcode) throw new Error('Sonatype IQ Server credentials not configured.');\n\n const auth = buildBasicAuth(userCode, passcode);\n const internalId = await resolveApplicationInternalId(baseUrl, applicationId, auth);\n const allVulnerable: VulnerablePackage[] = [];\n\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const chunk = packages.slice(i, i + BATCH_SIZE);\n const purls = chunk.map(toPurl);\n const results = await evaluateBatch(purls, chunk, baseUrl, internalId, auth);\n allVulnerable.push(...results);\n }\n\n return allVulnerable;\n}\n\nexport async function checkSonatypeIqConnectivity(\n baseUrl: string,\n userCode: string,\n passcode: string\n): Promise<{ reachable: boolean; authenticated: boolean; error?: string }> {\n try {\n const auth = buildBasicAuth(userCode, passcode);\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v2/applications?limit=1`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10_000);\n let res: Response;\n try {\n res = await fetch(url, {\n method: 'GET',\n headers: { 'Authorization': auth, 'Accept': 'application/json' },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (res.status === 401 || res.status === 403) {\n return { reachable: true, authenticated: false, error: `Authentication failed (HTTP ${res.status})` };\n }\n\n return { reachable: true, authenticated: res.ok };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n","import type { Ecosystem, LicensedPackage, OutdatedPackage } from '../types.js';\nimport type { ArtifactoryConfig } from '../../../types/config.js';\nimport { PncliError } from '../../../lib/errors.js';\nimport { isNewer, updateType } from '../semver.js';\n\nconst TIMEOUT_MS = 15_000;\n\nasync function fetchWithTimeout(url: string, token: string): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function checkArtifactoryConnectivity(config: ArtifactoryConfig): Promise<{\n reachable: boolean;\n authenticated: boolean;\n configured: boolean;\n error?: string;\n}> {\n if (!config.baseUrl && !config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory is not configured'\n };\n }\n if (!config.baseUrl) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory baseUrl is not set'\n };\n }\n if (!config.token) {\n return {\n reachable: false,\n authenticated: false,\n configured: false,\n error: 'Artifactory token is not set'\n };\n }\n\n try {\n const res = await fetchWithTimeout(`${config.baseUrl}/api/system/ping`, config.token);\n if (res.status === 401 || res.status === 403) {\n return {\n reachable: true,\n authenticated: false,\n configured: true,\n error: 'Artifactory token is invalid or lacks permissions'\n };\n }\n return { reachable: res.ok, authenticated: res.ok, configured: true };\n } catch (err) {\n return {\n reachable: false,\n authenticated: false,\n configured: true,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n}\n\nexport function requireArtifactory(config: ArtifactoryConfig, command: string): void {\n if (!config.baseUrl && !config.token) {\n throw new PncliError(\n `${command} requires Artifactory. Add the following to ~/.pncli/config.json:\\n` +\n ` \"artifactory\": { \"baseUrl\": \"https://artifactory.imagile.dev\", \"token\": \"your-token\" }\\n` +\n `Or set PNCLI_ARTIFACTORY_BASE_URL and PNCLI_ARTIFACTORY_TOKEN environment variables.`,\n 503\n );\n }\n if (!config.baseUrl) {\n throw new PncliError(\n `${command} requires an Artifactory URL. Set artifactory.baseUrl in ~/.pncli/config.json or PNCLI_ARTIFACTORY_BASE_URL.`,\n 503\n );\n }\n if (!config.token) {\n throw new PncliError(\n `${command} requires an Artifactory token. Set artifactory.token in ~/.pncli/config.json or PNCLI_ARTIFACTORY_TOKEN.`,\n 503\n );\n }\n}\n\nfunction repoForEcosystem(config: ArtifactoryConfig, eco: Ecosystem): string | undefined {\n if (eco === 'npm') return config.npmRepo;\n if (eco === 'nuget') return config.nugetRepo;\n if (eco === 'maven') return config.mavenRepo;\n return undefined;\n}\n\nasync function getLatestNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { 'dist-tags'?: { latest?: string } };\n return data['dist-tags']?.latest ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/flatcontainer/${lower}/index.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { versions?: string[] };\n const versions = data.versions ?? [];\n return versions[versions.length - 1] ?? null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestMaven(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n const [groupId, artifactId] = packageName.split(':');\n if (!groupId || !artifactId) return null;\n\n try {\n const res = await fetchWithTimeout(\n `${baseUrl}/api/search/latestVersion?g=${encodeURIComponent(groupId)}&a=${encodeURIComponent(artifactId)}&repos=${repoName}`,\n token\n );\n if (!res.ok) return null;\n const text = await res.text();\n return text.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function getOutdatedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<{ outdated: OutdatedPackage[]; uncheckedEcosystems: string[] }> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return { outdated: [], uncheckedEcosystems: [] };\n\n const outdated: OutdatedPackage[] = [];\n const unchecked = new Set<string>();\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n if (!repoName) {\n unchecked.add(pkg.ecosystem);\n continue;\n }\n\n let latest: string | null = null;\n if (pkg.ecosystem === 'npm') {\n latest = await getLatestNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n latest = await getLatestNuget(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'maven') {\n latest = await getLatestMaven(baseUrl, token, repoName, pkg.name);\n }\n\n if (!latest || !isNewer(pkg.version, latest)) continue;\n\n const type = updateType(pkg.version, latest);\n if (filterType) {\n const order = { major: 3, minor: 2, patch: 1 };\n if (order[type] < order[filterType]) continue;\n }\n\n outdated.push({\n name: pkg.name,\n ecosystem: pkg.ecosystem,\n current: pkg.version,\n latest,\n updateType: type,\n source: pkg.source\n });\n }\n\n return { outdated, uncheckedEcosystems: [...unchecked] };\n}\n\nasync function getLicenseNpm(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string\n): Promise<string | null> {\n try {\n const encoded = packageName.startsWith('@')\n ? packageName.replace('/', '%2F')\n : packageName;\n const res = await fetchWithTimeout(`${baseUrl}/api/npm/${repoName}/${encoded}`, token);\n if (!res.ok) return null;\n const data = (await res.json()) as { license?: string | { type?: string } };\n if (typeof data.license === 'string') return data.license;\n if (typeof data.license === 'object' && data.license !== null) return data.license.type ?? null;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function getLicenseNuget(\n baseUrl: string,\n token: string,\n repoName: string,\n packageName: string,\n version: string\n): Promise<string | null> {\n try {\n const lower = packageName.toLowerCase();\n const res = await fetchWithTimeout(\n `${baseUrl}/api/nuget/v3/${repoName}/registration/${lower}/${version}.json`,\n token\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { licenseExpression?: string; licenseUrl?: string };\n return data.licenseExpression ?? (data.licenseUrl ? 'See licenseUrl' : null);\n } catch {\n return null;\n }\n}\n\nexport async function getLicensedPackages(\n packages: Array<{ name: string; version: string; ecosystem: Ecosystem; source: string }>,\n config: ArtifactoryConfig\n): Promise<LicensedPackage[]> {\n const { baseUrl, token } = config;\n if (!baseUrl || !token) return [];\n\n const result: LicensedPackage[] = [];\n\n for (const pkg of packages) {\n const repoName = repoForEcosystem(config, pkg.ecosystem);\n let license: string | null = null;\n\n if (repoName) {\n if (pkg.ecosystem === 'npm') {\n license = await getLicenseNpm(baseUrl, token, repoName, pkg.name);\n } else if (pkg.ecosystem === 'nuget') {\n license = await getLicenseNuget(baseUrl, token, repoName, pkg.name, pkg.version);\n }\n // Maven: fetching license from POM via Artifactory is complex — emit null\n }\n\n result.push({\n name: pkg.name,\n version: pkg.version,\n ecosystem: pkg.ecosystem,\n source: pkg.source,\n license\n });\n }\n\n return result;\n}\n","import type { ConnectivityData, Tier } from './types.js';\nimport type { ResolvedConfig } from '../../types/config.js';\nimport { checkOsvConnectivity } from './clients/osv.js';\nimport { checkArtifactoryConnectivity } from './clients/artifactory.js';\nimport { checkSonatypeConnectivity } from './clients/sonatype.js';\nimport { checkSonatypeIqConnectivity } from './clients/sonatypeiq.js';\n\ninterface TierResult {\n tier: Tier;\n osvReachable: boolean;\n artifactoryReachable: boolean;\n}\n\n// Session-level cache — not persisted to disk\nlet cachedTier: TierResult | null = null;\n\nexport async function detectTier(config: ResolvedConfig): Promise<TierResult> {\n if (cachedTier) return cachedTier;\n\n const [osvResult, artResult] = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory)\n ]);\n\n const artifactoryReachable = artResult.reachable && artResult.authenticated;\n const osvReachable = osvResult.reachable;\n\n let tier: Tier = 'local';\n if (artifactoryReachable) tier = 'artifactory';\n if (osvReachable) tier = 'full';\n\n cachedTier = { tier, osvReachable, artifactoryReachable };\n return cachedTier;\n}\n\nexport function clearTierCache(): void {\n cachedTier = null;\n}\n\nexport async function checkSonatypeReachable(): Promise<boolean> {\n const result = await checkSonatypeConnectivity();\n return result.reachable;\n}\n\nexport async function buildConnectivityData(config: ResolvedConfig): Promise<ConnectivityData> {\n const iqCfg = config.sonatypeiq;\n const iqConfigured = !!(iqCfg.baseUrl && iqCfg.userCode && iqCfg.passcode);\n\n const checks = await Promise.all([\n checkOsvConnectivity(),\n checkArtifactoryConnectivity(config.artifactory),\n checkSonatypeConnectivity(),\n iqConfigured\n ? checkSonatypeIqConnectivity(iqCfg.baseUrl!, iqCfg.userCode!, iqCfg.passcode!)\n : Promise.resolve(null)\n ]);\n\n const [osvResult, artResult, sonatypeResult, iqResult] = checks;\n\n const artCfg = config.artifactory;\n\n let tier: Tier = 'local';\n if (artResult.reachable && artResult.authenticated) tier = 'artifactory';\n if (osvResult.reachable || sonatypeResult.reachable) tier = 'full';\n\n cachedTier = {\n tier,\n osvReachable: osvResult.reachable,\n artifactoryReachable: artResult.reachable && artResult.authenticated\n };\n\n return {\n artifactory: {\n reachable: artResult.reachable,\n url: artCfg.baseUrl ?? '(not configured)',\n authenticated: artResult.authenticated,\n repositories: {\n npm: artCfg.npmRepo ?? '(not configured)',\n nuget: artCfg.nugetRepo ?? '(not configured)',\n maven: artCfg.mavenRepo ?? '(not configured)'\n },\n ...(artResult.error ? { error: artResult.error } : {})\n },\n osv: {\n reachable: osvResult.reachable,\n url: 'https://api.osv.dev',\n ...(osvResult.error ? { error: osvResult.error } : {})\n },\n sonatype: {\n reachable: sonatypeResult.reachable,\n url: 'https://ossindex.sonatype.org',\n ...(sonatypeResult.error ? { error: sonatypeResult.error } : {})\n },\n ...(iqConfigured && iqResult ? {\n sonatypeiq: {\n reachable: iqResult.reachable,\n authenticated: iqResult.authenticated,\n url: iqCfg.baseUrl!,\n ...(iqResult.error ? { error: iqResult.error } : {})\n }\n } : {}),\n tier,\n capabilities: {\n scan: true,\n diff: true,\n outdated: artResult.reachable && artResult.authenticated,\n licenseCheck: artResult.reachable && artResult.authenticated,\n cveCheck: osvResult.reachable || sonatypeResult.reachable || (iqResult?.reachable && iqResult?.authenticated) === true\n }\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, FriskData, FriskSource, FriskSourceError, VulnerablePackage } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { checkPackagesForVulns } from './clients/osv.js';\nimport { checkPackagesForVulnsViaSonatype } from './clients/sonatype.js';\nimport { checkPackagesViaIqServer } from './clients/sonatypeiq.js';\nimport { detectTier, checkSonatypeReachable } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nexport async function runFrisk(\n config: ResolvedConfig,\n opts: ScanOptions,\n source: FriskSource = 'osv',\n applicationId?: string\n): Promise<FriskData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Validate sonatypeiq config upfront before any network checks\n if (source === 'sonatypeiq') {\n if (!config.sonatypeiq.baseUrl || !config.sonatypeiq.userCode || !config.sonatypeiq.passcode) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires Sonatype IQ Server to be configured. Run: pncli config init',\n 1\n );\n }\n if (!applicationId) {\n throw new PncliError(\n 'deps frisk --source sonatypeiq requires --application-id <id>. ' +\n 'Use \\'pncli sonatypeiq applications list\\' to find application IDs.',\n 1\n );\n }\n }\n\n const { tier: baseTier, osvReachable } = await detectTier(config);\n const sonatypeReachable = (source === 'sonatype' || source === 'all') ? await checkSonatypeReachable() : false;\n const tier = sonatypeReachable ? 'full' : baseTier;\n\n if (source === 'osv' && !osvReachable) {\n throw new PncliError(\n 'deps frisk requires OSV.dev access but api.osv.dev is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n if (source === 'sonatype' && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk --source sonatype requires Sonatype OSS Index access but ossindex.sonatype.org is not reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n if (source === 'all' && !osvReachable && !sonatypeReachable) {\n throw new PncliError(\n 'deps frisk requires either OSV.dev or Sonatype OSS Index access, but neither is reachable from this machine. ' +\n 'Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n // For source=all, capture pre-check failures in sourceErrors so the LLM can see what was skipped\n const sourceErrors: FriskSourceError[] = [];\n let sourcesQueried: FriskSource[];\n\n if (source === 'all') {\n if (!osvReachable) sourceErrors.push({ source: 'osv', error: 'api.osv.dev is not reachable — run pncli deps connectivity to diagnose.' });\n if (!sonatypeReachable) sourceErrors.push({ source: 'sonatype', error: 'ossindex.sonatype.org is not reachable — run pncli deps connectivity to diagnose.' });\n sourcesQueried = [\n ...(osvReachable ? ['osv' as const] : []),\n ...(sonatypeReachable ? ['sonatype' as const] : [])\n ];\n } else {\n sourcesQueried = [source];\n }\n\n // Default frisk: include transitive deps (CVEs hide in transitive deps)\n const scanOpts: ScanOptions = {\n ...opts,\n includeTransitive: opts.includeTransitive ?? true\n };\n\n const scan = scanRepo(repoRoot, scanOpts);\n\n if (scan.packages.length === 0) {\n return { tier, source, sourcesQueried, sourceErrors, scanned: 0, vulnerable: 0, packages: [] };\n }\n\n let vulnerable: VulnerablePackage[];\n\n if (source === 'sonatypeiq') {\n vulnerable = await checkPackagesViaIqServer(scan.packages, applicationId!, config);\n } else if (source === 'sonatype') {\n vulnerable = await checkPackagesForVulnsViaSonatype(scan.packages);\n } else if (source === 'all') {\n // Use allSettled so a runtime failure from one source doesn't discard results from the other\n const [osvSettled, sonatypeSettled] = await Promise.allSettled([\n osvReachable ? checkPackagesForVulns(scan.packages) : Promise.resolve([] as VulnerablePackage[]),\n sonatypeReachable ? checkPackagesForVulnsViaSonatype(scan.packages) : Promise.resolve([] as VulnerablePackage[])\n ]);\n\n if (osvReachable) {\n if (osvSettled.status === 'rejected') {\n sourceErrors.push({ source: 'osv', error: toErrorMessage(osvSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'osv');\n }\n }\n if (sonatypeReachable) {\n if (sonatypeSettled.status === 'rejected') {\n sourceErrors.push({ source: 'sonatype', error: toErrorMessage(sonatypeSettled.reason) });\n sourcesQueried = sourcesQueried.filter(s => s !== 'sonatype');\n }\n }\n\n if (sourcesQueried.length === 0) {\n throw new PncliError(\n 'All vulnerability sources failed during scanning. Run \\'pncli deps connectivity\\' to diagnose.',\n 503\n );\n }\n\n vulnerable = mergeVulnerablePackages(\n osvSettled.status === 'fulfilled' ? osvSettled.value : [],\n sonatypeSettled.status === 'fulfilled' ? sonatypeSettled.value : []\n );\n } else {\n vulnerable = await checkPackagesForVulns(scan.packages);\n }\n\n return {\n tier,\n source,\n sourcesQueried,\n sourceErrors,\n scanned: scan.packages.length,\n vulnerable: vulnerable.length,\n packages: vulnerable\n };\n}\n\nfunction mergeVulnerablePackages(\n osvResults: VulnerablePackage[],\n sonatypeResults: VulnerablePackage[]\n): VulnerablePackage[] {\n const byKey = new Map<string, VulnerablePackage>();\n\n for (const pkg of osvResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n byKey.set(key, { ...pkg });\n }\n\n for (const pkg of sonatypeResults) {\n const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;\n const existing = byKey.get(key);\n if (existing) {\n // Merge: add Sonatype vulns not already present by ID\n const existingIds = new Set(existing.vulnerabilities.map(v => v.id));\n const newVulns = pkg.vulnerabilities.filter(v => !existingIds.has(v.id));\n existing.vulnerabilities = [...existing.vulnerabilities, ...newVulns];\n } else {\n byKey.set(key, { ...pkg });\n }\n }\n\n return [...byKey.values()];\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, OutdatedData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getOutdatedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runOutdated(\n config: ResolvedConfig,\n opts: ScanOptions,\n filterType?: 'major' | 'minor' | 'patch'\n): Promise<OutdatedData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n // Fail fast with a clear message if Artifactory is not configured at all\n requireArtifactory(config.artifactory, 'deps outdated');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const { outdated, uncheckedEcosystems } = await getOutdatedPackages(\n directPackages,\n config.artifactory,\n filterType\n );\n\n const summary = { total: outdated.length, major: 0, minor: 0, patch: 0 };\n for (const pkg of outdated) summary[pkg.updateType]++;\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n outdated,\n uncheckedEcosystems,\n summary\n };\n}\n","import type { ResolvedConfig } from '../../types/config.js';\nimport type { ScanOptions, LicenseCheckData } from './types.js';\nimport { scanRepo } from './parsers/index.js';\nimport { getLicensedPackages, requireArtifactory } from './clients/artifactory.js';\nimport { detectTier } from './connectivity.js';\nimport { getRepoRoot } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport async function runLicenseCheck(config: ResolvedConfig, opts: ScanOptions): Promise<LicenseCheckData> {\n const repoRoot = getRepoRoot();\n if (!repoRoot) {\n throw new PncliError('Not inside a git repository.', 1);\n }\n\n requireArtifactory(config.artifactory, 'deps license-check');\n\n const { artifactoryReachable } = await detectTier(config);\n if (!artifactoryReachable) {\n throw new PncliError(\n `Artifactory at ${config.artifactory.baseUrl} is not reachable or authentication failed. ` +\n `Run 'pncli deps connectivity' to diagnose.`,\n 503\n );\n }\n\n const scan = scanRepo(repoRoot, { ...opts, includeTransitive: false });\n const directPackages = scan.packages.filter(p => p.type === 'direct');\n\n const licensed = await getLicensedPackages(directPackages, config.artifactory);\n\n const byLicense: Record<string, number> = {};\n let unknown = 0;\n\n for (const pkg of licensed) {\n if (!pkg.license) {\n unknown++;\n } else {\n byLicense[pkg.license] = (byLicense[pkg.license] ?? 0) + 1;\n }\n }\n\n return {\n source: 'artifactory',\n artifactoryUrl: config.artifactory.baseUrl ?? '',\n packages: licensed,\n summary: {\n total: licensed.length,\n byLicense,\n unknown\n }\n };\n}\n","import { Command } from 'commander';\nimport input from '@inquirer/input';\nimport password from '@inquirer/password';\nimport confirm from '@inquirer/confirm';\nimport {\n loadConfig,\n writeGlobalConfig,\n writeRepoConfig,\n setConfigValue,\n setRepoConfigValue,\n maskConfig,\n getGlobalConfigPath\n} from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { AdoCoreClient } from '../ado/client/core.js';\nimport { AdoWorkClient } from '../ado/client/work.js';\nimport { discoverFields, discoverTypes, buildDefaultAliases } from '../ado/discovery.js';\nimport { checkArtifactoryConnectivity } from '../deps/clients/artifactory.js';\nimport { success, fail, warn } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport chalk from 'chalk';\nimport fs from 'fs';\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command('config').description('Manage pncli configuration');\n\n config\n .command('init')\n .description('Setup wizard for service credentials (interactive)')\n .option('--repo', 'Write repo config (.pncli.json) instead of global config')\n .action(async (opts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (opts.repo) {\n await initRepoConfig(start);\n } else {\n await initGlobalConfig(start);\n }\n } catch (err) {\n // Handle prompt cancellation (Ctrl+C) gracefully\n if (err instanceof Error && err.message.includes('User force closed')) {\n process.stderr.write('\\nSetup cancelled.\\n');\n process.exitCode = ExitCode.GENERAL_ERROR;\n return;\n }\n fail(err, 'config', 'init', start);\n }\n });\n\n config\n .command('show')\n .description('Print fully resolved config (PATs masked)')\n .action(() => {\n const start = Date.now();\n try {\n const resolved = loadConfig();\n success(maskConfig(resolved), 'config', 'show', start);\n } catch (err) {\n fail(err, 'config', 'show', start);\n }\n });\n\n config\n .command('set')\n .description('Set a config value by dot-notation key (e.g. jira.baseUrl https://...)')\n .argument('<key>', 'Config key in dot notation')\n .argument('<value>', 'Value to set')\n .option('--repo', 'Write to repo config (.pncli.json) instead of global config')\n .action((key: string, value: string, cmdOpts: { repo?: boolean }) => {\n const start = Date.now();\n try {\n if (cmdOpts.repo) {\n setRepoConfigValue(key, value);\n success({ key, value, target: '.pncli.json' }, 'config', 'set', start);\n } else {\n const opts = program.optsWithGlobals();\n setConfigValue(key, value, opts.config);\n success({ key, value }, 'config', 'set', start);\n }\n } catch (err) {\n fail(err, 'config', 'set', start);\n }\n });\n\n config\n .command('test')\n .description('Test connectivity to configured services')\n .action(async () => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n const http = createHttpClient(cfg);\n\n type ServiceResult = { ok: boolean; message: string } | { ok: null; message: string };\n const results: Record<string, ServiceResult> = {};\n\n if (cfg.jira.baseUrl) {\n try {\n await http.jira<unknown>('/rest/api/2/myself');\n results.jira = { ok: true, message: 'connected' };\n } catch (err) {\n results.jira = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jira = { ok: null, message: 'not configured' };\n }\n\n if (cfg.bitbucket.baseUrl) {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties');\n results.bitbucket = { ok: true, message: 'connected' };\n } catch (err) {\n results.bitbucket = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.bitbucket = { ok: null, message: 'not configured' };\n }\n\n if (cfg.github.baseUrl) {\n try {\n await http.github<unknown>('/user');\n results.github = { ok: true, message: 'connected' };\n } catch (err) {\n results.github = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.github = { ok: null, message: 'not configured' };\n }\n\n if (cfg.confluence.baseUrl) {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 } });\n results.confluence = { ok: true, message: 'connected' };\n } catch (err) {\n results.confluence = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.confluence = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonar.baseUrl) {\n try {\n await http.sonar<unknown>('/api/system/status');\n results.sonar = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonar = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonar = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sde.baseUrl) {\n try {\n await http.sde<unknown>('/api/v2/users/me/');\n results.sde = { ok: true, message: 'connected' };\n } catch (err) {\n results.sde = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sde = { ok: null, message: 'not configured' };\n }\n\n if (cfg.ado.baseUrl) {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path);\n results.ado = { ok: true, message: 'connected' };\n } catch (err) {\n results.ado = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.ado = { ok: null, message: 'not configured' };\n }\n\n if (cfg.jenkins.baseUrl && cfg.jenkins.username && cfg.jenkins.apiToken) {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' } });\n results.jenkins = { ok: true, message: 'connected' };\n } catch (err) {\n results.jenkins = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.jenkins = { ok: null, message: 'not configured' };\n }\n\n if (cfg.artifactory.baseUrl) {\n try {\n await http.artifactoryText('/api/system/ping');\n results.artifactory = { ok: true, message: 'connected' };\n } catch (err) {\n results.artifactory = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.artifactory = { ok: null, message: 'not configured' };\n }\n\n if (cfg.udeploy.baseUrl && (cfg.udeploy.pat || (cfg.udeploy.username && cfg.udeploy.password))) {\n try {\n await http.udeploy<unknown>('/cli/application');\n results.udeploy = { ok: true, message: 'connected' };\n } catch (err) {\n results.udeploy = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.udeploy = { ok: null, message: 'not configured' };\n }\n\n if (cfg.checkmarx.baseUrl && cfg.checkmarx.tenantName && (cfg.checkmarx.apiKey || (cfg.checkmarx.clientId && cfg.checkmarx.clientSecret))) {\n try {\n await http.checkmarx<unknown>('/api/projects', { params: { limit: 1 } });\n results.checkmarx = { ok: true, message: 'connected' };\n } catch (err) {\n results.checkmarx = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.checkmarx = { ok: null, message: 'not configured' };\n }\n\n const snConfigured = cfg.servicenow.baseUrl && cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (snConfigured) {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n results.servicenow = { ok: true, message: 'connected' };\n } catch (err) {\n results.servicenow = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.servicenow = { ok: null, message: 'not configured' };\n }\n\n if (cfg.contrast.apiKey && cfg.contrast.serviceKey && cfg.contrast.username && cfg.contrast.orgUuid) {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 } });\n results.contrast = { ok: true, message: 'connected' };\n } catch (err) {\n results.contrast = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.contrast = { ok: null, message: 'not configured' };\n }\n\n if (cfg.sonatypeiq.baseUrl && cfg.sonatypeiq.userCode && cfg.sonatypeiq.passcode) {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n results.sonatypeiq = { ok: true, message: 'connected' };\n } catch (err) {\n results.sonatypeiq = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.sonatypeiq = { ok: null, message: 'not configured' };\n }\n\n if (cfg.openshift.baseUrl && cfg.openshift.token) {\n try {\n await http.openshift<unknown>('/api/v1');\n results.openshift = { ok: true, message: 'connected' };\n } catch (err) {\n results.openshift = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.openshift = { ok: null, message: 'not configured' };\n }\n\n if (cfg.dynatrace.baseUrl && cfg.dynatrace.apiToken) {\n try {\n await http.dynatrace<unknown>('/api/v2/entities', {\n params: { entitySelector: 'type(\"SERVICE\")', pageSize: 1 }\n });\n results.dynatrace = { ok: true, message: 'connected' };\n } catch (err) {\n results.dynatrace = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.dynatrace = { ok: null, message: 'not configured' };\n }\n\n if (cfg.dynatrace.platformUrl && cfg.dynatrace.platformToken) {\n try {\n await http.dynatracePlatform<unknown>('/platform/storage/query/v1/query:execute', {\n method: 'POST',\n body: {\n query: 'fetch spans | limit 1',\n requestTimeoutMilliseconds: 5000\n },\n timeoutMs: 10_000\n });\n results.dynatrace_platform = { ok: true, message: 'connected' };\n } catch (err) {\n results.dynatrace_platform = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else if (cfg.dynatrace.platformUrl || cfg.dynatrace.platformToken) {\n results.dynatrace_platform = { ok: false, message: 'platformUrl and platformToken must both be configured' };\n } else {\n results.dynatrace_platform = { ok: null, message: 'not configured' };\n }\n\n if (cfg.logscale.baseUrl && cfg.logscale.token) {\n try {\n await http.logscale<unknown[]>('/api/v1/repositories');\n results.logscale = { ok: true, message: 'connected' };\n } catch (err) {\n results.logscale = { ok: false, message: err instanceof Error ? err.message : String(err) };\n }\n } else {\n results.logscale = { ok: null, message: 'not configured' };\n }\n\n success(results, 'config', 'test', start);\n } catch (err) {\n fail(err, 'config', 'test', start);\n }\n });\n\n config\n .command('check')\n .description('Check PAT status for every service: Blank, Valid, or Invalid')\n .option('--output <format>', 'Output format: json or table', 'json')\n .action(async (cmdOpts: { output: string }) => {\n const start = Date.now();\n try {\n const opts = program.optsWithGlobals();\n const cfg = loadConfig({ configPath: opts.config });\n // Always bypass --dry-run: a dry-run config check is meaningless\n const http = createHttpClient(cfg, false);\n\n type CheckStatus = 'blank' | 'valid' | 'invalid' | 'error';\n type CheckResult = { status: CheckStatus; message: string };\n const results: Record<string, CheckResult> = {};\n\n function categorize(err: unknown): CheckResult {\n const status = (err as { status?: number }).status ?? -1;\n if (status === 401 || status === 403) {\n return { status: 'invalid', message: `auth rejected (${status})` };\n }\n if (status === 0) {\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n return { status: 'error', message: (err instanceof Error ? err.message : String(err)) };\n }\n\n // Jira\n if (!cfg.jira.apiToken) {\n results.jira = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jira.baseUrl) {\n results.jira = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jira<unknown>('/rest/api/2/myself', { timeoutMs: 10_000 });\n results.jira = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jira = categorize(err);\n }\n }\n\n // Bitbucket\n if (!cfg.bitbucket.pat) {\n results.bitbucket = { status: 'blank', message: 'not configured' };\n } else if (!cfg.bitbucket.baseUrl) {\n results.bitbucket = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.bitbucket<unknown>('/rest/api/1.0/application-properties', { timeoutMs: 10_000 });\n results.bitbucket = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.bitbucket = categorize(err);\n }\n }\n\n // GitHub\n if (!cfg.github.token) {\n results.github = { status: 'blank', message: 'not configured' };\n } else if (!cfg.github.baseUrl) {\n results.github = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.github<unknown>('/user', { timeoutMs: 10_000 });\n results.github = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.github = categorize(err);\n }\n }\n\n // Confluence — distinguish explicit token from Jira fallback\n if (!cfg.confluence.apiTokenExplicit && !cfg.jira.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.apiToken) {\n results.confluence = { status: 'blank', message: 'not configured' };\n } else if (!cfg.confluence.baseUrl) {\n results.confluence = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.confluence<unknown>('/rest/api/space', { params: { limit: 1 }, timeoutMs: 10_000 });\n const msg = cfg.confluence.apiTokenExplicit ? 'ok' : 'ok (inherited from Jira token)';\n results.confluence = { status: 'valid', message: msg };\n } catch (err) {\n results.confluence = categorize(err);\n }\n }\n\n // SonarQube\n if (!cfg.sonar.token) {\n results.sonar = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonar.baseUrl) {\n results.sonar = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonar<unknown>('/api/system/status', { timeoutMs: 10_000 });\n results.sonar = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonar = categorize(err);\n }\n }\n\n // SDElements\n if (!cfg.sde.token) {\n results.sde = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sde.baseUrl) {\n results.sde = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sde<unknown>('/api/v2/users/me/', { timeoutMs: 10_000 });\n results.sde = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sde = categorize(err);\n }\n }\n\n // Azure DevOps\n if (!cfg.ado.pat) {\n results.ado = { status: 'blank', message: 'not configured' };\n } else if (!cfg.ado.baseUrl) {\n results.ado = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n const collection = cfg.defaults.ado?.collection;\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=7.1-preview.1`\n : '/_apis/projectCollections?api-version=7.1';\n await http.ado<unknown>(path, { timeoutMs: 10_000 });\n results.ado = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.ado = categorize(err);\n }\n }\n\n // Jenkins\n if (!cfg.jenkins.apiToken || !cfg.jenkins.username) {\n results.jenkins = { status: 'blank', message: 'not configured' };\n } else if (!cfg.jenkins.baseUrl) {\n results.jenkins = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.jenkins<unknown>('/api/json', { params: { tree: 'nodeName' }, timeoutMs: 10_000 });\n results.jenkins = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.jenkins = categorize(err);\n }\n }\n\n // UDeploy\n if (!cfg.udeploy.pat && !(cfg.udeploy.username && cfg.udeploy.password)) {\n results.udeploy = { status: 'blank', message: 'not configured' };\n } else if (!cfg.udeploy.baseUrl) {\n results.udeploy = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.udeploy<unknown>('/cli/application', { timeoutMs: 10_000 });\n results.udeploy = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.udeploy = categorize(err);\n }\n }\n\n // Artifactory — reuse existing helper\n const artResult = await checkArtifactoryConnectivity(cfg.artifactory);\n if (!artResult.configured) {\n results.artifactory = { status: 'blank', message: artResult.error ?? 'not configured' };\n } else if (!artResult.authenticated) {\n results.artifactory = { status: 'invalid', message: artResult.error ?? 'auth rejected' };\n } else if (!artResult.reachable) {\n results.artifactory = { status: 'error', message: artResult.error ?? 'unreachable' };\n } else {\n results.artifactory = { status: 'valid', message: 'ok' };\n }\n\n // Checkmarx\n if (!cfg.checkmarx.tenantName || (!cfg.checkmarx.apiKey && (!cfg.checkmarx.clientId || !cfg.checkmarx.clientSecret))) {\n results.checkmarx = { status: 'blank', message: 'not configured' };\n } else if (!cfg.checkmarx.baseUrl) {\n results.checkmarx = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.checkmarx<unknown>('/api/projects', { params: { limit: 1 }, timeoutMs: 10_000 });\n results.checkmarx = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.checkmarx = categorize(err);\n }\n }\n\n // ServiceNow\n const snCreds = cfg.servicenow.username && (cfg.servicenow.password || cfg.servicenow.apiToken);\n if (!snCreds) {\n results.servicenow = { status: 'blank', message: 'not configured' };\n } else if (!cfg.servicenow.baseUrl) {\n results.servicenow = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 }, timeoutMs: 10_000 });\n results.servicenow = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.servicenow = categorize(err);\n }\n }\n\n // Contrast IAST\n if (!cfg.contrast.apiKey || !cfg.contrast.serviceKey || !cfg.contrast.username) {\n results.contrast = { status: 'blank', message: 'not configured' };\n } else if (!cfg.contrast.orgUuid) {\n results.contrast = { status: 'error', message: 'orgUuid not configured' };\n } else {\n try {\n await http.contrast<unknown>(`/Contrast/api/ng/${cfg.contrast.orgUuid}/applications`, { params: { limit: 1 }, timeoutMs: 10_000 });\n results.contrast = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.contrast = categorize(err);\n }\n }\n\n // Sonatype IQ Server\n if (!cfg.sonatypeiq.userCode || !cfg.sonatypeiq.passcode) {\n results.sonatypeiq = { status: 'blank', message: 'not configured' };\n } else if (!cfg.sonatypeiq.baseUrl) {\n results.sonatypeiq = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 }, timeoutMs: 10_000 });\n results.sonatypeiq = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.sonatypeiq = categorize(err);\n }\n }\n\n // OpenShift / Kubernetes\n if (!cfg.openshift.token) {\n results.openshift = { status: 'blank', message: 'not configured' };\n } else if (!cfg.openshift.baseUrl) {\n results.openshift = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.openshift<unknown>('/api/v1', { timeoutMs: 10_000 });\n results.openshift = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.openshift = categorize(err);\n }\n }\n\n if (!cfg.dynatrace.apiToken) {\n results.dynatrace = { status: 'blank', message: 'not configured' };\n } else if (!cfg.dynatrace.baseUrl) {\n results.dynatrace = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.dynatrace<unknown>('/api/v2/entities', {\n params: { entitySelector: 'type(\"SERVICE\")', pageSize: 1 },\n timeoutMs: 10_000\n });\n results.dynatrace = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.dynatrace = categorize(err);\n }\n }\n\n if (!cfg.dynatrace.platformUrl && !cfg.dynatrace.platformToken) {\n results.dynatrace_platform = { status: 'blank', message: 'not configured' };\n } else if (!cfg.dynatrace.platformUrl || !cfg.dynatrace.platformToken) {\n results.dynatrace_platform = {\n status: 'error',\n message: 'platformUrl and platformToken must both be configured'\n };\n } else {\n try {\n await http.dynatracePlatform<unknown>('/platform/storage/query/v1/query:execute', {\n method: 'POST',\n body: {\n query: 'fetch spans | limit 1',\n requestTimeoutMilliseconds: 5000\n },\n timeoutMs: 10_000\n });\n results.dynatrace_platform = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.dynatrace_platform = categorize(err);\n }\n }\n\n // LogScale\n if (!cfg.logscale.token) {\n results.logscale = { status: 'blank', message: 'not configured' };\n } else if (!cfg.logscale.baseUrl) {\n results.logscale = { status: 'error', message: 'baseUrl not configured' };\n } else {\n try {\n await http.logscale<unknown[]>('/api/v1/repositories', { timeoutMs: 10_000 });\n results.logscale = { status: 'valid', message: 'ok' };\n } catch (err) {\n results.logscale = categorize(err);\n }\n }\n\n // Exit code: prefer AUTH_ERROR if any invalid, else NETWORK_ERROR if any errors\n const statuses = Object.values(results).map(r => r.status);\n if (statuses.includes('invalid')) process.exitCode = ExitCode.AUTH_ERROR;\n else if (statuses.includes('error')) process.exitCode = ExitCode.NETWORK_ERROR;\n\n if (cmdOpts.output === 'table') {\n // Human-readable table to stdout\n const services = ['jira', 'bitbucket', 'github', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq', 'openshift', 'dynatrace', 'dynatrace_platform', 'logscale'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stdout.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stdout.write('\\n');\n } else {\n // Pretty table on stderr when --pretty is set (stdout stays JSON)\n if (opts.pretty) {\n const services = ['jira', 'bitbucket', 'github', 'confluence', 'sonar', 'sde', 'ado', 'jenkins', 'udeploy', 'artifactory', 'checkmarx', 'servicenow', 'contrast', 'sonatypeiq', 'openshift', 'dynatrace', 'dynatrace_platform', 'logscale'] as const;\n const labelWidth = 14;\n const statusWidth = 9;\n for (const svc of services) {\n const r = results[svc];\n if (!r) continue;\n const label = svc.padEnd(labelWidth);\n const coloredStatus =\n r.status === 'valid' ? chalk.green('valid'.padEnd(statusWidth)) :\n r.status === 'blank' ? chalk.gray('blank'.padEnd(statusWidth)) :\n r.status === 'invalid' ? chalk.red('invalid'.padEnd(statusWidth)) :\n chalk.yellow('error'.padEnd(statusWidth));\n process.stderr.write(` ${label}${coloredStatus}${r.message}\\n`);\n }\n process.stderr.write('\\n');\n }\n success(results, 'config', 'check', start);\n }\n } catch (err) {\n fail(err, 'config', 'check', start);\n }\n });\n}\n\nfunction normalizeBaseUrl(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return trimmed;\n return /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n}\n\nasync function initGlobalConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init — Global configuration\\n\\n');\n\n process.stderr.write('── Identity ──────────────────────────────────────\\n');\n const userEmail = await input({\n message: 'Your email address (used across Jira, Bitbucket, etc.):',\n default: ''\n });\n\n const userId = await input({\n message: 'Your username / user ID:',\n default: ''\n });\n\n process.stderr.write('\\n── Jira ──────────────────────────────────────────\\n');\n const jiraBaseUrl = await input({\n message: 'Jira base URL (e.g. jira.imagile.dev):',\n default: ''\n });\n\n const jiraApiToken = await password({\n message: 'Jira personal access token:'\n });\n\n process.stderr.write('\\n── Bitbucket ─────────────────────────────────────\\n');\n const bitbucketBaseUrl = await input({\n message: 'Bitbucket Server base URL (e.g. bitbucket.imagile.dev):',\n default: ''\n });\n\n const bitbucketPat = await password({\n message: 'Bitbucket personal access token:'\n });\n\n process.stderr.write('\\n── GitHub ────────────────────────────────────────\\n');\n const useGitHub = await confirm({\n message: 'Configure GitHub for PR operations?',\n default: false\n });\n\n let githubBaseUrl = '';\n let githubToken = '';\n\n if (useGitHub) {\n githubBaseUrl = await input({\n message: 'GitHub API base URL\\n GitHub.com: api.github.com\\n GitHub Enterprise: <host>/api/v3\\n URL: ',\n default: ''\n });\n\n githubToken = await password({\n message: 'GitHub personal access token (classic or fine-grained):'\n });\n\n if (githubBaseUrl && githubToken) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n github: {\n baseUrl: normalizeBaseUrl(githubBaseUrl),\n token: githubToken\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.github<unknown>('/user');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to GitHub: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and token and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Confluence ────────────────────────────────────\\n');\n const confluenceBaseUrl = await input({\n message: 'Confluence base URL (e.g. confluence.imagile.dev):',\n default: ''\n });\n\n const confluenceApiToken = await password({\n message: 'Confluence personal access token:'\n });\n\n process.stderr.write('\\n── Artifactory ───────────────────────────────────\\n');\n const useArtifactory = await confirm({\n message: 'Configure Artifactory for dependency commands (deps outdated, deps license-check)?',\n default: false\n });\n\n let artifactoryBaseUrl = '';\n let artifactoryToken = '';\n let npmRepo = '';\n let nugetRepo = '';\n let mavenRepo = '';\n\n if (useArtifactory) {\n artifactoryBaseUrl = await input({\n message: 'Artifactory base URL (e.g. artifactory.imagile.dev):',\n default: ''\n });\n\n artifactoryToken = await password({\n message: 'Artifactory API token:'\n });\n\n process.stderr.write('\\nConfigure which ecosystems you use (skip any that don\\'t apply):\\n');\n\n const useNpm = await confirm({ message: ' Use npm packages from Artifactory?', default: true });\n if (useNpm) {\n npmRepo = await input({ message: ' npm repository name:', default: 'npm-remote' });\n }\n\n const useNuget = await confirm({ message: ' Use NuGet packages from Artifactory?', default: false });\n if (useNuget) {\n nugetRepo = await input({ message: ' NuGet repository name:', default: 'nuget-remote' });\n }\n\n const useMaven = await confirm({ message: ' Use Maven packages from Artifactory?', default: false });\n if (useMaven) {\n mavenRepo = await input({ message: ' Maven repository name:', default: 'libs-release' });\n }\n }\n\n process.stderr.write('\\n── SonarQube ─────────────────────────────────────\\n');\n const useSonar = await confirm({\n message: 'Configure SonarQube Server for code quality checks?',\n default: false\n });\n\n let sonarBaseUrl = '';\n let sonarToken = '';\n\n if (useSonar) {\n sonarBaseUrl = await input({\n message: 'SonarQube Server base URL (e.g. sonar.imagile.dev):',\n default: ''\n });\n\n sonarToken = await password({\n message: 'SonarQube personal access token:'\n });\n }\n\n process.stderr.write('\\n── SDElements ────────────────────────────────────\\n');\n const useSde = await confirm({\n message: 'Configure SDElements for threat modeling and countermeasure queries?',\n default: false\n });\n\n let sdeBaseUrl = '';\n let sdeToken = '';\n\n if (useSde) {\n process.stderr.write(' Connection string format: <api-token>@<base-url>\\n');\n const useSdeConnectionString = await confirm({\n message: 'Do you have a connection string to paste (token@url)?',\n default: false\n });\n\n if (useSdeConnectionString) {\n const sdeConnection = await password({\n message: 'SDElements connection string (api-token@hostname, e.g. mytoken@myorg.sdelements.com):'\n });\n const atIdx = sdeConnection.indexOf('@');\n if (atIdx > 0) {\n sdeToken = sdeConnection.slice(0, atIdx);\n sdeBaseUrl = sdeConnection.slice(atIdx + 1);\n }\n } else {\n sdeBaseUrl = await input({\n message: 'SDElements hostname\\n Cloud-hosted: imagile.sdelements.com\\n On-premise: sde.imagile.dev\\n Host: ',\n default: ''\n });\n\n sdeToken = await password({\n message: 'SDElements API token:'\n });\n }\n }\n\n process.stderr.write('\\n── Azure DevOps Server ───────────────────────────\\n');\n const useAdo = await confirm({\n message: 'Configure Azure DevOps Server for work items, repos, and pipelines?',\n default: false\n });\n\n let adoBaseUrl = '';\n let adoPat = '';\n let adoCollection = '';\n let adoProject = '';\n let adoFieldAliases: Record<string, string> = {};\n let adoDiscoveredFields: import('../../types/config.js').AdoFieldMeta[] = [];\n let adoDiscoveredTypes: import('../../types/config.js').AdoWorkItemTypeMeta[] = [];\n\n if (useAdo) {\n adoBaseUrl = await input({\n message: 'Azure DevOps Server base URL (e.g. tfs.imagile.dev or devops.imagile.dev/tfs):',\n default: ''\n });\n\n adoPat = await password({\n message: 'Azure DevOps personal access token:'\n });\n\n adoCollection = await input({\n message: 'Default collection name (e.g. DefaultCollection):',\n default: ''\n });\n\n adoProject = await input({\n message: 'Default team project name:',\n default: ''\n });\n\n // Validate connectivity before asking discovery questions\n if (adoBaseUrl && adoCollection) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n pat: adoPat || undefined,\n fieldAliases: {},\n discoveredFields: [],\n discoveredTypes: []\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n const tempCore = new AdoCoreClient(tempHttp);\n await tempCore.getConnectionData(adoCollection);\n process.stderr.write(' Connected.\\n');\n\n // Optional field/type discovery\n if (adoProject) {\n const doDiscover = await confirm({\n message: 'Discover work item types and fields from this collection now? (recommended)',\n default: true\n });\n\n if (doDiscover) {\n process.stderr.write(' Fetching work item types and fields...\\n');\n const tempWork = new AdoWorkClient(tempHttp);\n adoDiscoveredFields = await discoverFields(tempWork, adoCollection);\n process.stderr.write(` Found ${adoDiscoveredFields.length} fields.\\n`);\n adoDiscoveredTypes = await discoverTypes(tempWork, adoCollection, adoProject);\n process.stderr.write(` Found ${adoDiscoveredTypes.length} work item types.\\n`);\n\n const doAliases = await confirm({\n message: 'Save friendly aliases for common fields? (e.g. \"priority\" → reference name)',\n default: true\n });\n if (doAliases) {\n adoFieldAliases = buildDefaultAliases(adoDiscoveredFields as Parameters<typeof buildDefaultAliases>[0]);\n process.stderr.write(` Generated ${Object.keys(adoFieldAliases).length} aliases.\\n`);\n }\n }\n }\n } catch (err) {\n warn(`Could not connect to Azure DevOps: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Jenkins ───────────────────────────────────────\\n');\n const useJenkins = await confirm({\n message: 'Configure Jenkins Data Center for pipeline operations?',\n default: false\n });\n\n let jenkinsBaseUrl = '';\n let jenkinsUsername = '';\n let jenkinsApiToken = '';\n\n if (useJenkins) {\n jenkinsBaseUrl = await input({\n message: 'Jenkins base URL (e.g. jenkins.imagile.dev):',\n default: ''\n });\n\n jenkinsUsername = await input({\n message: 'Jenkins username:',\n default: ''\n });\n\n jenkinsApiToken = await password({\n message: 'Jenkins API token:'\n });\n }\n\n process.stderr.write('\\n── IBM UrbanCode Deploy ──────────────────────────\\n');\n const useUdeploy = await confirm({\n message: 'Configure IBM UrbanCode Deploy for component imports and deployment processes?',\n default: false\n });\n\n let udeployBaseUrl = '';\n let udeployPat = '';\n let udeployUsername = '';\n let udeployPassword = '';\n let udeployDefaultApp = '';\n let udeployDefaultEnv = '';\n\n if (useUdeploy) {\n udeployBaseUrl = await input({\n message: 'UDeploy base URL (e.g. ucd.imagile.dev:8443):',\n default: ''\n });\n\n udeployUsername = await input({\n message: 'UDeploy username (leave blank to use a PAT instead):',\n default: ''\n });\n\n if (udeployUsername) {\n udeployPassword = await password({\n message: 'UDeploy password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n } else {\n udeployPat = await password({\n message: 'UDeploy personal access token:'\n });\n }\n\n udeployDefaultApp = await input({\n message: 'Default application name (optional):',\n default: ''\n });\n\n udeployDefaultEnv = await input({\n message: 'Default environment name (optional):',\n default: ''\n });\n\n const hasCredentials = udeployBaseUrl && (udeployPat || (udeployUsername && udeployPassword));\n if (hasCredentials) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n pat: udeployPat || undefined,\n username: udeployUsername || undefined,\n password: udeployPassword || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.udeploy<unknown>('/cli/application');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to UDeploy: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Checkmarx ─────────────────────────────────────\\n');\n const useCheckmarx = await confirm({\n message: 'Configure Checkmarx One for vulnerability scanning?',\n default: false\n });\n\n let checkmarxBaseUrl = '';\n let checkmarxTenantName = '';\n let checkmarxApiKey = '';\n let checkmarxClientId = '';\n let checkmarxClientSecret = '';\n\n if (useCheckmarx) {\n checkmarxBaseUrl = await input({\n message: 'Checkmarx One API base URL (e.g. https://ast.checkmarx.net):',\n default: ''\n });\n\n checkmarxTenantName = await input({\n message: 'Checkmarx One tenant name (IAM realm, e.g. imagile):',\n default: ''\n });\n\n checkmarxApiKey = await password({\n message: 'Checkmarx One API key (leave blank to use an OAuth client):'\n });\n\n if (!checkmarxApiKey) {\n checkmarxClientId = await input({\n message: 'Checkmarx One OAuth client ID:',\n default: ''\n });\n\n checkmarxClientSecret = await password({\n message: 'Checkmarx One OAuth client secret:',\n validate: (v) => v.length > 0 || 'Client secret cannot be blank'\n });\n }\n\n if (checkmarxBaseUrl && checkmarxTenantName && (checkmarxApiKey || (checkmarxClientId && checkmarxClientSecret))) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n tenantName: checkmarxTenantName,\n apiKey: checkmarxApiKey || undefined,\n clientId: checkmarxClientId,\n clientSecret: checkmarxClientSecret\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.checkmarx<unknown>('/api/projects', { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Checkmarx: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── ServiceNow ────────────────────────────────────\\n');\n const useServiceNow = await confirm({\n message: 'Configure ServiceNow for change management?',\n default: false\n });\n\n let servicenowBaseUrl = '';\n let servicenowUsername = '';\n let servicenowPassword = '';\n let servicenowApiToken = '';\n\n if (useServiceNow) {\n servicenowBaseUrl = await input({\n message: 'ServiceNow instance URL (e.g. imagile.service-now.com):',\n default: ''\n });\n\n servicenowUsername = await input({\n message: 'ServiceNow username:',\n default: ''\n });\n\n const snUseToken = await confirm({\n message: 'Authenticate with an API token instead of a password?',\n default: false\n });\n\n if (snUseToken) {\n servicenowApiToken = await password({\n message: 'ServiceNow API token:',\n validate: (v) => v.length > 0 || 'Token cannot be blank'\n });\n } else {\n servicenowPassword = await password({\n message: 'ServiceNow password:',\n validate: (v) => v.length > 0 || 'Password cannot be blank'\n });\n }\n\n const snHasCreds = servicenowBaseUrl && servicenowUsername && (servicenowPassword || servicenowApiToken);\n if (snHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername,\n password: servicenowPassword || undefined,\n apiToken: servicenowApiToken || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.servicenow<unknown>('/api/now/table/change_request', { params: { sysparm_limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to ServiceNow: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Sonatype IQ Server ────────────────────────────\\n');\n const useSonatypeIq = await confirm({\n message: 'Configure Sonatype IQ Server for dependency vulnerability scanning?',\n default: false\n });\n\n let sonatypeIqBaseUrl = '';\n let sonatypeIqUserCode = '';\n let sonatypeIqPasscode = '';\n\n if (useSonatypeIq) {\n process.stderr.write(' User Token credentials are found in your IQ Server profile under User Token.\\n');\n\n sonatypeIqBaseUrl = await input({\n message: 'Sonatype IQ Server base URL (e.g. iq.imagile.dev):',\n default: ''\n });\n\n sonatypeIqUserCode = await input({\n message: 'User Code (from User Token):',\n default: ''\n });\n\n sonatypeIqPasscode = await password({\n message: 'Passcode (from User Token):'\n });\n\n if (sonatypeIqBaseUrl && sonatypeIqUserCode && sonatypeIqPasscode) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode,\n passcode: sonatypeIqPasscode\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.sonatypeiq<unknown>('/api/v2/applications', { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Sonatype IQ Server: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Contrast IAST ─────────────────────────────────\\n');\n const useContrast = await confirm({\n message: 'Configure Contrast Security IAST for vulnerability findings?',\n default: false\n });\n\n let contrastBaseUrl = '';\n let contrastOrgUuid = '';\n let contrastUsername = '';\n let contrastApiKey = '';\n let contrastServiceKey = '';\n\n if (useContrast) {\n process.stderr.write(' Find your credentials in Contrast under User Settings → Your Keys.\\n');\n\n contrastBaseUrl = await input({\n message: 'Contrast base URL (e.g. https://app.contrastsecurity.com for cloud SaaS):',\n validate: (v: string) => v.trim() ? true : 'Base URL is required',\n default: ''\n });\n\n contrastOrgUuid = await input({\n message: 'Organization UUID:',\n default: ''\n });\n\n contrastUsername = await input({\n message: 'Username (email):',\n default: ''\n });\n\n contrastApiKey = await password({\n message: 'API key:'\n });\n\n contrastServiceKey = await password({\n message: 'Service key:'\n });\n\n const contrastHasCreds = contrastOrgUuid && contrastUsername && contrastApiKey && contrastServiceKey;\n if (contrastHasCreds) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n contrast: {\n baseUrl: normalizeBaseUrl(contrastBaseUrl) || undefined,\n orgUuid: contrastOrgUuid,\n username: contrastUsername,\n apiKey: contrastApiKey,\n serviceKey: contrastServiceKey\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.contrast<unknown>(`/Contrast/api/ng/${contrastOrgUuid}/applications`, { params: { limit: 1 } });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Contrast: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your credentials and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── OpenShift / Kubernetes ────────────────────────\\n');\n const useOpenShift = await confirm({\n message: 'Configure OpenShift / Kubernetes for pod health monitoring?',\n default: false\n });\n\n let openShiftBaseUrl = '';\n let openShiftToken = '';\n\n if (useOpenShift) {\n process.stderr.write(' Service account token: cat /var/run/secrets/kubernetes.io/serviceaccount/token\\n');\n\n openShiftBaseUrl = await input({\n message: 'OpenShift API server URL (e.g. https://api.cluster.imagile.dev:6443):',\n default: ''\n });\n\n openShiftToken = await password({\n message: 'Service account token:'\n });\n\n if (openShiftBaseUrl && openShiftToken) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n openshift: {\n baseUrl: normalizeBaseUrl(openShiftBaseUrl),\n token: openShiftToken\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.openshift<unknown>('/api/v1');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to OpenShift: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and token and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Dynatrace ─────────────────────────────────────\\n');\n const useDynatrace = await confirm({\n message: 'Configure Dynatrace for services, problems, workloads, and traces?',\n default: false\n });\n\n let dynatraceBaseUrl = '';\n let dynatraceApiToken = '';\n let dynatracePlatformUrl = '';\n let dynatracePlatformToken = '';\n\n if (useDynatrace) {\n dynatraceBaseUrl = await input({\n message: 'Dynatrace environment URL (e.g. https://abc12345.live.dynatrace.com):',\n default: ''\n });\n dynatraceApiToken = await password({\n message: 'Environment API token (entities.read and problems.read):'\n });\n const configureTraces = await confirm({\n message: 'Configure the latest Dynatrace platform for Grail trace queries?',\n default: false\n });\n if (configureTraces) {\n dynatracePlatformUrl = await input({\n message: 'Dynatrace platform URL (e.g. https://abc12345.apps.dynatrace.com):',\n default: ''\n });\n dynatracePlatformToken = await password({\n message: 'Platform token with Grail span read permissions:'\n });\n }\n if (dynatraceBaseUrl && dynatraceApiToken) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n dynatrace: {\n baseUrl: normalizeBaseUrl(dynatraceBaseUrl),\n apiToken: dynatraceApiToken,\n platformUrl: normalizeBaseUrl(dynatracePlatformUrl) || undefined,\n platformToken: dynatracePlatformToken || undefined\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.dynatrace<unknown>('/api/v2/entities', {\n params: { entitySelector: 'type(\"SERVICE\")', pageSize: 1 }\n });\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to Dynatrace: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URLs and tokens and re-run pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── LogScale ──────────────────────────────────────\\n');\n const useLogscale = await confirm({\n message: 'Configure LogScale (Falcon LogScale / Humio) for log queries?',\n default: false\n });\n\n let logscaleBaseUrl = '';\n let logscaleToken = '';\n\n if (useLogscale) {\n logscaleBaseUrl = await input({\n message: 'LogScale base URL (e.g. https://logscale.imagile.dev):',\n default: ''\n });\n\n logscaleToken = await password({\n message: 'LogScale personal access token:'\n });\n\n if (logscaleBaseUrl && logscaleToken) {\n process.stderr.write('\\n Verifying connection...\\n');\n try {\n const tempConfig = {\n ...loadConfig(),\n logscale: {\n baseUrl: normalizeBaseUrl(logscaleBaseUrl),\n token: logscaleToken\n }\n };\n const tempHttp = createHttpClient(tempConfig as Parameters<typeof createHttpClient>[0]);\n await tempHttp.logscale<unknown[]>('/api/v1/repositories');\n process.stderr.write(' Connected.\\n');\n } catch (err) {\n warn(`Could not connect to LogScale: ${err instanceof Error ? err.message : String(err)}`);\n warn('Config will be saved anyway. Check your URL and token and re-run pncli config init or pncli config test.');\n }\n }\n }\n\n process.stderr.write('\\n── Defaults ──────────────────────────────────────\\n');\n const jiraProject = await input({\n message: 'Default Jira project key (optional):',\n default: ''\n });\n\n const sonarProject = useSonar ? await input({\n message: 'Default SonarQube project key (optional):',\n default: ''\n }) : '';\n\n const sdeProject = useSde ? await input({\n message: 'Default SDElements project ID (optional, numeric):',\n default: ''\n }) : '';\n\n process.stderr.write('\\n');\n const confirmed = await confirm({\n message: 'Write config to ~/.pncli/config.json?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exitCode = ExitCode.SUCCESS;\n return;\n }\n\n writeGlobalConfig({\n user: {\n email: userEmail || undefined,\n userId: userId || undefined\n },\n jira: {\n baseUrl: normalizeBaseUrl(jiraBaseUrl) || undefined,\n apiToken: jiraApiToken || undefined\n },\n bitbucket: {\n baseUrl: normalizeBaseUrl(bitbucketBaseUrl) || undefined,\n pat: bitbucketPat || undefined\n },\n ...(useGitHub && githubBaseUrl ? {\n github: {\n baseUrl: normalizeBaseUrl(githubBaseUrl),\n token: githubToken || undefined\n }\n } : {}),\n ...(confluenceBaseUrl || confluenceApiToken ? {\n confluence: {\n baseUrl: normalizeBaseUrl(confluenceBaseUrl) || undefined,\n apiToken: confluenceApiToken || undefined\n }\n } : {}),\n ...(useArtifactory ? {\n artifactory: {\n baseUrl: normalizeBaseUrl(artifactoryBaseUrl) || undefined,\n token: artifactoryToken || undefined,\n npmRepo: npmRepo || undefined,\n nugetRepo: nugetRepo || undefined,\n mavenRepo: mavenRepo || undefined\n }\n } : {}),\n ...(useSonar ? {\n sonar: {\n baseUrl: normalizeBaseUrl(sonarBaseUrl) || undefined,\n token: sonarToken || undefined\n }\n } : {}),\n ...(useSde && sdeToken && sdeBaseUrl ? {\n sde: {\n connection: `${sdeToken}@${sdeBaseUrl}`\n }\n } : {}),\n ...(useAdo && adoBaseUrl ? {\n ado: {\n baseUrl: normalizeBaseUrl(adoBaseUrl),\n ...(adoPat ? { pat: adoPat } : {}),\n ...(Object.keys(adoFieldAliases).length ? { fieldAliases: adoFieldAliases } : {}),\n ...(adoDiscoveredFields.length ? { discoveredFields: adoDiscoveredFields } : {}),\n ...(adoDiscoveredTypes.length ? { discoveredTypes: adoDiscoveredTypes } : {})\n }\n } : {}),\n ...(useJenkins && jenkinsBaseUrl ? {\n jenkins: {\n baseUrl: normalizeBaseUrl(jenkinsBaseUrl),\n ...(jenkinsUsername ? { username: jenkinsUsername } : {}),\n ...(jenkinsApiToken ? { apiToken: jenkinsApiToken } : {})\n }\n } : {}),\n ...(useUdeploy && udeployBaseUrl ? {\n udeploy: {\n baseUrl: normalizeBaseUrl(udeployBaseUrl),\n ...(udeployPat ? { pat: udeployPat } : {}),\n ...(udeployUsername ? { username: udeployUsername } : {}),\n ...(udeployPassword ? { password: udeployPassword } : {})\n }\n } : {}),\n ...(useCheckmarx && checkmarxBaseUrl ? {\n checkmarx: {\n baseUrl: normalizeBaseUrl(checkmarxBaseUrl),\n tenantName: checkmarxTenantName || undefined,\n apiKey: checkmarxApiKey || undefined,\n clientId: checkmarxClientId || undefined,\n clientSecret: checkmarxClientSecret || undefined\n }\n } : {}),\n ...(useServiceNow && servicenowBaseUrl ? {\n servicenow: {\n baseUrl: normalizeBaseUrl(servicenowBaseUrl),\n username: servicenowUsername || undefined,\n ...(servicenowApiToken ? { apiToken: servicenowApiToken } : {}),\n ...(servicenowPassword ? { password: servicenowPassword } : {})\n }\n } : {}),\n ...(useContrast && contrastOrgUuid ? {\n contrast: {\n ...(contrastBaseUrl ? { baseUrl: normalizeBaseUrl(contrastBaseUrl) } : {}),\n orgUuid: contrastOrgUuid,\n username: contrastUsername || undefined,\n apiKey: contrastApiKey || undefined,\n serviceKey: contrastServiceKey || undefined\n }\n } : {}),\n ...(useSonatypeIq && sonatypeIqBaseUrl ? {\n sonatypeiq: {\n baseUrl: normalizeBaseUrl(sonatypeIqBaseUrl),\n userCode: sonatypeIqUserCode || undefined,\n passcode: sonatypeIqPasscode || undefined\n }\n } : {}),\n ...(useOpenShift && openShiftBaseUrl ? {\n openshift: {\n baseUrl: normalizeBaseUrl(openShiftBaseUrl),\n token: openShiftToken || undefined\n }\n } : {}),\n ...(useDynatrace && dynatraceBaseUrl ? {\n dynatrace: {\n baseUrl: normalizeBaseUrl(dynatraceBaseUrl),\n apiToken: dynatraceApiToken || undefined,\n platformUrl: normalizeBaseUrl(dynatracePlatformUrl) || undefined,\n platformToken: dynatracePlatformToken || undefined\n }\n } : {}),\n ...(useLogscale && logscaleBaseUrl ? {\n logscale: {\n baseUrl: normalizeBaseUrl(logscaleBaseUrl),\n token: logscaleToken || undefined\n }\n } : {}),\n defaults: {\n jira: {\n project: jiraProject || undefined\n },\n ...(useSonar && sonarProject ? {\n sonar: {\n project: sonarProject || undefined\n }\n } : {}),\n ...(useSde && sdeProject ? {\n sde: {\n project: sdeProject || undefined\n }\n } : {}),\n ...(useAdo && (adoCollection || adoProject) ? {\n ado: {\n collection: adoCollection || undefined,\n project: adoProject || undefined\n }\n } : {}),\n ...(useUdeploy && (udeployDefaultApp || udeployDefaultEnv) ? {\n udeploy: {\n application: udeployDefaultApp || undefined,\n environment: udeployDefaultEnv || undefined\n }\n } : {})\n }\n });\n\n const configPath = getGlobalConfigPath();\n warn(`Config written to ${configPath}`);\n success({ written: configPath }, 'config', 'init', start);\n}\n\nasync function initRepoConfig(start: number): Promise<void> {\n process.stderr.write('pncli config init --repo — Repo configuration\\n\\n');\n\n const jiraProject = await input({\n message: 'Jira project key (e.g. ACME):',\n default: ''\n });\n\n const jiraIssueType = await input({\n message: 'Default issue type:',\n default: 'Story'\n });\n\n const jiraPriority = await input({\n message: 'Default priority:',\n default: 'Medium'\n });\n\n const targetBranch = await input({\n message: 'Default target branch for PRs:',\n default: 'main'\n });\n\n const adoRepoCollection = await input({\n message: 'Default Azure DevOps collection for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoProject = await input({\n message: 'Default Azure DevOps project for this repo (leave blank to use global):',\n default: ''\n });\n\n const adoRepoRepo = await input({\n message: 'Default Azure DevOps repo name for this repo (leave blank to auto-detect):',\n default: ''\n });\n\n const confirmed = await confirm({\n message: 'Write config to .pncli.json in repo root?',\n default: true\n });\n\n if (!confirmed) {\n process.stderr.write('Aborted.\\n');\n process.exitCode = ExitCode.SUCCESS;\n return;\n }\n\n // Warn if .pncli.json already exists\n if (fs.existsSync('.pncli.json')) {\n const overwrite = await confirm({\n message: '.pncli.json already exists. Overwrite?',\n default: false\n });\n if (!overwrite) {\n process.stderr.write('Aborted.\\n');\n process.exitCode = ExitCode.SUCCESS;\n return;\n }\n }\n\n writeRepoConfig({\n defaults: {\n jira: {\n project: jiraProject || undefined,\n issueType: jiraIssueType || undefined,\n priority: jiraPriority || undefined\n },\n bitbucket: {\n targetBranch: targetBranch || undefined\n },\n ...(adoRepoCollection || adoRepoProject || adoRepoRepo ? {\n ado: {\n collection: adoRepoCollection || undefined,\n project: adoRepoProject || undefined,\n repo: adoRepoRepo || undefined\n }\n } : {})\n }\n });\n\n success({ written: '.pncli.json' }, 'config', 'init', start);\n}\n","import { readFileSync } from 'fs';\nimport { basename } from 'path';\nimport type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoWorkItem,\n AdoWorkItemComment,\n AdoWorkItemType,\n AdoWorkItemTypeState,\n AdoField,\n AdoWiqlResult,\n AdoPageResponse,\n AdoWorkItemAttachment,\n AdoClassificationNode\n} from '../../../types/ado.js';\n\nconst API = '7.1';\nconst API_PREVIEW = '7.1-preview.4';\n\nexport interface JsonPatchOp {\n op: 'add' | 'replace' | 'remove';\n path: string;\n value?: unknown;\n}\n\nexport class AdoWorkClient {\n constructor(private http: HttpClient) {}\n\n async getWorkItem(collection: string, id: number): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}&$expand=all`\n );\n }\n\n async createWorkItem(\n collection: string,\n project: string,\n type: string,\n patch: JsonPatchOp[]\n ): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitems/${encodeURIComponent('$' + type)}?api-version=${API}`,\n { method: 'POST', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async updateWorkItem(collection: string, id: number, patch: JsonPatchOp[]): Promise<AdoWorkItem> {\n return this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${id}?api-version=${API}`,\n { method: 'PATCH', body: patch, headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n }\n\n async queryWiql(collection: string, project: string, wiql: string): Promise<AdoWiqlResult> {\n return this.http.ado<AdoWiqlResult>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/wiql?api-version=${API}`,\n { method: 'POST', body: { query: wiql } }\n );\n }\n\n async listComments(collection: string, project: string, workItemId: number): Promise<AdoWorkItemComment[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemComment>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`\n );\n return result.value ?? [];\n }\n\n async addComment(collection: string, project: string, workItemId: number, text: string): Promise<AdoWorkItemComment> {\n return this.http.ado<AdoWorkItemComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workItems/${workItemId}/comments?api-version=${API_PREVIEW}`,\n { method: 'POST', body: { text } }\n );\n }\n\n async addTags(collection: string, id: number, tags: string[]): Promise<AdoWorkItem> {\n const item = await this.getWorkItem(collection, id);\n const existing = ((item.fields as Record<string, unknown>)['System.Tags'] as string | undefined) ?? '';\n const current = existing.split(';').map(t => t.trim()).filter(Boolean);\n const lowerSet = new Set(current.map(t => t.toLowerCase()));\n const toAdd = tags.filter(t => !lowerSet.has(t.toLowerCase()));\n const merged = [...current, ...toAdd];\n const patch: JsonPatchOp[] = [{ op: 'add', path: '/fields/System.Tags', value: merged.join('; ') }];\n return this.updateWorkItem(collection, id, patch);\n }\n\n async removeTags(collection: string, id: number, tags: string[]): Promise<AdoWorkItem> {\n const item = await this.getWorkItem(collection, id);\n const existing = ((item.fields as Record<string, unknown>)['System.Tags'] as string | undefined) ?? '';\n const lower = new Set(tags.map(t => t.toLowerCase()));\n const remaining = existing.split(';').map(t => t.trim()).filter(t => t && !lower.has(t.toLowerCase()));\n const patch: JsonPatchOp[] = [{ op: 'add', path: '/fields/System.Tags', value: remaining.join('; ') }];\n return this.updateWorkItem(collection, id, patch);\n }\n\n async listWorkItemTypes(collection: string, project: string): Promise<AdoWorkItemType[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemType>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeStates(collection: string, project: string, type: string): Promise<AdoWorkItemTypeState[]> {\n const result = await this.http.ado<AdoPageResponse<AdoWorkItemTypeState>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/states?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listFields(collection: string, project?: string): Promise<AdoField[]> {\n const scope = project\n ? `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}`\n : `/${encodeURIComponent(collection)}`;\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `${scope}/_apis/wit/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listTypeFields(collection: string, project: string, type: string): Promise<AdoField[]> {\n const result = await this.http.ado<AdoPageResponse<AdoField>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/workitemtypes/${encodeURIComponent(type)}/fields?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listAttachments(collection: string, workItemId: number): Promise<AdoWorkItemAttachment[]> {\n const item = await this.getWorkItem(collection, workItemId);\n return (item.relations ?? [])\n .filter(r => r.rel === 'AttachedFile')\n .map(r => {\n const attrs = (r.attributes ?? {}) as Record<string, unknown>;\n return {\n id: new URL(r.url).pathname.split('/').pop() ?? '',\n name: String(attrs['name'] ?? ''),\n url: r.url,\n comment: attrs['comment'] !== undefined ? String(attrs['comment']) : undefined,\n resourceSize: typeof attrs['resourceSize'] === 'number' ? attrs['resourceSize'] : undefined,\n resourceCreatedDate: attrs['resourceCreatedDate'] !== undefined ? String(attrs['resourceCreatedDate']) : undefined,\n resourceModifiedDate: attrs['resourceModifiedDate'] !== undefined ? String(attrs['resourceModifiedDate']) : undefined\n };\n });\n }\n\n async downloadAttachment(absoluteUrl: string): Promise<Buffer> {\n return this.http.adoBuffer(absoluteUrl);\n }\n\n async listAreas(collection: string, project: string, depth = 10): Promise<AdoClassificationNode> {\n return this.http.ado<AdoClassificationNode>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/classificationnodes/areas?$depth=${depth}&api-version=${API}`\n );\n }\n\n async listIterations(collection: string, project: string, depth = 10): Promise<AdoClassificationNode> {\n return this.http.ado<AdoClassificationNode>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/wit/classificationnodes/iterations?$depth=${depth}&api-version=${API}`\n );\n }\n\n async uploadAttachment(\n collection: string,\n workItemId: number,\n filePath: string,\n comment?: string\n ): Promise<AdoWorkItemAttachment> {\n const fileContent = readFileSync(filePath);\n const fileName = basename(filePath);\n\n // Step 1: Upload the file to ADO's attachment store.\n // ADO's /_apis/wit/attachments endpoint only accepts application/octet-stream\n // for file uploads — sending any other content type (e.g. text/plain) returns HTTP 400.\n const attachment = await this.http.adoUpload<AdoWorkItemAttachment>(\n `/${encodeURIComponent(collection)}/_apis/wit/attachments?fileName=${encodeURIComponent(fileName)}&api-version=${API}`,\n fileContent,\n 'application/octet-stream'\n );\n\n // Step 2: Link the uploaded attachment to the work item\n const relationValue: Record<string, unknown> = {\n rel: 'AttachedFile',\n url: attachment.url,\n ...(comment ? { attributes: { comment } } : {})\n };\n await this.http.ado<AdoWorkItem>(\n `/${encodeURIComponent(collection)}/_apis/wit/workitems/${workItemId}?api-version=${API}`,\n { method: 'PATCH', body: [{ op: 'add', path: '/relations/-', value: relationValue }], headers: { 'Content-Type': 'application/json-patch+json' } }\n );\n\n return attachment;\n }\n}\n","import type { AdoWorkClient } from './client/work.js';\nimport type { AdoFieldMeta, AdoWorkItemTypeMeta } from '../../types/config.js';\n\n/**\n * Discovers all work item fields in the collection and maps them to AdoFieldMeta.\n */\nexport async function discoverFields(\n client: AdoWorkClient,\n collection: string,\n project?: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listFields(collection, project);\n return fields.map(toFieldMeta);\n}\n\n/**\n * Discovers fields scoped to a specific work item type.\n */\nexport async function discoverTypeFields(\n client: AdoWorkClient,\n collection: string,\n project: string,\n type: string\n): Promise<AdoFieldMeta[]> {\n const fields = await client.listTypeFields(collection, project, type);\n return fields.map(toFieldMeta);\n}\n\nfunction toFieldMeta(f: { referenceName: string; name: string; type: string; readOnly?: boolean; picklistId?: string }): AdoFieldMeta {\n return {\n referenceName: f.referenceName,\n name: f.name,\n type: f.type,\n readOnly: f.readOnly,\n ...(f.picklistId ? { picklistId: f.picklistId } : {})\n };\n}\n\n/**\n * Discovers all work item types and their valid states per type.\n */\nexport async function discoverTypes(\n client: AdoWorkClient,\n collection: string,\n project: string\n): Promise<AdoWorkItemTypeMeta[]> {\n const types = await client.listWorkItemTypes(collection, project);\n const result: AdoWorkItemTypeMeta[] = [];\n\n for (const t of types) {\n const states = await client.listTypeStates(collection, project, t.name);\n const requiredFields = (t.fields ?? [])\n .filter(f => f.alwaysRequired)\n .map(f => f.referenceName);\n result.push({\n name: t.name,\n states: states.map(s => s.name),\n requiredFields\n });\n }\n\n return result;\n}\n\n/**\n * Candidate friendly-name → reference-name pairs for the most common ADO work item fields.\n * Shared by buildDefaultAliases (filtered to fields actually discovered for a project/process)\n * and by helpers.ts's DEFAULT_ADO_FIELD_ALIASES fallback (used before any `--save` discovery\n * has run, so common fields like Description/Acceptance Criteria resolve out of the box).\n */\nexport const ADO_FIELD_ALIAS_CANDIDATES: Array<[string, string]> = [\n ['title', 'System.Title'],\n ['state', 'System.State'],\n ['assignedto', 'System.AssignedTo'],\n ['assigned-to', 'System.AssignedTo'],\n ['description', 'System.Description'],\n ['areapath', 'System.AreaPath'],\n ['area-path', 'System.AreaPath'],\n ['iterationpath', 'System.IterationPath'],\n ['iteration', 'System.IterationPath'],\n ['tags', 'System.Tags'],\n ['priority', 'Microsoft.VSTS.Common.Priority'],\n ['severity', 'Microsoft.VSTS.Common.Severity'],\n ['effort', 'Microsoft.VSTS.Scheduling.Effort'],\n ['storypoints', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['story-points', 'Microsoft.VSTS.Scheduling.StoryPoints'],\n ['remainingwork', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['remaining', 'Microsoft.VSTS.Scheduling.RemainingWork'],\n ['acceptancecriteria', 'Microsoft.VSTS.Common.AcceptanceCriteria'],\n ['reprosteps', 'Microsoft.VSTS.TCM.ReproSteps'],\n ['foundinsource', 'Microsoft.VSTS.Build.FoundIn']\n];\n\n/**\n * Generates a default alias map for the most common field reference names.\n * Only includes aliases for fields actually present in the discovered set.\n */\nexport function buildDefaultAliases(fields: AdoFieldMeta[]): Record<string, string> {\n const refNames = new Set(fields.map(f => f.referenceName));\n\n const aliases: Record<string, string> = {};\n for (const [alias, ref] of ADO_FIELD_ALIAS_CANDIDATES) {\n if (refNames.has(ref)) {\n aliases[alias] = ref;\n }\n }\n return aliases;\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoGitRepo,\n AdoPullRequest,\n AdoPRThread,\n AdoPRComment,\n AdoPRCompletionOptions,\n AdoGitChange,\n AdoGitDiff,\n AdoGitStatus,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoGitClient {\n constructor(private http: HttpClient) {}\n\n // ── Repositories ──────────────────────────────────────────────────\n\n async listRepos(collection: string, project: string): Promise<AdoGitRepo[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitRepo>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getRepo(collection: string, project: string, repoId: string): Promise<AdoGitRepo> {\n return this.http.ado<AdoGitRepo>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repoId)}?api-version=${API}`\n );\n }\n\n async createRepo(collection: string, project: string, name: string): Promise<AdoGitRepo> {\n return this.http.ado<AdoGitRepo>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories?api-version=${API}`,\n { method: 'POST', body: { name } }\n );\n }\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n async listPRs(\n collection: string,\n project: string,\n repo: string,\n opts: { status?: string; creatorAlias?: string; reviewerAlias?: string } = {}\n ): Promise<AdoPullRequest[]> {\n return this.http.adoPaginate<AdoPullRequest>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n 'searchCriteria.status': opts.status ?? 'active',\n ...(opts.creatorAlias ? { 'searchCriteria.creatorId': opts.creatorAlias } : {}),\n ...(opts.reviewerAlias ? { 'searchCriteria.reviewerId': opts.reviewerAlias } : {}),\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests`,\n { params }\n ) as Promise<{ data: { value: AdoPullRequest[] }; headers: Headers }>;\n });\n }\n\n async getPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`\n );\n }\n\n async createPR(\n collection: string,\n project: string,\n repo: string,\n body: {\n title: string;\n description?: string;\n sourceRefName: string;\n targetRefName: string;\n reviewers?: Array<{ id: string }>;\n isDraft?: boolean;\n }\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async updatePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: Partial<{ title: string; description: string; reviewers: Array<{ id: string }>; isDraft: boolean }>\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body }\n );\n }\n\n async completePR(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n lastMergeSourceCommit: string,\n completionOptions: AdoPRCompletionOptions\n ): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n {\n method: 'PATCH',\n body: {\n status: 'completed',\n lastMergeSourceCommit: { commitId: lastMergeSourceCommit },\n completionOptions\n }\n }\n );\n }\n\n async abandonPR(collection: string, project: string, repo: string, prId: number): Promise<AdoPullRequest> {\n return this.http.ado<AdoPullRequest>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'abandoned' } }\n );\n }\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n async setPRVote(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n reviewerId: string,\n vote: number\n ): Promise<unknown> {\n return this.http.ado<unknown>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/reviewers/${encodeURIComponent(reviewerId)}?api-version=${API}`,\n { method: 'PUT', body: { vote } }\n );\n }\n\n async listReviewers(collection: string, project: string, repo: string, prId: number): Promise<unknown[]> {\n const pr = await this.getPR(collection, project, repo, prId);\n return pr.reviewers;\n }\n\n // ── Threads / Comments ────────────────────────────────────────────\n\n async listThreads(collection: string, project: string, repo: string, prId: number): Promise<AdoPRThread[]> {\n const result = await this.http.ado<AdoPageResponse<AdoPRThread>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async createThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n body: {\n comments: Array<{ content: string; commentType?: string }>;\n status?: string;\n threadContext?: {\n filePath: string;\n rightFileStart?: { line: number; offset: number };\n rightFileEnd?: { line: number; offset: number };\n leftFileStart?: { line: number; offset: number };\n leftFileEnd?: { line: number; offset: number };\n };\n }\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async addCommentToThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n content: string\n ): Promise<AdoPRComment> {\n return this.http.ado<AdoPRComment>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments?api-version=${API}`,\n { method: 'POST', body: { content, commentType: 'text' } }\n );\n }\n\n async updateThread(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n status: string\n ): Promise<AdoPRThread> {\n return this.http.ado<AdoPRThread>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}?api-version=${API}`,\n { method: 'PATCH', body: { status } }\n );\n }\n\n async deleteComment(\n collection: string,\n project: string,\n repo: string,\n prId: number,\n threadId: number,\n commentId: number\n ): Promise<void> {\n await this.http.ado<void>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/threads/${threadId}/comments/${commentId}?api-version=${API}`,\n { method: 'DELETE' }\n );\n }\n\n // ── Diffs / Files ─────────────────────────────────────────────────\n\n async getPRDiff(collection: string, project: string, repo: string, prId: number): Promise<AdoGitDiff> {\n const pr = await this.getPR(collection, project, repo, prId);\n const sourceCommit = pr.lastMergeSourceCommit?.commitId;\n const targetCommit = pr.lastMergeTargetCommit?.commitId;\n if (!sourceCommit || !targetCommit) return { changes: [], aheadCount: 0, behindCount: 0 };\n return this.http.ado<AdoGitDiff>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/diffs/commits?baseVersion=${encodeURIComponent(targetCommit)}&baseVersionType=commit&targetVersion=${encodeURIComponent(sourceCommit)}&targetVersionType=commit&api-version=${API}`\n );\n }\n\n async getCommitStatuses(collection: string, project: string, repo: string, commitId: string): Promise<AdoGitStatus[]> {\n const result = await this.http.ado<AdoPageResponse<AdoGitStatus>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/commits/${encodeURIComponent(commitId)}/statuses?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listPRChanges(collection: string, project: string, repo: string, prId: number): Promise<AdoGitChange[]> {\n const iterations = await this.http.ado<AdoPageResponse<{ id: number }>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations?api-version=${API}`\n );\n // Get the latest iteration then its changes\n const latestId = (iterations.value ?? []).at(-1)?.id;\n if (!latestId) return [];\n const changes = await this.http.ado<{ changeEntries?: AdoGitChange[] }>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/git/repositories/${encodeURIComponent(repo)}/pullrequests/${prId}/iterations/${latestId}/changes?api-version=${API}`\n );\n return changes.changeEntries ?? [];\n }\n}\n","import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoBuildDefinition,\n AdoBuild,\n AdoBuildLog,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoBuildClient {\n constructor(private http: HttpClient) {}\n\n // ── Definitions ───────────────────────────────────────────────────\n\n async listDefinitions(collection: string, project: string): Promise<AdoBuildDefinition[]> {\n return this.http.adoPaginate<AdoBuildDefinition>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions`,\n { params }\n ) as Promise<{ data: { value: AdoBuildDefinition[] }; headers: Headers }>;\n });\n }\n\n async getDefinition(collection: string, project: string, id: number): Promise<AdoBuildDefinition> {\n return this.http.ado<AdoBuildDefinition>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/definitions/${id}?api-version=${API}`\n );\n }\n\n // ── Builds (runs) ─────────────────────────────────────────────────\n\n async queueBuild(\n collection: string,\n project: string,\n definitionId: number,\n opts: { sourceBranch?: string; parameters?: string } = {}\n ): Promise<AdoBuild> {\n const body: Record<string, unknown> = {\n definition: { id: definitionId },\n ...(opts.sourceBranch ? { sourceBranch: opts.sourceBranch } : {}),\n ...(opts.parameters ? { parameters: opts.parameters } : {})\n };\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds?api-version=${API}`,\n { method: 'POST', body }\n );\n }\n\n async listBuilds(\n collection: string,\n project: string,\n opts: { definitionIds?: number[]; branchName?: string; statusFilter?: string; top?: number } = {}\n ): Promise<AdoBuild[]> {\n const baseParams: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(opts.definitionIds?.length ? { definitions: opts.definitionIds.join(',') } : {}),\n ...(opts.branchName ? { branchName: opts.branchName } : {}),\n ...(opts.statusFilter ? { statusFilter: opts.statusFilter } : {}),\n ...(opts.top ? { '$top': opts.top } : {})\n };\n\n // When top is specified, use a single request so the API-level $top limit is\n // honoured exactly. adoPaginate follows continuation tokens and can return far\n // more items than requested.\n if (opts.top) {\n const { data } = await this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds`,\n { params: baseParams }\n ) as { data: { value: AdoBuild[] }; headers: Headers };\n return (data.value ?? []).slice(0, opts.top);\n }\n\n return this.http.adoPaginate<AdoBuild>(async (token) => {\n const params = { ...baseParams, ...(token ? { continuationToken: token } : {}) };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds`,\n { params }\n ) as Promise<{ data: { value: AdoBuild[] }; headers: Headers }>;\n });\n }\n\n async getBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`\n );\n }\n\n async cancelBuild(collection: string, project: string, buildId: number): Promise<AdoBuild> {\n return this.http.ado<AdoBuild>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}?api-version=${API}`,\n { method: 'PATCH', body: { status: 'cancelling' } }\n );\n }\n\n // ── Logs ──────────────────────────────────────────────────────────\n\n async listLogs(collection: string, project: string, buildId: number): Promise<AdoBuildLog[]> {\n const result = await this.http.ado<AdoPageResponse<AdoBuildLog>>(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async getLog(collection: string, project: string, buildId: number, logId: number): Promise<string> {\n return this.http.adoText(\n `/${encodeURIComponent(collection)}/${encodeURIComponent(project)}/_apis/build/builds/${buildId}/logs/${logId}?api-version=${API}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { getGitContext } from '../../lib/git-context.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { log } from '../../lib/output.js';\nimport { resolveAtFileRef } from '../../lib/input.js';\nimport { ADO_FIELD_ALIAS_CANDIDATES } from './discovery.js';\nimport { AdoCoreClient } from './client/core.js';\nimport { AdoWorkClient } from './client/work.js';\nimport { AdoGitClient } from './client/git.js';\nimport { AdoBuildClient } from './client/build.js';\nimport type { JsonPatchOp } from './client/work.js';\nimport type { AdoBuild } from '../../types/ado.js';\n\nexport interface AdoContext {\n collection: string;\n project: string;\n repo: string;\n coreClient: AdoCoreClient;\n workClient: AdoWorkClient;\n gitClient: AdoGitClient;\n buildClient: AdoBuildClient;\n}\n\n/**\n * Resolves ADO (collection, project, repo) from CLI flags → git remote → config defaults.\n * Mirrors the getClient() helper in bitbucket/commands.ts.\n */\nexport function getAdoContext(program: Command, requireRepo = false): AdoContext {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n const http = createHttpClient(config, Boolean(opts.dryRun));\n const ctx = getGitContext(config);\n\n const collection: string =\n opts.collection ?? opts.organization ??\n ctx?.ado?.collection ??\n config.defaults.ado?.collection ?? '';\n\n const project: string =\n opts.project ??\n ctx?.ado?.project ??\n config.defaults.ado?.project ?? '';\n\n const repo: string =\n opts.repo ??\n ctx?.ado?.repo ??\n config.defaults.ado?.repo ?? '';\n\n if (!collection) {\n throw new PncliError(\n 'Could not determine Azure DevOps collection. Pass --collection, or run pncli config init.',\n 1\n );\n }\n\n if (!project) {\n throw new PncliError(\n 'Could not determine Azure DevOps project. Pass --project, or run pncli config init.',\n 1\n );\n }\n\n if (requireRepo && !repo) {\n throw new PncliError(\n 'Could not determine Azure DevOps repo. Pass --repo, or run from inside a checked-out ADO repo.',\n 1\n );\n }\n\n return {\n collection,\n project,\n repo,\n coreClient: new AdoCoreClient(http),\n workClient: new AdoWorkClient(http),\n gitClient: new AdoGitClient(http),\n buildClient: new AdoBuildClient(http)\n };\n}\n\n// ── Field helpers ─────────────────────────────────────────────────────\n\n/**\n * Parses repeated --field name=value arguments into a Record.\n * Accepts \"name=value\" strings (split on first =). Throws on missing `=`.\n */\nexport function parseFieldArgs(fields: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const f of fields) {\n const eq = f.indexOf('=');\n if (eq <= 0) throw new PncliError(`Invalid --field value \"${f}\". Expected format: name=value`, 1);\n result[f.slice(0, eq)] = f.slice(eq + 1);\n }\n return result;\n}\n\nconst stripSeparators = (s: string): string => s.toLowerCase().replace(/[\\s-]+/g, '');\n\n/**\n * Built-in fallback for the handful of near-universal ADO fields (Description, Acceptance\n * Criteria, Priority, ...), used when a key isn't in the user's saved fieldAliases (i.e.\n * `pncli ado work fields --save` hasn't been run yet). This is what lets Description /\n * Acceptance Criteria work out of the box via --field or --input-file without requiring\n * discovery first; a project whose process doesn't have a given field will simply get a\n * clear 400 from the ADO API, same as passing any other wrong field id.\n */\nconst DEFAULT_ADO_FIELD_ALIASES: Record<string, string> = Object.fromEntries(ADO_FIELD_ALIAS_CANDIDATES);\n\n/**\n * Resolves field keys against the loaded alias map, then builds JSON Patch ops.\n * If a key is in fieldAliases → use the reference name. Otherwise use the key as-is.\n * Falls back to a case/space/dash-insensitive alias match (aliases — both the user's saved\n * ones and the built-in defaults — are typically stored space/dash-free, e.g.\n * \"acceptancecriteria\"), so a human-friendly \"Acceptance Criteria\" key from --field or\n * --input-file still resolves without the caller needing to know that.\n */\nexport function buildFieldPatch(\n fields: Record<string, unknown>,\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n const aliases = { ...DEFAULT_ADO_FIELD_ALIASES, ...fieldAliases };\n return Object.entries(fields).map(([key, value]) => {\n let refName: string | undefined = aliases[key.toLowerCase()] ?? aliases[key];\n if (!refName) {\n const target = stripSeparators(key);\n const match = Object.entries(aliases).find(([aliasKey]) => stripSeparators(aliasKey) === target);\n refName = match?.[1];\n }\n return { op: 'add' as const, path: `/fields/${refName ?? key}`, value };\n });\n}\n\n/** Convenience: parse --field args and immediately build the patch ops. */\nexport function fieldArgsToPatch(\n fieldArgs: string[],\n fieldAliases: Record<string, string>\n): JsonPatchOp[] {\n return buildFieldPatch(parseFieldArgs(fieldArgs), fieldAliases);\n}\n\nconst BUILTIN_WORK_FIELD_KEYS = new Set(['title', 'description', 'assignee', 'assignedto', 'priority']);\n\n/**\n * Splits a --input-file `fields` dictionary into the small set of built-in work item\n * fields work-create/work-update expose as their own flags (title, description, assignee,\n * priority) and everything else. Non-builtin keys (e.g. \"Acceptance Criteria\", or a raw\n * reference name like \"Microsoft.VSTS.Common.AcceptanceCriteria\") are left as-is — they\n * already resolve generically through fieldAliases (see buildFieldPatch), so no custom\n * field needs to be pre-registered in config to be usable here. Resolves `@file` value\n * references (see resolveAtFileRef) on every value.\n */\nexport function splitWorkFieldsDictionary(\n fields: Record<string, unknown>\n): { builtin: Record<string, unknown>; custom: Record<string, unknown> } {\n const builtin: Record<string, unknown> = {};\n const custom: Record<string, unknown> = {};\n for (const [rawKey, rawValue] of Object.entries(fields)) {\n const value = resolveAtFileRef(rawValue);\n const key = rawKey.toLowerCase().replace(/\\s+/g, '');\n if (BUILTIN_WORK_FIELD_KEYS.has(key)) {\n builtin[key === 'assignedto' ? 'assignee' : key] = value;\n } else {\n custom[rawKey] = value;\n }\n }\n return { builtin, custom };\n}\n\n// ── Vote constants ────────────────────────────────────────────────────\n\nexport const PR_VOTE = {\n APPROVE: 10,\n APPROVE_WITH_SUGGESTIONS: 5,\n NO_VOTE: 0,\n WAIT_FOR_AUTHOR: -5,\n REJECT: -10\n} as const;\n\n// ── Build polling ─────────────────────────────────────────────────────\n\nconst TERMINAL_STATUSES = new Set(['completed']);\n\nexport function isBuildTerminal(build: AdoBuild): boolean {\n return TERMINAL_STATUSES.has(build.status);\n}\n\nexport interface PollOpts {\n timeoutSec: number;\n pollSec: number;\n}\n\n/**\n * Polls fetchStatus() until isTerminal() returns true or timeout is reached.\n * Progress lines emitted via log() (verbose-only stderr); stdout stays clean.\n */\nexport async function pollUntilTerminal<T>(\n fetchStatus: () => Promise<T>,\n isTerminal: (s: T) => boolean,\n opts: PollOpts\n): Promise<T> {\n const deadline = Date.now() + opts.timeoutSec * 1000;\n let status = await fetchStatus();\n\n while (!isTerminal(status)) {\n if (Date.now() >= deadline) {\n throw new PncliError(\n `Timed out waiting for completion after ${opts.timeoutSec}s`,\n 1\n );\n }\n log(`Waiting ${opts.pollSec}s...`);\n await new Promise(resolve => setTimeout(resolve, opts.pollSec * 1000));\n status = await fetchStatus();\n }\n\n return status;\n}\n","import { Command } from 'commander';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoProjectCommands(ado: Command): void {\n const project = ado\n .command('project')\n .description('Azure DevOps project and collection operations');\n\n project\n .command('list-collections')\n .description('List all project collections on the server')\n .action(async () => {\n const start = Date.now();\n try {\n const { coreClient } = getAdoContext(ado);\n const data = await coreClient.listCollections();\n success(data, 'ado', 'project-list-collections', start);\n } catch (err) { fail(err, 'ado', 'project-list-collections', start); }\n });\n\n project\n .command('list')\n .description('List team projects in a collection')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.listProjects(collection);\n success(data, 'ado', 'project-list', start);\n } catch (err) { fail(err, 'ado', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a team project by name')\n .requiredOption('--name <project>', 'Project name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getProject(collection, opts.name);\n success(data, 'ado', 'project-get', start);\n } catch (err) { fail(err, 'ado', 'project-get', start); }\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { Command } from 'commander';\nimport { getAdoContext, buildFieldPatch, parseFieldArgs, splitWorkFieldsDictionary } from '../helpers.js';\nimport { discoverFields, discoverTypeFields, discoverTypes, buildDefaultAliases } from '../discovery.js';\nimport { ADO_WORK_INPUT_FILE_SCHEMA, ADO_WORK_INPUT_FILE_EXAMPLE } from '../input-schema.js';\nimport { success, fail, warn, writeRawOutput } from '../../../lib/output.js';\nimport { loadConfig, getGlobalConfigPath } from '../../../lib/config.js';\nimport { PncliError } from '../../../lib/errors.js';\nimport { readJsonInputFile, mergeWithOverrides, resolveAtFileRef } from '../../../lib/input.js';\n\n/** Shape of the JSON accepted by --input-file on work create / update. */\ninterface WorkItemJsonInput {\n type?: string;\n fields?: Record<string, unknown>;\n}\n\nexport function registerAdoWorkCommands(ado: Command): void {\n const work = ado\n .command('work')\n .description('Azure DevOps work item operations');\n\n // ── Get ───────────────────────────────────────────────────────────\n\n work\n .command('get')\n .description('Get a work item by ID')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.getWorkItem(collection, parseInt(opts.id, 10));\n success(data, 'ado', 'work-get', start);\n } catch (err) { fail(err, 'ado', 'work-get', start); }\n });\n\n // ── Create ────────────────────────────────────────────────────────\n\n work\n .command('create')\n .description('Create a work item')\n .option('--type <type>', 'Work item type (e.g. Bug, Task, User Story) (required, unless supplied via --input-file)')\n .option('--title <title>', 'Work item title (required, unless supplied via --input-file)')\n .option('--description <text>', 'Description')\n .option('--assignee <user>', 'Assigned to (display name or email)')\n .option('--priority <n>', 'Priority (1-4)')\n .option('--parent <id>', 'Parent work item ID — creates a parent link after creation')\n .option('--field <name=value>', 'Additional field (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--input-file <path>', \"JSON file describing the work item ({ type, fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli ado work schema\")\n .action(async (opts: { type?: string; title?: string; description?: string; assignee?: string; priority?: string; parent?: string; field: string[]; inputFile?: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, project, workClient } = getAdoContext(ado);\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as WorkItemJsonInput) : undefined;\n const { builtin: jsonBuiltin, custom: jsonCustom } = jsonInput?.fields\n ? splitWorkFieldsDictionary(jsonInput.fields)\n : { builtin: {}, custom: {} };\n\n const type = opts.type ?? jsonInput?.type;\n if (!type) throw new PncliError('--type required (or \"type\" in --input-file)', 1);\n\n const flagBuiltin: Record<string, unknown> = {\n ...(opts.title !== undefined ? { title: opts.title } : {}),\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n ...(opts.assignee !== undefined ? { assignee: opts.assignee } : {}),\n ...(opts.priority !== undefined ? { priority: opts.priority } : {})\n };\n const { merged: builtinFields, overrides: builtinOverrides } = mergeWithOverrides(jsonBuiltin, flagBuiltin);\n if (!builtinFields.title) throw new PncliError('--title required (or \"fields.Title\" in --input-file)', 1);\n\n const flagCustom = parseFieldArgs(opts.field);\n const { merged: customFields, overrides: customOverrides } = mergeWithOverrides(jsonCustom, flagCustom);\n\n const overrides = [...builtinOverrides, ...customOverrides];\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n // Empty-string flag values (e.g. an unset shell variable interpolated into --description \"\")\n // are treated as \"not provided\", matching the pre-existing CLI-only behavior — only undefined\n // and '' are filtered here, so a legitimate falsy JSON value like priority: 0 still passes.\n const hasContent = (v: unknown): boolean => v !== undefined && v !== '';\n const builtIn: Record<string, unknown> = {\n 'System.Title': builtinFields.title,\n ...(hasContent(builtinFields.description) ? { 'System.Description': builtinFields.description } : {}),\n ...(hasContent(builtinFields.assignee) ? { 'System.AssignedTo': builtinFields.assignee } : {}),\n ...(hasContent(builtinFields.priority) ? { 'Microsoft.VSTS.Common.Priority': builtinFields.priority } : {})\n };\n const extra = buildFieldPatch(customFields, config.ado.fieldAliases);\n const patch = [\n ...Object.entries(builtIn).map(([k, v]) => ({ op: 'add' as const, path: `/fields/${k}`, value: v })),\n ...extra\n ];\n const data = await workClient.createWorkItem(collection, project, type, patch);\n success(data, 'ado', 'work-create', start, overrides);\n if (opts.parent) {\n try {\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.parent}`;\n const linkPatch = [{ op: 'add' as const, path: '/relations/-', value: { rel: 'System.LinkTypes.Hierarchy-Reverse', url: targetUrl } }];\n await workClient.updateWorkItem(collection, data.id, linkPatch);\n } catch (linkErr) {\n warn(`Created #${data.id} but failed to link to parent ${opts.parent}: ${linkErr instanceof Error ? linkErr.message : linkErr}`);\n }\n }\n return;\n } catch (err) { fail(err, 'ado', 'work-create', start); }\n });\n\n // ── Update ────────────────────────────────────────────────────────\n\n work\n .command('update')\n .description('Update a work item field')\n .requiredOption('--id <n>', 'Work item ID')\n .option('--field <name=value>', 'Field to update (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--input-file <path>', \"JSON file describing fields to update ({ fields: {...} }); '-' = stdin. CLI flags override matching keys. See: pncli ado work schema\")\n .action(async (opts: { id: string; field: string[]; inputFile?: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n\n const jsonInput = opts.inputFile ? (readJsonInputFile(opts.inputFile) as WorkItemJsonInput) : undefined;\n // No builtin/custom split here (update has no dedicated --title/--description flags —\n // everything flows through --field), but @file refs still need resolving.\n const jsonFields = jsonInput?.fields\n ? Object.fromEntries(Object.entries(jsonInput.fields).map(([k, v]) => [k, resolveAtFileRef(v)]))\n : {};\n const flagFields = parseFieldArgs(opts.field);\n const { merged, overrides } = mergeWithOverrides(jsonFields, flagFields);\n if (overrides.length) warn(`--input-file value(s) overridden by CLI flags: ${overrides.join(', ')}`);\n\n const patch = buildFieldPatch(merged, config.ado.fieldAliases);\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-update', start, overrides);\n } catch (err) { fail(err, 'ado', 'work-update', start); }\n });\n\n // ── Transition (wrapper over update for System.State) ─────────────\n\n work\n .command('transition')\n .description('Set the state of a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--state <state>', 'New state (e.g. Active, Resolved, Closed)')\n .action(async (opts: { id: string; state: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.State', value: opts.state }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-transition', start);\n } catch (err) { fail(err, 'ado', 'work-transition', start); }\n });\n\n // ── Assign ────────────────────────────────────────────────────────\n\n work\n .command('assign')\n .description('Assign a work item to a user')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--to <user>', 'User display name or email')\n .action(async (opts: { id: string; to: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const patch = [{ op: 'add' as const, path: '/fields/System.AssignedTo', value: opts.to }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-assign', start);\n } catch (err) { fail(err, 'ado', 'work-assign', start); }\n });\n\n // ── Link ──────────────────────────────────────────────────────────\n\n work\n .command('link')\n .description('Link two work items')\n .requiredOption('--id <a>', 'Source work item ID')\n .requiredOption('--to <b>', 'Target work item ID')\n .option('--type <rel>', 'Link type (related|parent|child|duplicate|duplicate-of)', 'related')\n .action(async (opts: { id: string; to: string; type: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const config = loadConfig({ configPath: globalOpts.config });\n const { collection, workClient } = getAdoContext(ado);\n // AzDO rel strings\n const relMap: Record<string, string> = {\n related: 'System.LinkTypes.Related',\n parent: 'System.LinkTypes.Hierarchy-Reverse',\n child: 'System.LinkTypes.Hierarchy-Forward',\n duplicate: 'System.LinkTypes.Duplicate-Forward',\n 'duplicate-of': 'System.LinkTypes.Duplicate-Reverse'\n };\n const rel = relMap[opts.type] ?? opts.type;\n const baseUrl = config.ado.baseUrl?.replace(/\\/$/, '');\n const targetUrl = `${baseUrl}/${encodeURIComponent(collection)}/_apis/wit/workitems/${opts.to}`;\n const patch = [{ op: 'add' as const, path: '/relations/-', value: { rel, url: targetUrl } }];\n const data = await workClient.updateWorkItem(collection, parseInt(opts.id, 10), patch);\n success(data, 'ado', 'work-link', start);\n } catch (err) { fail(err, 'ado', 'work-link', start); }\n });\n\n // ── Search ────────────────────────────────────────────────────────\n\n work\n .command('search')\n .description('Run a WIQL query (consider --output-file for large results)')\n .requiredOption('--wiql <query>', 'WIQL query string')\n .action(async (opts: { wiql: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.queryWiql(collection, project, opts.wiql);\n success(data, 'ado', 'work-search', start);\n } catch (err) { fail(err, 'ado', 'work-search', start); }\n });\n\n // ── Comments ──────────────────────────────────────────────────────\n\n work\n .command('list-comments')\n .description('List comments on a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listComments(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'work-list-comments', start);\n } catch (err) { fail(err, 'ado', 'work-list-comments', start); }\n });\n\n work\n .command('add-comment')\n .description('Add a comment to a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { id: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.addComment(collection, project, parseInt(opts.id, 10), opts.body);\n success(data, 'ado', 'work-add-comment', start);\n } catch (err) { fail(err, 'ado', 'work-add-comment', start); }\n });\n\n // ── Tags ──────────────────────────────────────────────────────────\n\n work\n .command('add-tag')\n .description('Add one or more tags to a work item (non-destructive)')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--tags <tags>', 'Semicolon- or comma-separated tags to add')\n .action(async (opts: { id: string; tags: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const tags = opts.tags.split(/[;,]/).map(t => t.trim()).filter(Boolean);\n const data = await workClient.addTags(collection, parseInt(opts.id, 10), tags);\n success(data, 'ado', 'work-add-tag', start);\n } catch (err) { fail(err, 'ado', 'work-add-tag', start); }\n });\n\n work\n .command('remove-tag')\n .description('Remove one or more tags from a work item (non-destructive)')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--tags <tags>', 'Semicolon- or comma-separated tags to remove')\n .action(async (opts: { id: string; tags: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const tags = opts.tags.split(/[;,]/).map(t => t.trim()).filter(Boolean);\n const data = await workClient.removeTags(collection, parseInt(opts.id, 10), tags);\n success(data, 'ado', 'work-remove-tag', start);\n } catch (err) { fail(err, 'ado', 'work-remove-tag', start); }\n });\n\n // ── Attachments ───────────────────────────────────────────────────\n\n work\n .command('list-attachments')\n .description('List attachments on a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.listAttachments(collection, parseInt(opts.id, 10));\n success(data, 'ado', 'work-list-attachments', start);\n } catch (err) { fail(err, 'ado', 'work-list-attachments', start); }\n });\n\n work\n .command('add-attachment')\n .description('Upload a local file and attach it to a work item')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--file <path>', 'Path to the file to upload')\n .option('--comment <text>', 'Optional comment for the attachment')\n .action(async (opts: { id: string; file: string; comment?: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const data = await workClient.uploadAttachment(collection, parseInt(opts.id, 10), opts.file, opts.comment);\n success(data, 'ado', 'work-add-attachment', start);\n } catch (err) { fail(err, 'ado', 'work-add-attachment', start); }\n });\n\n work\n .command('download-attachment')\n .description('Download a work item attachment to .pncli/ (or --dir)')\n .requiredOption('--id <n>', 'Work item ID')\n .requiredOption('--attachment-id <guid>', 'Attachment ID from work list-attachments output')\n .option('--dir <path>', 'Output directory (default: .pncli relative to cwd)')\n .action(async (opts: { id: string; attachmentId: string; dir?: string }) => {\n const start = Date.now();\n try {\n const { collection, workClient } = getAdoContext(ado);\n const attachments = await workClient.listAttachments(collection, parseInt(opts.id, 10));\n const attachment = attachments.find(a => a.id === opts.attachmentId);\n if (!attachment) throw new PncliError(`Attachment not found: ${opts.attachmentId}`, 1);\n const outDir = opts.dir ?? path.join(process.cwd(), '.pncli');\n fs.mkdirSync(outDir, { recursive: true });\n const outPath = path.join(outDir, path.basename(attachment.name));\n const buffer = await workClient.downloadAttachment(attachment.url);\n fs.writeFileSync(outPath, buffer);\n success({ saved: outPath, name: attachment.name, size: buffer.length }, 'ado', 'work-download-attachment', start);\n } catch (err) { fail(err, 'ado', 'work-download-attachment', start); }\n });\n\n // ── Areas & Iterations ────────────────────────────────────────────\n\n work\n .command('list-areas')\n .description('List classification areas for the team project (tree)')\n .option('--depth <n>', 'Depth of the area tree to retrieve', '10')\n .action(async (opts: { depth: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listAreas(collection, project, parseInt(opts.depth, 10));\n success(data, 'ado', 'work-list-areas', start);\n } catch (err) { fail(err, 'ado', 'work-list-areas', start); }\n });\n\n work\n .command('list-iterations')\n .description('List classification iterations for the team project (tree), including start/finish dates')\n .option('--depth <n>', 'Depth of the iteration tree to retrieve', '10')\n .action(async (opts: { depth: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listIterations(collection, project, parseInt(opts.depth, 10));\n success(data, 'ado', 'work-list-iterations', start);\n } catch (err) { fail(err, 'ado', 'work-list-iterations', start); }\n });\n\n // ── Type / Field discovery ────────────────────────────────────────\n\n work\n .command('types')\n .description('List work item types in the project')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered types to ~/.pncli/config.json')\n .action(async (opts: { save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n const types = await discoverTypes(workClient, collection, project);\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n existing.ado = { ...(existing.ado ?? {}), discoveredTypes: types };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${types.length} types to ${globalConfigPath}`);\n }\n success(types, 'ado', 'work-types', start);\n } catch (err) { fail(err, 'ado', 'work-types', start); }\n });\n\n work\n .command('list-states')\n .description('List valid states for a work item type')\n .requiredOption('--type <type>', 'Work item type name (e.g. Bug)')\n .action(async (opts: { type: string }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const data = await workClient.listTypeStates(collection, project, opts.type);\n success(data, 'ado', 'work-list-states', start);\n } catch (err) { fail(err, 'ado', 'work-list-states', start); }\n });\n\n work\n .command('fields')\n .description('List work item fields available in the collection (consider --output-file for large results)')\n .option('--type <type>', 'Scope to fields for a specific work item type (e.g. Bug)')\n .option('--custom-only', 'Exclude System.* and Microsoft.VSTS.* fields')\n .option('--discover', 'Fetch from server (always true for this command)')\n .option('--save', 'Save discovered fields and aliases to ~/.pncli/config.json')\n .action(async (opts: { type?: string; customOnly?: boolean; save?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, workClient } = getAdoContext(ado);\n const globalOpts = ado.optsWithGlobals();\n // Fetch full field list (used for alias generation and --save)\n const allFields = opts.type\n ? await discoverTypeFields(workClient, collection, project, opts.type)\n : await discoverFields(workClient, collection);\n // Apply --custom-only filter only to displayed/saved output\n const fields = opts.customOnly\n ? allFields.filter(f =>\n !f.referenceName.startsWith('System.') &&\n !f.referenceName.startsWith('Microsoft.VSTS.')\n )\n : allFields;\n if (opts.save) {\n const globalConfigPath = getGlobalConfigPath(globalOpts.config);\n const fs = await import('fs');\n const existing = JSON.parse(fs.readFileSync(globalConfigPath, 'utf8') || '{}');\n // Generate aliases from the full (unfiltered) set so System/VSTS aliases are included\n const aliases = buildDefaultAliases(allFields);\n existing.ado = { ...(existing.ado ?? {}), discoveredFields: allFields, fieldAliases: aliases };\n fs.writeFileSync(globalConfigPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n warn(`Saved ${allFields.length} fields and ${Object.keys(aliases).length} aliases to ${globalConfigPath}`);\n }\n success(fields, 'ado', 'work-fields', start);\n } catch (err) { fail(err, 'ado', 'work-fields', start); }\n });\n\n work\n .command('schema')\n .description('Print the --input-file JSON schema and an example for work create/update')\n .option('--example-only', \"Print only the runnable example JSON (no envelope) — pipeable straight into --input-file\")\n .action((opts: { exampleOnly?: boolean }) => {\n const start = Date.now();\n if (opts.exampleOnly) {\n // Bypass the success() envelope: this output is meant to be redirected straight\n // into a file and passed to --input-file, so it must be the raw JSON, not {ok,data,meta}.\n writeRawOutput(JSON.stringify(ADO_WORK_INPUT_FILE_EXAMPLE, null, 2) + '\\n');\n return;\n }\n success({ schema: ADO_WORK_INPUT_FILE_SCHEMA, example: ADO_WORK_INPUT_FILE_EXAMPLE }, 'ado', 'work-schema', start);\n });\n}\n","/**\n * JSON Schema + example for the --input-file accepted by `ado work create` / `work update`.\n * Exposed at runtime via `pncli ado work schema` so callers can discover the shape without reading docs.\n */\nexport const ADO_WORK_INPUT_FILE_SCHEMA = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'pncli Azure DevOps work item input file',\n description:\n 'Shape accepted by --input-file on `pncli ado work create` / `work update`. ' +\n 'CLI flags (--title, --description, --priority, --field, ...) override matching keys here; ' +\n 'overridden keys are reported in meta.overrides.',\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Work item type, e.g. Bug, Task, User Story (create only)' },\n fields: {\n type: 'object',\n description:\n 'Field dictionary. Built-in keys (case-insensitive): title, description, assignee, priority. ' +\n 'Any other key (e.g. \"Acceptance Criteria\", or a raw reference name like ' +\n '\"Microsoft.VSTS.Common.AcceptanceCriteria\" or a custom \"MyOrg.SomeField\") resolves through ' +\n 'the fieldAliases saved by `pncli ado work fields --save`, falling back to the key itself — ' +\n 'custom fields never need to be pre-registered to be usable here. Any string value may be ' +\n '\"@path/to/file\" to read that field\\'s content from a file instead of inlining it (useful for ' +\n 'large rich-text fields like Description or Acceptance Criteria).',\n additionalProperties: true\n }\n },\n additionalProperties: false\n} as const;\n\nexport const ADO_WORK_INPUT_FILE_EXAMPLE = {\n type: 'Bug',\n fields: {\n Title: 'Login broken on Safari',\n Description: '@desc.html',\n 'Acceptance Criteria': '@ac.md',\n Priority: 2,\n 'MyOrg.SomeCustomField': 'x'\n }\n};\n","import { Command } from 'commander';\nimport { getAdoContext, PR_VOTE } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\nimport type { AdoPRThread, AdoPRComment } from '../../../types/ado.js';\n\n/** Flatten all comments across all threads into a sorted list with threadContext attached */\nfunction flattenThreadComments(\n threads: AdoPRThread[],\n filterInlineOnly: boolean,\n filterGeneralOnly: boolean\n): Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> {\n const flat: Array<AdoPRComment & { threadId: number; threadContext: AdoPRThread['threadContext'] | null }> = [];\n for (const thread of threads) {\n if (thread.isDeleted) continue;\n if (filterInlineOnly && !thread.threadContext) continue;\n if (filterGeneralOnly && thread.threadContext) continue;\n for (const comment of thread.comments) {\n if (comment.isDeleted) continue;\n flat.push({ ...comment, threadId: thread.id, threadContext: thread.threadContext ?? null });\n }\n }\n return flat.sort((a, b) => a.publishedDate.localeCompare(b.publishedDate));\n}\n\nexport function registerAdoRepoCommands(ado: Command): void {\n const repo = ado\n .command('repo')\n .description('Azure DevOps repository and pull request operations');\n\n // ── Repos ─────────────────────────────────────────────────────────\n\n repo\n .command('list')\n .description('List git repositories in the project')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, gitClient } = getAdoContext(ado);\n const data = await gitClient.listRepos(collection, project);\n success(data, 'ado', 'repo-list', start);\n } catch (err) { fail(err, 'ado', 'repo-list', start); }\n });\n\n repo\n .command('create')\n .description('Create a new git repository in the project')\n .requiredOption('--name <name>', 'Repository name')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const { collection, project, gitClient } = getAdoContext(ado);\n const data = await gitClient.createRepo(collection, project, opts.name);\n success(data, 'ado', 'repo-create', start);\n } catch (err) { fail(err, 'ado', 'repo-create', start); }\n });\n\n repo\n .command('get')\n .description('Get a specific repository')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, repo: repoName, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getRepo(collection, project, repoName);\n success(data, 'ado', 'repo-get', start);\n } catch (err) { fail(err, 'ado', 'repo-get', start); }\n });\n\n // ── Pull Requests ─────────────────────────────────────────────────\n\n repo\n .command('list-prs')\n .description('List pull requests')\n .option('--state <state>', 'PR state: active|abandoned|completed|all', 'active')\n .option('--creator <alias>', 'Filter by creator')\n .option('--reviewer <alias>', 'Filter by reviewer')\n .action(async (opts: { state?: string; creator?: string; reviewer?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRs(collection, project, repo, {\n status: opts.state,\n creatorAlias: opts.creator,\n reviewerAlias: opts.reviewer\n });\n success(data, 'ado', 'repo-list-prs', start);\n } catch (err) { fail(err, 'ado', 'repo-list-prs', start); }\n });\n\n repo\n .command('get-pr')\n .description('Get a pull request by ID')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-get-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-get-pr', start); }\n });\n\n repo\n .command('create-pr')\n .description('Create a pull request')\n .requiredOption('--title <title>', 'PR title')\n .requiredOption('--source <branch>', 'Source branch')\n .option('--target <branch>', 'Target branch (default: main)', 'main')\n .option('--description <text>', 'PR description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs or display names')\n .option('--draft', 'Create as a draft pull request')\n .action(async (opts: { title: string; source: string; target: string; description?: string; reviewers?: string; draft?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : [];\n const data = await gitClient.createPR(collection, project, repo, {\n title: opts.title,\n description: opts.description,\n sourceRefName: `refs/heads/${opts.source}`,\n targetRefName: `refs/heads/${opts.target}`,\n reviewers,\n ...(opts.draft !== undefined ? { isDraft: opts.draft } : {})\n });\n success(data, 'ado', 'repo-create-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-create-pr', start); }\n });\n\n repo\n .command('update-pr')\n .description('Update a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--title <title>', 'New title')\n .option('--description <text>', 'New description')\n .option('--reviewers <ids>', 'Comma-separated reviewer IDs')\n .option('--draft <bool>', 'Set draft status: true|false')\n .action(async (opts: { id: string; title?: string; description?: string; reviewers?: string; draft?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const reviewers = opts.reviewers\n ? opts.reviewers.split(',').map(id => ({ id: id.trim() }))\n : undefined;\n const body: Record<string, unknown> = {};\n if (opts.title) body.title = opts.title;\n if (opts.description !== undefined) body.description = opts.description;\n if (reviewers) body.reviewers = reviewers;\n if (opts.draft !== undefined) body.isDraft = opts.draft === 'true';\n const data = await gitClient.updatePR(collection, project, repo, parseInt(opts.id, 10), body);\n success(data, 'ado', 'repo-update-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-update-pr', start); }\n });\n\n repo\n .command('merge-pr')\n .description('Complete (merge) a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .option('--strategy <s>', 'Merge strategy: noFastForward|squash|rebase|rebaseMerge', 'noFastForward')\n .option('--delete-source', 'Delete source branch after merge')\n .action(async (opts: { id: string; strategy: string; deleteSource?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const prId = parseInt(opts.id, 10);\n const pr = await gitClient.getPR(collection, project, repo, prId);\n const data = await gitClient.completePR(\n collection, project, repo, prId,\n pr.lastMergeSourceCommit?.commitId ?? '',\n {\n mergeStrategy: opts.strategy as 'noFastForward' | 'squash' | 'rebase' | 'rebaseMerge',\n deleteSourceBranch: opts.deleteSource ?? false\n }\n );\n success(data, 'ado', 'repo-merge-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-merge-pr', start); }\n });\n\n repo\n .command('abandon-pr')\n .description('Abandon a pull request')\n .requiredOption('--id <n>', 'Pull request ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.abandonPR(collection, project, repo, parseInt(opts.id, 10));\n success(data, 'ado', 'repo-abandon-pr', start);\n } catch (err) { fail(err, 'ado', 'repo-abandon-pr', start); }\n });\n\n // ── Comments (threads) ────────────────────────────────────────────\n\n repo\n .command('list-comments')\n .description('List all comments on a pull request (general + inline)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--inline-only', 'Return only inline file comments')\n .option('--general-only', 'Return only general PR comments')\n .action(async (opts: { pr: string; inlineOnly?: boolean; generalOnly?: boolean }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const threads = await gitClient.listThreads(collection, project, repo, parseInt(opts.pr, 10));\n const flat = flattenThreadComments(threads, opts.inlineOnly ?? false, opts.generalOnly ?? false);\n success(flat, 'ado', 'repo-list-comments', start);\n } catch (err) { fail(err, 'ado', 'repo-list-comments', start); }\n });\n\n repo\n .command('add-comment')\n .description('Add a general comment to a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--body <text>', 'Comment text')\n .action(async (opts: { pr: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active'\n });\n success(data, 'ado', 'repo-add-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-comment', start); }\n });\n\n repo\n .command('add-inline-comment')\n .description('Add an inline comment on a file in a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--file <path>', 'File path')\n .requiredOption('--line <n>', 'Line number')\n .requiredOption('--body <text>', 'Comment text')\n .option('--line-type <side>', 'Line side: left|right (default: right)', 'right')\n .action(async (opts: { pr: string; file: string; line: string; body: string; lineType: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const lineNum = parseInt(opts.line, 10);\n const isRight = opts.lineType !== 'left';\n const lineRange = isRight\n ? { rightFileStart: { line: lineNum, offset: 1 }, rightFileEnd: { line: lineNum, offset: 1 } }\n : { leftFileStart: { line: lineNum, offset: 1 }, leftFileEnd: { line: lineNum, offset: 1 } };\n const data = await gitClient.createThread(collection, project, repo, parseInt(opts.pr, 10), {\n comments: [{ content: opts.body, commentType: 'text' }],\n status: 'active',\n threadContext: { filePath: opts.file, ...lineRange }\n });\n success(data, 'ado', 'repo-add-inline-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-add-inline-comment', start); }\n });\n\n repo\n .command('reply-comment')\n .description('Reply to a comment thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--body <text>', 'Reply text')\n .action(async (opts: { pr: string; threadId: string; body: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.addCommentToThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), opts.body\n );\n success(data, 'ado', 'repo-reply-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-reply-comment', start); }\n });\n\n repo\n .command('resolve-comment')\n .description('Mark a comment thread as resolved (fixed)')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .action(async (opts: { pr: string; threadId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.updateThread(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), 'fixed'\n );\n success(data, 'ado', 'repo-resolve-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-resolve-comment', start); }\n });\n\n repo\n .command('delete-comment')\n .description('Delete a comment from a thread')\n .requiredOption('--pr <n>', 'Pull request ID')\n .requiredOption('--thread-id <id>', 'Thread ID')\n .requiredOption('--comment-id <id>', 'Comment ID')\n .action(async (opts: { pr: string; threadId: string; commentId: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n await gitClient.deleteComment(\n collection, project, repo,\n parseInt(opts.pr, 10), parseInt(opts.threadId, 10), parseInt(opts.commentId, 10)\n );\n success({ deleted: true }, 'ado', 'repo-delete-comment', start);\n } catch (err) { fail(err, 'ado', 'repo-delete-comment', start); }\n });\n\n // ── Files / Diffs ─────────────────────────────────────────────────\n\n repo\n .command('list-files')\n .description('List files changed in a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listPRChanges(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-files', start);\n } catch (err) { fail(err, 'ado', 'repo-list-files', start); }\n });\n\n repo\n .command('diff')\n .description('Show files changed in a pull request with change types and commit metadata')\n .requiredOption('--pr <n>', 'Pull request ID')\n .option('--path <p>', 'Filter diff to a specific file path')\n .action(async (opts: { pr: string; path?: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getPRDiff(collection, project, repo, parseInt(opts.pr, 10));\n if (opts.path) {\n if (opts.path) {\n const needle = opts.path.startsWith('/') ? opts.path : `/${opts.path}`;\n data.changes = (data.changes ?? []).filter(c => c.item.path === needle);\n }\n }\n success(data, 'ado', 'repo-diff', start);\n } catch (err) { fail(err, 'ado', 'repo-diff', start); }\n });\n\n // ── Build statuses ────────────────────────────────────────────────\n\n repo\n .command('get-build-status')\n .description('Get CI/build statuses posted to a commit')\n .requiredOption('--commit <sha>', 'Commit SHA')\n .action(async (opts: { commit: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.getCommitStatuses(collection, project, repo, opts.commit);\n success(data, 'ado', 'repo-get-build-status', start);\n } catch (err) { fail(err, 'ado', 'repo-get-build-status', start); }\n });\n\n // ── Reviewers / Votes ─────────────────────────────────────────────\n\n repo\n .command('list-reviewers')\n .description('List reviewers on a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n const data = await gitClient.listReviewers(collection, project, repo, parseInt(opts.pr, 10));\n success(data, 'ado', 'repo-list-reviewers', start);\n } catch (err) { fail(err, 'ado', 'repo-list-reviewers', start); }\n });\n\n const voteCmd = (\n name: string,\n description: string,\n vote: number,\n action: string\n ) => {\n repo\n .command(name)\n .description(description)\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const globalOpts = ado.optsWithGlobals();\n const { loadConfig: lc } = await import('../../../lib/config.js');\n const config = lc({ configPath: globalOpts.config });\n const { collection, project, repo, gitClient } = getAdoContext(ado, true);\n // Self-identity: use connection data\n const { AdoCoreClient } = await import('../client/core.js');\n const { createHttpClient } = await import('../../../lib/http.js');\n const http = createHttpClient(config, Boolean(globalOpts.dryRun));\n const coreClient = new AdoCoreClient(http);\n const me = await coreClient.getConnectionData(collection);\n const myId = me.authenticatedUser.id;\n const data = await gitClient.setPRVote(collection, project, repo, parseInt(opts.pr, 10), myId, vote);\n success(data, 'ado', action, start);\n } catch (err) { fail(err, 'ado', action, start); }\n });\n };\n\n voteCmd('approve', 'Approve a pull request', PR_VOTE.APPROVE, 'repo-approve');\n voteCmd('unapprove', 'Remove approval from a pull request', PR_VOTE.NO_VOTE, 'repo-unapprove');\n voteCmd('wait-for-author', 'Mark a pull request as waiting for author', PR_VOTE.WAIT_FOR_AUTHOR, 'repo-wait-for-author');\n\n // ── Builds for PR ─────────────────────────────────────────────────\n\n repo\n .command('list-builds')\n .description('List builds associated with a pull request')\n .requiredOption('--pr <n>', 'Pull request ID')\n .action(async (opts: { pr: string }) => {\n const start = Date.now();\n try {\n const { collection, project, repo, gitClient, buildClient } = getAdoContext(ado, true);\n const pr = await gitClient.getPR(collection, project, repo, parseInt(opts.pr, 10));\n const data = await buildClient.listBuilds(collection, project, {\n branchName: pr.sourceRefName\n });\n success(data, 'ado', 'repo-list-builds', start);\n } catch (err) { fail(err, 'ado', 'repo-list-builds', start); }\n });\n}\n","import { Command } from 'commander';\nimport { getAdoContext, pollUntilTerminal, isBuildTerminal } from '../helpers.js';\nimport { success, fail, log } from '../../../lib/output.js';\nimport { ExitCode } from '../../../lib/exitCodes.js';\nimport { PncliError } from '../../../lib/errors.js';\n\nexport function registerAdoPipelineCommands(ado: Command): void {\n const pipeline = ado\n .command('pipeline')\n .description('Azure DevOps pipeline (build) operations');\n\n pipeline\n .command('list')\n .description('List pipeline definitions')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.listDefinitions(collection, project);\n success(data, 'ado', 'pipeline-list', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get a pipeline definition by ID')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getDefinition(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Queue a pipeline run')\n .requiredOption('--id <n>', 'Pipeline definition ID')\n .option('--branch <ref>', 'Source branch (e.g. refs/heads/main or main)')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the run to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds (default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { id: string; branch?: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const sourceBranch = opts.branch\n ? (opts.branch.startsWith('refs/') ? opts.branch : `refs/heads/${opts.branch}`)\n : undefined;\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const parameters = opts.parameter.length > 0\n ? JSON.stringify(Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n })))\n : undefined;\n\n let build = await buildClient.queueBuild(collection, project, parseInt(opts.id, 10), {\n sourceBranch,\n parameters\n });\n log(`Queued build #${build.id} (${build.buildNumber}) — status: ${build.status}`);\n\n if (opts.wait) {\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n log(`Waiting for build #${build.id} to complete (timeout ${timeoutSec}s, poll ${pollSec}s)...`);\n build = await pollUntilTerminal(\n () => buildClient.getBuild(collection, project, build.id),\n isBuildTerminal,\n { timeoutSec, pollSec }\n );\n if (build.result && build.result !== 'succeeded') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n }\n\n success(build, 'ado', 'pipeline-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List pipeline runs')\n .option('--definition <id>', 'Filter by definition ID')\n .option('--name <name>', 'Filter by pipeline name (resolved to definition ID; use pipeline list to see names)')\n .option('--branch <ref>', 'Filter by branch name')\n .option('--status <filter>', 'Filter by status (inProgress|completed|cancelling|...)')\n .option('--top <n>', 'Maximum results', '50')\n .action(async (opts: { definition?: string; name?: string; branch?: string; status?: string; top: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n\n let definitionId: number | undefined;\n if (opts.definition && opts.name) {\n throw new PncliError('Cannot specify both --definition and --name. Use one or the other.', 1);\n }\n if (opts.definition) {\n definitionId = parseInt(opts.definition, 10);\n if (isNaN(definitionId)) {\n throw new PncliError(`--definition must be a numeric ID. Got \"${opts.definition}\". Use --name to filter by pipeline name instead.`, 1);\n }\n } else if (opts.name) {\n const defs = await buildClient.listDefinitions(collection, project);\n const match = defs.find(d => d.name.toLowerCase() === opts.name!.toLowerCase());\n if (!match) {\n throw new PncliError(\n `Pipeline \"${opts.name}\" not found. Run 'pncli ado pipeline list' to see available pipelines.`,\n 1\n );\n }\n definitionId = match.id;\n }\n\n const data = await buildClient.listBuilds(collection, project, {\n definitionIds: definitionId !== undefined ? [definitionId] : undefined,\n branchName: opts.branch,\n statusFilter: opts.status,\n top: parseInt(opts.top, 10)\n });\n success(data, 'ado', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'ado', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get a pipeline run by build ID')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.getBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('cancel-run')\n .description('Cancel a running pipeline build')\n .requiredOption('--id <n>', 'Build ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const { collection, project, buildClient } = getAdoContext(ado);\n const data = await buildClient.cancelBuild(collection, project, parseInt(opts.id, 10));\n success(data, 'ado', 'pipeline-cancel-run', start);\n } catch (err) { fail(err, 'ado', 'pipeline-cancel-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('List or retrieve build logs (consider --output-file for large logs)')\n .option('--build-id <n>', 'Build (run) ID — from pipeline list-runs or get-run')\n .option('--id <n>', 'Build (run) ID — alias for --build-id (kept for backwards compatibility)')\n .option('--log-id <n>', 'Specific log ID (omit to list all logs)')\n .action(async (opts: { buildId?: string; id?: string; logId?: string }) => {\n const start = Date.now();\n try {\n const rawId = opts.buildId ?? opts.id;\n if (!rawId) throw new PncliError('--build-id is required (build run ID from pipeline list-runs or get-run)', 1);\n const { collection, project, buildClient } = getAdoContext(ado);\n const buildId = parseInt(rawId, 10);\n if (opts.logId) {\n const data = await buildClient.getLog(collection, project, buildId, parseInt(opts.logId, 10));\n success({ log: data }, 'ado', 'pipeline-logs', start);\n } else {\n const data = await buildClient.listLogs(collection, project, buildId);\n success(data, 'ado', 'pipeline-logs', start);\n }\n } catch (err) { fail(err, 'ado', 'pipeline-logs', start); }\n });\n}\n","import { Command } from 'commander';\nimport { registerAdoProjectCommands } from './project.js';\nimport { registerAdoWorkCommands } from './work.js';\nimport { registerAdoRepoCommands } from './repo.js';\nimport { registerAdoPipelineCommands } from './pipeline.js';\nimport { getAdoContext } from '../helpers.js';\nimport { success, fail } from '../../../lib/output.js';\n\nexport function registerAdoCommands(program: Command): void {\n const ado = program\n .command('ado')\n .description('Azure DevOps Server operations')\n .option('--collection <name>', 'Azure DevOps collection (organization)')\n .option('--organization <name>', 'Alias for --collection')\n .option('--project <name>', 'Azure DevOps team project')\n .option('--repo <name>', 'Azure DevOps git repository name');\n\n // ── Top-level commands ─────────────────────────────────────────────\n\n ado\n .command('whoami')\n .description('Show current authenticated user')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'whoami', start);\n } catch (err) { fail(err, 'ado', 'whoami', start); }\n });\n\n ado\n .command('connection-data')\n .description('Show raw connection data from the ADO server')\n .action(async () => {\n const start = Date.now();\n try {\n const { collection, coreClient } = getAdoContext(ado);\n const data = await coreClient.getConnectionData(collection);\n success(data, 'ado', 'connection-data', start);\n } catch (err) { fail(err, 'ado', 'connection-data', start); }\n });\n\n // ── Subcommand groups ──────────────────────────────────────────────\n\n registerAdoProjectCommands(ado);\n registerAdoWorkCommands(ado);\n registerAdoRepoCommands(ado);\n registerAdoPipelineCommands(ado);\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type {\n JenkinsJob,\n JenkinsJobDetail,\n JenkinsBuild,\n JenkinsListJobsResponse,\n JenkinsQueueItem\n} from '../../types/jenkins.js';\n\n/** Converts a multi-level Jenkins job name (e.g. `A/B/C`) into the correct\n * URL path segment (e.g. `A/job/B/job/C`). Single-level names are unchanged.\n * Each segment is individually percent-encoded. */\nfunction jobPath(name: string): string {\n return name.split('/').map(encodeURIComponent).join('/job/');\n}\n\nexport class JenkinsClient {\n constructor(private http: HttpClient) {}\n\n async listJobs(folder?: string): Promise<JenkinsJob[]> {\n const endpoint = folder ? `/job/${jobPath(folder)}/api/json` : '/api/json';\n const data = await this.http.jenkins<JenkinsListJobsResponse>(\n endpoint,\n { params: { tree: 'jobs[name,url,color,description,buildable,lastBuild[number,url,result]]' } }\n );\n return data.jobs;\n }\n\n async getJob(name: string): Promise<JenkinsJobDetail> {\n return this.http.jenkins<JenkinsJobDetail>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: 'name,url,color,description,buildable,nextBuildNumber,inQueue,lastBuild[number,url,result],builds[number,url,result,duration,timestamp,building,displayName]{0,10}' } }\n );\n }\n\n async triggerBuild(\n name: string,\n params?: Record<string, string>\n ): Promise<{ queueItemId: number }> {\n const hasParams = params && Object.keys(params).length > 0;\n const endpoint = hasParams\n ? `/job/${jobPath(name)}/buildWithParameters`\n : `/job/${jobPath(name)}/build`;\n\n const res = await this.http.jenkinsRaw(endpoint, {\n method: 'POST',\n params: hasParams ? params : undefined\n });\n\n const location = res.headers.get('Location') ?? '';\n const match = location.match(/\\/queue\\/item\\/(\\d+)\\/?$/);\n if (!match) throw new PncliError('Build queued but Jenkins did not return a Location header — cannot track queue item');\n const queueItemId = parseInt(match[1]!, 10);\n return { queueItemId };\n }\n\n async getQueueItem(queueItemId: number): Promise<JenkinsQueueItem> {\n return this.http.jenkins<JenkinsQueueItem>(`/queue/item/${queueItemId}/api/json`);\n }\n\n async listBuilds(name: string, top = 25): Promise<Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[]> {\n const data = await this.http.jenkins<{ builds: Pick<JenkinsBuild, 'number' | 'url' | 'result' | 'duration' | 'timestamp' | 'building' | 'displayName' | 'fullDisplayName' | 'description' | 'id' | 'queueId'>[] }>(\n `/job/${jobPath(name)}/api/json`,\n { params: { tree: `builds[number,url,result,duration,timestamp,building,displayName,fullDisplayName,description,id,queueId]{0,${top}}` } }\n );\n return data.builds ?? [];\n }\n\n async getBuild(name: string, buildNumber: number): Promise<JenkinsBuild> {\n return this.http.jenkins<JenkinsBuild>(\n `/job/${jobPath(name)}/${buildNumber}/api/json`\n );\n }\n\n async getConsoleLog(name: string, buildNumber: number): Promise<string> {\n const res = await this.http.jenkinsRaw(\n `/job/${jobPath(name)}/${buildNumber}/consoleText`,\n { method: 'GET' }\n );\n return res.text;\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { JenkinsClient } from './client.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { ExitCode } from '../../lib/exitCodes.js';\nimport { PncliError } from '../../lib/errors.js';\nimport type { JenkinsBuild } from '../../types/jenkins.js';\n\nfunction getClient(program: Command): JenkinsClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.jenkins.baseUrl) throw new PncliError('Jenkins not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new JenkinsClient(http);\n}\n\nasync function pollQueueItem(\n client: JenkinsClient,\n queueItemId: number,\n pollMs: number,\n timeoutMs: number\n): Promise<number> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const item = await client.getQueueItem(queueItemId);\n if (item.executable?.number !== undefined) return item.executable.number;\n if (item.why === null && !item.blocked && !item.buildable) {\n throw new PncliError('Build was cancelled while in queue', 1);\n }\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build to leave queue after ${timeoutMs / 1000}s`, 1);\n}\n\nasync function pollBuildComplete(\n client: JenkinsClient,\n jobName: string,\n buildNumber: number,\n pollMs: number,\n timeoutMs: number\n): Promise<JenkinsBuild> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const build = await client.getBuild(jobName, buildNumber);\n if (!build.building) return build;\n await new Promise(r => setTimeout(r, pollMs));\n }\n throw new PncliError(`Timed out waiting for build #${buildNumber} to complete after ${timeoutMs / 1000}s`, 1);\n}\n\nexport function registerJenkinsCommands(program: Command): void {\n const jenkins = program.command('jenkins').description('Jenkins Data Center operations');\n const pipeline = jenkins.command('pipeline').description('Pipeline (job/build) operations');\n\n pipeline\n .command('list')\n .description('List all jobs on the Jenkins instance (or within a folder)')\n .option('--folder <name>', 'Folder name to enumerate (supports nested folders: parentFolder/childFolder)')\n .action(async (opts: { folder?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listJobs(opts.folder);\n success(data, 'jenkins', 'pipeline-list', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list', start); }\n });\n\n pipeline\n .command('get')\n .description('Get details for a specific job')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .action(async (opts: { name: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getJob(opts.name);\n success(data, 'jenkins', 'pipeline-get', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get', start); }\n });\n\n pipeline\n .command('run')\n .description('Trigger a build')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .option('--parameter <k=v>', 'Build parameter (repeatable)', (v: string, acc: string[]) => { acc.push(v); return acc; }, [] as string[])\n .option('--wait', 'Wait for the build to complete before returning')\n .option('--timeout <s>', 'Max wait time in seconds per phase (queue-wait and build-wait each get this budget; default 600)', '600')\n .option('--poll <s>', 'Poll interval in seconds (default 10)', '10')\n .action(async (opts: { name: string; parameter: string[]; wait?: boolean; timeout: string; poll: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n\n for (const p of opts.parameter) {\n if (!p.includes('=')) throw new PncliError(`Invalid --parameter \"${p}\". Expected format: key=value`, 1);\n }\n const params = opts.parameter.length > 0\n ? Object.fromEntries(opts.parameter.map(p => {\n const eq = p.indexOf('=');\n return [p.slice(0, eq), p.slice(eq + 1)];\n }))\n : undefined;\n\n const { queueItemId } = await client.triggerBuild(opts.name, params);\n log(`Queued build (queue item #${queueItemId})`);\n\n if (!opts.wait) {\n success({ queueItemId }, 'jenkins', 'pipeline-run', start);\n return;\n }\n\n const timeoutSec = parseInt(opts.timeout, 10);\n const pollSec = parseInt(opts.poll, 10);\n if (isNaN(timeoutSec) || timeoutSec <= 0) throw new PncliError(`Invalid --timeout \"${opts.timeout}\". Expected a positive number of seconds.`, 1);\n if (isNaN(pollSec) || pollSec <= 0) throw new PncliError(`Invalid --poll \"${opts.poll}\". Expected a positive number of seconds.`, 1);\n\n log(`Waiting for build to start (timeout ${timeoutSec}s)...`);\n const buildNumber = await pollQueueItem(client, queueItemId, pollSec * 1000, timeoutSec * 1000);\n log(`Build #${buildNumber} started — waiting for completion...`);\n\n const build = await pollBuildComplete(client, opts.name, buildNumber, pollSec * 1000, timeoutSec * 1000);\n if (build.result !== null && build.result !== 'SUCCESS') {\n process.exitCode = ExitCode.GENERAL_ERROR;\n }\n success(build, 'jenkins', 'pipeline-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-run', start); }\n });\n\n pipeline\n .command('list-runs')\n .description('List recent builds for a job')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .option('--top <n>', 'Maximum number of builds to return (default 25)', '25')\n .action(async (opts: { name: string; top: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const top = parseInt(opts.top, 10);\n if (isNaN(top) || top <= 0) throw new PncliError(`Invalid --top \"${opts.top}\". Expected a positive integer.`, 1);\n const data = await client.listBuilds(opts.name, top);\n success(data, 'jenkins', 'pipeline-list-runs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-list-runs', start); }\n });\n\n pipeline\n .command('get-run')\n .description('Get details for a specific build')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const data = await client.getBuild(opts.name, buildNumber);\n success(data, 'jenkins', 'pipeline-get-run', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-get-run', start); }\n });\n\n pipeline\n .command('logs')\n .description('Fetch console log for a build (consider --output-file for large logs)')\n .requiredOption('--name <job>', 'Job name (use folder/job for folder-scoped jobs)')\n .requiredOption('--number <n>', 'Build number')\n .action(async (opts: { name: string; number: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const buildNumber = parseInt(opts.number, 10);\n if (isNaN(buildNumber)) throw new PncliError(`Invalid --number \"${opts.number}\". Expected an integer.`, 1);\n const text = await client.getConsoleLog(opts.name, buildNumber);\n success({ log: text }, 'jenkins', 'pipeline-logs', start);\n } catch (err) { fail(err, 'jenkins', 'pipeline-logs', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n ArtifactoryRepository,\n ArtifactoryStorageInfo,\n ArtifactoryProperties,\n ArtifactoryAqlResult,\n ArtifactoryAqlArtifact,\n ArtifactoryBuildInfo,\n ArtifactoryBuildList,\n ArtifactoryBuildRuns\n} from '../../types/artifactory.js';\n\nconst API = 'api';\n\nexport interface ListReposOpts {\n type?: 'local' | 'virtual' | 'remote' | 'federated';\n packageType?: string;\n}\n\nexport interface SearchAqlOpts {\n repo?: string;\n name?: string;\n path?: string;\n before?: string;\n after?: string;\n limit?: number;\n includeProperties?: boolean;\n}\n\nexport interface SetPropertiesOpts {\n recursive?: boolean;\n}\n\nexport class ArtifactoryClient {\n constructor(private http: HttpClient) {}\n\n async ping(): Promise<string> {\n return this.http.artifactoryText(`${API}/system/ping`);\n }\n\n async listRepos(opts: ListReposOpts = {}): Promise<ArtifactoryRepository[]> {\n return this.http.artifactory<ArtifactoryRepository[]>(`${API}/repositories`, {\n params: {\n type: opts.type,\n packageType: opts.packageType\n }\n });\n }\n\n async getStorageInfo(repo: string, path: string): Promise<ArtifactoryStorageInfo> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryStorageInfo>(`${API}/storage/${repo}/${cleanPath}`);\n }\n\n async getProperties(repo: string, path: string): Promise<ArtifactoryProperties> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return this.http.artifactory<ArtifactoryProperties>(`${API}/storage/${repo}/${cleanPath}`, {\n params: { properties: '' }\n });\n }\n\n async setProperties(repo: string, path: string, properties: Record<string, string>, opts: SetPropertiesOpts = {}): Promise<void> {\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n const propString = Object.entries(properties)\n .map(([k, v]) => `${k}=${v}`)\n .join(';');\n await this.http.artifactory<void>(`${API}/storage/${repo}/${cleanPath}`, {\n method: 'PUT',\n params: {\n properties: propString,\n ...(opts.recursive ? { recursive: 1 } : {})\n }\n });\n }\n\n async searchAql(opts: SearchAqlOpts = {}): Promise<ArtifactoryAqlResult<ArtifactoryAqlArtifact>> {\n const criteria: string[] = [];\n\n if (opts.repo) criteria.push(`\"repo\": {\"$eq\": \"${opts.repo}\"}`);\n if (opts.name) criteria.push(`\"name\": {\"$match\": \"${opts.name}\"}`);\n if (opts.path) criteria.push(`\"path\": {\"$match\": \"${opts.path}\"}`);\n if (opts.after) criteria.push(`\"created\": {\"$gt\": \"${opts.after}\"}`);\n if (opts.before) criteria.push(`\"created\": {\"$lt\": \"${opts.before}\"}`);\n\n const findClause = criteria.length > 0\n ? `{${criteria.join(',')}}`\n : '{}';\n\n const includeFields = opts.includeProperties\n ? '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\",\"properties\")'\n : '.include(\"repo\",\"path\",\"name\",\"type\",\"size\",\"created\",\"modified\",\"sha256\")';\n\n const sortClause = '.sort({\"$desc\": [\"created\"]})';\n const limitClause = opts.limit ? `.limit(${opts.limit})` : '.limit(100)';\n\n const aql = `items.find(${findClause})${includeFields}${sortClause}${limitClause}`;\n\n return this.http.artifactory<ArtifactoryAqlResult<ArtifactoryAqlArtifact>>(`${API}/search/aql`, {\n method: 'POST',\n body: aql,\n headers: { 'Content-Type': 'text/plain' }\n });\n }\n\n async listBuilds(opts: { timeoutMs?: number } = {}): Promise<ArtifactoryBuildList> {\n const raw = await this.http.artifactory<{ builds?: Array<{ uri: string; lastStarted: string }>; uri: string }>(`${API}/build`, { timeoutMs: opts.timeoutMs });\n const builds = (raw.builds ?? []).map(b => ({\n name: b.uri.replace(/^\\/|\\/$/g, ''),\n uri: b.uri,\n lastStarted: b.lastStarted\n }));\n const result: ArtifactoryBuildList = { builds, uri: raw.uri };\n if (builds.length === 0) {\n result.hint = 'No builds are registered in Artifactory Build Integration. Build names may differ from ADO pipeline or uDeploy component names. Use \"artifactory repos\" to list repositories, then \"artifactory search --repo <repo>\" to locate artifacts directly.';\n }\n return result;\n }\n\n async listBuildRuns(buildName: string): Promise<ArtifactoryBuildRuns> {\n return this.http.artifactory<ArtifactoryBuildRuns>(`${API}/build/${encodeURIComponent(buildName)}`);\n }\n\n async getBuildInfo(buildName: string, buildNumber: string): Promise<ArtifactoryBuildInfo> {\n return this.http.artifactory<ArtifactoryBuildInfo>(\n `${API}/build/${encodeURIComponent(buildName)}/${encodeURIComponent(buildNumber)}`\n );\n }\n}\n","import { Command } from 'commander';\nimport { ArtifactoryClient } from './client.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): ArtifactoryClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.artifactory.baseUrl) throw new PncliError('Artifactory not configured. Run: pncli config init');\n if (!config.artifactory.token) throw new PncliError('Artifactory token not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new ArtifactoryClient(http);\n}\n\nexport function registerArtifactoryCommands(program: Command): void {\n const art = program.command('artifactory').description('Artifactory operations');\n\n // ── Ping ──────────────────────────────────────────────────────────────────\n\n art.command('ping')\n .description('Check Artifactory connectivity and authentication')\n .action(async () => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.ping();\n success(data, 'artifactory', 'ping', start);\n } catch (err) { fail(err, 'artifactory', 'ping', start); }\n });\n\n // ── Repos ─────────────────────────────────────────────────────────────────\n\n art.command('repos')\n .description('List repositories')\n .option('--type <type>', 'Filter by type: local, virtual, remote, federated')\n .option('--package-type <type>', 'Filter by package type: npm, maven, nuget, docker, pypi, etc.')\n .action(async (opts: { type?: string; packageType?: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listRepos({ type: opts.type as 'local' | 'virtual' | 'remote' | 'federated' | undefined, packageType: opts.packageType });\n success(data, 'artifactory', 'repos', start);\n } catch (err) { fail(err, 'artifactory', 'repos', start); }\n });\n\n // ── Artifact info ─────────────────────────────────────────────────────────\n\n art.command('artifact-info <repo> <path>')\n .description('Get metadata for an artifact or folder (checksums, size, timestamps)')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getStorageInfo(repo, path);\n success(data, 'artifactory', 'artifact-info', start);\n } catch (err) { fail(err, 'artifactory', 'artifact-info', start); }\n });\n\n // ── Properties get ────────────────────────────────────────────────────────\n\n art.command('properties-get <repo> <path>')\n .description('Read custom properties on an artifact')\n .action(async (repo: string, path: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getProperties(repo, path);\n success(data, 'artifactory', 'properties-get', start);\n } catch (err) { fail(err, 'artifactory', 'properties-get', start); }\n });\n\n // ── Properties set ────────────────────────────────────────────────────────\n\n art.command('properties-set <repo> <path> [keyvals...]')\n .description('Set custom properties on an artifact (format: key=value key=value...)')\n .option('--recursive', 'Apply recursively to folder contents', false)\n .action(async (repo: string, path: string, keyvals: string[], opts: { recursive: boolean }) => {\n const start = Date.now();\n try {\n if (!keyvals.length) throw new PncliError('Provide at least one key=value pair');\n const properties: Record<string, string> = {};\n for (const kv of keyvals) {\n const eq = kv.indexOf('=');\n if (eq < 1) throw new PncliError(`Invalid property format: \"${kv}\" — expected key=value`);\n properties[kv.slice(0, eq)] = kv.slice(eq + 1);\n }\n const client = getClient(program);\n await client.setProperties(repo, path, properties, { recursive: opts.recursive });\n success({ repo, path, properties }, 'artifactory', 'properties-set', start);\n } catch (err) { fail(err, 'artifactory', 'properties-set', start); }\n });\n\n // ── AQL search ────────────────────────────────────────────────────────────\n\n art.command('search')\n .description('Search artifacts using AQL (Artifactory Query Language) (consider --output-file for large results)')\n .option('--repo <name>', 'Filter by repository key')\n .option('--name <pattern>', 'Filter by artifact name (supports * and ? wildcards)')\n .option('--path <pattern>', 'Filter by artifact path (supports * and ? wildcards)')\n .option('--after <date>', 'Created after this date (ISO 8601, e.g. 2024-01-01)')\n .option('--before <date>', 'Created before this date (ISO 8601)')\n .option('--limit <n>', 'Maximum results to return (default: 100)', '100')\n .option('--properties', 'Include artifact properties in results', false)\n .action(async (opts: { repo?: string; name?: string; path?: string; after?: string; before?: string; limit: string; properties: boolean }) => {\n const start = Date.now();\n try {\n if (!opts.repo && !opts.name && !opts.path) {\n throw new PncliError('Provide at least one filter: --repo, --name, or --path');\n }\n const client = getClient(program);\n const data = await client.searchAql({\n repo: opts.repo,\n name: opts.name,\n path: opts.path,\n after: opts.after,\n before: opts.before,\n limit: Number.isNaN(parseInt(opts.limit, 10)) ? 100 : parseInt(opts.limit, 10),\n includeProperties: opts.properties\n });\n success(data, 'artifactory', 'search', start);\n } catch (err) { fail(err, 'artifactory', 'search', start); }\n });\n\n // ── Builds ────────────────────────────────────────────────────────────────\n\n art.command('builds')\n .description('List builds registered in Artifactory Build Integration (names may differ from ADO pipeline or uDeploy component names; use \"search --repo\" when empty)')\n .option('--timeout <s>', 'Request timeout in seconds (default 60; increase for large Artifactory instances)', '60')\n .action(async (opts: { timeout: string }) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const timeoutSecs = parseInt(opts.timeout, 10);\n if (isNaN(timeoutSecs) || timeoutSecs <= 0) throw new PncliError('--timeout must be a positive integer (seconds)', 1);\n const timeoutMs = timeoutSecs * 1000;\n const data = await client.listBuilds({ timeoutMs });\n success(data, 'artifactory', 'builds', start);\n } catch (err) { fail(err, 'artifactory', 'builds', start); }\n });\n\n art.command('build-runs <name>')\n .description('List all run numbers for a build')\n .action(async (name: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.listBuildRuns(name);\n success(data, 'artifactory', 'build-runs', start);\n } catch (err) { fail(err, 'artifactory', 'build-runs', start); }\n });\n\n art.command('build-info <name> <number>')\n .description('Get build info (artifacts, dependencies, VCS revision) for a specific run')\n .action(async (name: string, number: string) => {\n const start = Date.now();\n try {\n const client = getClient(program);\n const data = await client.getBuildInfo(name, number);\n success(data, 'artifactory', 'build-info', start);\n } catch (err) { fail(err, 'artifactory', 'build-info', start); }\n });\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n UdeployApplication,\n UdeployComponent,\n UdeployEnvironment,\n UdeployProcessRequest,\n UdeployRequestInfo,\n UdeployRequestStatus,\n UdeployVersion,\n UdeployVersionCreateResult,\n} from '../../types/udeploy.js';\n\nexport interface UdeployRunProcessOptions {\n application: string;\n applicationProcess: string;\n environment: string;\n onlyChanged?: boolean;\n versions?: Array<{ component: string; version: string }>;\n snapshot?: string;\n properties?: Record<string, string>;\n}\n\nexport class UdeployClient {\n constructor(private http: HttpClient) {}\n\n listApplications(): Promise<UdeployApplication[]> {\n return this.http.udeploy<UdeployApplication[]>('/cli/application');\n }\n\n listEnvironments(application: string): Promise<UdeployEnvironment[]> {\n return this.http.udeploy<UdeployEnvironment[]>('/cli/application/environmentsInApplication', {\n params: { application }\n });\n }\n\n listComponents(): Promise<UdeployComponent[]> {\n return this.http.udeploy<UdeployComponent[]>('/cli/component');\n }\n\n listVersions(component: string): Promise<UdeployVersion[]> {\n return this.http.udeploy<UdeployVersion[]>('/cli/component/versions', {\n params: { component }\n });\n }\n\n createVersion(component: string, name: string): Promise<UdeployVersionCreateResult> {\n return this.http.udeploy<UdeployVersionCreateResult>('/cli/version/createVersion', {\n method: 'POST',\n params: { component, name }\n });\n }\n\n finishImporting(component: string, version: string): Promise<void> {\n return this.http.udeploy<void>('/cli/version/finishedImporting', {\n method: 'POST',\n params: { component, version }\n });\n }\n\n runProcess(opts: UdeployRunProcessOptions): Promise<UdeployProcessRequest> {\n return this.http.udeploy<UdeployProcessRequest>('/cli/applicationProcessRequest/request', {\n method: 'PUT',\n body: {\n application: opts.application,\n applicationProcess: opts.applicationProcess,\n environment: opts.environment,\n onlyChanged: opts.onlyChanged ?? false,\n ...(opts.versions ? { versions: opts.versions } : {}),\n ...(opts.snapshot ? { snapshot: opts.snapshot } : {}),\n ...(opts.properties ? { properties: opts.properties } : {}),\n }\n });\n }\n\n getRequestStatus(requestId: string): Promise<UdeployRequestStatus> {\n return this.http.udeploy<UdeployRequestStatus>('/cli/applicationProcessRequest/requestStatus', {\n params: { requestId }\n });\n }\n\n getRequestInfo(requestId: string): Promise<UdeployRequestInfo> {\n return this.http.udeploy<UdeployRequestInfo>('/cli/applicationProcessRequest/requestInfo', {\n params: { requestId }\n });\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail, log } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { UdeployClient } from './client.js';\n\nconst POLL_INTERVAL_MS = 5000;\nconst DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;\n\nfunction getClient(program: Command): { client: UdeployClient; config: ReturnType<typeof loadConfig> } {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config });\n if (!config.udeploy.baseUrl) {\n throw new PncliError('UDeploy baseUrl not configured. Run: pncli config init', 78);\n }\n const http = createHttpClient(config, opts.dryRun);\n return { client: new UdeployClient(http), config };\n}\n\nfunction resolveApplication(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const app = cliValue ?? config.defaults.udeploy.application;\n if (!app) throw new PncliError('--application is required (or set defaults.udeploy.application in config)', 2);\n return app;\n}\n\nfunction resolveEnvironment(config: ReturnType<typeof loadConfig>, cliValue?: string): string {\n const env = cliValue ?? config.defaults.udeploy.environment;\n if (!env) throw new PncliError('--environment is required (or set defaults.udeploy.environment in config)', 2);\n return env;\n}\n\nexport function registerUdeployCommands(program: Command): void {\n const udeploy = program\n .command('udeploy')\n .description('IBM UrbanCode Deploy — component versions and deployment processes')\n .option('--application <name>', 'Application name or ID')\n .option('--environment <name>', 'Environment name or ID');\n\n udeploy\n .command('apps')\n .description('List all applications')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const apps = await client.listApplications();\n success(apps, 'udeploy', 'apps', start);\n } catch (err) {\n fail(err, 'udeploy', 'apps', start);\n }\n });\n\n udeploy\n .command('environments')\n .description('List environments for an application')\n .action(async () => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const envs = await client.listEnvironments(application);\n success(envs, 'udeploy', 'environments', start);\n } catch (err) {\n fail(err, 'udeploy', 'environments', start);\n }\n });\n\n udeploy\n .command('components')\n .description('List all components')\n .action(async () => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const components = await client.listComponents();\n success(components, 'udeploy', 'components', start);\n } catch (err) {\n fail(err, 'udeploy', 'components', start);\n }\n });\n\n udeploy\n .command('versions')\n .description('List versions for a component')\n .requiredOption('--component <name>', 'Component name or ID')\n .action(async (cmdOpts: { component: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const versions = await client.listVersions(cmdOpts.component);\n success(versions, 'udeploy', 'versions', start);\n } catch (err) {\n fail(err, 'udeploy', 'versions', start);\n }\n });\n\n udeploy\n .command('import-version')\n .description('Create a component version and mark it ready for deployment')\n .requiredOption('--component <name>', 'Component name or ID')\n .requiredOption('--name <name>', 'Version name')\n .option('--no-finish', 'Skip marking the version as finished importing')\n .action(async (cmdOpts: { component: string; name: string; finish: boolean }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const created = await client.createVersion(cmdOpts.component, cmdOpts.name);\n if (cmdOpts.finish) {\n await client.finishImporting(cmdOpts.component, cmdOpts.name);\n }\n success({ ...created, finishedImporting: cmdOpts.finish }, 'udeploy', 'import-version', start);\n } catch (err) {\n fail(err, 'udeploy', 'import-version', start);\n }\n });\n\n udeploy\n .command('run')\n .description('Run an application deployment process')\n .requiredOption('--process <name>', 'Application process name or ID')\n .option('--component <name>', 'Component name (repeatable)', collect, [])\n .option('--component-version <name>', 'Component version (repeatable; positionally paired with --component)', collect, [])\n .option('--snapshot <name>', 'Snapshot name or ID (alternative to specifying versions)')\n .option('--only-changed', 'Deploy only changed components', false)\n .option('--wait', 'Poll until the process completes', false)\n .option('--timeout <ms>', 'Max wait time in milliseconds', String(DEFAULT_TIMEOUT_MS))\n .action(async (cmdOpts: {\n process: string;\n component: string[];\n componentVersion: string[];\n snapshot?: string;\n onlyChanged: boolean;\n wait: boolean;\n timeout: string;\n }) => {\n const start = Date.now();\n try {\n const { client, config } = getClient(program);\n const parentOpts = udeploy.opts<{ application?: string; environment?: string }>();\n const application = resolveApplication(config, parentOpts.application);\n const environment = resolveEnvironment(config, parentOpts.environment);\n\n const components = cmdOpts.component;\n const versions = cmdOpts.componentVersion;\n const versionEntries = components.map((c, i) => ({\n component: c,\n version: versions[i] ?? 'latest'\n }));\n\n const result = await client.runProcess({\n application,\n applicationProcess: cmdOpts.process,\n environment,\n onlyChanged: cmdOpts.onlyChanged,\n ...(versionEntries.length > 0 ? { versions: versionEntries } : {}),\n ...(cmdOpts.snapshot ? { snapshot: cmdOpts.snapshot } : {}),\n });\n\n if (!cmdOpts.wait) {\n success(result, 'udeploy', 'run', start);\n return;\n }\n\n const timeoutMs = parseInt(cmdOpts.timeout, 10);\n const requestId = result.requestId;\n log(`Process started. Request ID: ${requestId}. Polling for completion...`);\n\n while (true) {\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n throw new PncliError(`Timed out after ${timeoutMs}ms waiting for request ${requestId}`, 1);\n }\n\n await sleep(POLL_INTERVAL_MS);\n\n const status = await client.getRequestStatus(requestId);\n\n if (status.status === 'CLOSED') {\n const outcome = { requestId, status: status.status, result: status.result, elapsed_ms: Date.now() - start };\n if (status.result === 'SUCCEEDED') {\n success(outcome, 'udeploy', 'run', start);\n } else {\n throw new PncliError(\n `Deployment ${status.result ?? 'failed'} (requestId: ${requestId})`,\n 1\n );\n }\n return;\n }\n\n log(`Status: ${status.status} (${Math.round((Date.now() - start) / 1000)}s elapsed)`);\n }\n } catch (err) {\n fail(err, 'udeploy', 'run', start);\n }\n });\n\n udeploy\n .command('request-status')\n .description('Get the current status of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const status = await client.getRequestStatus(cmdOpts.requestId);\n success(status, 'udeploy', 'request-status', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-status', start);\n }\n });\n\n udeploy\n .command('request-info')\n .description('Get full details of a deployment process request')\n .requiredOption('--request-id <id>', 'Request ID returned by udeploy run')\n .action(async (cmdOpts: { requestId: string }) => {\n const start = Date.now();\n try {\n const { client } = getClient(program);\n const info = await client.getRequestInfo(cmdOpts.requestId);\n success(info, 'udeploy', 'request-info', start);\n } catch (err) {\n fail(err, 'udeploy', 'request-info', start);\n }\n });\n}\n\nfunction collect(val: string, prev: string[]): string[] {\n return [...prev, val];\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../../lib/http.js';\nimport type {\n CxOneProject,\n CxOneProjectsResponse,\n CxOneScan,\n CxOneScansResponse,\n CxOneResultsSummary\n} from '../../types/checkmarx.js';\n\nexport class CheckmarxClient {\n constructor(private http: HttpClient) {}\n\n async listProjects(): Promise<CxOneProject[]> {\n const res = await this.http.checkmarx<CxOneProjectsResponse>('projects', { params: { limit: 100 } });\n const projects = res.projects ?? [];\n if (res.filteredTotalCount > projects.length) {\n process.stderr.write(`warning: ${res.filteredTotalCount} projects found; only showing first ${projects.length}\\n`);\n }\n return projects;\n }\n\n async getProject(id: string): Promise<CxOneProject> {\n return this.http.checkmarx<CxOneProject>(`projects/${id}`);\n }\n\n async listScans(opts: { projectId?: string; last?: number } = {}): Promise<CxOneScan[]> {\n const params: Record<string, string | number> = { limit: opts.last ?? 100 };\n if (opts.projectId) params['project-id'] = opts.projectId;\n const res = await this.http.checkmarx<CxOneScansResponse>('scans', { params });\n const scans = res.scans ?? [];\n if (res.filteredTotalCount > scans.length) {\n process.stderr.write(`warning: ${res.filteredTotalCount} scans found; only showing first ${scans.length}\\n`);\n }\n return scans;\n }\n\n async getScan(id: string): Promise<CxOneScan> {\n return this.http.checkmarx<CxOneScan>(`scans/${id}`);\n }\n\n async getScanResultsStatistics(scanId: string): Promise<CxOneResultsSummary> {\n return this.http.checkmarx<CxOneResultsSummary>('results/summary', {\n params: { 'scan-id': scanId }\n });\n }\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { CheckmarxClient } from './client.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getClient(program: Command): CheckmarxClient {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.checkmarx.baseUrl) throw new PncliError('Checkmarx not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return new CheckmarxClient(http);\n}\n\nexport function registerCheckmarxCommands(program: Command): void {\n const cx = program.command('checkmarx').description('Checkmarx One operations');\n const project = cx.command('project').description('Project operations');\n const scan = cx.command('scan').description('Scan operations');\n\n project\n .command('list')\n .description('List all projects')\n .action(async () => {\n const start = Date.now();\n try {\n const data = await getClient(program).listProjects();\n success(data, 'checkmarx', 'project-list', start);\n } catch (err) { fail(err, 'checkmarx', 'project-list', start); }\n });\n\n project\n .command('get')\n .description('Get a project by ID')\n .requiredOption('--id <id>', 'Project UUID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const data = await getClient(program).getProject(opts.id);\n success(data, 'checkmarx', 'project-get', start);\n } catch (err) { fail(err, 'checkmarx', 'project-get', start); }\n });\n\n scan\n .command('list')\n .description('List scans')\n .option('--project <id>', 'Filter by project UUID')\n .option('--last <n>', 'Return only the last N scans')\n .action(async (opts: { project?: string; last?: string }) => {\n const start = Date.now();\n try {\n const last = opts.last ? parseInt(opts.last, 10) : undefined;\n if (opts.last && isNaN(last!)) throw new PncliError(`Invalid --last \"${opts.last}\". Expected an integer.`, 1);\n const data = await getClient(program).listScans({ projectId: opts.project, last });\n success(data, 'checkmarx', 'scan-list', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-list', start); }\n });\n\n scan\n .command('get')\n .description('Get a scan by ID')\n .requiredOption('--id <id>', 'Scan UUID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const data = await getClient(program).getScan(opts.id);\n success(data, 'checkmarx', 'scan-get', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-get', start); }\n });\n\n scan\n .command('stats')\n .description('Get results statistics for a scan')\n .requiredOption('--id <id>', 'Scan UUID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const data = await getClient(program).getScanResultsStatistics(opts.id);\n success(data, 'checkmarx', 'scan-stats', start);\n } catch (err) { fail(err, 'checkmarx', 'scan-stats', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\ninterface SnowChangeRecord {\n sys_id: string;\n number: string;\n short_description: string;\n state: string;\n priority: string;\n assigned_to?: { display_value?: string };\n assignment_group?: { display_value?: string };\n start_date?: string;\n end_date?: string;\n description?: string;\n [key: string]: unknown;\n}\n\ninterface SnowListResponse {\n result: SnowChangeRecord[];\n}\n\ninterface SnowSingleResponse {\n result: SnowChangeRecord;\n}\n\nfunction getHttp(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.servicenow.baseUrl) throw new PncliError('ServiceNow not configured. Run: pncli config init');\n return createHttpClient(config, Boolean(opts.dryRun));\n}\n\nexport function registerServiceNowCommands(program: Command): void {\n const sn = program.command('servicenow').description('ServiceNow operations');\n const change = sn.command('change').description('Change request operations');\n\n change\n .command('list')\n .description('List change requests')\n .option('--state <state>', 'Filter by state (e.g. -1=Pending, 1=Open, 2=Work in Progress, 3=Closed Complete)')\n .option('--assigned-to <user>', 'Filter by assigned user sys_id or display name')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--fields <fields>', 'Comma-separated field names to return')\n .action(async (opts: { state?: string; assignedTo?: string; limit?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string | number | boolean | undefined> = {\n sysparm_limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n sysparm_display_value: 'true',\n };\n const sanitize = (v: string) => v.replace(/\\^/g, '');\n const queries: string[] = [];\n if (opts.state !== undefined) queries.push(`state=${sanitize(opts.state)}`);\n if (opts.assignedTo) queries.push(`assigned_to=${sanitize(opts.assignedTo)}`);\n if (queries.length) params['sysparm_query'] = queries.join('^');\n if (opts.fields) params['sysparm_fields'] = opts.fields;\n\n const data = await http.servicenow<SnowListResponse>('/api/now/table/change_request', { params });\n success(data.result, 'servicenow', 'change list', start);\n } catch (err) { fail(err, 'servicenow', 'change list', start); }\n });\n\n change\n .command('get')\n .description('Get a change request by sys_id or number')\n .requiredOption('--id <id>', 'Change request sys_id or number (e.g. CHG0001234)')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n if (opts.id.toUpperCase().startsWith('CHG')) {\n const list = await http.servicenow<SnowListResponse>('/api/now/table/change_request', {\n params: { sysparm_query: `number=${opts.id}`, sysparm_display_value: 'true', sysparm_limit: 1 }\n });\n if (!list.result.length) throw new PncliError(`Change request not found: ${opts.id}`, 1);\n success(list.result[0], 'servicenow', 'change get', start);\n return;\n }\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n params: { sysparm_display_value: 'true' }\n });\n success(data.result, 'servicenow', 'change get', start);\n } catch (err) { fail(err, 'servicenow', 'change get', start); }\n });\n\n change\n .command('create')\n .description('Create a change request')\n .requiredOption('--short-description <text>', 'Short description (title)')\n .option('--description <text>', 'Full description')\n .option('--type <type>', 'Change type: normal, standard, or emergency', 'normal')\n .option('--priority <n>', 'Priority: 1=Critical, 2=High, 3=Moderate, 4=Low')\n .option('--assigned-to <user>', 'Assigned user sys_id')\n .option('--assignment-group <group>', 'Assignment group sys_id')\n .option('--start-date <datetime>', 'Planned start date (yyyy-MM-dd HH:mm:ss)')\n .option('--end-date <datetime>', 'Planned end date (yyyy-MM-dd HH:mm:ss)')\n .action(async (opts: {\n shortDescription: string;\n description?: string;\n type?: string;\n priority?: string;\n assignedTo?: string;\n assignmentGroup?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {\n short_description: opts.shortDescription,\n type: opts.type ?? 'normal'\n };\n if (opts.description) body['description'] = opts.description;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.assignmentGroup) body['assignment_group'] = opts.assignmentGroup;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n const data = await http.servicenow<SnowSingleResponse>('/api/now/table/change_request', {\n method: 'POST',\n body\n });\n success(data.result, 'servicenow', 'change create', start);\n } catch (err) { fail(err, 'servicenow', 'change create', start); }\n });\n\n change\n .command('update')\n .description('Update a change request')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--short-description <text>', 'New short description')\n .option('--description <text>', 'New description')\n .option('--state <state>', 'New state value')\n .option('--priority <n>', 'New priority')\n .option('--assigned-to <user>', 'New assigned user sys_id')\n .option('--start-date <datetime>', 'New planned start date')\n .option('--end-date <datetime>', 'New planned end date')\n .action(async (opts: {\n id: string;\n shortDescription?: string;\n description?: string;\n state?: string;\n priority?: string;\n assignedTo?: string;\n startDate?: string;\n endDate?: string;\n }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = {};\n if (opts.shortDescription) body['short_description'] = opts.shortDescription;\n if (opts.description) body['description'] = opts.description;\n if (opts.state !== undefined) body['state'] = opts.state;\n if (opts.priority) body['priority'] = opts.priority;\n if (opts.assignedTo) body['assigned_to'] = opts.assignedTo;\n if (opts.startDate) body['start_date'] = opts.startDate;\n if (opts.endDate) body['end_date'] = opts.endDate;\n\n if (Object.keys(body).length === 0) throw new PncliError('No fields to update. Provide at least one option besides --id.', 1);\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change update', start);\n } catch (err) { fail(err, 'servicenow', 'change update', start); }\n });\n\n change\n .command('close')\n .description('Close a change request (state=3)')\n .requiredOption('--id <sys_id>', 'Change request sys_id')\n .option('--close-notes <text>', 'Closure notes')\n .option('--close-code <code>', 'Close code (e.g. successful, unsuccessful)')\n .action(async (opts: { id: string; closeNotes?: string; closeCode?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const body: Record<string, unknown> = { state: 3 };\n if (opts.closeNotes) body['close_notes'] = opts.closeNotes;\n if (opts.closeCode) body['close_code'] = opts.closeCode;\n\n const data = await http.servicenow<SnowSingleResponse>(`/api/now/table/change_request/${opts.id}`, {\n method: 'PATCH',\n body\n });\n success(data.result, 'servicenow', 'change close', start);\n } catch (err) { fail(err, 'servicenow', 'change close', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpAndOrg(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.contrast.apiKey || !config.contrast.serviceKey || !config.contrast.username) throw new PncliError('Contrast not configured. Run: pncli config init');\n if (!config.contrast.orgUuid) throw new PncliError('Contrast org UUID not configured. Run: pncli config set contrast.orgUuid <uuid>');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return { http, orgUuid: config.contrast.orgUuid };\n}\n\nexport function registerContrastCommands(program: Command): void {\n const contrast = program.command('contrast').description('Contrast IAST operations');\n\n const apps = contrast.command('apps').description('Application operations');\n\n apps\n .command('list')\n .description('List applications in the organization')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(`/Contrast/api/ng/${orgUuid}/applications`, {\n params: {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n }\n });\n success(data, 'contrast', 'apps list', start);\n } catch (err) { fail(err, 'contrast', 'apps list', start); }\n });\n\n const findings = contrast.command('findings').description('Vulnerability findings operations');\n\n findings\n .command('list')\n .description('List vulnerability findings for an application')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .option('--severity <level>', 'Filter by severity: CRITICAL, HIGH, MEDIUM, LOW, NOTE')\n .option('--status <status>', 'Filter by status: REPORTED, CONFIRMED, SUSPICIOUS, NOT_A_PROBLEM, REMEDIATED, FIXED')\n .option('--limit <n>', 'Maximum number of results', '25')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (opts: { app: string; severity?: string; status?: string; limit?: string; offset?: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const params: Record<string, string | number | boolean | undefined> = {\n limit: opts.limit ? parseInt(opts.limit, 10) : 25,\n offset: opts.offset ? parseInt(opts.offset, 10) : 0\n };\n if (opts.severity) params['severities'] = opts.severity;\n if (opts.status) params['statuses'] = opts.status;\n\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/filter`,\n { params }\n );\n success(data, 'contrast', 'findings list', start);\n } catch (err) { fail(err, 'contrast', 'findings list', start); }\n });\n\n findings\n .command('get')\n .description('Get details for a specific vulnerability finding')\n .requiredOption('--app <app-id>', 'Application ID (UUID)')\n .requiredOption('--trace <trace-id>', 'Trace/finding UUID')\n .action(async (opts: { app: string; trace: string }) => {\n const start = Date.now();\n try {\n const { http, orgUuid } = getHttpAndOrg(program);\n const data = await http.contrast<unknown>(\n `/Contrast/api/ng/${orgUuid}/traces/${opts.app}/trace/${opts.trace}`\n );\n success(data, 'contrast', 'findings get', start);\n } catch (err) { fail(err, 'contrast', 'findings get', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nfunction getHttpClient(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.sonatypeiq.baseUrl) throw new PncliError('Sonatype IQ Server baseUrl not configured. Run: pncli config init');\n if (!config.sonatypeiq.userCode || !config.sonatypeiq.passcode) throw new PncliError('Sonatype IQ Server credentials not configured. Run: pncli config init');\n const http = createHttpClient(config, Boolean(opts.dryRun));\n return http;\n}\n\nexport function registerSonatypeIqCommands(program: Command): void {\n const sonatypeiq = program.command('sonatypeiq').description('Sonatype IQ Server operations');\n\n const applications = sonatypeiq.command('applications').description('Application operations');\n\n applications\n .command('list')\n .description('List all applications in Sonatype IQ Server')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const params: Record<string, string | number | boolean | undefined> = {};\n if (opts.organizationId) params['organizationId'] = opts.organizationId;\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', { params });\n success(data, 'sonatypeiq', 'applications list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications list', startTime); }\n });\n\n applications\n .command('get')\n .description('Get an application by its public ID')\n .requiredOption('--public-id <id>', 'Application public ID')\n .action(async (opts: { publicId: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/applications', {\n params: { publicId: opts.publicId }\n });\n success(data, 'sonatypeiq', 'applications get', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'applications get', startTime); }\n });\n\n const organizations = sonatypeiq.command('organizations').description('Organization operations');\n\n organizations\n .command('list')\n .description('List all organizations in Sonatype IQ Server')\n .action(async () => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const data = await http.sonatypeiq<unknown>('/api/v2/organizations');\n success(data, 'sonatypeiq', 'organizations list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'organizations list', startTime); }\n });\n\n const policies = sonatypeiq.command('policies').description('Policy operations');\n\n policies\n .command('list')\n .description('List all policies')\n .option('--organization-id <id>', 'Filter by organization ID')\n .action(async (opts: { organizationId?: string }) => {\n const startTime = Date.now();\n try {\n const http = getHttpClient(program);\n const path = opts.organizationId\n ? `/api/v2/policies/organization/${encodeURIComponent(opts.organizationId)}`\n : '/api/v2/policies';\n const data = await http.sonatypeiq<unknown>(path);\n success(data, 'sonatypeiq', 'policies list', startTime);\n } catch (err) { fail(err, 'sonatypeiq', 'policies list', startTime); }\n });\n}\n","import { Command } from 'commander';\nimport { success, fail, warn } from '../../lib/output.js';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { fileURLToPath } from 'url';\nimport { execFileSync } from 'child_process';\nimport select from '@inquirer/select';\nimport checkbox, { Separator } from '@inquirer/checkbox';\nimport input from '@inquirer/input';\nimport { writeGlobalConfig, getGlobalConfigPath, loadJsonFile } from '../../lib/config.js';\nimport type { GlobalConfig, MarketplaceConfig } from '../../types/config.js';\n\nconst BACK = '__back__';\nconst ALL_MARKETPLACES = '__all_marketplaces__';\n\n/**\n * Injects an HTTP access token into a git clone URL.\n * - GitHub (github.com): uses the x-access-token scheme\n * https://x-access-token:<token>@github.com/owner/repo.git\n * - All other hosts (Bitbucket, self-hosted, etc.): uses the x-token-auth scheme\n * https://x-token-auth:<token>@host/path\n */\nexport function injectTokenIntoUrl(url: string, token: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`--token requires an HTTPS clone URL; got: ${url}`);\n }\n parsed.username = parsed.hostname === 'github.com' ? 'x-access-token' : 'x-token-auth';\n parsed.password = token;\n return parsed.toString();\n}\n\n/**\n * Derives a local directory name from a git clone URL by taking the last\n * path segment and stripping a trailing .git extension.\n * e.g. https://github.com/owner/my-marketplace.git → \"my-marketplace\"\n */\nexport function repoNameFromUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const segment = parsed.pathname.split('/').filter(Boolean).pop() ?? 'marketplace';\n return segment.replace(/\\.git$/i, '') || 'marketplace';\n } catch {\n return 'marketplace';\n }\n}\n\n/**\n * Returns the default local path for a marketplace clone:\n * <homedir>/.agents/marketplaces/<repoName>\n * Works cross-platform (os.homedir() resolves correctly on Windows too).\n */\nexport function defaultMarketplacePath(url: string): string {\n return path.join(os.homedir(), '.agents', 'marketplaces', repoNameFromUrl(url));\n}\n\nfunction marketplaceLabel(m: MarketplaceConfig): string {\n return m.name ?? repoNameFromUrl(m.repoUrl ?? '');\n}\n\n/** Strips injected credentials out of git error output before it reaches JSON output or logs. */\nfunction scrubToken(msg: string): string {\n return msg.replace(/x-(?:token-auth|access-token):[^@]+@/g, 'x-token-auth:***@');\n}\n\n/**\n * Throws a clear error instead of hanging when an interactive prompt would otherwise block a\n * non-TTY caller. Only stdin needs to be a TTY — pncli's stdout is JSON and piping it (to a file,\n * `jq`, etc.) is a normal, fully-interactive usage pattern.\n */\nfunction assertInteractive(hint: string): void {\n if (!process.stdin.isTTY) {\n throw new Error(`This selection requires an interactive terminal. ${hint}`);\n }\n}\n\nconst AGENT_PATHS: Record<string, { project: string; user: string }> = {\n 'github-copilot': { project: '.agents/skills', user: path.join(os.homedir(), '.agents/skills') },\n 'claude-code': { project: '.claude/skills', user: path.join(os.homedir(), '.claude/skills') },\n};\n\nfunction resolveAgentName(opts: { agent?: string; claude?: boolean }): string {\n return opts.claude ? 'claude-code' : (opts.agent ?? 'github-copilot');\n}\n\nfunction resolveAgentPaths(agentName: string): { project: string; user: string } {\n const agentConfig = AGENT_PATHS[agentName];\n if (!agentConfig) {\n throw new Error(`Unknown agent: \"${agentName}\". Use: ${Object.keys(AGENT_PATHS).join(' | ')}`);\n }\n return agentConfig;\n}\n\nfunction resolveTargetDir(opts: { agent?: string; claude?: boolean; scope?: string; target?: string }): string {\n if (opts.target) return path.resolve(opts.target);\n const agentConfig = resolveAgentPaths(resolveAgentName(opts));\n const scopePath = (opts.scope ?? 'user') === 'project' ? agentConfig.project : agentConfig.user;\n return path.resolve(scopePath);\n}\n\n// Resolve the bundled skills directory relative to this file (dist/cli.js → ../skills)\nfunction getBundledSkillsDir(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(thisFile), '..', 'skills');\n } catch {\n return '';\n }\n}\n\n/**\n * Path to the skill install metadata file inside a given skills target directory.\n */\nexport function getInstalledMetaPath(targetDir: string): string {\n return path.join(targetDir, '.pncli-installed.json');\n}\n\nexport interface InstalledSkillRecord {\n source: 'marketplace' | 'bundled';\n marketplace?: string;\n plugin?: string;\n installedFrom?: string;\n branch?: string;\n installedAt: string;\n}\n\n/**\n * Per-skill provenance file written inside each installed skill directory.\n * Self-contained alternative/supplement to the directory-level .pncli-installed.json index.\n */\nexport interface SkillOrigin {\n version: 1;\n source: 'marketplace' | 'bundled';\n marketplace?: string;\n plugin?: string;\n installedFrom?: string;\n branch?: string;\n installedAt: string;\n}\n\nconst SKILL_ORIGIN_FILENAME = 'pncli-origin.json';\n\n/**\n * Hidden subdirectory inside the skills target dir where disabled skills are stashed.\n * Starts with '.' so agents don't pick it up as a skills folder.\n */\nexport const DISABLED_SUBDIR = '.pncli-disabled';\n\nexport interface InstalledMeta {\n version: 1;\n skills: Record<string, InstalledSkillRecord>;\n disabled?: Record<string, InstalledSkillRecord>;\n}\n\n/**\n * Reads the installed-skills metadata from the target directory.\n */\nexport function readInstalledMeta(targetDir: string): InstalledMeta {\n const metaPath = getInstalledMetaPath(targetDir);\n const raw = loadJsonFile<InstalledMeta>(metaPath);\n if (raw && raw.version === 1 && raw.skills) return raw;\n return { version: 1, skills: {} };\n}\n\n/**\n * Returns the path to the per-skill origin file inside a given skill directory.\n */\nexport function getSkillOriginPath(skillDir: string): string {\n return path.join(skillDir, SKILL_ORIGIN_FILENAME);\n}\n\n/**\n * Reads the per-skill origin file, or returns null if absent/invalid.\n * Used for backward-compatible provenance lookup on skills installed before this feature.\n */\nexport function readSkillOrigin(skillDir: string): SkillOrigin | null {\n const originPath = getSkillOriginPath(skillDir);\n if (!fs.existsSync(originPath)) return null;\n try {\n const raw = JSON.parse(fs.readFileSync(originPath, 'utf8')) as SkillOrigin;\n if (raw && raw.version === 1 && raw.source) return raw;\n } catch { /* ignore parse errors */ }\n return null;\n}\n\nfunction matchesMarketplaceFilter(record: InstalledSkillRecord, filter?: string): boolean {\n return !filter || record.marketplace === filter || record.installedFrom === filter;\n}\n\n/**\n * Resolves the install record for a skill directory, preferring the directory-level\n * index and falling back to the per-skill pncli-origin.json for skills installed\n * before the index existed.\n */\nfunction resolveSkillRecord(meta: InstalledMeta, targetDir: string, skillName: string): InstalledSkillRecord | null {\n const fromMeta = meta.skills[skillName];\n if (fromMeta) return fromMeta;\n const perSkill = readSkillOrigin(path.join(targetDir, skillName));\n if (!perSkill) return null;\n return {\n source: perSkill.source,\n marketplace: perSkill.marketplace,\n plugin: perSkill.plugin,\n installedFrom: perSkill.installedFrom,\n branch: perSkill.branch,\n installedAt: perSkill.installedAt,\n };\n}\n\nfunction listActiveSkillDirs(targetDir: string): string[] {\n return fs.readdirSync(targetDir).filter(name => {\n if (name.startsWith('.')) return false;\n const p = path.join(targetDir, name);\n try { return fs.statSync(p).isDirectory(); } catch { return false; }\n });\n}\n\nexport interface DisablePluginResult {\n disabled: string[];\n alreadyDisabled: string[];\n skipped: string[];\n}\n\n/**\n * Moves every active skill belonging to `plugin` into the hidden stash directory and\n * records the move in the `disabled` map of .pncli-installed.json. Skills already\n * stashed are reported in `alreadyDisabled`; skills belonging to other plugins (or\n * not installed from a marketplace) in `skipped`. The metadata file is only written\n * when a skill actually moved.\n */\nexport function disablePluginSkills(targetDir: string, plugin: string, marketplaceFilter?: string): DisablePluginResult {\n const resolvedTarget = path.resolve(targetDir);\n const stashDir = path.join(targetDir, DISABLED_SUBDIR);\n const meta = readInstalledMeta(targetDir);\n const disabled: string[] = [];\n const alreadyDisabled: string[] = [];\n const skipped: string[] = [];\n\n for (const skillName of listActiveSkillDirs(targetDir)) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) continue;\n\n const record = resolveSkillRecord(meta, targetDir, skillName);\n if (!record || record.source !== 'marketplace') { skipped.push(skillName); continue; }\n if (!matchesMarketplaceFilter(record, marketplaceFilter) || record.plugin !== plugin) { skipped.push(skillName); continue; }\n\n const stashDest = path.join(stashDir, skillName);\n fs.mkdirSync(stashDir, { recursive: true });\n if (fs.existsSync(stashDest)) fs.rmSync(stashDest, { recursive: true, force: true });\n fs.renameSync(skillDir, stashDest);\n delete meta.skills[skillName];\n meta.disabled = meta.disabled ?? {};\n meta.disabled[skillName] = record;\n disabled.push(skillName);\n }\n\n for (const [skillName, record] of Object.entries(meta.disabled ?? {})) {\n if (record.plugin === plugin && matchesMarketplaceFilter(record, marketplaceFilter) && !disabled.includes(skillName)) {\n alreadyDisabled.push(skillName);\n }\n }\n\n if (disabled.length > 0) {\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n }\n return { disabled, alreadyDisabled, skipped };\n}\n\nexport interface EnablePluginResult {\n enabled: string[];\n stashMissing: string[];\n skipped: string[];\n hadDisabled: boolean;\n}\n\n/**\n * Moves every stashed skill belonging to `plugin` back into the skills directory and\n * returns its record to the `skills` map of .pncli-installed.json. Skills whose stash\n * directory has gone missing stay recorded in `disabled` (so metadata never claims an\n * install that isn't on disk) and are surfaced in `stashMissing` — the fix is to\n * re-install the plugin. The metadata file is only written when a skill actually moved.\n */\nexport function enablePluginSkills(targetDir: string, plugin: string, marketplaceFilter?: string): EnablePluginResult {\n const resolvedTarget = path.resolve(targetDir);\n const stashDir = path.join(targetDir, DISABLED_SUBDIR);\n const meta = readInstalledMeta(targetDir);\n const enabled: string[] = [];\n const stashMissing: string[] = [];\n const skipped: string[] = [];\n\n const disabledEntries = Object.entries(meta.disabled ?? {});\n for (const [skillName, record] of disabledEntries) {\n if (record.plugin !== plugin || !matchesMarketplaceFilter(record, marketplaceFilter)) { skipped.push(skillName); continue; }\n\n // skillName comes from user-editable JSON — reject anything that would escape targetDir.\n const dest = path.resolve(targetDir, skillName);\n if (!dest.startsWith(resolvedTarget + path.sep)) { skipped.push(skillName); continue; }\n\n const stashSrc = path.join(stashDir, skillName);\n if (!fs.existsSync(stashSrc)) {\n stashMissing.push(skillName);\n continue;\n }\n\n if (fs.existsSync(dest)) fs.rmSync(dest, { recursive: true, force: true });\n fs.renameSync(stashSrc, dest);\n meta.skills[skillName] = record;\n delete meta.disabled![skillName];\n enabled.push(skillName);\n }\n\n if (fs.existsSync(stashDir) && fs.readdirSync(stashDir).length === 0) {\n fs.rmdirSync(stashDir);\n }\n\n if (enabled.length > 0) {\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n }\n return { enabled, stashMissing, skipped, hadDisabled: disabledEntries.length > 0 };\n}\n\nexport interface PluginToggleState {\n plugin: string;\n marketplace?: string;\n activeSkills: string[];\n disabledSkills: string[];\n}\n\n/**\n * Groups the marketplace skills in a target directory by (marketplace, plugin) with\n * their enabled/disabled split. Feeds the interactive `marketplace toggle` picker.\n */\nexport function listPluginStates(targetDir: string): PluginToggleState[] {\n const meta = readInstalledMeta(targetDir);\n const byKey = new Map<string, PluginToggleState>();\n const bucketFor = (record: InstalledSkillRecord): PluginToggleState | null => {\n if (record.source !== 'marketplace' || !record.plugin) return null;\n const marketplaceName = record.marketplace ?? record.installedFrom;\n const key = `${marketplaceName ?? ''}\\u0000${record.plugin}`;\n let state = byKey.get(key);\n if (!state) {\n state = { plugin: record.plugin, marketplace: marketplaceName, activeSkills: [], disabledSkills: [] };\n byKey.set(key, state);\n }\n return state;\n };\n\n for (const skillName of listActiveSkillDirs(targetDir)) {\n const record = resolveSkillRecord(meta, targetDir, skillName);\n if (record) bucketFor(record)?.activeSkills.push(skillName);\n }\n for (const [skillName, record] of Object.entries(meta.disabled ?? {})) {\n bucketFor(record)?.disabledSkills.push(skillName);\n }\n return [...byKey.values()].sort((a, b) => a.plugin.localeCompare(b.plugin));\n}\n\n/**\n * Detects the currently checked-out branch name of a git repository at the given path.\n * Returns undefined if the path is not a git repo or is in detached-HEAD state.\n */\nexport function detectRepoBranch(repoPath: string): string | undefined {\n try {\n const result = execFileSync('git', ['-C', repoPath, 'rev-parse', '--abbrev-ref', 'HEAD'], {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return result && result !== 'HEAD' ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Records install provenance for one or more skills already copied into targetDir.\n * Writes to both the directory-level .pncli-installed.json index and a per-skill\n * pncli-origin.json inside each skill directory for self-contained traceability.\n * Shared by marketplace installs (source: 'marketplace') and bundled installs (source: 'bundled').\n */\nexport function recordInstalledSkills(targetDir: string, skillNames: string[], record: Omit<InstalledSkillRecord, 'installedAt'>): void {\n if (skillNames.length === 0) return;\n const meta = readInstalledMeta(targetDir);\n const now = new Date().toISOString();\n for (const skillName of skillNames) {\n const fullRecord: InstalledSkillRecord = { ...record, installedAt: now };\n meta.skills[skillName] = fullRecord;\n\n // Write per-skill origin file for self-contained provenance\n const skillDir = path.join(targetDir, skillName);\n if (fs.existsSync(skillDir)) {\n const origin: SkillOrigin = { version: 1, ...fullRecord };\n try {\n fs.writeFileSync(getSkillOriginPath(skillDir), JSON.stringify(origin, null, 2), 'utf8');\n } catch { /* non-fatal: directory-level index is the authoritative source */ }\n }\n }\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n}\n\n/**\n * Returns all registered marketplaces from the global config, merging the\n * legacy single `marketplace` field into the new `marketplaces` array.\n */\nexport function getAllMarketplaces(globalConfig: GlobalConfig): MarketplaceConfig[] {\n const result: MarketplaceConfig[] = [];\n if (Array.isArray(globalConfig.marketplaces)) {\n result.push(...globalConfig.marketplaces);\n }\n if (globalConfig.marketplace?.repoUrl) {\n const legacyUrl = globalConfig.marketplace.repoUrl;\n const alreadyPresent = result.some(m => m.repoUrl === legacyUrl);\n if (!alreadyPresent) {\n const existingNames = new Set(result.map(m => m.name).filter((n): n is string => !!n));\n let legacyName = globalConfig.marketplace.name ?? repoNameFromUrl(legacyUrl);\n if (existingNames.has(legacyName)) {\n let suffix = 2;\n while (existingNames.has(`${legacyName}-${suffix}`)) suffix++;\n legacyName = `${legacyName}-${suffix}`;\n }\n result.push({\n name: legacyName,\n repoUrl: globalConfig.marketplace.repoUrl,\n localPath: globalConfig.marketplace.localPath,\n token: globalConfig.marketplace.token,\n });\n }\n }\n return result;\n}\n\n/**\n * Saves an updated marketplaces array back to the global config, removing\n * the legacy `marketplace` field so it doesn't produce duplicate entries on next read.\n */\nfunction saveMarketplaces(configPath: string, existing: GlobalConfig, marketplaces: MarketplaceConfig[]): void {\n const updated: GlobalConfig = { ...existing, marketplaces };\n delete updated.marketplace;\n writeGlobalConfig(updated, configPath);\n}\n\n/**\n * Reads the global config and all registered marketplaces. If the legacy single-marketplace\n * field is still present, persists the migration immediately so every pncli upgrade transitions\n * seamlessly to the multi-marketplace format without the user re-running `marketplace add`.\n * Returns the (post-migration) config object so callers can reuse it for further writes.\n */\nfunction loadMarketplacesConfig(configPath: string): { existing: GlobalConfig; all: MarketplaceConfig[] } {\n const existing: GlobalConfig = loadJsonFile<GlobalConfig>(configPath) ?? {};\n const all = getAllMarketplaces(existing);\n if (existing.marketplace?.repoUrl) {\n saveMarketplaces(configPath, existing, all);\n warn('Migrated legacy single-marketplace config to the multi-marketplace format.');\n delete existing.marketplace;\n }\n return { existing, all };\n}\n\nfunction loadMarketplaces(configPath: string): MarketplaceConfig[] {\n return loadMarketplacesConfig(configPath).all;\n}\n\n/**\n * Adds or updates a marketplace entry in-place, refusing to silently clobber an unrelated\n * marketplace when its name or repo URL collides with an existing entry's identity.\n */\nexport function upsertMarketplace(all: MarketplaceConfig[], entry: MarketplaceConfig): void {\n const idxByUrl = all.findIndex(m => m.repoUrl === entry.repoUrl);\n const idxByName = all.findIndex(m => m.name === entry.name);\n if (idxByUrl !== -1) {\n if (idxByName !== -1 && idxByName !== idxByUrl) {\n throw new Error(`Marketplace name \"${entry.name}\" is already used by a different marketplace (${all[idxByName].repoUrl}). Choose a different --name.`);\n }\n // Re-running `add` without --token shouldn't silently wipe a previously stored token.\n all[idxByUrl] = { ...entry, token: entry.token ?? all[idxByUrl].token };\n } else if (idxByName !== -1) {\n throw new Error(`Marketplace name \"${entry.name}\" is already registered for a different repo (${all[idxByName].repoUrl}). Choose a different --name, or remove the existing marketplace first.`);\n } else {\n all.push(entry);\n }\n}\n\n/**\n * Clones (or re-clones) a marketplace repo to disk. Handles the Windows + Git Credential\n * Manager case where git writes auth warnings to stderr and exits non-zero even though the\n * clone succeeded — verified by checking that `git rev-parse HEAD` resolves at the destination.\n */\nfunction cloneOrReuseMarketplace(url: string, resolvedPath: string, opts: { branch?: string; token?: string }): void {\n const hasGit = fs.existsSync(path.join(resolvedPath, '.git'));\n if (fs.existsSync(resolvedPath) && !hasGit && fs.readdirSync(resolvedPath).length > 0) {\n throw new Error(`Directory already exists and is not a git repo: ${resolvedPath}`);\n }\n if (hasGit) {\n warn(`Directory already contains a git repo at ${resolvedPath} — skipping clone, updating config and re-installing plugins.`);\n return;\n }\n\n const branchLabel = opts.branch ?? 'remote default';\n warn(`Cloning ${url} (branch: ${branchLabel}) → ${resolvedPath}...`);\n const cloneUrl = opts.token ? injectTokenIntoUrl(url, opts.token) : url;\n const cloneArgs = ['clone'];\n if (opts.branch) cloneArgs.push('--branch', opts.branch);\n cloneArgs.push(cloneUrl, resolvedPath);\n try {\n execFileSync('git', cloneArgs, { stdio: ['inherit', 'inherit', 'pipe'] });\n } catch (e: unknown) {\n let cloneActuallySucceeded = false;\n try {\n execFileSync('git', ['-C', resolvedPath, 'rev-parse', 'HEAD'], { stdio: 'pipe' });\n cloneActuallySucceeded = true;\n } catch { /* repo not valid — fall through and re-throw original error */ }\n if (!cloneActuallySucceeded) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(scrubToken(msg));\n }\n }\n}\n\n/**\n * Pulls the latest content for a marketplace repo. Returns whether the pull brought in new changes.\n */\nfunction pullMarketplace(marketplacePath: string, repoUrl: string | undefined, token: string | undefined, marketplaceName: string): { updated: boolean } {\n warn(`Pulling latest content for \"${marketplaceName}\"...`);\n const gitArgs = ['-C', marketplacePath];\n if (repoUrl && token) {\n gitArgs.push('-c', `remote.origin.url=${injectTokenIntoUrl(repoUrl, token)}`);\n }\n gitArgs.push('pull');\n let pullOutput: string;\n try {\n pullOutput = execFileSync('git', gitArgs, { encoding: 'utf8', stdio: ['inherit', 'pipe', 'pipe'], env: { ...process.env, LANG: 'C', LC_ALL: 'C' } });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(scrubToken(msg));\n }\n const updated = !pullOutput.includes('Already up to date');\n if (pullOutput.trim() && updated) warn(pullOutput.trim());\n warn(updated ? `\"${marketplaceName}\" updated.` : `\"${marketplaceName}\" already up to date — no changes to sync.`);\n return { updated };\n}\n\n/**\n * Installs the given plugin names from a marketplace into targetDir, recording provenance.\n */\nfunction installPluginsForMarketplace(\n marketplacePath: string,\n marketplaceName: string,\n repoUrl: string | undefined,\n pluginNames: string[],\n targetDir: string\n): { results: Record<string, { installed: string[]; failed: string[] }>; totalInstalled: number } {\n const results: Record<string, { installed: string[]; failed: string[] }> = {};\n let totalInstalled = 0;\n\n const branch = detectRepoBranch(marketplacePath);\n\n for (const pluginName of pluginNames) {\n const skillsSrc = resolveSkillsSrc(marketplacePath, pluginName);\n if (!fs.existsSync(skillsSrc)) {\n results[pluginName] = { installed: [], failed: [] };\n warn(`No skills directory found for plugin \"${pluginName}\" in \"${marketplaceName}\" — skipping.`);\n continue;\n }\n const { installed, failed } = copyPluginSkills(skillsSrc, targetDir, {\n marketplace: marketplaceName,\n plugin: pluginName,\n installedFrom: repoUrl ?? '',\n branch,\n });\n results[pluginName] = { installed, failed };\n totalInstalled += installed.length;\n for (const skill of installed) {\n warn(` ${skill}: ${path.join(skillsSrc, skill)} → ${path.join(targetDir, skill)}`);\n }\n if (failed.length > 0) {\n warn(`Skipped ${failed.length} skill(s) with invalid names in \"${pluginName}\": ${failed.join(', ')}`);\n }\n }\n\n return { results, totalInstalled };\n}\n\n/**\n * Installs every plugin from a freshly cloned marketplace (used by `marketplace add`/`setup`).\n */\nfunction installAllPlugins(resolvedPath: string, marketplaceName: string, url: string, targetDir: string): { pluginResults: Record<string, { installed: string[]; failed: string[] }>; totalInstalled: number } {\n const pluginChoices = resolvePluginChoices(resolvedPath);\n if (pluginChoices.length === 0) {\n warn('No plugins found in marketplace. Check the marketplace repository structure.');\n return { pluginResults: {}, totalInstalled: 0 };\n }\n warn(`Installing ${pluginChoices.length} plugin(s) to ${targetDir}...`);\n const { results, totalInstalled } = installPluginsForMarketplace(resolvedPath, marketplaceName, url, pluginChoices.map(p => p.name), targetDir);\n return { pluginResults: results, totalInstalled };\n}\n\n/**\n * Pulls and installs plugins for one marketplace, honoring an optional plugin name filter\n * (\"all\" installs every plugin). Used by the \"sync every marketplace\" flows. Never throws —\n * problems are reported back as a `skipped` result so one bad marketplace doesn't abort the rest.\n */\nfunction syncMarketplacePlugins(m: MarketplaceConfig, targetDir: string, force: boolean, pluginFilter: string): Record<string, unknown> {\n const marketplaceName = marketplaceLabel(m);\n try {\n const marketplacePath = m.localPath;\n if (!marketplacePath || !fs.existsSync(marketplacePath)) {\n warn(`Marketplace \"${marketplaceName}\" local path not found — skipping.`);\n return { marketplace: marketplaceName, skipped: true, message: 'Local path not found.' };\n }\n\n const { updated } = pullMarketplace(marketplacePath, m.repoUrl, m.token, marketplaceName);\n if (!updated && !force) {\n return { marketplace: marketplaceName, marketplaceUpdated: false, skipped: true, message: 'No changes detected — skipping install. Use --force to reinstall anyway.' };\n }\n\n const pluginChoices = resolvePluginChoices(marketplacePath);\n if (pluginChoices.length === 0) {\n warn(`No plugins found in marketplace \"${marketplaceName}\" — skipping.`);\n return { marketplace: marketplaceName, skipped: true, message: 'No plugins found.' };\n }\n\n let pluginNames: string[];\n if (pluginFilter === 'all') {\n pluginNames = pluginChoices.map(p => p.name);\n } else if (pluginChoices.some(p => p.name === pluginFilter)) {\n pluginNames = [pluginFilter];\n } else {\n warn(`Plugin \"${pluginFilter}\" not found in \"${marketplaceName}\" — skipping.`);\n return { marketplace: marketplaceName, skipped: true, message: `Plugin \"${pluginFilter}\" not found.` };\n }\n\n const { results, totalInstalled } = installPluginsForMarketplace(marketplacePath, marketplaceName, m.repoUrl, pluginNames, targetDir);\n return { marketplace: marketplaceName, plugins: results, total: totalInstalled, marketplaceUpdated: updated };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n warn(`Marketplace \"${marketplaceName}\" failed — skipping. ${message}`);\n return { marketplace: marketplaceName, skipped: true, error: message };\n }\n}\n\ninterface MarketplaceAddOptions {\n name?: string;\n branch?: string;\n token?: string;\n agent?: string;\n claude?: boolean;\n}\n\n/**\n * Core of `marketplace add`: clones/registers the marketplace and installs all of its\n * plugins. Shared by the `add`/`setup` commands and the interactive `manage` hub.\n * Throws on failure; the callers wrap it in success/fail output.\n */\nfunction performMarketplaceAdd(url: string, localPath: string | undefined, opts: MarketplaceAddOptions): Record<string, unknown> {\n const resolvedPath = path.resolve(localPath ?? defaultMarketplacePath(url));\n const marketplaceName = opts.name ?? repoNameFromUrl(url);\n\n cloneOrReuseMarketplace(url, resolvedPath, opts);\n\n const configPath = getGlobalConfigPath();\n const { existing, all } = loadMarketplacesConfig(configPath);\n const entry: MarketplaceConfig = {\n name: marketplaceName,\n repoUrl: url,\n localPath: resolvedPath,\n ...(opts.token ? { token: opts.token } : {}),\n };\n upsertMarketplace(all, entry);\n saveMarketplaces(configPath, existing, all);\n\n const targetDir = resolveAgentPaths(resolveAgentName(opts)).user;\n\n const { pluginResults, totalInstalled } = installAllPlugins(resolvedPath, marketplaceName, url, targetDir);\n\n return {\n name: marketplaceName,\n repoUrl: url,\n localPath: resolvedPath,\n branch: opts.branch ?? null,\n tokenConfigured: !!opts.token,\n plugins: pluginResults,\n total: totalInstalled,\n target: targetDir,\n };\n}\n\n/**\n * Core of `marketplace remove`: unregisters a marketplace from the global config\n * (does not delete the local clone). Shared by the `remove` command and the\n * interactive `manage` hub. Throws when the marketplace is not found.\n */\nfunction performMarketplaceRemove(name: string): Record<string, unknown> {\n const configPath = getGlobalConfigPath();\n const { existing, all } = loadMarketplacesConfig(configPath);\n\n const idx = all.findIndex(m => m.name === name || m.repoUrl === name);\n if (idx === -1) {\n throw new Error(`Marketplace \"${name}\" not found. Run: pncli skills marketplace list`);\n }\n\n const removed = all.splice(idx, 1)[0];\n saveMarketplaces(configPath, existing, all);\n\n return {\n removed: {\n name: marketplaceLabel(removed),\n repoUrl: removed.repoUrl,\n localPath: removed.localPath,\n },\n remaining: all.length,\n };\n}\n\n/**\n * Shared implementation for `marketplace add` and `marketplace setup` (kept as a backward-compatible\n * alias) — clones/registers the marketplace and installs all of its plugins.\n */\nasync function marketplaceAddAction(url: string, localPath: string | undefined, opts: MarketplaceAddOptions, commandName: 'marketplace-add' | 'marketplace-setup'): Promise<void> {\n const start = Date.now();\n try {\n success(performMarketplaceAdd(url, localPath, opts), 'skills', commandName, start);\n } catch (err) {\n fail(err, 'skills', commandName, start);\n }\n}\n\nexport function registerSkillsCommands(program: Command): void {\n const skills = program.command('skills').description('Manage pncli Claude Code skills');\n\n skills\n .command('install')\n .description('Install pncli skills into the current repo')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override install directory (ignores --agent and --scope)')\n\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(opts.agent);\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n const resolvedTarget = path.resolve(targetDir);\n const bundledDir = getBundledSkillsDir();\n let skillDirs: string[] = [];\n\n if (bundledDir !== '') {\n try {\n skillDirs = fs.readdirSync(bundledDir).filter(name =>\n fs.existsSync(path.join(bundledDir, name, 'SKILL.md'))\n );\n } catch { /* bundledDir not readable */ }\n }\n\n if (skillDirs.length === 0) {\n throw new Error('No bundled skills found. Reinstall pncli to get the latest version: npm install -g @kolatts/pncli');\n }\n\n const installed: string[] = [];\n const failed: string[] = [];\n\n // Remove only pncli-managed skills (not user-created ones)\n for (const skillName of skillDirs) {\n const existingDir = path.resolve(targetDir, skillName);\n if (!existingDir.startsWith(resolvedTarget + path.sep)) continue;\n if (fs.existsSync(existingDir)) {\n fs.rmSync(existingDir, { recursive: true, force: true });\n }\n }\n\n warn(`Installing ${skillDirs.length} bundled skill(s) to ${targetDir}...`);\n\n for (const skillName of skillDirs) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) {\n failed.push(skillName);\n continue;\n }\n\n try {\n const mdFiles = fs.readdirSync(path.join(bundledDir, skillName))\n .filter(f => f.endsWith('.md'));\n fs.mkdirSync(skillDir, { recursive: true });\n for (const mdFile of mdFiles) {\n const content = fs.readFileSync(path.join(bundledDir, skillName, mdFile), 'utf8');\n fs.writeFileSync(path.join(skillDir, mdFile), content, 'utf8');\n }\n installed.push(skillName);\n } catch {\n failed.push(skillName);\n }\n }\n\n warn(`Installed ${installed.length} skill(s) to ${targetDir}`);\n if (failed.length > 0) {\n warn(`Failed to install: ${failed.join(', ')}`);\n }\n\n recordInstalledSkills(targetDir, installed, { source: 'bundled' });\n\n success({\n installed,\n failed,\n target: targetDir,\n total: installed.length,\n agent: opts.target ? 'custom' : opts.agent,\n scope: opts.target ? 'custom' : opts.scope,\n source: 'bundled',\n }, 'skills', 'install', start);\n } catch (err) {\n fail(err, 'skills', 'install', start);\n }\n });\n\n skills\n .command('list')\n .description('List locally installed skills')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope: project | user', 'project')\n .option('--target <dir>', 'Override skills directory to scan')\n .action((opts: { agent: string; scope: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(opts.agent);\n const scopePath = opts.scope === 'user' ? agentConfig.user : agentConfig.project;\n targetDir = path.resolve(scopePath);\n }\n\n if (!fs.existsSync(targetDir)) {\n success({ skills: [], message: `No skills directory found at ${targetDir}. Run: pncli skills install` }, 'skills', 'list', start);\n return;\n }\n\n const meta = readInstalledMeta(targetDir);\n\n const skillDirs = fs.readdirSync(targetDir).filter(name => {\n if (name.startsWith('.')) return false;\n const skillPath = path.join(targetDir, name, 'SKILL.md');\n return fs.existsSync(skillPath);\n });\n\n const skillsList = skillDirs.map(name => {\n const content = fs.readFileSync(path.join(targetDir, name, 'SKILL.md'), 'utf8');\n const frontmatter = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n const data: Record<string, string> = {};\n const metadata: Record<string, string> = {};\n if (frontmatter) {\n let inMetadata = false;\n for (const line of frontmatter[1].split('\\n')) {\n if (line.trimEnd() === 'metadata:') { inMetadata = true; continue; }\n if (inMetadata && line.startsWith(' ')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx !== -1) {\n metadata[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n continue;\n }\n inMetadata = false;\n const colonIdx = line.indexOf(':');\n if (colonIdx === -1) continue;\n data[line.slice(0, colonIdx).trim()] = line.slice(colonIdx + 1).trim();\n }\n }\n return {\n name: data.name || name,\n slug: name,\n category: metadata.category || data.category || 'other',\n services: metadata.services || data.services || '',\n providers: metadata.providers || data.providers || 'none',\n userInvocable: data['user-invocable'] === 'true',\n installed: meta.skills[name] ?? null,\n };\n });\n\n success({ skills: skillsList, total: skillsList.length }, 'skills', 'list', start);\n } catch (err) {\n fail(err, 'skills', 'list', start);\n }\n });\n\n skills\n .command('uninstall')\n .description('Uninstall a skill (defaults to user scope, matching the marketplace install target; pass --scope project for skills installed via `skills install`)')\n .argument('<name>', 'Skill name to uninstall (the directory name under your skills folder)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code', 'github-copilot')\n .option('--scope <scope>', 'Installation scope to uninstall from: project | user', 'user')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--target <dir>', 'Override skills directory')\n .action((name: string, opts: { agent?: string; scope?: string; claude?: boolean; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(resolveAgentName(opts));\n const scopePath = opts.scope === 'project' ? agentConfig.project : agentConfig.user;\n targetDir = path.resolve(scopePath);\n }\n\n const resolvedTarget = path.resolve(targetDir);\n const skillDir = path.resolve(targetDir, name);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) {\n throw new Error(`Invalid skill name: \"${name}\"`);\n }\n\n if (!fs.existsSync(skillDir)) {\n throw new Error(`Skill \"${name}\" not found at ${skillDir}`);\n }\n\n const meta = readInstalledMeta(targetDir);\n const record = meta.skills[name];\n\n fs.rmSync(skillDir, { recursive: true, force: true });\n\n delete meta.skills[name];\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n\n success({\n uninstalled: name,\n target: targetDir,\n wasTracked: !!record,\n ...(record ? { installedFrom: record } : {}),\n }, 'skills', 'uninstall', start);\n } catch (err) {\n fail(err, 'skills', 'uninstall', start);\n }\n });\n\n const marketplace = skills.command('marketplace').description('Manage git-hosted skills marketplaces');\n\n function withMarketplaceAddOptions(cmd: Command): Command {\n return cmd\n .argument('<url>', 'Git clone URL of the marketplace repository')\n .argument('[localPath]', 'Local directory to clone into (default: ~/.agents/marketplaces/<repo-name>)')\n .option('--name <name>', 'Human-readable name for this marketplace (default: derived from URL)')\n .option('--branch <branch>', 'Branch to clone (default: remote HEAD)')\n .option('--token <token>', 'HTTP access token for authenticated clone and pull (GitHub PAT or Bitbucket token)')\n .option('--agent <agent>', 'Target agent host for plugin install: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code');\n }\n\n withMarketplaceAddOptions(\n marketplace.command('add').description('Register a new marketplace, clone it, and install all its plugins')\n ).action((url: string, localPath: string | undefined, opts: MarketplaceAddOptions) => marketplaceAddAction(url, localPath, opts, 'marketplace-add'));\n\n // Kept as an alias for `add` for backward compatibility with existing scripts/docs.\n withMarketplaceAddOptions(\n marketplace.command('setup').description('Alias for `marketplace add` — clone a marketplace and install all its plugins')\n ).action((url: string, localPath: string | undefined, opts: MarketplaceAddOptions) => marketplaceAddAction(url, localPath, opts, 'marketplace-setup'));\n\n marketplace\n .command('list')\n .description('List all registered marketplaces')\n .action(() => {\n const start = Date.now();\n try {\n const configPath = getGlobalConfigPath();\n const all = loadMarketplaces(configPath);\n\n success({\n marketplaces: all.map(m => ({\n name: marketplaceLabel(m),\n repoUrl: m.repoUrl,\n localPath: m.localPath,\n tokenConfigured: !!m.token,\n })),\n total: all.length,\n }, 'skills', 'marketplace-list', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-list', start);\n }\n });\n\n marketplace\n .command('plugins')\n .description('List the plugins available in a registered marketplace')\n .argument('<name>', 'Marketplace name (or repo URL) to inspect')\n .action((name: string) => {\n const start = Date.now();\n try {\n const configPath = getGlobalConfigPath();\n const all = loadMarketplaces(configPath);\n const found = all.find(m => m.name === name || m.repoUrl === name);\n if (!found) {\n throw new Error(`Marketplace \"${name}\" not found. Run: pncli skills marketplace list`);\n }\n if (!found.localPath || !fs.existsSync(found.localPath)) {\n throw new Error(`Marketplace \"${marketplaceLabel(found)}\" local path not found at ${found.localPath ?? '(not set)'}. Run: pncli skills marketplace add <url>`);\n }\n\n const plugins = resolvePluginChoices(found.localPath);\n success({\n marketplace: marketplaceLabel(found),\n plugins,\n total: plugins.length,\n }, 'skills', 'marketplace-plugins', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-plugins', start);\n }\n });\n\n marketplace\n .command('remove')\n .description('Remove a registered marketplace from the config (does not delete the local clone)')\n .argument('<name>', 'Name of the marketplace to remove')\n .action((name: string) => {\n const start = Date.now();\n try {\n success(performMarketplaceRemove(name), 'skills', 'marketplace-remove', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-remove', start);\n }\n });\n\n marketplace\n .command('sync')\n .description('Pull latest marketplace content and install plugin skills (interactive picker when no plugin is given)')\n .argument('[plugin]', 'Plugin name to install, or \"all\" to install every plugin (skips interactive selection)')\n .option('--marketplace <name>', 'Marketplace name to sync, or \"all\" to sync every registered marketplace (skips interactive selection)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--force', 'Reinstall even if a marketplace has no new changes (applies to single-plugin and \"all\" installs alike)')\n .action(async (plugin: string | undefined, opts: { marketplace?: string; agent?: string; claude?: boolean; force?: boolean }) => {\n const start = Date.now();\n try {\n const configPath = getGlobalConfigPath();\n const allMarketplaces = loadMarketplaces(configPath);\n if (allMarketplaces.length === 0) {\n throw new Error('No marketplaces configured. Run: pncli skills marketplace add <url>');\n }\n\n const targetDir = resolveAgentPaths(resolveAgentName(opts)).user;\n const force = opts.force ?? false;\n\n // Non-interactive \"sync everything\" — explicit flag.\n if (opts.marketplace === 'all') {\n const results = allMarketplaces.map(m => syncMarketplacePlugins(m, targetDir, force, plugin ?? 'all'));\n success({ allMarketplaces: true, marketplaces: results, target: targetDir }, 'skills', 'marketplace-sync', start);\n return;\n }\n\n let selectedMarketplace: MarketplaceConfig | undefined;\n let selectedPlugin: string | undefined = plugin;\n const canGoBack = !opts.marketplace && allMarketplaces.length > 1;\n\n if (opts.marketplace) {\n const found = allMarketplaces.find(m => m.name === opts.marketplace || m.repoUrl === opts.marketplace);\n if (!found) {\n throw new Error(`Marketplace \"${opts.marketplace}\" not found. Run: pncli skills marketplace list`);\n }\n selectedMarketplace = found;\n } else if (allMarketplaces.length === 1) {\n selectedMarketplace = allMarketplaces[0];\n }\n\n // Interactive loop: lets the user back out of a plugin prompt and reselect the marketplace.\n for (;;) {\n if (!selectedMarketplace) {\n assertInteractive(`Multiple marketplaces are registered (${allMarketplaces.map(marketplaceLabel).join(', ')}). Pass --marketplace <name> (or --marketplace all) to run this non-interactively.`);\n const chosen = await select({\n message: 'Select a marketplace to sync:',\n choices: [\n { value: ALL_MARKETPLACES, name: 'All marketplaces — sync every plugin from every marketplace' },\n // Index-based values: labels alone aren't guaranteed unique (two marketplaces can share a derived name).\n ...allMarketplaces.map((m, i) => ({ value: String(i), name: `${marketplaceLabel(m)} — ${m.repoUrl ?? ''}` })),\n ],\n });\n if (chosen === ALL_MARKETPLACES) {\n const results = allMarketplaces.map(m => syncMarketplacePlugins(m, targetDir, force, selectedPlugin ?? 'all'));\n success({ allMarketplaces: true, marketplaces: results, target: targetDir }, 'skills', 'marketplace-sync', start);\n return;\n }\n selectedMarketplace = allMarketplaces[Number(chosen)];\n if (!selectedMarketplace) {\n throw new Error(`Marketplace \"${chosen}\" not found.`);\n }\n }\n\n const marketplaceName = marketplaceLabel(selectedMarketplace);\n const marketplacePath = selectedMarketplace.localPath;\n if (!marketplacePath || !fs.existsSync(marketplacePath)) {\n throw new Error(`Marketplace \"${marketplaceName}\" local path not found at ${marketplacePath ?? '(not set)'}. Run: pncli skills marketplace add <url>`);\n }\n\n const { updated } = pullMarketplace(marketplacePath, selectedMarketplace.repoUrl, selectedMarketplace.token, marketplaceName);\n\n const pluginChoices = resolvePluginChoices(marketplacePath);\n if (pluginChoices.length === 0) {\n throw new Error(`No plugins found in marketplace \"${marketplaceName}\". Check the marketplace repository structure.`);\n }\n\n if (!selectedPlugin) {\n assertInteractive(`Pass a plugin name (or \"all\") to run this non-interactively.`);\n const choices: { value: string; name: string }[] = [\n { value: 'all', name: 'All — install every plugin' },\n ...pluginChoices.map(p => ({ value: p.name, name: p.description ? `${p.name} — ${p.description}` : p.name })),\n ];\n if (canGoBack) {\n choices.push({ value: BACK, name: '← Back to marketplace selection' });\n }\n const chosen = await select({ message: `Select a plugin from \"${marketplaceName}\" to install:`, choices });\n if (chosen === BACK) {\n selectedMarketplace = undefined;\n continue;\n }\n selectedPlugin = chosen;\n } else if (selectedPlugin !== 'all' && !pluginChoices.some(p => p.name === selectedPlugin)) {\n throw new Error(`Plugin \"${selectedPlugin}\" not found in \"${marketplaceName}\". Available: ${pluginChoices.map(p => p.name).join(', ')}`);\n }\n\n if (!updated && !force) {\n success({\n marketplace: marketplaceName,\n marketplaceUpdated: false,\n updated: false,\n skipped: true,\n message: `No changes detected in \"${marketplaceName}\" — skipping install. Use --force to reinstall anyway.`,\n }, 'skills', 'marketplace-sync', start);\n return;\n }\n\n const pluginNames = selectedPlugin === 'all' ? pluginChoices.map(p => p.name) : [selectedPlugin];\n const { results, totalInstalled } = installPluginsForMarketplace(marketplacePath, marketplaceName, selectedMarketplace.repoUrl, pluginNames, targetDir);\n\n if (selectedPlugin === 'all') {\n success({ marketplace: marketplaceName, plugins: results, total: totalInstalled, target: targetDir, marketplaceUpdated: updated }, 'skills', 'marketplace-sync', start);\n } else {\n const single = results[selectedPlugin] ?? { installed: [], failed: [] };\n success({\n marketplace: marketplaceName,\n plugin: selectedPlugin,\n installed: single.installed,\n failed: single.failed,\n total: single.installed.length,\n target: targetDir,\n marketplaceUpdated: updated,\n }, 'skills', 'marketplace-sync', start);\n }\n return;\n }\n } catch (err) {\n fail(err, 'skills', 'marketplace-sync', start);\n }\n });\n\n marketplace\n .command('purge-plugin')\n .description('Remove all skills installed from a specific plugin (or all plugins in a marketplace)')\n .argument('<plugin>', 'Plugin name to purge, or \"all\" to remove every skill from the marketplace')\n .option('--marketplace <name>', 'Restrict purge to skills from this marketplace (by name or repo URL)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action((plugin: string, opts: { marketplace?: string; agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n let targetDir: string;\n if (opts.target) {\n targetDir = path.resolve(opts.target);\n } else {\n const agentConfig = resolveAgentPaths(resolveAgentName(opts));\n const scopePath = (opts.scope ?? 'user') === 'project' ? agentConfig.project : agentConfig.user;\n targetDir = path.resolve(scopePath);\n }\n const resolvedTarget = path.resolve(targetDir);\n\n if (!fs.existsSync(targetDir)) {\n success({ removed: [], total: 0, target: targetDir, message: 'No skills directory found.' }, 'skills', 'marketplace-purge-plugin', start);\n return;\n }\n\n const meta = readInstalledMeta(targetDir);\n const removed: string[] = [];\n const skipped: string[] = [];\n\n const skillDirs = fs.readdirSync(targetDir).filter(name => {\n if (name.startsWith('.')) return false;\n const p = path.join(targetDir, name);\n try { return fs.statSync(p).isDirectory(); } catch { return false; }\n });\n\n for (const skillName of skillDirs) {\n const skillDir = path.resolve(targetDir, skillName);\n if (!skillDir.startsWith(resolvedTarget + path.sep)) continue;\n\n // Resolve provenance: prefer directory-level index, fall back to per-skill origin file.\n let record: InstalledSkillRecord | null = meta.skills[skillName] ?? null;\n if (!record) {\n const perSkill = readSkillOrigin(skillDir);\n if (perSkill) {\n record = {\n source: perSkill.source,\n marketplace: perSkill.marketplace,\n plugin: perSkill.plugin,\n installedFrom: perSkill.installedFrom,\n branch: perSkill.branch,\n installedAt: perSkill.installedAt,\n };\n }\n }\n\n if (!record || record.source !== 'marketplace') {\n skipped.push(skillName);\n continue;\n }\n\n const matchesMarketplace = !opts.marketplace ||\n record.marketplace === opts.marketplace ||\n record.installedFrom === opts.marketplace;\n const matchesPlugin = plugin === 'all' || record.plugin === plugin;\n\n if (!matchesMarketplace || !matchesPlugin) {\n skipped.push(skillName);\n continue;\n }\n\n fs.rmSync(skillDir, { recursive: true, force: true });\n delete meta.skills[skillName];\n removed.push(skillName);\n }\n\n if (removed.length > 0) {\n fs.writeFileSync(getInstalledMetaPath(targetDir), JSON.stringify(meta, null, 2), 'utf8');\n }\n\n success({\n removed,\n skipped: skipped.length,\n total: removed.length,\n target: targetDir,\n plugin,\n ...(opts.marketplace ? { marketplace: opts.marketplace } : {}),\n }, 'skills', 'marketplace-purge-plugin', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-purge-plugin', start);\n }\n });\n\n marketplace\n .command('disable')\n .description('Temporarily deactivate a plugin\\'s skills without deleting them (re-enable with `marketplace enable`)')\n .argument('<plugin>', 'Plugin name to disable')\n .option('--marketplace <name>', 'Restrict to skills from this marketplace (by name or repo URL)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action((plugin: string, opts: { marketplace?: string; agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n const targetDir = resolveTargetDir(opts);\n if (!fs.existsSync(targetDir)) {\n success({ disabled: [], total: 0, target: targetDir, message: 'No skills directory found.' }, 'skills', 'marketplace-disable', start);\n return;\n }\n\n const result = disablePluginSkills(targetDir, plugin, opts.marketplace);\n success({\n disabled: result.disabled,\n alreadyDisabled: result.alreadyDisabled,\n skipped: result.skipped.length,\n total: result.disabled.length,\n target: targetDir,\n plugin,\n stash: path.join(targetDir, DISABLED_SUBDIR),\n ...(opts.marketplace ? { marketplace: opts.marketplace } : {}),\n }, 'skills', 'marketplace-disable', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-disable', start);\n }\n });\n\n marketplace\n .command('enable')\n .description('Re-activate a previously disabled plugin\\'s skills')\n .argument('<plugin>', 'Plugin name to enable')\n .option('--marketplace <name>', 'Restrict to skills from this marketplace (by name or repo URL)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action((plugin: string, opts: { marketplace?: string; agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n const targetDir = resolveTargetDir(opts);\n if (!fs.existsSync(targetDir)) {\n success({ enabled: [], total: 0, target: targetDir, message: 'No skills directory found.' }, 'skills', 'marketplace-enable', start);\n return;\n }\n\n const result = enablePluginSkills(targetDir, plugin, opts.marketplace);\n if (!result.hadDisabled) {\n success({ enabled: [], total: 0, target: targetDir, plugin, message: `No disabled skills found for plugin \"${plugin}\".` }, 'skills', 'marketplace-enable', start);\n return;\n }\n\n success({\n enabled: result.enabled,\n skipped: result.skipped.length,\n total: result.enabled.length,\n target: targetDir,\n plugin,\n ...(result.stashMissing.length > 0 ? {\n stashMissing: result.stashMissing,\n warning: `Skills marked disabled but missing from the stash were left as-is. Re-install the plugin (pncli skills marketplace sync ${plugin}) to restore them.`,\n } : {}),\n ...(opts.marketplace ? { marketplace: opts.marketplace } : {}),\n }, 'skills', 'marketplace-enable', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-enable', start);\n }\n });\n\n marketplace\n .command('manage')\n .description('Manage marketplaces and plugins: toggle plugins on/off, add or remove marketplaces (interactive)')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--scope <scope>', 'Installation scope: project | user (default: user)')\n .option('--target <dir>', 'Override skills directory')\n .action(async (opts: { agent?: string; claude?: boolean; scope?: string; target?: string }) => {\n const start = Date.now();\n try {\n assertInteractive('Use `pncli skills marketplace enable|disable <plugin>`, `add <url>`, and `remove <name>` to manage non-interactively.');\n const targetDir = resolveTargetDir(opts);\n\n interface PluginChange { plugin: string; marketplace?: string; skills: string[] }\n const enabledPlugins: PluginChange[] = [];\n const disabledPlugins: PluginChange[] = [];\n const stashMissing: string[] = [];\n const addedMarketplaces: Record<string, unknown>[] = [];\n const removedMarketplaces: Record<string, unknown>[] = [];\n\n // Hub loop: each pass re-reads config and the skills dir so the menu reflects\n // whatever the previous action changed.\n for (;;) {\n const states = fs.existsSync(targetDir) ? listPluginStates(targetDir) : [];\n const registered = loadMarketplaces(getGlobalConfigPath());\n\n const action = await select({\n message: `Manage skills marketplaces (target: ${targetDir}):`,\n choices: [\n ...(states.length > 0 ? [{ value: 'toggle', name: `Toggle plugins on/off (${states.length} installed)` }] : []),\n { value: 'add', name: 'Add a marketplace' },\n ...(registered.length > 0 ? [{ value: 'remove', name: `Remove a marketplace (${registered.length} registered)` }] : []),\n { value: 'done', name: 'Done' },\n ],\n });\n if (action === 'done') break;\n\n if (action === 'toggle') {\n // Group the checkbox list by marketplace with separator headers.\n const sorted = [...states].sort((a, b) =>\n (a.marketplace ?? '').localeCompare(b.marketplace ?? '') || a.plugin.localeCompare(b.plugin));\n const choices: (Separator | { name: string; value: number; checked: boolean })[] = [];\n let lastMarketplace: string | null = null;\n sorted.forEach((state, index) => {\n const marketplaceName = state.marketplace ?? '(unknown marketplace)';\n if (marketplaceName !== lastMarketplace) {\n choices.push(new Separator(`── ${marketplaceName} ──`));\n lastMarketplace = marketplaceName;\n }\n const active = state.activeSkills.length;\n const stashed = state.disabledSkills.length;\n const skillCount =\n stashed === 0 ? `${active} skill${active === 1 ? '' : 's'}` :\n active === 0 ? `${stashed} skill${stashed === 1 ? '' : 's'}, disabled` :\n `${active} active, ${stashed} disabled`;\n choices.push({ name: `${state.plugin} (${skillCount})`, value: index, checked: active > 0 });\n });\n\n const checkedIndexes = await checkbox<number>({\n message: 'Toggle plugins (space toggles, enter applies):',\n choices,\n pageSize: 15,\n });\n const wanted = new Set(checkedIndexes);\n\n sorted.forEach((state, index) => {\n if (wanted.has(index)) {\n // Desired state: enabled. Restore any stashed skills (no-op when fully active).\n if (state.disabledSkills.length === 0) return;\n const result = enablePluginSkills(targetDir, state.plugin, state.marketplace);\n stashMissing.push(...result.stashMissing);\n if (result.enabled.length > 0) {\n enabledPlugins.push({ plugin: state.plugin, marketplace: state.marketplace, skills: result.enabled });\n }\n } else {\n // Desired state: disabled. Stash any active skills (no-op when fully stashed).\n if (state.activeSkills.length === 0) return;\n const result = disablePluginSkills(targetDir, state.plugin, state.marketplace);\n if (result.disabled.length > 0) {\n disabledPlugins.push({ plugin: state.plugin, marketplace: state.marketplace, skills: result.disabled });\n }\n }\n });\n } else if (action === 'add') {\n const url = (await input({\n message: 'Git clone URL of the marketplace repository:',\n validate: v => v.trim().length > 0 || 'URL is required',\n })).trim();\n const name = (await input({\n message: 'Marketplace name:',\n default: repoNameFromUrl(url),\n })).trim();\n addedMarketplaces.push(performMarketplaceAdd(url, undefined, {\n name: name || undefined,\n agent: opts.agent,\n claude: opts.claude,\n }));\n } else if (action === 'remove') {\n const chosen = await select({\n message: 'Remove which marketplace? (the local clone is kept on disk)',\n choices: [\n // Index-based values: labels alone aren't guaranteed unique (two marketplaces can share a derived name).\n ...registered.map((m, i) => ({ value: String(i), name: `${marketplaceLabel(m)} — ${m.repoUrl ?? ''}` })),\n { value: BACK, name: '← Back' },\n ],\n });\n if (chosen === BACK) continue;\n const target = registered[Number(chosen)];\n removedMarketplaces.push(performMarketplaceRemove(target.repoUrl ?? marketplaceLabel(target)));\n }\n }\n\n success({\n enabled: enabledPlugins,\n disabled: disabledPlugins,\n addedMarketplaces,\n removedMarketplaces,\n target: targetDir,\n ...(stashMissing.length > 0 ? {\n stashMissing,\n warning: 'Skills marked disabled but missing from the stash were left as-is. Re-install their plugin (pncli skills marketplace sync <plugin>) to restore them.',\n } : {}),\n }, 'skills', 'marketplace-manage', start);\n } catch (err) {\n fail(err, 'skills', 'marketplace-manage', start);\n }\n });\n\n skills\n .command('purge-user')\n .description('Remove all skills from the user-level skills folder for the target agent')\n .option('--agent <agent>', 'Target agent host: github-copilot | claude-code (default: github-copilot)')\n .option('--claude', 'Shorthand for --agent claude-code')\n .option('--force', 'Skip confirmation — remove all skills without prompting')\n .action((opts: { agent?: string; claude?: boolean; force?: boolean }) => {\n const start = Date.now();\n try {\n const userDir = resolveAgentPaths(resolveAgentName(opts)).user;\n\n if (!fs.existsSync(userDir)) {\n success({ removed: 0, target: userDir, message: 'No user-level skills directory found — nothing to purge.' }, 'skills', 'purge-user', start);\n return;\n }\n\n // Count skills before purging so the output is informative even with --force.\n const skillDirs = fs.readdirSync(userDir).filter(name => {\n if (name.startsWith('.')) return false;\n const p = path.join(userDir, name);\n try { return fs.statSync(p).isDirectory(); } catch { return false; }\n });\n\n if (skillDirs.length === 0) {\n success({ removed: 0, target: userDir, message: 'No skills found in user-level skills directory.' }, 'skills', 'purge-user', start);\n return;\n }\n\n if (!opts.force) {\n throw new Error(\n `This will remove ${skillDirs.length} skill(s) from ${userDir}: ${skillDirs.join(', ')}.\\n` +\n 'Re-run with --force to confirm, or use `pncli skills marketplace purge-plugin` to target a specific plugin.'\n );\n }\n\n for (const name of skillDirs) {\n const skillDir = path.resolve(userDir, name);\n if (!skillDir.startsWith(path.resolve(userDir) + path.sep)) continue;\n fs.rmSync(skillDir, { recursive: true, force: true });\n }\n\n // Clear the metadata index too.\n const metaPath = getInstalledMetaPath(userDir);\n if (fs.existsSync(metaPath)) {\n fs.writeFileSync(metaPath, JSON.stringify({ version: 1, skills: {} }, null, 2), 'utf8');\n }\n\n success({ removed: skillDirs.length, skills: skillDirs, target: userDir }, 'skills', 'purge-user', start);\n } catch (err) {\n fail(err, 'skills', 'purge-user', start);\n }\n });\n}\n\nexport function resolvePluginChoices(marketplacePath: string): { name: string; description: string }[] {\n const marketplaceJsonPath = path.join(marketplacePath, '.claude-plugin', 'marketplace.json');\n if (fs.existsSync(marketplaceJsonPath)) {\n try {\n const meta = JSON.parse(fs.readFileSync(marketplaceJsonPath, 'utf8')) as {\n plugins?: { name: string; description?: string }[];\n };\n if (Array.isArray(meta.plugins) && meta.plugins.length > 0) {\n return meta.plugins.map(p => ({ name: p.name, description: p.description ?? '' }));\n }\n } catch { /* fallthrough to dir scan */ }\n }\n\n const pluginsDir = path.join(marketplacePath, 'plugins');\n if (fs.existsSync(pluginsDir)) {\n return fs.readdirSync(pluginsDir)\n .filter(name => fs.statSync(path.join(pluginsDir, name)).isDirectory())\n .map(name => ({ name, description: '' }));\n }\n\n return [];\n}\n\nexport function resolveSkillsSrc(marketplacePath: string, selectedPlugin: string): string {\n const pluginsBase = path.resolve(marketplacePath, 'plugins');\n const skillsSrc = path.resolve(pluginsBase, selectedPlugin, 'skills');\n if (!skillsSrc.startsWith(pluginsBase + path.sep)) {\n throw new Error(`Invalid plugin name: \"${selectedPlugin}\"`);\n }\n return skillsSrc;\n}\n\ninterface InstallMeta {\n marketplace: string;\n plugin: string;\n installedFrom: string;\n branch?: string;\n}\n\nexport function copyPluginSkills(skillsSrc: string, targetDir: string, meta?: InstallMeta): { installed: string[]; failed: string[] } {\n fs.mkdirSync(targetDir, { recursive: true });\n const resolvedTarget = path.resolve(targetDir);\n\n const skillNames = fs.readdirSync(skillsSrc).filter(name =>\n fs.statSync(path.join(skillsSrc, name)).isDirectory()\n );\n\n const installed: string[] = [];\n const failed: string[] = [];\n\n for (const skillName of skillNames) {\n const dest = path.resolve(targetDir, skillName);\n if (!dest.startsWith(resolvedTarget + path.sep)) {\n failed.push(skillName);\n continue;\n }\n fs.rmSync(dest, { recursive: true, force: true });\n fs.cpSync(path.join(skillsSrc, skillName), dest, { recursive: true });\n installed.push(skillName);\n }\n\n if (meta) {\n recordInstalledSkills(targetDir, installed, {\n source: 'marketplace',\n marketplace: meta.marketplace,\n plugin: meta.plugin,\n installedFrom: meta.installedFrom,\n ...(meta.branch ? { branch: meta.branch } : {}),\n });\n }\n\n return { installed, failed };\n}\n","import { Command } from 'commander';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\nexport interface DecodedJwt {\n header: Record<string, unknown>;\n payload: Record<string, unknown>;\n signature: string;\n}\n\nfunction base64urlDecode(input: string): string {\n // Convert base64url to base64\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n return Buffer.from(padded, 'base64').toString('utf8');\n}\n\nexport function decodeJwt(token: string): DecodedJwt {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new PncliError('Invalid JWT: expected 3 dot-separated parts', 1);\n }\n\n const [rawHeader, rawPayload, signature] = parts;\n\n let header: Record<string, unknown>;\n let payload: Record<string, unknown>;\n\n try {\n header = JSON.parse(base64urlDecode(rawHeader)) as Record<string, unknown>;\n } catch {\n throw new PncliError('Invalid JWT: header is not valid JSON', 1);\n }\n\n try {\n payload = JSON.parse(base64urlDecode(rawPayload)) as Record<string, unknown>;\n } catch {\n throw new PncliError('Invalid JWT: payload is not valid JSON', 1);\n }\n\n return { header, payload, signature };\n}\n\nexport function registerJwtCommands(program: Command): void {\n const jwt = program.command('jwt').description('JWT token utilities');\n\n jwt\n .command('decode <token>')\n .description('Decode a JWT token and output header, payload, and signature as JSON')\n .action((token: string) => {\n const start = Date.now();\n try {\n const data = decodeJwt(token);\n success(data, 'jwt', 'decode', start);\n } catch (err) {\n fail(err, 'jwt', 'decode', start);\n }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\nimport { PncliError } from '../../lib/errors.js';\n\n// ── Kubernetes API response shapes ────────────────────────────────────────────\n\ninterface K8sContainerState {\n waiting?: { reason?: string; message?: string };\n running?: { startedAt?: string };\n terminated?: { exitCode?: number; reason?: string; message?: string };\n}\n\ninterface K8sContainerStatus {\n name: string;\n ready: boolean;\n restartCount: number;\n state?: K8sContainerState;\n lastState?: K8sContainerState;\n image?: string;\n}\n\ninterface K8sPodCondition {\n type: string;\n status: string;\n reason?: string;\n message?: string;\n}\n\ninterface K8sPod {\n metadata: { name: string; namespace: string; creationTimestamp?: string; labels?: Record<string, string> };\n spec: { containers?: Array<{ name: string }> };\n status: {\n phase?: string;\n reason?: string;\n message?: string;\n conditions?: K8sPodCondition[];\n containerStatuses?: K8sContainerStatus[];\n initContainerStatuses?: K8sContainerStatus[];\n startTime?: string;\n };\n}\n\ninterface K8sPodList {\n items: K8sPod[];\n}\n\ninterface K8sEvent {\n type?: string;\n reason?: string;\n message?: string;\n count?: number;\n firstTimestamp?: string;\n lastTimestamp?: string;\n eventTime?: string;\n regarding?: { kind?: string; name?: string; namespace?: string };\n involvedObject?: { kind?: string; name?: string; namespace?: string };\n source?: { component?: string };\n reportingComponent?: string;\n}\n\ninterface K8sEventList {\n items: K8sEvent[];\n}\n\ninterface K8sPodMetrics {\n metadata: { name: string };\n containers: Array<{ name: string; usage: { cpu: string; memory: string } }>;\n}\n\ninterface K8sPodMetricsList {\n items: K8sPodMetrics[];\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction containerState(s?: K8sContainerState): string {\n if (!s) return 'unknown';\n if (s.waiting) return s.waiting.reason ?? 'Waiting';\n if (s.terminated) return s.terminated.reason ?? 'Terminated';\n if (s.running) return 'Running';\n return 'unknown';\n}\n\nfunction getHttp(program: Command) {\n const opts = program.optsWithGlobals();\n const config = loadConfig({ configPath: opts.config as string | undefined });\n if (!config.openshift.baseUrl) {\n throw new PncliError('OpenShift not configured. Run: pncli config init');\n }\n return createHttpClient(config, Boolean(opts.dryRun));\n}\n\nfunction podAge(creationTimestamp?: string): string {\n if (!creationTimestamp) return 'unknown';\n const ageMs = Date.now() - new Date(creationTimestamp).getTime();\n const ageSeconds = Math.floor(ageMs / 1000);\n if (ageSeconds < 60) return `${ageSeconds}s`;\n const ageMinutes = Math.floor(ageSeconds / 60);\n if (ageMinutes < 60) return `${ageMinutes}m`;\n const ageHours = Math.floor(ageMinutes / 60);\n if (ageHours < 24) return `${ageHours}h`;\n return `${Math.floor(ageHours / 24)}d`;\n}\n\n// ── Commands ──────────────────────────────────────────────────────────────────\n\nexport function registerOpenShiftCommands(program: Command): void {\n const oc = program.command('openshift').description('OpenShift / Kubernetes operations');\n\n oc\n .command('pods')\n .description('List pod health summary for a namespace — pre-processed for LLM analysis')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .option('--label-selector <selector>', 'Label selector (e.g. app=my-app)')\n .action(async (opts: { namespace: string; labelSelector?: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string> = {};\n if (opts.labelSelector) params['labelSelector'] = opts.labelSelector;\n\n const podList = await http.openshift<K8sPodList>(\n `/api/v1/namespaces/${encodeURIComponent(opts.namespace)}/pods`,\n { params }\n );\n\n const summaryCounters = {\n total: podList.items.length,\n running: 0,\n pending: 0,\n failed: 0,\n succeeded: 0,\n unknown: 0,\n crashLoopBackOff: 0,\n oomKilled: 0,\n imagePullBackOff: 0,\n totalRestarts: 0,\n };\n\n const pods = podList.items.map(pod => {\n const phase = pod.status.phase ?? 'Unknown';\n\n // Tally phase\n switch (phase.toLowerCase()) {\n case 'running': summaryCounters.running++; break;\n case 'pending': summaryCounters.pending++; break;\n case 'failed': summaryCounters.failed++; break;\n case 'succeeded': summaryCounters.succeeded++; break;\n default: summaryCounters.unknown++; break;\n }\n\n // Process container statuses\n const allStatuses = [\n ...(pod.status.containerStatuses ?? []),\n ...(pod.status.initContainerStatuses ?? [])\n ];\n\n let podRestarts = 0;\n const containers = allStatuses.map(cs => {\n podRestarts += cs.restartCount;\n summaryCounters.totalRestarts += cs.restartCount;\n\n const currentState = containerState(cs.state);\n const lastState = containerState(cs.lastState);\n\n if (currentState === 'CrashLoopBackOff') summaryCounters.crashLoopBackOff++;\n if (currentState === 'ImagePullBackOff' || currentState === 'ErrImagePull') summaryCounters.imagePullBackOff++;\n if (lastState === 'OOMKilled' || cs.lastState?.terminated?.reason === 'OOMKilled') summaryCounters.oomKilled++;\n\n const entry: Record<string, unknown> = {\n name: cs.name,\n ready: cs.ready,\n restartCount: cs.restartCount,\n state: currentState,\n };\n if (cs.lastState?.terminated) {\n entry['lastExitCode'] = cs.lastState.terminated.exitCode;\n entry['lastReason'] = cs.lastState.terminated.reason;\n }\n return entry;\n });\n\n const readyCount = allStatuses.filter(cs => cs.ready).length;\n const totalCount = pod.spec.containers?.length ?? allStatuses.length;\n\n const entry: Record<string, unknown> = {\n name: pod.metadata.name,\n phase,\n ready: `${readyCount}/${totalCount}`,\n restartCount: podRestarts,\n age: podAge(pod.metadata.creationTimestamp),\n };\n\n // Surface top-level pod problem reason if present\n const podReason = pod.status.reason ?? pod.status.conditions?.find(c => c.status === 'False')?.reason;\n if (podReason) entry['reason'] = podReason;\n if (pod.status.message) entry['message'] = pod.status.message;\n if (containers.length > 0) entry['containers'] = containers;\n if (pod.metadata.labels && Object.keys(pod.metadata.labels).length > 0) {\n entry['labels'] = pod.metadata.labels;\n }\n\n return entry;\n });\n\n // Sort: most-problematic first (failed/pending/high-restarts)\n pods.sort((a, b) => {\n const phasePriority = (p: unknown) => {\n if (p === 'Failed') return 0;\n if (p === 'Pending') return 1;\n if (p === 'Unknown') return 2;\n return 3;\n };\n const pDiff = phasePriority(a['phase']) - phasePriority(b['phase']);\n if (pDiff !== 0) return pDiff;\n return ((b['restartCount'] as number) ?? 0) - ((a['restartCount'] as number) ?? 0);\n });\n\n success({ namespace: opts.namespace, summary: summaryCounters, pods }, 'openshift', 'pods', start);\n } catch (err) { fail(err, 'openshift', 'pods', start); }\n });\n\n oc\n .command('events')\n .description('List Warning events for a namespace — pre-filtered for LLM analysis')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .option('--field-selector <selector>', 'Additional field selector (e.g. involvedObject.name=my-pod)')\n .option('--all', 'Include Normal events in addition to Warning events', false)\n .action(async (opts: { namespace: string; fieldSelector?: string; all?: boolean }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const params: Record<string, string> = {};\n\n // Build field selector: default to Warning-only unless --all\n const selectors: string[] = [];\n if (!opts.all) selectors.push('type=Warning');\n if (opts.fieldSelector) selectors.push(opts.fieldSelector);\n if (selectors.length > 0) params['fieldSelector'] = selectors.join(',');\n\n const eventList = await http.openshift<K8sEventList>(\n `/api/v1/namespaces/${encodeURIComponent(opts.namespace)}/events`,\n { params }\n );\n\n const events = eventList.items.map(ev => {\n const obj = ev.involvedObject ?? ev.regarding;\n const entry: Record<string, unknown> = {\n type: ev.type ?? 'Normal',\n reason: ev.reason,\n object: obj ? `${obj.kind ?? 'Object'}/${obj.name ?? '?'}` : undefined,\n message: ev.message,\n count: ev.count ?? 1,\n firstTime: ev.firstTimestamp ?? ev.eventTime,\n lastTime: ev.lastTimestamp ?? ev.eventTime,\n };\n const source = ev.source?.component ?? ev.reportingComponent;\n if (source) entry['source'] = source;\n return entry;\n });\n\n // Sort by count descending (highest frequency first)\n events.sort((a, b) => ((b['count'] as number) ?? 0) - ((a['count'] as number) ?? 0));\n\n success({ namespace: opts.namespace, count: events.length, events }, 'openshift', 'events', start);\n } catch (err) { fail(err, 'openshift', 'events', start); }\n });\n\n oc\n .command('logs')\n .description('Get recent log lines from a pod container')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .requiredOption('--pod <name>', 'Pod name')\n .option('--container <name>', 'Container name (defaults to first container)')\n .option('--lines <n>', 'Number of most-recent lines to return', '100')\n .option('--previous', 'Return logs from the previous container instance', false)\n .action(async (opts: { namespace: string; pod: string; container?: string; lines?: string; previous?: boolean }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const lines = opts.lines ? parseInt(opts.lines, 10) : 100;\n\n const logText = await http.openshiftText(\n `/api/v1/namespaces/${encodeURIComponent(opts.namespace)}/pods/${encodeURIComponent(opts.pod)}/log`,\n {\n lines,\n params: {\n ...(opts.container ? { container: opts.container } : {}),\n ...(opts.previous ? { previous: 'true' } : {}),\n }\n }\n );\n\n success(\n {\n pod: opts.pod,\n namespace: opts.namespace,\n container: opts.container ?? '(default)',\n previous: opts.previous ?? false,\n lines,\n log: logText,\n },\n 'openshift', 'logs', start\n );\n } catch (err) { fail(err, 'openshift', 'logs', start); }\n });\n\n oc\n .command('pod-metrics')\n .description('Get CPU and memory usage for pods in a namespace (requires metrics-server)')\n .requiredOption('--namespace <ns>', 'Kubernetes namespace')\n .action(async (opts: { namespace: string }) => {\n const start = Date.now();\n try {\n const http = getHttp(program);\n const metricsList = await http.openshift<K8sPodMetricsList>(\n `/apis/metrics.k8s.io/v1beta1/namespaces/${encodeURIComponent(opts.namespace)}/pods`\n );\n\n const pods = metricsList.items.map(pm => ({\n name: pm.metadata.name,\n containers: pm.containers.map(c => ({\n name: c.name,\n cpu: c.usage.cpu,\n memory: c.usage.memory,\n })),\n }));\n\n success({ namespace: opts.namespace, pods }, 'openshift', 'pod-metrics', start);\n } catch (err) { fail(err, 'openshift', 'pod-metrics', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient, type HttpClient } from '../../lib/http.js';\nimport { PncliError } from '../../lib/errors.js';\nimport { success, fail } from '../../lib/output.js';\n\ninterface EntityList {\n entities: unknown[];\n nextPageKey?: string;\n totalCount: number;\n}\n\ninterface ProblemList {\n problems: unknown[];\n nextPageKey?: string;\n totalCount: number;\n}\n\ninterface QueryResponse {\n state: 'NOT_STARTED' | 'RUNNING' | 'SUCCEEDED' | 'RESULT_GONE' | 'CANCELLED' | 'FAILED';\n requestToken?: string;\n result?: unknown;\n error?: { message?: string };\n}\n\nfunction getHttp(program: Command): HttpClient {\n const opts = program.optsWithGlobals();\n return createHttpClient(\n loadConfig({ configPath: opts.config as string | undefined }),\n Boolean(opts.dryRun)\n );\n}\n\nasync function allPages<T>(\n fetchPage: (nextPageKey?: string) => Promise<{ items: T[]; nextPageKey?: string; totalCount: number }>\n): Promise<{ items: T[]; totalCount: number }> {\n const items: T[] = [];\n let nextPageKey: string | undefined;\n do {\n const page = await fetchPage(nextPageKey);\n items.push(...page.items);\n nextPageKey = page.nextPageKey;\n } while (nextPageKey);\n return { items, totalCount: items.length };\n}\n\nasync function listEntities(\n http: HttpClient,\n entitySelector: string,\n opts: { from?: string; to?: string; fields?: string }\n) {\n return allPages(async (nextPageKey) => {\n const page = await http.dynatrace<EntityList>('/api/v2/entities', {\n params: nextPageKey\n ? { nextPageKey }\n : {\n entitySelector,\n from: opts.from,\n to: opts.to,\n fields: opts.fields,\n pageSize: 500\n }\n });\n return {\n items: page.entities,\n nextPageKey: page.nextPageKey,\n totalCount: page.totalCount\n };\n });\n}\n\nasync function runTraceQuery(http: HttpClient, traceId: string): Promise<unknown> {\n if (!/^[0-9a-f]{16,32}$/i.test(traceId)) {\n throw new PncliError('Trace ID must be a 16- or 32-character hexadecimal value');\n }\n const deadline = Date.now() + 60_000;\n let response = await http.dynatracePlatform<QueryResponse>(\n '/platform/storage/query/v1/query:execute',\n {\n method: 'POST',\n body: {\n query: `fetch spans | filter trace.id == \"${traceId.toLowerCase()}\" | sort start_time asc`,\n requestTimeoutMilliseconds: 5000\n },\n timeoutMs: 10000\n }\n );\n\n while (response.state === 'RUNNING' || response.state === 'NOT_STARTED') {\n if (!response.requestToken) throw new PncliError('Dynatrace did not return a query request token');\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) throw new PncliError('Dynatrace trace query did not finish within 60 seconds');\n const pollStarted = Date.now();\n response = await http.dynatracePlatform<QueryResponse>(\n '/platform/storage/query/v1/query:poll',\n {\n params: {\n 'request-token': response.requestToken,\n 'request-timeout': Math.min(5000, remainingMs)\n },\n timeoutMs: 10000\n }\n );\n if (response.state === 'RUNNING' || response.state === 'NOT_STARTED') {\n const delayMs = Math.min(1000 - (Date.now() - pollStarted), deadline - Date.now());\n if (delayMs > 0) await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n\n if (response.state !== 'SUCCEEDED') {\n throw new PncliError(response.error?.message ?? `Dynatrace trace query ${response.state.toLowerCase()}`);\n }\n return response.result;\n}\n\nexport function registerDynatraceCommands(program: Command): void {\n const dynatrace = program.command('dynatrace').description('Dynatrace observability operations');\n\n const entities = dynatrace.command('entities').description('Monitored entity operations');\n entities\n .command('list')\n .description('List monitored entities using an entity selector')\n .requiredOption('--selector <selector>', 'Dynatrace entity selector, e.g. type(\"SERVICE\")')\n .option('--from <time>', 'Start time (ISO 8601 or relative, e.g. now-2h)')\n .option('--to <time>', 'End time (ISO 8601 or relative)')\n .option('--fields <fields>', 'Additional entity fields')\n .action(async (opts: { selector: string; from?: string; to?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const data = await listEntities(getHttp(program), opts.selector, opts);\n success({ totalCount: data.totalCount, entities: data.items }, 'dynatrace', 'entities list', start);\n } catch (err) { fail(err, 'dynatrace', 'entities list', start); }\n });\n\n entities\n .command('get')\n .description('Get a monitored entity by ID')\n .requiredOption('--id <id>', 'Entity ID, e.g. SERVICE-1234567890ABCDEF')\n .option('--from <time>', 'Start time')\n .option('--to <time>', 'End time')\n .option('--fields <fields>', 'Additional entity fields')\n .action(async (opts: { id: string; from?: string; to?: string; fields?: string }) => {\n const start = Date.now();\n try {\n const data = await getHttp(program).dynatrace<unknown>(\n `/api/v2/entities/${encodeURIComponent(opts.id)}`,\n { params: { from: opts.from, to: opts.to, fields: opts.fields } }\n );\n success(data, 'dynatrace', 'entities get', start);\n } catch (err) { fail(err, 'dynatrace', 'entities get', start); }\n });\n\n dynatrace\n .command('services')\n .description('List monitored services')\n .option('--from <time>', 'Start time')\n .option('--to <time>', 'End time')\n .action(async (opts: { from?: string; to?: string }) => {\n const start = Date.now();\n try {\n const data = await listEntities(getHttp(program), 'type(\"SERVICE\")', opts);\n success({ totalCount: data.totalCount, services: data.items }, 'dynatrace', 'services', start);\n } catch (err) { fail(err, 'dynatrace', 'services', start); }\n });\n\n dynatrace\n .command('workloads')\n .description('List monitored Kubernetes workloads')\n .option('--from <time>', 'Start time')\n .option('--to <time>', 'End time')\n .action(async (opts: { from?: string; to?: string }) => {\n const start = Date.now();\n try {\n const selector = 'type(\"CLOUD_APPLICATION\")';\n const data = await listEntities(getHttp(program), selector, opts);\n success({ totalCount: data.totalCount, workloads: data.items }, 'dynatrace', 'workloads', start);\n } catch (err) { fail(err, 'dynatrace', 'workloads', start); }\n });\n\n const problems = dynatrace.command('problems').description('Problem operations');\n problems\n .command('list')\n .description('List problems')\n .option('--from <time>', 'Start time (default: now-2h)')\n .option('--to <time>', 'End time (default: now)')\n .option('--problem-selector <selector>', 'Dynatrace problem selector')\n .option('--entity-selector <selector>', 'Affected entity selector')\n .action(async (opts: {\n from?: string;\n to?: string;\n problemSelector?: string;\n entitySelector?: string;\n }) => {\n const start = Date.now();\n try {\n const data = await allPages(async (nextPageKey) => {\n const page = await getHttp(program).dynatrace<ProblemList>('/api/v2/problems', {\n params: nextPageKey\n ? { nextPageKey }\n : {\n from: opts.from ?? 'now-2h',\n to: opts.to ?? 'now',\n problemSelector: opts.problemSelector,\n entitySelector: opts.entitySelector,\n pageSize: 500\n }\n });\n return { items: page.problems, nextPageKey: page.nextPageKey, totalCount: page.totalCount };\n });\n success({ totalCount: data.totalCount, problems: data.items }, 'dynatrace', 'problems list', start);\n } catch (err) { fail(err, 'dynatrace', 'problems list', start); }\n });\n\n problems\n .command('get')\n .description('Get a problem by ID')\n .requiredOption('--id <id>', 'Problem ID')\n .option('--fields <fields>', 'Additional fields')\n .action(async (opts: { id: string; fields?: string }) => {\n const start = Date.now();\n try {\n const data = await getHttp(program).dynatrace<unknown>(\n `/api/v2/problems/${encodeURIComponent(opts.id)}`,\n { params: { fields: opts.fields } }\n );\n success(data, 'dynatrace', 'problems get', start);\n } catch (err) { fail(err, 'dynatrace', 'problems get', start); }\n });\n\n dynatrace\n .command('trace')\n .description('Get distributed-trace spans from Grail')\n .requiredOption('--id <trace-id>', '16- or 32-character hexadecimal trace ID')\n .action(async (opts: { id: string }) => {\n const start = Date.now();\n try {\n const result = await runTraceQuery(getHttp(program), opts.id);\n success(result, 'dynatrace', 'trace', start);\n } catch (err) { fail(err, 'dynatrace', 'trace', start); }\n });\n}\n","import { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { createHttpClient, type HttpClient } from '../../lib/http.js';\nimport { success, fail } from '../../lib/output.js';\n\ninterface QueryResponse {\n cancelled: boolean;\n done: boolean;\n events: unknown[];\n metaData?: unknown;\n warnings?: string[];\n}\n\ninterface Repository {\n name: string;\n [key: string]: unknown;\n}\n\nfunction getHttp(program: Command): HttpClient {\n const opts = program.optsWithGlobals();\n return createHttpClient(\n loadConfig({ configPath: opts.config as string | undefined }),\n Boolean(opts.dryRun)\n );\n}\n\nexport function registerLogscaleCommands(program: Command): void {\n const logscale = program.command('logscale').description('LogScale log query operations');\n\n const repositories = logscale.command('repositories').description('Repository operations');\n repositories\n .command('list')\n .description('List available repositories')\n .action(async () => {\n const start = Date.now();\n try {\n const data = await getHttp(program).logscale<Repository[]>('/api/v1/repositories');\n success({ count: data.length, repositories: data }, 'logscale', 'repositories list', start);\n } catch (err) { fail(err, 'logscale', 'repositories list', start); }\n });\n\n logscale\n .command('query')\n .description('Execute a LogScale Query Language (LQL) search against a repository')\n .requiredOption('--repository <name>', 'Repository name to query')\n .requiredOption('--query <lql>', 'LogScale Query Language expression (e.g. \"error\" or \"level=error | count()\")')\n .option('--start <time>', 'Start time (ISO 8601 or relative such as 1h or 24h)', '1h')\n .option('--end <time>', 'End time (ISO 8601 or relative)', 'now')\n .option('--limit <n>', 'Maximum number of events to return', '200')\n .option('--timeout-ms <ms>', 'Client-side HTTP timeout in milliseconds', '30000')\n .action(async (opts: {\n repository: string;\n query: string;\n start: string;\n end: string;\n limit: string;\n timeoutMs: string;\n }) => {\n const ts = Date.now();\n try {\n const body = {\n queryString: opts.query,\n start: opts.start,\n end: opts.end,\n limit: parseInt(opts.limit, 10),\n showQueryEventDistribution: false,\n isLive: false\n };\n const data = await getHttp(program).logscale<QueryResponse>(\n `/api/v1/repositories/${encodeURIComponent(opts.repository)}/query`,\n {\n method: 'POST',\n body,\n timeoutMs: parseInt(opts.timeoutMs, 10)\n }\n );\n success(\n {\n repository: opts.repository,\n done: data.done,\n cancelled: data.cancelled,\n eventCount: data.events.length,\n events: data.events,\n warnings: data.warnings ?? [],\n metaData: data.metaData\n },\n 'logscale',\n 'query',\n ts\n );\n } catch (err) { fail(err, 'logscale', 'query', ts); }\n });\n}\n"],"mappings":"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","names":["Command","execSync","path","program","readFileSync","API","readFileSync","readFileSync","program","readFileSync","getClient","program","path","getClient","program","existsSync","mkdirSync","writeFileSync","path","readFileSync","basename","API","readFileSync","basename","path","getClient","program","existsSync","mkdirSync","writeFileSync","API","getClient","program","API","getClient","program","resolveProject","Option","path","execSync","execFileSync","path","pkg","path","path","execSync","path","execFileSync","pkg","pkg","pkg","BATCH_SIZE","TIMEOUT_MS","fetchWithTimeout","pkg","inferSeverityFromCvss","queryBatch","TIMEOUT_MS","BATCH_SIZE","fetchWithTimeout","toPurl","pkg","TIMEOUT_MS","fetchWithTimeout","pkg","pkg","pkg","pkg","program","Option","readFileSync","basename","API","fs","program","path","categorize","API","API","program","parseFieldArgs","fs","path","parseFieldArgs","path","fs","repo","AdoCoreClient","createHttpClient","program","getClient","program","API","path","getClient","program","path","POLL_INTERVAL_MS","getClient","program","getClient","program","program","program","program","path","fs","path","execFileSync","input","path","fs","execFileSync","program","colonIdx","results","input","input","program","getHttp","program","entry","getHttp","program","getHttp","program","require","Command"]}