scp-next 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/client/client.ts","../../src/client/transport.ts","../../src/security/redact.ts","../../src/errors/index.ts","../../src/security/host-verification.ts","../../src/paths/local-path.ts","../../src/client/walk.ts","../../src/paths/remote-path.ts","../../src/config/validation.ts","../../src/client/download.ts","../../src/client/upload.ts","../../src/cli/commands/download.ts","../../src/cli/operands.ts","../../src/cli/commands/shared.ts","../../src/config/environment.ts","../../src/config/load-config.ts","../../src/config/resolve-config.ts","../../src/config/jobs.ts","../../src/config/profiles.ts","../../src/cli/output.ts","../../src/cli/commands/run.ts","../../src/cli/commands/upload.ts"],"sourcesContent":["import { Command, CommanderError } from \"commander\";\n\nimport { download } from \"../client/download.js\";\nimport { upload } from \"../client/upload.js\";\nimport { ScpNextError } from \"../errors/index.js\";\nimport { formatErrorMessage } from \"../security/redact.js\";\nimport { createDownloadCommand } from \"./commands/download.js\";\nimport { createRunCommand } from \"./commands/run.js\";\nimport { createUploadCommand } from \"./commands/upload.js\";\nimport type { Output } from \"./output.js\";\nimport type { TransferHandlers } from \"./commands/shared.js\";\n\nexport interface RunCliOptions {\n argv?: string[];\n cwd?: string;\n output?: Output;\n handlers?: TransferHandlers;\n}\n\nexport async function runCli(options: RunCliOptions = {}): Promise<number> {\n const output = options.output ?? { stdout: process.stdout, stderr: process.stderr };\n const cwd = options.cwd ?? process.cwd();\n const handlers = options.handlers ?? { upload, download };\n const program = new Command();\n\n program\n .name(\"scp-next\")\n .description(\"Secure file transfers over SSH using SFTP\")\n .version(\"0.1.0\")\n .showHelpAfterError()\n .exitOverride();\n\n program.addCommand(createUploadCommand(handlers, output, cwd));\n program.addCommand(createDownloadCommand(handlers, output, cwd));\n program.addCommand(createRunCommand(handlers, output, cwd));\n\n try {\n await program.parseAsync(options.argv ?? process.argv, { from: \"node\" });\n return 0;\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\") {\n return 0;\n }\n output.stderr.write(`${formatErrorMessage(error.message)}\\n`);\n return error.exitCode || 1;\n }\n\n const verbose = (options.argv ?? process.argv).includes(\"--verbose\");\n if (error instanceof ScpNextError) {\n output.stderr.write(`Error: ${formatErrorMessage(error.message)}\\n`);\n if (verbose && error.cause instanceof Error) {\n output.stderr.write(`${formatErrorMessage(error.cause.stack ?? error.cause.message)}\\n`);\n }\n return 1;\n }\n\n output.stderr.write(`Error: ${formatErrorMessage(error)}\\n`);\n if (verbose && error instanceof Error && error.stack) {\n output.stderr.write(`${formatErrorMessage(error.stack)}\\n`);\n }\n return 1;\n }\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n void runCli().then((exitCode) => {\n process.exitCode = exitCode;\n });\n}\n","import { access, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { Ssh2SftpTransport } from \"./transport.js\";\nimport type { SftpTransport } from \"./transport.js\";\nimport { walkLocalFiles, walkRemoteFiles } from \"./walk.js\";\nimport { TransferError, ValidationError } from \"../errors/index.js\";\nimport { getLocalPathKind, resolveLocalPath } from \"../paths/local-path.js\";\nimport { normalizeRemotePath, remoteDirname, remoteJoin } from \"../paths/remote-path.js\";\nimport type {\n DownloadOptions,\n ScpNextClient,\n ScpServerOptions,\n TransferOptions,\n UploadOptions\n} from \"../types/index.js\";\nimport {\n validateDownloadOptions,\n validateServerOptions,\n validateUploadOptions\n} from \"../config/validation.js\";\n\nexport interface ScpNextClientDependencies {\n transport?: SftpTransport;\n}\n\nfunction percentage(transferredBytes: number, totalBytes?: number): number | undefined {\n if (!totalBytes || totalBytes <= 0) {\n return undefined;\n }\n return Math.min(100, Math.round((transferredBytes / totalBytes) * 100));\n}\n\nfunction mergeOptions<T extends TransferOptions>(\n serverOptions: ScpServerOptions,\n transferOptions: T | undefined\n): ScpServerOptions & T {\n return { ...serverOptions, ...(transferOptions ?? {}) } as ScpServerOptions & T;\n}\n\nexport class ScpNextClientImpl implements ScpNextClient {\n private readonly serverOptions: ScpServerOptions;\n private readonly transport: SftpTransport;\n private connected = false;\n\n constructor(serverOptions: ScpServerOptions, dependencies: ScpNextClientDependencies = {}) {\n this.serverOptions = serverOptions;\n this.transport = dependencies.transport ?? new Ssh2SftpTransport();\n }\n\n async connect(): Promise<void> {\n await validateServerOptions(this.serverOptions);\n await this.transport.connect(this.serverOptions);\n this.connected = true;\n }\n\n async upload(\n localPath: string,\n remotePath: string,\n options: TransferOptions = {}\n ): Promise<void> {\n const uploadOptions: UploadOptions = {\n ...mergeOptions(this.serverOptions, options),\n localPath,\n remotePath\n };\n await validateUploadOptions(uploadOptions);\n\n if (options.dryRun) {\n return;\n }\n\n await this.ensureConnected();\n await this.uploadWithTransport(uploadOptions);\n }\n\n async download(\n remotePath: string,\n localPath: string,\n options: TransferOptions = {}\n ): Promise<void> {\n const downloadOptions: DownloadOptions = {\n ...mergeOptions(this.serverOptions, options),\n remotePath,\n localPath\n };\n await validateDownloadOptions(downloadOptions);\n\n if (options.dryRun) {\n return;\n }\n\n await this.ensureConnected();\n await this.downloadWithTransport(downloadOptions);\n }\n\n async close(): Promise<void> {\n if (this.connected) {\n await this.transport.close();\n this.connected = false;\n }\n }\n\n private async ensureConnected(): Promise<void> {\n if (!this.connected) {\n await this.connect();\n }\n }\n\n private async uploadWithTransport(options: UploadOptions): Promise<void> {\n const localKind = await getLocalPathKind(options.localPath);\n const remotePath = normalizeRemotePath(options.remotePath);\n\n if (localKind === \"directory\" && !options.recursive) {\n throw new ValidationError(\"Uploading a directory requires recursive mode.\");\n }\n\n if (localKind === \"file\") {\n await this.ensureRemoteParent(remotePath, options.createDirectories);\n await this.assertRemoteOverwrite(remotePath, options.overwrite);\n const totalBytes = undefined;\n await this.transport.uploadFile(resolveLocalPath(options.localPath), remotePath, (step) => {\n options.onProgress?.({\n operation: \"upload\",\n source: options.localPath,\n destination: options.remotePath,\n transferredBytes: step.transferredBytes,\n totalBytes: step.totalBytes || totalBytes,\n percentage: percentage(step.transferredBytes, step.totalBytes),\n currentFile: options.localPath\n });\n });\n return;\n }\n\n const files = await walkLocalFiles(options.localPath);\n const totalBytes = files.reduce((sum, file) => sum + file.size, 0);\n let completedBytes = 0;\n let completedFiles = 0;\n\n const destinationExists = await this.transport.exists(remotePath);\n if (destinationExists && destinationExists !== \"d\") {\n throw new TransferError(`Remote destination already exists and is not a directory: ${remotePath}`, {\n context: { remotePath }\n });\n }\n if (!destinationExists) {\n if (!options.createDirectories) {\n throw new TransferError(`Remote destination directory does not exist: ${remotePath}`, {\n context: { remotePath }\n });\n }\n await this.transport.mkdir(remotePath, true);\n }\n\n for (const file of files) {\n const destinationFile = remoteJoin(remotePath, file.relativePath.split(path.sep).join(\"/\"));\n await this.ensureRemoteParent(destinationFile, true);\n await this.assertRemoteOverwrite(destinationFile, options.overwrite);\n\n await this.transport.uploadFile(file.absolutePath, destinationFile, (step) => {\n const transferredBytes = completedBytes + step.transferredBytes;\n options.onProgress?.({\n operation: \"upload\",\n source: options.localPath,\n destination: options.remotePath,\n transferredBytes,\n totalBytes,\n percentage: percentage(transferredBytes, totalBytes),\n currentFile: file.relativePath,\n completedFiles,\n totalFiles: files.length\n });\n });\n\n completedBytes += file.size;\n completedFiles += 1;\n }\n }\n\n private async downloadWithTransport(options: DownloadOptions): Promise<void> {\n const remotePath = normalizeRemotePath(options.remotePath);\n const remoteKind = await this.transport.exists(remotePath);\n\n if (!remoteKind) {\n throw new TransferError(`Remote path does not exist: ${options.remotePath}`, {\n context: { remotePath: options.remotePath }\n });\n }\n\n if (remoteKind === \"d\") {\n if (!options.recursive) {\n throw new ValidationError(\"Downloading a directory requires recursive mode.\");\n }\n await this.downloadDirectory(options);\n return;\n }\n\n await this.downloadSingleFile(options, remotePath);\n }\n\n private async downloadSingleFile(options: DownloadOptions, remotePath: string): Promise<void> {\n const localPath = resolveLocalPath(options.localPath);\n await this.assertLocalOverwrite(localPath, options.overwrite);\n if (options.createDirectories) {\n await mkdir(path.dirname(localPath), { recursive: true });\n }\n await this.transport.downloadFile(remotePath, localPath, (step) => {\n options.onProgress?.({\n operation: \"download\",\n source: options.remotePath,\n destination: options.localPath,\n transferredBytes: step.transferredBytes,\n totalBytes: step.totalBytes,\n percentage: percentage(step.transferredBytes, step.totalBytes),\n currentFile: options.remotePath\n });\n });\n }\n\n private async downloadDirectory(options: DownloadOptions): Promise<void> {\n const remotePath = normalizeRemotePath(options.remotePath);\n const localRoot = resolveLocalPath(options.localPath);\n const files = await walkRemoteFiles(this.transport, remotePath);\n const totalBytes = files.reduce((sum, file) => sum + file.size, 0);\n let completedBytes = 0;\n let completedFiles = 0;\n\n await mkdir(localRoot, { recursive: Boolean(options.createDirectories) });\n\n for (const file of files) {\n const localFile = path.join(localRoot, ...file.relativePath.split(\"/\"));\n await this.assertLocalOverwrite(localFile, options.overwrite);\n await mkdir(path.dirname(localFile), { recursive: true });\n await this.transport.downloadFile(file.remotePath, localFile, (step) => {\n const transferredBytes = completedBytes + step.transferredBytes;\n options.onProgress?.({\n operation: \"download\",\n source: options.remotePath,\n destination: options.localPath,\n transferredBytes,\n totalBytes,\n percentage: percentage(transferredBytes, totalBytes),\n currentFile: file.relativePath,\n completedFiles,\n totalFiles: files.length\n });\n });\n completedBytes += file.size;\n completedFiles += 1;\n }\n }\n\n private async ensureRemoteParent(remotePath: string, createDirectories = false): Promise<void> {\n const parent = remoteDirname(remotePath);\n if (parent === \".\" || parent === \"/\") {\n return;\n }\n\n if (createDirectories) {\n await this.transport.mkdir(parent, true);\n return;\n }\n\n const exists = await this.transport.exists(parent);\n if (exists !== \"d\") {\n throw new TransferError(`Remote destination parent does not exist: ${parent}`, {\n context: { remotePath }\n });\n }\n }\n\n private async assertRemoteOverwrite(remotePath: string, overwrite = false): Promise<void> {\n if (overwrite) {\n return;\n }\n const exists = await this.transport.exists(remotePath);\n if (exists) {\n throw new TransferError(`Remote destination already exists: ${remotePath}`, {\n context: { remotePath }\n });\n }\n }\n\n private async assertLocalOverwrite(localPath: string, overwrite = false): Promise<void> {\n if (overwrite) {\n return;\n }\n\n try {\n await access(localPath);\n throw new TransferError(`Local destination already exists: ${localPath}`, {\n context: { localPath }\n });\n } catch (error) {\n if (error instanceof TransferError) {\n throw error;\n }\n }\n }\n}\n\nexport function createClient(options: ScpServerOptions): ScpNextClient {\n return new ScpNextClientImpl(options);\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport SftpClient from \"ssh2-sftp-client\";\nimport type {\n ConnectOptions as SftpConnectOptions,\n FileInfo,\n TransferOptions as SftpTransferOptions\n} from \"ssh2-sftp-client\";\n\nimport { ConnectionError, HostVerificationError, TransferError, toScpNextError } from \"../errors/index.js\";\nimport { createHostVerifier, resolveAllowedFingerprints } from \"../security/host-verification.js\";\nimport type { ScpServerOptions } from \"../types/index.js\";\nimport { expandHome } from \"../paths/local-path.js\";\n\nexport interface RemoteFileInfo {\n type: \"-\" | \"d\" | \"l\";\n name: string;\n size: number;\n}\n\nexport interface TransferStep {\n transferredBytes: number;\n chunkBytes: number;\n totalBytes: number;\n}\n\nexport interface SftpTransport {\n connect(options: ScpServerOptions): Promise<void>;\n close(): Promise<void>;\n exists(remotePath: string): Promise<false | \"-\" | \"d\" | \"l\">;\n mkdir(remotePath: string, recursive?: boolean): Promise<void>;\n list(remotePath: string): Promise<RemoteFileInfo[]>;\n uploadFile(\n localPath: string,\n remotePath: string,\n onStep?: (step: TransferStep) => void\n ): Promise<void>;\n downloadFile(\n remotePath: string,\n localPath: string,\n onStep?: (step: TransferStep) => void\n ): Promise<void>;\n}\n\nfunction toRemoteFileInfo(info: FileInfo): RemoteFileInfo {\n return {\n type: info.type,\n name: info.name,\n size: info.size\n };\n}\n\nexport class Ssh2SftpTransport implements SftpTransport {\n private readonly client: SftpClient;\n\n constructor(name = \"scp-next\") {\n this.client = new SftpClient(name);\n }\n\n async connect(options: ScpServerOptions): Promise<void> {\n const allowedFingerprints = await resolveAllowedFingerprints(options);\n const hostVerifier = createHostVerifier(allowedFingerprints);\n\n const connectOptions: SftpConnectOptions = {};\n if (options.host !== undefined) connectOptions.host = options.host;\n if (options.port !== undefined) connectOptions.port = options.port;\n if (options.username !== undefined) connectOptions.username = options.username;\n if (options.password !== undefined) connectOptions.password = options.password;\n if (options.privateKey !== undefined) {\n connectOptions.privateKey = options.privateKey;\n } else if (options.privateKeyFile) {\n connectOptions.privateKey = await readFile(expandHome(options.privateKeyFile), \"utf8\");\n }\n if (options.passphrase !== undefined) connectOptions.passphrase = options.passphrase;\n const agent = options.agent ?? process.env.SSH_AUTH_SOCK;\n if (agent !== undefined) {\n connectOptions.agent = agent;\n }\n if (options.timeout !== undefined) connectOptions.readyTimeout = options.timeout;\n if (hostVerifier) {\n connectOptions.hostHash = \"sha256\";\n connectOptions.hostVerifier = hostVerifier;\n }\n\n try {\n await this.client.connect(connectOptions);\n } catch (error) {\n const converted = toScpNextError(error);\n if (converted instanceof HostVerificationError) {\n throw converted;\n }\n throw new ConnectionError(\"Unable to connect to SSH server.\", {\n cause: error,\n context: {\n host: options.host,\n port: options.port,\n username: options.username\n }\n });\n }\n }\n\n async close(): Promise<void> {\n await this.client.end();\n }\n\n async exists(remotePath: string): Promise<false | \"-\" | \"d\" | \"l\"> {\n return this.client.exists(remotePath);\n }\n\n async mkdir(remotePath: string, recursive = true): Promise<void> {\n await this.client.mkdir(remotePath, recursive);\n }\n\n async list(remotePath: string): Promise<RemoteFileInfo[]> {\n const files = await this.client.list(remotePath);\n return files.map(toRemoteFileInfo);\n }\n\n async uploadFile(\n localPath: string,\n remotePath: string,\n onStep?: (step: TransferStep) => void\n ): Promise<void> {\n try {\n await this.client.fastPut(localPath, remotePath, this.transferOptions(onStep));\n } catch (error) {\n throw new TransferError(`Upload failed for ${localPath}.`, {\n cause: error,\n context: { localPath, remotePath }\n });\n }\n }\n\n async downloadFile(\n remotePath: string,\n localPath: string,\n onStep?: (step: TransferStep) => void\n ): Promise<void> {\n try {\n await this.client.fastGet(remotePath, localPath, this.transferOptions(onStep));\n } catch (error) {\n throw new TransferError(`Download failed for ${remotePath}.`, {\n cause: error,\n context: { remotePath, localPath }\n });\n }\n }\n\n private transferOptions(onStep?: (step: TransferStep) => void): SftpTransferOptions | undefined {\n if (!onStep) {\n return undefined;\n }\n return {\n step(transferredBytes, chunkBytes, totalBytes) {\n onStep({ transferredBytes, chunkBytes, totalBytes });\n }\n };\n }\n}\n","const SENSITIVE_KEYS = [\n \"password\",\n \"passphrase\",\n \"privatekey\",\n \"privatekeyfile\",\n \"token\",\n \"authorization\",\n \"credential\",\n \"secret\"\n];\n\nconst PRIVATE_KEY_PATTERN =\n /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----/g;\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.replace(/[-_\\s]/g, \"\").toLowerCase();\n return SENSITIVE_KEYS.some((sensitive) => normalized.includes(sensitive));\n}\n\nexport function redactSensitiveValues(value: unknown): unknown {\n if (typeof value === \"string\") {\n return value.replace(PRIVATE_KEY_PATTERN, \"[REDACTED]\");\n }\n\n if (Array.isArray(value)) {\n const redacted: unknown[] = value.map((item: unknown) => redactSensitiveValues(item));\n return redacted;\n }\n\n if (value && typeof value === \"object\") {\n const redacted: Record<string, unknown> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n redacted[key] = isSensitiveKey(key) ? \"[REDACTED]\" : redactSensitiveValues(nestedValue);\n }\n return redacted;\n }\n\n return value;\n}\n\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return String(redactSensitiveValues(error.message));\n }\n return String(redactSensitiveValues(error));\n}\n","import { redactSensitiveValues } from \"../security/redact.js\";\n\nexport type ScpNextErrorCode =\n | \"SCP_NEXT_ERROR\"\n | \"SCP_NEXT_CONFIGURATION_ERROR\"\n | \"SCP_NEXT_VALIDATION_ERROR\"\n | \"SCP_NEXT_AUTHENTICATION_ERROR\"\n | \"SCP_NEXT_CONNECTION_ERROR\"\n | \"SCP_NEXT_TRANSFER_ERROR\"\n | \"SCP_NEXT_FILESYSTEM_ERROR\"\n | \"SCP_NEXT_HOST_VERIFICATION_ERROR\";\n\nexport interface ScpNextErrorOptions {\n code?: ScpNextErrorCode;\n cause?: unknown;\n context?: Record<string, unknown>;\n}\n\nexport class ScpNextError extends Error {\n readonly code: ScpNextErrorCode;\n readonly context: Record<string, unknown>;\n\n constructor(message: string, options: ScpNextErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = options.code ?? \"SCP_NEXT_ERROR\";\n this.context = redactSensitiveValues(options.context ?? {}) as Record<string, unknown>;\n }\n}\n\nexport class ConfigurationError extends ScpNextError {\n constructor(message: string, options: Omit<ScpNextErrorOptions, \"code\"> = {}) {\n super(message, { ...options, code: \"SCP_NEXT_CONFIGURATION_ERROR\" });\n }\n}\n\nexport class ValidationError extends ScpNextError {\n constructor(message: string, options: Omit<ScpNextErrorOptions, \"code\"> = {}) {\n super(message, { ...options, code: \"SCP_NEXT_VALIDATION_ERROR\" });\n }\n}\n\nexport class AuthenticationError extends ScpNextError {\n constructor(message: string, options: Omit<ScpNextErrorOptions, \"code\"> = {}) {\n super(message, { ...options, code: \"SCP_NEXT_AUTHENTICATION_ERROR\" });\n }\n}\n\nexport class ConnectionError extends ScpNextError {\n constructor(message: string, options: Omit<ScpNextErrorOptions, \"code\"> = {}) {\n super(message, { ...options, code: \"SCP_NEXT_CONNECTION_ERROR\" });\n }\n}\n\nexport class TransferError extends ScpNextError {\n constructor(message: string, options: Omit<ScpNextErrorOptions, \"code\"> = {}) {\n super(message, { ...options, code: \"SCP_NEXT_TRANSFER_ERROR\" });\n }\n}\n\nexport class FileSystemError extends ScpNextError {\n constructor(message: string, options: Omit<ScpNextErrorOptions, \"code\"> = {}) {\n super(message, { ...options, code: \"SCP_NEXT_FILESYSTEM_ERROR\" });\n }\n}\n\nexport class HostVerificationError extends ScpNextError {\n constructor(message: string, options: Omit<ScpNextErrorOptions, \"code\"> = {}) {\n super(message, { ...options, code: \"SCP_NEXT_HOST_VERIFICATION_ERROR\" });\n }\n}\n\nexport function toScpNextError(error: unknown): ScpNextError {\n if (error instanceof ScpNextError) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : \"Unexpected scp-next error.\";\n const lowerMessage = message.toLowerCase();\n\n if (lowerMessage.includes(\"authentication\") || lowerMessage.includes(\"permission denied\")) {\n return new AuthenticationError(\"SSH authentication failed.\", { cause: error });\n }\n\n if (lowerMessage.includes(\"host verification\") || lowerMessage.includes(\"host key\")) {\n return new HostVerificationError(\"SSH host verification failed.\", { cause: error });\n }\n\n if (\n lowerMessage.includes(\"timed out\") ||\n lowerMessage.includes(\"connection\") ||\n lowerMessage.includes(\"econn\")\n ) {\n return new ConnectionError(\"SSH connection failed.\", { cause: error });\n }\n\n return new TransferError(String(redactSensitiveValues(message)), { cause: error });\n}\n","import { createHash } from \"node:crypto\";\nimport { access, readFile } from \"node:fs/promises\";\n\nimport { HostVerificationError } from \"../errors/index.js\";\nimport { expandHome } from \"../paths/local-path.js\";\n\nfunction normalizeFingerprint(fingerprint: string): string {\n return fingerprint\n .trim()\n .replace(/^SHA256:/i, \"\")\n .replace(/^sha256:/i, \"\")\n .replace(/=+$/g, \"\");\n}\n\nexport function isFingerprintMatch(actual: string, expected: string): boolean {\n return normalizeFingerprint(actual) === normalizeFingerprint(expected);\n}\n\nexport interface HostVerifierConfig {\n host?: string | undefined;\n hostFingerprint?: string | undefined;\n knownHostsFile?: string | undefined;\n}\n\nexport async function resolveAllowedFingerprints(\n options: HostVerifierConfig\n): Promise<Set<string>> {\n const fingerprints = new Set<string>();\n const knownHostsFile = options.knownHostsFile ?? \"~/.ssh/known_hosts\";\n\n if (!options.host) {\n throw new HostVerificationError(\"A host is required for SSH host verification.\");\n }\n\n if (options.hostFingerprint) {\n fingerprints.add(normalizeFingerprint(options.hostFingerprint));\n }\n\n try {\n await access(expandHome(knownHostsFile));\n const content = await readFile(expandHome(knownHostsFile), \"utf8\");\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || trimmed.startsWith(\"@\")) {\n continue;\n }\n\n const [hosts, algorithm, key] = trimmed.split(/\\s+/);\n if (!hosts || !algorithm || !key || !hosts.split(\",\").includes(options.host)) {\n continue;\n }\n\n const fingerprint = createHash(\"sha256\")\n .update(Buffer.from(key, \"base64\"))\n .digest(\"base64\")\n .replace(/=+$/g, \"\");\n fingerprints.add(fingerprint);\n }\n } catch (error) {\n if (options.knownHostsFile || !options.hostFingerprint) {\n throw new HostVerificationError(\n \"SSH host verification requires hostFingerprint or an accessible knownHostsFile.\",\n { cause: error, context: { knownHostsFile } }\n );\n }\n }\n\n if (fingerprints.size === 0) {\n throw new HostVerificationError(\n \"SSH host verification failed before connecting: no matching host fingerprint was configured.\"\n );\n }\n\n return fingerprints;\n}\n\nexport function createHostVerifier(allowedFingerprints: Set<string>) {\n return (hashedKey: string): boolean => {\n for (const expected of allowedFingerprints) {\n if (isFingerprintMatch(hashedKey, expected)) {\n return true;\n }\n }\n return false;\n };\n}\n","import { constants } from \"node:fs\";\nimport { access, mkdir, stat } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { FileSystemError, ValidationError } from \"../errors/index.js\";\n\nexport function expandHome(inputPath: string): string {\n if (inputPath === \"~\") {\n return os.homedir();\n }\n if (inputPath.startsWith(`~${path.sep}`) || inputPath.startsWith(\"~/\")) {\n return path.join(os.homedir(), inputPath.slice(2));\n }\n return inputPath;\n}\n\nexport function resolveLocalPath(inputPath: string, baseDir = process.cwd()): string {\n const expanded = expandHome(inputPath);\n return path.isAbsolute(expanded) ? path.normalize(expanded) : path.resolve(baseDir, expanded);\n}\n\nexport async function assertLocalPathExists(inputPath: string): Promise<void> {\n try {\n await access(resolveLocalPath(inputPath), constants.F_OK);\n } catch (error) {\n throw new FileSystemError(`Local path does not exist: ${inputPath}`, {\n cause: error,\n context: { path: inputPath }\n });\n }\n}\n\nexport async function assertLocalFileReadable(inputPath: string): Promise<void> {\n try {\n await access(resolveLocalPath(inputPath), constants.R_OK);\n } catch (error) {\n throw new FileSystemError(`Local file is not readable: ${inputPath}`, {\n cause: error,\n context: { path: inputPath }\n });\n }\n}\n\nexport async function assertDownloadDestination(inputPath: string, createDirectories = false) {\n const resolved = resolveLocalPath(inputPath);\n const parent = path.dirname(resolved);\n\n if (createDirectories) {\n await mkdir(parent, { recursive: true });\n return;\n }\n\n try {\n await access(parent, constants.W_OK);\n } catch (error) {\n throw new FileSystemError(`Local destination parent does not exist or is not writable: ${parent}`, {\n cause: error,\n context: { path: inputPath }\n });\n }\n}\n\nexport async function getLocalPathKind(inputPath: string): Promise<\"file\" | \"directory\"> {\n const stats = await stat(resolveLocalPath(inputPath));\n if (stats.isDirectory()) {\n return \"directory\";\n }\n if (stats.isFile()) {\n return \"file\";\n }\n throw new ValidationError(`Local path must be a file or directory: ${inputPath}`, {\n context: { path: inputPath }\n });\n}\n\nexport async function getLocalFileSize(inputPath: string): Promise<number> {\n const stats = await stat(resolveLocalPath(inputPath));\n return stats.size;\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { RemoteFileInfo, SftpTransport } from \"./transport.js\";\nimport { resolveLocalPath } from \"../paths/local-path.js\";\nimport { remoteJoin } from \"../paths/remote-path.js\";\n\nexport interface LocalFileEntry {\n absolutePath: string;\n relativePath: string;\n size: number;\n}\n\nexport async function walkLocalFiles(rootPath: string): Promise<LocalFileEntry[]> {\n const resolvedRoot = resolveLocalPath(rootPath);\n const stats = await stat(resolvedRoot);\n\n if (stats.isFile()) {\n return [\n {\n absolutePath: resolvedRoot,\n relativePath: path.basename(resolvedRoot),\n size: stats.size\n }\n ];\n }\n\n const files: LocalFileEntry[] = [];\n\n async function visit(directory: string): Promise<void> {\n const entries = await readdir(directory, { withFileTypes: true });\n for (const entry of entries) {\n const absolutePath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n await visit(absolutePath);\n } else if (entry.isFile()) {\n const entryStats = await stat(absolutePath);\n files.push({\n absolutePath,\n relativePath: path.relative(resolvedRoot, absolutePath),\n size: entryStats.size\n });\n }\n }\n }\n\n await visit(resolvedRoot);\n return files;\n}\n\nexport interface RemoteFileEntry {\n remotePath: string;\n relativePath: string;\n size: number;\n}\n\nexport async function walkRemoteFiles(\n transport: SftpTransport,\n rootPath: string\n): Promise<RemoteFileEntry[]> {\n const rootEntries = await transport.list(rootPath);\n const files: RemoteFileEntry[] = [];\n\n async function visit(directory: string, relativeBase: string, entries: RemoteFileInfo[]): Promise<void> {\n for (const entry of entries) {\n const fullPath = remoteJoin(directory, entry.name);\n const relativePath = relativeBase ? remoteJoin(relativeBase, entry.name) : entry.name;\n if (entry.type === \"d\") {\n await visit(fullPath, relativePath, await transport.list(fullPath));\n } else if (entry.type === \"-\") {\n files.push({\n remotePath: fullPath,\n relativePath,\n size: entry.size\n });\n }\n }\n }\n\n await visit(rootPath, \"\", rootEntries);\n return files;\n}\n","import path from \"node:path\";\n\nimport { ValidationError } from \"../errors/index.js\";\n\nexport function assertRemotePath(inputPath: string, label = \"remote path\"): void {\n if (!inputPath || inputPath.trim().length === 0) {\n throw new ValidationError(`Invalid ${label}: remote paths must not be empty.`, {\n context: { path: inputPath }\n });\n }\n}\n\nexport function normalizeRemotePath(inputPath: string): string {\n assertRemotePath(inputPath);\n return path.posix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n}\n\nexport function remoteJoin(...parts: string[]): string {\n const joined = path.posix.join(...parts);\n assertRemotePath(joined);\n return joined;\n}\n\nexport function remoteDirname(inputPath: string): string {\n assertRemotePath(inputPath);\n return path.posix.dirname(inputPath);\n}\n","import { access } from \"node:fs/promises\";\n\nimport { ValidationError } from \"../errors/index.js\";\nimport { assertDownloadDestination, assertLocalPathExists, resolveLocalPath } from \"../paths/local-path.js\";\nimport { assertRemotePath } from \"../paths/remote-path.js\";\nimport type { DownloadOptions, ScpServerOptions, UploadOptions } from \"../types/index.js\";\n\nfunction validatePort(port: number | undefined): void {\n if (port === undefined) {\n return;\n }\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new ValidationError(\"Port must be an integer between 1 and 65535.\", {\n context: { port }\n });\n }\n}\n\nfunction validateTimeout(timeout: number | undefined): void {\n if (timeout === undefined) {\n return;\n }\n if (!Number.isFinite(timeout) || timeout <= 0) {\n throw new ValidationError(\"Timeout must be a positive number.\", {\n context: { timeout }\n });\n }\n}\n\nexport async function validateServerOptions(options: ScpServerOptions): Promise<void> {\n if (!options.host) {\n throw new ValidationError(\"Host is required.\");\n }\n if (!options.username) {\n throw new ValidationError(\"Username is required.\");\n }\n\n validatePort(options.port);\n validateTimeout(options.timeout);\n\n if (options.privateKeyFile) {\n try {\n await access(resolveLocalPath(options.privateKeyFile));\n } catch (error) {\n throw new ValidationError(`Private key file does not exist: ${options.privateKeyFile}`, {\n cause: error,\n context: { privateKeyFile: options.privateKeyFile }\n });\n }\n }\n\n const hasAuthentication =\n Boolean(options.password) ||\n Boolean(options.privateKey) ||\n Boolean(options.privateKeyFile) ||\n Boolean(options.agent) ||\n Boolean(process.env.SSH_AUTH_SOCK);\n\n if (!hasAuthentication) {\n throw new ValidationError(\n \"Authentication is required. Provide a password, private key, private key file, or SSH agent.\"\n );\n }\n}\n\nexport async function validateUploadOptions(options: UploadOptions): Promise<void> {\n if (!options.localPath) {\n throw new ValidationError(\"Missing localPath.\");\n }\n if (!options.remotePath) {\n throw new ValidationError(\"Missing remotePath.\");\n }\n assertRemotePath(options.remotePath, \"remotePath\");\n validateTimeout(options.timeout);\n await assertLocalPathExists(options.localPath);\n\n if (!options.dryRun) {\n await validateServerOptions(options);\n }\n}\n\nexport async function validateDownloadOptions(options: DownloadOptions): Promise<void> {\n if (!options.remotePath) {\n throw new ValidationError(\"Missing remotePath.\");\n }\n if (!options.localPath) {\n throw new ValidationError(\"Missing localPath.\");\n }\n assertRemotePath(options.remotePath, \"remotePath\");\n validateTimeout(options.timeout);\n await assertDownloadDestination(options.localPath, options.createDirectories);\n\n if (!options.dryRun) {\n await validateServerOptions(options);\n }\n}\n","import { ScpNextClientImpl } from \"./client.js\";\nimport type { DownloadOptions } from \"../types/index.js\";\n\nexport async function download(options: DownloadOptions): Promise<void> {\n const client = new ScpNextClientImpl(options);\n try {\n await client.download(options.remotePath, options.localPath, options);\n } finally {\n await client.close();\n }\n}\n","import { ScpNextClientImpl } from \"./client.js\";\nimport type { UploadOptions } from \"../types/index.js\";\n\nexport async function upload(options: UploadOptions): Promise<void> {\n const client = new ScpNextClientImpl(options);\n try {\n await client.upload(options.localPath, options.remotePath, options);\n } finally {\n await client.close();\n }\n}\n","import { Command } from \"commander\";\n\nimport { assertSourceDestination } from \"../operands.js\";\nimport type { Output } from \"../output.js\";\nimport {\n addTransferOptions,\n executeResolvedTransfer,\n resolveForCli,\n type RawCommandOptions,\n type TransferHandlers\n} from \"./shared.js\";\n\nexport function createDownloadCommand(handlers: TransferHandlers, output: Output, cwd: string): Command {\n const command = new Command(\"download\")\n .description(\"Download a remote source path to a local destination path\")\n .usage(\"<source> <destination> [options]\")\n .argument(\"[source]\", \"Remote file or directory path\")\n .argument(\"[destination]\", \"Local file or directory\")\n .action(async (source: string | undefined, destination: string | undefined, options: RawCommandOptions) => {\n assertSourceDestination(\"download\", source, destination);\n const resolved = await resolveForCli({\n operation: \"download\",\n source,\n destination,\n options,\n cwd\n });\n await executeResolvedTransfer(resolved, handlers, output, options);\n });\n\n addTransferOptions(command);\n return command;\n}\n","import { ValidationError } from \"../errors/index.js\";\nimport type { TransferOperation } from \"../types/index.js\";\n\nexport function usageFor(operation: TransferOperation): string {\n return `scp-next ${operation} <source> <destination> [options]`;\n}\n\nexport function assertSourceDestination(\n operation: TransferOperation,\n source?: string,\n destination?: string\n): asserts source is string {\n if (!source) {\n throw new ValidationError(`Missing source path.\\n\\nUsage:\\n ${usageFor(operation)}`);\n }\n if (!destination) {\n throw new ValidationError(`Missing destination path.\\n\\nUsage:\\n ${usageFor(operation)}`);\n }\n}\n","import { Option } from \"commander\";\n\nimport { readEnvironment } from \"../../config/environment.js\";\nimport { loadConfig } from \"../../config/load-config.js\";\nimport {\n resolveTransferConfig,\n type CliTransferOptions\n} from \"../../config/resolve-config.js\";\nimport type { Output } from \"../output.js\";\nimport { createProgressReporter, verbosePlan, writeDryRun } from \"../output.js\";\nimport type {\n DownloadOptions,\n ResolvedTransferConfig,\n TransferOperation,\n UploadOptions\n} from \"../../types/index.js\";\n\nexport interface RawCommandOptions {\n host?: string;\n port?: number;\n username?: string;\n password?: string;\n privateKey?: string;\n privateKeyFile?: string;\n passphrase?: string;\n config?: string;\n profile?: string;\n recursive?: boolean;\n overwrite?: boolean;\n createDirectories?: boolean;\n dryRun?: boolean;\n timeout?: number;\n verbose?: boolean;\n quiet?: boolean;\n}\n\nexport interface TransferHandlers {\n upload(options: UploadOptions): Promise<void>;\n download(options: DownloadOptions): Promise<void>;\n}\n\nexport function addTransferOptions(command: { option: (flags: string, description: string) => unknown; addOption: (option: Option) => unknown }) {\n command.option(\"--host <host>\", \"SSH server host\");\n command.addOption(new Option(\"--port <port>\", \"SSH server port\").argParser(parseInteger));\n command.option(\"--username <username>\", \"SSH username\");\n command.option(\"--password <password>\", \"SSH password (prefer environment variables or key files)\");\n command.option(\"--private-key <privateKey>\", \"Private-key content\");\n command.option(\"--private-key-file <privateKeyFile>\", \"Private-key file path\");\n command.option(\"--passphrase <passphrase>\", \"Private-key passphrase\");\n command.option(\"--config <path>\", \"Configuration file path\");\n command.option(\"--profile <name>\", \"Named server profile\");\n command.option(\"--recursive\", \"Transfer directories recursively\");\n command.option(\"--overwrite\", \"Overwrite existing destination files\");\n command.option(\"--create-directories\", \"Create missing destination directories\");\n command.option(\"--dry-run\", \"Resolve and validate without connecting or transferring\");\n command.addOption(new Option(\"--timeout <milliseconds>\", \"Connection/operation timeout\").argParser(parseInteger));\n command.option(\"--verbose\", \"Print verbose diagnostic output\");\n command.option(\"--quiet\", \"Disable progress and non-error output\");\n return command;\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(\"Expected a number.\");\n }\n return parsed;\n}\n\nfunction toCliOptions(options: RawCommandOptions): CliTransferOptions {\n return {\n host: options.host,\n port: options.port,\n username: options.username,\n password: options.password,\n privateKey: options.privateKey,\n privateKeyFile: options.privateKeyFile,\n passphrase: options.passphrase,\n profile: options.profile,\n recursive: options.recursive,\n overwrite: options.overwrite,\n createDirectories: options.createDirectories,\n dryRun: options.dryRun,\n timeout: options.timeout\n };\n}\n\nexport async function resolveForCli(input: {\n operation?: TransferOperation | undefined;\n source?: string | undefined;\n destination?: string | undefined;\n jobName?: string | undefined;\n options: RawCommandOptions;\n cwd: string;\n}): Promise<ResolvedTransferConfig> {\n const loaded = await loadConfig(input.options.config, input.cwd);\n return resolveTransferConfig({\n operation: input.operation,\n source: input.source,\n destination: input.destination,\n jobName: input.jobName,\n cli: toCliOptions(input.options),\n env: readEnvironment(),\n config: loaded.config,\n configDirectory: loaded.directory,\n cwd: input.cwd\n });\n}\n\nexport async function executeResolvedTransfer(\n config: ResolvedTransferConfig,\n handlers: TransferHandlers,\n output: Output,\n commandOptions: RawCommandOptions\n): Promise<void> {\n if (commandOptions.verbose) {\n verbosePlan(output, config);\n }\n\n if (config.dryRun) {\n if (!commandOptions.quiet) {\n writeDryRun(output, config);\n }\n return;\n }\n\n const onProgress = createProgressReporter(output, commandOptions.quiet);\n\n if (config.operation === \"upload\") {\n const uploadOptions: UploadOptions = {\n ...config,\n localPath: config.source,\n remotePath: config.destination\n };\n if (onProgress) uploadOptions.onProgress = onProgress;\n await handlers.upload(uploadOptions);\n return;\n }\n\n const downloadOptions: DownloadOptions = {\n ...config,\n remotePath: config.source,\n localPath: config.destination\n };\n if (onProgress) downloadOptions.onProgress = onProgress;\n await handlers.download(downloadOptions);\n}\n","import type { ScpServerOptions } from \"../types/index.js\";\n\nexport interface EnvironmentConfig extends ScpServerOptions {\n profile?: string;\n}\n\nfunction parseInteger(value: string | undefined, name: string): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`${name} must be a number.`);\n }\n return parsed;\n}\n\nexport function readEnvironment(\n env: NodeJS.ProcessEnv = process.env\n): EnvironmentConfig {\n const result: EnvironmentConfig = {};\n\n if (env.SCP_NEXT_HOST) result.host = env.SCP_NEXT_HOST;\n if (env.SCP_NEXT_PORT) {\n const port = parseInteger(env.SCP_NEXT_PORT, \"SCP_NEXT_PORT\");\n if (port !== undefined) result.port = port;\n }\n if (env.SCP_NEXT_USERNAME) result.username = env.SCP_NEXT_USERNAME;\n if (env.SCP_NEXT_PASSWORD) result.password = env.SCP_NEXT_PASSWORD;\n if (env.SCP_NEXT_PRIVATE_KEY) result.privateKey = env.SCP_NEXT_PRIVATE_KEY;\n if (env.SCP_NEXT_PRIVATE_KEY_FILE) result.privateKeyFile = env.SCP_NEXT_PRIVATE_KEY_FILE;\n if (env.SCP_NEXT_PASSPHRASE) result.passphrase = env.SCP_NEXT_PASSPHRASE;\n if (env.SCP_NEXT_TIMEOUT) {\n const timeout = parseInteger(env.SCP_NEXT_TIMEOUT, \"SCP_NEXT_TIMEOUT\");\n if (timeout !== undefined) result.timeout = timeout;\n }\n if (env.SCP_NEXT_PROFILE) result.profile = env.SCP_NEXT_PROFILE;\n\n return result;\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { ConfigurationError } from \"../errors/index.js\";\nimport type { ScpNextConfig } from \"../types/index.js\";\nimport { resolveLocalPath } from \"../paths/local-path.js\";\n\nexport const CONFIG_FILENAMES = [\"scp-next.config.json\", \".scp-nextrc\", \".scp-nextrc.json\"] as const;\n\nconst serverSchema = z.object({\n host: z.string().optional(),\n port: z.number().int().optional(),\n username: z.string().optional(),\n password: z.string().optional(),\n privateKey: z.string().optional(),\n privateKeyFile: z.string().optional(),\n passphrase: z.string().optional(),\n agent: z.string().optional(),\n timeout: z.number().int().optional(),\n hostFingerprint: z.string().optional(),\n knownHostsFile: z.string().optional()\n});\n\nconst transferSchema = z.object({\n recursive: z.boolean().optional(),\n overwrite: z.boolean().optional(),\n createDirectories: z.boolean().optional(),\n dryRun: z.boolean().optional(),\n timeout: z.number().int().optional()\n});\n\nconst jobSchema = transferSchema.extend({\n operation: z.enum([\"upload\", \"download\"]),\n profile: z.string().optional(),\n source: z.string(),\n destination: z.string()\n});\n\nconst configSchema = serverSchema\n .extend({\n defaultProfile: z.string().optional(),\n server: serverSchema.optional(),\n transfer: transferSchema.optional(),\n profiles: z.record(serverSchema).optional(),\n jobs: z.record(jobSchema).optional()\n })\n .passthrough();\n\nexport interface LoadedConfig {\n config: ScpNextConfig;\n path?: string;\n directory: string;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function findConfigFile(cwd = process.cwd()): Promise<string | undefined> {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = path.resolve(cwd, filename);\n if (await fileExists(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\nexport async function loadConfig(\n explicitPath?: string,\n cwd = process.cwd()\n): Promise<LoadedConfig> {\n const configPath = explicitPath ? resolveLocalPath(explicitPath, cwd) : await findConfigFile(cwd);\n\n if (!configPath) {\n return { config: {}, directory: cwd };\n }\n\n let raw: string;\n try {\n raw = await readFile(configPath, \"utf8\");\n } catch (error) {\n throw new ConfigurationError(`Unable to read configuration file: ${configPath}`, {\n cause: error,\n context: { path: configPath }\n });\n }\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n const result = configSchema.safeParse(parsed);\n if (!result.success) {\n throw new ConfigurationError(`Invalid configuration file: ${result.error.message}`, {\n context: { path: configPath }\n });\n }\n\n return {\n config: result.data,\n path: configPath,\n directory: path.dirname(configPath)\n };\n } catch (error) {\n if (error instanceof ConfigurationError) {\n throw error;\n }\n throw new ConfigurationError(`Invalid JSON in configuration file: ${configPath}`, {\n cause: error,\n context: { path: configPath }\n });\n }\n}\n","import path from \"node:path\";\n\nimport { selectJob } from \"./jobs.js\";\nimport { selectProfile } from \"./profiles.js\";\nimport type { EnvironmentConfig } from \"./environment.js\";\nimport type {\n ResolvedTransferConfig,\n ScpNextConfig,\n ScpServerOptions,\n TransferJob,\n TransferOperation,\n TransferOptions\n} from \"../types/index.js\";\nimport { resolveLocalPath } from \"../paths/local-path.js\";\n\nexport interface CliTransferOptions extends ScpServerOptions, Omit<TransferOptions, \"onProgress\"> {\n profile?: string | undefined;\n}\n\nexport interface ResolveTransferInput {\n operation?: TransferOperation | undefined;\n source?: string | undefined;\n destination?: string | undefined;\n cli?: CliTransferOptions | undefined;\n env?: EnvironmentConfig | undefined;\n config?: ScpNextConfig | undefined;\n configDirectory?: string | undefined;\n cwd?: string | undefined;\n jobName?: string | undefined;\n}\n\nconst DEFAULT_TRANSFER: Omit<ResolvedTransferConfig, \"operation\" | \"source\" | \"destination\"> = {\n port: 22,\n recursive: false,\n overwrite: false,\n createDirectories: false,\n dryRun: false\n};\n\nfunction assignDefined<T extends object>(target: T, source: object | undefined): T {\n if (!source) {\n return target;\n }\n\n for (const [key, value] of Object.entries(source as Record<string, unknown>)) {\n if (value !== undefined) {\n Object.assign(target, { [key]: value });\n }\n }\n\n return target;\n}\n\nfunction rootServer(config: ScpNextConfig): ScpServerOptions {\n const result: ScpServerOptions = {};\n assignDefined(result, config.server);\n assignDefined(result, {\n host: config.host,\n port: config.port,\n username: config.username,\n password: config.password,\n privateKey: config.privateKey,\n privateKeyFile: config.privateKeyFile,\n passphrase: config.passphrase,\n agent: config.agent,\n timeout: config.timeout,\n hostFingerprint: config.hostFingerprint,\n knownHostsFile: config.knownHostsFile\n });\n return result;\n}\n\nfunction jobTransfer(job: TransferJob | undefined): Omit<TransferOptions, \"onProgress\"> {\n const result: Omit<TransferOptions, \"onProgress\"> = {};\n if (!job) {\n return result;\n }\n return assignDefined(result, {\n recursive: job.recursive,\n overwrite: job.overwrite,\n createDirectories: job.createDirectories,\n dryRun: job.dryRun,\n timeout: job.timeout\n });\n}\n\nfunction resolveConfigRelatedPaths(\n resolved: ResolvedTransferConfig,\n operation: TransferOperation,\n configDirectory: string\n): ResolvedTransferConfig {\n const next = { ...resolved };\n\n if (next.privateKeyFile && !next.privateKeyFile.startsWith(\"~\")) {\n next.privateKeyFile = path.isAbsolute(next.privateKeyFile)\n ? next.privateKeyFile\n : resolveLocalPath(next.privateKeyFile, configDirectory);\n }\n\n if (next.knownHostsFile && !next.knownHostsFile.startsWith(\"~\")) {\n next.knownHostsFile = path.isAbsolute(next.knownHostsFile)\n ? next.knownHostsFile\n : resolveLocalPath(next.knownHostsFile, configDirectory);\n }\n\n if (operation === \"upload\" && !next.source.startsWith(\"~\")) {\n next.source = path.isAbsolute(next.source)\n ? next.source\n : resolveLocalPath(next.source, configDirectory);\n }\n\n if (operation === \"download\" && !next.destination.startsWith(\"~\")) {\n next.destination = path.isAbsolute(next.destination)\n ? next.destination\n : resolveLocalPath(next.destination, configDirectory);\n }\n\n return next;\n}\n\nexport function resolveTransferConfig(input: ResolveTransferInput): ResolvedTransferConfig {\n const config = input.config ?? {};\n const env = input.env ?? {};\n const cli = input.cli ?? {};\n const configDirectory = input.configDirectory ?? process.cwd();\n const cwd = input.cwd ?? process.cwd();\n const job = input.jobName ? selectJob(config, input.jobName) : undefined;\n const operation = input.operation ?? job?.operation;\n\n if (!operation) {\n throw new Error(\"Transfer operation is required.\");\n }\n\n const selectedProfileName =\n cli.profile ?? env.profile ?? job?.profile ?? config.defaultProfile;\n const profile = selectProfile(config, selectedProfileName);\n\n const resolved: ResolvedTransferConfig = {\n ...DEFAULT_TRANSFER,\n operation,\n source: job?.source ?? \"\",\n destination: job?.destination ?? \"\"\n };\n\n assignDefined(resolved, jobTransfer(job));\n assignDefined(resolved, config.transfer);\n assignDefined(resolved, rootServer(config));\n assignDefined(resolved, profile);\n assignDefined(resolved, {\n host: env.host,\n port: env.port,\n username: env.username,\n password: env.password,\n privateKey: env.privateKey,\n privateKeyFile: env.privateKeyFile,\n passphrase: env.passphrase,\n timeout: env.timeout\n });\n assignDefined(resolved, {\n source: input.source,\n destination: input.destination\n });\n assignDefined(resolved, cli);\n\n if (selectedProfileName) {\n resolved.profile = selectedProfileName;\n }\n\n const pathResolved = resolveConfigRelatedPaths(resolved, operation, configDirectory);\n\n if (input.source && operation === \"upload\") {\n pathResolved.source = resolveLocalPath(input.source, cwd);\n }\n\n if (input.destination && operation === \"download\") {\n pathResolved.destination = resolveLocalPath(input.destination, cwd);\n }\n\n return pathResolved;\n}\n","import { ConfigurationError } from \"../errors/index.js\";\nimport type { ScpNextConfig, TransferJob } from \"../types/index.js\";\n\nexport function selectJob(config: ScpNextConfig, jobName: string): TransferJob {\n const job = config.jobs?.[jobName];\n if (!job) {\n throw new ConfigurationError(`Unknown job: ${jobName}`, {\n context: { job: jobName }\n });\n }\n return job;\n}\n","import { ConfigurationError } from \"../errors/index.js\";\nimport type { ScpNextConfig, ScpServerOptions } from \"../types/index.js\";\n\nexport function selectProfile(\n config: ScpNextConfig,\n profileName?: string\n): ScpServerOptions | undefined {\n if (!profileName) {\n return undefined;\n }\n\n const profile = config.profiles?.[profileName];\n if (!profile) {\n throw new ConfigurationError(`Unknown profile: ${profileName}`, {\n context: { profile: profileName }\n });\n }\n\n return profile;\n}\n","import type { ResolvedTransferConfig, TransferProgress } from \"../types/index.js\";\nimport { redactSensitiveValues } from \"../security/redact.js\";\n\nexport interface Output {\n stdout: NodeJS.WritableStream & { isTTY?: boolean };\n stderr: NodeJS.WritableStream & { isTTY?: boolean };\n}\n\nexport function writeDryRun(output: Output, config: ResolvedTransferConfig): void {\n const destination =\n config.operation === \"upload\"\n ? `${config.username ?? \"user\"}@${config.host ?? \"host\"}:${config.destination}`\n : config.destination;\n\n output.stdout.write(`Dry run: ${config.operation}\\n`);\n output.stdout.write(`Source: ${config.source}\\n`);\n output.stdout.write(`Destination: ${destination}\\n`);\n output.stdout.write(`Recursive: ${config.recursive ? \"yes\" : \"no\"}\\n`);\n output.stdout.write(`Overwrite: ${config.overwrite ? \"yes\" : \"no\"}\\n`);\n}\n\nexport function createProgressReporter(\n output: Output,\n quiet?: boolean\n): ((progress: TransferProgress) => void) | undefined {\n if (quiet || !output.stderr.isTTY) {\n return undefined;\n }\n\n return (progress) => {\n const total = progress.totalBytes ? formatBytes(progress.totalBytes) : \"?\";\n const transferred = formatBytes(progress.transferredBytes);\n const percentage = progress.percentage === undefined ? \"\" : ` (${progress.percentage}%)`;\n const currentFile = progress.currentFile ? `: ${progress.currentFile}` : \"\";\n output.stderr.write(`\\r${progress.operation === \"upload\" ? \"Uploading\" : \"Downloading\"}${currentFile}\\n`);\n output.stderr.write(`${transferred} / ${total}${percentage}\\n`);\n };\n}\n\nexport function verbosePlan(output: Output, config: ResolvedTransferConfig): void {\n output.stderr.write(\n `${JSON.stringify(\n redactSensitiveValues({\n operation: config.operation,\n host: config.host,\n port: config.port,\n username: config.username,\n source: config.source,\n destination: config.destination,\n recursive: config.recursive,\n overwrite: config.overwrite,\n createDirectories: config.createDirectories,\n dryRun: config.dryRun\n }),\n null,\n 2\n )}\\n`\n );\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value.toFixed(1)} ${units[unitIndex]}`;\n}\n","import { Command } from \"commander\";\n\nimport type { Output } from \"../output.js\";\nimport {\n addTransferOptions,\n executeResolvedTransfer,\n resolveForCli,\n type RawCommandOptions,\n type TransferHandlers\n} from \"./shared.js\";\n\nexport function createRunCommand(handlers: TransferHandlers, output: Output, cwd: string): Command {\n const command = new Command(\"run\")\n .description(\"Run a configured transfer job\")\n .usage(\"<job> [source] [destination] [options]\")\n .argument(\"<job>\", \"Configured job name\")\n .argument(\"[source]\", \"Optional source override\")\n .argument(\"[destination]\", \"Optional destination override\")\n .action(\n async (\n jobName: string,\n source: string | undefined,\n destination: string | undefined,\n options: RawCommandOptions\n ) => {\n const resolved = await resolveForCli({\n source,\n destination,\n jobName,\n options,\n cwd\n });\n await executeResolvedTransfer(resolved, handlers, output, options);\n }\n );\n\n addTransferOptions(command);\n return command;\n}\n","import { Command } from \"commander\";\n\nimport { assertSourceDestination } from \"../operands.js\";\nimport type { Output } from \"../output.js\";\nimport {\n addTransferOptions,\n executeResolvedTransfer,\n resolveForCli,\n type RawCommandOptions,\n type TransferHandlers\n} from \"./shared.js\";\n\nexport function createUploadCommand(handlers: TransferHandlers, output: Output, cwd: string): Command {\n const command = new Command(\"upload\")\n .description(\"Upload a local source path to a remote destination path\")\n .usage(\"<source> <destination> [options]\")\n .argument(\"[source]\", \"Local file or directory\")\n .argument(\"[destination]\", \"Remote file or directory path\")\n .action(async (source: string | undefined, destination: string | undefined, options: RawCommandOptions) => {\n assertSourceDestination(\"upload\", source, destination);\n const resolved = await resolveForCli({\n operation: \"upload\",\n source,\n destination,\n options,\n cwd\n });\n await executeResolvedTransfer(resolved, handlers, output, options);\n });\n\n addTransferOptions(command);\n return command;\n}\n"],"mappings":";;;AAAA,SAAS,WAAAA,UAAS,sBAAsB;;;ACAxC,SAAS,UAAAC,SAAQ,SAAAC,cAAa;AAC9B,OAAOC,WAAU;;;ACDjB,SAAS,YAAAC,iBAAgB;AAEzB,OAAO,gBAAgB;;;ACFvB,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,sBACJ;AAEF,SAAS,eAAe,KAAsB;AAC5C,QAAM,aAAa,IAAI,QAAQ,WAAW,EAAE,EAAE,YAAY;AAC1D,SAAO,eAAe,KAAK,CAAC,cAAc,WAAW,SAAS,SAAS,CAAC;AAC1E;AAEO,SAAS,sBAAsB,OAAyB;AAC7D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,QAAQ,qBAAqB,YAAY;AAAA,EACxD;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,WAAsB,MAAM,IAAI,CAAC,SAAkB,sBAAsB,IAAI,CAAC;AACpF,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,WAAoC,CAAC;AAC3C,eAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,eAAS,GAAG,IAAI,eAAe,GAAG,IAAI,eAAe,sBAAsB,WAAW;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAwB;AACzD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,OAAO,sBAAsB,MAAM,OAAO,CAAC;AAAA,EACpD;AACA,SAAO,OAAO,sBAAsB,KAAK,CAAC;AAC5C;;;AC3BO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,UAA+B,CAAC,GAAG;AAC9D,UAAM,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AACvC,SAAK,OAAO,WAAW;AACvB,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,UAAU,sBAAsB,QAAQ,WAAW,CAAC,CAAC;AAAA,EAC5D;AACF;AAEO,IAAM,qBAAN,cAAiC,aAAa;AAAA,EACnD,YAAY,SAAiB,UAA6C,CAAC,GAAG;AAC5E,UAAM,SAAS,EAAE,GAAG,SAAS,MAAM,+BAA+B,CAAC;AAAA,EACrE;AACF;AAEO,IAAM,kBAAN,cAA8B,aAAa;AAAA,EAChD,YAAY,SAAiB,UAA6C,CAAC,GAAG;AAC5E,UAAM,SAAS,EAAE,GAAG,SAAS,MAAM,4BAA4B,CAAC;AAAA,EAClE;AACF;AAEO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EACpD,YAAY,SAAiB,UAA6C,CAAC,GAAG;AAC5E,UAAM,SAAS,EAAE,GAAG,SAAS,MAAM,gCAAgC,CAAC;AAAA,EACtE;AACF;AAEO,IAAM,kBAAN,cAA8B,aAAa;AAAA,EAChD,YAAY,SAAiB,UAA6C,CAAC,GAAG;AAC5E,UAAM,SAAS,EAAE,GAAG,SAAS,MAAM,4BAA4B,CAAC;AAAA,EAClE;AACF;AAEO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC9C,YAAY,SAAiB,UAA6C,CAAC,GAAG;AAC5E,UAAM,SAAS,EAAE,GAAG,SAAS,MAAM,0BAA0B,CAAC;AAAA,EAChE;AACF;AAEO,IAAM,kBAAN,cAA8B,aAAa;AAAA,EAChD,YAAY,SAAiB,UAA6C,CAAC,GAAG;AAC5E,UAAM,SAAS,EAAE,GAAG,SAAS,MAAM,4BAA4B,CAAC;AAAA,EAClE;AACF;AAEO,IAAM,wBAAN,cAAoC,aAAa;AAAA,EACtD,YAAY,SAAiB,UAA6C,CAAC,GAAG;AAC5E,UAAM,SAAS,EAAE,GAAG,SAAS,MAAM,mCAAmC,CAAC;AAAA,EACzE;AACF;AAEO,SAAS,eAAe,OAA8B;AAC3D,MAAI,iBAAiB,cAAc;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,QAAM,eAAe,QAAQ,YAAY;AAEzC,MAAI,aAAa,SAAS,gBAAgB,KAAK,aAAa,SAAS,mBAAmB,GAAG;AACzF,WAAO,IAAI,oBAAoB,8BAA8B,EAAE,OAAO,MAAM,CAAC;AAAA,EAC/E;AAEA,MAAI,aAAa,SAAS,mBAAmB,KAAK,aAAa,SAAS,UAAU,GAAG;AACnF,WAAO,IAAI,sBAAsB,iCAAiC,EAAE,OAAO,MAAM,CAAC;AAAA,EACpF;AAEA,MACE,aAAa,SAAS,WAAW,KACjC,aAAa,SAAS,YAAY,KAClC,aAAa,SAAS,OAAO,GAC7B;AACA,WAAO,IAAI,gBAAgB,0BAA0B,EAAE,OAAO,MAAM,CAAC;AAAA,EACvE;AAEE,SAAO,IAAI,cAAc,OAAO,sBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,MAAM,CAAC;AACrF;;;ACjGA,SAAS,kBAAkB;AAC3B,SAAS,UAAAC,SAAQ,gBAAgB;;;ACDjC,SAAS,iBAAiB;AAC1B,SAAS,QAAQ,OAAO,YAAY;AACpC,OAAO,QAAQ;AACf,OAAO,UAAU;AAIV,SAAS,WAAW,WAA2B;AACpD,MAAI,cAAc,KAAK;AACrB,WAAO,GAAG,QAAQ;AAAA,EACpB;AACA,MAAI,UAAU,WAAW,IAAI,KAAK,GAAG,EAAE,KAAK,UAAU,WAAW,IAAI,GAAG;AACtE,WAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,MAAM,CAAC,CAAC;AAAA,EACnD;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,WAAmB,UAAU,QAAQ,IAAI,GAAW;AACnF,QAAM,WAAW,WAAW,SAAS;AACrC,SAAO,KAAK,WAAW,QAAQ,IAAI,KAAK,UAAU,QAAQ,IAAI,KAAK,QAAQ,SAAS,QAAQ;AAC9F;AAEA,eAAsB,sBAAsB,WAAkC;AAC5E,MAAI;AACF,UAAM,OAAO,iBAAiB,SAAS,GAAG,UAAU,IAAI;AAAA,EAC1D,SAAS,OAAO;AACd,UAAM,IAAI,gBAAgB,8BAA8B,SAAS,IAAI;AAAA,MACnE,OAAO;AAAA,MACP,SAAS,EAAE,MAAM,UAAU;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAaA,eAAsB,0BAA0B,WAAmB,oBAAoB,OAAO;AAC5F,QAAM,WAAW,iBAAiB,SAAS;AAC3C,QAAM,SAAS,KAAK,QAAQ,QAAQ;AAEpC,MAAI,mBAAmB;AACrB,UAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,OAAO,QAAQ,UAAU,IAAI;AAAA,EACrC,SAAS,OAAO;AACd,UAAM,IAAI,gBAAgB,+DAA+D,MAAM,IAAI;AAAA,MACjG,OAAO;AAAA,MACP,SAAS,EAAE,MAAM,UAAU;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,iBAAiB,WAAkD;AACvF,QAAM,QAAQ,MAAM,KAAK,iBAAiB,SAAS,CAAC;AACpD,MAAI,MAAM,YAAY,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO;AAAA,EACT;AACA,QAAM,IAAI,gBAAgB,2CAA2C,SAAS,IAAI;AAAA,IAChF,SAAS,EAAE,MAAM,UAAU;AAAA,EAC7B,CAAC;AACH;;;ADpEA,SAAS,qBAAqB,aAA6B;AACzD,SAAO,YACJ,KAAK,EACL,QAAQ,aAAa,EAAE,EACvB,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,EAAE;AACvB;AAEO,SAAS,mBAAmB,QAAgB,UAA2B;AAC5E,SAAO,qBAAqB,MAAM,MAAM,qBAAqB,QAAQ;AACvE;AAQA,eAAsB,2BACpB,SACsB;AACtB,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,iBAAiB,QAAQ,kBAAkB;AAEjD,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,sBAAsB,+CAA+C;AAAA,EACjF;AAEA,MAAI,QAAQ,iBAAiB;AAC3B,iBAAa,IAAI,qBAAqB,QAAQ,eAAe,CAAC;AAAA,EAChE;AAEA,MAAI;AACF,UAAMC,QAAO,WAAW,cAAc,CAAC;AACvC,UAAM,UAAU,MAAM,SAAS,WAAW,cAAc,GAAG,MAAM;AACjE,eAAW,QAAQ,QAAQ,MAAM,OAAO,GAAG;AACzC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AAClE;AAAA,MACF;AAEA,YAAM,CAAC,OAAO,WAAW,GAAG,IAAI,QAAQ,MAAM,KAAK;AACnD,UAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,MAAM,GAAG,EAAE,SAAS,QAAQ,IAAI,GAAG;AAC5E;AAAA,MACF;AAEA,YAAM,cAAc,WAAW,QAAQ,EACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,EACjC,OAAO,QAAQ,EACf,QAAQ,QAAQ,EAAE;AACrB,mBAAa,IAAI,WAAW;AAAA,IAC9B;AAAA,EACF,SAAS,OAAO;AACd,QAAI,QAAQ,kBAAkB,CAAC,QAAQ,iBAAiB;AACtD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,EAAE,OAAO,OAAO,SAAS,EAAE,eAAe,EAAE;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,qBAAkC;AACnE,SAAO,CAAC,cAA+B;AACrC,eAAW,YAAY,qBAAqB;AAC1C,UAAI,mBAAmB,WAAW,QAAQ,GAAG;AAC3C,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AHzCA,SAAS,iBAAiB,MAAgC;AACxD,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,EACb;AACF;AAEO,IAAM,oBAAN,MAAiD;AAAA,EACrC;AAAA,EAEjB,YAAY,OAAO,YAAY;AAC7B,SAAK,SAAS,IAAI,WAAW,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,QAAQ,SAA0C;AACtD,UAAM,sBAAsB,MAAM,2BAA2B,OAAO;AACpE,UAAM,eAAe,mBAAmB,mBAAmB;AAE3D,UAAM,iBAAqC,CAAC;AAC5C,QAAI,QAAQ,SAAS,OAAW,gBAAe,OAAO,QAAQ;AAC9D,QAAI,QAAQ,SAAS,OAAW,gBAAe,OAAO,QAAQ;AAC9D,QAAI,QAAQ,aAAa,OAAW,gBAAe,WAAW,QAAQ;AACtE,QAAI,QAAQ,aAAa,OAAW,gBAAe,WAAW,QAAQ;AACtE,QAAI,QAAQ,eAAe,QAAW;AACpC,qBAAe,aAAa,QAAQ;AAAA,IACtC,WAAW,QAAQ,gBAAgB;AACjC,qBAAe,aAAa,MAAMC,UAAS,WAAW,QAAQ,cAAc,GAAG,MAAM;AAAA,IACvF;AACA,QAAI,QAAQ,eAAe,OAAW,gBAAe,aAAa,QAAQ;AAC1E,UAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAC3C,QAAI,UAAU,QAAW;AACvB,qBAAe,QAAQ;AAAA,IACzB;AACA,QAAI,QAAQ,YAAY,OAAW,gBAAe,eAAe,QAAQ;AACzE,QAAI,cAAc;AAChB,qBAAe,WAAW;AAC1B,qBAAe,eAAe;AAAA,IAChC;AAEA,QAAI;AACF,YAAM,KAAK,OAAO,QAAQ,cAAc;AAAA,IAC1C,SAAS,OAAO;AACd,YAAM,YAAY,eAAe,KAAK;AACtC,UAAI,qBAAqB,uBAAuB;AAC9C,cAAM;AAAA,MACR;AACA,YAAM,IAAI,gBAAgB,oCAAoC;AAAA,QAC5D,OAAO;AAAA,QACP,SAAS;AAAA,UACP,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ;AAAA,UACd,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,OAAO,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,OAAO,YAAsD;AACjE,WAAO,KAAK,OAAO,OAAO,UAAU;AAAA,EACtC;AAAA,EAEA,MAAM,MAAM,YAAoB,YAAY,MAAqB;AAC/D,UAAM,KAAK,OAAO,MAAM,YAAY,SAAS;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAK,YAA+C;AACxD,UAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,UAAU;AAC/C,WAAO,MAAM,IAAI,gBAAgB;AAAA,EACnC;AAAA,EAEA,MAAM,WACJ,WACA,YACA,QACe;AACf,QAAI;AACF,YAAM,KAAK,OAAO,QAAQ,WAAW,YAAY,KAAK,gBAAgB,MAAM,CAAC;AAAA,IAC/E,SAAS,OAAO;AACd,YAAM,IAAI,cAAc,qBAAqB,SAAS,KAAK;AAAA,QACzD,OAAO;AAAA,QACP,SAAS,EAAE,WAAW,WAAW;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,YACA,WACA,QACe;AACf,QAAI;AACF,YAAM,KAAK,OAAO,QAAQ,YAAY,WAAW,KAAK,gBAAgB,MAAM,CAAC;AAAA,IAC/E,SAAS,OAAO;AACd,YAAM,IAAI,cAAc,uBAAuB,UAAU,KAAK;AAAA,QAC5D,OAAO;AAAA,QACP,SAAS,EAAE,YAAY,UAAU;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,gBAAgB,QAAwE;AAC9F,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,KAAK,kBAAkB,YAAY,YAAY;AAC7C,eAAO,EAAE,kBAAkB,YAAY,WAAW,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;;;AK/JA,SAAS,SAAS,QAAAC,aAAY;AAC9B,OAAOC,WAAU;;;ACDjB,OAAOC,WAAU;AAIV,SAAS,iBAAiB,WAAmB,QAAQ,eAAqB;AAC/E,MAAI,CAAC,aAAa,UAAU,KAAK,EAAE,WAAW,GAAG;AAC/C,UAAM,IAAI,gBAAgB,WAAW,KAAK,qCAAqC;AAAA,MAC7E,SAAS,EAAE,MAAM,UAAU;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEO,SAAS,oBAAoB,WAA2B;AAC7D,mBAAiB,SAAS;AAC1B,SAAOC,MAAK,MAAM,UAAU,UAAU,QAAQ,OAAO,GAAG,CAAC;AAC3D;AAEO,SAAS,cAAc,OAAyB;AACrD,QAAM,SAASA,MAAK,MAAM,KAAK,GAAG,KAAK;AACvC,mBAAiB,MAAM;AACvB,SAAO;AACT;AAEO,SAAS,cAAc,WAA2B;AACvD,mBAAiB,SAAS;AAC1B,SAAOA,MAAK,MAAM,QAAQ,SAAS;AACrC;;;ADbA,eAAsB,eAAe,UAA6C;AAChF,QAAM,eAAe,iBAAiB,QAAQ;AAC9C,QAAM,QAAQ,MAAMC,MAAK,YAAY;AAErC,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO;AAAA,MACL;AAAA,QACE,cAAc;AAAA,QACd,cAAcC,MAAK,SAAS,YAAY;AAAA,QACxC,MAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAA0B,CAAC;AAEjC,iBAAe,MAAM,WAAkC;AACrD,UAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,eAAW,SAAS,SAAS;AAC3B,YAAM,eAAeA,MAAK,KAAK,WAAW,MAAM,IAAI;AACpD,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,MAAM,YAAY;AAAA,MAC1B,WAAW,MAAM,OAAO,GAAG;AACzB,cAAM,aAAa,MAAMD,MAAK,YAAY;AAC1C,cAAM,KAAK;AAAA,UACT;AAAA,UACA,cAAcC,MAAK,SAAS,cAAc,YAAY;AAAA,UACtD,MAAM,WAAW;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,YAAY;AACxB,SAAO;AACT;AAQA,eAAsB,gBACpB,WACA,UAC4B;AAC5B,QAAM,cAAc,MAAM,UAAU,KAAK,QAAQ;AACjD,QAAM,QAA2B,CAAC;AAElC,iBAAe,MAAM,WAAmB,cAAsB,SAA0C;AACtG,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,WAAW,WAAW,MAAM,IAAI;AACjD,YAAM,eAAe,eAAe,WAAW,cAAc,MAAM,IAAI,IAAI,MAAM;AACjF,UAAI,MAAM,SAAS,KAAK;AACtB,cAAM,MAAM,UAAU,cAAc,MAAM,UAAU,KAAK,QAAQ,CAAC;AAAA,MACpE,WAAW,MAAM,SAAS,KAAK;AAC7B,cAAM,KAAK;AAAA,UACT,YAAY;AAAA,UACZ;AAAA,UACA,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,UAAU,IAAI,WAAW;AACrC,SAAO;AACT;;;AEjFA,SAAS,UAAAC,eAAc;AAOvB,SAAS,aAAa,MAAgC;AACpD,MAAI,SAAS,QAAW;AACtB;AAAA,EACF;AACA,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AACvD,UAAM,IAAI,gBAAgB,gDAAgD;AAAA,MACxE,SAAS,EAAE,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,SAAmC;AAC1D,MAAI,YAAY,QAAW;AACzB;AAAA,EACF;AACA,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC7C,UAAM,IAAI,gBAAgB,sCAAsC;AAAA,MAC9D,SAAS,EAAE,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,sBAAsB,SAA0C;AACpF,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,gBAAgB,mBAAmB;AAAA,EAC/C;AACA,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,IAAI,gBAAgB,uBAAuB;AAAA,EACnD;AAEA,eAAa,QAAQ,IAAI;AACzB,kBAAgB,QAAQ,OAAO;AAE/B,MAAI,QAAQ,gBAAgB;AAC1B,QAAI;AACF,YAAMC,QAAO,iBAAiB,QAAQ,cAAc,CAAC;AAAA,IACvD,SAAS,OAAO;AACd,YAAM,IAAI,gBAAgB,oCAAoC,QAAQ,cAAc,IAAI;AAAA,QACtF,OAAO;AAAA,QACP,SAAS,EAAE,gBAAgB,QAAQ,eAAe;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,oBACJ,QAAQ,QAAQ,QAAQ,KACxB,QAAQ,QAAQ,UAAU,KAC1B,QAAQ,QAAQ,cAAc,KAC9B,QAAQ,QAAQ,KAAK,KACrB,QAAQ,QAAQ,IAAI,aAAa;AAEnC,MAAI,CAAC,mBAAmB;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,sBAAsB,SAAuC;AACjF,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI,gBAAgB,oBAAoB;AAAA,EAChD;AACA,MAAI,CAAC,QAAQ,YAAY;AACvB,UAAM,IAAI,gBAAgB,qBAAqB;AAAA,EACjD;AACA,mBAAiB,QAAQ,YAAY,YAAY;AACjD,kBAAgB,QAAQ,OAAO;AAC/B,QAAM,sBAAsB,QAAQ,SAAS;AAE7C,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,sBAAsB,OAAO;AAAA,EACrC;AACF;AAEA,eAAsB,wBAAwB,SAAyC;AACrF,MAAI,CAAC,QAAQ,YAAY;AACvB,UAAM,IAAI,gBAAgB,qBAAqB;AAAA,EACjD;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI,gBAAgB,oBAAoB;AAAA,EAChD;AACA,mBAAiB,QAAQ,YAAY,YAAY;AACjD,kBAAgB,QAAQ,OAAO;AAC/B,QAAM,0BAA0B,QAAQ,WAAW,QAAQ,iBAAiB;AAE5E,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,sBAAsB,OAAO;AAAA,EACrC;AACF;;;ARrEA,SAAS,WAAW,kBAA0B,YAAyC;AACrF,MAAI,CAAC,cAAc,cAAc,GAAG;AAClC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,KAAK,KAAK,MAAO,mBAAmB,aAAc,GAAG,CAAC;AACxE;AAEA,SAAS,aACP,eACA,iBACsB;AACtB,SAAO,EAAE,GAAG,eAAe,GAAI,mBAAmB,CAAC,EAAG;AACxD;AAEO,IAAM,oBAAN,MAAiD;AAAA,EACrC;AAAA,EACA;AAAA,EACT,YAAY;AAAA,EAEpB,YAAY,eAAiC,eAA0C,CAAC,GAAG;AACzF,SAAK,gBAAgB;AACrB,SAAK,YAAY,aAAa,aAAa,IAAI,kBAAkB;AAAA,EACnE;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,sBAAsB,KAAK,aAAa;AAC9C,UAAM,KAAK,UAAU,QAAQ,KAAK,aAAa;AAC/C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,OACJ,WACA,YACA,UAA2B,CAAC,GACb;AACf,UAAM,gBAA+B;AAAA,MACnC,GAAG,aAAa,KAAK,eAAe,OAAO;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AACA,UAAM,sBAAsB,aAAa;AAEzC,QAAI,QAAQ,QAAQ;AAClB;AAAA,IACF;AAEA,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,oBAAoB,aAAa;AAAA,EAC9C;AAAA,EAEA,MAAM,SACJ,YACA,WACA,UAA2B,CAAC,GACb;AACf,UAAM,kBAAmC;AAAA,MACvC,GAAG,aAAa,KAAK,eAAe,OAAO;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AACA,UAAM,wBAAwB,eAAe;AAE7C,QAAI,QAAQ,QAAQ;AAClB;AAAA,IACF;AAEA,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,sBAAsB,eAAe;AAAA,EAClD;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,WAAW;AAClB,YAAM,KAAK,UAAU,MAAM;AAC3B,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,SAAuC;AACvE,UAAM,YAAY,MAAM,iBAAiB,QAAQ,SAAS;AAC1D,UAAM,aAAa,oBAAoB,QAAQ,UAAU;AAEzD,QAAI,cAAc,eAAe,CAAC,QAAQ,WAAW;AACnD,YAAM,IAAI,gBAAgB,gDAAgD;AAAA,IAC5E;AAEA,QAAI,cAAc,QAAQ;AACxB,YAAM,KAAK,mBAAmB,YAAY,QAAQ,iBAAiB;AACnE,YAAM,KAAK,sBAAsB,YAAY,QAAQ,SAAS;AAC9D,YAAMC,cAAa;AACnB,YAAM,KAAK,UAAU,WAAW,iBAAiB,QAAQ,SAAS,GAAG,YAAY,CAAC,SAAS;AACzF,gBAAQ,aAAa;AAAA,UACnB,WAAW;AAAA,UACX,QAAQ,QAAQ;AAAA,UAChB,aAAa,QAAQ;AAAA,UACrB,kBAAkB,KAAK;AAAA,UACvB,YAAY,KAAK,cAAcA;AAAA,UAC/B,YAAY,WAAW,KAAK,kBAAkB,KAAK,UAAU;AAAA,UAC7D,aAAa,QAAQ;AAAA,QACvB,CAAC;AAAA,MACH,CAAC;AACD;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,eAAe,QAAQ,SAAS;AACpD,UAAM,aAAa,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,MAAM,CAAC;AACjE,QAAI,iBAAiB;AACrB,QAAI,iBAAiB;AAErB,UAAM,oBAAoB,MAAM,KAAK,UAAU,OAAO,UAAU;AAChE,QAAI,qBAAqB,sBAAsB,KAAK;AAClD,YAAM,IAAI,cAAc,6DAA6D,UAAU,IAAI;AAAA,QACjG,SAAS,EAAE,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AACA,QAAI,CAAC,mBAAmB;AACtB,UAAI,CAAC,QAAQ,mBAAmB;AAC9B,cAAM,IAAI,cAAc,gDAAgD,UAAU,IAAI;AAAA,UACpF,SAAS,EAAE,WAAW;AAAA,QACxB,CAAC;AAAA,MACH;AACA,YAAM,KAAK,UAAU,MAAM,YAAY,IAAI;AAAA,IAC7C;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,kBAAkB,WAAW,YAAY,KAAK,aAAa,MAAMC,MAAK,GAAG,EAAE,KAAK,GAAG,CAAC;AAC1F,YAAM,KAAK,mBAAmB,iBAAiB,IAAI;AACnD,YAAM,KAAK,sBAAsB,iBAAiB,QAAQ,SAAS;AAEnE,YAAM,KAAK,UAAU,WAAW,KAAK,cAAc,iBAAiB,CAAC,SAAS;AAC5E,cAAM,mBAAmB,iBAAiB,KAAK;AAC/C,gBAAQ,aAAa;AAAA,UACnB,WAAW;AAAA,UACX,QAAQ,QAAQ;AAAA,UAChB,aAAa,QAAQ;AAAA,UACrB;AAAA,UACA;AAAA,UACA,YAAY,WAAW,kBAAkB,UAAU;AAAA,UACnD,aAAa,KAAK;AAAA,UAClB;AAAA,UACA,YAAY,MAAM;AAAA,QACpB,CAAC;AAAA,MACH,CAAC;AAED,wBAAkB,KAAK;AACvB,wBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,SAAyC;AAC3E,UAAM,aAAa,oBAAoB,QAAQ,UAAU;AACzD,UAAM,aAAa,MAAM,KAAK,UAAU,OAAO,UAAU;AAEzD,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,cAAc,+BAA+B,QAAQ,UAAU,IAAI;AAAA,QAC3E,SAAS,EAAE,YAAY,QAAQ,WAAW;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,QAAI,eAAe,KAAK;AACtB,UAAI,CAAC,QAAQ,WAAW;AACtB,cAAM,IAAI,gBAAgB,kDAAkD;AAAA,MAC9E;AACA,YAAM,KAAK,kBAAkB,OAAO;AACpC;AAAA,IACF;AAEA,UAAM,KAAK,mBAAmB,SAAS,UAAU;AAAA,EACnD;AAAA,EAEA,MAAc,mBAAmB,SAA0B,YAAmC;AAC5F,UAAM,YAAY,iBAAiB,QAAQ,SAAS;AACpD,UAAM,KAAK,qBAAqB,WAAW,QAAQ,SAAS;AAC5D,QAAI,QAAQ,mBAAmB;AAC7B,YAAMC,OAAMD,MAAK,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1D;AACA,UAAM,KAAK,UAAU,aAAa,YAAY,WAAW,CAAC,SAAS;AACjE,cAAQ,aAAa;AAAA,QACnB,WAAW;AAAA,QACX,QAAQ,QAAQ;AAAA,QAChB,aAAa,QAAQ;AAAA,QACrB,kBAAkB,KAAK;AAAA,QACvB,YAAY,KAAK;AAAA,QACjB,YAAY,WAAW,KAAK,kBAAkB,KAAK,UAAU;AAAA,QAC7D,aAAa,QAAQ;AAAA,MACvB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,kBAAkB,SAAyC;AACvE,UAAM,aAAa,oBAAoB,QAAQ,UAAU;AACzD,UAAM,YAAY,iBAAiB,QAAQ,SAAS;AACpD,UAAM,QAAQ,MAAM,gBAAgB,KAAK,WAAW,UAAU;AAC9D,UAAM,aAAa,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,MAAM,CAAC;AACjE,QAAI,iBAAiB;AACrB,QAAI,iBAAiB;AAErB,UAAMC,OAAM,WAAW,EAAE,WAAW,QAAQ,QAAQ,iBAAiB,EAAE,CAAC;AAExE,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAYD,MAAK,KAAK,WAAW,GAAG,KAAK,aAAa,MAAM,GAAG,CAAC;AACtE,YAAM,KAAK,qBAAqB,WAAW,QAAQ,SAAS;AAC5D,YAAMC,OAAMD,MAAK,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,YAAM,KAAK,UAAU,aAAa,KAAK,YAAY,WAAW,CAAC,SAAS;AACtE,cAAM,mBAAmB,iBAAiB,KAAK;AAC/C,gBAAQ,aAAa;AAAA,UACnB,WAAW;AAAA,UACX,QAAQ,QAAQ;AAAA,UAChB,aAAa,QAAQ;AAAA,UACrB;AAAA,UACA;AAAA,UACA,YAAY,WAAW,kBAAkB,UAAU;AAAA,UACnD,aAAa,KAAK;AAAA,UAClB;AAAA,UACA,YAAY,MAAM;AAAA,QACpB,CAAC;AAAA,MACH,CAAC;AACD,wBAAkB,KAAK;AACvB,wBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,YAAoB,oBAAoB,OAAsB;AAC7F,UAAM,SAAS,cAAc,UAAU;AACvC,QAAI,WAAW,OAAO,WAAW,KAAK;AACpC;AAAA,IACF;AAEA,QAAI,mBAAmB;AACrB,YAAM,KAAK,UAAU,MAAM,QAAQ,IAAI;AACvC;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO,MAAM;AACjD,QAAI,WAAW,KAAK;AAClB,YAAM,IAAI,cAAc,6CAA6C,MAAM,IAAI;AAAA,QAC7E,SAAS,EAAE,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,YAAoB,YAAY,OAAsB;AACxF,QAAI,WAAW;AACb;AAAA,IACF;AACA,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO,UAAU;AACrD,QAAI,QAAQ;AACV,YAAM,IAAI,cAAc,sCAAsC,UAAU,IAAI;AAAA,QAC1E,SAAS,EAAE,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,WAAmB,YAAY,OAAsB;AACtF,QAAI,WAAW;AACb;AAAA,IACF;AAEA,QAAI;AACF,YAAME,QAAO,SAAS;AACtB,YAAM,IAAI,cAAc,qCAAqC,SAAS,IAAI;AAAA,QACxE,SAAS,EAAE,UAAU;AAAA,MACvB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,eAAe;AAClC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ASzSA,eAAsB,SAAS,SAAyC;AACtE,QAAM,SAAS,IAAI,kBAAkB,OAAO;AAC5C,MAAI;AACF,UAAM,OAAO,SAAS,QAAQ,YAAY,QAAQ,WAAW,OAAO;AAAA,EACtE,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;;;ACPA,eAAsB,OAAO,SAAuC;AAClE,QAAM,SAAS,IAAI,kBAAkB,OAAO;AAC5C,MAAI;AACF,UAAM,OAAO,OAAO,QAAQ,WAAW,QAAQ,YAAY,OAAO;AAAA,EACpE,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;;;ACVA,SAAS,eAAe;;;ACGjB,SAAS,SAAS,WAAsC;AAC7D,SAAO,YAAY,SAAS;AAC9B;AAEO,SAAS,wBACd,WACA,QACA,aAC0B;AAC1B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB;AAAA;AAAA;AAAA,IAAqC,SAAS,SAAS,CAAC,EAAE;AAAA,EACtF;AACA,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,gBAAgB;AAAA;AAAA;AAAA,IAA0C,SAAS,SAAS,CAAC,EAAE;AAAA,EAC3F;AACF;;;AClBA,SAAS,cAAc;;;ACMvB,SAAS,aAAa,OAA2B,MAAkC;AACjF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,UAAM,IAAI,MAAM,GAAG,IAAI,oBAAoB;AAAA,EAC7C;AACA,SAAO;AACT;AAEO,SAAS,gBACd,MAAyB,QAAQ,KACd;AACnB,QAAM,SAA4B,CAAC;AAEnC,MAAI,IAAI,cAAe,QAAO,OAAO,IAAI;AACzC,MAAI,IAAI,eAAe;AACrB,UAAM,OAAO,aAAa,IAAI,eAAe,eAAe;AAC5D,QAAI,SAAS,OAAW,QAAO,OAAO;AAAA,EACxC;AACA,MAAI,IAAI,kBAAmB,QAAO,WAAW,IAAI;AACjD,MAAI,IAAI,kBAAmB,QAAO,WAAW,IAAI;AACjD,MAAI,IAAI,qBAAsB,QAAO,aAAa,IAAI;AACtD,MAAI,IAAI,0BAA2B,QAAO,iBAAiB,IAAI;AAC/D,MAAI,IAAI,oBAAqB,QAAO,aAAa,IAAI;AACrD,MAAI,IAAI,kBAAkB;AACxB,UAAM,UAAU,aAAa,IAAI,kBAAkB,kBAAkB;AACrE,QAAI,YAAY,OAAW,QAAO,UAAU;AAAA,EAC9C;AACA,MAAI,IAAI,iBAAkB,QAAO,UAAU,IAAI;AAE/C,SAAO;AACT;;;ACxCA,SAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AACjC,OAAOC,WAAU;AAEjB,SAAS,SAAS;AAMX,IAAM,mBAAmB,CAAC,wBAAwB,eAAe,kBAAkB;AAE1F,IAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AACtC,CAAC;AAED,IAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,mBAAmB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACxC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACrC,CAAC;AAED,IAAM,YAAY,eAAe,OAAO;AAAA,EACtC,WAAW,EAAE,KAAK,CAAC,UAAU,UAAU,CAAC;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,OAAO;AAAA,EACjB,aAAa,EAAE,OAAO;AACxB,CAAC;AAED,IAAM,eAAe,aAClB,OAAO;AAAA,EACN,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,QAAQ,aAAa,SAAS;AAAA,EAC9B,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,EAAE,OAAO,YAAY,EAAE,SAAS;AAAA,EAC1C,MAAM,EAAE,OAAO,SAAS,EAAE,SAAS;AACrC,CAAC,EACA,YAAY;AAQf,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAMC,QAAO,QAAQ;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eAAe,MAAM,QAAQ,IAAI,GAAgC;AACrF,aAAW,YAAY,kBAAkB;AACvC,UAAM,YAAYC,MAAK,QAAQ,KAAK,QAAQ;AAC5C,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,WACpB,cACA,MAAM,QAAQ,IAAI,GACK;AACvB,QAAM,aAAa,eAAe,iBAAiB,cAAc,GAAG,IAAI,MAAM,eAAe,GAAG;AAEhG,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,QAAQ,CAAC,GAAG,WAAW,IAAI;AAAA,EACtC;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAMC,UAAS,YAAY,MAAM;AAAA,EACzC,SAAS,OAAO;AACd,UAAM,IAAI,mBAAmB,sCAAsC,UAAU,IAAI;AAAA,MAC/E,OAAO;AAAA,MACP,SAAS,EAAE,MAAM,WAAW;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,SAAS,aAAa,UAAU,MAAM;AAC5C,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI,mBAAmB,+BAA+B,OAAO,MAAM,OAAO,IAAI;AAAA,QAClF,SAAS,EAAE,MAAM,WAAW;AAAA,MAC9B,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,MAAM;AAAA,MACN,WAAWD,MAAK,QAAQ,UAAU;AAAA,IACpC;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,oBAAoB;AACvC,YAAM;AAAA,IACR;AACA,UAAM,IAAI,mBAAmB,uCAAuC,UAAU,IAAI;AAAA,MAChF,OAAO;AAAA,MACP,SAAS,EAAE,MAAM,WAAW;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;;;ACtHA,OAAOE,WAAU;;;ACGV,SAAS,UAAU,QAAuB,SAA8B;AAC7E,QAAM,MAAM,OAAO,OAAO,OAAO;AACjC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,mBAAmB,gBAAgB,OAAO,IAAI;AAAA,MACtD,SAAS,EAAE,KAAK,QAAQ;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;ACRO,SAAS,cACd,QACA,aAC8B;AAC9B,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,WAAW,WAAW;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,mBAAmB,oBAAoB,WAAW,IAAI;AAAA,MAC9D,SAAS,EAAE,SAAS,YAAY;AAAA,IAClC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AFYA,IAAM,mBAAyF;AAAA,EAC7F,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,QAAQ;AACV;AAEA,SAAS,cAAgC,QAAW,QAA+B;AACjF,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAiC,GAAG;AAC5E,QAAI,UAAU,QAAW;AACvB,aAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,QAAyC;AAC3D,QAAM,SAA2B,CAAC;AAClC,gBAAc,QAAQ,OAAO,MAAM;AACnC,gBAAc,QAAQ;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO;AAAA,IACnB,gBAAgB,OAAO;AAAA,IACvB,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,YAAY,KAAmE;AACtF,QAAM,SAA8C,CAAC;AACrD,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,SAAO,cAAc,QAAQ;AAAA,IAC3B,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,mBAAmB,IAAI;AAAA,IACvB,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,EACf,CAAC;AACH;AAEA,SAAS,0BACP,UACA,WACA,iBACwB;AACxB,QAAM,OAAO,EAAE,GAAG,SAAS;AAE3B,MAAI,KAAK,kBAAkB,CAAC,KAAK,eAAe,WAAW,GAAG,GAAG;AAC/D,SAAK,iBAAiBC,MAAK,WAAW,KAAK,cAAc,IACrD,KAAK,iBACL,iBAAiB,KAAK,gBAAgB,eAAe;AAAA,EAC3D;AAEA,MAAI,KAAK,kBAAkB,CAAC,KAAK,eAAe,WAAW,GAAG,GAAG;AAC/D,SAAK,iBAAiBA,MAAK,WAAW,KAAK,cAAc,IACrD,KAAK,iBACL,iBAAiB,KAAK,gBAAgB,eAAe;AAAA,EAC3D;AAEA,MAAI,cAAc,YAAY,CAAC,KAAK,OAAO,WAAW,GAAG,GAAG;AAC1D,SAAK,SAASA,MAAK,WAAW,KAAK,MAAM,IACrC,KAAK,SACL,iBAAiB,KAAK,QAAQ,eAAe;AAAA,EACnD;AAEA,MAAI,cAAc,cAAc,CAAC,KAAK,YAAY,WAAW,GAAG,GAAG;AACjE,SAAK,cAAcA,MAAK,WAAW,KAAK,WAAW,IAC/C,KAAK,cACL,iBAAiB,KAAK,aAAa,eAAe;AAAA,EACxD;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAqD;AACzF,QAAM,SAAS,MAAM,UAAU,CAAC;AAChC,QAAM,MAAM,MAAM,OAAO,CAAC;AAC1B,QAAM,MAAM,MAAM,OAAO,CAAC;AAC1B,QAAM,kBAAkB,MAAM,mBAAmB,QAAQ,IAAI;AAC7D,QAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,QAAM,MAAM,MAAM,UAAU,UAAU,QAAQ,MAAM,OAAO,IAAI;AAC/D,QAAM,YAAY,MAAM,aAAa,KAAK;AAE1C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,QAAM,sBACJ,IAAI,WAAW,IAAI,WAAW,KAAK,WAAW,OAAO;AACvD,QAAM,UAAU,cAAc,QAAQ,mBAAmB;AAEzD,QAAM,WAAmC;AAAA,IACvC,GAAG;AAAA,IACH;AAAA,IACA,QAAQ,KAAK,UAAU;AAAA,IACvB,aAAa,KAAK,eAAe;AAAA,EACnC;AAEA,gBAAc,UAAU,YAAY,GAAG,CAAC;AACxC,gBAAc,UAAU,OAAO,QAAQ;AACvC,gBAAc,UAAU,WAAW,MAAM,CAAC;AAC1C,gBAAc,UAAU,OAAO;AAC/B,gBAAc,UAAU;AAAA,IACtB,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd,UAAU,IAAI;AAAA,IACd,YAAY,IAAI;AAAA,IAChB,gBAAgB,IAAI;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,SAAS,IAAI;AAAA,EACf,CAAC;AACD,gBAAc,UAAU;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,EACrB,CAAC;AACD,gBAAc,UAAU,GAAG;AAE3B,MAAI,qBAAqB;AACvB,aAAS,UAAU;AAAA,EACrB;AAEA,QAAM,eAAe,0BAA0B,UAAU,WAAW,eAAe;AAEnF,MAAI,MAAM,UAAU,cAAc,UAAU;AAC1C,iBAAa,SAAS,iBAAiB,MAAM,QAAQ,GAAG;AAAA,EAC1D;AAEA,MAAI,MAAM,eAAe,cAAc,YAAY;AACjD,iBAAa,cAAc,iBAAiB,MAAM,aAAa,GAAG;AAAA,EACpE;AAEA,SAAO;AACT;;;AG3KO,SAAS,YAAY,QAAgB,QAAsC;AAChF,QAAM,cACJ,OAAO,cAAc,WACjB,GAAG,OAAO,YAAY,MAAM,IAAI,OAAO,QAAQ,MAAM,IAAI,OAAO,WAAW,KAC3E,OAAO;AAEb,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS;AAAA,CAAI;AACpD,SAAO,OAAO,MAAM,WAAW,OAAO,MAAM;AAAA,CAAI;AAChD,SAAO,OAAO,MAAM,gBAAgB,WAAW;AAAA,CAAI;AACnD,SAAO,OAAO,MAAM,cAAc,OAAO,YAAY,QAAQ,IAAI;AAAA,CAAI;AACrE,SAAO,OAAO,MAAM,cAAc,OAAO,YAAY,QAAQ,IAAI;AAAA,CAAI;AACvE;AAEO,SAAS,uBACd,QACA,OACoD;AACpD,MAAI,SAAS,CAAC,OAAO,OAAO,OAAO;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,aAAa;AACnB,UAAM,QAAQ,SAAS,aAAa,YAAY,SAAS,UAAU,IAAI;AACvE,UAAM,cAAc,YAAY,SAAS,gBAAgB;AACzD,UAAMC,cAAa,SAAS,eAAe,SAAY,KAAK,KAAK,SAAS,UAAU;AACpF,UAAM,cAAc,SAAS,cAAc,KAAK,SAAS,WAAW,KAAK;AACzE,WAAO,OAAO,MAAM,KAAK,SAAS,cAAc,WAAW,cAAc,aAAa,GAAG,WAAW;AAAA,CAAI;AACxG,WAAO,OAAO,MAAM,GAAG,WAAW,MAAM,KAAK,GAAGA,WAAU;AAAA,CAAI;AAAA,EAChE;AACF;AAEO,SAAS,YAAY,QAAgB,QAAsC;AAChF,SAAO,OAAO;AAAA,IACZ,GAAG,KAAK;AAAA,MACN,sBAAsB;AAAA,QACpB,WAAW,OAAO;AAAA,QAClB,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf,aAAa,OAAO;AAAA,QACpB,WAAW,OAAO;AAAA,QAClB,WAAW,OAAO;AAAA,QAClB,mBAAmB,OAAO;AAAA,QAC1B,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,MACD;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA,EACH;AACF;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,QAAM,QAAQ,CAAC,MAAM,MAAM,MAAM,IAAI;AACrC,MAAI,QAAQ,QAAQ;AACpB,MAAI,YAAY;AAChB,SAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;AACpD,aAAS;AACT,iBAAa;AAAA,EACf;AACA,SAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AAChD;;;AN/BO,SAAS,mBAAmB,SAA8G;AAC/I,UAAQ,OAAO,iBAAiB,iBAAiB;AACjD,UAAQ,UAAU,IAAI,OAAO,iBAAiB,iBAAiB,EAAE,UAAUC,aAAY,CAAC;AACxF,UAAQ,OAAO,yBAAyB,cAAc;AACtD,UAAQ,OAAO,yBAAyB,0DAA0D;AAClG,UAAQ,OAAO,8BAA8B,qBAAqB;AAClE,UAAQ,OAAO,uCAAuC,uBAAuB;AAC7E,UAAQ,OAAO,6BAA6B,wBAAwB;AACpE,UAAQ,OAAO,mBAAmB,yBAAyB;AAC3D,UAAQ,OAAO,oBAAoB,sBAAsB;AACzD,UAAQ,OAAO,eAAe,kCAAkC;AAChE,UAAQ,OAAO,eAAe,sCAAsC;AACpE,UAAQ,OAAO,wBAAwB,wCAAwC;AAC/E,UAAQ,OAAO,aAAa,yDAAyD;AACrF,UAAQ,UAAU,IAAI,OAAO,4BAA4B,8BAA8B,EAAE,UAAUA,aAAY,CAAC;AAChH,UAAQ,OAAO,aAAa,iCAAiC;AAC7D,UAAQ,OAAO,WAAW,uCAAuC;AACjE,SAAO;AACT;AAEA,SAASA,cAAa,OAAuB;AAC3C,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,aAAa,SAAgD;AACpE,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB,gBAAgB,QAAQ;AAAA,IACxB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,mBAAmB,QAAQ;AAAA,IAC3B,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,EACnB;AACF;AAEA,eAAsB,cAAc,OAOA;AAClC,QAAM,SAAS,MAAM,WAAW,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/D,SAAO,sBAAsB;AAAA,IAC3B,WAAW,MAAM;AAAA,IACjB,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM;AAAA,IACf,KAAK,aAAa,MAAM,OAAO;AAAA,IAC/B,KAAK,gBAAgB;AAAA,IACrB,QAAQ,OAAO;AAAA,IACf,iBAAiB,OAAO;AAAA,IACxB,KAAK,MAAM;AAAA,EACb,CAAC;AACH;AAEA,eAAsB,wBACpB,QACA,UACA,QACA,gBACe;AACf,MAAI,eAAe,SAAS;AAC1B,gBAAY,QAAQ,MAAM;AAAA,EAC5B;AAEA,MAAI,OAAO,QAAQ;AACjB,QAAI,CAAC,eAAe,OAAO;AACzB,kBAAY,QAAQ,MAAM;AAAA,IAC5B;AACA;AAAA,EACF;AAEA,QAAM,aAAa,uBAAuB,QAAQ,eAAe,KAAK;AAEtE,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,gBAA+B;AAAA,MACnC,GAAG;AAAA,MACH,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO;AAAA,IACrB;AACA,QAAI,WAAY,eAAc,aAAa;AAC3C,UAAM,SAAS,OAAO,aAAa;AACnC;AAAA,EACF;AAEA,QAAM,kBAAmC;AAAA,IACvC,GAAG;AAAA,IACH,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,EACpB;AACA,MAAI,WAAY,iBAAgB,aAAa;AAC7C,QAAM,SAAS,SAAS,eAAe;AACzC;;;AFtIO,SAAS,sBAAsB,UAA4B,QAAgB,KAAsB;AACtG,QAAM,UAAU,IAAI,QAAQ,UAAU,EACnC,YAAY,2DAA2D,EACvE,MAAM,kCAAkC,EACxC,SAAS,YAAY,+BAA+B,EACpD,SAAS,iBAAiB,yBAAyB,EACnD,OAAO,OAAO,QAA4B,aAAiC,YAA+B;AACzG,4BAAwB,YAAY,QAAQ,WAAW;AACvD,UAAM,WAAW,MAAM,cAAc;AAAA,MACnC,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,wBAAwB,UAAU,UAAU,QAAQ,OAAO;AAAA,EACnE,CAAC;AAEH,qBAAmB,OAAO;AAC1B,SAAO;AACT;;;AShCA,SAAS,WAAAC,gBAAe;AAWjB,SAAS,iBAAiB,UAA4B,QAAgB,KAAsB;AACjG,QAAM,UAAU,IAAIC,SAAQ,KAAK,EAC9B,YAAY,+BAA+B,EAC3C,MAAM,wCAAwC,EAC9C,SAAS,SAAS,qBAAqB,EACvC,SAAS,YAAY,0BAA0B,EAC/C,SAAS,iBAAiB,+BAA+B,EACzD;AAAA,IACC,OACE,SACA,QACA,aACA,YACG;AACH,YAAM,WAAW,MAAM,cAAc;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,wBAAwB,UAAU,UAAU,QAAQ,OAAO;AAAA,IACnE;AAAA,EACF;AAEF,qBAAmB,OAAO;AAC1B,SAAO;AACT;;;ACtCA,SAAS,WAAAC,gBAAe;AAYjB,SAAS,oBAAoB,UAA4B,QAAgB,KAAsB;AACpG,QAAM,UAAU,IAAIC,SAAQ,QAAQ,EACjC,YAAY,yDAAyD,EACrE,MAAM,kCAAkC,EACxC,SAAS,YAAY,yBAAyB,EAC9C,SAAS,iBAAiB,+BAA+B,EACzD,OAAO,OAAO,QAA4B,aAAiC,YAA+B;AACzG,4BAAwB,UAAU,QAAQ,WAAW;AACrD,UAAM,WAAW,MAAM,cAAc;AAAA,MACnC,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,wBAAwB,UAAU,UAAU,QAAQ,OAAO;AAAA,EACnE,CAAC;AAEH,qBAAmB,OAAO;AAC1B,SAAO;AACT;;;AtBbA,eAAsB,OAAO,UAAyB,CAAC,GAAoB;AACzE,QAAM,SAAS,QAAQ,UAAU,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO;AAClF,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,WAAW,QAAQ,YAAY,EAAE,QAAQ,SAAS;AACxD,QAAM,UAAU,IAAIC,SAAQ;AAE5B,UACG,KAAK,UAAU,EACf,YAAY,2CAA2C,EACvD,QAAQ,OAAO,EACf,mBAAmB,EACnB,aAAa;AAEhB,UAAQ,WAAW,oBAAoB,UAAU,QAAQ,GAAG,CAAC;AAC7D,UAAQ,WAAW,sBAAsB,UAAU,QAAQ,GAAG,CAAC;AAC/D,UAAQ,WAAW,iBAAiB,UAAU,QAAQ,GAAG,CAAC;AAE1D,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,MAAM,EAAE,MAAM,OAAO,CAAC;AACvE,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,gBAAgB;AACnC,UAAI,MAAM,SAAS,6BAA6B,MAAM,SAAS,qBAAqB;AAClF,eAAO;AAAA,MACT;AACA,aAAO,OAAO,MAAM,GAAG,mBAAmB,MAAM,OAAO,CAAC;AAAA,CAAI;AAC5D,aAAO,MAAM,YAAY;AAAA,IAC3B;AAEA,UAAM,WAAW,QAAQ,QAAQ,QAAQ,MAAM,SAAS,WAAW;AACnE,QAAI,iBAAiB,cAAc;AACjC,aAAO,OAAO,MAAM,UAAU,mBAAmB,MAAM,OAAO,CAAC;AAAA,CAAI;AACnE,UAAI,WAAW,MAAM,iBAAiB,OAAO;AAC3C,eAAO,OAAO,MAAM,GAAG,mBAAmB,MAAM,MAAM,SAAS,MAAM,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,MACzF;AACA,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,MAAM,UAAU,mBAAmB,KAAK,CAAC;AAAA,CAAI;AAC3D,QAAI,WAAW,iBAAiB,SAAS,MAAM,OAAO;AACpD,aAAO,OAAO,MAAM,GAAG,mBAAmB,MAAM,KAAK,CAAC;AAAA,CAAI;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAI,YAAY,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,IAAI;AACnD,OAAK,OAAO,EAAE,KAAK,CAAC,aAAa;AAC/B,YAAQ,WAAW;AAAA,EACrB,CAAC;AACH;","names":["Command","access","mkdir","path","readFile","access","access","readFile","stat","path","path","path","stat","path","access","access","totalBytes","path","mkdir","access","access","readFile","path","access","path","readFile","path","path","percentage","parseInteger","Command","Command","Command","Command","Command"]}