@geolonia/geonicdb-cli 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +544 -172
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/output.ts","../src/commands/help.ts","../src/commands/config.ts","../src/commands/auth.ts","../src/oauth.ts","../src/client.ts","../src/helpers.ts","../src/prompt.ts","../src/token.ts","../src/input.ts","../src/commands/me-oauth-clients.ts","../src/commands/me-api-keys.ts","../src/commands/me-policies.ts","../src/commands/profile.ts","../src/commands/attrs.ts","../src/commands/entities.ts","../src/commands/batch.ts","../src/commands/subscriptions.ts","../src/commands/registrations.ts","../src/commands/types.ts","../src/commands/temporal.ts","../src/commands/snapshots.ts","../src/commands/admin/tenants.ts","../src/commands/admin/users.ts","../src/commands/admin/policies.ts","../src/commands/admin/oauth-clients.ts","../src/commands/admin/api-keys.ts","../src/commands/admin/index.ts","../src/commands/rules.ts","../src/commands/models.ts","../src/commands/catalog.ts","../src/commands/health.ts","../src/commands/cli.ts","../src/update-notifier.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerProfileCommands } from \"./commands/profile.js\";\nimport { registerEntitiesCommand } from \"./commands/entities.js\";\nimport { registerBatchCommand } from \"./commands/batch.js\";\nimport { registerSubscriptionsCommand } from \"./commands/subscriptions.js\";\nimport { registerRegistrationsCommand } from \"./commands/registrations.js\";\nimport { registerTypesCommand } from \"./commands/types.js\";\nimport { registerTemporalCommand } from \"./commands/temporal.js\";\nimport { registerSnapshotsCommand } from \"./commands/snapshots.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\nimport { registerRulesCommand } from \"./commands/rules.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerHealthCommand, registerVersionCommand } from \"./commands/health.js\";\nimport { registerHelpCommand } from \"./commands/help.js\";\nimport { registerCliCommand } from \"./commands/cli.js\";\nimport { addAttrsSubcommands } from \"./commands/attrs.js\";\n\nexport function createProgram(): Command {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { description: string };\n const program = new Command();\n\n program\n .name(\"geonic\")\n .description(pkg.description)\n .option(\"-u, --url <url>\", \"Base URL of the GeonicDB server\")\n .option(\"-s, --service <name>\", \"NGSILD-Tenant header\")\n .option(\"--token <token>\", \"Authentication token\")\n .option(\"-p, --profile <name>\", \"Use a named profile\")\n .option(\"--api-key <key>\", \"API key for authentication\")\n .option(\"-f, --format <fmt>\", \"Output format: json, table, geojson\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"--dry-run\", \"Print the equivalent curl command without executing\");\n\n registerHelpCommand(program);\n registerConfigCommand(program);\n registerAuthCommands(program);\n registerProfileCommands(program);\n registerEntitiesCommand(program);\n registerBatchCommand(program);\n registerSubscriptionsCommand(program);\n registerRegistrationsCommand(program);\n registerTypesCommand(program);\n registerTemporalCommand(program);\n registerSnapshotsCommand(program);\n registerAdminCommand(program);\n registerRulesCommand(program);\n registerModelsCommand(program);\n registerCatalogCommand(program);\n registerHealthCommand(program);\n registerVersionCommand(program);\n registerCliCommand(program);\n\n // Backward-compatible hidden 'attrs' command at top level\n const hiddenAttrs = new Command(\"attrs\")\n .description(\"Manage entity attributes\");\n addAttrsSubcommands(hiddenAttrs);\n program.addCommand(hiddenAttrs, { hidden: true });\n\n return program;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { GdbConfig, GdbConfigFile } from \"./types.js\";\n\nexport function getConfigDir(): string {\n return process.env.GEONIC_CONFIG_DIR ?? join(homedir(), \".config\", \"geonic\");\n}\n\nfunction getConfigFile(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction migrateV1ToV2(data: Record<string, unknown>): GdbConfigFile {\n const profile: GdbConfig = {};\n const knownKeys = [\n \"url\",\n \"service\",\n \"token\",\n \"refreshToken\",\n \"format\",\n \"apiKey\",\n ];\n for (const key of knownKeys) {\n if (key in data) {\n (profile as Record<string, unknown>)[key] = data[key];\n }\n }\n return {\n version: 2,\n currentProfile: \"default\",\n profiles: { default: profile },\n };\n}\n\nfunction isGdbConfigFile(value: unknown): value is GdbConfigFile {\n /* v8 ignore next -- loadConfigFile always passes an object with version key */\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n v.version === 2 &&\n typeof v.currentProfile === \"string\" &&\n typeof v.profiles === \"object\" &&\n v.profiles !== null\n );\n}\n\nfunction defaultConfig(): GdbConfigFile {\n return { version: 2, currentProfile: \"default\", profiles: { default: {} } };\n}\n\nexport function loadConfigFile(): GdbConfigFile {\n try {\n const raw = readFileSync(getConfigFile(), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n\n if (!(\"version\" in data)) {\n const migrated = migrateV1ToV2(data);\n saveConfigFile(migrated);\n return migrated;\n }\n\n if (!isGdbConfigFile(data)) {\n return defaultConfig();\n }\n\n return data;\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfigFile(configFile: GdbConfigFile): void {\n ensureConfigDir();\n writeFileSync(getConfigFile(), JSON.stringify(configFile, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function loadConfig(profileName?: string): GdbConfig {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n return configFile.profiles[name] ?? {};\n}\n\nexport function saveConfig(config: GdbConfig, profileName?: string): void {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n configFile.profiles[name] = config;\n saveConfigFile(configFile);\n}\n\nexport function getConfigValue(key: string, profileName?: string): unknown {\n const config = loadConfig(profileName);\n return config[key as keyof GdbConfig];\n}\n\nexport function validateUrl(url: string): string {\n url = url.trim();\n if (!url) {\n throw new Error(\"URL must not be empty.\");\n }\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Invalid URL: \"${url}\". URL must start with http:// or https://.`);\n }\n try {\n new URL(url);\n } catch {\n throw new Error(`Invalid URL: \"${url}\".`);\n }\n return url.replace(/\\/+$/, \"\") + \"/\";\n}\n\nexport function setConfigValue(key: string, value: string, profileName?: string): void {\n const config = loadConfig(profileName);\n if (key === \"url\") {\n value = validateUrl(value);\n }\n (config as Record<string, unknown>)[key] = value;\n saveConfig(config, profileName);\n}\n\nexport function deleteConfigValue(key: string, profileName?: string): void {\n const config = loadConfig(profileName);\n delete (config as Record<string, unknown>)[key];\n saveConfig(config, profileName);\n}\n\nexport function getConfigPath(): string {\n return getConfigFile();\n}\n\nexport function listProfiles(): { name: string; active: boolean }[] {\n const configFile = loadConfigFile();\n return Object.keys(configFile.profiles).map((name) => ({\n name,\n active: name === configFile.currentProfile,\n }));\n}\n\nexport function getCurrentProfile(): string {\n return loadConfigFile().currentProfile;\n}\n\nexport function setCurrentProfile(name: string): void {\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n configFile.currentProfile = name;\n saveConfigFile(configFile);\n}\n\nexport function createProfile(name: string): void {\n const configFile = loadConfigFile();\n if (name in configFile.profiles) {\n throw new Error(`Profile \"${name}\" already exists.`);\n }\n configFile.profiles[name] = {};\n saveConfigFile(configFile);\n}\n\nexport function deleteProfile(name: string): void {\n if (name === \"default\") {\n throw new Error('Cannot delete the \"default\" profile.');\n }\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n delete configFile.profiles[name];\n if (configFile.currentProfile === name) {\n configFile.currentProfile = \"default\";\n }\n saveConfigFile(configFile);\n}\n","import chalk from \"chalk\";\nimport type { OutputFormat } from \"./types.js\";\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"table\":\n return formatTable(data);\n case \"geojson\":\n return JSON.stringify(toGeoJSON(data), null, 2);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\nexport function printOutput(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(message));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(message));\n}\n\nexport function printWarning(message: string): void {\n console.error(chalk.yellow(message));\n}\n\n/**\n * Print an API key value in a highlighted box so it stands out.\n */\nexport function printApiKeyBox(key: string): void {\n const border = \"─\".repeat(key.length + 4);\n console.error(\"\");\n console.error(chalk.green(` ┌${border}┐`));\n console.error(chalk.green(` │ ${chalk.bold(key)} │`));\n console.error(chalk.green(` └${border}┘`));\n console.error(\"\");\n console.error(chalk.yellow(\"⚠ この API キー値を安全に保存してください。二度と表示されません。\"));\n}\n\nexport function printCount(count: number): void {\n console.log(chalk.dim(`Count: ${count}`));\n}\n\nfunction formatTable(data: unknown): string {\n if (!Array.isArray(data)) {\n if (typeof data === \"object\" && data !== null) {\n return formatObjectTable(data as Record<string, unknown>);\n }\n return String(data);\n }\n\n if (data.length === 0) return \"(empty)\";\n\n const items = data as Record<string, unknown>[];\n const keys = collectKeys(items);\n\n const widths = new Map<string, number>();\n for (const key of keys) {\n widths.set(key, key.length);\n }\n for (const item of items) {\n for (const key of keys) {\n const val = cellValue(item[key]);\n widths.set(key, Math.max(widths.get(key)!, val.length));\n }\n }\n\n const header = keys.map((k) => chalk.bold(k.padEnd(widths.get(k)!))).join(\" \");\n const separator = keys.map((k) => \"─\".repeat(widths.get(k)!)).join(\"──\");\n const rows = items.map((item) =>\n keys.map((k) => cellValue(item[k]).padEnd(widths.get(k)!)).join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction formatObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n if (entries.length === 0) return \"(empty)\";\n\n const keyWidth = Math.max(...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${chalk.bold(k.padEnd(keyWidth))} ${cellValue(v)}`).join(\"\\n\");\n}\n\nfunction collectKeys(items: Record<string, unknown>[]): string[] {\n const priority = [\"id\", \"type\"];\n const keySet = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n keySet.add(key);\n }\n }\n const sorted: string[] = [];\n for (const p of priority) {\n if (keySet.has(p)) {\n sorted.push(p);\n keySet.delete(p);\n }\n }\n sorted.push(...Array.from(keySet).sort());\n return sorted;\n}\n\nfunction formatGeoJSON(geo: Record<string, unknown>): string {\n const geoType = String(geo.type);\n const coords = geo.coordinates;\n if (geoType === \"Point\" && Array.isArray(coords) && coords.length >= 2) {\n return `Point(${Number(coords[0]).toFixed(2)}, ${Number(coords[1]).toFixed(2)})`;\n }\n if (Array.isArray(coords)) {\n const count = geoType === \"Polygon\"\n ? (Array.isArray(coords[0]) ? (coords[0] as unknown[]).length : 0)\n : coords.length;\n return `${geoType}(${count} coords)`;\n }\n return `${geoType}(...)`;\n}\n\nfunction isGeoJSON(v: unknown): boolean {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o.type === \"string\" && \"coordinates\" in o;\n}\n\nfunction cellValue(val: unknown): string {\n if (val === undefined || val === null) return \"\";\n if (typeof val !== \"object\") return String(val);\n const obj = val as Record<string, unknown>;\n if (isGeoJSON(obj)) return formatGeoJSON(obj);\n if (\"value\" in obj) {\n const v = obj.value;\n if (isGeoJSON(v)) return formatGeoJSON(v as Record<string, unknown>);\n return String(v);\n }\n return JSON.stringify(val);\n}\n\nfunction toGeoJSON(data: unknown): unknown {\n if (Array.isArray(data)) {\n return {\n type: \"FeatureCollection\",\n features: data.map(entityToFeature),\n };\n }\n return entityToFeature(data);\n}\n\nfunction entityToFeature(entity: unknown): unknown {\n if (typeof entity !== \"object\" || entity === null) {\n return { type: \"Feature\", geometry: null, properties: entity };\n }\n\n const obj = entity as Record<string, unknown>;\n let geometry = null;\n\n if (obj.location) {\n const loc = obj.location as Record<string, unknown>;\n geometry = loc.value ?? loc;\n }\n\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"location\") continue;\n if (typeof value === \"object\" && value !== null && \"value\" in (value as object)) {\n properties[key] = (value as Record<string, unknown>).value;\n } else {\n properties[key] = value;\n }\n }\n\n return { type: \"Feature\", geometry, properties };\n}\n","import chalk from \"chalk\";\nimport type { Command, Help, Option } from \"commander\";\n\ninterface Example {\n description: string;\n command: string;\n}\n\nconst examplesMap = new WeakMap<Command, Example[]>();\nconst notesMap = new WeakMap<Command, string[]>();\n\nexport function addExamples(cmd: Command, examples: Example[]): void {\n examplesMap.set(cmd, examples);\n}\n\nexport function addNotes(cmd: Command, notes: string[]): void {\n notesMap.set(cmd, notes);\n}\n\nfunction header(title: string): string {\n return chalk.yellow.bold(title);\n}\n\nfunction findCommand(parent: Command, name: string): Command | undefined {\n return parent.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nfunction getCommandPath(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current) {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nfunction getRootProgram(cmd: Command): Command {\n let root = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n}\n\nfunction formatOptionSynopsis(opt: Option): string {\n /* v8 ignore next -- Commander always sets long or short */\n const flag = opt.long || opt.short || \"\";\n if (opt.required) {\n const match = opt.flags.match(/<([^>]+)>/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}=<${valueName}>]`;\n } else if (opt.optional) {\n const match = opt.flags.match(/\\[([^\\]]+)\\]/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}[=<${valueName}>]]`;\n }\n return `[${flag}]`;\n}\n\nfunction formatSynopsis(path: string, cmd: Command): string {\n const parts = [path];\n\n for (const arg of cmd.registeredArguments) {\n if (arg.required) {\n parts.push(`<${arg.name()}>`);\n } else {\n parts.push(`[<${arg.name()}>]`);\n }\n }\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n parts.push(formatOptionSynopsis(opt));\n }\n\n return parts.join(\" \");\n}\n\nfunction formatOptionList(options: readonly Option[]): string[] {\n const maxLen = Math.max(...options.map((o) => o.flags.length));\n return options.map((opt) => {\n const flags = opt.flags.padEnd(maxLen + 2);\n /* v8 ignore next -- Commander always sets description to '' */\n return ` ${chalk.green(flags)}${opt.description ?? \"\"}`;\n });\n}\n\nfunction formatGlobalParameters(program: Command): string {\n const lines: string[] = [];\n lines.push(header(\"GLOBAL PARAMETERS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(program.options));\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function formatTopLevelHelp(program: Command): string {\n const lines: string[] = [];\n\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n lines.push(` ${program.name()}`);\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n lines.push(` ${program.description()}`);\n lines.push(\"\");\n lines.push(header(\"AVAILABLE COMMANDS\"));\n lines.push(\"\");\n\n const commands = program.commands\n .filter((c) => !(c as Command & { _hidden?: boolean })._hidden)\n .slice()\n .sort((a, b) => a.name().localeCompare(b.name()));\n\n const maxLen = Math.max(...commands.map((c) => c.name().length));\n\n for (const cmd of commands) {\n const name = cmd.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${cmd.summary() || cmd.description()}`);\n }\n\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nexport function formatCommandDetails(\n program: Command,\n cmd: Command,\n path: string,\n): string {\n const lines: string[] = [];\n\n // NAME\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n const aliases = cmd.aliases().filter((a) => a.length > 0);\n if (aliases.length > 0) {\n lines.push(` ${path} ${chalk.dim(`(alias: ${aliases.join(\", \")})`)}`);\n } else {\n lines.push(` ${path}`);\n }\n\n // DESCRIPTION\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n for (const descLine of cmd.description().split(\"\\n\")) {\n lines.push(` ${descLine}`);\n }\n\n const subcommands = cmd.commands.filter(\n (c) => !(c as Command & { _hidden?: boolean })._hidden,\n );\n\n if (subcommands.length > 0) {\n // Command group with subcommands\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${path} <command>`);\n lines.push(\"\");\n lines.push(header(\"SUBCOMMANDS\"));\n lines.push(\"\");\n\n const maxLen = Math.max(...subcommands.map((c) => c.name().length));\n for (const sub of subcommands) {\n const name = sub.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${sub.summary() || sub.description()}`);\n }\n } else {\n // Leaf command\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${formatSynopsis(path, cmd)}`);\n\n const options = cmd.options.filter((o) => !o.hidden);\n if (options.length > 0) {\n lines.push(\"\");\n lines.push(header(\"OPTIONS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(options));\n }\n }\n\n // EXAMPLES\n const examples = examplesMap.get(cmd);\n if (examples && examples.length > 0) {\n lines.push(\"\");\n lines.push(header(\"EXAMPLES\"));\n lines.push(\"\");\n for (const ex of examples) {\n lines.push(` ${ex.description}:`);\n lines.push(` $ ${ex.command}`);\n lines.push(\"\");\n }\n }\n\n // NOTES\n const notes = notesMap.get(cmd);\n if (notes && notes.length > 0) {\n lines.push(\"\");\n lines.push(header(\"NOTES\"));\n lines.push(\"\");\n for (const note of notes) {\n lines.push(` ${note}`);\n }\n }\n\n // GLOBAL PARAMETERS\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nfunction showHelp(program: Command, args: string[]): void {\n if (args.length === 0) {\n console.log(formatTopLevelHelp(program));\n return;\n }\n\n let current = program;\n const resolved: Command[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const found = findCommand(current, args[i]);\n if (!found) {\n const attempted = args.slice(0, i + 1).join(\" \");\n console.error(\n chalk.red(`Error: '${attempted}' is not a geonic command.`),\n );\n console.error(`\\nSee 'geonic help' for available commands.`);\n process.exit(1);\n }\n resolved.push(found);\n current = found;\n }\n\n const target = resolved[resolved.length - 1];\n const path = [program.name(), ...resolved.map((c) => c.name())].join(\" \");\n\n console.log(formatCommandDetails(program, target, path));\n}\n\nexport function registerHelpCommand(program: Command): void {\n // Disable Commander's built-in help command\n program.addHelpCommand(false);\n\n // Override --help to use our wp-cli style format\n program.configureHelp({\n formatHelp: (cmd: Command, _helper: Help): string => {\n const root = getRootProgram(cmd);\n if (cmd === root) {\n return formatTopLevelHelp(root);\n }\n const path = getCommandPath(cmd);\n return formatCommandDetails(root, cmd, path);\n },\n });\n\n // Register the `help` command\n program\n .command(\"help\")\n .description(\"Get help on a specific command\")\n .argument(\"[args...]\")\n .allowUnknownOption()\n .action((args: string[]) => {\n showHelp(program, args);\n });\n\n // Show help when `geonic` is run with no arguments, or show error for unknown commands\n program.argument(\"[command...]\").action((commands: string[]) => {\n if (commands.length > 0) {\n console.error(\n `geonic: '${commands[0]}' is not a geonic command. See 'geonic help'.`,\n );\n process.exitCode = 1;\n return;\n }\n showHelp(program, []);\n });\n}\n","import type { Command } from \"commander\";\nimport {\n loadConfig,\n getConfigValue,\n setConfigValue,\n deleteConfigValue,\n getConfigPath,\n} from \"../config.js\";\nimport { printOutput, printSuccess, printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"token\", \"refreshToken\", \"apiKey\"]);\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n const set = config\n .command(\"set\")\n .description(\"Save a config value\")\n .argument(\n \"<key>\",\n \"Configuration key (url, service, token, refreshToken, format, apiKey)\",\n )\n .argument(\"<value>\", \"Configuration value\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const value = args[1] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n setConfigValue(key, value, profile);\n const display = SENSITIVE_CONFIG_KEYS.has(key) ? \"***\" : value;\n printSuccess(`Set ${key} = ${display}`);\n });\n\n addExamples(set, [\n {\n description: \"Set server URL\",\n command: \"geonic config set url https://api.example.com\",\n },\n {\n description: \"Set tenant (NGSILD-Tenant header)\",\n command: \"geonic config set service my-tenant\",\n },\n {\n description: \"Set authentication token\",\n command: \"geonic config set token eyJhbGciOi...\",\n },\n {\n description: \"Set API key\",\n command: \"geonic config set apiKey your-api-key\",\n },\n {\n description: \"Set default output format\",\n command: \"geonic config set format table\",\n },\n {\n description: \"Set config for a specific profile\",\n command:\n \"geonic config set url https://staging.example.com --profile staging\",\n },\n ]);\n\n const get = config\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const value = getConfigValue(key, profile);\n if (value === undefined) {\n printInfo(`Key \"${key}\" is not set.`);\n } else {\n printOutput(value, \"json\");\n }\n });\n\n addExamples(get, [\n {\n description: \"Get server URL\",\n command: \"geonic config get url\",\n },\n {\n description: \"Get config value for a specific profile\",\n command: \"geonic config get url --profile staging\",\n },\n ]);\n\n const list = config\n .command(\"list\")\n .description(\"List all config values\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const all = loadConfig(profile);\n if (Object.keys(all).length === 0) {\n printInfo(`No configuration set. Config path: ${getConfigPath()}`);\n } else {\n printOutput(all, \"json\");\n }\n });\n\n addExamples(list, [\n {\n description: \"List all configuration values\",\n command: \"geonic config list\",\n },\n ]);\n\n const del = config\n .command(\"delete\")\n .description(\"Delete a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n deleteConfigValue(key, profile);\n printSuccess(`Deleted key \"${key}\".`);\n });\n\n addExamples(del, [\n {\n description: \"Delete a config value\",\n command: \"geonic config delete url\",\n },\n ]);\n}\n","import { createHash } from \"node:crypto\";\nimport { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n resolveOptions,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { loadConfig, saveConfig, getCurrentProfile, validateUrl } from \"../config.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { isInteractive, promptEmail, promptPassword, promptTenantSelection } from \"../prompt.js\";\nimport type { TenantChoice } from \"../prompt.js\";\nimport { getTokenStatus, formatDuration } from \"../token.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples } from \"./help.js\";\nimport { addMeOAuthClientsSubcommand } from \"./me-oauth-clients.js\";\nimport { addMeApiKeysSubcommand } from \"./me-api-keys.js\";\nimport { addMePoliciesSubcommand } from \"./me-policies.js\";\n\nfunction createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\"Authenticate and save token\")\n .option(\"--client-credentials\", \"Use OAuth 2.0 Client Credentials flow\")\n .option(\"--client-id <id>\", \"OAuth client ID\")\n .option(\"--client-secret <secret>\", \"OAuth client secret\")\n .option(\"--scope <scopes>\", \"OAuth scopes (space-separated)\")\n .option(\"--tenant-id <id>\", \"Tenant ID for scoped authentication\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const loginOpts = cmd.opts() as {\n clientCredentials?: boolean;\n clientId?: string;\n clientSecret?: string;\n scope?: string;\n tenantId?: string;\n };\n const globalOpts = resolveOptions(cmd);\n\n if (loginOpts.clientCredentials) {\n const clientId = loginOpts.clientId ?? process.env.GDB_OAUTH_CLIENT_ID;\n const clientSecret = loginOpts.clientSecret ?? process.env.GDB_OAUTH_CLIENT_SECRET;\n\n if (!clientId || !clientSecret) {\n printError(\n \"Client ID and secret are required. Use --client-id/--client-secret or GDB_OAUTH_CLIENT_ID/GDB_OAUTH_CLIENT_SECRET.\",\n );\n process.exit(1);\n }\n\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const result = await clientCredentialsGrant({\n baseUrl: globalOpts.url,\n clientId,\n clientSecret,\n scope: loginOpts.scope,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.token = result.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful (OAuth Client Credentials). Token saved to config.\");\n return;\n }\n\n // Email/password flow (interactive only)\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n try {\n validateUrl(globalOpts.url);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n\n if (!isInteractive()) {\n printError(\n \"Interactive terminal required. Run `geonic auth login` in a terminal with TTY.\",\n );\n process.exit(1);\n }\n\n const email = await promptEmail();\n const password = await promptPassword();\n\n const client = createClient(cmd);\n const body: Record<string, string> = { email, password };\n if (loginOpts.tenantId) {\n body.tenantId = loginOpts.tenantId;\n }\n\n const response = await client.rawRequest(\"POST\", \"/auth/login\", {\n body,\n skipTenantHeader: true,\n });\n\n const data = response.data as Record<string, unknown>;\n let token = (data.accessToken ?? data.token) as string | undefined;\n let refreshToken = data.refreshToken as string | undefined;\n\n if (!token) {\n printError(\"No token received from server.\");\n process.exit(1);\n }\n\n // Handle multi-tenant: show available tenants and prompt for selection\n const availableTenants = data.availableTenants as TenantChoice[] | undefined;\n let finalTenantId = data.tenantId as string | undefined;\n\n if (availableTenants && availableTenants.length > 1 && !loginOpts.tenantId) {\n const selectedTenantId = await promptTenantSelection(availableTenants, finalTenantId);\n if (selectedTenantId && selectedTenantId !== finalTenantId) {\n // Re-login with selected tenant\n const reloginResponse = await client.rawRequest(\"POST\", \"/auth/login\", {\n body: { email, password, tenantId: selectedTenantId },\n skipTenantHeader: true,\n });\n const reloginData = reloginResponse.data as Record<string, unknown>;\n const newToken = (reloginData.accessToken ?? reloginData.token) as string | undefined;\n if (!newToken) {\n printError(\"Re-login failed: no token received for selected tenant.\");\n process.exit(1);\n }\n token = newToken;\n refreshToken = reloginData.refreshToken as string | undefined;\n finalTenantId = selectedTenantId;\n }\n }\n\n const config = loadConfig(globalOpts.profile);\n config.token = token;\n if (refreshToken) {\n config.refreshToken = refreshToken;\n } else {\n delete config.refreshToken;\n }\n if (finalTenantId) {\n config.service = finalTenantId;\n } else {\n delete config.service;\n }\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful. Token saved to config.\");\n }),\n );\n}\n\nfunction createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Clear saved authentication token\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n const config = loadConfig(globalOpts.profile);\n\n // Try to notify server (best effort)\n if (config.token && globalOpts.url) {\n try {\n const client = createClient(cmd);\n await client.rawRequest(\"POST\", \"/auth/logout\");\n } catch {\n // Ignore errors - token may already be invalid\n }\n }\n\n delete config.token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Logged out. Token cleared from config.\");\n }),\n );\n}\n\nfunction createMeAction() {\n return withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n\n if (!globalOpts.token && !globalOpts.apiKey) {\n printInfo(\"Not logged in. Use `geonic auth login` to authenticate.\");\n return;\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me\");\n outputResponse(response, format);\n\n // Suppress additional human-readable logs for structured formats\n if (format && format !== \"table\") {\n return;\n }\n\n // Show token expiry if token exists (re-read in case of auto-refresh)\n const latestConfig = loadConfig(globalOpts.profile);\n if (latestConfig.token) {\n const status = getTokenStatus(latestConfig.token);\n if (status.expiresAt) {\n if (status.isExpired) {\n printError(`Token expires: ${status.expiresAt.toISOString()} (expired)`);\n } else if (status.isExpiringSoon) {\n printWarning(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n } else {\n printInfo(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n }\n }\n }\n\n // Show current profile\n const profileName = globalOpts.profile ?? getCurrentProfile();\n printInfo(`Profile: ${profileName}`);\n });\n}\n\nasync function fetchNonce(\n baseUrl: string,\n apiKey: string,\n): Promise<{ nonce: string; challenge: string; difficulty: number }> {\n const origin = new URL(baseUrl).origin;\n const url = new URL(\"/auth/nonce\", baseUrl).toString();\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({ api_key: apiKey }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Nonce request failed: ${text || `HTTP ${response.status}`}`);\n }\n\n return (await response.json()) as { nonce: string; challenge: string; difficulty: number };\n}\n\nfunction createNonceCommand(): Command {\n return new Command(\"nonce\")\n .description(\"Get a nonce and PoW challenge for API key authentication\")\n .option(\"--api-key <key>\", \"API key to get nonce for\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const nonceOpts = cmd.opts() as { apiKey?: string };\n const globalOpts = resolveOptions(cmd);\n const apiKey = nonceOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const data = await fetchNonce(baseUrl, apiKey);\n const format = getFormat(cmd);\n outputResponse({ status: 200, headers: new Headers(), data }, format);\n }),\n );\n}\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n return true;\n}\n\nconst MAX_POW_ITERATIONS = 10_000_000;\n\nfunction solvePoW(challenge: string, difficulty: number): number {\n for (let nonce = 0; nonce < MAX_POW_ITERATIONS; nonce++) {\n const hash = createHash(\"sha256\")\n .update(`${challenge}${nonce}`)\n .digest();\n if (hasLeadingZeroBits(hash, difficulty)) return nonce;\n }\n throw new Error(`PoW could not be solved within ${MAX_POW_ITERATIONS} iterations`);\n}\n\nfunction createTokenExchangeCommand(): Command {\n return new Command(\"token-exchange\")\n .description(\"Exchange API key for a session JWT via nonce + PoW\")\n .option(\"--api-key <key>\", \"API key to exchange\")\n .option(\"--save\", \"Save the obtained token to profile config\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const exchangeOpts = cmd.opts() as { apiKey?: string; save?: boolean };\n const globalOpts = resolveOptions(cmd);\n const apiKey = exchangeOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const origin = new URL(baseUrl).origin;\n\n // Step 1: Get nonce\n const nonceData = await fetchNonce(baseUrl, apiKey);\n\n printInfo(`Nonce received. Solving PoW (difficulty=${nonceData.difficulty})...`);\n\n // Step 2: Solve PoW\n const powNonce = solvePoW(nonceData.challenge, nonceData.difficulty);\n\n // Step 3: Exchange for JWT\n const tokenUrl = new URL(\"/oauth/token\", baseUrl).toString();\n const tokenResponse = await fetch(tokenUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({\n grant_type: \"api_key\",\n api_key: apiKey,\n nonce: nonceData.nonce,\n proof: String(powNonce),\n }),\n });\n\n if (!tokenResponse.ok) {\n const text = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${text || `HTTP ${tokenResponse.status}`}`);\n }\n\n const tokenData = (await tokenResponse.json()) as {\n access_token: string;\n token_type: string;\n expires_in?: number;\n };\n\n if (exchangeOpts.save) {\n const config = loadConfig(globalOpts.profile);\n config.token = tokenData.access_token;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Token exchange successful. Token saved to config.\");\n } else {\n const format = getFormat(cmd);\n outputResponse({ status: tokenResponse.status, headers: tokenResponse.headers, data: tokenData }, format);\n printSuccess(\"Token exchange successful.\");\n }\n }),\n );\n}\n\nexport function registerAuthCommands(program: Command): void {\n // auth command group with login/logout subcommands\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication\");\n\n const login = createLoginCommand();\n addExamples(login, [\n {\n description: \"Interactive login (email/password prompt)\",\n command: \"geonic auth login\",\n },\n {\n description: \"Login with OAuth client credentials\",\n command:\n \"geonic auth login --client-credentials --client-id MY_ID --client-secret MY_SECRET\",\n },\n {\n description: \"Login to a specific tenant\",\n command: \"geonic auth login --tenant-id my-tenant\",\n },\n ]);\n auth.addCommand(login);\n\n const logout = createLogoutCommand();\n addExamples(logout, [\n {\n description: \"Clear saved authentication token\",\n command: \"geonic auth logout\",\n },\n ]);\n auth.addCommand(logout);\n\n const nonce = createNonceCommand();\n addExamples(nonce, [\n {\n description: \"Get a nonce for API key authentication\",\n command: \"geonic auth nonce --api-key gdb_abcdef...\",\n },\n ]);\n auth.addCommand(nonce);\n\n const tokenExchange = createTokenExchangeCommand();\n addExamples(tokenExchange, [\n {\n description: \"Exchange API key for a JWT and save it\",\n command: \"geonic auth token-exchange --api-key gdb_abcdef... --save\",\n },\n ]);\n auth.addCommand(tokenExchange);\n\n // me command (top-level, maps to /me API endpoint)\n const me = program\n .command(\"me\")\n .description(\"Display current authenticated user and manage user resources\");\n\n // Default action: show user info when no subcommand is given\n const meInfo = me\n .command(\"info\", { isDefault: true, hidden: true })\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n\n addExamples(me, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n ]);\n\n addExamples(meInfo, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n ]);\n\n // Add me oauth-clients subcommands\n addMeOAuthClientsSubcommand(me);\n\n // Add me api-keys subcommands\n addMeApiKeysSubcommand(me);\n\n // Add me policies subcommands\n addMePoliciesSubcommand(me);\n\n // Backward-compatible hidden aliases\n program.addCommand(createLoginCommand(), { hidden: true });\n program.addCommand(createLogoutCommand(), { hidden: true });\n\n const hiddenWhoami = new Command(\"whoami\")\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n program.addCommand(hiddenWhoami, { hidden: true });\n}\n","export interface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n}\n\nexport async function clientCredentialsGrant(options: {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n scope?: string;\n}): Promise<OAuthTokenResponse> {\n const url = new URL(\"/oauth/token\", options.baseUrl).toString();\n const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString(\"base64\");\n\n const body: Record<string, string> = { grant_type: \"client_credentials\" };\n if (options.scope) {\n body.scope = options.scope;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message: string;\n try {\n const err = JSON.parse(text) as Record<string, unknown>;\n message = (err.error_description ?? err.error ?? text) as string;\n } catch {\n message = text || `HTTP ${response.status}`;\n }\n throw new Error(`OAuth token request failed: ${message}`);\n }\n\n return (await response.json()) as OAuthTokenResponse;\n}\n","import type { ClientOptions, ClientResponse, NgsiError } from \"./types.js\";\nimport { clientCredentialsGrant } from \"./oauth.js\";\n\nexport class DryRunSignal extends Error {\n constructor() {\n super(\"dry-run\");\n this.name = \"DryRunSignal\";\n }\n}\n\nexport class GdbClient {\n private baseUrl: string;\n private service?: string;\n private token?: string;\n private refreshToken?: string;\n private apiKey?: string;\n private clientId?: string;\n private clientSecret?: string;\n private onTokenRefresh?: (token: string, refreshToken?: string) => void;\n private verbose: boolean;\n private dryRun: boolean;\n private refreshPromise?: Promise<boolean>;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.service = options.service;\n this.token = options.token;\n this.refreshToken = options.refreshToken;\n this.apiKey = options.apiKey;\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.onTokenRefresh = options.onTokenRefresh;\n this.verbose = options.verbose ?? false;\n this.dryRun = options.dryRun ?? false;\n }\n\n private buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {};\n\n headers[\"Content-Type\"] = \"application/ld+json\";\n headers[\"Accept\"] = \"application/ld+json\";\n if (this.service) headers[\"NGSILD-Tenant\"] = this.service;\n\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n } else if (this.apiKey) {\n headers[\"X-Api-Key\"] = this.apiKey;\n }\n\n if (extra) {\n Object.assign(headers, extra);\n }\n\n return headers;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n return url.toString();\n }\n\n private getBasePath(): string {\n return \"/ngsi-ld/v1\";\n }\n\n private static readonly SENSITIVE_HEADERS = new Set([\"authorization\", \"x-api-key\"]);\n private static readonly SENSITIVE_BODY_KEYS = new Set([\n \"password\",\n \"refreshToken\",\n \"token\",\n \"client_secret\",\n \"clientSecret\",\n \"key\",\n \"apiKey\",\n ]);\n\n private logRequest(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.verbose) return;\n process.stderr.write(`> ${method} ${url}\\n`);\n for (const [k, v] of Object.entries(headers)) {\n if (GdbClient.SENSITIVE_HEADERS.has(k.toLowerCase())) {\n process.stderr.write(`> ${k}: ***\\n`);\n } else {\n process.stderr.write(`> ${k}: ${v}\\n`);\n }\n }\n if (body) {\n process.stderr.write(`> Body: ${GdbClient.maskBodySecrets(body)}\\n`);\n }\n process.stderr.write(\"\\n\");\n }\n\n private static maskBodySecrets(raw: string): string {\n try {\n const obj = JSON.parse(raw) as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (GdbClient.SENSITIVE_BODY_KEYS.has(key)) {\n obj[key] = \"***\";\n }\n }\n return JSON.stringify(obj);\n } catch {\n return raw;\n }\n }\n\n private logResponse(response: Response): void {\n if (!this.verbose) return;\n process.stderr.write(`< ${response.status} ${response.statusText}\\n`);\n response.headers.forEach((v, k) => {\n process.stderr.write(`< ${k}: ${v}\\n`);\n });\n process.stderr.write(\"\\n\");\n }\n\n private static shellQuote(value: string): string {\n return `'${value.split(\"'\").join(\"'\\\"'\\\"'\")}'`;\n }\n\n static buildCurlCommand(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): string {\n const parts: string[] = [\"curl\"];\n if (method !== \"GET\") {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H ${GdbClient.shellQuote(`${key}: ${value}`)}`);\n }\n if (body) {\n parts.push(`-d ${GdbClient.shellQuote(body)}`);\n }\n parts.push(GdbClient.shellQuote(url));\n return parts.join(\" \\\\\\n \");\n }\n\n private handleDryRun(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.dryRun) return;\n console.log(GdbClient.buildCurlCommand(method, url, headers, body));\n throw new DryRunSignal();\n }\n\n private canRefresh(): boolean {\n return (!!this.refreshToken || (!!this.clientId && !!this.clientSecret)) && !this.apiKey;\n }\n\n /** Check whether an error indicates an authentication/token problem that may be resolved by refreshing. */\n private static isTokenError(err: GdbClientError): boolean {\n if (err.status === 401) return true;\n // The server returns 403 for malformed / expired JWTs in some cases\n if (err.status === 403) {\n const msg = (err.message ?? \"\").toLowerCase();\n return msg.includes(\"not assigned to any tenant\") || msg.includes(\"invalid token\");\n }\n return false;\n }\n\n private async performTokenRefresh(): Promise<boolean> {\n if (this.refreshPromise) return this.refreshPromise;\n\n this.refreshPromise = this.doRefresh();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = undefined;\n }\n }\n\n private async doRefresh(): Promise<boolean> {\n // Try refreshToken first\n if (this.refreshToken) {\n try {\n const url = this.buildUrl(\"/auth/refresh\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (response.ok) {\n const data = (await response.json()) as Record<string, unknown>;\n const newToken = (data.accessToken ?? data.token) as string | undefined;\n const newRefreshToken = data.refreshToken as string | undefined;\n\n if (newToken) {\n this.token = newToken;\n if (newRefreshToken) this.refreshToken = newRefreshToken;\n this.onTokenRefresh?.(newToken, newRefreshToken);\n return true;\n }\n }\n } catch {\n // Fall through to client credentials\n }\n }\n\n // Fallback: client_credentials grant\n if (this.clientId && this.clientSecret) {\n try {\n const result = await clientCredentialsGrant({\n baseUrl: this.baseUrl,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n });\n this.token = result.access_token;\n this.onTokenRefresh?.(result.access_token);\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(`${this.getBasePath()}${path}`, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n const countHeader = response.headers.get(\"NGSILD-Results-Count\");\n const count = countHeader ? parseInt(countHeader, 10) : undefined;\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data, count };\n }\n\n private async executeRawRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(path, options?.params);\n const headers = this.buildHeaders(options?.headers);\n if (options?.skipTenantHeader) {\n delete headers[\"NGSILD-Tenant\"];\n }\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data };\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && GdbClient.isTokenError(err) && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"GET\", path, { params, headers });\n }\n\n async post<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PATCH\", path, { body, params });\n }\n\n async put<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PUT\", path, { body, params });\n }\n\n async delete<T = unknown>(\n path: string,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"DELETE\", path, { params });\n }\n\n /** Make a request to a raw URL path (not prefixed with API base path) */\n async rawRequest<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRawRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && GdbClient.isTokenError(err) && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRawRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n}\n\nexport class GdbClientError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly ngsiError?: NgsiError,\n ) {\n super(message);\n this.name = \"GdbClientError\";\n }\n}\n","import { Command } from \"commander\";\nimport { loadConfig, saveConfig, validateUrl } from \"./config.js\";\nimport { DryRunSignal, GdbClient, GdbClientError } from \"./client.js\";\nimport { printError, printOutput, printCount } from \"./output.js\";\nimport type { ClientResponse, GlobalOptions, OutputFormat } from \"./types.js\";\n\n/**\n * Resolve merged options from config + CLI flags.\n */\nexport function resolveOptions(cmd: Command): GlobalOptions {\n const opts = cmd.optsWithGlobals() as GlobalOptions;\n const config = loadConfig(opts.profile);\n return {\n url: opts.url ?? config.url,\n service: opts.service ?? config.service,\n token: opts.token ?? config.token,\n format: opts.format ?? config.format ?? \"json\",\n color: opts.color,\n verbose: opts.verbose,\n profile: opts.profile,\n apiKey: opts.apiKey ?? process.env.GDB_API_KEY ?? config.apiKey,\n dryRun: opts.dryRun,\n };\n}\n\n/**\n * Create a GdbClient from resolved options.\n */\nexport function createClient(cmd: Command): GdbClient {\n const opts = resolveOptions(cmd);\n if (!opts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n opts.url = validateUrl(opts.url);\n const cliOpts = cmd.optsWithGlobals() as GlobalOptions;\n const usingCliToken = !!cliOpts.token;\n const config = loadConfig(opts.profile);\n return new GdbClient({\n baseUrl: opts.url,\n service: opts.service,\n token: opts.token,\n refreshToken: usingCliToken ? undefined : config.refreshToken,\n clientId: usingCliToken ? undefined : config.clientId,\n clientSecret: usingCliToken ? undefined : config.clientSecret,\n apiKey: opts.apiKey,\n onTokenRefresh: usingCliToken\n ? undefined\n : (token, refreshToken) => {\n const cfg = loadConfig(opts.profile);\n cfg.token = token;\n if (refreshToken) cfg.refreshToken = refreshToken;\n saveConfig(cfg, opts.profile);\n },\n verbose: opts.verbose,\n dryRun: opts.dryRun,\n });\n}\n\n/**\n * Get the output format from resolved options.\n */\nexport function getFormat(cmd: Command): OutputFormat {\n const opts = resolveOptions(cmd);\n return opts.format as OutputFormat;\n}\n\n/**\n * Standard handler for outputting API responses.\n */\nexport function outputResponse(\n response: ClientResponse,\n format: OutputFormat,\n showCount?: boolean,\n): void {\n if (showCount && response.count !== undefined) {\n printCount(response.count);\n }\n if (response.data !== undefined && response.data !== \"\") {\n printOutput(response.data, format);\n }\n}\n\n/**\n * Wrap an async command handler with error handling.\n */\nexport function withErrorHandler<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (err: unknown) {\n if (err instanceof DryRunSignal) {\n return;\n }\n if (err instanceof GdbClientError && err.status === 401) {\n printError(\"Authentication failed. Please re-authenticate (e.g., `geonic auth login` or check your API key).\");\n } else if (err instanceof GdbClientError && err.status === 403 && /not assigned to any tenant|invalid token/i.test(err.message)) {\n printError(\"Authentication failed. Please re-authenticate (e.g., `geonic auth login` or check your API key).\");\n } else if (err instanceof GdbClientError && err.status === 403) {\n const detail = (err.ngsiError?.detail ?? err.ngsiError?.description ?? \"\").toLowerCase();\n if (detail.includes(\"entity type\") || detail.includes(\"allowedentitytypes\")) {\n printError(`Entity type restriction: ${err.message}`);\n } else {\n printError(err.message);\n }\n } else if (err instanceof Error) {\n printError(err.message);\n } else {\n printError(String(err));\n }\n process.exit(1);\n }\n };\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport function isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport async function promptEmail(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const email = await rl.question(\"Email: \");\n return email.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(\"Password: \");\n\n if (!stdin.isTTY) {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.resume();\n const cleanup = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"end\", onEnd);\n stdin.removeListener(\"error\", onError);\n stdin.pause();\n };\n const onData = (chunk: string) => {\n const newline = chunk.indexOf(\"\\n\");\n if (newline !== -1) {\n data += chunk.slice(0, newline);\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n } else {\n data += chunk;\n }\n };\n const onEnd = () => {\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n stdin.on(\"data\", onData);\n stdin.on(\"end\", onEnd);\n stdin.on(\"error\", onError);\n return;\n }\n\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf-8\");\n\n let password = \"\";\n\n const restoreTerminal = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"error\", onError);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n };\n\n const onError = (err: Error) => {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(err);\n };\n\n const onData = (char: string) => {\n const code = char.charCodeAt(0);\n\n if (char === \"\\r\" || char === \"\\n\") {\n restoreTerminal();\n stdout.write(\"\\n\");\n resolve(password);\n } else if (code === 3) {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(new Error(\"User cancelled\"));\n } else if (code === 127 || code === 8) {\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.write(\"\\b \\b\");\n }\n } else if (code >= 32) {\n password += char;\n stdout.write(\"*\");\n }\n };\n\n stdin.on(\"data\", onData);\n stdin.on(\"error\", onError);\n });\n}\n\nexport interface TenantChoice {\n tenantId: string;\n role: string;\n}\n\nexport async function promptTenantSelection(\n tenants: TenantChoice[],\n currentTenantId?: string,\n): Promise<string | undefined> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n console.log(\"\\nAvailable tenants:\");\n for (let i = 0; i < tenants.length; i++) {\n const t = tenants[i];\n const current = t.tenantId === currentTenantId ? \" ← current\" : \"\";\n const marker = t.tenantId === currentTenantId ? \" *\" : \" \";\n console.log(`${marker} ${i + 1}) ${t.tenantId} (${t.role})${current}`);\n }\n for (;;) {\n const answer = await rl.question(\"\\nSelect tenant number (Enter to keep current): \");\n const trimmed = answer.trim();\n if (!trimmed) return undefined;\n const index = parseInt(trimmed, 10) - 1;\n if (index >= 0 && index < tenants.length) {\n return tenants[index].tenantId;\n }\n console.log(`Invalid selection. Please enter a number between 1 and ${tenants.length}.`);\n }\n } finally {\n rl.close();\n }\n}\n","export interface TokenStatus {\n expiresAt: Date | null;\n isExpired: boolean;\n isExpiringSoon: boolean;\n remainingMs: number | null;\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const json = Buffer.from(payload, \"base64\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function getTokenStatus(token: string): TokenStatus {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") {\n return { expiresAt: null, isExpired: false, isExpiringSoon: false, remainingMs: null };\n }\n\n const expiresAt = new Date(payload.exp * 1000);\n const now = Date.now();\n const remainingMs = expiresAt.getTime() - now;\n const fiveMinutes = 5 * 60 * 1000;\n\n return {\n expiresAt,\n isExpired: remainingMs <= 0,\n isExpiringSoon: remainingMs > 0 && remainingMs <= fiveMinutes,\n remainingMs,\n };\n}\n\nexport function formatDuration(ms: number): string {\n if (ms <= 0) return \"expired\";\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours % 24 > 0) parts.push(`${hours % 24}h`);\n if (minutes % 60 > 0 && days === 0) parts.push(`${minutes % 60}m`);\n if (parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(\" \");\n}\n","import JSON5 from \"json5\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Parse JSON input from a string, file (@path), stdin (-), pipe, or interactive mode.\n *\n * Resolution order:\n * 1. Explicit input provided → parse directly (inline, @file, or - for stdin)\n * 2. No input + piped stdin (non-TTY) → auto-read stdin\n * 3. No input + TTY stdin → interactive mode with brace-balanced auto-submit\n *\n * Supports JSON5 syntax (unquoted keys, single quotes, trailing commas).\n */\nexport async function parseJsonInput(input?: string): Promise<unknown> {\n // 1. Explicit input\n if (input !== undefined) {\n if (input === \"-\") return parseData(readFileSync(0, \"utf-8\"));\n if (input.startsWith(\"@\")) return parseData(readFileSync(input.slice(1), \"utf-8\"));\n return parseData(input);\n }\n\n // 2. Piped stdin (non-TTY)\n if (!process.stdin.isTTY) {\n return parseData(readFileSync(0, \"utf-8\"));\n }\n\n // 3. Interactive mode (TTY)\n return readInteractiveJson();\n}\n\nfunction parseData(text: string): unknown {\n return JSON5.parse(text.trim());\n}\n\n/**\n * Read JSON interactively from TTY with brace-balance auto-submit.\n * Tracks depth of {}/[] while respecting string literals.\n * When depth returns to 0, automatically parses and returns.\n */\nasync function readInteractiveJson(): Promise<unknown> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n prompt: \"json> \",\n });\n\n process.stderr.write(\"Enter JSON (auto-submits when braces close, Ctrl+C to cancel):\\n\");\n rl.prompt();\n\n const lines: string[] = [];\n let depth = 0;\n let started = false;\n let inBlockComment = false;\n let inString = false;\n let stringChar = \"\";\n let cancelled = false;\n\n return new Promise<unknown>((resolve, reject) => {\n rl.on(\"SIGINT\", () => {\n cancelled = true;\n rl.close();\n });\n\n rl.on(\"line\", (line) => {\n lines.push(line);\n const result = trackDepth(line, depth, started, inBlockComment, inString, stringChar);\n depth = result.depth;\n started = result.started;\n inBlockComment = result.inBlockComment;\n inString = result.inString;\n stringChar = result.stringChar;\n\n if (started && depth <= 0 && !inBlockComment && !inString) {\n rl.close();\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else {\n rl.setPrompt(\"... \");\n rl.prompt();\n }\n });\n\n rl.on(\"close\", () => {\n if (cancelled) {\n reject(new Error(\"Input cancelled.\"));\n return;\n }\n if (lines.length > 0 && (!started || depth > 0 || inBlockComment || inString)) {\n // EOF before balanced — attempt to parse what we have\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else if (lines.length === 0) {\n reject(new Error(\"No input provided.\"));\n }\n });\n });\n}\n\n/**\n * Track brace/bracket depth for a line, respecting string literals and JSON5 comments.\n * String and block-comment state is passed in and returned to handle multi-line constructs.\n */\nfunction trackDepth(\n line: string,\n depth: number,\n started: boolean,\n inBlockComment: boolean,\n inString: boolean,\n stringChar: string,\n): { depth: number; started: boolean; inBlockComment: boolean; inString: boolean; stringChar: string } {\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inString) {\n if (ch === \"\\\\\" && i + 1 < line.length) {\n i++; // skip escaped character\n } else if (ch === stringChar) {\n inString = false;\n }\n continue;\n }\n\n // Line comment — skip rest of line\n if (ch === \"/\" && next === \"/\") break;\n // Block comment start\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = true;\n stringChar = ch;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n started = true;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n }\n }\n\n return { depth, started, inBlockComment, inString, stringChar };\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig, validateUrl } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples, addNotes } from \"./help.js\";\n\nexport function addMeOAuthClientsSubcommand(me: Command): void {\n const oauthClients = me\n .command(\"oauth-clients\")\n .description(\"Manage your OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List your OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\"Create a new OAuth client\")\n .option(\"--name <name>\", \"Client name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--save\", \"Save credentials to config for automatic re-authentication\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n save?: boolean;\n };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy) {\n // Build body from flags\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policy) payload.policyId = opts.policy;\n body = payload;\n } else {\n // Read from stdin (pipe or interactive)\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/oauth-clients\", { body });\n\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const clientId = data.clientId as string | undefined;\n const clientSecret = data.clientSecret as string | undefined;\n\n if (!clientId || !clientSecret) {\n printError(\"Response missing clientId or clientSecret. Cannot save credentials.\");\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n return;\n }\n\n // Perform client_credentials grant to get a fresh token\n const baseUrl = validateUrl(globalOpts.url!);\n const tokenResult = await clientCredentialsGrant({\n baseUrl,\n clientId,\n clientSecret,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.clientId = clientId;\n config.clientSecret = clientSecret;\n config.token = tokenResult.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printInfo(\"Client credentials saved to config. Auto-reauth enabled.\");\n } else {\n printWarning(\n \"Save the clientSecret now — it will not be shown again.\",\n );\n }\n\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addNotes(create, [\n \"Use --policy to attach an existing XACML policy to the OAuth client.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an OAuth client with flags\",\n command: \"geonic me oauth-clients create --name my-ci-bot\",\n },\n {\n description: \"Create with a policy attached\",\n command: \"geonic me oauth-clients create --name my-ci-bot --policy <policy-id>\",\n },\n {\n description: \"Create and save credentials for auto-reauth\",\n command: \"geonic me oauth-clients create --name my-ci-bot --save\",\n },\n {\n description: \"Create an OAuth client from JSON\",\n command: 'geonic me oauth-clients create \\'{\"name\":\"my-bot\",\"policyId\":\"<policy-id>\"}\\'',\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <clientId> [json]\")\n .description(\"Update an OAuth client\")\n .option(\"--name <name>\", \"Client name\")\n .option(\"--description <desc>\", \"Client description\")\n .option(\"--policy-id <policyId>\", \"Policy ID to attach (use 'null' to unbind)\")\n .option(\"--active\", \"Activate the OAuth client\")\n .option(\"--inactive\", \"Deactivate the OAuth client\")\n .action(\n withErrorHandler(async (clientId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n description?: string;\n policyId?: string;\n active?: boolean;\n inactive?: boolean;\n };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.description || opts.policyId !== undefined || opts.active || opts.inactive) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.description) payload.description = opts.description;\n if (opts.policyId !== undefined) payload.policyId = opts.policyId === \"null\" ? null : opts.policyId;\n if (opts.active) payload.isActive = true;\n if (opts.inactive) payload.isActive = false;\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/me/oauth-clients/${encodeURIComponent(String(clientId))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n }),\n );\n\n addExamples(update, [\n {\n description: \"Rename an OAuth client\",\n command: \"geonic me oauth-clients update <client-id> --name new-name\",\n },\n {\n description: \"Attach a policy\",\n command: \"geonic me oauth-clients update <client-id> --policy-id <policy-id>\",\n },\n {\n description: \"Unbind policy\",\n command: \"geonic me oauth-clients update <client-id> --policy-id null\",\n },\n {\n description: \"Deactivate an OAuth client\",\n command: \"geonic me oauth-clients update <client-id> --inactive\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic me oauth-clients delete <client-id>\",\n },\n ]);\n\n // oauth-clients regenerate-secret\n const regenerateSecret = oauthClients\n .command(\"regenerate-secret <clientId>\")\n .description(\"Regenerate the client secret of an OAuth client\")\n .action(\n withErrorHandler(async (clientId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"POST\",\n `/me/oauth-clients/${encodeURIComponent(String(clientId))}/regenerate-secret`,\n );\n printWarning(\"Save the new clientSecret now — it will not be shown again.\");\n outputResponse(response, format);\n printSuccess(\"OAuth client secret regenerated.\");\n }),\n );\n\n addExamples(regenerateSecret, [\n {\n description: \"Regenerate client secret\",\n command: \"geonic me oauth-clients regenerate-secret <client-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printApiKeyBox, printError } from \"../output.js\";\nimport { addExamples, addNotes } from \"./help.js\";\n\n/** Strip masked key placeholder from API key response for cleaner display. */\nfunction cleanApiKeyData(data: unknown): unknown {\n if (Array.isArray(data)) return data.map(cleanApiKeyData);\n if (typeof data !== \"object\" || data === null) return data;\n const obj = { ...(data as Record<string, unknown>) };\n if (obj.key === \"******\") delete obj.key;\n return obj;\n}\n\n/** Save API key to profile config and print confirmation. Returns false if key missing or save fails. */\nfunction handleSaveKey(\n data: Record<string, unknown>,\n cmd: Command,\n): boolean {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n process.exitCode = 1;\n return false;\n }\n try {\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n return true;\n } catch (err) {\n printError(`Failed to save API key to config: ${err instanceof Error ? err.message : String(err)}`);\n printApiKeyBox(key);\n process.exitCode = 1;\n return false;\n }\n}\n\n/** Show API key value prominently. Returns false if key is missing (treated as error). */\nfunction showKeyResult(\n data: Record<string, unknown>,\n save: boolean,\n cmd: Command,\n): boolean {\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. The new API key value was not returned.\");\n process.exitCode = 1;\n return false;\n }\n if (save) return handleSaveKey(data, cmd);\n printApiKeyBox(key);\n return true;\n}\n\nexport function addMeApiKeysSubcommand(me: Command): void {\n const apiKeys = me\n .command(\"api-keys\")\n .description(\"Manage your API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List your API keys\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/api-keys\");\n response.data = cleanApiKeyData(response.data);\n outputResponse(response, format);\n console.error(\"※ API キー値は作成時 (create) またはリフレッシュ時 (refresh) にのみ表示されます。\");\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--origins <origins>\", \"Allowed origins (comma-separated)\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--save\", \"Save the API key to config for automatic use\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n save?: boolean;\n };\n\n // Validate --origins flag early\n if (opts.origins !== undefined) {\n const parsed = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (parsed.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy || opts.origins || opts.rateLimit || opts.dpopRequired !== undefined) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policy) payload.policyId = opts.policy;\n if (opts.origins) payload.allowedOrigins = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.rateLimit) {\n const raw = opts.rateLimit.trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n // Validate allowedOrigins from JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/api-keys\", { body });\n\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, [\n \"Use --policy to attach an existing XACML policy to the API key.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an API key with a policy\",\n command: \"geonic me api-keys create --name my-app --policy <policy-id>\",\n },\n {\n description: \"Create and save API key to config\",\n command: \"geonic me api-keys create --name my-app --save\",\n },\n {\n description: \"Create an API key from JSON\",\n command: 'geonic me api-keys create \\'{\"name\":\"my-app\",\"policyId\":\"<policy-id>\"}\\'',\n },\n {\n description: \"Create an API key with rate limiting\",\n command: \"geonic me api-keys create --name my-app --rate-limit 100\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic me api-keys create --name my-app --dpop-required\",\n },\n ]);\n\n // api-keys refresh\n const refresh = apiKeys\n .command(\"refresh <keyId>\")\n .description(\"Refresh (rotate) an API key — generates a new key value\")\n .option(\"--save\", \"Save the new API key to config for automatic use\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { save?: boolean };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"POST\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}/refresh`,\n );\n\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key refreshed.\");\n }),\n );\n\n addNotes(refresh, [\n \"Refreshing generates a new key value while keeping keyId, name, and policy settings.\",\n \"The previous key value is immediately invalidated.\",\n ]);\n\n addExamples(refresh, [\n {\n description: \"Refresh an API key\",\n command: \"geonic me api-keys refresh <key-id>\",\n },\n {\n description: \"Refresh and save new key to config\",\n command: \"geonic me api-keys refresh <key-id> --save\",\n },\n ]);\n\n // api-keys update\n const update = apiKeys\n .command(\"update <keyId> [json]\")\n .description(\"Update an API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy-id <policyId>\", \"Policy ID to attach (use 'null' to unbind)\")\n .option(\"--origins <origins>\", \"Allowed origins (comma-separated)\")\n .option(\"--rate-limit <n>\", \"Rate limit (requests per minute)\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--no-dpop-required\", \"Disable DPoP requirement\")\n .option(\"--active\", \"Activate the API key\")\n .option(\"--inactive\", \"Deactivate the API key\")\n .action(\n withErrorHandler(async (keyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policyId?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n active?: boolean;\n inactive?: boolean;\n };\n\n // Validate --origins flag early\n if (opts.origins !== undefined) {\n const parsed = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (parsed.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policyId !== undefined || opts.origins !== undefined || opts.rateLimit || opts.dpopRequired !== undefined || opts.active || opts.inactive) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policyId !== undefined) payload.policyId = opts.policyId === \"null\" ? null : opts.policyId;\n if (opts.origins !== undefined) payload.allowedOrigins = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.rateLimit) {\n const raw = opts.rateLimit.trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n if (opts.active) payload.isActive = true;\n if (opts.inactive) payload.isActive = false;\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}`,\n { body },\n );\n outputResponse(response, format);\n console.error(\"API key updated.\");\n }),\n );\n\n addExamples(update, [\n {\n description: \"Rename an API key\",\n command: \"geonic me api-keys update <key-id> --name new-name\",\n },\n {\n description: \"Attach a policy\",\n command: \"geonic me api-keys update <key-id> --policy-id <policy-id>\",\n },\n {\n description: \"Unbind policy\",\n command: \"geonic me api-keys update <key-id> --policy-id null\",\n },\n {\n description: \"Deactivate an API key\",\n command: \"geonic me api-keys update <key-id> --inactive\",\n },\n {\n description: \"Update from JSON\",\n command: 'geonic me api-keys update <key-id> \\'{\"name\":\"new-name\",\"rateLimit\":{\"perMinute\":60}}\\'',\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key\",\n command: \"geonic me api-keys delete <key-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples, addNotes } from \"./help.js\";\n\nexport function addMePoliciesSubcommand(me: Command): void {\n const policies = me\n .command(\"policies\")\n .description(\"Manage your personal XACML policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List your personal policies\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your personal policies\",\n command: \"geonic me policies list\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <policyId>\")\n .description(\"Get a personal policy by ID\")\n .action(\n withErrorHandler(async (policyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/me/policies/${encodeURIComponent(String(policyId))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a personal policy by ID\",\n command: \"geonic me policies get <policy-id>\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .description(\n \"Create a personal XACML policy\\n\\n\" +\n \"Constraints (enforced server-side):\\n\" +\n \" - priority is fixed at 100 (user role minimum)\\n\" +\n \" - scope is 'personal' — not applied tenant-wide\\n\" +\n \" - target is required\\n\" +\n \" - data API paths only (/v2/**, /ngsi-ld/** etc.)\\n\\n\" +\n \"Example — GET-only policy for /v2/**:\\n\" +\n \" {\\n\" +\n ' \"policyId\": \"my-readonly\",\\n' +\n ' \"target\": {\\n' +\n ' \"resources\": [{\"attributeId\": \"path\", \"matchValue\": \"/v2/**\", \"matchFunction\": \"glob\"}]\\n' +\n \" },\\n\" +\n ' \"rules\": [\\n' +\n ' {\"ruleId\": \"allow-get\", \"effect\": \"Permit\", \"target\": {\"actions\": [{\"attributeId\": \"method\", \"matchValue\": \"GET\"}]}},\\n' +\n ' {\"ruleId\": \"deny-others\", \"effect\": \"Deny\"}\\n' +\n \" ]\\n\" +\n \" }\",\n )\n .option(\"--policy-id <id>\", \"Policy ID (auto-generated UUID if omitted)\")\n .option(\"--description <text>\", \"Policy description\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { policyId?: string; description?: string };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.policyId || opts.description) {\n const payload: Record<string, unknown> = {};\n if (opts.policyId) payload.policyId = opts.policyId;\n if (opts.description) payload.description = opts.description;\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/policies\", { body });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addNotes(create, [\n \"priority is always set to 100 by the server regardless of the value you specify.\",\n \"Bind the policy to an API key or OAuth client with `geonic me api-keys update --policy-id` or `geonic me oauth-clients update --policy-id`.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create a GET-only policy from inline JSON\",\n command: `geonic me policies create '{\"policyId\":\"my-readonly\",\"target\":{\"resources\":[{\"attributeId\":\"path\",\"matchValue\":\"/v2/**\",\"matchFunction\":\"glob\"}]},\"rules\":[{\"ruleId\":\"allow-get\",\"effect\":\"Permit\",\"target\":{\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]}},{\"ruleId\":\"deny-others\",\"effect\":\"Deny\"}]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic me policies create @policy.json\",\n },\n {\n description: \"Create from stdin\",\n command: \"cat policy.json | geonic me policies create\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <policyId> [json]\")\n .description(\"Update a personal policy (partial update)\")\n .option(\"--description <text>\", \"Policy description\")\n .action(\n withErrorHandler(async (policyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { description?: string };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.description) {\n body = { description: opts.description };\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/me/policies/${encodeURIComponent(String(policyId))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n }),\n );\n\n addExamples(update, [\n {\n description: \"Update policy rules\",\n command: `geonic me policies update <policy-id> '{\"rules\":[{\"ruleId\":\"allow-get\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic me policies update <policy-id> @patch.json\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <policyId>\")\n .description(\"Delete a personal policy\")\n .action(\n withErrorHandler(async (policyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/policies/${encodeURIComponent(String(policyId))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a personal policy\",\n command: \"geonic me policies delete <policy-id>\",\n },\n ]);\n}\n","import { Command } from \"commander\";\nimport {\n listProfiles,\n getCurrentProfile,\n setCurrentProfile,\n createProfile,\n deleteProfile,\n loadConfig,\n} from \"../config.js\";\nimport { printSuccess, printInfo, printError } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerProfileCommands(program: Command): void {\n const profile = program.command(\"profile\").description(\"Manage connection profiles\");\n\n const list = profile\n .command(\"list\")\n .description(\"List all profiles\")\n .action(() => {\n const profiles = listProfiles();\n for (const p of profiles) {\n const marker = p.active ? \" *\" : \"\";\n console.log(`${p.name}${marker}`);\n }\n });\n\n addExamples(list, [\n {\n description: \"List all profiles (active profile marked with *)\",\n command: \"geonic profile list\",\n },\n ]);\n\n const use = profile\n .command(\"use <name>\")\n .description(\"Switch active profile\")\n .action((name: string) => {\n try {\n setCurrentProfile(name);\n printSuccess(`Switched to profile \"${name}\".`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(use, [\n {\n description: \"Switch to staging profile\",\n command: \"geonic profile use staging\",\n },\n ]);\n\n const profileCreate = profile\n .command(\"create <name>\")\n .description(\"Create a new profile\")\n .action((name: string) => {\n try {\n createProfile(name);\n printSuccess(`Profile \"${name}\" created.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(profileCreate, [\n {\n description: \"Create a new profile for staging\",\n command: \"geonic profile create staging\",\n },\n ]);\n\n const del = profile\n .command(\"delete <name>\")\n .description(\"Delete a profile\")\n .action((name: string) => {\n try {\n deleteProfile(name);\n printSuccess(`Profile \"${name}\" deleted.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(del, [\n {\n description: \"Delete a profile\",\n command: \"geonic profile delete staging\",\n },\n ]);\n\n const show = profile\n .command(\"show [name]\")\n .description(\"Show profile settings\")\n .action((name?: string) => {\n const profileName = name ?? getCurrentProfile();\n const config = loadConfig(profileName);\n const entries = Object.entries(config).filter(([, v]) => v !== undefined);\n if (entries.length === 0) {\n printInfo(`Profile \"${profileName}\" has no settings.`);\n return;\n }\n for (const [key, value] of entries) {\n if (\n (key === \"token\" || key === \"refreshToken\" || key === \"apiKey\") &&\n typeof value === \"string\"\n ) {\n console.log(`${key}: ***`);\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n });\n\n addExamples(show, [\n {\n description: \"Show current profile settings\",\n command: \"geonic profile show\",\n },\n {\n description: \"Show settings for a specific profile\",\n command: \"geonic profile show production\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function addAttrsSubcommands(attrs: Command): void {\n // attrs list\n const list = attrs\n .command(\"list\")\n .description(\"List all attributes of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .action(\n withErrorHandler(\n async (entityId: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(list, [\n {\n description: \"List all attributes of an entity\",\n command: \"geonic entities attrs list urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs get\n const get = attrs\n .command(\"get\")\n .description(\"Get a specific attribute of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific attribute\",\n command: \"geonic entities attrs get urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n\n // attrs add\n const add = attrs\n .command(\"add\")\n .description(\n \"Add attributes to an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"humidity\": {\"type\": \"Property\", \"value\": 60}}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n data,\n );\n printSuccess(\"Attributes added.\");\n },\n ),\n );\n\n addExamples(add, [\n {\n description: \"Add an attribute with inline JSON\",\n command: `geonic entities attrs add urn:ngsi-ld:Sensor:001 '{\"humidity\":{\"type\":\"Property\",\"value\":60}}'`,\n },\n {\n description: \"Add attributes from a file\",\n command: \"geonic entities attrs add urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Add from stdin pipe\",\n command: \"cat attrs.json | geonic entities attrs add urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs update\n const attrUpdate = attrs\n .command(\"update\")\n .description(\n \"Update a specific attribute of an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"type\": \"Property\", \"value\": 25}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n data,\n );\n printSuccess(\"Attribute updated.\");\n },\n ),\n );\n\n addExamples(attrUpdate, [\n {\n description: \"Update a Property value\",\n command: `geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature '{\"type\":\"Property\",\"value\":25}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature @attr.json\",\n },\n ]);\n\n // attrs delete\n const del = attrs\n .command(\"delete\")\n .description(\"Delete a specific attribute from an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n printSuccess(\"Attribute deleted.\");\n },\n ),\n );\n\n addExamples(del, [\n {\n description: \"Delete a specific attribute\",\n command:\n \"geonic entities attrs delete urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n}\n\nexport function registerAttrsSubcommand(entitiesCmd: Command): void {\n const attrs = entitiesCmd\n .command(\"attrs\")\n .description(\"Manage entity attributes\");\n\n addAttrsSubcommands(attrs);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printCount, printSuccess } from \"../output.js\";\nimport { registerAttrsSubcommand } from \"./attrs.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerEntitiesCommand(program: Command): void {\n const entities = program\n .command(\"entities\")\n .description(\"Manage context entities\");\n\n // entities list\n const list = entities\n .command(\"list\")\n .description(\"List entities with optional filters\")\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--id-pattern <pat>\", \"Filter by entity ID pattern (regex)\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--spatial-id <zfxy>\", \"Spatial ID filter (ZFXY tile)\")\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--order-by <field>\", \"Order results by field\")\n .option(\"--count\", \"Include total count in response\")\n .option(\"--count-only\", \"Only show the total count without listing entities\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n\n if (opts.type) params.type = String(opts.type);\n if (opts.idPattern) params.idPattern = String(opts.idPattern);\n if (opts.query) params.q = String(opts.query);\n if (opts.attrs) params.attrs = String(opts.attrs);\n if (opts.georel) params.georel = String(opts.georel);\n if (opts.geometry) params.geometry = String(opts.geometry);\n if (opts.coords) params.coordinates = String(opts.coords);\n if (opts.spatialId) params.spatialId = String(opts.spatialId);\n if (opts.limit !== undefined) params.limit = String(opts.limit);\n if (opts.offset !== undefined) params.offset = String(opts.offset);\n if (opts.orderBy) params.orderBy = String(opts.orderBy);\n if (opts.count || opts.countOnly) params.count = \"true\";\n if (opts.countOnly) params.limit = \"0\";\n if (opts.keyValues) params.options = \"keyValues\";\n\n const response = await client.get(\"/entities\", params);\n if (opts.countOnly) {\n printCount(response.count ?? 0);\n } else {\n outputResponse(response, format, !!opts.count);\n }\n }),\n );\n\n addExamples(list, [\n {\n description: \"Filter by entity type\",\n command: \"geonic entities list --type Sensor\",\n },\n {\n description: \"Filter by entity ID pattern (regex)\",\n command: \"geonic entities list --id-pattern 'urn:ngsi-ld:Sensor:.*'\",\n },\n {\n description: \"Filter by attribute value\",\n command: \"geonic entities list --query 'temperature>30'\",\n },\n {\n description: \"AND conditions (semicolon)\",\n command: \"geonic entities list --query 'temperature>30;humidity<50'\",\n },\n {\n description: \"String match\",\n command: \"geonic entities list --query 'name==\\\"Tokyo\\\"'\",\n },\n {\n description: \"Pattern match\",\n command: \"geonic entities list --query 'name~=\\\"Tok.*\\\"'\",\n },\n {\n description: \"Check attribute existence\",\n command: \"geonic entities list --query 'temperature'\",\n },\n {\n description: \"Select specific attributes\",\n command: \"geonic entities list --attrs temperature,humidity\",\n },\n {\n description: \"Geo-query: entities near a point (within 1km)\",\n command:\n \"geonic entities list --georel 'near;maxDistance==1000' --geometry Point --coords '[139.7671,35.6812]'\",\n },\n {\n description: \"Geo-query: entities within a polygon\",\n command:\n \"geonic entities list --georel within --geometry Polygon --coords '[[[139.7,35.7],[139.8,35.7],[139.8,35.6],[139.7,35.6],[139.7,35.7]]]'\",\n },\n {\n description: \"Filter by Spatial ID (ZFXY tile)\",\n command: \"geonic entities list --spatial-id 15/0/29101/12903\",\n },\n {\n description: \"Paginate results\",\n command: \"geonic entities list --limit 20 --offset 40\",\n },\n {\n description: \"Order by attribute\",\n command: \"geonic entities list --order-by temperature\",\n },\n {\n description: \"Get total count with results\",\n command: \"geonic entities list --type Sensor --count\",\n },\n {\n description: \"Get only the total count (no entity data)\",\n command: \"geonic entities list --type Sensor --count-only\",\n },\n ]);\n\n // entities get\n const get = entities\n .command(\"get\")\n .description(\"Get a single entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (id: string, opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n if (opts.keyValues) {\n params.options = \"keyValues\";\n }\n\n const response = await client.get(\n `/entities/${encodeURIComponent(id)}`,\n params,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get entity by ID\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Get entity in keyValues format\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001 --key-values\",\n },\n ]);\n\n // entities create\n const create = entities\n .command(\"create\")\n .description(\n \"Create a new entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"id\": \"urn:ngsi-ld:Sensor:001\",\\n' +\n ' \"type\": \"Sensor\",\\n' +\n ' \"temperature\": {\"type\": \"Property\", \"value\": 25}\\n' +\n \" }\",\n )\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entities\", data);\n printSuccess(\"Entity created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from inline JSON (minimal)\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"}'`,\n },\n {\n description: \"Create with attributes\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25},\"location\":{\"type\":\"GeoProperty\",\"value\":{\"type\":\"Point\",\"coordinates\":[139.77,35.68]}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic entities create @entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat entity.json | geonic entities create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic entities create\",\n },\n ]);\n\n // entities update\n const update = entities\n .command(\"update\")\n .description(\n \"Update attributes of an entity (PATCH)\\n\\n\" +\n \"JSON payload: only specified attributes are modified.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 30}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.patch(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a Property attribute\",\n command:\n `geonic entities update urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":30}}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities update urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat attrs.json | geonic entities update urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities replace\n const replace = entities\n .command(\"replace\")\n .description(\n \"Replace all attributes of an entity (PUT)\\n\\n\" +\n \"JSON payload: all existing attributes are replaced.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 20}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity replaced.\");\n },\n ),\n );\n\n addExamples(replace, [\n {\n description: \"Replace all attributes with inline JSON\",\n command: `geonic entities replace urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":20}}'`,\n },\n {\n description: \"Replace from a file\",\n command: \"geonic entities replace urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Replace from stdin pipe\",\n command: \"cat attrs.json | geonic entities replace urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities upsert\n const upsert = entities\n .command(\"upsert\")\n .description(\"Create or update entities\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entityOperations/upsert\", data);\n printSuccess(\"Entity upserted.\");\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Upsert entities from a file\",\n command: \"geonic entities upsert @entities.json\",\n },\n {\n description: \"Upsert from stdin pipe\",\n command: \"cat entities.json | geonic entities upsert\",\n },\n ]);\n\n // entities delete\n const del = entities\n .command(\"delete\")\n .description(\"Delete an entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .action(\n withErrorHandler(async (id: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(`/entities/${encodeURIComponent(id)}`);\n printSuccess(\"Entity deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an entity by ID\",\n command: \"geonic entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // Register attrs as a subcommand of entities\n registerAttrsSubcommand(entities);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerBatchCommand(program: Command): void {\n const batch = program\n .command(\"entityOperations\")\n .alias(\"batch\")\n .description(\"Perform batch operations on entities\");\n\n // batch create\n const create = batch\n .command(\"create [json]\")\n .description(\n \"Batch create entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n ' e.g. [{\"id\": \"urn:ngsi-ld:Sensor:001\", \"type\": \"Sensor\"}, ...]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/create\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(create, [\n {\n description: \"Batch create with inline JSON\",\n command: `geonic batch create '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"},{\"id\":\"urn:ngsi-ld:Sensor:002\",\"type\":\"Sensor\"}]'`,\n },\n {\n description: \"Batch create from a file\",\n command: \"geonic batch create @entities.json\",\n },\n {\n description: \"Batch create from stdin pipe\",\n command: \"cat entities.json | geonic batch create\",\n },\n ]);\n\n // batch upsert\n const upsert = batch\n .command(\"upsert [json]\")\n .description(\n \"Batch upsert entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Creates entities that don't exist, updates those that do.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/upsert\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Batch upsert with inline JSON\",\n command: `geonic batch upsert '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25}}]'`,\n },\n {\n description: \"Batch upsert from a file\",\n command: \"geonic batch upsert @entities.json\",\n },\n {\n description: \"Batch upsert from stdin pipe\",\n command: \"cat entities.json | geonic batch upsert\",\n },\n ]);\n\n // batch update\n const update = batch\n .command(\"update [json]\")\n .description(\n \"Batch update entity attributes\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities with attributes to update.\\n\" +\n \"Each entity must include id and type; only specified attributes are modified.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/update\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(update, [\n {\n description: \"Batch update from a file\",\n command: \"geonic batch update @updates.json\",\n },\n {\n description: \"Batch update from stdin\",\n command: \"cat updates.json | geonic batch update\",\n },\n ]);\n\n // batch delete\n const del = batch\n .command(\"delete [json]\")\n .description(\n \"Batch delete entities by ID\\n\\n\" +\n 'JSON payload: an array of entity ID strings.\\n' +\n ' e.g. [\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/delete\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(del, [\n {\n description: \"Batch delete with inline JSON\",\n command: `geonic batch delete '[\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]'`,\n },\n {\n description: \"Batch delete from a file\",\n command: \"geonic batch delete @entity-ids.json\",\n },\n {\n description: \"Batch delete from stdin pipe\",\n command: \"cat entity-ids.json | geonic batch delete\",\n },\n ]);\n\n // batch query\n const query = batch\n .command(\"query [json]\")\n .description(\n \"Query entities by posting a query payload\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"attrs\": [\"temperature\"],\\n' +\n ' \"q\": \"temperature>30\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/query\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(query, [\n {\n description: \"Query with inline JSON\",\n command: `geonic batch query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query from a file\",\n command: \"geonic batch query @query.json\",\n },\n {\n description: \"Query from stdin pipe\",\n command: \"cat query.json | geonic batch query\",\n },\n ]);\n\n // batch merge\n const merge = batch\n .command(\"merge [json]\")\n .description(\n \"Batch merge-patch entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Each entity must include id and type; attributes are merge-patched.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/merge\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(merge, [\n {\n description: \"Batch merge-patch from a file\",\n command: \"geonic batch merge @patches.json\",\n },\n {\n description: \"Batch merge-patch from stdin\",\n command: \"cat patches.json | geonic batch merge\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSubscriptionsCommand(program: Command): void {\n const subscriptions = program\n .command(\"subscriptions\")\n .alias(\"sub\")\n .description(\"Manage context subscriptions\");\n\n // subscriptions list\n const list = subscriptions\n .command(\"list\")\n .description(\"List subscriptions\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/subscriptions\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all subscriptions\",\n command: \"geonic subscriptions list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic subscriptions list --limit 10 --offset 20\",\n },\n {\n description: \"List with total count\",\n command: \"geonic subscriptions list --count\",\n },\n ]);\n\n // subscriptions get\n const get = subscriptions\n .command(\"get <id>\")\n .description(\"Get a subscription by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get subscription by ID\",\n command: \"geonic subscriptions get urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions create\n const create = subscriptions\n .command(\"create [json]\")\n .description(\n \"Create a subscription\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Subscription\",\\n' +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"watchedAttributes\": [\"temperature\"],\\n' +\n ' \"notification\": {\"endpoint\": {\"uri\": \"http://localhost:3000/notify\"}}\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/subscriptions\", data);\n outputResponse(response, format);\n printSuccess(\"Subscription created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic subscriptions create '{\"type\":\"Subscription\",\"entities\":[{\"type\":\"Sensor\"}],\"watchedAttributes\":[\"temperature\"],\"notification\":{\"endpoint\":{\"uri\":\"http://localhost:3000/notify\"}}}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic subscriptions create @subscription.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat subscription.json | geonic subscriptions create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic subscriptions create\",\n },\n ]);\n\n // subscriptions update\n const update = subscriptions\n .command(\"update <id> [json]\")\n .description(\n \"Update a subscription\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated subscription\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Subscription updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic subscriptions update urn:ngsi-ld:Subscription:001 '{\"description\":\"Updated subscription\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic subscriptions update urn:ngsi-ld:Subscription:001 @sub.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat sub.json | geonic subscriptions update urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions delete\n const del = subscriptions\n .command(\"delete <id>\")\n .description(\"Delete a subscription\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Subscription deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a subscription\",\n command: \"geonic subscriptions delete urn:ngsi-ld:Subscription:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRegistrationsCommand(program: Command): void {\n const registrations = program\n .command(\"registrations\")\n .alias(\"reg\")\n .description(\"Manage context registrations\");\n\n // registrations list\n const list = registrations\n .command(\"list\")\n .description(\"List registrations\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/csourceRegistrations\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all registrations\",\n command: \"geonic registrations list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic registrations list --limit 10\",\n },\n ]);\n\n // registrations get\n const get = registrations\n .command(\"get <id>\")\n .description(\"Get a registration by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get registration by ID\",\n command:\n \"geonic registrations get urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations create\n const create = registrations\n .command(\"create [json]\")\n .description(\n \"Create a registration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"ContextSourceRegistration\",\\n' +\n ' \"information\": [{\"entities\": [{\"type\": \"Room\"}]}],\\n' +\n ' \"endpoint\": \"http://localhost:4000/source\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/csourceRegistrations\", data);\n outputResponse(response, format);\n printSuccess(\"Registration created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic registrations create '{\"type\":\"ContextSourceRegistration\",\"information\":[{\"entities\":[{\"type\":\"Room\"}]}],\"endpoint\":\"http://localhost:4000/source\"}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic registrations create @registration.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat registration.json | geonic registrations create\",\n },\n ]);\n\n // registrations update\n const regUpdate = registrations\n .command(\"update <id> [json]\")\n .description(\"Update a registration\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Registration updated.\");\n },\n ),\n );\n\n addExamples(regUpdate, [\n {\n description: \"Update endpoint\",\n command: `geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 '{\"endpoint\":\"http://localhost:5000/source\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 @registration.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat registration.json | geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations delete\n const del = registrations\n .command(\"delete <id>\")\n .description(\"Delete a registration\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Registration deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a registration\",\n command:\n \"geonic registrations delete urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerTypesCommand(program: Command): void {\n const types = program\n .command(\"types\")\n .description(\"Browse entity types\");\n\n // types list\n const list = types\n .command(\"list\")\n .description(\"List available entity types\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\"/types\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all entity types\",\n command: \"geonic types list\",\n },\n ]);\n\n // types get\n const get = types\n .command(\"get <typeName>\")\n .description(\"Get details for an entity type\")\n .action(\n withErrorHandler(\n async (typeName: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/types/${encodeURIComponent(String(typeName))}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get details for a specific type\",\n command: \"geonic types get Sensor\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction addTemporalListOptions(cmd: Command): Command {\n return cmd\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt)\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--count\", \"Include total count in response\");\n}\n\nfunction createListAction() {\n return withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.type) params[\"type\"] = cmdOpts.type;\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.query) params[\"q\"] = cmdOpts.query;\n if (cmdOpts.georel) params[\"georel\"] = cmdOpts.georel;\n if (cmdOpts.geometry) params[\"geometry\"] = cmdOpts.geometry;\n if (cmdOpts.coords) params[\"coordinates\"] = cmdOpts.coords;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/temporal/entities\", params);\n outputResponse(response, format, cmdOpts.count);\n });\n}\n\nfunction addTemporalGetOptions(cmd: Command): Command {\n return cmd\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt);\n}\n\nfunction createGetAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n\n const response = await client.get(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction createCreateAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n\n await client.post(\"/temporal/entities\", body);\n printSuccess(\"Temporal entity created.\");\n });\n}\n\nfunction createDeleteAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Temporal entity deleted.\");\n });\n}\n\nfunction createQueryAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.aggrMethods) params[\"aggrMethods\"] = cmdOpts.aggrMethods;\n if (cmdOpts.aggrPeriod) params[\"aggrPeriodDuration\"] = cmdOpts.aggrPeriod;\n\n const response = await client.post(\n \"/temporal/entityOperations/query\",\n body,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction addQueryOptions(cmd: Command): Command {\n return cmd\n .option(\"--aggr-methods <methods>\", \"Aggregation methods (e.g. totalCount,sum)\")\n .option(\"--aggr-period <period>\", \"Aggregation period (e.g. PT1H)\");\n}\n\nexport function registerTemporalCommand(program: Command): void {\n const temporal = program\n .command(\"temporal\")\n .description(\"Manage temporal entities\");\n\n const entities = temporal\n .command(\"entities\")\n .description(\"List, get, create, and delete temporal entities\");\n\n const entityOperations = temporal\n .command(\"entityOperations\")\n .description(\"Perform batch operations on temporal entities\");\n\n // temporal entities list\n const entitiesList = addTemporalListOptions(\n entities.command(\"list\").description(\"List temporal entities with optional filters\"),\n );\n entitiesList.action(createListAction());\n\n addExamples(entitiesList, [\n {\n description: \"List by type with time range\",\n command:\n \"geonic temporal entities list --type Sensor --time-rel between --time-at 2025-01-01T00:00:00Z --end-time-at 2025-01-31T23:59:59Z\",\n },\n {\n description: \"Get last 5 temporal values\",\n command: \"geonic temporal entities list --type Sensor --last-n 5\",\n },\n {\n description: \"Filter by time (after a point)\",\n command:\n \"geonic temporal entities list --time-rel after --time-at 2025-06-01T00:00:00Z\",\n },\n ]);\n\n // temporal entities get\n const entitiesGet = addTemporalGetOptions(\n entities.command(\"get <id>\").description(\"Get a temporal entity by ID\"),\n );\n entitiesGet.action(createGetAction());\n\n addExamples(entitiesGet, [\n {\n description: \"Get temporal entity with specific attributes\",\n command:\n \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --attrs temperature,humidity\",\n },\n {\n description: \"Get last 10 values for an entity\",\n command: \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --last-n 10\",\n },\n ]);\n\n // temporal entities create\n const create = entities\n .command(\"create [json]\")\n .description(\n \"Create a temporal entity\\n\\n\" +\n \"JSON payload: an NGSI-LD entity with temporal attribute instances.\\n\" +\n \"Each attribute value is an array of {value, observedAt} objects.\",\n )\n .action(createCreateAction());\n\n addExamples(create, [\n {\n description: \"Create from a file\",\n command: \"geonic temporal entities create @temporal-entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat temporal-entity.json | geonic temporal entities create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic temporal entities create\",\n },\n ]);\n\n // temporal entities delete\n const del = entities\n .command(\"delete <id>\")\n .description(\"Delete a temporal entity by ID\")\n .action(createDeleteAction());\n\n addExamples(del, [\n {\n description: \"Delete temporal data for an entity\",\n command: \"geonic temporal entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // temporal entityOperations query\n const opsQuery = addQueryOptions(\n entityOperations.command(\"query [json]\").description(\"Query temporal entities (POST)\"),\n );\n opsQuery.action(createQueryAction());\n\n addExamples(opsQuery, [\n {\n description: \"Query with inline JSON\",\n command: `geonic temporal entityOperations query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query with aggregation (hourly count)\",\n command:\n \"geonic temporal entityOperations query @query.json --aggr-methods totalCount --aggr-period PT1H\",\n },\n {\n description: \"Query from a file\",\n command: \"geonic temporal entityOperations query @query.json\",\n },\n ]);\n\n // Backward-compatible hidden aliases at the temporal level\n addTemporalListOptions(\n temporal\n .command(\"list\", { hidden: true })\n .description(\"List temporal entities (deprecated: use temporal entities list)\"),\n ).action(createListAction());\n\n addTemporalGetOptions(\n temporal\n .command(\"get <id>\", { hidden: true })\n .description(\"Get a temporal entity (deprecated: use temporal entities get)\"),\n ).action(createGetAction());\n\n temporal\n .command(\"create [json]\", { hidden: true })\n .description(\"Create a temporal entity (deprecated: use temporal entities create)\")\n .action(createCreateAction());\n\n temporal\n .command(\"delete <id>\", { hidden: true })\n .description(\"Delete a temporal entity (deprecated: use temporal entities delete)\")\n .action(createDeleteAction());\n\n addQueryOptions(\n temporal\n .command(\"query [json]\", { hidden: true })\n .description(\"Query temporal entities (deprecated: use temporal entityOperations query)\"),\n ).action(createQueryAction());\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSnapshotsCommand(program: Command): void {\n const snapshots = program\n .command(\"snapshots\")\n .description(\"Manage snapshots\");\n\n // snapshots list\n const list = snapshots\n .command(\"list\")\n .description(\"List snapshots\")\n .option(\"--limit <n>\", \"Maximum number of snapshots to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N snapshots\", parseInt)\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n\n const response = await client.get(\"/snapshots\", params);\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all snapshots\",\n command: \"geonic snapshots list\",\n },\n {\n description: \"List with a limit\",\n command: \"geonic snapshots list --limit 10\",\n },\n ]);\n\n // snapshots get\n const get = snapshots\n .command(\"get <id>\")\n .description(\"Get a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific snapshot\",\n command: \"geonic snapshots get <snapshot-id>\",\n },\n ]);\n\n // snapshots create\n const create = snapshots\n .command(\"create\")\n .description(\"Create a new snapshot\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.post(\"/snapshots\");\n printSuccess(\"Snapshot created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a new snapshot\",\n command: \"geonic snapshots create\",\n },\n ]);\n\n // snapshots delete\n const del = snapshots\n .command(\"delete <id>\")\n .description(\"Delete a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Snapshot deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a snapshot\",\n command: \"geonic snapshots delete <snapshot-id>\",\n },\n ]);\n\n // snapshots clone\n const clone = snapshots\n .command(\"clone <id>\")\n .description(\"Clone a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.post(\n `/snapshots/${encodeURIComponent(String(id))}/clone`,\n );\n if (response.data !== undefined && response.data !== \"\") {\n outputResponse(response, format);\n } else {\n printSuccess(\"Snapshot cloned.\");\n }\n }),\n );\n\n addExamples(clone, [\n {\n description: \"Clone a snapshot\",\n command: \"geonic snapshots clone <snapshot-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerTenantsCommand(parent: Command): void {\n const tenants = parent\n .command(\"tenants\")\n .description(\"Manage tenants\");\n\n // tenants list\n const list = tenants\n .command(\"list\")\n .description(\"List all tenants\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/tenants\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all tenants\",\n command: \"geonic admin tenants list\",\n },\n ]);\n\n // tenants get\n const get = tenants\n .command(\"get <id>\")\n .description(\"Get a tenant by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a tenant by ID\",\n command: \"geonic admin tenants get <tenant-id>\",\n },\n ]);\n\n // tenants create\n const create = tenants\n .command(\"create [json]\")\n .description(\n \"Create a new tenant\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"production\",\\n' +\n ' \"description\": \"Production environment tenant\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/tenants\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Tenant created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin tenants create '{\"name\":\"my-tenant\",\"description\":\"My first tenant\"}'`,\n },\n {\n description: \"Minimal (name only)\",\n command: `geonic admin tenants create '{\"name\":\"production\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin tenants create @tenant.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat tenant.json | geonic admin tenants create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic admin tenants create\",\n },\n ]);\n\n // tenants update\n const update = tenants\n .command(\"update <id> [json]\")\n .description(\n \"Update a tenant\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"name\": \"new-name\", \"description\": \"Updated description\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = (await parseJsonInput(json as string | undefined)) as Record<string, unknown>;\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Tenant updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description with inline JSON\",\n command: `geonic admin tenants update <tenant-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Rename a tenant\",\n command: `geonic admin tenants update <tenant-id> '{\"name\":\"new-name\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin tenants update <tenant-id> @patch.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat patch.json | geonic admin tenants update <tenant-id>\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic admin tenants update <tenant-id>\",\n },\n ]);\n\n // tenants delete\n const del = tenants\n .command(\"delete <id>\")\n .description(\"Delete a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Tenant deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a tenant\",\n command: \"geonic admin tenants delete <tenant-id>\",\n },\n ]);\n\n // tenants activate\n const activate = tenants\n .command(\"activate <id>\")\n .description(\"Activate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Tenant activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a tenant\",\n command: \"geonic admin tenants activate <tenant-id>\",\n },\n ]);\n\n // tenants deactivate\n const deactivate = tenants\n .command(\"deactivate <id>\")\n .description(\"Deactivate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Tenant deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a tenant\",\n command: \"geonic admin tenants deactivate <tenant-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerUsersCommand(parent: Command): void {\n const users = parent\n .command(\"users\")\n .description(\"Manage users\");\n\n // users list\n const list = users\n .command(\"list\")\n .description(\"List all users\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/users\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all users\",\n command: \"geonic admin users list\",\n },\n ]);\n\n // users get\n const get = users\n .command(\"get <id>\")\n .description(\"Get a user by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a user by ID\",\n command: \"geonic admin users get <user-id>\",\n },\n ]);\n\n // users create\n const create = users\n .command(\"create [json]\")\n .description(\n \"Create a new user\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"email\": \"user@example.com\",\\n' +\n ' \"password\": \"SecurePassword123!\",\\n' +\n ' \"role\": \"tenant_admin\",\\n' +\n ' \"tenantId\": \"<tenant-id>\"\\n' +\n \" }\\n\\n\" +\n \"Roles: super_admin, tenant_admin, user\\n\" +\n \"tenantId is required for tenant_admin and user roles.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/users\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"User created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a tenant admin\",\n command: `geonic admin users create '{\"email\":\"admin@example.com\",\"password\":\"SecurePass12345!\",\"role\":\"tenant_admin\",\"tenantId\":\"<tenant-id>\"}'`,\n },\n {\n description: \"Create a user for a tenant\",\n command: `geonic admin users create '{\"email\":\"user@example.com\",\"password\":\"SecurePass12345!\",\"role\":\"user\",\"tenantId\":\"<tenant-id>\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin users create @user.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat user.json | geonic admin users create\",\n },\n ]);\n\n // users update\n const update = users\n .command(\"update <id> [json]\")\n .description(\n \"Update a user\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"role\": \"admin\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"User updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update role with inline JSON\",\n command: `geonic admin users update <user-id> '{\"role\":\"admin\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin users update <user-id> @user.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat user.json | geonic admin users update <user-id>\",\n },\n ]);\n\n // users delete\n const del = users\n .command(\"delete <id>\")\n .description(\"Delete a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"User deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a user\",\n command: \"geonic admin users delete <user-id>\",\n },\n ]);\n\n // users activate\n const activate = users\n .command(\"activate <id>\")\n .description(\"Activate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"User activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a user\",\n command: \"geonic admin users activate <user-id>\",\n },\n ]);\n\n // users deactivate\n const deactivate = users\n .command(\"deactivate <id>\")\n .description(\"Deactivate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"User deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a user\",\n command: \"geonic admin users deactivate <user-id>\",\n },\n ]);\n\n // users unlock\n const unlock = users\n .command(\"unlock <id>\")\n .description(\"Unlock a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/unlock`,\n );\n printSuccess(\"User unlocked.\");\n }),\n );\n\n addExamples(unlock, [\n {\n description: \"Unlock a locked user account\",\n command: \"geonic admin users unlock <user-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerPoliciesCommand(parent: Command): void {\n const policies = parent\n .command(\"policies\")\n .description(\"Manage policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List all policies\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all policies\",\n command: \"geonic admin policies list\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <id>\")\n .description(\"Get a policy by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a policy by ID\",\n command: \"geonic admin policies get <policy-id>\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .description(\n \"Create a new policy\\n\\n\" +\n \"JSON payload examples:\\n\\n\" +\n \" Allow all entities:\\n\" +\n \" {\\n\" +\n ' \"description\": \"Allow all entities\",\\n' +\n ' \"rules\": [{\"ruleId\": \"allow-all\", \"effect\": \"Permit\"}]\\n' +\n \" }\\n\\n\" +\n \" Allow GET access to a specific entity type:\\n\" +\n \" {\\n\" +\n ' \"description\": \"Allow GET access to Landmark entities\",\\n' +\n ' \"target\": {\\n' +\n ' \"resources\": [{\"attributeId\": \"entityType\", \"matchValue\": \"Landmark\"}],\\n' +\n ' \"actions\": [{\"attributeId\": \"method\", \"matchValue\": \"GET\"}]\\n' +\n \" },\\n\" +\n ' \"rules\": [{\"ruleId\": \"permit-get\", \"effect\": \"Permit\"}]\\n' +\n \" }\\n\\n\" +\n \"Target fields:\\n\" +\n \" subjects — attributeId: role, userId, email, tenantId\\n\" +\n \" resources — attributeId: path, entityType, entityId, entityOwner, tenantService, servicePath\\n\" +\n \" actions — attributeId: method (GET, POST, PATCH, DELETE)\\n\\n\" +\n \"Each element: {attributeId, matchValue, matchFunction?}\\n\" +\n \" matchFunction: \\\"string-equal\\\" (default) | \\\"string-regexp\\\" | \\\"glob\\\"\\n\\n\" +\n \"Priority: smaller value = higher precedence (e.g. priority 10 overrides user default at 100).\\n\" +\n \" tenant_admin: minimum priority 10. user self-service (/me/policies): fixed at 100.\\n\\n\" +\n \"Default role policies (priority 100):\\n\" +\n \" user → /v2/** and /ngsi-ld/** all methods Permit; other data APIs GET only\\n\" +\n \" api_key → all Deny, anonymous → all Deny\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/policies\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin policies create '{\"description\":\"Allow all entities\",\"rules\":[{\"ruleId\":\"allow-all\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create with target (entity type + method)\",\n command: `geonic admin policies create '{\"description\":\"Allow GET Landmark\",\"target\":{\"resources\":[{\"attributeId\":\"entityType\",\"matchValue\":\"Landmark\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"ruleId\":\"permit-get\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create anonymous access policy\",\n command: `geonic admin policies create '{\"policyId\":\"public-read\",\"target\":{\"subjects\":[{\"attributeId\":\"role\",\"matchValue\":\"anonymous\"}],\"resources\":[{\"attributeId\":\"entityType\",\"matchValue\":\"WeatherObserved\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create servicePath-based policy (glob match)\",\n command: `geonic admin policies create '{\"description\":\"Allow read on /opendata/**\",\"priority\":100,\"target\":{\"resources\":[{\"attributeId\":\"servicePath\",\"matchValue\":\"/opendata/**\",\"matchFunction\":\"glob\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin policies create @policy.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat policy.json | geonic admin policies create\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <id> [json]\")\n .description(\n \"Update a policy\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated policy\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin policies update <policy-id> '{\"description\":\"Updated policy\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin policies update <policy-id> @policy.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat policy.json | geonic admin policies update <policy-id>\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <id>\")\n .description(\"Delete a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a policy\",\n command: \"geonic admin policies delete <policy-id>\",\n },\n ]);\n\n // policies activate\n const activate = policies\n .command(\"activate <id>\")\n .description(\"Activate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Policy activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a policy\",\n command: \"geonic admin policies activate <policy-id>\",\n },\n ]);\n\n // policies deactivate\n const deactivate = policies\n .command(\"deactivate <id>\")\n .description(\"Deactivate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Policy deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a policy\",\n command: \"geonic admin policies deactivate <policy-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerOAuthClientsCommand(parent: Command): void {\n const oauthClients = parent\n .command(\"oauth-clients\")\n .description(\"Manage OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List all OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all OAuth clients\",\n command: \"geonic admin oauth-clients list\",\n },\n ]);\n\n // oauth-clients get\n const get = oauthClients\n .command(\"get <id>\")\n .description(\"Get an OAuth client by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an OAuth client by ID\",\n command: \"geonic admin oauth-clients get <client-id>\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\n \"Create a new OAuth client\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"my-app\",\\n' +\n ' \"policyId\": \"<policy-id>\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/oauth-clients\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin oauth-clients create '{\"name\":\"my-app\",\"policyId\":\"<policy-id>\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin oauth-clients create @client.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients create\",\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <id> [json]\")\n .description(\n \"Update an OAuth client\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated client\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin oauth-clients update <client-id> '{\"description\":\"Updated client\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin oauth-clients update <client-id> @client.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients update <client-id>\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic admin oauth-clients delete <client-id>\",\n },\n ]);\n}\n\nexport function registerCaddeCommand(parent: Command): void {\n const cadde = parent\n .command(\"cadde\")\n .description(\"Manage CADDE configuration\");\n\n // cadde get\n const caddeGet = cadde\n .command(\"get\")\n .description(\"Get CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/cadde\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(caddeGet, [\n {\n description: \"Get CADDE configuration\",\n command: \"geonic admin cadde get\",\n },\n ]);\n\n // cadde set\n const caddeSet = cadde\n .command(\"set [json]\")\n .description(\n \"Set CADDE configuration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"provider\": \"my-provider\",\\n' +\n ' \"endpoint\": \"http://localhost:6000\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"PUT\", \"/admin/cadde\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"CADDE configuration set.\");\n }),\n );\n\n addExamples(caddeSet, [\n {\n description: \"Set with inline JSON\",\n command: `geonic admin cadde set '{\"provider\":\"my-provider\",\"endpoint\":\"http://localhost:6000\"}'`,\n },\n {\n description: \"Set from a JSON file\",\n command: \"geonic admin cadde set @cadde-config.json\",\n },\n {\n description: \"Set from stdin pipe\",\n command: \"cat cadde-config.json | geonic admin cadde set\",\n },\n ]);\n\n // cadde delete\n const caddeDelete = cadde\n .command(\"delete\")\n .description(\"Delete CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\"DELETE\", \"/admin/cadde\");\n printSuccess(\"CADDE configuration deleted.\");\n }),\n );\n\n addExamples(caddeDelete, [\n {\n description: \"Delete CADDE configuration\",\n command: \"geonic admin cadde delete\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../../helpers.js\";\nimport { loadConfig, saveConfig } from \"../../config.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printApiKeyBox, printError } from \"../../output.js\";\nimport { addExamples, addNotes } from \"../help.js\";\n\n/** Strip masked key placeholder from API key response for cleaner display. */\nfunction cleanApiKeyData(data: unknown): unknown {\n if (Array.isArray(data)) return data.map(cleanApiKeyData);\n if (typeof data !== \"object\" || data === null) return data;\n const obj = { ...(data as Record<string, unknown>) };\n if (obj.key === \"******\") delete obj.key;\n return obj;\n}\n\nfunction validateOrigins(body: unknown, opts: Record<string, unknown>): void {\n // Validate origins if provided via flags\n if (opts.origins !== undefined) {\n const origins = String(opts.origins).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (origins.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n // Also validate if provided via JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n}\n\nfunction buildBodyFromFlags(opts: Record<string, unknown>): Record<string, unknown> {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policy) payload.policyId = opts.policy;\n if (opts.origins) payload.allowedOrigins = (opts.origins as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.rateLimit) {\n const raw = String(opts.rateLimit).trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.tenantId) payload.tenantId = opts.tenantId;\n return payload;\n}\n\n/** Save API key to profile config and print confirmation. Returns false if key missing or save fails. */\nfunction handleSaveKey(\n data: Record<string, unknown>,\n cmd: Command,\n): boolean {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n process.exitCode = 1;\n return false;\n }\n try {\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n return true;\n } catch (err) {\n printError(`Failed to save API key to config: ${err instanceof Error ? err.message : String(err)}`);\n printApiKeyBox(key);\n process.exitCode = 1;\n return false;\n }\n}\n\n/** Show API key value prominently. Returns false if key is missing (treated as error). */\nfunction showKeyResult(\n data: Record<string, unknown>,\n save: boolean,\n cmd: Command,\n): boolean {\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. The new API key value was not returned.\");\n process.exitCode = 1;\n return false;\n }\n if (save) return handleSaveKey(data, cmd);\n printApiKeyBox(key);\n return true;\n}\n\nexport function registerApiKeysCommand(parent: Command): void {\n const apiKeys = parent\n .command(\"api-keys\")\n .description(\"Manage API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List all API keys\")\n .option(\"--tenant-id <id>\", \"Filter by tenant ID\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { tenantId?: string };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const params: Record<string, string> = {};\n if (opts.tenantId) params.tenantId = opts.tenantId;\n const response = await client.rawRequest(\"GET\", \"/admin/api-keys\", {\n params,\n });\n response.data = cleanApiKeyData(response.data);\n outputResponse(response, format);\n console.error(\"※ API キー値は作成時 (create) またはリフレッシュ時 (refresh) にのみ表示されます。\");\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all API keys\",\n command: \"geonic admin api-keys list\",\n },\n {\n description: \"List API keys for a specific tenant\",\n command: \"geonic admin api-keys list --tenant-id <tenant-id>\",\n },\n ]);\n\n // api-keys get\n const get = apiKeys\n .command(\"get <keyId>\")\n .description(\"Get an API key by ID\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n response.data = cleanApiKeyData(response.data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an API key by ID\",\n command: \"geonic admin api-keys get <key-id>\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--tenant-id <id>\", \"Tenant ID\")\n .option(\"--save\", \"Save the API key to profile config\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n tenantId?: string;\n save?: boolean;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy || opts.origins || opts.rateLimit || opts.dpopRequired !== undefined || opts.tenantId) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/api-keys\", {\n body,\n });\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, [\n \"Use --policy to attach an existing XACML policy to the API key.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an API key with a policy\",\n command: \"geonic admin api-keys create --name my-key --policy <policy-id> --origins '*'\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic admin api-keys create --name my-key --dpop-required\",\n },\n {\n description: \"Create an API key from JSON and save to config\",\n command: \"geonic admin api-keys create @key.json --save\",\n },\n ]);\n\n // api-keys refresh\n const refresh = apiKeys\n .command(\"refresh <keyId>\")\n .description(\"Refresh (rotate) an API key — generates a new key value\")\n .option(\"--save\", \"Save the new API key to profile config\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { save?: boolean };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"POST\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}/refresh`,\n );\n\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key refreshed.\");\n }),\n );\n\n addNotes(refresh, [\n \"Refreshing generates a new key value while keeping keyId, name, and policy settings.\",\n \"The previous key value is immediately invalidated.\",\n ]);\n\n addExamples(refresh, [\n {\n description: \"Refresh an API key\",\n command: \"geonic admin api-keys refresh <key-id>\",\n },\n {\n description: \"Refresh and save new key to config\",\n command: \"geonic admin api-keys refresh <key-id> --save\",\n },\n ]);\n\n // api-keys update\n const update = apiKeys\n .command(\"update <keyId> [json]\")\n .description(\"Update an API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--no-dpop-required\", \"Disable DPoP token binding\")\n .action(\n withErrorHandler(\n async (keyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy || opts.origins || opts.rateLimit || opts.dpopRequired !== undefined) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n { body },\n );\n outputResponse(response, format);\n console.error(\"API key updated.\");\n },\n ),\n );\n\n addNotes(update, [\n \"Use --policy to attach an existing XACML policy to the API key.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(update, [\n {\n description: \"Update an API key name\",\n command: \"geonic admin api-keys update <key-id> --name new-name\",\n },\n {\n description: \"Attach a policy\",\n command: \"geonic admin api-keys update <key-id> --policy <policy-id>\",\n },\n {\n description: \"Enable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --dpop-required\",\n },\n {\n description: \"Disable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --no-dpop-required\",\n },\n {\n description: \"Update an API key from a JSON file\",\n command: \"geonic admin api-keys update <key-id> @key.json\",\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key\",\n command: \"geonic admin api-keys delete <key-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { registerTenantsCommand } from \"./tenants.js\";\nimport { registerUsersCommand } from \"./users.js\";\nimport { registerPoliciesCommand } from \"./policies.js\";\nimport { registerOAuthClientsCommand, registerCaddeCommand } from \"./oauth-clients.js\";\nimport { registerApiKeysCommand } from \"./api-keys.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Manage admin resources\");\n\n registerTenantsCommand(admin);\n registerUsersCommand(admin);\n registerPoliciesCommand(admin);\n registerOAuthClientsCommand(admin);\n registerApiKeysCommand(admin);\n registerCaddeCommand(admin);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRulesCommand(program: Command): void {\n const rules = program\n .command(\"rules\")\n .description(\"Manage rule engine\");\n\n // rules list\n const list = rules\n .command(\"list\")\n .description(\"List all rules\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/rules\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all rules\",\n command: \"geonic rules list\",\n },\n ]);\n\n // rules get\n const get = rules\n .command(\"get <id>\")\n .description(\"Get a rule by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific rule\",\n command: \"geonic rules get <rule-id>\",\n },\n ]);\n\n // rules create\n const create = rules\n .command(\"create [json]\")\n .description(\n \"Create a new rule\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"high-temp-alert\",\\n' +\n ' \"description\": \"Alert on high temperature\",\\n' +\n ' \"conditions\": [{\"type\": \"celExpression\", \"expression\": \"entity.temperature > 30\"}],\\n' +\n ' \"actions\": [{\"type\": \"webhook\", \"url\": \"http://localhost:5000/alert\", \"method\": \"POST\"}]\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/rules\", { body });\n outputResponse(response, format);\n printSuccess(\"Rule created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic rules create '{\"name\":\"high-temp-alert\",\"conditions\":[{\"type\":\"celExpression\",\"expression\":\"entity.temperature > 30\"}],\"actions\":[{\"type\":\"webhook\",\"url\":\"http://localhost:5000/alert\",\"method\":\"POST\"}]}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic rules create @rule.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat rule.json | geonic rules create\",\n },\n ]);\n\n // rules update\n const update = rules\n .command(\"update <id> [json]\")\n .description(\n \"Update a rule\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n \" e.g. {\\\"description\\\": \\\"Updated rule\\\"}\",\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/rules/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Rule updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic rules update <rule-id> '{\"description\":\"Updated rule\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic rules update <rule-id> @rule.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat rule.json | geonic rules update <rule-id>\",\n },\n ]);\n\n // rules delete\n const del = rules\n .command(\"delete <id>\")\n .description(\"Delete a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Rule deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a rule\",\n command: \"geonic rules delete <rule-id>\",\n },\n ]);\n\n // rules activate\n const activate = rules\n .command(\"activate <id>\")\n .description(\"Activate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Rule activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a rule\",\n command: \"geonic rules activate <rule-id>\",\n },\n ]);\n\n // rules deactivate\n const deactivate = rules\n .command(\"deactivate <id>\")\n .description(\"Deactivate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Rule deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a rule\",\n command: \"geonic rules deactivate <rule-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerModelsCommand(program: Command): void {\n const models = program\n .command(\"custom-data-models\")\n .alias(\"models\")\n .description(\"Manage custom data models\");\n\n // models list\n const list = models\n .command(\"list\")\n .description(\"List all models\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/custom-data-models\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all models\",\n command: \"geonic models list\",\n },\n ]);\n\n // models get\n const get = models\n .command(\"get <id>\")\n .description(\"Get a model by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific model\",\n command: \"geonic models get <model-id>\",\n },\n ]);\n\n // models create\n const create = models\n .command(\"create [json]\")\n .description(\n \"Create a new model\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Sensor\",\\n' +\n ' \"domain\": \"iot\",\\n' +\n ' \"description\": \"IoT Sensor\",\\n' +\n ' \"propertyDetails\": {\\n' +\n ' \"temperature\": {\"ngsiType\": \"Property\", \"valueType\": \"Number\", \"example\": 25}\\n' +\n \" }\\n\" +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/custom-data-models\", { body });\n outputResponse(response, format);\n printSuccess(\"Model created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic models create '{\"type\":\"Sensor\",\"domain\":\"iot\",\"description\":\"IoT Sensor\",\"propertyDetails\":{\"temperature\":{\"ngsiType\":\"Property\",\"valueType\":\"Number\",\"example\":25}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic models create @model.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat model.json | geonic models create\",\n },\n ]);\n\n // models update\n const update = models\n .command(\"update <id> [json]\")\n .description(\n \"Update a model\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated model\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Model updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic models update <model-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic models update <model-id> @model.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat model.json | geonic models update <model-id>\",\n },\n ]);\n\n // models delete\n const del = models\n .command(\"delete <id>\")\n .description(\"Delete a model\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Model deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a model\",\n command: \"geonic models delete <model-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program\n .command(\"catalog\")\n .description(\"Browse DCAT-AP catalog\");\n\n // catalog get\n const get = catalog\n .command(\"get\")\n .description(\"Get the catalog\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get the DCAT-AP catalog\",\n command: \"geonic catalog get\",\n },\n ]);\n\n // catalog datasets\n const datasets = catalog\n .command(\"datasets\")\n .description(\"Manage catalog datasets\");\n\n // catalog datasets list\n const datasetsList = datasets\n .command(\"list\")\n .description(\"List all datasets\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog/datasets\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsList, [\n {\n description: \"List all catalog datasets\",\n command: \"geonic catalog datasets list\",\n },\n ]);\n\n // catalog datasets get\n const datasetsGet = datasets\n .command(\"get <id>\")\n .description(\"Get a dataset by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsGet, [\n {\n description: \"Get a specific dataset\",\n command: \"geonic catalog datasets get <dataset-id>\",\n },\n ]);\n\n // catalog datasets sample\n const datasetsSample = datasets\n .command(\"sample <id>\")\n .description(\"Get sample data for a dataset\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}/sample`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsSample, [\n {\n description: \"Get sample data for a dataset\",\n command: \"geonic catalog datasets sample <dataset-id>\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerHealthCommand(program: Command): void {\n const health = program\n .command(\"health\")\n .description(\"Check the health status of the server\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/health\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(health, [\n {\n description: \"Check server health\",\n command: \"geonic health\",\n },\n ]);\n}\n\nexport function registerVersionCommand(program: Command): void {\n const version = program\n .command(\"version\")\n .description(\"Display CLI and server version information\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n const cliVersion = pkg.version;\n\n printInfo(`CLI version: ${cliVersion}`);\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/version\");\n printInfo(\"Server version:\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(version, [\n {\n description: \"Show CLI and server version\",\n command: \"geonic version\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command, Option } from \"commander\";\nimport { addExamples } from \"./help.js\";\n\nfunction findOption(\n cmd: Command,\n program: Command,\n flag: string,\n): Option | undefined {\n return (\n cmd.options.find((o) => o.long === flag || o.short === flag) ||\n program.options.find((o) => o.long === flag || o.short === flag)\n );\n}\n\nfunction optionTakesValue(\n cmd: Command,\n program: Command,\n flag: string,\n): boolean {\n const opt = findOption(cmd, program, flag);\n if (!opt) return false;\n return !!(opt.required || opt.optional);\n}\n\nfunction findSubcommand(cmd: Command, name: string): Command | undefined {\n return cmd.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nexport function generateCompletions(\n program: Command,\n line: string,\n point: number,\n): string[] {\n const truncated = line.slice(0, point);\n const tokens = truncated.trim().split(/\\s+/).filter(Boolean);\n const startingNewWord = /\\s$/.test(truncated);\n\n // Determine partial input (what the user is currently typing)\n const partial =\n !startingNewWord && tokens.length > 1 ? tokens[tokens.length - 1] : \"\";\n\n // Tokens to walk the command tree (exclude program name and partial)\n const walkTokens = startingNewWord ? tokens.slice(1) : tokens.slice(1, -1);\n\n // Walk the command tree\n let currentCmd = program;\n let i = 0;\n\n while (i < walkTokens.length) {\n const token = walkTokens[i];\n\n if (token.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, token)) {\n i += 2; // skip option + its value\n } else {\n i += 1;\n }\n continue;\n }\n\n const sub = findSubcommand(currentCmd, token);\n if (sub) {\n currentCmd = sub;\n }\n i++;\n }\n\n // Special handling: `help` command mirrors the main command tree for completions\n if (currentCmd.name() === \"help\" && currentCmd.parent === program) {\n const helpIdx = walkTokens.indexOf(\"help\");\n const rawArgs = walkTokens.slice(helpIdx + 1);\n const helpArgs: string[] = [];\n for (let j = 0; j < rawArgs.length; j++) {\n const t = rawArgs[j];\n if (t.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, t)) {\n j++; // skip the option's value\n }\n continue;\n }\n helpArgs.push(t);\n }\n\n let target = program;\n for (const arg of helpArgs) {\n const sub = findSubcommand(target, arg);\n if (sub) target = sub;\n else break;\n }\n\n const subs = target.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n return subs.filter((s) => s.startsWith(partial));\n }\n\n // Determine predecessor token (immediately before the completion point)\n const predecessor = startingNewWord\n ? tokens[tokens.length - 1]\n : tokens.length >= 2\n ? tokens[tokens.length - 2]\n : undefined;\n\n // Case 1: Previous token is a value-taking option → complete option values\n if (\n predecessor &&\n predecessor.startsWith(\"-\") &&\n optionTakesValue(currentCmd, program, predecessor)\n ) {\n return getOptionValueCompletions(predecessor, partial);\n }\n\n // Case 2: Partial starts with '-' → complete options\n if (partial.startsWith(\"-\")) {\n return getOptionCompletions(currentCmd, program, partial);\n }\n\n // Case 3: Current command has non-hidden subcommands → complete them\n const subcommands = currentCmd.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n\n if (subcommands.length > 0) {\n return subcommands.filter((s) => s.startsWith(partial));\n }\n\n // Case 4: Command takes file arguments → signal <file>\n for (const arg of currentCmd.registeredArguments) {\n if (arg.description && arg.description.includes(\"@file\")) {\n return [\"<file>\"];\n }\n }\n\n return [];\n}\n\nfunction getOptionCompletions(\n cmd: Command,\n program: Command,\n partial: string,\n): string[] {\n const options = new Set<string>();\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n for (const opt of program.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n return [...options].filter((o) => o.startsWith(partial));\n}\n\nfunction getOptionValueCompletions(\n optionFlag: string,\n partial: string,\n): string[] {\n if (optionFlag === \"--format\" || optionFlag === \"-f\") {\n return [\"json\", \"table\", \"geojson\"].filter((v) =>\n v.startsWith(partial),\n );\n }\n return [];\n}\n\nconst ZSH_SCRIPT = `_geonic_completions() {\n local completions\n completions=(\\${(f)\"$(geonic cli completions --line=\"$BUFFER\" --point=\"$CURSOR\" 2>/dev/null)\"})\n if [[ \"\\${completions[1]}\" == \"<file>\" ]]; then\n _files\n return\n fi\n compadd -a completions\n}\ncompdef _geonic_completions geonic`;\n\nconst BASH_SCRIPT = `_geonic_completions() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local completions\n completions=$(geonic cli completions --line=\"\\${COMP_LINE}\" --point=\"\\${COMP_POINT}\" 2>/dev/null)\n if [[ \"$completions\" == \"<file>\" ]]; then\n COMPREPLY=()\n return\n fi\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n}\ncomplete -o default -F _geonic_completions geonic`;\n\nexport function registerCliCommand(program: Command): void {\n const cli = program\n .command(\"cli\")\n .summary(\"Manage CLI internals\")\n .description(\"Manage CLI internals such as shell completions.\");\n\n const completions = cli\n .command(\"completions\")\n .summary(\"Generate shell completions\")\n .description(\"Generate shell completions for geonic CLI.\")\n .option(\"--line <line>\", \"Current command line content\")\n .option(\"--point <point>\", \"Cursor position in the command line\")\n .action((opts: { line?: string; point?: string }) => {\n if (opts.line !== undefined && opts.point !== undefined) {\n const point = parseInt(opts.point, 10);\n const results = generateCompletions(program, opts.line, point);\n for (const r of results) {\n console.log(r);\n }\n }\n });\n\n const bash = completions\n .command(\"bash\")\n .description(\"Output bash completion script\")\n .action(() => {\n console.log(BASH_SCRIPT);\n });\n\n addExamples(bash, [\n {\n description: \"Print the bash completion script\",\n command: \"geonic cli completions bash\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions bash)\"',\n },\n {\n description: \"Persist in ~/.bashrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions bash)\"\\' >> ~/.bashrc',\n },\n ]);\n\n const zsh = completions\n .command(\"zsh\")\n .description(\"Output zsh completion script\")\n .action(() => {\n console.log(ZSH_SCRIPT);\n });\n\n addExamples(zsh, [\n {\n description: \"Print the zsh completion script\",\n command: \"geonic cli completions zsh\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions zsh)\"',\n },\n {\n description: \"Persist in ~/.zshrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions zsh)\"\\' >> ~/.zshrc',\n },\n ]);\n\n const version = cli\n .command(\"version\")\n .description(\"Display the CLI version\")\n .action(() => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n console.log(pkg.version);\n });\n\n addExamples(version, [\n {\n description: \"Show CLI version\",\n command: \"geonic cli version\",\n },\n ]);\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { getConfigDir, ensureConfigDir } from \"./config.js\";\n\nconst PACKAGE_NAME = \"@geolonia/geonicdb-cli\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n}\n\nconst CI_ENV_VARS = [\n \"CI\",\n \"CONTINUOUS_INTEGRATION\",\n \"BUILD_NUMBER\",\n \"GITHUB_ACTIONS\",\n \"GITLAB_CI\",\n \"CIRCLECI\",\n \"JENKINS_URL\",\n \"HUDSON_URL\",\n \"TRAVIS\",\n];\n\nfunction getCacheFile(): string {\n return join(getConfigDir(), \"update-check.json\");\n}\n\nfunction isCheckDisabled(): boolean {\n if (process.env.NO_UPDATE_NOTIFIER) return true;\n if (!process.stdout.isTTY) return true;\n for (const envVar of CI_ENV_VARS) {\n if (process.env[envVar]) return true;\n }\n return false;\n}\n\nfunction loadCache(): UpdateCache | null {\n try {\n const raw = readFileSync(getCacheFile(), \"utf-8\");\n return JSON.parse(raw) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction saveCache(cache: UpdateCache): void {\n try {\n ensureConfigDir();\n writeFileSync(getCacheFile(), JSON.stringify(cache), \"utf-8\");\n } catch {\n /* v8 ignore next -- defensive: write errors silently ignored */\n }\n}\n\nfunction shouldCheck(cache: UpdateCache | null): boolean {\n if (!cache) return true;\n return Date.now() - cache.lastCheck >= CHECK_INTERVAL_MS;\n}\n\nexport function compareSemver(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v.replace(/^v/, \"\").split(\".\").map(Number) as [number, number, number];\n const [cMajor, cMinor, cPatch] = parse(current);\n const [lMajor, lMinor, lPatch] = parse(latest);\n if (lMajor !== cMajor) return lMajor > cMajor;\n if (lMinor !== cMinor) return lMinor > cMinor;\n return lPatch > cPatch;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/* v8 ignore next 3 -- fallback for bundled builds where package.json is unavailable */\nfunction getCurrentVersion(): string {\n return process.env.npm_package_version ?? \"0.0.0\";\n}\n\nexport function formatUpdateBox(current: string, latest: string): string {\n const message = `Update available: ${current} → ${latest}`;\n const install = `Run ${chalk.cyan(`npm i -g ${PACKAGE_NAME}`)} to update`;\n const lines = [message, install];\n const maxLen = Math.max(\n ...lines.map((l) => stripAnsi(l).length),\n );\n const pad = (line: string) => {\n const visible = stripAnsi(line).length;\n return line + \" \".repeat(maxLen - visible);\n };\n const empty = \" \".repeat(maxLen);\n const top = `╭${\"─\".repeat(maxLen + 4)}╮`;\n const bottom = `╰${\"─\".repeat(maxLen + 4)}╯`;\n const boxLines = [\n top,\n `│ ${empty} │`,\n ...lines.map((l) => `│ ${pad(l)} │`),\n `│ ${empty} │`,\n bottom,\n ];\n return chalk.yellow(boxLines.join(\"\\n\"));\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport async function startUpdateCheck(): Promise<UpdateCheckResult | null> {\n if (isCheckDisabled()) return null;\n\n let currentVersion: string;\n try {\n const pkgPath = new URL(\"../package.json\", import.meta.url);\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n version: string;\n };\n currentVersion = pkg.version;\n /* v8 ignore start -- fallback for bundled builds */\n } catch {\n currentVersion = getCurrentVersion();\n }\n /* v8 ignore stop */\n\n const cache = loadCache();\n\n if (!shouldCheck(cache)) {\n if (cache?.latestVersion && compareSemver(currentVersion, cache.latestVersion)) {\n return { currentVersion, latestVersion: cache.latestVersion };\n }\n return null;\n }\n\n const latestVersion = await fetchLatestVersion();\n\n saveCache({\n lastCheck: Date.now(),\n latestVersion: latestVersion ?? cache?.latestVersion,\n });\n\n if (latestVersion && compareSemver(currentVersion, latestVersion)) {\n return { currentVersion, latestVersion };\n }\n\n return null;\n}\n\nexport function printUpdateNotification(result: UpdateCheckResult | null): void {\n if (!result) return;\n const box = formatUpdateBox(result.currentVersion, result.latestVersion);\n process.stderr.write(\"\\n\" + box + \"\\n\");\n}\n","import { createProgram } from \"./cli.js\";\nimport { startUpdateCheck, printUpdateNotification } from \"./update-notifier.js\";\n\nconst updateCheckPromise = startUpdateCheck();\nconst program = createProgram();\nawait program.parseAsync();\nconst updateResult = await updateCheckPromise;\nprintUpdateNotification(updateResult);\n"],"mappings":"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","names":["createRequire","Command","header","chalk","program","program","onData","onError","readFileSync","createInterface","config","program","program","program","program","program","program","program","program","program","cleanApiKeyData","handleSaveKey","showKeyResult","program","program","program","program","program","require","createRequire","program","require","createRequire","require","createRequire","program","Command","readFileSync","writeFileSync","join","chalk","join","readFileSync","writeFileSync","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/output.ts","../src/commands/help.ts","../src/commands/config.ts","../src/commands/auth.ts","../src/oauth.ts","../src/client.ts","../src/helpers.ts","../src/prompt.ts","../src/token.ts","../src/input.ts","../src/commands/me-oauth-clients.ts","../src/commands/me-api-keys.ts","../src/commands/me-policies.ts","../src/commands/profile.ts","../src/commands/attrs.ts","../src/commands/entities.ts","../src/commands/batch.ts","../src/commands/subscriptions.ts","../src/commands/registrations.ts","../src/commands/types.ts","../src/commands/temporal.ts","../src/commands/snapshots.ts","../src/commands/admin/tenants.ts","../src/commands/admin/users.ts","../src/commands/admin/policies.ts","../src/commands/admin/oauth-clients.ts","../src/commands/admin/api-keys.ts","../src/commands/admin/index.ts","../src/commands/rules.ts","../src/commands/models.ts","../src/commands/catalog.ts","../src/commands/health.ts","../src/commands/cli.ts","../src/update-notifier.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerProfileCommands } from \"./commands/profile.js\";\nimport { registerEntitiesCommand } from \"./commands/entities.js\";\nimport { registerBatchCommand } from \"./commands/batch.js\";\nimport { registerSubscriptionsCommand } from \"./commands/subscriptions.js\";\nimport { registerRegistrationsCommand } from \"./commands/registrations.js\";\nimport { registerTypesCommand } from \"./commands/types.js\";\nimport { registerTemporalCommand } from \"./commands/temporal.js\";\nimport { registerSnapshotsCommand } from \"./commands/snapshots.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\nimport { registerRulesCommand } from \"./commands/rules.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerHealthCommand, registerVersionCommand } from \"./commands/health.js\";\nimport { registerHelpCommand } from \"./commands/help.js\";\nimport { registerCliCommand } from \"./commands/cli.js\";\nimport { addAttrsSubcommands } from \"./commands/attrs.js\";\n\nexport function createProgram(): Command {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { description: string };\n const program = new Command();\n\n program\n .name(\"geonic\")\n .description(pkg.description)\n .option(\"-u, --url <url>\", \"Base URL of the GeonicDB server\")\n .option(\"-s, --service <name>\", \"NGSILD-Tenant header\")\n .option(\"--token <token>\", \"Authentication token\")\n .option(\"-p, --profile <name>\", \"Use a named profile\")\n .option(\"--api-key <key>\", \"API key for authentication\")\n .option(\"-f, --format <fmt>\", \"Output format: json, table, geojson\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"--dry-run\", \"Print the equivalent curl command without executing\");\n\n registerHelpCommand(program);\n registerConfigCommand(program);\n registerAuthCommands(program);\n registerProfileCommands(program);\n registerEntitiesCommand(program);\n registerBatchCommand(program);\n registerSubscriptionsCommand(program);\n registerRegistrationsCommand(program);\n registerTypesCommand(program);\n registerTemporalCommand(program);\n registerSnapshotsCommand(program);\n registerAdminCommand(program);\n registerRulesCommand(program);\n registerModelsCommand(program);\n registerCatalogCommand(program);\n registerHealthCommand(program);\n registerVersionCommand(program);\n registerCliCommand(program);\n\n // Backward-compatible hidden 'attrs' command at top level\n const hiddenAttrs = new Command(\"attrs\")\n .description(\"Manage entity attributes\");\n addAttrsSubcommands(hiddenAttrs);\n program.addCommand(hiddenAttrs, { hidden: true });\n\n return program;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { GdbConfig, GdbConfigFile } from \"./types.js\";\n\nexport function getConfigDir(): string {\n return process.env.GEONIC_CONFIG_DIR ?? join(homedir(), \".config\", \"geonic\");\n}\n\nfunction getConfigFile(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction migrateV1ToV2(data: Record<string, unknown>): GdbConfigFile {\n const profile: GdbConfig = {};\n const knownKeys = [\n \"url\",\n \"service\",\n \"tenantId\",\n \"token\",\n \"refreshToken\",\n \"format\",\n \"apiKey\",\n ];\n for (const key of knownKeys) {\n if (key in data) {\n (profile as Record<string, unknown>)[key] = data[key];\n }\n }\n return {\n version: 2,\n currentProfile: \"default\",\n profiles: { default: profile },\n };\n}\n\nfunction isGdbConfigFile(value: unknown): value is GdbConfigFile {\n /* v8 ignore next -- loadConfigFile always passes an object with version key */\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n v.version === 2 &&\n typeof v.currentProfile === \"string\" &&\n typeof v.profiles === \"object\" &&\n v.profiles !== null\n );\n}\n\nfunction defaultConfig(): GdbConfigFile {\n return { version: 2, currentProfile: \"default\", profiles: { default: {} } };\n}\n\nexport function loadConfigFile(): GdbConfigFile {\n try {\n const raw = readFileSync(getConfigFile(), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n\n if (!(\"version\" in data)) {\n const migrated = migrateV1ToV2(data);\n saveConfigFile(migrated);\n return migrated;\n }\n\n if (!isGdbConfigFile(data)) {\n return defaultConfig();\n }\n\n return data;\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfigFile(configFile: GdbConfigFile): void {\n ensureConfigDir();\n writeFileSync(getConfigFile(), JSON.stringify(configFile, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function loadConfig(profileName?: string): GdbConfig {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n return configFile.profiles[name] ?? {};\n}\n\nexport function saveConfig(config: GdbConfig, profileName?: string): void {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n configFile.profiles[name] = config;\n saveConfigFile(configFile);\n}\n\nexport function getConfigValue(key: string, profileName?: string): unknown {\n const config = loadConfig(profileName);\n return config[key as keyof GdbConfig];\n}\n\nexport function validateUrl(url: string): string {\n url = url.trim();\n if (!url) {\n throw new Error(\"URL must not be empty.\");\n }\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Invalid URL: \"${url}\". URL must start with http:// or https://.`);\n }\n try {\n new URL(url);\n } catch {\n throw new Error(`Invalid URL: \"${url}\".`);\n }\n return url.replace(/\\/+$/, \"\") + \"/\";\n}\n\nexport function setConfigValue(key: string, value: string, profileName?: string): void {\n const config = loadConfig(profileName);\n if (key === \"url\") {\n value = validateUrl(value);\n }\n (config as Record<string, unknown>)[key] = value;\n saveConfig(config, profileName);\n}\n\nexport function deleteConfigValue(key: string, profileName?: string): void {\n const config = loadConfig(profileName);\n delete (config as Record<string, unknown>)[key];\n saveConfig(config, profileName);\n}\n\nexport function getConfigPath(): string {\n return getConfigFile();\n}\n\nexport function listProfiles(): { name: string; active: boolean }[] {\n const configFile = loadConfigFile();\n return Object.keys(configFile.profiles).map((name) => ({\n name,\n active: name === configFile.currentProfile,\n }));\n}\n\nexport function getCurrentProfile(): string {\n return loadConfigFile().currentProfile;\n}\n\nexport function setCurrentProfile(name: string): void {\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n configFile.currentProfile = name;\n saveConfigFile(configFile);\n}\n\nexport function createProfile(name: string): void {\n const configFile = loadConfigFile();\n if (name in configFile.profiles) {\n throw new Error(`Profile \"${name}\" already exists.`);\n }\n configFile.profiles[name] = {};\n saveConfigFile(configFile);\n}\n\nexport function deleteProfile(name: string): void {\n if (name === \"default\") {\n throw new Error('Cannot delete the \"default\" profile.');\n }\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n delete configFile.profiles[name];\n if (configFile.currentProfile === name) {\n configFile.currentProfile = \"default\";\n }\n saveConfigFile(configFile);\n}\n","import chalk from \"chalk\";\nimport type { OutputFormat } from \"./types.js\";\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"table\":\n return formatTable(data);\n case \"geojson\":\n return JSON.stringify(toGeoJSON(data), null, 2);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\nexport function printOutput(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(message));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(message));\n}\n\nexport function printWarning(message: string): void {\n console.error(chalk.yellow(message));\n}\n\n/**\n * Print an API key value in a highlighted box so it stands out.\n */\nexport function printApiKeyBox(key: string): void {\n const border = \"─\".repeat(key.length + 4);\n console.error(\"\");\n console.error(chalk.green(` ┌${border}┐`));\n console.error(chalk.green(` │ ${chalk.bold(key)} │`));\n console.error(chalk.green(` └${border}┘`));\n console.error(\"\");\n console.error(chalk.yellow(\"⚠ この API キー値を安全に保存してください。二度と表示されません。\"));\n}\n\nexport function printCount(count: number): void {\n console.log(chalk.dim(`Count: ${count}`));\n}\n\nfunction formatTable(data: unknown): string {\n if (!Array.isArray(data)) {\n if (typeof data === \"object\" && data !== null) {\n return formatObjectTable(data as Record<string, unknown>);\n }\n return String(data);\n }\n\n if (data.length === 0) return \"(empty)\";\n\n const items = data as Record<string, unknown>[];\n const keys = collectKeys(items);\n\n const widths = new Map<string, number>();\n for (const key of keys) {\n widths.set(key, key.length);\n }\n for (const item of items) {\n for (const key of keys) {\n const val = cellValue(item[key]);\n widths.set(key, Math.max(widths.get(key)!, val.length));\n }\n }\n\n const header = keys.map((k) => chalk.bold(k.padEnd(widths.get(k)!))).join(\" \");\n const separator = keys.map((k) => \"─\".repeat(widths.get(k)!)).join(\"──\");\n const rows = items.map((item) =>\n keys.map((k) => cellValue(item[k]).padEnd(widths.get(k)!)).join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction formatObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n if (entries.length === 0) return \"(empty)\";\n\n const keyWidth = Math.max(...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${chalk.bold(k.padEnd(keyWidth))} ${cellValue(v)}`).join(\"\\n\");\n}\n\nfunction collectKeys(items: Record<string, unknown>[]): string[] {\n const priority = [\"id\", \"type\"];\n const keySet = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n keySet.add(key);\n }\n }\n const sorted: string[] = [];\n for (const p of priority) {\n if (keySet.has(p)) {\n sorted.push(p);\n keySet.delete(p);\n }\n }\n sorted.push(...Array.from(keySet).sort());\n return sorted;\n}\n\nfunction formatGeoJSON(geo: Record<string, unknown>): string {\n const geoType = String(geo.type);\n const coords = geo.coordinates;\n if (geoType === \"Point\" && Array.isArray(coords) && coords.length >= 2) {\n return `Point(${Number(coords[0]).toFixed(2)}, ${Number(coords[1]).toFixed(2)})`;\n }\n if (Array.isArray(coords)) {\n const count = geoType === \"Polygon\"\n ? (Array.isArray(coords[0]) ? (coords[0] as unknown[]).length : 0)\n : coords.length;\n return `${geoType}(${count} coords)`;\n }\n return `${geoType}(...)`;\n}\n\nfunction isGeoJSON(v: unknown): boolean {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o.type === \"string\" && \"coordinates\" in o;\n}\n\nfunction cellValue(val: unknown): string {\n if (val === undefined || val === null) return \"\";\n if (typeof val !== \"object\") return String(val);\n const obj = val as Record<string, unknown>;\n if (isGeoJSON(obj)) return formatGeoJSON(obj);\n if (\"value\" in obj) {\n const v = obj.value;\n if (isGeoJSON(v)) return formatGeoJSON(v as Record<string, unknown>);\n return String(v);\n }\n return JSON.stringify(val);\n}\n\nfunction toGeoJSON(data: unknown): unknown {\n if (Array.isArray(data)) {\n return {\n type: \"FeatureCollection\",\n features: data.map(entityToFeature),\n };\n }\n return entityToFeature(data);\n}\n\nfunction entityToFeature(entity: unknown): unknown {\n if (typeof entity !== \"object\" || entity === null) {\n return { type: \"Feature\", geometry: null, properties: entity };\n }\n\n const obj = entity as Record<string, unknown>;\n let geometry = null;\n\n if (obj.location) {\n const loc = obj.location as Record<string, unknown>;\n geometry = loc.value ?? loc;\n }\n\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"location\") continue;\n if (typeof value === \"object\" && value !== null && \"value\" in (value as object)) {\n properties[key] = (value as Record<string, unknown>).value;\n } else {\n properties[key] = value;\n }\n }\n\n return { type: \"Feature\", geometry, properties };\n}\n","import chalk from \"chalk\";\nimport type { Command, Help, Option } from \"commander\";\n\ninterface Example {\n description: string;\n command: string;\n}\n\nconst examplesMap = new WeakMap<Command, Example[]>();\nconst notesMap = new WeakMap<Command, string[]>();\n\nexport function addExamples(cmd: Command, examples: Example[]): void {\n examplesMap.set(cmd, examples);\n}\n\nexport function addNotes(cmd: Command, notes: string[]): void {\n notesMap.set(cmd, notes);\n}\n\nfunction header(title: string): string {\n return chalk.yellow.bold(title);\n}\n\nfunction findCommand(parent: Command, name: string): Command | undefined {\n return parent.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nfunction getCommandPath(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current) {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nfunction getRootProgram(cmd: Command): Command {\n let root = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n}\n\nfunction formatOptionSynopsis(opt: Option): string {\n /* v8 ignore next -- Commander always sets long or short */\n const flag = opt.long || opt.short || \"\";\n if (opt.required) {\n const match = opt.flags.match(/<([^>]+)>/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}=<${valueName}>]`;\n } else if (opt.optional) {\n const match = opt.flags.match(/\\[([^\\]]+)\\]/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}[=<${valueName}>]]`;\n }\n return `[${flag}]`;\n}\n\nfunction formatSynopsis(path: string, cmd: Command): string {\n const parts = [path];\n\n for (const arg of cmd.registeredArguments) {\n if (arg.required) {\n parts.push(`<${arg.name()}>`);\n } else {\n parts.push(`[<${arg.name()}>]`);\n }\n }\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n parts.push(formatOptionSynopsis(opt));\n }\n\n return parts.join(\" \");\n}\n\nfunction formatOptionList(options: readonly Option[]): string[] {\n const maxLen = Math.max(...options.map((o) => o.flags.length));\n return options.map((opt) => {\n const flags = opt.flags.padEnd(maxLen + 2);\n /* v8 ignore next -- Commander always sets description to '' */\n return ` ${chalk.green(flags)}${opt.description ?? \"\"}`;\n });\n}\n\nfunction formatGlobalParameters(program: Command): string {\n const lines: string[] = [];\n lines.push(header(\"GLOBAL PARAMETERS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(program.options));\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function formatTopLevelHelp(program: Command): string {\n const lines: string[] = [];\n\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n lines.push(` ${program.name()}`);\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n lines.push(` ${program.description()}`);\n lines.push(\"\");\n lines.push(header(\"AVAILABLE COMMANDS\"));\n lines.push(\"\");\n\n const commands = program.commands\n .filter((c) => !(c as Command & { _hidden?: boolean })._hidden)\n .slice()\n .sort((a, b) => a.name().localeCompare(b.name()));\n\n const maxLen = Math.max(...commands.map((c) => c.name().length));\n\n for (const cmd of commands) {\n const name = cmd.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${cmd.summary() || cmd.description()}`);\n }\n\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nexport function formatCommandDetails(\n program: Command,\n cmd: Command,\n path: string,\n): string {\n const lines: string[] = [];\n\n // NAME\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n const aliases = cmd.aliases().filter((a) => a.length > 0);\n if (aliases.length > 0) {\n lines.push(` ${path} ${chalk.dim(`(alias: ${aliases.join(\", \")})`)}`);\n } else {\n lines.push(` ${path}`);\n }\n\n // DESCRIPTION\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n for (const descLine of cmd.description().split(\"\\n\")) {\n lines.push(` ${descLine}`);\n }\n\n const subcommands = cmd.commands.filter(\n (c) => !(c as Command & { _hidden?: boolean })._hidden,\n );\n\n if (subcommands.length > 0) {\n // Command group with subcommands\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${path} <command>`);\n lines.push(\"\");\n lines.push(header(\"SUBCOMMANDS\"));\n lines.push(\"\");\n\n const maxLen = Math.max(...subcommands.map((c) => c.name().length));\n for (const sub of subcommands) {\n const name = sub.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${sub.summary() || sub.description()}`);\n }\n } else {\n // Leaf command\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${formatSynopsis(path, cmd)}`);\n\n const options = cmd.options.filter((o) => !o.hidden);\n if (options.length > 0) {\n lines.push(\"\");\n lines.push(header(\"OPTIONS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(options));\n }\n }\n\n // EXAMPLES\n const examples = examplesMap.get(cmd);\n if (examples && examples.length > 0) {\n lines.push(\"\");\n lines.push(header(\"EXAMPLES\"));\n lines.push(\"\");\n for (const ex of examples) {\n lines.push(` ${ex.description}:`);\n lines.push(` $ ${ex.command}`);\n lines.push(\"\");\n }\n }\n\n // NOTES\n const notes = notesMap.get(cmd);\n if (notes && notes.length > 0) {\n lines.push(\"\");\n lines.push(header(\"NOTES\"));\n lines.push(\"\");\n for (const note of notes) {\n lines.push(` ${note}`);\n }\n }\n\n // GLOBAL PARAMETERS\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nfunction showHelp(program: Command, args: string[]): void {\n if (args.length === 0) {\n console.log(formatTopLevelHelp(program));\n return;\n }\n\n let current = program;\n const resolved: Command[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const found = findCommand(current, args[i]);\n if (!found) {\n const attempted = args.slice(0, i + 1).join(\" \");\n console.error(\n chalk.red(`Error: '${attempted}' is not a geonic command.`),\n );\n console.error(`\\nSee 'geonic help' for available commands.`);\n process.exit(1);\n }\n resolved.push(found);\n current = found;\n }\n\n const target = resolved[resolved.length - 1];\n const path = [program.name(), ...resolved.map((c) => c.name())].join(\" \");\n\n console.log(formatCommandDetails(program, target, path));\n}\n\nexport function registerHelpCommand(program: Command): void {\n // Disable Commander's built-in help command\n program.addHelpCommand(false);\n\n // Override --help to use our wp-cli style format\n program.configureHelp({\n formatHelp: (cmd: Command, _helper: Help): string => {\n const root = getRootProgram(cmd);\n if (cmd === root) {\n return formatTopLevelHelp(root);\n }\n const path = getCommandPath(cmd);\n return formatCommandDetails(root, cmd, path);\n },\n });\n\n // Register the `help` command\n program\n .command(\"help\")\n .description(\"Get help on a specific command\")\n .argument(\"[args...]\")\n .allowUnknownOption()\n .action((args: string[]) => {\n showHelp(program, args);\n });\n\n // Show help when `geonic` is run with no arguments, or show error for unknown commands\n program.argument(\"[command...]\").action((commands: string[]) => {\n if (commands.length > 0) {\n console.error(\n `geonic: '${commands[0]}' is not a geonic command. See 'geonic help'.`,\n );\n process.exitCode = 1;\n return;\n }\n showHelp(program, []);\n });\n}\n","import type { Command } from \"commander\";\nimport {\n loadConfig,\n getConfigValue,\n setConfigValue,\n deleteConfigValue,\n getConfigPath,\n} from \"../config.js\";\nimport { printOutput, printSuccess, printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"token\", \"refreshToken\", \"apiKey\"]);\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n const set = config\n .command(\"set\")\n .description(\"Save a config value\")\n .argument(\n \"<key>\",\n \"Configuration key (url, service, token, refreshToken, format, apiKey)\",\n )\n .argument(\"<value>\", \"Configuration value\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const value = args[1] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n setConfigValue(key, value, profile);\n const display = SENSITIVE_CONFIG_KEYS.has(key) ? \"***\" : value;\n printSuccess(`Set ${key} = ${display}`);\n });\n\n addExamples(set, [\n {\n description: \"Set server URL\",\n command: \"geonic config set url https://api.example.com\",\n },\n {\n description: \"Set tenant (NGSILD-Tenant header)\",\n command: \"geonic config set service my-tenant\",\n },\n {\n description: \"Set authentication token\",\n command: \"geonic config set token eyJhbGciOi...\",\n },\n {\n description: \"Set API key\",\n command: \"geonic config set apiKey your-api-key\",\n },\n {\n description: \"Set default output format\",\n command: \"geonic config set format table\",\n },\n {\n description: \"Set config for a specific profile\",\n command:\n \"geonic config set url https://staging.example.com --profile staging\",\n },\n ]);\n\n const get = config\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const value = getConfigValue(key, profile);\n if (value === undefined) {\n printInfo(`Key \"${key}\" is not set.`);\n } else {\n printOutput(value, \"json\");\n }\n });\n\n addExamples(get, [\n {\n description: \"Get server URL\",\n command: \"geonic config get url\",\n },\n {\n description: \"Get config value for a specific profile\",\n command: \"geonic config get url --profile staging\",\n },\n ]);\n\n const list = config\n .command(\"list\")\n .description(\"List all config values for the active (or specified) profile\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const all = loadConfig(profile);\n if (Object.keys(all).length === 0) {\n printInfo(`No configuration set. Config path: ${getConfigPath()}`);\n } else {\n printOutput(all, \"json\");\n }\n });\n\n addExamples(list, [\n {\n description: \"List all configuration values\",\n command: \"geonic config list\",\n },\n {\n description: \"List config for a specific profile\",\n command: \"geonic config list --profile staging\",\n },\n ]);\n\n const del = config\n .command(\"delete\")\n .description(\"Remove a config key from the active (or specified) profile\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n deleteConfigValue(key, profile);\n printSuccess(`Deleted key \"${key}\".`);\n });\n\n addExamples(del, [\n {\n description: \"Remove the saved server URL\",\n command: \"geonic config delete url\",\n },\n {\n description: \"Clear the saved authentication token\",\n command: \"geonic config delete token\",\n },\n {\n description: \"Remove API key from a specific profile\",\n command: \"geonic config delete apiKey --profile staging\",\n },\n ]);\n}\n","import { createHash } from \"node:crypto\";\nimport { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n resolveOptions,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { loadConfig, saveConfig, getCurrentProfile, validateUrl } from \"../config.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { isInteractive, promptEmail, promptPassword, promptTenantSelection } from \"../prompt.js\";\nimport type { TenantChoice } from \"../prompt.js\";\nimport { getTokenStatus, formatDuration } from \"../token.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples } from \"./help.js\";\nimport { addMeOAuthClientsSubcommand } from \"./me-oauth-clients.js\";\nimport { addMeApiKeysSubcommand } from \"./me-api-keys.js\";\nimport { addMePoliciesSubcommand } from \"./me-policies.js\";\n\nfunction createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\"Authenticate and save token\")\n .option(\"--client-credentials\", \"Use OAuth 2.0 Client Credentials flow\")\n .option(\"--client-id <id>\", \"OAuth client ID\")\n .option(\"--client-secret <secret>\", \"OAuth client secret\")\n .option(\"--scope <scopes>\", \"OAuth scopes (space-separated)\")\n .option(\"--tenant-id <id>\", \"Tenant ID for scoped authentication\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const loginOpts = cmd.opts() as {\n clientCredentials?: boolean;\n clientId?: string;\n clientSecret?: string;\n scope?: string;\n tenantId?: string;\n };\n const globalOpts = resolveOptions(cmd);\n\n if (loginOpts.clientCredentials) {\n const clientId = loginOpts.clientId ?? process.env.GDB_OAUTH_CLIENT_ID;\n const clientSecret = loginOpts.clientSecret ?? process.env.GDB_OAUTH_CLIENT_SECRET;\n\n if (!clientId || !clientSecret) {\n printError(\n \"Client ID and secret are required. Use --client-id/--client-secret or GDB_OAUTH_CLIENT_ID/GDB_OAUTH_CLIENT_SECRET.\",\n );\n process.exit(1);\n }\n\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const result = await clientCredentialsGrant({\n baseUrl: globalOpts.url,\n clientId,\n clientSecret,\n scope: loginOpts.scope,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.token = result.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful (OAuth Client Credentials). Token saved to config.\");\n return;\n }\n\n // Email/password flow (interactive only)\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n try {\n validateUrl(globalOpts.url);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n\n if (!isInteractive()) {\n printError(\n \"Interactive terminal required. Run `geonic auth login` in a terminal with TTY.\",\n );\n process.exit(1);\n }\n\n const email = await promptEmail();\n const password = await promptPassword();\n\n const client = createClient(cmd);\n const body: Record<string, string> = { email, password };\n\n // --tenant-id takes priority\n const requestTenantId = loginOpts.tenantId;\n const serviceFlag = globalOpts.service;\n\n if (requestTenantId) {\n body.tenantId = requestTenantId;\n }\n\n const response = await client.rawRequest(\"POST\", \"/auth/login\", {\n body,\n skipTenantHeader: true,\n });\n\n const data = response.data as Record<string, unknown>;\n let token = (data.accessToken ?? data.token) as string | undefined;\n let refreshToken = data.refreshToken as string | undefined;\n\n if (!token) {\n printError(\"No token received from server.\");\n process.exit(1);\n }\n\n // Handle multi-tenant: show available tenants and prompt for selection\n const availableTenants = data.availableTenants as TenantChoice[] | undefined;\n let finalTenantId = data.tenantId as string | undefined;\n\n if (availableTenants && availableTenants.length > 1 && !requestTenantId) {\n // If --service was provided, resolve tenant by name or ID match\n let resolvedTenantId: string | undefined;\n if (serviceFlag) {\n const match = availableTenants.find(\n (t) => t.name === serviceFlag || t.tenantId === serviceFlag,\n );\n if (match) {\n resolvedTenantId = match.tenantId;\n } else {\n printError(\n `Tenant \"${serviceFlag}\" not found. Available: ${availableTenants.map((t) => t.name ?? t.tenantId).join(\", \")}`,\n );\n process.exit(1);\n }\n }\n\n if (!resolvedTenantId) {\n resolvedTenantId = await promptTenantSelection(availableTenants, finalTenantId);\n }\n\n if (resolvedTenantId && resolvedTenantId !== finalTenantId) {\n // Re-login with selected tenant\n const reloginResponse = await client.rawRequest(\"POST\", \"/auth/login\", {\n body: { email, password, tenantId: resolvedTenantId },\n skipTenantHeader: true,\n });\n const reloginData = reloginResponse.data as Record<string, unknown>;\n const newToken = (reloginData.accessToken ?? reloginData.token) as string | undefined;\n if (!newToken) {\n printError(\"Re-login failed: no token received for selected tenant.\");\n process.exit(1);\n }\n token = newToken;\n refreshToken = reloginData.refreshToken as string | undefined;\n finalTenantId = resolvedTenantId;\n }\n }\n\n const config = loadConfig(globalOpts.profile);\n config.token = token;\n if (refreshToken) {\n config.refreshToken = refreshToken;\n } else {\n delete config.refreshToken;\n }\n if (finalTenantId) {\n config.service = finalTenantId;\n config.tenantId = finalTenantId;\n } else {\n delete config.service;\n delete config.tenantId;\n }\n if (availableTenants && availableTenants.length > 0) {\n config.availableTenants = availableTenants.map((t) => ({\n tenantId: t.tenantId,\n ...(t.name ? { name: t.name } : {}),\n role: t.role,\n }));\n } else {\n delete config.availableTenants;\n }\n saveConfig(config, globalOpts.profile);\n\n const tenantLabel = finalTenantId\n ? ` (tenant: ${availableTenants?.find((t) => t.tenantId === finalTenantId)?.name ?? finalTenantId})`\n : \"\";\n printSuccess(`Login successful${tenantLabel}. Token saved to config.`);\n }),\n );\n}\n\nfunction createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Clear saved authentication token and notify the server\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n const config = loadConfig(globalOpts.profile);\n\n // Try to notify server (best effort)\n if (config.token && globalOpts.url) {\n try {\n const client = createClient(cmd);\n await client.rawRequest(\"POST\", \"/auth/logout\");\n } catch {\n // Ignore errors - token may already be invalid\n }\n }\n\n delete config.token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Logged out. Token cleared from config.\");\n }),\n );\n}\n\nfunction createMeAction() {\n return withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n\n if (!globalOpts.token && !globalOpts.apiKey) {\n printInfo(\"Not logged in. Use `geonic auth login` to authenticate.\");\n return;\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me\");\n outputResponse(response, format);\n\n // Suppress additional human-readable logs for structured formats\n if (format && format !== \"table\") {\n return;\n }\n\n // Show token expiry if token exists (re-read in case of auto-refresh)\n const latestConfig = loadConfig(globalOpts.profile);\n if (latestConfig.token) {\n const status = getTokenStatus(latestConfig.token);\n if (status.expiresAt) {\n if (status.isExpired) {\n printError(`Token expires: ${status.expiresAt.toISOString()} (expired)`);\n } else if (status.isExpiringSoon) {\n printWarning(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n } else {\n printInfo(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n }\n }\n }\n\n // Show current profile\n const profileName = globalOpts.profile ?? getCurrentProfile();\n printInfo(`Profile: ${profileName}`);\n });\n}\n\nasync function fetchNonce(\n baseUrl: string,\n apiKey: string,\n): Promise<{ nonce: string; challenge: string; difficulty: number }> {\n const origin = new URL(baseUrl).origin;\n const url = new URL(\"/auth/nonce\", baseUrl).toString();\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({ api_key: apiKey }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Nonce request failed: ${text || `HTTP ${response.status}`}`);\n }\n\n return (await response.json()) as { nonce: string; challenge: string; difficulty: number };\n}\n\nfunction createNonceCommand(): Command {\n return new Command(\"nonce\")\n .description(\"Request a nonce and Proof-of-Work challenge (step 1 of API key to JWT exchange)\")\n .option(\"--api-key <key>\", \"API key to get nonce for\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const nonceOpts = cmd.opts() as { apiKey?: string };\n const globalOpts = resolveOptions(cmd);\n const apiKey = nonceOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const data = await fetchNonce(baseUrl, apiKey);\n const format = getFormat(cmd);\n outputResponse({ status: 200, headers: new Headers(), data }, format);\n }),\n );\n}\n\nfunction hasLeadingZeroBits(hash: Buffer, bits: number): boolean {\n const fullBytes = Math.floor(bits / 8);\n const remainingBits = bits % 8;\n for (let i = 0; i < fullBytes; i++) {\n if (hash[i] !== 0) return false;\n }\n if (remainingBits > 0) {\n const mask = 0xff << (8 - remainingBits);\n if ((hash[fullBytes] & mask) !== 0) return false;\n }\n return true;\n}\n\nconst MAX_POW_ITERATIONS = 10_000_000;\n\nfunction solvePoW(challenge: string, difficulty: number): number {\n for (let nonce = 0; nonce < MAX_POW_ITERATIONS; nonce++) {\n const hash = createHash(\"sha256\")\n .update(`${challenge}${nonce}`)\n .digest();\n if (hasLeadingZeroBits(hash, difficulty)) return nonce;\n }\n throw new Error(`PoW could not be solved within ${MAX_POW_ITERATIONS} iterations`);\n}\n\nfunction createTokenExchangeCommand(): Command {\n return new Command(\"token-exchange\")\n .description(\"Exchange an API key for a session JWT (fetches nonce, solves PoW, returns token)\")\n .option(\"--api-key <key>\", \"API key to exchange\")\n .option(\"--save\", \"Save the obtained token to profile config\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const exchangeOpts = cmd.opts() as { apiKey?: string; save?: boolean };\n const globalOpts = resolveOptions(cmd);\n const apiKey = exchangeOpts.apiKey ?? globalOpts.apiKey;\n\n if (!apiKey) {\n printError(\"API key is required. Use --api-key or configure it with `geonic config set api-key <key>`.\");\n process.exit(1);\n }\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const baseUrl = validateUrl(globalOpts.url);\n const origin = new URL(baseUrl).origin;\n\n // Step 1: Get nonce\n const nonceData = await fetchNonce(baseUrl, apiKey);\n\n printInfo(`Nonce received. Solving PoW (difficulty=${nonceData.difficulty})...`);\n\n // Step 2: Solve PoW\n const powNonce = solvePoW(nonceData.challenge, nonceData.difficulty);\n\n // Step 3: Exchange for JWT\n const tokenUrl = new URL(\"/oauth/token\", baseUrl).toString();\n const tokenResponse = await fetch(tokenUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Origin\": origin,\n },\n body: JSON.stringify({\n grant_type: \"api_key\",\n api_key: apiKey,\n nonce: nonceData.nonce,\n proof: String(powNonce),\n }),\n });\n\n if (!tokenResponse.ok) {\n const text = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${text || `HTTP ${tokenResponse.status}`}`);\n }\n\n const tokenData = (await tokenResponse.json()) as {\n access_token: string;\n token_type: string;\n expires_in?: number;\n };\n\n if (exchangeOpts.save) {\n const config = loadConfig(globalOpts.profile);\n config.token = tokenData.access_token;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Token exchange successful. Token saved to config.\");\n } else {\n const format = getFormat(cmd);\n outputResponse({ status: tokenResponse.status, headers: tokenResponse.headers, data: tokenData }, format);\n printSuccess(\"Token exchange successful.\");\n }\n }),\n );\n}\n\nexport function registerAuthCommands(program: Command): void {\n // auth command group with login/logout subcommands\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication\");\n\n const login = createLoginCommand();\n addExamples(login, [\n {\n description: \"Interactive login (email/password prompt)\",\n command: \"geonic auth login\",\n },\n {\n description: \"Login with OAuth client credentials\",\n command:\n \"geonic auth login --client-credentials --client-id MY_ID --client-secret MY_SECRET\",\n },\n {\n description: \"Login to a specific tenant by ID\",\n command: \"geonic auth login --tenant-id my-tenant\",\n },\n {\n description: \"Login to a tenant by name\",\n command: \"geonic auth login -s demo_smartcity\",\n },\n ]);\n auth.addCommand(login);\n\n const logout = createLogoutCommand();\n addExamples(logout, [\n {\n description: \"Clear saved authentication token\",\n command: \"geonic auth logout\",\n },\n {\n description: \"Logout from a specific profile\",\n command: \"geonic auth logout --profile staging\",\n },\n ]);\n auth.addCommand(logout);\n\n const nonce = createNonceCommand();\n addExamples(nonce, [\n {\n description: \"Get a nonce for API key authentication\",\n command: \"geonic auth nonce --api-key gdb_abcdef...\",\n },\n {\n description: \"Use a pre-configured API key\",\n command: \"geonic auth nonce\",\n },\n ]);\n auth.addCommand(nonce);\n\n const tokenExchange = createTokenExchangeCommand();\n addExamples(tokenExchange, [\n {\n description: \"Exchange API key for a JWT and save it to the active profile\",\n command: \"geonic auth token-exchange --api-key gdb_abcdef... --save\",\n },\n {\n description: \"Exchange and print the JWT without saving\",\n command: \"geonic auth token-exchange --api-key gdb_abcdef...\",\n },\n {\n description: \"Use a pre-configured API key and save the resulting token\",\n command: \"geonic auth token-exchange --save\",\n },\n ]);\n auth.addCommand(tokenExchange);\n\n // me command (top-level, maps to /me API endpoint)\n const me = program\n .command(\"me\")\n .description(\"Display current authenticated user and manage user resources\");\n\n // Default action: show user info when no subcommand is given\n const meInfo = me\n .command(\"info\", { isDefault: true, hidden: true })\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n\n addExamples(me, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n ]);\n\n addExamples(meInfo, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n ]);\n\n // Add me oauth-clients subcommands\n addMeOAuthClientsSubcommand(me);\n\n // Add me api-keys subcommands\n addMeApiKeysSubcommand(me);\n\n // Add me policies subcommands\n addMePoliciesSubcommand(me);\n\n // Backward-compatible hidden aliases\n program.addCommand(createLoginCommand(), { hidden: true });\n program.addCommand(createLogoutCommand(), { hidden: true });\n\n const hiddenWhoami = new Command(\"whoami\")\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n program.addCommand(hiddenWhoami, { hidden: true });\n}\n","export interface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n}\n\nexport async function clientCredentialsGrant(options: {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n scope?: string;\n}): Promise<OAuthTokenResponse> {\n const url = new URL(\"/oauth/token\", options.baseUrl).toString();\n const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString(\"base64\");\n\n const body: Record<string, string> = { grant_type: \"client_credentials\" };\n if (options.scope) {\n body.scope = options.scope;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message: string;\n try {\n const err = JSON.parse(text) as Record<string, unknown>;\n message = (err.error_description ?? err.error ?? text) as string;\n } catch {\n message = text || `HTTP ${response.status}`;\n }\n throw new Error(`OAuth token request failed: ${message}`);\n }\n\n return (await response.json()) as OAuthTokenResponse;\n}\n","import type { ClientOptions, ClientResponse, NgsiError } from \"./types.js\";\nimport { clientCredentialsGrant } from \"./oauth.js\";\n\nexport class DryRunSignal extends Error {\n constructor() {\n super(\"dry-run\");\n this.name = \"DryRunSignal\";\n }\n}\n\nexport class GdbClient {\n private baseUrl: string;\n private service?: string;\n private token?: string;\n private refreshToken?: string;\n private apiKey?: string;\n private clientId?: string;\n private clientSecret?: string;\n private onTokenRefresh?: (token: string, refreshToken?: string) => void;\n private onBeforeRefresh?: () => { token?: string; refreshToken?: string };\n private verbose: boolean;\n private dryRun: boolean;\n private refreshPromise?: Promise<boolean>;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.service = options.service;\n this.token = options.token;\n this.refreshToken = options.refreshToken;\n this.apiKey = options.apiKey;\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.onTokenRefresh = options.onTokenRefresh;\n this.onBeforeRefresh = options.onBeforeRefresh;\n this.verbose = options.verbose ?? false;\n this.dryRun = options.dryRun ?? false;\n }\n\n private buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {};\n\n headers[\"Content-Type\"] = \"application/ld+json\";\n headers[\"Accept\"] = \"application/ld+json\";\n if (this.service) headers[\"NGSILD-Tenant\"] = this.service;\n\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n } else if (this.apiKey) {\n headers[\"X-Api-Key\"] = this.apiKey;\n }\n\n if (extra) {\n Object.assign(headers, extra);\n }\n\n return headers;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n return url.toString();\n }\n\n private getBasePath(): string {\n return \"/ngsi-ld/v1\";\n }\n\n private static readonly SENSITIVE_HEADERS = new Set([\"authorization\", \"x-api-key\"]);\n private static readonly SENSITIVE_BODY_KEYS = new Set([\n \"password\",\n \"refreshToken\",\n \"token\",\n \"client_secret\",\n \"clientSecret\",\n \"key\",\n \"apiKey\",\n ]);\n\n private logRequest(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.verbose) return;\n process.stderr.write(`> ${method} ${url}\\n`);\n for (const [k, v] of Object.entries(headers)) {\n if (GdbClient.SENSITIVE_HEADERS.has(k.toLowerCase())) {\n process.stderr.write(`> ${k}: ***\\n`);\n } else {\n process.stderr.write(`> ${k}: ${v}\\n`);\n }\n }\n if (body) {\n process.stderr.write(`> Body: ${GdbClient.maskBodySecrets(body)}\\n`);\n }\n process.stderr.write(\"\\n\");\n }\n\n private static maskBodySecrets(raw: string): string {\n try {\n const obj = JSON.parse(raw) as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (GdbClient.SENSITIVE_BODY_KEYS.has(key)) {\n obj[key] = \"***\";\n }\n }\n return JSON.stringify(obj);\n } catch {\n return raw;\n }\n }\n\n private logResponse(response: Response): void {\n if (!this.verbose) return;\n process.stderr.write(`< ${response.status} ${response.statusText}\\n`);\n response.headers.forEach((v, k) => {\n process.stderr.write(`< ${k}: ${v}\\n`);\n });\n process.stderr.write(\"\\n\");\n }\n\n private static shellQuote(value: string): string {\n return `'${value.split(\"'\").join(\"'\\\"'\\\"'\")}'`;\n }\n\n static buildCurlCommand(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): string {\n const parts: string[] = [\"curl\"];\n if (method !== \"GET\") {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H ${GdbClient.shellQuote(`${key}: ${value}`)}`);\n }\n if (body) {\n parts.push(`-d ${GdbClient.shellQuote(body)}`);\n }\n parts.push(GdbClient.shellQuote(url));\n return parts.join(\" \\\\\\n \");\n }\n\n private handleDryRun(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.dryRun) return;\n console.log(GdbClient.buildCurlCommand(method, url, headers, body));\n throw new DryRunSignal();\n }\n\n private canRefresh(): boolean {\n return (!!this.refreshToken || (!!this.clientId && !!this.clientSecret)) && !this.apiKey;\n }\n\n /** Check whether an error indicates an authentication/token problem that may be resolved by refreshing. */\n private static isTokenError(err: GdbClientError): boolean {\n if (err.status === 401) return true;\n // The server returns 403 for malformed / expired JWTs in some cases\n if (err.status === 403) {\n const msg = (err.message ?? \"\").toLowerCase();\n return msg.includes(\"not assigned to any tenant\") || msg.includes(\"invalid token\");\n }\n return false;\n }\n\n private async performTokenRefresh(): Promise<boolean> {\n if (this.refreshPromise) return this.refreshPromise;\n\n this.refreshPromise = this.doRefresh();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = undefined;\n }\n }\n\n private async doRefresh(): Promise<boolean> {\n // Re-read config to pick up tokens saved by another process\n if (this.onBeforeRefresh) {\n const latest = this.onBeforeRefresh();\n if (latest.token && latest.token !== this.token) {\n // Another process already refreshed — use the new token\n this.token = latest.token;\n if (latest.refreshToken) this.refreshToken = latest.refreshToken;\n return true;\n }\n if (latest.refreshToken) {\n this.refreshToken = latest.refreshToken;\n }\n }\n\n // Try refreshToken first\n if (this.refreshToken) {\n try {\n const url = this.buildUrl(\"/auth/refresh\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (response.ok) {\n const data = (await response.json()) as Record<string, unknown>;\n const newToken = (data.accessToken ?? data.token) as string | undefined;\n const newRefreshToken = data.refreshToken as string | undefined;\n\n if (newToken) {\n this.token = newToken;\n if (newRefreshToken) this.refreshToken = newRefreshToken;\n this.onTokenRefresh?.(newToken, newRefreshToken);\n return true;\n }\n }\n } catch {\n // Fall through to client credentials\n }\n }\n\n // Fallback: client_credentials grant\n if (this.clientId && this.clientSecret) {\n try {\n const result = await clientCredentialsGrant({\n baseUrl: this.baseUrl,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n });\n this.token = result.access_token;\n this.onTokenRefresh?.(result.access_token);\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(`${this.getBasePath()}${path}`, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n const countHeader = response.headers.get(\"NGSILD-Results-Count\");\n const count = countHeader ? parseInt(countHeader, 10) : undefined;\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data, count };\n }\n\n private async executeRawRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(path, options?.params);\n const headers = this.buildHeaders(options?.headers);\n if (options?.skipTenantHeader) {\n delete headers[\"NGSILD-Tenant\"];\n }\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data };\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && GdbClient.isTokenError(err) && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"GET\", path, { params, headers });\n }\n\n async post<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PATCH\", path, { body, params });\n }\n\n async put<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PUT\", path, { body, params });\n }\n\n async delete<T = unknown>(\n path: string,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"DELETE\", path, { params });\n }\n\n /** Make a request to a raw URL path (not prefixed with API base path) */\n async rawRequest<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n skipTenantHeader?: boolean;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRawRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && GdbClient.isTokenError(err) && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRawRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n}\n\nexport class GdbClientError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly ngsiError?: NgsiError,\n ) {\n super(message);\n this.name = \"GdbClientError\";\n }\n}\n","import { Command } from \"commander\";\nimport { loadConfig, saveConfig, validateUrl } from \"./config.js\";\nimport { DryRunSignal, GdbClient, GdbClientError } from \"./client.js\";\nimport { printError, printOutput, printCount } from \"./output.js\";\nimport type { ClientResponse, GlobalOptions, OutputFormat } from \"./types.js\";\n\n/**\n * Resolve merged options from config + CLI flags.\n */\nexport function resolveOptions(cmd: Command): GlobalOptions {\n const opts = cmd.optsWithGlobals() as GlobalOptions;\n const config = loadConfig(opts.profile);\n return {\n url: opts.url ?? config.url,\n service: opts.service ?? config.service,\n token: opts.token ?? config.token,\n format: opts.format ?? config.format ?? \"json\",\n color: opts.color,\n verbose: opts.verbose,\n profile: opts.profile,\n apiKey: opts.apiKey ?? process.env.GDB_API_KEY ?? config.apiKey,\n dryRun: opts.dryRun,\n };\n}\n\n/**\n * Create a GdbClient from resolved options.\n */\nexport function createClient(cmd: Command): GdbClient {\n const opts = resolveOptions(cmd);\n if (!opts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n opts.url = validateUrl(opts.url);\n const cliOpts = cmd.optsWithGlobals() as GlobalOptions;\n const usingCliToken = !!cliOpts.token;\n const config = loadConfig(opts.profile);\n return new GdbClient({\n baseUrl: opts.url,\n service: opts.service,\n token: opts.token,\n refreshToken: usingCliToken ? undefined : config.refreshToken,\n clientId: usingCliToken ? undefined : config.clientId,\n clientSecret: usingCliToken ? undefined : config.clientSecret,\n apiKey: opts.apiKey,\n onTokenRefresh: usingCliToken\n ? undefined\n : (token, refreshToken) => {\n const cfg = loadConfig(opts.profile);\n cfg.token = token;\n if (refreshToken) cfg.refreshToken = refreshToken;\n saveConfig(cfg, opts.profile);\n },\n onBeforeRefresh: usingCliToken\n ? undefined\n : () => {\n const cfg = loadConfig(opts.profile);\n return { token: cfg.token, refreshToken: cfg.refreshToken };\n },\n verbose: opts.verbose,\n dryRun: opts.dryRun,\n });\n}\n\n/**\n * Get the output format from resolved options.\n */\nexport function getFormat(cmd: Command): OutputFormat {\n const opts = resolveOptions(cmd);\n return opts.format as OutputFormat;\n}\n\n/**\n * Standard handler for outputting API responses.\n */\nexport function outputResponse(\n response: ClientResponse,\n format: OutputFormat,\n showCount?: boolean,\n): void {\n if (showCount && response.count !== undefined) {\n printCount(response.count);\n }\n if (response.data !== undefined && response.data !== \"\") {\n printOutput(response.data, format);\n }\n}\n\n/**\n * Wrap an async command handler with error handling.\n */\nexport function withErrorHandler<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (err: unknown) {\n if (err instanceof DryRunSignal) {\n return;\n }\n if (err instanceof GdbClientError && err.status === 401) {\n printError(\"Authentication failed. Please re-authenticate (e.g., `geonic auth login` or check your API key).\");\n } else if (err instanceof GdbClientError && err.status === 403 && /not assigned to any tenant|invalid token/i.test(err.message)) {\n printError(\"Authentication failed. Please re-authenticate (e.g., `geonic auth login` or check your API key).\");\n } else if (err instanceof GdbClientError && err.status === 403) {\n const detail = (err.ngsiError?.detail ?? err.ngsiError?.description ?? \"\").toLowerCase();\n if (detail.includes(\"entity type\") || detail.includes(\"allowedentitytypes\")) {\n printError(`Entity type restriction: ${err.message}`);\n } else {\n printError(err.message);\n }\n } else if (err instanceof Error) {\n printError(err.message);\n } else {\n printError(String(err));\n }\n process.exit(1);\n }\n };\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport function isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport async function promptEmail(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const email = await rl.question(\"Email: \");\n return email.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(\"Password: \");\n\n if (!stdin.isTTY) {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.resume();\n const cleanup = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"end\", onEnd);\n stdin.removeListener(\"error\", onError);\n stdin.pause();\n };\n const onData = (chunk: string) => {\n const newline = chunk.indexOf(\"\\n\");\n if (newline !== -1) {\n data += chunk.slice(0, newline);\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n } else {\n data += chunk;\n }\n };\n const onEnd = () => {\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n stdin.on(\"data\", onData);\n stdin.on(\"end\", onEnd);\n stdin.on(\"error\", onError);\n return;\n }\n\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf-8\");\n\n let password = \"\";\n\n const restoreTerminal = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"error\", onError);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n };\n\n const onError = (err: Error) => {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(err);\n };\n\n const onData = (char: string) => {\n const code = char.charCodeAt(0);\n\n if (char === \"\\r\" || char === \"\\n\") {\n restoreTerminal();\n stdout.write(\"\\n\");\n resolve(password);\n } else if (code === 3) {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(new Error(\"User cancelled\"));\n } else if (code === 127 || code === 8) {\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.write(\"\\b \\b\");\n }\n } else if (code >= 32) {\n password += char;\n stdout.write(\"*\");\n }\n };\n\n stdin.on(\"data\", onData);\n stdin.on(\"error\", onError);\n });\n}\n\nexport interface TenantChoice {\n tenantId: string;\n name?: string;\n role: string;\n}\n\nexport async function promptTenantSelection(\n tenants: TenantChoice[],\n currentTenantId?: string,\n): Promise<string | undefined> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n console.log(\"\\nAvailable tenants:\");\n for (let i = 0; i < tenants.length; i++) {\n const t = tenants[i];\n const current = t.tenantId === currentTenantId ? \" ← current\" : \"\";\n const marker = t.tenantId === currentTenantId ? \" *\" : \" \";\n const label = t.name ? `${t.name} (${t.tenantId})` : t.tenantId;\n console.log(`${marker} ${i + 1}) ${label} [${t.role}]${current}`);\n }\n for (;;) {\n const answer = await rl.question(\"\\nSelect tenant number (Enter to keep current): \");\n const trimmed = answer.trim();\n if (!trimmed) return undefined;\n const index = parseInt(trimmed, 10) - 1;\n if (index >= 0 && index < tenants.length) {\n return tenants[index].tenantId;\n }\n console.log(`Invalid selection. Please enter a number between 1 and ${tenants.length}.`);\n }\n } finally {\n rl.close();\n }\n}\n","export interface TokenStatus {\n expiresAt: Date | null;\n isExpired: boolean;\n isExpiringSoon: boolean;\n remainingMs: number | null;\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const json = Buffer.from(payload, \"base64\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function getTokenStatus(token: string): TokenStatus {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") {\n return { expiresAt: null, isExpired: false, isExpiringSoon: false, remainingMs: null };\n }\n\n const expiresAt = new Date(payload.exp * 1000);\n const now = Date.now();\n const remainingMs = expiresAt.getTime() - now;\n const fiveMinutes = 5 * 60 * 1000;\n\n return {\n expiresAt,\n isExpired: remainingMs <= 0,\n isExpiringSoon: remainingMs > 0 && remainingMs <= fiveMinutes,\n remainingMs,\n };\n}\n\nexport function formatDuration(ms: number): string {\n if (ms <= 0) return \"expired\";\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours % 24 > 0) parts.push(`${hours % 24}h`);\n if (minutes % 60 > 0 && days === 0) parts.push(`${minutes % 60}m`);\n if (parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(\" \");\n}\n","import JSON5 from \"json5\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Parse JSON input from a string, file (@path), stdin (-), pipe, or interactive mode.\n *\n * Resolution order:\n * 1. Explicit input provided → parse directly (inline, @file, or - for stdin)\n * 2. No input + piped stdin (non-TTY) → auto-read stdin\n * 3. No input + TTY stdin → interactive mode with brace-balanced auto-submit\n *\n * Supports JSON5 syntax (unquoted keys, single quotes, trailing commas).\n */\nexport async function parseJsonInput(input?: string): Promise<unknown> {\n // 1. Explicit input\n if (input !== undefined) {\n if (input === \"-\") return parseData(readFileSync(0, \"utf-8\"));\n if (input.startsWith(\"@\")) return parseData(readFileSync(input.slice(1), \"utf-8\"));\n return parseData(input);\n }\n\n // 2. Piped stdin (non-TTY)\n if (!process.stdin.isTTY) {\n return parseData(readFileSync(0, \"utf-8\"));\n }\n\n // 3. Interactive mode (TTY)\n return readInteractiveJson();\n}\n\nfunction parseData(text: string): unknown {\n return JSON5.parse(text.trim());\n}\n\n/**\n * Read JSON interactively from TTY with brace-balance auto-submit.\n * Tracks depth of {}/[] while respecting string literals.\n * When depth returns to 0, automatically parses and returns.\n */\nasync function readInteractiveJson(): Promise<unknown> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n prompt: \"json> \",\n });\n\n process.stderr.write(\"Enter JSON (auto-submits when braces close, Ctrl+C to cancel):\\n\");\n rl.prompt();\n\n const lines: string[] = [];\n let depth = 0;\n let started = false;\n let inBlockComment = false;\n let inString = false;\n let stringChar = \"\";\n let cancelled = false;\n\n return new Promise<unknown>((resolve, reject) => {\n rl.on(\"SIGINT\", () => {\n cancelled = true;\n rl.close();\n });\n\n rl.on(\"line\", (line) => {\n lines.push(line);\n const result = trackDepth(line, depth, started, inBlockComment, inString, stringChar);\n depth = result.depth;\n started = result.started;\n inBlockComment = result.inBlockComment;\n inString = result.inString;\n stringChar = result.stringChar;\n\n if (started && depth <= 0 && !inBlockComment && !inString) {\n rl.close();\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else {\n rl.setPrompt(\"... \");\n rl.prompt();\n }\n });\n\n rl.on(\"close\", () => {\n if (cancelled) {\n reject(new Error(\"Input cancelled.\"));\n return;\n }\n if (lines.length > 0 && (!started || depth > 0 || inBlockComment || inString)) {\n // EOF before balanced — attempt to parse what we have\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else if (lines.length === 0) {\n reject(new Error(\"No input provided.\"));\n }\n });\n });\n}\n\n/**\n * Track brace/bracket depth for a line, respecting string literals and JSON5 comments.\n * String and block-comment state is passed in and returned to handle multi-line constructs.\n */\nfunction trackDepth(\n line: string,\n depth: number,\n started: boolean,\n inBlockComment: boolean,\n inString: boolean,\n stringChar: string,\n): { depth: number; started: boolean; inBlockComment: boolean; inString: boolean; stringChar: string } {\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inString) {\n if (ch === \"\\\\\" && i + 1 < line.length) {\n i++; // skip escaped character\n } else if (ch === stringChar) {\n inString = false;\n }\n continue;\n }\n\n // Line comment — skip rest of line\n if (ch === \"/\" && next === \"/\") break;\n // Block comment start\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = true;\n stringChar = ch;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n started = true;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n }\n }\n\n return { depth, started, inBlockComment, inString, stringChar };\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig, validateUrl } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples, addNotes } from \"./help.js\";\n\nexport function addMeOAuthClientsSubcommand(me: Command): void {\n const oauthClients = me\n .command(\"oauth-clients\")\n .description(\"Manage your OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List your OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n {\n description: \"List in table format for a quick overview\",\n command: \"geonic me oauth-clients list --format table\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\"Create a new OAuth client\")\n .option(\"--name <name>\", \"Client name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--save\", \"Save credentials to config for automatic re-authentication\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n save?: boolean;\n };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy) {\n // Build body from flags\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policy) payload.policyId = opts.policy;\n body = payload;\n } else {\n // Read from stdin (pipe or interactive)\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/oauth-clients\", { body });\n\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const clientId = data.clientId as string | undefined;\n const clientSecret = data.clientSecret as string | undefined;\n\n if (!clientId || !clientSecret) {\n printError(\"Response missing clientId or clientSecret. Cannot save credentials.\");\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n return;\n }\n\n // Perform client_credentials grant to get a fresh token\n const baseUrl = validateUrl(globalOpts.url!);\n const tokenResult = await clientCredentialsGrant({\n baseUrl,\n clientId,\n clientSecret,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.clientId = clientId;\n config.clientSecret = clientSecret;\n config.token = tokenResult.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printInfo(\"Client credentials saved to config. Auto-reauth enabled.\");\n } else {\n printWarning(\n \"Save the clientSecret now — it will not be shown again.\",\n );\n }\n\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addNotes(create, [\n \"Use --policy to attach an existing XACML policy to the OAuth client.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an OAuth client with flags\",\n command: \"geonic me oauth-clients create --name my-ci-bot\",\n },\n {\n description: \"Create with a policy attached\",\n command: \"geonic me oauth-clients create --name my-ci-bot --policy <policy-id>\",\n },\n {\n description: \"Create and save credentials for auto-reauth\",\n command: \"geonic me oauth-clients create --name my-ci-bot --save\",\n },\n {\n description: \"Create an OAuth client from JSON\",\n command: 'geonic me oauth-clients create \\'{\"name\":\"my-bot\",\"policyId\":\"<policy-id>\"}\\'',\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <clientId> [json]\")\n .description(\"Update an OAuth client\")\n .option(\"--name <name>\", \"Client name\")\n .option(\"--description <desc>\", \"Client description\")\n .option(\"--policy-id <policyId>\", \"Policy ID to attach (use 'null' to unbind)\")\n .option(\"--active\", \"Activate the OAuth client\")\n .option(\"--inactive\", \"Deactivate the OAuth client\")\n .action(\n withErrorHandler(async (clientId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n description?: string;\n policyId?: string;\n active?: boolean;\n inactive?: boolean;\n };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.description || opts.policyId !== undefined || opts.active || opts.inactive) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.description) payload.description = opts.description;\n if (opts.policyId !== undefined) payload.policyId = opts.policyId === \"null\" ? null : opts.policyId;\n if (opts.active) payload.isActive = true;\n if (opts.inactive) payload.isActive = false;\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/me/oauth-clients/${encodeURIComponent(String(clientId))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n }),\n );\n\n addExamples(update, [\n {\n description: \"Rename an OAuth client\",\n command: \"geonic me oauth-clients update <client-id> --name new-name\",\n },\n {\n description: \"Attach a policy\",\n command: \"geonic me oauth-clients update <client-id> --policy-id <policy-id>\",\n },\n {\n description: \"Unbind policy\",\n command: \"geonic me oauth-clients update <client-id> --policy-id null\",\n },\n {\n description: \"Deactivate an OAuth client\",\n command: \"geonic me oauth-clients update <client-id> --inactive\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client and revoke its credentials\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client by ID\",\n command: \"geonic me oauth-clients delete <client-id>\",\n },\n {\n description: \"Revoke a compromised client\",\n command: \"geonic me oauth-clients delete abc123-def456\",\n },\n ]);\n\n // oauth-clients regenerate-secret\n const regenerateSecret = oauthClients\n .command(\"regenerate-secret <clientId>\")\n .description(\"Regenerate the client secret — the old secret is immediately invalidated\")\n .action(\n withErrorHandler(async (clientId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"POST\",\n `/me/oauth-clients/${encodeURIComponent(String(clientId))}/regenerate-secret`,\n );\n printWarning(\"Save the new clientSecret now — it will not be shown again.\");\n outputResponse(response, format);\n printSuccess(\"OAuth client secret regenerated.\");\n }),\n );\n\n addExamples(regenerateSecret, [\n {\n description: \"Regenerate client secret\",\n command: \"geonic me oauth-clients regenerate-secret <client-id>\",\n },\n {\n description: \"Rotate secret after a security incident\",\n command: \"geonic me oauth-clients regenerate-secret abc123-def456\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printApiKeyBox, printError } from \"../output.js\";\nimport { addExamples, addNotes } from \"./help.js\";\n\n/** Strip masked key placeholder from API key response for cleaner display. */\nfunction cleanApiKeyData(data: unknown): unknown {\n if (Array.isArray(data)) return data.map(cleanApiKeyData);\n if (typeof data !== \"object\" || data === null) return data;\n const obj = { ...(data as Record<string, unknown>) };\n if (obj.key === \"******\") delete obj.key;\n return obj;\n}\n\n/** Save API key to profile config and print confirmation. Returns false if key missing or save fails. */\nfunction handleSaveKey(\n data: Record<string, unknown>,\n cmd: Command,\n): boolean {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n process.exitCode = 1;\n return false;\n }\n try {\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n return true;\n } catch (err) {\n printError(`Failed to save API key to config: ${err instanceof Error ? err.message : String(err)}`);\n printApiKeyBox(key);\n process.exitCode = 1;\n return false;\n }\n}\n\n/** Show API key value prominently. Returns false if key is missing (treated as error). */\nfunction showKeyResult(\n data: Record<string, unknown>,\n save: boolean,\n cmd: Command,\n): boolean {\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. The new API key value was not returned.\");\n process.exitCode = 1;\n return false;\n }\n if (save) return handleSaveKey(data, cmd);\n printApiKeyBox(key);\n return true;\n}\n\nexport function addMeApiKeysSubcommand(me: Command): void {\n const apiKeys = me\n .command(\"api-keys\")\n .description(\"Manage your API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List your API keys\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/api-keys\");\n response.data = cleanApiKeyData(response.data);\n outputResponse(response, format);\n console.error(\"※ API キー値は作成時 (create) またはリフレッシュ時 (refresh) にのみ表示されます。\");\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your API keys\",\n command: \"geonic me api-keys list\",\n },\n {\n description: \"List in table format for a quick overview\",\n command: \"geonic me api-keys list --format table\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--origins <origins>\", \"Allowed origins (comma-separated)\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--save\", \"Save the API key to config for automatic use\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n save?: boolean;\n };\n\n // Validate --origins flag early\n if (opts.origins !== undefined) {\n const parsed = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (parsed.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy || opts.origins || opts.rateLimit || opts.dpopRequired !== undefined) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policy) payload.policyId = opts.policy;\n if (opts.origins) payload.allowedOrigins = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.rateLimit) {\n const raw = opts.rateLimit.trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n // Validate allowedOrigins from JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/api-keys\", { body });\n\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, [\n \"Use --policy to attach an existing XACML policy to the API key.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an API key with a policy\",\n command: \"geonic me api-keys create --name my-app --policy <policy-id>\",\n },\n {\n description: \"Create and save API key to config\",\n command: \"geonic me api-keys create --name my-app --save\",\n },\n {\n description: \"Create an API key from JSON\",\n command: 'geonic me api-keys create \\'{\"name\":\"my-app\",\"policyId\":\"<policy-id>\"}\\'',\n },\n {\n description: \"Create an API key with rate limiting\",\n command: \"geonic me api-keys create --name my-app --rate-limit 100\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic me api-keys create --name my-app --dpop-required\",\n },\n ]);\n\n // api-keys refresh\n const refresh = apiKeys\n .command(\"refresh <keyId>\")\n .description(\"Refresh (rotate) an API key — generates a new key value\")\n .option(\"--save\", \"Save the new API key to config for automatic use\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { save?: boolean };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"POST\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}/refresh`,\n );\n\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key refreshed.\");\n }),\n );\n\n addNotes(refresh, [\n \"Refreshing generates a new key value while keeping keyId, name, and policy settings.\",\n \"The previous key value is immediately invalidated.\",\n ]);\n\n addExamples(refresh, [\n {\n description: \"Refresh an API key\",\n command: \"geonic me api-keys refresh <key-id>\",\n },\n {\n description: \"Refresh and save new key to config\",\n command: \"geonic me api-keys refresh <key-id> --save\",\n },\n ]);\n\n // api-keys update\n const update = apiKeys\n .command(\"update <keyId> [json]\")\n .description(\"Update an API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy-id <policyId>\", \"Policy ID to attach (use 'null' to unbind)\")\n .option(\"--origins <origins>\", \"Allowed origins (comma-separated)\")\n .option(\"--rate-limit <n>\", \"Rate limit (requests per minute)\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--no-dpop-required\", \"Disable DPoP requirement\")\n .option(\"--active\", \"Activate the API key\")\n .option(\"--inactive\", \"Deactivate the API key\")\n .action(\n withErrorHandler(async (keyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policyId?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n active?: boolean;\n inactive?: boolean;\n };\n\n // Validate --origins flag early\n if (opts.origins !== undefined) {\n const parsed = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (parsed.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policyId !== undefined || opts.origins !== undefined || opts.rateLimit || opts.dpopRequired !== undefined || opts.active || opts.inactive) {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policyId !== undefined) payload.policyId = opts.policyId === \"null\" ? null : opts.policyId;\n if (opts.origins !== undefined) payload.allowedOrigins = opts.origins.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.rateLimit) {\n const raw = opts.rateLimit.trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n if (opts.active) payload.isActive = true;\n if (opts.inactive) payload.isActive = false;\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}`,\n { body },\n );\n outputResponse(response, format);\n console.error(\"API key updated.\");\n }),\n );\n\n addExamples(update, [\n {\n description: \"Rename an API key\",\n command: \"geonic me api-keys update <key-id> --name new-name\",\n },\n {\n description: \"Attach a policy\",\n command: \"geonic me api-keys update <key-id> --policy-id <policy-id>\",\n },\n {\n description: \"Unbind policy\",\n command: \"geonic me api-keys update <key-id> --policy-id null\",\n },\n {\n description: \"Deactivate an API key\",\n command: \"geonic me api-keys update <key-id> --inactive\",\n },\n {\n description: \"Update from JSON\",\n command: 'geonic me api-keys update <key-id> \\'{\"name\":\"new-name\",\"rateLimit\":{\"perMinute\":60}}\\'',\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key — immediately revokes access for any client using it\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key by ID\",\n command: \"geonic me api-keys delete <key-id>\",\n },\n {\n description: \"Revoke a leaked or unused key\",\n command: \"geonic me api-keys delete abc123-def456\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples, addNotes } from \"./help.js\";\n\nexport function addMePoliciesSubcommand(me: Command): void {\n const policies = me\n .command(\"policies\")\n .description(\"Manage your personal XACML policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List your personal policies\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your personal policies\",\n command: \"geonic me policies list\",\n },\n {\n description: \"List in table format for a quick overview\",\n command: \"geonic me policies list --format table\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <policyId>\")\n .description(\"Get a personal policy by ID to inspect its XACML rules and target resources\")\n .action(\n withErrorHandler(async (policyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/me/policies/${encodeURIComponent(String(policyId))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a personal policy by ID\",\n command: \"geonic me policies get <policy-id>\",\n },\n {\n description: \"Inspect policy rules and permitted actions\",\n command: \"geonic me policies get my-readonly --format table\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .summary(\"Create a personal XACML policy\")\n .description(\n \"Create a personal XACML policy\\n\\n\" +\n \"Constraints (enforced server-side):\\n\" +\n \" - priority is fixed at 100 (user role minimum)\\n\" +\n \" - scope is 'personal' — not applied tenant-wide\\n\" +\n \" - target is required\\n\" +\n \" - data API paths only (/v2/**, /ngsi-ld/** etc.)\\n\\n\" +\n \"Example — GET-only policy for /v2/**:\\n\" +\n \" {\\n\" +\n ' \"policyId\": \"my-readonly\",\\n' +\n ' \"target\": {\\n' +\n ' \"resources\": [{\"attributeId\": \"path\", \"matchValue\": \"/v2/**\", \"matchFunction\": \"glob\"}]\\n' +\n \" },\\n\" +\n ' \"rules\": [\\n' +\n ' {\"ruleId\": \"allow-get\", \"effect\": \"Permit\", \"target\": {\"actions\": [{\"attributeId\": \"method\", \"matchValue\": \"GET\"}]}},\\n' +\n ' {\"ruleId\": \"deny-others\", \"effect\": \"Deny\"}\\n' +\n \" ]\\n\" +\n \" }\",\n )\n .option(\"--policy-id <id>\", \"Policy ID (auto-generated UUID if omitted)\")\n .option(\"--description <text>\", \"Policy description\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { policyId?: string; description?: string };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.policyId || opts.description) {\n const payload: Record<string, unknown> = {};\n if (opts.policyId) payload.policyId = opts.policyId;\n if (opts.description) payload.description = opts.description;\n body = payload;\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/policies\", { body });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addNotes(create, [\n \"priority is always set to 100 by the server regardless of the value you specify.\",\n \"Bind the policy to an API key or OAuth client with `geonic me api-keys update --policy-id` or `geonic me oauth-clients update --policy-id`.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create a GET-only policy from inline JSON\",\n command: `geonic me policies create '{\"policyId\":\"my-readonly\",\"target\":{\"resources\":[{\"attributeId\":\"path\",\"matchValue\":\"/v2/**\",\"matchFunction\":\"glob\"}]},\"rules\":[{\"ruleId\":\"allow-get\",\"effect\":\"Permit\",\"target\":{\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]}},{\"ruleId\":\"deny-others\",\"effect\":\"Deny\"}]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic me policies create @policy.json\",\n },\n {\n description: \"Create from stdin\",\n command: \"cat policy.json | geonic me policies create\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <policyId> [json]\")\n .description(\"Update a personal policy (partial update)\")\n .option(\"--description <text>\", \"Policy description\")\n .action(\n withErrorHandler(async (policyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { description?: string };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.description) {\n body = { description: opts.description };\n } else {\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/me/policies/${encodeURIComponent(String(policyId))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n }),\n );\n\n addExamples(update, [\n {\n description: \"Update policy rules\",\n command: `geonic me policies update <policy-id> '{\"rules\":[{\"ruleId\":\"allow-get\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic me policies update <policy-id> @patch.json\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <policyId>\")\n .description(\"Delete a personal policy — any API key or OAuth client bound to it loses access granted by this policy\")\n .action(\n withErrorHandler(async (policyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/policies/${encodeURIComponent(String(policyId))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a personal policy by ID\",\n command: \"geonic me policies delete <policy-id>\",\n },\n {\n description: \"Remove a policy (unbind from API keys/OAuth clients first)\",\n command: \"geonic me policies delete my-readonly\",\n },\n ]);\n}\n","import { Command } from \"commander\";\nimport {\n listProfiles,\n getCurrentProfile,\n setCurrentProfile,\n createProfile,\n deleteProfile,\n loadConfig,\n saveConfig,\n validateUrl,\n} from \"../config.js\";\nimport { printSuccess, printInfo, printError, printWarning } from \"../output.js\";\nimport { getTokenStatus } from \"../token.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerProfileCommands(program: Command): void {\n const profile = program.command(\"profile\").description(\"Manage connection profiles (each profile stores its own URL, token, and tenant)\");\n\n const list = profile\n .command(\"list\")\n .description(\"List all profiles (active profile marked with *)\")\n .action(() => {\n const profiles = listProfiles();\n for (const p of profiles) {\n const marker = p.active ? \" *\" : \"\";\n console.log(`${p.name}${marker}`);\n }\n });\n\n addExamples(list, [\n {\n description: \"List all profiles (active profile marked with *)\",\n command: \"geonic profile list\",\n },\n ]);\n\n const use = profile\n .command(\"use <name>\")\n .description(\"Switch active profile (auto-refreshes expired tokens)\")\n .action(async (name: string) => {\n try {\n setCurrentProfile(name);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n\n const config = loadConfig(name);\n const tenantLabel = config.tenantId\n ? ` (tenant: ${config.availableTenants?.find((t) => t.tenantId === config.tenantId)?.name ?? config.tenantId})`\n : \"\";\n\n // Auto-refresh expired token if refreshToken is available\n if (config.token && config.refreshToken && config.url) {\n const status = getTokenStatus(config.token);\n if (status.isExpired || status.isExpiringSoon) {\n try {\n const baseUrl = validateUrl(config.url);\n const url = new URL(\"/auth/refresh\", baseUrl).toString();\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: config.refreshToken }),\n });\n if (response.ok) {\n const data = (await response.json()) as Record<string, unknown>;\n const newToken = (data.accessToken ?? data.token) as string | undefined;\n const newRefreshToken = data.refreshToken as string | undefined;\n if (newToken) {\n config.token = newToken;\n if (newRefreshToken) config.refreshToken = newRefreshToken;\n saveConfig(config, name);\n printSuccess(`Switched to profile \"${name}\"${tenantLabel}. Token refreshed.`);\n return;\n }\n }\n printWarning(\"Token refresh failed. You may need to re-login.\");\n } catch {\n printWarning(\"Token refresh failed. You may need to re-login.\");\n }\n }\n }\n\n printSuccess(`Switched to profile \"${name}\"${tenantLabel}.`);\n });\n\n addExamples(use, [\n {\n description: \"Switch to staging profile\",\n command: \"geonic profile use staging\",\n },\n {\n description: \"Switch to production profile\",\n command: \"geonic profile use production\",\n },\n ]);\n\n const profileCreate = profile\n .command(\"create <name>\")\n .description(\"Create a new named profile for a separate environment or tenant\")\n .action((name: string) => {\n try {\n createProfile(name);\n printSuccess(`Profile \"${name}\" created.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(profileCreate, [\n {\n description: \"Create a new profile for staging\",\n command: \"geonic profile create staging\",\n },\n {\n description: \"Create a profile for a different tenant\",\n command: \"geonic profile create tenant-b\",\n },\n ]);\n\n const del = profile\n .command(\"delete <name>\")\n .description(\"Delete a profile and its stored configuration\")\n .action((name: string) => {\n try {\n deleteProfile(name);\n printSuccess(`Profile \"${name}\" deleted.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(del, [\n {\n description: \"Delete the staging profile\",\n command: \"geonic profile delete staging\",\n },\n ]);\n\n const show = profile\n .command(\"show [name]\")\n .description(\"Show profile settings (URL, tenant, token status, etc.)\")\n .action((name?: string) => {\n const profileName = name ?? getCurrentProfile();\n const config = loadConfig(profileName);\n const entries = Object.entries(config).filter(([, v]) => v !== undefined);\n if (entries.length === 0) {\n printInfo(`Profile \"${profileName}\" has no settings.`);\n return;\n }\n for (const [key, value] of entries) {\n if (\n (key === \"token\" || key === \"refreshToken\" || key === \"apiKey\") &&\n typeof value === \"string\"\n ) {\n console.log(`${key}: ***`);\n } else if (key === \"availableTenants\" && Array.isArray(value)) {\n console.log(`${key}:`);\n for (const t of value as { tenantId: string; name?: string; role: string }[]) {\n const label = t.name ? `${t.name} (${t.tenantId})` : t.tenantId;\n const current = t.tenantId === config.tenantId ? \" ← current\" : \"\";\n console.log(` - ${label} [${t.role}]${current}`);\n }\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n });\n\n addExamples(show, [\n {\n description: \"Show current profile settings\",\n command: \"geonic profile show\",\n },\n {\n description: \"Show settings for a specific profile\",\n command: \"geonic profile show production\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function addAttrsSubcommands(attrs: Command): void {\n // attrs list\n const list = attrs\n .command(\"list\")\n .description(\"List all attributes of an entity, returning each attribute's type, value, and metadata\")\n .argument(\"<entityId>\", \"Entity ID\")\n .action(\n withErrorHandler(\n async (entityId: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(list, [\n {\n description: \"List all attributes of an entity\",\n command: \"geonic entities attrs list urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"List attributes in table format\",\n command: \"geonic entities attrs list urn:ngsi-ld:Sensor:001 --format table\",\n },\n {\n description: \"List attributes with keyValues output\",\n command:\n \"geonic entities attrs list urn:ngsi-ld:Building:store01 --format json\",\n },\n ]);\n\n // attrs get\n const get = attrs\n .command(\"get\")\n .description(\"Get the value and metadata of a single attribute on an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get the temperature attribute of a sensor\",\n command: \"geonic entities attrs get urn:ngsi-ld:Sensor:001 temperature\",\n },\n {\n description: \"Get a Relationship attribute to see what it links to\",\n command: \"geonic entities attrs get urn:ngsi-ld:Building:store01 owner\",\n },\n {\n description: \"Get an attribute in table format\",\n command:\n \"geonic entities attrs get urn:ngsi-ld:Sensor:001 location --format table\",\n },\n ]);\n\n // attrs add\n const add = attrs\n .command(\"add\")\n .summary(\"Add attributes to an entity\")\n .description(\n \"Add attributes to an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"humidity\": {\"type\": \"Property\", \"value\": 60}}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n data,\n );\n printSuccess(\"Attributes added.\");\n },\n ),\n );\n\n addExamples(add, [\n {\n description: \"Add an attribute with inline JSON\",\n command: `geonic entities attrs add urn:ngsi-ld:Sensor:001 '{\"humidity\":{\"type\":\"Property\",\"value\":60}}'`,\n },\n {\n description: \"Add attributes from a file\",\n command: \"geonic entities attrs add urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Add from stdin pipe\",\n command: \"cat attrs.json | geonic entities attrs add urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs update\n const attrUpdate = attrs\n .command(\"update\")\n .summary(\"Update a specific attribute of an entity\")\n .description(\n \"Update a specific attribute of an entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n ' {\"type\": \"Property\", \"value\": 25}',\n )\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n data,\n );\n printSuccess(\"Attribute updated.\");\n },\n ),\n );\n\n addExamples(attrUpdate, [\n {\n description: \"Update a Property value\",\n command: `geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature '{\"type\":\"Property\",\"value\":25}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature @attr.json\",\n },\n ]);\n\n // attrs delete\n const del = attrs\n .command(\"delete\")\n .description(\"Remove an attribute from an entity permanently\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n printSuccess(\"Attribute deleted.\");\n },\n ),\n );\n\n addExamples(del, [\n {\n description: \"Remove the temperature attribute from a sensor\",\n command:\n \"geonic entities attrs delete urn:ngsi-ld:Sensor:001 temperature\",\n },\n {\n description: \"Remove a deprecated attribute from a building entity\",\n command:\n \"geonic entities attrs delete urn:ngsi-ld:Building:store01 legacyCode\",\n },\n ]);\n}\n\nexport function registerAttrsSubcommand(entitiesCmd: Command): void {\n const attrs = entitiesCmd\n .command(\"attrs\")\n .description(\"Manage entity attributes\");\n\n addAttrsSubcommands(attrs);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printCount, printSuccess } from \"../output.js\";\nimport { registerAttrsSubcommand } from \"./attrs.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerEntitiesCommand(program: Command): void {\n const entities = program\n .command(\"entities\")\n .description(\"Manage context entities\");\n\n // entities list\n const list = entities\n .command(\"list\")\n .description(\"List entities with optional filters\")\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--id-pattern <pat>\", \"Filter by entity ID pattern (regex)\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--spatial-id <zfxy>\", \"Spatial ID filter (ZFXY tile)\")\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--order-by <field>\", \"Order results by field\")\n .option(\"--count\", \"Include total count in response\")\n .option(\"--count-only\", \"Only show the total count without listing entities\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n\n if (opts.type) params.type = String(opts.type);\n if (opts.idPattern) params.idPattern = String(opts.idPattern);\n if (opts.query) params.q = String(opts.query);\n if (opts.attrs) params.attrs = String(opts.attrs);\n if (opts.georel) params.georel = String(opts.georel);\n if (opts.geometry) params.geometry = String(opts.geometry);\n if (opts.coords) params.coordinates = String(opts.coords);\n if (opts.spatialId) params.spatialId = String(opts.spatialId);\n if (opts.limit !== undefined) params.limit = String(opts.limit);\n if (opts.offset !== undefined) params.offset = String(opts.offset);\n if (opts.orderBy) params.orderBy = String(opts.orderBy);\n if (opts.count || opts.countOnly) params.count = \"true\";\n if (opts.countOnly) params.limit = \"0\";\n if (opts.keyValues) params.options = \"keyValues\";\n\n const response = await client.get(\"/entities\", params);\n if (opts.countOnly) {\n printCount(response.count ?? 0);\n } else {\n outputResponse(response, format, !!opts.count);\n }\n }),\n );\n\n addExamples(list, [\n {\n description: \"Filter by entity type\",\n command: \"geonic entities list --type Sensor\",\n },\n {\n description: \"Filter by entity ID pattern (regex)\",\n command: \"geonic entities list --id-pattern 'urn:ngsi-ld:Sensor:.*'\",\n },\n {\n description: \"Filter by attribute value\",\n command: \"geonic entities list --query 'temperature>30'\",\n },\n {\n description: \"AND conditions (semicolon)\",\n command: \"geonic entities list --query 'temperature>30;humidity<50'\",\n },\n {\n description: \"String match\",\n command: \"geonic entities list --query 'name==\\\"Tokyo\\\"'\",\n },\n {\n description: \"Pattern match\",\n command: \"geonic entities list --query 'name~=\\\"Tok.*\\\"'\",\n },\n {\n description: \"Check attribute existence\",\n command: \"geonic entities list --query 'temperature'\",\n },\n {\n description: \"Select specific attributes\",\n command: \"geonic entities list --attrs temperature,humidity\",\n },\n {\n description: \"Geo-query: entities near a point (within 1km)\",\n command:\n \"geonic entities list --georel 'near;maxDistance==1000' --geometry Point --coords '[139.7671,35.6812]'\",\n },\n {\n description: \"Geo-query: entities within a polygon\",\n command:\n \"geonic entities list --georel within --geometry Polygon --coords '[[[139.7,35.7],[139.8,35.7],[139.8,35.6],[139.7,35.6],[139.7,35.7]]]'\",\n },\n {\n description: \"Filter by Spatial ID (ZFXY tile)\",\n command: \"geonic entities list --spatial-id 15/0/29101/12903\",\n },\n {\n description: \"Paginate results\",\n command: \"geonic entities list --limit 20 --offset 40\",\n },\n {\n description: \"Order by attribute\",\n command: \"geonic entities list --order-by temperature\",\n },\n {\n description: \"Get total count with results\",\n command: \"geonic entities list --type Sensor --count\",\n },\n {\n description: \"Get only the total count (no entity data)\",\n command: \"geonic entities list --type Sensor --count-only\",\n },\n ]);\n\n // entities get\n const get = entities\n .command(\"get\")\n .description(\"Get a single entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (id: string, opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n if (opts.keyValues) {\n params.options = \"keyValues\";\n }\n\n const response = await client.get(\n `/entities/${encodeURIComponent(id)}`,\n params,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get entity by ID\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Get entity in keyValues format\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001 --key-values\",\n },\n ]);\n\n // entities create\n const create = entities\n .command(\"create\")\n .summary(\"Create a new entity\")\n .description(\n \"Create a new entity\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"id\": \"urn:ngsi-ld:Sensor:001\",\\n' +\n ' \"type\": \"Sensor\",\\n' +\n ' \"temperature\": {\"type\": \"Property\", \"value\": 25}\\n' +\n \" }\",\n )\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entities\", data);\n printSuccess(\"Entity created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from inline JSON (minimal)\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"}'`,\n },\n {\n description: \"Create with attributes\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25},\"location\":{\"type\":\"GeoProperty\",\"value\":{\"type\":\"Point\",\"coordinates\":[139.77,35.68]}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic entities create @entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat entity.json | geonic entities create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic entities create\",\n },\n ]);\n\n // entities update\n const update = entities\n .command(\"update\")\n .summary(\"Update attributes of an entity (PATCH)\")\n .description(\n \"Update attributes of an entity (PATCH)\\n\\n\" +\n \"JSON payload: only specified attributes are modified.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 30}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.patch(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a Property attribute\",\n command:\n `geonic entities update urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":30}}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic entities update urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat attrs.json | geonic entities update urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities replace\n const replace = entities\n .command(\"replace\")\n .summary(\"Replace all attributes of an entity (PUT)\")\n .description(\n \"Replace all attributes of an entity (PUT)\\n\\n\" +\n \"JSON payload: all existing attributes are replaced.\\n\" +\n ' e.g. {\"temperature\": {\"type\": \"Property\", \"value\": 20}}',\n )\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity replaced.\");\n },\n ),\n );\n\n addExamples(replace, [\n {\n description: \"Replace all attributes with inline JSON\",\n command: `geonic entities replace urn:ngsi-ld:Sensor:001 '{\"temperature\":{\"type\":\"Property\",\"value\":20}}'`,\n },\n {\n description: \"Replace from a file\",\n command: \"geonic entities replace urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n {\n description: \"Replace from stdin pipe\",\n command: \"cat attrs.json | geonic entities replace urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // entities upsert\n const upsert = entities\n .command(\"upsert\")\n .description(\"Create or update entities\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entityOperations/upsert\", data);\n printSuccess(\"Entity upserted.\");\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Upsert entities from a file\",\n command: \"geonic entities upsert @entities.json\",\n },\n {\n description: \"Upsert from stdin pipe\",\n command: \"cat entities.json | geonic entities upsert\",\n },\n ]);\n\n // entities delete\n const del = entities\n .command(\"delete\")\n .description(\"Permanently delete an entity and all its attributes\")\n .argument(\"<id>\", \"Entity ID\")\n .action(\n withErrorHandler(async (id: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(`/entities/${encodeURIComponent(id)}`);\n printSuccess(\"Entity deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an entity by ID\",\n command: \"geonic entities delete urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Delete with explicit service tenant\",\n command: \"geonic entities delete urn:ngsi-ld:Sensor:001 --service my-tenant\",\n },\n ]);\n\n // Register attrs as a subcommand of entities\n registerAttrsSubcommand(entities);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerBatchCommand(program: Command): void {\n const batch = program\n .command(\"entityOperations\")\n .alias(\"batch\")\n .description(\"Perform batch operations on entities\");\n\n // batch create\n const create = batch\n .command(\"create [json]\")\n .summary(\"Batch create entities\")\n .description(\n \"Batch create entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n ' e.g. [{\"id\": \"urn:ngsi-ld:Sensor:001\", \"type\": \"Sensor\"}, ...]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/create\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(create, [\n {\n description: \"Batch create with inline JSON\",\n command: `geonic batch create '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"},{\"id\":\"urn:ngsi-ld:Sensor:002\",\"type\":\"Sensor\"}]'`,\n },\n {\n description: \"Batch create from a file\",\n command: \"geonic batch create @entities.json\",\n },\n {\n description: \"Batch create from stdin pipe\",\n command: \"cat entities.json | geonic batch create\",\n },\n ]);\n\n // batch upsert\n const upsert = batch\n .command(\"upsert [json]\")\n .summary(\"Batch upsert entities\")\n .description(\n \"Batch upsert entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Creates entities that don't exist, updates those that do.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/upsert\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Batch upsert with inline JSON\",\n command: `geonic batch upsert '[{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\",\"temperature\":{\"type\":\"Property\",\"value\":25}}]'`,\n },\n {\n description: \"Batch upsert from a file\",\n command: \"geonic batch upsert @entities.json\",\n },\n {\n description: \"Batch upsert from stdin pipe\",\n command: \"cat entities.json | geonic batch upsert\",\n },\n ]);\n\n // batch update\n const update = batch\n .command(\"update [json]\")\n .summary(\"Batch update entity attributes\")\n .description(\n \"Batch update entity attributes\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities with attributes to update.\\n\" +\n \"Each entity must include id and type; only specified attributes are modified.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/update\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(update, [\n {\n description: \"Batch update from a file\",\n command: \"geonic batch update @updates.json\",\n },\n {\n description: \"Batch update from stdin\",\n command: \"cat updates.json | geonic batch update\",\n },\n ]);\n\n // batch delete\n const del = batch\n .command(\"delete [json]\")\n .summary(\"Batch delete entities by ID\")\n .description(\n \"Batch delete entities by ID\\n\\n\" +\n 'JSON payload: an array of entity ID strings.\\n' +\n ' e.g. [\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]',\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/delete\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(del, [\n {\n description: \"Batch delete with inline JSON\",\n command: `geonic batch delete '[\"urn:ngsi-ld:Sensor:001\",\"urn:ngsi-ld:Sensor:002\"]'`,\n },\n {\n description: \"Batch delete from a file\",\n command: \"geonic batch delete @entity-ids.json\",\n },\n {\n description: \"Batch delete from stdin pipe\",\n command: \"cat entity-ids.json | geonic batch delete\",\n },\n ]);\n\n // batch query\n const query = batch\n .command(\"query [json]\")\n .summary(\"Query entities by posting a query payload\")\n .description(\n \"Query entities by posting a query payload\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"attrs\": [\"temperature\"],\\n' +\n ' \"q\": \"temperature>30\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/query\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(query, [\n {\n description: \"Query with inline JSON\",\n command: `geonic batch query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query from a file\",\n command: \"geonic batch query @query.json\",\n },\n {\n description: \"Query from stdin pipe\",\n command: \"cat query.json | geonic batch query\",\n },\n ]);\n\n // batch merge\n const merge = batch\n .command(\"merge [json]\")\n .summary(\"Batch merge-patch entities\")\n .description(\n \"Batch merge-patch entities\\n\\n\" +\n \"JSON payload: an array of NGSI-LD entities.\\n\" +\n \"Each entity must include id and type; attributes are merge-patched.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/merge\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(merge, [\n {\n description: \"Batch merge-patch from a file\",\n command: \"geonic batch merge @patches.json\",\n },\n {\n description: \"Batch merge-patch from stdin\",\n command: \"cat patches.json | geonic batch merge\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSubscriptionsCommand(program: Command): void {\n const subscriptions = program\n .command(\"subscriptions\")\n .alias(\"sub\")\n .description(\"Manage context subscriptions\");\n\n // subscriptions list\n const list = subscriptions\n .command(\"list\")\n .description(\"List subscriptions\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/subscriptions\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all subscriptions\",\n command: \"geonic subscriptions list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic subscriptions list --limit 10 --offset 20\",\n },\n {\n description: \"List with total count\",\n command: \"geonic subscriptions list --count\",\n },\n ]);\n\n // subscriptions get\n const get = subscriptions\n .command(\"get <id>\")\n .description(\"Get a subscription by ID to inspect its notification config, watched attributes, and status\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get subscription details by ID\",\n command: \"geonic subscriptions get urn:ngsi-ld:Subscription:001\",\n },\n {\n description: \"Inspect notification endpoint and status in table format\",\n command: \"geonic subscriptions get urn:ngsi-ld:Subscription:001 --format table\",\n },\n ]);\n\n // subscriptions create\n const create = subscriptions\n .command(\"create [json]\")\n .summary(\"Create a subscription\")\n .description(\n \"Create a subscription\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Subscription\",\\n' +\n ' \"entities\": [{\"type\": \"Sensor\"}],\\n' +\n ' \"watchedAttributes\": [\"temperature\"],\\n' +\n ' \"notification\": {\"endpoint\": {\"uri\": \"http://localhost:3000/notify\"}}\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/subscriptions\", data);\n outputResponse(response, format);\n printSuccess(\"Subscription created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic subscriptions create '{\"type\":\"Subscription\",\"entities\":[{\"type\":\"Sensor\"}],\"watchedAttributes\":[\"temperature\"],\"notification\":{\"endpoint\":{\"uri\":\"http://localhost:3000/notify\"}}}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic subscriptions create @subscription.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat subscription.json | geonic subscriptions create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic subscriptions create\",\n },\n ]);\n\n // subscriptions update\n const update = subscriptions\n .command(\"update <id> [json]\")\n .summary(\"Update a subscription\")\n .description(\n \"Update a subscription\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated subscription\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Subscription updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic subscriptions update urn:ngsi-ld:Subscription:001 '{\"description\":\"Updated subscription\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic subscriptions update urn:ngsi-ld:Subscription:001 @sub.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat sub.json | geonic subscriptions update urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions delete\n const del = subscriptions\n .command(\"delete <id>\")\n .description(\"Delete a subscription and stop its notifications\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Subscription deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a subscription by ID\",\n command: \"geonic subscriptions delete urn:ngsi-ld:Subscription:001\",\n },\n {\n description: \"Stop notifications by removing the subscription (using alias)\",\n command: \"geonic sub delete urn:ngsi-ld:Subscription:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRegistrationsCommand(program: Command): void {\n const registrations = program\n .command(\"registrations\")\n .alias(\"reg\")\n .description(\"Manage context registrations\");\n\n // registrations list\n const list = registrations\n .command(\"list\")\n .description(\"List registrations\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/csourceRegistrations\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all registrations\",\n command: \"geonic registrations list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic registrations list --limit 10\",\n },\n ]);\n\n // registrations get\n const get = registrations\n .command(\"get <id>\")\n .description(\"Get a registration by ID to inspect its federation endpoint and entity routing\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get registration details by ID\",\n command:\n \"geonic registrations get urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n {\n description: \"Inspect federation config in table format\",\n command:\n \"geonic registrations get urn:ngsi-ld:ContextSourceRegistration:001 --format table\",\n },\n ]);\n\n // registrations create\n const create = registrations\n .command(\"create [json]\")\n .summary(\"Create a registration\")\n .description(\n \"Create a registration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"ContextSourceRegistration\",\\n' +\n ' \"information\": [{\"entities\": [{\"type\": \"Room\"}]}],\\n' +\n ' \"endpoint\": \"http://localhost:4000/source\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/csourceRegistrations\", data);\n outputResponse(response, format);\n printSuccess(\"Registration created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic registrations create '{\"type\":\"ContextSourceRegistration\",\"information\":[{\"entities\":[{\"type\":\"Room\"}]}],\"endpoint\":\"http://localhost:4000/source\"}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic registrations create @registration.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat registration.json | geonic registrations create\",\n },\n ]);\n\n // registrations update\n const regUpdate = registrations\n .command(\"update <id> [json]\")\n .description(\"Update a registration\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Registration updated.\");\n },\n ),\n );\n\n addExamples(regUpdate, [\n {\n description: \"Update endpoint\",\n command: `geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 '{\"endpoint\":\"http://localhost:5000/source\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 @registration.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat registration.json | geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations delete\n const del = registrations\n .command(\"delete <id>\")\n .description(\"Delete a registration and remove its forwarding rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Registration deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a registration by ID\",\n command:\n \"geonic registrations delete urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n {\n description: \"Remove forwarding rule (using alias)\",\n command:\n \"geonic reg delete urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerTypesCommand(program: Command): void {\n const types = program\n .command(\"types\")\n .description(\"Discover what entity types exist in the broker and inspect their structure\");\n\n // types list\n const list = types\n .command(\"list\")\n .description(\"List all entity types currently stored in the broker\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\"/types\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all entity types in the broker\",\n command: \"geonic types list\",\n },\n {\n description: \"List entity types in table format for a quick overview\",\n command: \"geonic types list --format table\",\n },\n ]);\n\n // types get\n const get = types\n .command(\"get <typeName>\")\n .description(\"Show attribute names and types for a given entity type\")\n .action(\n withErrorHandler(\n async (typeName: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/types/${encodeURIComponent(String(typeName))}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Inspect the Sensor type to see its attributes\",\n command: \"geonic types get Sensor\",\n },\n {\n description: \"Inspect a Building type in table format\",\n command: \"geonic types get Building --format table\",\n },\n {\n description: \"Inspect a fully-qualified NGSI-LD type\",\n command: \"geonic types get https://uri.fiware.org/ns/data-models#AirQualityObserved\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction addTemporalListOptions(cmd: Command): Command {\n return cmd\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt)\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--count\", \"Include total count in response\");\n}\n\nfunction createListAction() {\n return withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.type) params[\"type\"] = cmdOpts.type;\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.query) params[\"q\"] = cmdOpts.query;\n if (cmdOpts.georel) params[\"georel\"] = cmdOpts.georel;\n if (cmdOpts.geometry) params[\"geometry\"] = cmdOpts.geometry;\n if (cmdOpts.coords) params[\"coordinates\"] = cmdOpts.coords;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/temporal/entities\", params);\n outputResponse(response, format, cmdOpts.count);\n });\n}\n\nfunction addTemporalGetOptions(cmd: Command): Command {\n return cmd\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt);\n}\n\nfunction createGetAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n\n const response = await client.get(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction createCreateAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n\n await client.post(\"/temporal/entities\", body);\n printSuccess(\"Temporal entity created.\");\n });\n}\n\nfunction createDeleteAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Temporal entity deleted.\");\n });\n}\n\nfunction createQueryAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.aggrMethods) params[\"aggrMethods\"] = cmdOpts.aggrMethods;\n if (cmdOpts.aggrPeriod) params[\"aggrPeriodDuration\"] = cmdOpts.aggrPeriod;\n\n const response = await client.post(\n \"/temporal/entityOperations/query\",\n body,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction addQueryOptions(cmd: Command): Command {\n return cmd\n .option(\"--aggr-methods <methods>\", \"Aggregation methods (e.g. totalCount,sum)\")\n .option(\"--aggr-period <period>\", \"Aggregation period (e.g. PT1H)\");\n}\n\nexport function registerTemporalCommand(program: Command): void {\n const temporal = program\n .command(\"temporal\")\n .description(\"Manage temporal entities\");\n\n const entities = temporal\n .command(\"entities\")\n .description(\"List, get, create, and delete temporal entities\");\n\n const entityOperations = temporal\n .command(\"entityOperations\")\n .description(\"Perform batch operations on temporal entities\");\n\n // temporal entities list\n const entitiesList = addTemporalListOptions(\n entities.command(\"list\").description(\"List temporal entities with optional filters\"),\n );\n entitiesList.action(createListAction());\n\n addExamples(entitiesList, [\n {\n description: \"List by type with time range\",\n command:\n \"geonic temporal entities list --type Sensor --time-rel between --time-at 2025-01-01T00:00:00Z --end-time-at 2025-01-31T23:59:59Z\",\n },\n {\n description: \"Get last 5 temporal values\",\n command: \"geonic temporal entities list --type Sensor --last-n 5\",\n },\n {\n description: \"Filter by time (after a point)\",\n command:\n \"geonic temporal entities list --time-rel after --time-at 2025-06-01T00:00:00Z\",\n },\n ]);\n\n // temporal entities get\n const entitiesGet = addTemporalGetOptions(\n entities.command(\"get <id>\").description(\"Get a temporal entity by ID\"),\n );\n entitiesGet.action(createGetAction());\n\n addExamples(entitiesGet, [\n {\n description: \"Get temporal entity with specific attributes\",\n command:\n \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --attrs temperature,humidity\",\n },\n {\n description: \"Get last 10 values for an entity\",\n command: \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --last-n 10\",\n },\n ]);\n\n // temporal entities create\n const create = entities\n .command(\"create [json]\")\n .summary(\"Create a temporal entity\")\n .description(\n \"Create a temporal entity\\n\\n\" +\n \"JSON payload: an NGSI-LD entity with temporal attribute instances.\\n\" +\n \"Each attribute value is an array of {value, observedAt} objects.\",\n )\n .action(createCreateAction());\n\n addExamples(create, [\n {\n description: \"Create from a file\",\n command: \"geonic temporal entities create @temporal-entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat temporal-entity.json | geonic temporal entities create\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic temporal entities create\",\n },\n ]);\n\n // temporal entities delete\n const del = entities\n .command(\"delete <id>\")\n .description(\"Delete a temporal entity and all its historical attribute data\")\n .action(createDeleteAction());\n\n addExamples(del, [\n {\n description: \"Delete temporal data for an entity\",\n command: \"geonic temporal entities delete urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Remove all historical records for a specific entity\",\n command: \"geonic temporal entities delete urn:ngsi-ld:WeatherStation:tokyo-01\",\n },\n ]);\n\n // temporal entityOperations query\n const opsQuery = addQueryOptions(\n entityOperations.command(\"query [json]\").description(\"Query temporal entities (POST)\"),\n );\n opsQuery.action(createQueryAction());\n\n addExamples(opsQuery, [\n {\n description: \"Query with inline JSON\",\n command: `geonic temporal entityOperations query '{\"entities\":[{\"type\":\"Sensor\"}],\"attrs\":[\"temperature\"]}'`,\n },\n {\n description: \"Query with aggregation (hourly count)\",\n command:\n \"geonic temporal entityOperations query @query.json --aggr-methods totalCount --aggr-period PT1H\",\n },\n {\n description: \"Query from a file\",\n command: \"geonic temporal entityOperations query @query.json\",\n },\n ]);\n\n // Backward-compatible hidden aliases at the temporal level\n addTemporalListOptions(\n temporal\n .command(\"list\", { hidden: true })\n .description(\"List temporal entities (deprecated: use temporal entities list)\"),\n ).action(createListAction());\n\n addTemporalGetOptions(\n temporal\n .command(\"get <id>\", { hidden: true })\n .description(\"Get a temporal entity (deprecated: use temporal entities get)\"),\n ).action(createGetAction());\n\n temporal\n .command(\"create [json]\", { hidden: true })\n .description(\"Create a temporal entity (deprecated: use temporal entities create)\")\n .action(createCreateAction());\n\n temporal\n .command(\"delete <id>\", { hidden: true })\n .description(\"Delete a temporal entity (deprecated: use temporal entities delete)\")\n .action(createDeleteAction());\n\n addQueryOptions(\n temporal\n .command(\"query [json]\", { hidden: true })\n .description(\"Query temporal entities (deprecated: use temporal entityOperations query)\"),\n ).action(createQueryAction());\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSnapshotsCommand(program: Command): void {\n const snapshots = program\n .command(\"snapshots\")\n .description(\"Manage point-in-time snapshots of entity data for backup and cloning\");\n\n // snapshots list\n const list = snapshots\n .command(\"list\")\n .description(\"List all available snapshots with their IDs, timestamps, and status\")\n .option(\"--limit <n>\", \"Maximum number of snapshots to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N snapshots\", parseInt)\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n\n const response = await client.get(\"/snapshots\", params);\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all snapshots\",\n command: \"geonic snapshots list\",\n },\n {\n description: \"List the 10 most recent snapshots\",\n command: \"geonic snapshots list --limit 10\",\n },\n {\n description: \"Paginate through snapshots\",\n command: \"geonic snapshots list --limit 5 --offset 10\",\n },\n {\n description: \"List snapshots in table format\",\n command: \"geonic snapshots list --format table\",\n },\n ]);\n\n // snapshots get\n const get = snapshots\n .command(\"get <id>\")\n .description(\"Retrieve details of a specific snapshot including its status and metadata\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get details of a snapshot by its ID\",\n command: \"geonic snapshots get abc123\",\n },\n {\n description: \"Get snapshot details in table format\",\n command: \"geonic snapshots get abc123 --format table\",\n },\n ]);\n\n // snapshots create\n const create = snapshots\n .command(\"create\")\n .description(\"Create a point-in-time snapshot of all current entity data\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.post(\"/snapshots\");\n printSuccess(\"Snapshot created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a snapshot of the current entity data\",\n command: \"geonic snapshots create\",\n },\n {\n description: \"Create a snapshot before performing a bulk update\",\n command: \"geonic snapshots create && geonic batch upsert @bulk-update.json\",\n },\n ]);\n\n // snapshots delete\n const del = snapshots\n .command(\"delete <id>\")\n .description(\"Permanently delete a snapshot to free storage\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Snapshot deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a snapshot by its ID\",\n command: \"geonic snapshots delete abc123\",\n },\n {\n description: \"Delete an old snapshot to reclaim storage\",\n command: \"geonic snapshots delete old-backup-id\",\n },\n ]);\n\n // snapshots clone\n const clone = snapshots\n .command(\"clone <id>\")\n .description(\"Clone a snapshot to create a duplicate for testing or migration\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.post(\n `/snapshots/${encodeURIComponent(String(id))}/clone`,\n );\n if (response.data !== undefined && response.data !== \"\") {\n outputResponse(response, format);\n } else {\n printSuccess(\"Snapshot cloned.\");\n }\n }),\n );\n\n addExamples(clone, [\n {\n description: \"Clone a snapshot for use in a test environment\",\n command: \"geonic snapshots clone abc123\",\n },\n {\n description: \"Clone a production snapshot to a staging profile\",\n command: \"geonic snapshots clone abc123 --profile staging\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerTenantsCommand(parent: Command): void {\n const tenants = parent\n .command(\"tenants\")\n .description(\"Manage tenants\");\n\n // tenants list\n const list = tenants\n .command(\"list\")\n .description(\"List all tenants in the system, including their status and configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/tenants\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all tenants\",\n command: \"geonic admin tenants list\",\n },\n {\n description: \"List tenants in table format\",\n command: \"geonic admin tenants list --format table\",\n },\n ]);\n\n // tenants get\n const get = tenants\n .command(\"get <id>\")\n .description(\"Get a tenant's details — name, description, status, and creation date\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get tenant details by ID\",\n command: \"geonic admin tenants get <tenant-id>\",\n },\n {\n description: \"Get tenant details in table format\",\n command: \"geonic admin tenants get <tenant-id> --format table\",\n },\n ]);\n\n // tenants create\n const create = tenants\n .command(\"create [json]\")\n .summary(\"Create a new tenant\")\n .description(\n \"Create a new tenant\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"production\",\\n' +\n ' \"description\": \"Production environment tenant\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/tenants\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Tenant created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin tenants create '{\"name\":\"my-tenant\",\"description\":\"My first tenant\"}'`,\n },\n {\n description: \"Minimal (name only)\",\n command: `geonic admin tenants create '{\"name\":\"production\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin tenants create @tenant.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat tenant.json | geonic admin tenants create\",\n },\n {\n description: \"Interactive mode (omit JSON argument)\",\n command: \"geonic admin tenants create\",\n },\n ]);\n\n // tenants update\n const update = tenants\n .command(\"update <id> [json]\")\n .summary(\"Update a tenant\")\n .description(\n \"Update a tenant\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"name\": \"new-name\", \"description\": \"Updated description\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = (await parseJsonInput(json as string | undefined)) as Record<string, unknown>;\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Tenant updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description with inline JSON\",\n command: `geonic admin tenants update <tenant-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Rename a tenant\",\n command: `geonic admin tenants update <tenant-id> '{\"name\":\"new-name\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin tenants update <tenant-id> @patch.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat patch.json | geonic admin tenants update <tenant-id>\",\n },\n {\n description: \"Interactive mode\",\n command: \"geonic admin tenants update <tenant-id>\",\n },\n ]);\n\n // tenants delete\n const del = tenants\n .command(\"delete <id>\")\n .description(\"Permanently delete a tenant and all its associated data. This action cannot be undone\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Tenant deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a tenant by ID\",\n command: \"geonic admin tenants delete <tenant-id>\",\n },\n {\n description: \"Delete with verbose output to confirm\",\n command: \"geonic admin tenants delete <tenant-id> --verbose\",\n },\n ]);\n\n // tenants activate\n const activate = tenants\n .command(\"activate <id>\")\n .description(\"Activate a tenant, restoring API access for all its users\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Tenant activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a deactivated tenant\",\n command: \"geonic admin tenants activate <tenant-id>\",\n },\n ]);\n\n // tenants deactivate\n const deactivate = tenants\n .command(\"deactivate <id>\")\n .description(\"Deactivate a tenant, blocking API access for all its users until reactivated\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Tenant deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a tenant to temporarily suspend access\",\n command: \"geonic admin tenants deactivate <tenant-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerUsersCommand(parent: Command): void {\n const users = parent\n .command(\"users\")\n .description(\"Manage users\");\n\n // users list\n const list = users\n .command(\"list\")\n .description(\"List all users across tenants, showing email, role, and status\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/users\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all users\",\n command: \"geonic admin users list\",\n },\n {\n description: \"List users in table format\",\n command: \"geonic admin users list --format table\",\n },\n {\n description: \"List users for a specific tenant\",\n command: \"geonic admin users list --service <tenant-id>\",\n },\n ]);\n\n // users get\n const get = users\n .command(\"get <id>\")\n .description(\"Get a user's details — email, role, tenant, status, and login history\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Inspect a user's account details\",\n command: \"geonic admin users get <user-id>\",\n },\n {\n description: \"Get user details in table format\",\n command: \"geonic admin users get <user-id> --format table\",\n },\n ]);\n\n // users create\n const create = users\n .command(\"create [json]\")\n .summary(\"Create a new user\")\n .description(\n \"Create a new user\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"email\": \"user@example.com\",\\n' +\n ' \"password\": \"SecurePassword123!\",\\n' +\n ' \"role\": \"tenant_admin\",\\n' +\n ' \"tenantId\": \"<tenant-id>\"\\n' +\n \" }\\n\\n\" +\n \"Roles: super_admin, tenant_admin, user\\n\" +\n \"tenantId is required for tenant_admin and user roles.\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/users\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"User created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a tenant admin\",\n command: `geonic admin users create '{\"email\":\"admin@example.com\",\"password\":\"SecurePass12345!\",\"role\":\"tenant_admin\",\"tenantId\":\"<tenant-id>\"}'`,\n },\n {\n description: \"Create a user for a tenant\",\n command: `geonic admin users create '{\"email\":\"user@example.com\",\"password\":\"SecurePass12345!\",\"role\":\"user\",\"tenantId\":\"<tenant-id>\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin users create @user.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat user.json | geonic admin users create\",\n },\n ]);\n\n // users update\n const update = users\n .command(\"update <id> [json]\")\n .summary(\"Update a user\")\n .description(\n \"Update a user\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"role\": \"admin\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"User updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update role with inline JSON\",\n command: `geonic admin users update <user-id> '{\"role\":\"admin\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin users update <user-id> @user.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat user.json | geonic admin users update <user-id>\",\n },\n ]);\n\n // users delete\n const del = users\n .command(\"delete <id>\")\n .description(\"Permanently delete a user account. This revokes all access and cannot be undone\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"User deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a user by ID\",\n command: \"geonic admin users delete <user-id>\",\n },\n {\n description: \"Delete with verbose output\",\n command: \"geonic admin users delete <user-id> --verbose\",\n },\n ]);\n\n // users activate\n const activate = users\n .command(\"activate <id>\")\n .description(\"Activate a user account, allowing them to log in and access the API\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"User activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a deactivated user\",\n command: \"geonic admin users activate <user-id>\",\n },\n ]);\n\n // users deactivate\n const deactivate = users\n .command(\"deactivate <id>\")\n .description(\"Deactivate a user account, preventing login until reactivated\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"User deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a user to suspend their access\",\n command: \"geonic admin users deactivate <user-id>\",\n },\n ]);\n\n // users unlock\n const unlock = users\n .command(\"unlock <id>\")\n .description(\"Unlock a user account that was locked due to repeated failed login attempts\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/unlock`,\n );\n printSuccess(\"User unlocked.\");\n }),\n );\n\n addExamples(unlock, [\n {\n description: \"Unlock a locked user account\",\n command: \"geonic admin users unlock <user-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerPoliciesCommand(parent: Command): void {\n const policies = parent\n .command(\"policies\")\n .description(\"Manage XACML access control policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List all access control policies, showing their status and priority\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all policies\",\n command: \"geonic admin policies list\",\n },\n {\n description: \"List policies in table format for an overview\",\n command: \"geonic admin policies list --format table\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <id>\")\n .description(\"Get a policy's full details — target rules, effect, priority, and status\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Inspect a policy's rules and target configuration\",\n command: \"geonic admin policies get <policy-id>\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .summary(\"Create a new policy\")\n .description(\n \"Create a new policy\\n\\n\" +\n \"JSON payload examples:\\n\\n\" +\n \" Allow all entities:\\n\" +\n \" {\\n\" +\n ' \"description\": \"Allow all entities\",\\n' +\n ' \"rules\": [{\"ruleId\": \"allow-all\", \"effect\": \"Permit\"}]\\n' +\n \" }\\n\\n\" +\n \" Allow GET access to a specific entity type:\\n\" +\n \" {\\n\" +\n ' \"description\": \"Allow GET access to Landmark entities\",\\n' +\n ' \"target\": {\\n' +\n ' \"resources\": [{\"attributeId\": \"entityType\", \"matchValue\": \"Landmark\"}],\\n' +\n ' \"actions\": [{\"attributeId\": \"method\", \"matchValue\": \"GET\"}]\\n' +\n \" },\\n\" +\n ' \"rules\": [{\"ruleId\": \"permit-get\", \"effect\": \"Permit\"}]\\n' +\n \" }\\n\\n\" +\n \"Target fields:\\n\" +\n \" subjects — attributeId: role, userId, email, tenantId\\n\" +\n \" resources — attributeId: path, entityType, entityId, entityOwner, tenantService, servicePath\\n\" +\n \" actions — attributeId: method (GET, POST, PATCH, DELETE)\\n\\n\" +\n \"Each element: {attributeId, matchValue, matchFunction?}\\n\" +\n \" matchFunction: \\\"string-equal\\\" (default) | \\\"string-regexp\\\" | \\\"glob\\\"\\n\\n\" +\n \"Priority: smaller value = higher precedence (e.g. priority 10 overrides user default at 100).\\n\" +\n \" tenant_admin: minimum priority 10. user self-service (/me/policies): fixed at 100.\\n\\n\" +\n \"Default role policies (priority 100):\\n\" +\n \" user → /v2/** and /ngsi-ld/** all methods Permit; other data APIs GET only\\n\" +\n \" api_key → all Deny, anonymous → all Deny\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/policies\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin policies create '{\"description\":\"Allow all entities\",\"rules\":[{\"ruleId\":\"allow-all\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create with target (entity type + method)\",\n command: `geonic admin policies create '{\"description\":\"Allow GET Landmark\",\"target\":{\"resources\":[{\"attributeId\":\"entityType\",\"matchValue\":\"Landmark\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"ruleId\":\"permit-get\",\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create anonymous access policy\",\n command: `geonic admin policies create '{\"policyId\":\"public-read\",\"target\":{\"subjects\":[{\"attributeId\":\"role\",\"matchValue\":\"anonymous\"}],\"resources\":[{\"attributeId\":\"entityType\",\"matchValue\":\"WeatherObserved\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create servicePath-based policy (glob match)\",\n command: `geonic admin policies create '{\"description\":\"Allow read on /opendata/**\",\"priority\":100,\"target\":{\"resources\":[{\"attributeId\":\"servicePath\",\"matchValue\":\"/opendata/**\",\"matchFunction\":\"glob\"}],\"actions\":[{\"attributeId\":\"method\",\"matchValue\":\"GET\"}]},\"rules\":[{\"effect\":\"Permit\"}]}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin policies create @policy.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat policy.json | geonic admin policies create\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <id> [json]\")\n .summary(\"Update a policy\")\n .description(\n \"Update a policy\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated policy\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin policies update <policy-id> '{\"description\":\"Updated policy\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin policies update <policy-id> @policy.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat policy.json | geonic admin policies update <policy-id>\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <id>\")\n .description(\"Delete a policy. Users or API keys referencing this policy will lose the access it granted\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a policy by ID\",\n command: \"geonic admin policies delete <policy-id>\",\n },\n ]);\n\n // policies activate\n const activate = policies\n .command(\"activate <id>\")\n .description(\"Activate a policy so its access control rules are enforced\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Policy activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Enable a policy to start enforcing its rules\",\n command: \"geonic admin policies activate <policy-id>\",\n },\n ]);\n\n // policies deactivate\n const deactivate = policies\n .command(\"deactivate <id>\")\n .description(\"Deactivate a policy, suspending its rules without deleting it\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Policy deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Temporarily disable a policy without deleting it\",\n command: \"geonic admin policies deactivate <policy-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerOAuthClientsCommand(parent: Command): void {\n const oauthClients = parent\n .command(\"oauth-clients\")\n .description(\"Manage OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List all registered OAuth clients and their configurations\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all OAuth clients\",\n command: \"geonic admin oauth-clients list\",\n },\n {\n description: \"List OAuth clients in table format\",\n command: \"geonic admin oauth-clients list --format table\",\n },\n ]);\n\n // oauth-clients get\n const get = oauthClients\n .command(\"get <id>\")\n .description(\"Get an OAuth client's details — name, client ID, policy, and redirect URIs\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Inspect an OAuth client's configuration\",\n command: \"geonic admin oauth-clients get <client-id>\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .summary(\"Create a new OAuth client\")\n .description(\n \"Create a new OAuth client\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"my-app\",\\n' +\n ' \"policyId\": \"<policy-id>\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/oauth-clients\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic admin oauth-clients create '{\"name\":\"my-app\",\"policyId\":\"<policy-id>\"}'`,\n },\n {\n description: \"Create from a JSON file\",\n command: \"geonic admin oauth-clients create @client.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients create\",\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <id> [json]\")\n .summary(\"Update an OAuth client\")\n .description(\n \"Update an OAuth client\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated client\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic admin oauth-clients update <client-id> '{\"description\":\"Updated client\"}'`,\n },\n {\n description: \"Update from a JSON file\",\n command: \"geonic admin oauth-clients update <client-id> @client.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat client.json | geonic admin oauth-clients update <client-id>\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client. Existing tokens issued by this client will be invalidated\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client by ID\",\n command: \"geonic admin oauth-clients delete <client-id>\",\n },\n ]);\n}\n\nexport function registerCaddeCommand(parent: Command): void {\n const cadde = parent\n .command(\"cadde\")\n .description(\"Manage CADDE (data exchange) configuration for cross-platform data sharing\");\n\n // cadde get\n const caddeGet = cadde\n .command(\"get\")\n .description(\"Get the current CADDE data exchange configuration (provider, endpoint, etc.)\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/cadde\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(caddeGet, [\n {\n description: \"View current CADDE configuration\",\n command: \"geonic admin cadde get\",\n },\n {\n description: \"View CADDE configuration in table format\",\n command: \"geonic admin cadde get --format table\",\n },\n ]);\n\n // cadde set\n const caddeSet = cadde\n .command(\"set [json]\")\n .summary(\"Set CADDE configuration\")\n .description(\n \"Set CADDE configuration\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"provider\": \"my-provider\",\\n' +\n ' \"endpoint\": \"http://localhost:6000\"\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"PUT\", \"/admin/cadde\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"CADDE configuration set.\");\n }),\n );\n\n addExamples(caddeSet, [\n {\n description: \"Set with inline JSON\",\n command: `geonic admin cadde set '{\"provider\":\"my-provider\",\"endpoint\":\"http://localhost:6000\"}'`,\n },\n {\n description: \"Set from a JSON file\",\n command: \"geonic admin cadde set @cadde-config.json\",\n },\n {\n description: \"Set from stdin pipe\",\n command: \"cat cadde-config.json | geonic admin cadde set\",\n },\n ]);\n\n // cadde delete\n const caddeDelete = cadde\n .command(\"delete\")\n .description(\"Remove the CADDE data exchange configuration, disabling cross-platform data sharing\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\"DELETE\", \"/admin/cadde\");\n printSuccess(\"CADDE configuration deleted.\");\n }),\n );\n\n addExamples(caddeDelete, [\n {\n description: \"Remove CADDE configuration\",\n command: \"geonic admin cadde delete\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../../helpers.js\";\nimport { loadConfig, saveConfig } from \"../../config.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printApiKeyBox, printError } from \"../../output.js\";\nimport { addExamples, addNotes } from \"../help.js\";\n\n/** Strip masked key placeholder from API key response for cleaner display. */\nfunction cleanApiKeyData(data: unknown): unknown {\n if (Array.isArray(data)) return data.map(cleanApiKeyData);\n if (typeof data !== \"object\" || data === null) return data;\n const obj = { ...(data as Record<string, unknown>) };\n if (obj.key === \"******\") delete obj.key;\n return obj;\n}\n\nfunction validateOrigins(body: unknown, opts: Record<string, unknown>): void {\n // Validate origins if provided via flags\n if (opts.origins !== undefined) {\n const origins = String(opts.origins).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (origins.length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n // Also validate if provided via JSON input\n if (body && typeof body === \"object\" && \"allowedOrigins\" in (body as Record<string, unknown>)) {\n const origins = (body as Record<string, unknown>).allowedOrigins;\n if (Array.isArray(origins) && origins.filter((o: unknown) => typeof o === \"string\" && o.trim() !== \"\").length === 0) {\n printError(\"allowedOrigins must contain at least 1 item. Use '*' to allow all origins.\");\n process.exit(1);\n }\n }\n}\n\nfunction buildBodyFromFlags(opts: Record<string, unknown>): Record<string, unknown> {\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.name = opts.name;\n if (opts.policy) payload.policyId = opts.policy;\n if (opts.origins) payload.allowedOrigins = (opts.origins as string).split(\",\").map((s: string) => s.trim()).filter(Boolean);\n if (opts.rateLimit) {\n const raw = String(opts.rateLimit).trim();\n if (!/^\\d+$/.test(raw)) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n const perMinute = Number(raw);\n if (perMinute <= 0) {\n printError(\"--rate-limit must be a positive integer.\");\n process.exit(1);\n }\n payload.rateLimit = { perMinute };\n }\n if (opts.dpopRequired !== undefined) payload.dpopRequired = opts.dpopRequired;\n if (opts.tenantId) payload.tenantId = opts.tenantId;\n return payload;\n}\n\n/** Save API key to profile config and print confirmation. Returns false if key missing or save fails. */\nfunction handleSaveKey(\n data: Record<string, unknown>,\n cmd: Command,\n): boolean {\n const globalOpts = resolveOptions(cmd);\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. API key was created, but it could not be saved.\");\n process.exitCode = 1;\n return false;\n }\n try {\n const config = loadConfig(globalOpts.profile);\n config.apiKey = key;\n saveConfig(config, globalOpts.profile);\n console.error(\"API key saved to config. X-Api-Key header will be sent automatically.\");\n return true;\n } catch (err) {\n printError(`Failed to save API key to config: ${err instanceof Error ? err.message : String(err)}`);\n printApiKeyBox(key);\n process.exitCode = 1;\n return false;\n }\n}\n\n/** Show API key value prominently. Returns false if key is missing (treated as error). */\nfunction showKeyResult(\n data: Record<string, unknown>,\n save: boolean,\n cmd: Command,\n): boolean {\n const key = data.key as string | undefined;\n if (!key) {\n printError(\"Response missing key. The new API key value was not returned.\");\n process.exitCode = 1;\n return false;\n }\n if (save) return handleSaveKey(data, cmd);\n printApiKeyBox(key);\n return true;\n}\n\nexport function registerApiKeysCommand(parent: Command): void {\n const apiKeys = parent\n .command(\"api-keys\")\n .description(\"Manage API keys\");\n\n // api-keys list\n const list = apiKeys\n .command(\"list\")\n .description(\"List all API keys, showing name, tenant, policy, and status (key values are masked)\")\n .option(\"--tenant-id <id>\", \"Filter by tenant ID\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { tenantId?: string };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const params: Record<string, string> = {};\n if (opts.tenantId) params.tenantId = opts.tenantId;\n const response = await client.rawRequest(\"GET\", \"/admin/api-keys\", {\n params,\n });\n response.data = cleanApiKeyData(response.data);\n outputResponse(response, format);\n console.error(\"※ API キー値は作成時 (create) またはリフレッシュ時 (refresh) にのみ表示されます。\");\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all API keys\",\n command: \"geonic admin api-keys list\",\n },\n {\n description: \"List API keys in table format\",\n command: \"geonic admin api-keys list --format table\",\n },\n {\n description: \"List API keys for a specific tenant\",\n command: \"geonic admin api-keys list --tenant-id <tenant-id>\",\n },\n ]);\n\n // api-keys get\n const get = apiKeys\n .command(\"get <keyId>\")\n .description(\"Get an API key's metadata — name, policy, allowed origins, and rate limit (key value is masked)\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n response.data = cleanApiKeyData(response.data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Inspect an API key's configuration\",\n command: \"geonic admin api-keys get <key-id>\",\n },\n ]);\n\n // api-keys create\n const create = apiKeys\n .command(\"create [json]\")\n .description(\"Create a new API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--tenant-id <id>\", \"Tenant ID\")\n .option(\"--save\", \"Save the API key to profile config\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n tenantId?: string;\n save?: boolean;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy || opts.origins || opts.rateLimit || opts.dpopRequired !== undefined || opts.tenantId) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/api-keys\", {\n body,\n });\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key created.\");\n }),\n );\n\n addNotes(create, [\n \"Use --policy to attach an existing XACML policy to the API key.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(create, [\n {\n description: \"Create an API key with a policy\",\n command: \"geonic admin api-keys create --name my-key --policy <policy-id> --origins '*'\",\n },\n {\n description: \"Create an API key with DPoP required\",\n command: \"geonic admin api-keys create --name my-key --dpop-required\",\n },\n {\n description: \"Create an API key from JSON and save to config\",\n command: \"geonic admin api-keys create @key.json --save\",\n },\n ]);\n\n // api-keys refresh\n const refresh = apiKeys\n .command(\"refresh <keyId>\")\n .description(\"Refresh (rotate) an API key — generates a new key value\")\n .option(\"--save\", \"Save the new API key to profile config\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as { save?: boolean };\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"POST\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}/refresh`,\n );\n\n const data = response.data as Record<string, unknown>;\n const ok = showKeyResult(data, !!opts.save, cmd);\n\n outputResponse(response, format);\n if (ok) console.error(\"API key refreshed.\");\n }),\n );\n\n addNotes(refresh, [\n \"Refreshing generates a new key value while keeping keyId, name, and policy settings.\",\n \"The previous key value is immediately invalidated.\",\n ]);\n\n addExamples(refresh, [\n {\n description: \"Refresh an API key\",\n command: \"geonic admin api-keys refresh <key-id>\",\n },\n {\n description: \"Refresh and save new key to config\",\n command: \"geonic admin api-keys refresh <key-id> --save\",\n },\n ]);\n\n // api-keys update\n const update = apiKeys\n .command(\"update <keyId> [json]\")\n .description(\"Update an API key\")\n .option(\"--name <name>\", \"Key name\")\n .option(\"--policy <policyId>\", \"Policy ID to attach\")\n .option(\"--origins <origins>\", \"Comma-separated origins\")\n .option(\"--rate-limit <n>\", \"Rate limit per minute\")\n .option(\"--dpop-required\", \"Require DPoP token binding\")\n .option(\"--no-dpop-required\", \"Disable DPoP token binding\")\n .action(\n withErrorHandler(\n async (keyId: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n policy?: string;\n origins?: string;\n rateLimit?: string;\n dpopRequired?: boolean;\n };\n\n validateOrigins(undefined, opts);\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.policy || opts.origins || opts.rateLimit || opts.dpopRequired !== undefined) {\n body = buildBodyFromFlags(opts);\n } else {\n body = await parseJsonInput();\n }\n\n validateOrigins(body, {});\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n { body },\n );\n outputResponse(response, format);\n console.error(\"API key updated.\");\n },\n ),\n );\n\n addNotes(update, [\n \"Use --policy to attach an existing XACML policy to the API key.\",\n \"Manage policies with `geonic admin policies` commands.\",\n ]);\n\n addExamples(update, [\n {\n description: \"Update an API key name\",\n command: \"geonic admin api-keys update <key-id> --name new-name\",\n },\n {\n description: \"Attach a policy\",\n command: \"geonic admin api-keys update <key-id> --policy <policy-id>\",\n },\n {\n description: \"Enable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --dpop-required\",\n },\n {\n description: \"Disable DPoP requirement\",\n command: \"geonic admin api-keys update <key-id> --no-dpop-required\",\n },\n {\n description: \"Update an API key from a JSON file\",\n command: \"geonic admin api-keys update <key-id> @key.json\",\n },\n ]);\n\n // api-keys delete\n const del = apiKeys\n .command(\"delete <keyId>\")\n .description(\"Delete an API key. Any requests using this key will be immediately rejected\")\n .action(\n withErrorHandler(async (keyId: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/api-keys/${encodeURIComponent(String(keyId))}`,\n );\n console.error(\"API key deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an API key by ID\",\n command: \"geonic admin api-keys delete <key-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { registerTenantsCommand } from \"./tenants.js\";\nimport { registerUsersCommand } from \"./users.js\";\nimport { registerPoliciesCommand } from \"./policies.js\";\nimport { registerOAuthClientsCommand, registerCaddeCommand } from \"./oauth-clients.js\";\nimport { registerApiKeysCommand } from \"./api-keys.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Manage admin resources\");\n\n registerTenantsCommand(admin);\n registerUsersCommand(admin);\n registerPoliciesCommand(admin);\n registerOAuthClientsCommand(admin);\n registerApiKeysCommand(admin);\n registerCaddeCommand(admin);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRulesCommand(program: Command): void {\n const rules = program\n .command(\"rules\")\n .description(\"Manage ReactiveCore rules that trigger actions based on entity changes\");\n\n // rules list\n const list = rules\n .command(\"list\")\n .description(\"List all configured rules and their current status\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/rules\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all rules as JSON\",\n command: \"geonic rules list\",\n },\n {\n description: \"List rules in table format to review status at a glance\",\n command: \"geonic rules list --format table\",\n },\n ]);\n\n // rules get\n const get = rules\n .command(\"get <id>\")\n .description(\"Get a rule's full definition including conditions, actions, and status\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Inspect a rule's conditions and actions\",\n command: \"geonic rules get <rule-id>\",\n },\n {\n description: \"Get a rule and check if it is active\",\n command: \"geonic rules get urn:ngsi-ld:Rule:high-temp-alert\",\n },\n ]);\n\n // rules create\n const create = rules\n .command(\"create [json]\")\n .summary(\"Create a new rule\")\n .description(\n \"Create a new rule\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"name\": \"high-temp-alert\",\\n' +\n ' \"description\": \"Alert on high temperature\",\\n' +\n ' \"conditions\": [{\"type\": \"celExpression\", \"expression\": \"entity.temperature > 30\"}],\\n' +\n ' \"actions\": [{\"type\": \"webhook\", \"url\": \"http://localhost:5000/alert\", \"method\": \"POST\"}]\\n' +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/rules\", { body });\n outputResponse(response, format);\n printSuccess(\"Rule created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic rules create '{\"name\":\"high-temp-alert\",\"conditions\":[{\"type\":\"celExpression\",\"expression\":\"entity.temperature > 30\"}],\"actions\":[{\"type\":\"webhook\",\"url\":\"http://localhost:5000/alert\",\"method\":\"POST\"}]}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic rules create @rule.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat rule.json | geonic rules create\",\n },\n ]);\n\n // rules update\n const update = rules\n .command(\"update <id> [json]\")\n .summary(\"Update a rule\")\n .description(\n \"Update a rule\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n \" e.g. {\\\"description\\\": \\\"Updated rule\\\"}\",\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/rules/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Rule updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic rules update <rule-id> '{\"description\":\"Updated rule\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic rules update <rule-id> @rule.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat rule.json | geonic rules update <rule-id>\",\n },\n ]);\n\n // rules delete\n const del = rules\n .command(\"delete <id>\")\n .description(\"Permanently delete a rule and stop its processing\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Rule deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a rule by ID\",\n command: \"geonic rules delete <rule-id>\",\n },\n {\n description: \"Remove an obsolete alert rule\",\n command: \"geonic rules delete urn:ngsi-ld:Rule:old-alert\",\n },\n ]);\n\n // rules activate\n const activate = rules\n .command(\"activate <id>\")\n .description(\"Enable a rule so it begins evaluating conditions and firing actions\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Rule activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Start processing a rule\",\n command: \"geonic rules activate <rule-id>\",\n },\n {\n description: \"Re-enable a previously deactivated rule\",\n command: \"geonic rules activate urn:ngsi-ld:Rule:high-temp-alert\",\n },\n ]);\n\n // rules deactivate\n const deactivate = rules\n .command(\"deactivate <id>\")\n .description(\"Disable a rule without deleting it, pausing condition evaluation and actions\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Rule deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Temporarily pause a rule during maintenance\",\n command: \"geonic rules deactivate <rule-id>\",\n },\n {\n description: \"Disable a noisy alert rule without removing it\",\n command: \"geonic rules deactivate urn:ngsi-ld:Rule:high-temp-alert\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerModelsCommand(program: Command): void {\n const models = program\n .command(\"custom-data-models\")\n .alias(\"models\")\n .description(\"Manage custom data models that define entity type schemas and property constraints\");\n\n // models list\n const list = models\n .command(\"list\")\n .description(\"List all registered data models for the current tenant\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/custom-data-models\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all data models as JSON\",\n command: \"geonic models list\",\n },\n {\n description: \"Browse available data models in table format\",\n command: \"geonic models list --format table\",\n },\n ]);\n\n // models get\n const get = models\n .command(\"get <id>\")\n .description(\"Get a data model's full schema including property definitions and constraints\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Inspect a model's property definitions\",\n command: \"geonic models get <model-id>\",\n },\n {\n description: \"View the schema for a Sensor data model\",\n command: \"geonic models get urn:ngsi-ld:DataModel:Sensor\",\n },\n ]);\n\n // models create\n const create = models\n .command(\"create [json]\")\n .summary(\"Create a new model\")\n .description(\n \"Create a new model\\n\\n\" +\n \"JSON payload example:\\n\" +\n \" {\\n\" +\n ' \"type\": \"Sensor\",\\n' +\n ' \"domain\": \"iot\",\\n' +\n ' \"description\": \"IoT Sensor\",\\n' +\n ' \"propertyDetails\": {\\n' +\n ' \"temperature\": {\"ngsiType\": \"Property\", \"valueType\": \"Number\", \"example\": 25}\\n' +\n \" }\\n\" +\n \" }\",\n )\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/custom-data-models\", { body });\n outputResponse(response, format);\n printSuccess(\"Model created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create with inline JSON\",\n command: `geonic models create '{\"type\":\"Sensor\",\"domain\":\"iot\",\"description\":\"IoT Sensor\",\"propertyDetails\":{\"temperature\":{\"ngsiType\":\"Property\",\"valueType\":\"Number\",\"example\":25}}}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic models create @model.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat model.json | geonic models create\",\n },\n ]);\n\n // models update\n const update = models\n .command(\"update <id> [json]\")\n .summary(\"Update a model\")\n .description(\n \"Update a model\\n\\n\" +\n \"JSON payload: only specified fields are updated.\\n\" +\n ' e.g. {\"description\": \"Updated model\"}',\n )\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Model updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update description\",\n command: `geonic models update <model-id> '{\"description\":\"Updated description\"}'`,\n },\n {\n description: \"Update from a file\",\n command: \"geonic models update <model-id> @model.json\",\n },\n {\n description: \"Update from stdin pipe\",\n command: \"cat model.json | geonic models update <model-id>\",\n },\n ]);\n\n // models delete\n const del = models\n .command(\"delete <id>\")\n .description(\"Delete a data model definition (does not affect existing entities)\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Model deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a data model by ID\",\n command: \"geonic models delete <model-id>\",\n },\n {\n description: \"Remove a deprecated model definition\",\n command: \"geonic models delete urn:ngsi-ld:DataModel:LegacySensor\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program\n .command(\"catalog\")\n .description(\"Browse the DCAT-AP data catalog for discovering and previewing datasets\");\n\n // catalog get\n const get = catalog\n .command(\"get\")\n .description(\"Get the DCAT-AP catalog metadata including title, publisher, and dataset count\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"View catalog metadata (title, publisher, datasets summary)\",\n command: \"geonic catalog get\",\n },\n {\n description: \"Get catalog metadata in table format\",\n command: \"geonic catalog get --format table\",\n },\n ]);\n\n // catalog datasets\n const datasets = catalog\n .command(\"datasets\")\n .description(\"List, inspect, and preview datasets published in the catalog\");\n\n // catalog datasets list\n const datasetsList = datasets\n .command(\"list\")\n .description(\"List all datasets published in the catalog\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog/datasets\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsList, [\n {\n description: \"List all catalog datasets as JSON\",\n command: \"geonic catalog datasets list\",\n },\n {\n description: \"Browse datasets in table format\",\n command: \"geonic catalog datasets list --format table\",\n },\n ]);\n\n // catalog datasets get\n const datasetsGet = datasets\n .command(\"get <id>\")\n .description(\"Get a dataset's metadata including description, distributions, and license\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsGet, [\n {\n description: \"Inspect a dataset's metadata and distributions\",\n command: \"geonic catalog datasets get <dataset-id>\",\n },\n {\n description: \"View dataset details including license and publisher\",\n command: \"geonic catalog datasets get urn:ngsi-ld:Dataset:weather-stations\",\n },\n ]);\n\n // catalog datasets sample\n const datasetsSample = datasets\n .command(\"sample <id>\")\n .description(\"Preview sample entities from a dataset to understand its structure and content\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}/sample`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsSample, [\n {\n description: \"Preview sample entities from a dataset\",\n command: \"geonic catalog datasets sample <dataset-id>\",\n },\n {\n description: \"Preview data in table format to quickly assess content\",\n command: \"geonic catalog datasets sample <dataset-id> --format table\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerHealthCommand(program: Command): void {\n const health = program\n .command(\"health\")\n .description(\"Check Context Broker connectivity and health status\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/health\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(health, [\n {\n description: \"Check server health\",\n command: \"geonic health\",\n },\n {\n description: \"Check health with table output\",\n command: \"geonic health --format table\",\n },\n {\n description: \"Check health of a specific server\",\n command: \"geonic health --url https://api.example.com\",\n },\n ]);\n}\n\nexport function registerVersionCommand(program: Command): void {\n const version = program\n .command(\"version\")\n .description(\"Display both CLI and server version information\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n const cliVersion = pkg.version;\n\n printInfo(`CLI version: ${cliVersion}`);\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/version\");\n printInfo(\"Server version:\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(version, [\n {\n description: \"Show CLI and server version\",\n command: \"geonic version\",\n },\n {\n description: \"Show version as JSON\",\n command: \"geonic version --format json\",\n },\n ]);\n}\n","import { execSync } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport type { Command, Option } from \"commander\";\nimport { printInfo, printSuccess } from \"../output.js\";\nimport { withErrorHandler, resolveOptions } from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction findOption(\n cmd: Command,\n program: Command,\n flag: string,\n): Option | undefined {\n return (\n cmd.options.find((o) => o.long === flag || o.short === flag) ||\n program.options.find((o) => o.long === flag || o.short === flag)\n );\n}\n\nfunction optionTakesValue(\n cmd: Command,\n program: Command,\n flag: string,\n): boolean {\n const opt = findOption(cmd, program, flag);\n if (!opt) return false;\n return !!(opt.required || opt.optional);\n}\n\nfunction findSubcommand(cmd: Command, name: string): Command | undefined {\n return cmd.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nexport function generateCompletions(\n program: Command,\n line: string,\n point: number,\n): string[] {\n const truncated = line.slice(0, point);\n const tokens = truncated.trim().split(/\\s+/).filter(Boolean);\n const startingNewWord = /\\s$/.test(truncated);\n\n // Determine partial input (what the user is currently typing)\n const partial =\n !startingNewWord && tokens.length > 1 ? tokens[tokens.length - 1] : \"\";\n\n // Tokens to walk the command tree (exclude program name and partial)\n const walkTokens = startingNewWord ? tokens.slice(1) : tokens.slice(1, -1);\n\n // Walk the command tree\n let currentCmd = program;\n let i = 0;\n\n while (i < walkTokens.length) {\n const token = walkTokens[i];\n\n if (token.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, token)) {\n i += 2; // skip option + its value\n } else {\n i += 1;\n }\n continue;\n }\n\n const sub = findSubcommand(currentCmd, token);\n if (sub) {\n currentCmd = sub;\n }\n i++;\n }\n\n // Special handling: `help` command mirrors the main command tree for completions\n if (currentCmd.name() === \"help\" && currentCmd.parent === program) {\n const helpIdx = walkTokens.indexOf(\"help\");\n const rawArgs = walkTokens.slice(helpIdx + 1);\n const helpArgs: string[] = [];\n for (let j = 0; j < rawArgs.length; j++) {\n const t = rawArgs[j];\n if (t.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, t)) {\n j++; // skip the option's value\n }\n continue;\n }\n helpArgs.push(t);\n }\n\n let target = program;\n for (const arg of helpArgs) {\n const sub = findSubcommand(target, arg);\n if (sub) target = sub;\n else break;\n }\n\n const subs = target.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n return subs.filter((s) => s.startsWith(partial));\n }\n\n // Determine predecessor token (immediately before the completion point)\n const predecessor = startingNewWord\n ? tokens[tokens.length - 1]\n : tokens.length >= 2\n ? tokens[tokens.length - 2]\n : undefined;\n\n // Case 1: Previous token is a value-taking option → complete option values\n if (\n predecessor &&\n predecessor.startsWith(\"-\") &&\n optionTakesValue(currentCmd, program, predecessor)\n ) {\n return getOptionValueCompletions(predecessor, partial);\n }\n\n // Case 2: Partial starts with '-' → complete options\n if (partial.startsWith(\"-\")) {\n return getOptionCompletions(currentCmd, program, partial);\n }\n\n // Case 3: Current command has non-hidden subcommands → complete them\n const subcommands = currentCmd.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n\n if (subcommands.length > 0) {\n return subcommands.filter((s) => s.startsWith(partial));\n }\n\n // Case 4: Command takes file arguments → signal <file>\n for (const arg of currentCmd.registeredArguments) {\n if (arg.description && arg.description.includes(\"@file\")) {\n return [\"<file>\"];\n }\n }\n\n return [];\n}\n\nfunction getOptionCompletions(\n cmd: Command,\n program: Command,\n partial: string,\n): string[] {\n const options = new Set<string>();\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n for (const opt of program.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n return [...options].filter((o) => o.startsWith(partial));\n}\n\nfunction getOptionValueCompletions(\n optionFlag: string,\n partial: string,\n): string[] {\n if (optionFlag === \"--format\" || optionFlag === \"-f\") {\n return [\"json\", \"table\", \"geojson\"].filter((v) =>\n v.startsWith(partial),\n );\n }\n return [];\n}\n\nconst ZSH_SCRIPT = `_geonic_completions() {\n local completions\n completions=(\\${(f)\"$(geonic cli completions --line=\"$BUFFER\" --point=\"$CURSOR\" 2>/dev/null)\"})\n if [[ \"\\${completions[1]}\" == \"<file>\" ]]; then\n _files\n return\n fi\n compadd -a completions\n}\ncompdef _geonic_completions geonic`;\n\nconst BASH_SCRIPT = `_geonic_completions() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local completions\n completions=$(geonic cli completions --line=\"\\${COMP_LINE}\" --point=\"\\${COMP_POINT}\" 2>/dev/null)\n if [[ \"$completions\" == \"<file>\" ]]; then\n COMPREPLY=()\n return\n fi\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n}\ncomplete -o default -F _geonic_completions geonic`;\n\nexport function registerCliCommand(program: Command): void {\n const cli = program\n .command(\"cli\")\n .summary(\"Manage CLI internals\")\n .description(\"Manage CLI internals such as shell completions.\");\n\n const completions = cli\n .command(\"completions\")\n .summary(\"Generate shell completions\")\n .description(\"Generate shell completions for geonic CLI.\")\n .option(\"--line <line>\", \"Current command line content\")\n .option(\"--point <point>\", \"Cursor position in the command line\")\n .action((opts: { line?: string; point?: string }) => {\n if (opts.line !== undefined && opts.point !== undefined) {\n const point = parseInt(opts.point, 10);\n const results = generateCompletions(program, opts.line, point);\n for (const r of results) {\n console.log(r);\n }\n }\n });\n\n const bash = completions\n .command(\"bash\")\n .description(\"Output bash completion script\")\n .action(() => {\n console.log(BASH_SCRIPT);\n });\n\n addExamples(bash, [\n {\n description: \"Print the bash completion script\",\n command: \"geonic cli completions bash\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions bash)\"',\n },\n {\n description: \"Persist in ~/.bashrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions bash)\"\\' >> ~/.bashrc',\n },\n ]);\n\n const zsh = completions\n .command(\"zsh\")\n .description(\"Output zsh completion script\")\n .action(() => {\n console.log(ZSH_SCRIPT);\n });\n\n addExamples(zsh, [\n {\n description: \"Print the zsh completion script\",\n command: \"geonic cli completions zsh\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions zsh)\"',\n },\n {\n description: \"Persist in ~/.zshrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions zsh)\"\\' >> ~/.zshrc',\n },\n ]);\n\n const version = cli\n .command(\"version\")\n .description(\"Display the currently installed CLI version\")\n .action(() => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n console.log(pkg.version);\n });\n\n addExamples(version, [\n {\n description: \"Show the installed version\",\n command: \"geonic cli version\",\n },\n {\n description: \"Use in scripts to check the installed version\",\n command: 'echo \"geonic $(geonic cli version)\"',\n },\n ]);\n\n const update = cli\n .command(\"update\")\n .description(\"Update the CLI to the latest version via npm (requires global install)\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const opts = resolveOptions(cmd);\n const updateCommand = \"npm update -g @geolonia/geonicdb-cli\";\n if (opts.dryRun) {\n printInfo(`[dry-run] ${updateCommand}`);\n return;\n }\n printInfo(\"Updating @geolonia/geonicdb-cli...\");\n execSync(updateCommand, { stdio: \"inherit\" });\n printSuccess(\"Update complete.\");\n }),\n );\n\n addExamples(update, [\n {\n description: \"Update CLI to the latest version\",\n command: \"geonic cli update\",\n },\n {\n description: \"Preview the update command without executing it\",\n command: \"geonic cli update --dry-run\",\n },\n ]);\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { getConfigDir, ensureConfigDir } from \"./config.js\";\n\nconst PACKAGE_NAME = \"@geolonia/geonicdb-cli\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n}\n\nconst CI_ENV_VARS = [\n \"CI\",\n \"CONTINUOUS_INTEGRATION\",\n \"BUILD_NUMBER\",\n \"GITHUB_ACTIONS\",\n \"GITLAB_CI\",\n \"CIRCLECI\",\n \"JENKINS_URL\",\n \"HUDSON_URL\",\n \"TRAVIS\",\n];\n\nfunction getCacheFile(): string {\n return join(getConfigDir(), \"update-check.json\");\n}\n\nfunction isCheckDisabled(): boolean {\n if (process.env.NO_UPDATE_NOTIFIER) return true;\n if (!process.stdout.isTTY) return true;\n for (const envVar of CI_ENV_VARS) {\n if (process.env[envVar]) return true;\n }\n return false;\n}\n\nfunction loadCache(): UpdateCache | null {\n try {\n const raw = readFileSync(getCacheFile(), \"utf-8\");\n return JSON.parse(raw) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction saveCache(cache: UpdateCache): void {\n try {\n ensureConfigDir();\n writeFileSync(getCacheFile(), JSON.stringify(cache), \"utf-8\");\n } catch {\n /* v8 ignore next -- defensive: write errors silently ignored */\n }\n}\n\nfunction shouldCheck(cache: UpdateCache | null): boolean {\n if (!cache) return true;\n return Date.now() - cache.lastCheck >= CHECK_INTERVAL_MS;\n}\n\nexport function compareSemver(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v.replace(/^v/, \"\").split(\".\").map(Number) as [number, number, number];\n const [cMajor, cMinor, cPatch] = parse(current);\n const [lMajor, lMinor, lPatch] = parse(latest);\n if (lMajor !== cMajor) return lMajor > cMajor;\n if (lMinor !== cMinor) return lMinor > cMinor;\n return lPatch > cPatch;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/* v8 ignore next 3 -- fallback for bundled builds where package.json is unavailable */\nfunction getCurrentVersion(): string {\n return process.env.npm_package_version ?? \"0.0.0\";\n}\n\nexport function formatUpdateBox(current: string, latest: string): string {\n const message = `Update available: ${current} → ${latest}`;\n const install = `Run ${chalk.cyan(`npm i -g ${PACKAGE_NAME}`)} to update`;\n const lines = [message, install];\n const maxLen = Math.max(\n ...lines.map((l) => stripAnsi(l).length),\n );\n const pad = (line: string) => {\n const visible = stripAnsi(line).length;\n return line + \" \".repeat(maxLen - visible);\n };\n const empty = \" \".repeat(maxLen);\n const top = `╭${\"─\".repeat(maxLen + 4)}╮`;\n const bottom = `╰${\"─\".repeat(maxLen + 4)}╯`;\n const boxLines = [\n top,\n `│ ${empty} │`,\n ...lines.map((l) => `│ ${pad(l)} │`),\n `│ ${empty} │`,\n bottom,\n ];\n return chalk.yellow(boxLines.join(\"\\n\"));\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport async function startUpdateCheck(): Promise<UpdateCheckResult | null> {\n if (isCheckDisabled()) return null;\n\n let currentVersion: string;\n try {\n const pkgPath = new URL(\"../package.json\", import.meta.url);\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n version: string;\n };\n currentVersion = pkg.version;\n /* v8 ignore start -- fallback for bundled builds */\n } catch {\n currentVersion = getCurrentVersion();\n }\n /* v8 ignore stop */\n\n const cache = loadCache();\n\n if (!shouldCheck(cache)) {\n if (cache?.latestVersion && compareSemver(currentVersion, cache.latestVersion)) {\n return { currentVersion, latestVersion: cache.latestVersion };\n }\n return null;\n }\n\n const latestVersion = await fetchLatestVersion();\n\n saveCache({\n lastCheck: Date.now(),\n latestVersion: latestVersion ?? cache?.latestVersion,\n });\n\n if (latestVersion && compareSemver(currentVersion, latestVersion)) {\n return { currentVersion, latestVersion };\n }\n\n return null;\n}\n\nexport function printUpdateNotification(result: UpdateCheckResult | null): void {\n if (!result) return;\n const box = formatUpdateBox(result.currentVersion, result.latestVersion);\n process.stderr.write(\"\\n\" + box + \"\\n\");\n}\n","import { createProgram } from \"./cli.js\";\nimport { startUpdateCheck, printUpdateNotification } from \"./update-notifier.js\";\n\nconst updateCheckPromise = startUpdateCheck();\nconst program = createProgram();\nawait program.parseAsync();\nconst updateResult = await updateCheckPromise;\nprintUpdateNotification(updateResult);\n"],"mappings":";;;AAAA,SAAS,iBAAAA,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;;;ACDxB,SAAS,cAAc,eAAe,WAAW,kBAAkB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AAGjB,SAAS,eAAuB;AACrC,SAAO,QAAQ,IAAI,qBAAqB,KAAK,QAAQ,GAAG,WAAW,QAAQ;AAC7E;AAEA,SAAS,gBAAwB;AAC/B,SAAO,KAAK,aAAa,GAAG,aAAa;AAC3C;AAEO,SAAS,kBAAwB;AACtC,QAAM,MAAM,aAAa;AACzB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,cAAc,MAA8C;AACnE,QAAM,UAAqB,CAAC;AAC5B,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,OAAO,WAAW;AAC3B,QAAI,OAAO,MAAM;AACf,MAAC,QAAoC,GAAG,IAAI,KAAK,GAAG;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,UAAU,EAAE,SAAS,QAAQ;AAAA,EAC/B;AACF;AAEA,SAAS,gBAAgB,OAAwC;AAE/D,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,IAAI;AACV,SACE,EAAE,YAAY,KACd,OAAO,EAAE,mBAAmB,YAC5B,OAAO,EAAE,aAAa,YACtB,EAAE,aAAa;AAEnB;AAEA,SAAS,gBAA+B;AACtC,SAAO,EAAE,SAAS,GAAG,gBAAgB,WAAW,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE;AAC5E;AAEO,SAAS,iBAAgC;AAC9C,MAAI;AACF,UAAM,MAAM,aAAa,cAAc,GAAG,OAAO;AACjD,UAAM,OAAO,KAAK,MAAM,GAAG;AAE3B,QAAI,EAAE,aAAa,OAAO;AACxB,YAAM,WAAW,cAAc,IAAI;AACnC,qBAAe,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,aAAO,cAAc;AAAA,IACvB;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,cAAc;AAAA,EACvB;AACF;AAEO,SAAS,eAAe,YAAiC;AAC9D,kBAAgB;AAChB,gBAAc,cAAc,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,IAAI,MAAM,OAAO;AACpF;AAEO,SAAS,WAAW,aAAiC;AAC1D,QAAM,aAAa,eAAe;AAClC,QAAM,OAAO,eAAe,WAAW;AACvC,SAAO,WAAW,SAAS,IAAI,KAAK,CAAC;AACvC;AAEO,SAAS,WAAW,QAAmB,aAA4B;AACxE,QAAM,aAAa,eAAe;AAClC,QAAM,OAAO,eAAe,WAAW;AACvC,aAAW,SAAS,IAAI,IAAI;AAC5B,iBAAe,UAAU;AAC3B;AAEO,SAAS,eAAe,KAAa,aAA+B;AACzE,QAAM,SAAS,WAAW,WAAW;AACrC,SAAO,OAAO,GAAsB;AACtC;AAEO,SAAS,YAAY,KAAqB;AAC/C,QAAM,IAAI,KAAK;AACf,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AACA,MAAI,CAAC,gBAAgB,KAAK,GAAG,GAAG;AAC9B,UAAM,IAAI,MAAM,iBAAiB,GAAG,6CAA6C;AAAA,EACnF;AACA,MAAI;AACF,QAAI,IAAI,GAAG;AAAA,EACb,QAAQ;AACN,UAAM,IAAI,MAAM,iBAAiB,GAAG,IAAI;AAAA,EAC1C;AACA,SAAO,IAAI,QAAQ,QAAQ,EAAE,IAAI;AACnC;AAEO,SAAS,eAAe,KAAa,OAAe,aAA4B;AACrF,QAAM,SAAS,WAAW,WAAW;AACrC,MAAI,QAAQ,OAAO;AACjB,YAAQ,YAAY,KAAK;AAAA,EAC3B;AACA,EAAC,OAAmC,GAAG,IAAI;AAC3C,aAAW,QAAQ,WAAW;AAChC;AAEO,SAAS,kBAAkB,KAAa,aAA4B;AACzE,QAAM,SAAS,WAAW,WAAW;AACrC,SAAQ,OAAmC,GAAG;AAC9C,aAAW,QAAQ,WAAW;AAChC;AAEO,SAAS,gBAAwB;AACtC,SAAO,cAAc;AACvB;AAEO,SAAS,eAAoD;AAClE,QAAM,aAAa,eAAe;AAClC,SAAO,OAAO,KAAK,WAAW,QAAQ,EAAE,IAAI,CAAC,UAAU;AAAA,IACrD;AAAA,IACA,QAAQ,SAAS,WAAW;AAAA,EAC9B,EAAE;AACJ;AAEO,SAAS,oBAA4B;AAC1C,SAAO,eAAe,EAAE;AAC1B;AAEO,SAAS,kBAAkB,MAAoB;AACpD,QAAM,aAAa,eAAe;AAClC,MAAI,EAAE,QAAQ,WAAW,WAAW;AAClC,UAAM,IAAI,MAAM,YAAY,IAAI,mBAAmB;AAAA,EACrD;AACA,aAAW,iBAAiB;AAC5B,iBAAe,UAAU;AAC3B;AAEO,SAAS,cAAc,MAAoB;AAChD,QAAM,aAAa,eAAe;AAClC,MAAI,QAAQ,WAAW,UAAU;AAC/B,UAAM,IAAI,MAAM,YAAY,IAAI,mBAAmB;AAAA,EACrD;AACA,aAAW,SAAS,IAAI,IAAI,CAAC;AAC7B,iBAAe,UAAU;AAC3B;AAEO,SAAS,cAAc,MAAoB;AAChD,MAAI,SAAS,WAAW;AACtB,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,QAAM,aAAa,eAAe;AAClC,MAAI,EAAE,QAAQ,WAAW,WAAW;AAClC,UAAM,IAAI,MAAM,YAAY,IAAI,mBAAmB;AAAA,EACrD;AACA,SAAO,WAAW,SAAS,IAAI;AAC/B,MAAI,WAAW,mBAAmB,MAAM;AACtC,eAAW,iBAAiB;AAAA,EAC9B;AACA,iBAAe,UAAU;AAC3B;;;ACrLA,OAAO,WAAW;AAGX,SAAS,aAAa,MAAe,QAA8B;AACxE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,YAAY,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,KAAK,UAAU,UAAU,IAAI,GAAG,MAAM,CAAC;AAAA,IAChD;AACE,aAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACvC;AACF;AAEO,SAAS,YAAY,MAAe,QAA4B;AACrE,UAAQ,IAAI,aAAa,MAAM,MAAM,CAAC;AACxC;AAEO,SAAS,aAAa,SAAuB;AAClD,UAAQ,IAAI,MAAM,MAAM,OAAO,CAAC;AAClC;AAEO,SAAS,WAAW,SAAuB;AAChD,UAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC;AAC9C;AAEO,SAAS,UAAU,SAAuB;AAC/C,UAAQ,IAAI,MAAM,KAAK,OAAO,CAAC;AACjC;AAEO,SAAS,aAAa,SAAuB;AAClD,UAAQ,MAAM,MAAM,OAAO,OAAO,CAAC;AACrC;AAKO,SAAS,eAAe,KAAmB;AAChD,QAAM,SAAS,SAAI,OAAO,IAAI,SAAS,CAAC;AACxC,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,MAAM,MAAM,WAAM,MAAM,QAAG,CAAC;AAC1C,UAAQ,MAAM,MAAM,MAAM,aAAQ,MAAM,KAAK,GAAG,CAAC,UAAK,CAAC;AACvD,UAAQ,MAAM,MAAM,MAAM,WAAM,MAAM,QAAG,CAAC;AAC1C,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,MAAM,OAAO,4LAAsC,CAAC;AACpE;AAEO,SAAS,WAAW,OAAqB;AAC9C,UAAQ,IAAI,MAAM,IAAI,UAAU,KAAK,EAAE,CAAC;AAC1C;AAEA,SAAS,YAAY,MAAuB;AAC1C,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,aAAO,kBAAkB,IAA+B;AAAA,IAC1D;AACA,WAAO,OAAO,IAAI;AAAA,EACpB;AAEA,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,QAAQ;AACd,QAAM,OAAO,YAAY,KAAK;AAE9B,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,OAAO,MAAM;AACtB,WAAO,IAAI,KAAK,IAAI,MAAM;AAAA,EAC5B;AACA,aAAW,QAAQ,OAAO;AACxB,eAAW,OAAO,MAAM;AACtB,YAAM,MAAM,UAAU,KAAK,GAAG,CAAC;AAC/B,aAAO,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,GAAG,GAAI,IAAI,MAAM,CAAC;AAAA,IACxD;AAAA,EACF;AAEA,QAAMC,UAAS,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,IAAI,CAAC,CAAE,CAAC,CAAC,EAAE,KAAK,IAAI;AAC9E,QAAM,YAAY,KAAK,IAAI,CAAC,MAAM,SAAI,OAAO,OAAO,IAAI,CAAC,CAAE,CAAC,EAAE,KAAK,cAAI;AACvE,QAAM,OAAO,MAAM;AAAA,IAAI,CAAC,SACtB,KAAK,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC,CAAE,CAAC,EAAE,KAAK,IAAI;AAAA,EACtE;AAEA,SAAO,CAACA,SAAQ,WAAW,GAAG,IAAI,EAAE,KAAK,IAAI;AAC/C;AAEA,SAAS,kBAAkB,KAAsC;AAC/D,QAAM,UAAU,OAAO,QAAQ,GAAG;AAClC,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3D,SAAO,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,KAAK,EAAE,OAAO,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI;AAChG;AAEA,SAAS,YAAY,OAA4C;AAC/D,QAAM,WAAW,CAAC,MAAM,MAAM;AAC9B,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,QAAQ,OAAO;AACxB,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,aAAO,IAAI,GAAG;AAAA,IAChB;AAAA,EACF;AACA,QAAM,SAAmB,CAAC;AAC1B,aAAW,KAAK,UAAU;AACxB,QAAI,OAAO,IAAI,CAAC,GAAG;AACjB,aAAO,KAAK,CAAC;AACb,aAAO,OAAO,CAAC;AAAA,IACjB;AAAA,EACF;AACA,SAAO,KAAK,GAAG,MAAM,KAAK,MAAM,EAAE,KAAK,CAAC;AACxC,SAAO;AACT;AAEA,SAAS,cAAc,KAAsC;AAC3D,QAAM,UAAU,OAAO,IAAI,IAAI;AAC/B,QAAM,SAAS,IAAI;AACnB,MAAI,YAAY,WAAW,MAAM,QAAQ,MAAM,KAAK,OAAO,UAAU,GAAG;AACtE,WAAO,SAAS,OAAO,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,OAAO,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC/E;AACA,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,UAAM,QAAQ,YAAY,YACrB,MAAM,QAAQ,OAAO,CAAC,CAAC,IAAK,OAAO,CAAC,EAAgB,SAAS,IAC9D,OAAO;AACX,WAAO,GAAG,OAAO,IAAI,KAAK;AAAA,EAC5B;AACA,SAAO,GAAG,OAAO;AACnB;AAEA,SAAS,UAAU,GAAqB;AACtC,MAAI,OAAO,MAAM,YAAY,MAAM,KAAM,QAAO;AAChD,QAAM,IAAI;AACV,SAAO,OAAO,EAAE,SAAS,YAAY,iBAAiB;AACxD;AAEA,SAAS,UAAU,KAAsB;AACvC,MAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,MAAI,OAAO,QAAQ,SAAU,QAAO,OAAO,GAAG;AAC9C,QAAM,MAAM;AACZ,MAAI,UAAU,GAAG,EAAG,QAAO,cAAc,GAAG;AAC5C,MAAI,WAAW,KAAK;AAClB,UAAM,IAAI,IAAI;AACd,QAAI,UAAU,CAAC,EAAG,QAAO,cAAc,CAA4B;AACnE,WAAO,OAAO,CAAC;AAAA,EACjB;AACA,SAAO,KAAK,UAAU,GAAG;AAC3B;AAEA,SAAS,UAAU,MAAwB;AACzC,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,KAAK,IAAI,eAAe;AAAA,IACpC;AAAA,EACF;AACA,SAAO,gBAAgB,IAAI;AAC7B;AAEA,SAAS,gBAAgB,QAA0B;AACjD,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAO,EAAE,MAAM,WAAW,UAAU,MAAM,YAAY,OAAO;AAAA,EAC/D;AAEA,QAAM,MAAM;AACZ,MAAI,WAAW;AAEf,MAAI,IAAI,UAAU;AAChB,UAAM,MAAM,IAAI;AAChB,eAAW,IAAI,SAAS;AAAA,EAC1B;AAEA,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,QAAQ,WAAY;AACxB,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,WAAY,OAAkB;AAC/E,iBAAW,GAAG,IAAK,MAAkC;AAAA,IACvD,OAAO;AACL,iBAAW,GAAG,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,WAAW,UAAU,WAAW;AACjD;;;ACrLA,OAAOC,YAAW;AAQlB,IAAM,cAAc,oBAAI,QAA4B;AACpD,IAAM,WAAW,oBAAI,QAA2B;AAEzC,SAAS,YAAY,KAAc,UAA2B;AACnE,cAAY,IAAI,KAAK,QAAQ;AAC/B;AAEO,SAAS,SAAS,KAAc,OAAuB;AAC5D,WAAS,IAAI,KAAK,KAAK;AACzB;AAEA,SAAS,OAAO,OAAuB;AACrC,SAAOA,OAAM,OAAO,KAAK,KAAK;AAChC;AAEA,SAAS,YAAY,QAAiB,MAAmC;AACvE,SAAO,OAAO,SAAS;AAAA,IACrB,CAAC,MAAM,EAAE,KAAK,MAAM,QAAQ,EAAE,QAAQ,EAAE,SAAS,IAAI;AAAA,EACvD;AACF;AAEA,SAAS,eAAe,KAAsB;AAC5C,QAAM,QAAkB,CAAC;AACzB,MAAI,UAA0B;AAC9B,SAAO,SAAS;AACd,UAAM,QAAQ,QAAQ,KAAK,CAAC;AAC5B,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,eAAe,KAAuB;AAC7C,MAAI,OAAO;AACX,SAAO,KAAK,QAAQ;AAClB,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAqB;AAEjD,QAAM,OAAO,IAAI,QAAQ,IAAI,SAAS;AACtC,MAAI,IAAI,UAAU;AAChB,UAAM,QAAQ,IAAI,MAAM,MAAM,WAAW;AACzC,UAAM,YAAY,QAAQ,MAAM,CAAC,IAAI;AACrC,WAAO,IAAI,IAAI,KAAK,SAAS;AAAA,EAC/B,WAAW,IAAI,UAAU;AACvB,UAAM,QAAQ,IAAI,MAAM,MAAM,cAAc;AAC5C,UAAM,YAAY,QAAQ,MAAM,CAAC,IAAI;AACrC,WAAO,IAAI,IAAI,MAAM,SAAS;AAAA,EAChC;AACA,SAAO,IAAI,IAAI;AACjB;AAEA,SAAS,eAAe,MAAc,KAAsB;AAC1D,QAAM,QAAQ,CAAC,IAAI;AAEnB,aAAW,OAAO,IAAI,qBAAqB;AACzC,QAAI,IAAI,UAAU;AAChB,YAAM,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG;AAAA,IAC9B,OAAO;AACL,YAAM,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,aAAW,OAAO,IAAI,SAAS;AAC7B,QAAI,IAAI,OAAQ;AAChB,UAAM,KAAK,qBAAqB,GAAG,CAAC;AAAA,EACtC;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,iBAAiB,SAAsC;AAC9D,QAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;AAC7D,SAAO,QAAQ,IAAI,CAAC,QAAQ;AAC1B,UAAM,QAAQ,IAAI,MAAM,OAAO,SAAS,CAAC;AAEzC,WAAO,KAAKA,OAAM,MAAM,KAAK,CAAC,GAAG,IAAI,eAAe,EAAE;AAAA,EACxD,CAAC;AACH;AAEA,SAAS,uBAAuBC,UAA0B;AACxD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,OAAO,mBAAmB,CAAC;AACtC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,GAAG,iBAAiBA,SAAQ,OAAO,CAAC;AAC/C,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,mBAAmBA,UAA0B;AAC3D,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,OAAO,MAAM,CAAC;AACzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAKA,SAAQ,KAAK,CAAC,EAAE;AAChC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO,aAAa,CAAC;AAChC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAKA,SAAQ,YAAY,CAAC,EAAE;AACvC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO,oBAAoB,CAAC;AACvC,QAAM,KAAK,EAAE;AAEb,QAAM,WAAWA,SAAQ,SACtB,OAAO,CAAC,MAAM,CAAE,EAAsC,OAAO,EAC7D,MAAM,EACN,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AAElD,QAAM,SAAS,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AAE/D,aAAW,OAAO,UAAU;AAC1B,UAAM,OAAO,IAAI,KAAK,EAAE,OAAO,SAAS,CAAC;AACzC,UAAM,KAAK,KAAKD,OAAM,MAAM,IAAI,CAAC,GAAG,IAAI,QAAQ,KAAK,IAAI,YAAY,CAAC,EAAE;AAAA,EAC1E;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uBAAuBC,QAAO,CAAC;AAE1C,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,qBACdA,UACA,KACA,MACQ;AACR,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,OAAO,MAAM,CAAC;AACzB,QAAM,KAAK,EAAE;AACb,QAAM,UAAU,IAAI,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AACxD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,KAAK,IAAI,IAAID,OAAM,IAAI,WAAW,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE;AAAA,EACvE,OAAO;AACL,UAAM,KAAK,KAAK,IAAI,EAAE;AAAA,EACxB;AAGA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO,aAAa,CAAC;AAChC,QAAM,KAAK,EAAE;AACb,aAAW,YAAY,IAAI,YAAY,EAAE,MAAM,IAAI,GAAG;AACpD,UAAM,KAAK,KAAK,QAAQ,EAAE;AAAA,EAC5B;AAEA,QAAM,cAAc,IAAI,SAAS;AAAA,IAC/B,CAAC,MAAM,CAAE,EAAsC;AAAA,EACjD;AAEA,MAAI,YAAY,SAAS,GAAG;AAE1B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,UAAU,CAAC;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,IAAI,YAAY;AAChC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,aAAa,CAAC;AAChC,UAAM,KAAK,EAAE;AAEb,UAAM,SAAS,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AAClE,eAAW,OAAO,aAAa;AAC7B,YAAM,OAAO,IAAI,KAAK,EAAE,OAAO,SAAS,CAAC;AACzC,YAAM,KAAK,KAAKA,OAAM,MAAM,IAAI,CAAC,GAAG,IAAI,QAAQ,KAAK,IAAI,YAAY,CAAC,EAAE;AAAA,IAC1E;AAAA,EACF,OAAO;AAEL,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,UAAU,CAAC;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,eAAe,MAAM,GAAG,CAAC,EAAE;AAE3C,UAAM,UAAU,IAAI,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AACnD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,OAAO,SAAS,CAAC;AAC5B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,GAAG,iBAAiB,OAAO,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,QAAM,WAAW,YAAY,IAAI,GAAG;AACpC,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,UAAU,CAAC;AAC7B,UAAM,KAAK,EAAE;AACb,eAAW,MAAM,UAAU;AACzB,YAAM,KAAK,KAAK,GAAG,WAAW,GAAG;AACjC,YAAM,KAAK,SAAS,GAAG,OAAO,EAAE;AAChC,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAGA,QAAM,QAAQ,SAAS,IAAI,GAAG;AAC9B,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,OAAO,CAAC;AAC1B,UAAM,KAAK,EAAE;AACb,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uBAAuBC,QAAO,CAAC;AAE1C,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,SAASA,UAAkB,MAAsB;AACxD,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,IAAI,mBAAmBA,QAAO,CAAC;AACvC;AAAA,EACF;AAEA,MAAI,UAAUA;AACd,QAAM,WAAsB,CAAC;AAE7B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,YAAY,SAAS,KAAK,CAAC,CAAC;AAC1C,QAAI,CAAC,OAAO;AACV,YAAM,YAAY,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG;AAC/C,cAAQ;AAAA,QACND,OAAM,IAAI,WAAW,SAAS,4BAA4B;AAAA,MAC5D;AACA,cAAQ,MAAM;AAAA,0CAA6C;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,aAAS,KAAK,KAAK;AACnB,cAAU;AAAA,EACZ;AAEA,QAAM,SAAS,SAAS,SAAS,SAAS,CAAC;AAC3C,QAAM,OAAO,CAACC,SAAQ,KAAK,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAExE,UAAQ,IAAI,qBAAqBA,UAAS,QAAQ,IAAI,CAAC;AACzD;AAEO,SAAS,oBAAoBA,UAAwB;AAE1D,EAAAA,SAAQ,eAAe,KAAK;AAG5B,EAAAA,SAAQ,cAAc;AAAA,IACpB,YAAY,CAAC,KAAc,YAA0B;AACnD,YAAM,OAAO,eAAe,GAAG;AAC/B,UAAI,QAAQ,MAAM;AAChB,eAAO,mBAAmB,IAAI;AAAA,MAChC;AACA,YAAM,OAAO,eAAe,GAAG;AAC/B,aAAO,qBAAqB,MAAM,KAAK,IAAI;AAAA,IAC7C;AAAA,EACF,CAAC;AAGD,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,SAAS,WAAW,EACpB,mBAAmB,EACnB,OAAO,CAAC,SAAmB;AAC1B,aAASA,UAAS,IAAI;AAAA,EACxB,CAAC;AAGH,EAAAA,SAAQ,SAAS,cAAc,EAAE,OAAO,CAAC,aAAuB;AAC9D,QAAI,SAAS,SAAS,GAAG;AACvB,cAAQ;AAAA,QACN,YAAY,SAAS,CAAC,CAAC;AAAA,MACzB;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,aAASA,UAAS,CAAC,CAAC;AAAA,EACtB,CAAC;AACH;;;ACrRA,IAAM,wBAAwB,oBAAI,IAAI,CAAC,SAAS,gBAAgB,QAAQ,CAAC;AAElE,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,SAASA,SACZ,QAAQ,QAAQ,EAChB,YAAY,0BAA0B;AAEzC,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,SAAS,WAAW,qBAAqB,EACzC,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,mBAAe,KAAK,OAAO,OAAO;AAClC,UAAM,UAAU,sBAAsB,IAAI,GAAG,IAAI,QAAQ;AACzD,iBAAa,OAAO,GAAG,MAAM,OAAO,EAAE;AAAA,EACxC,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,oBAAoB,EAChC,SAAS,SAAS,mBAAmB,EACrC,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,UAAM,QAAQ,eAAe,KAAK,OAAO;AACzC,QAAI,UAAU,QAAW;AACvB,gBAAU,QAAQ,GAAG,eAAe;AAAA,IACtC,OAAO;AACL,kBAAY,OAAO,MAAM;AAAA,IAC3B;AAAA,EACF,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,OAAO,OACV,QAAQ,MAAM,EACd,YAAY,8DAA8D,EAC1E,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,UAAM,MAAM,WAAW,OAAO;AAC9B,QAAI,OAAO,KAAK,GAAG,EAAE,WAAW,GAAG;AACjC,gBAAU,sCAAsC,cAAc,CAAC,EAAE;AAAA,IACnE,OAAO;AACL,kBAAY,KAAK,MAAM;AAAA,IACzB;AAAA,EACF,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,MAAM,OACT,QAAQ,QAAQ,EAChB,YAAY,4DAA4D,EACxE,SAAS,SAAS,mBAAmB,EACrC,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,sBAAkB,KAAK,OAAO;AAC9B,iBAAa,gBAAgB,GAAG,IAAI;AAAA,EACtC,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC9IA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;;;ACMxB,eAAsB,uBAAuB,SAKb;AAC9B,QAAM,MAAM,IAAI,IAAI,gBAAgB,QAAQ,OAAO,EAAE,SAAS;AAC9D,QAAM,cAAc,OAAO,KAAK,GAAG,QAAQ,QAAQ,IAAI,QAAQ,YAAY,EAAE,EAAE,SAAS,QAAQ;AAEhG,QAAM,OAA+B,EAAE,YAAY,qBAAqB;AACxE,MAAI,QAAQ,OAAO;AACjB,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,SAAS,WAAW;AAAA,IACrC;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,gBAAW,IAAI,qBAAqB,IAAI,SAAS;AAAA,IACnD,QAAQ;AACN,gBAAU,QAAQ,QAAQ,SAAS,MAAM;AAAA,IAC3C;AACA,UAAM,IAAI,MAAM,+BAA+B,OAAO,EAAE;AAAA,EAC1D;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;;;ACxCO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,cAAc;AACZ,UAAM,SAAS;AACf,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,YAAN,MAAM,WAAU;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAwB;AAClC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ,QAAQ;AACrB,SAAK,eAAe,QAAQ;AAC5B,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,QAAQ;AACxB,SAAK,eAAe,QAAQ;AAC5B,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,SAAS,QAAQ,UAAU;AAAA,EAClC;AAAA,EAEQ,aAAa,OAAwD;AAC3E,UAAM,UAAkC,CAAC;AAEzC,YAAQ,cAAc,IAAI;AAC1B,YAAQ,QAAQ,IAAI;AACpB,QAAI,KAAK,QAAS,SAAQ,eAAe,IAAI,KAAK;AAElD,QAAI,KAAK,OAAO;AACd,cAAQ,eAAe,IAAI,UAAU,KAAK,KAAK;AAAA,IACjD,WAAW,KAAK,QAAQ;AACtB,cAAQ,WAAW,IAAI,KAAK;AAAA,IAC9B;AAEA,QAAI,OAAO;AACT,aAAO,OAAO,SAAS,KAAK;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAc,QAAyC;AACtE,UAAM,MAAM,IAAI,IAAI,MAAM,KAAK,OAAO;AACtC,QAAI,QAAQ;AACV,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,YAAI,UAAU,UAAa,UAAU,IAAI;AACvC,cAAI,aAAa,IAAI,KAAK,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAEQ,cAAsB;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,OAAwB,oBAAoB,oBAAI,IAAI,CAAC,iBAAiB,WAAW,CAAC;AAAA,EAClF,OAAwB,sBAAsB,oBAAI,IAAI;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EAEO,WACN,QACA,KACA,SACA,MACM;AACN,QAAI,CAAC,KAAK,QAAS;AACnB,YAAQ,OAAO,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,CAAI;AAC3C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC5C,UAAI,WAAU,kBAAkB,IAAI,EAAE,YAAY,CAAC,GAAG;AACpD,gBAAQ,OAAO,MAAM,KAAK,CAAC;AAAA,CAAS;AAAA,MACtC,OAAO;AACL,gBAAQ,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC;AAAA,CAAI;AAAA,MACvC;AAAA,IACF;AACA,QAAI,MAAM;AACR,cAAQ,OAAO,MAAM,WAAW,WAAU,gBAAgB,IAAI,CAAC;AAAA,CAAI;AAAA,IACrE;AACA,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAe,gBAAgB,KAAqB;AAClD,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,iBAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,YAAI,WAAU,oBAAoB,IAAI,GAAG,GAAG;AAC1C,cAAI,GAAG,IAAI;AAAA,QACb;AAAA,MACF;AACA,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,YAAY,UAA0B;AAC5C,QAAI,CAAC,KAAK,QAAS;AACnB,YAAQ,OAAO,MAAM,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,CAAI;AACpE,aAAS,QAAQ,QAAQ,CAAC,GAAG,MAAM;AACjC,cAAQ,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC;AAAA,CAAI;AAAA,IACvC,CAAC;AACD,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAe,WAAW,OAAuB;AAC/C,WAAO,IAAI,MAAM,MAAM,GAAG,EAAE,KAAK,OAAS,CAAC;AAAA,EAC7C;AAAA,EAEA,OAAO,iBACL,QACA,KACA,SACA,MACQ;AACR,UAAM,QAAkB,CAAC,MAAM;AAC/B,QAAI,WAAW,OAAO;AACpB,YAAM,KAAK,MAAM,MAAM,EAAE;AAAA,IAC3B;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAM,KAAK,MAAM,WAAU,WAAW,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,EAAE;AAAA,IAC7D;AACA,QAAI,MAAM;AACR,YAAM,KAAK,MAAM,WAAU,WAAW,IAAI,CAAC,EAAE;AAAA,IAC/C;AACA,UAAM,KAAK,WAAU,WAAW,GAAG,CAAC;AACpC,WAAO,MAAM,KAAK,SAAS;AAAA,EAC7B;AAAA,EAEQ,aACN,QACA,KACA,SACA,MACM;AACN,QAAI,CAAC,KAAK,OAAQ;AAClB,YAAQ,IAAI,WAAU,iBAAiB,QAAQ,KAAK,SAAS,IAAI,CAAC;AAClE,UAAM,IAAI,aAAa;AAAA,EACzB;AAAA,EAEQ,aAAsB;AAC5B,YAAQ,CAAC,CAAC,KAAK,gBAAiB,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,KAAK,iBAAkB,CAAC,KAAK;AAAA,EACpF;AAAA;AAAA,EAGA,OAAe,aAAa,KAA8B;AACxD,QAAI,IAAI,WAAW,IAAK,QAAO;AAE/B,QAAI,IAAI,WAAW,KAAK;AACtB,YAAM,OAAO,IAAI,WAAW,IAAI,YAAY;AAC5C,aAAO,IAAI,SAAS,4BAA4B,KAAK,IAAI,SAAS,eAAe;AAAA,IACnF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,sBAAwC;AACpD,QAAI,KAAK,eAAgB,QAAO,KAAK;AAErC,SAAK,iBAAiB,KAAK,UAAU;AACrC,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,YAA8B;AAE1C,QAAI,KAAK,iBAAiB;AACxB,YAAM,SAAS,KAAK,gBAAgB;AACpC,UAAI,OAAO,SAAS,OAAO,UAAU,KAAK,OAAO;AAE/C,aAAK,QAAQ,OAAO;AACpB,YAAI,OAAO,aAAc,MAAK,eAAe,OAAO;AACpD,eAAO;AAAA,MACT;AACA,UAAI,OAAO,cAAc;AACvB,aAAK,eAAe,OAAO;AAAA,MAC7B;AAAA,IACF;AAGA,QAAI,KAAK,cAAc;AACrB,UAAI;AACF,cAAM,MAAM,KAAK,SAAS,eAAe;AACzC,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,cAAc,KAAK,aAAa,CAAC;AAAA,QAC1D,CAAC;AAED,YAAI,SAAS,IAAI;AACf,gBAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,gBAAM,WAAY,KAAK,eAAe,KAAK;AAC3C,gBAAM,kBAAkB,KAAK;AAE7B,cAAI,UAAU;AACZ,iBAAK,QAAQ;AACb,gBAAI,gBAAiB,MAAK,eAAe;AACzC,iBAAK,iBAAiB,UAAU,eAAe;AAC/C,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,KAAK,cAAc;AACtC,UAAI;AACF,cAAM,SAAS,MAAM,uBAAuB;AAAA,UAC1C,SAAS,KAAK;AAAA,UACd,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,QACrB,CAAC;AACD,aAAK,QAAQ,OAAO;AACpB,aAAK,iBAAiB,OAAO,YAAY;AACzC,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eACZ,QACA,MACA,SAK4B;AAC5B,UAAM,MAAM,KAAK,SAAS,GAAG,KAAK,YAAY,CAAC,GAAG,IAAI,IAAI,SAAS,MAAM;AACzE,UAAM,UAAU,KAAK,aAAa,SAAS,OAAO;AAClD,UAAM,OAAO,SAAS,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAE5D,SAAK,WAAW,QAAQ,KAAK,SAAS,IAAI;AAC1C,SAAK,aAAa,QAAQ,KAAK,SAAS,IAAI;AAC5C,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,SAAS,KAAK,CAAC;AAC3D,SAAK,YAAY,QAAQ;AAEzB,UAAM,cAAc,SAAS,QAAQ,IAAI,sBAAsB;AAC/D,UAAM,QAAQ,cAAc,SAAS,aAAa,EAAE,IAAI;AAExD,QAAI;AAEJ,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,SAAS,YAAY,SAAS,MAAM,KAAK,YAAY,SAAS,SAAS,IAAI;AAC7E,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM;AACZ,YAAM,UACJ,KAAK,eAAe,KAAK,UAAU,KAAK,SAAS,KAAK,SAAS,QAAQ,SAAS,MAAM;AACxF,YAAM,IAAI,eAAe,SAAS,SAAS,QAAQ,GAAG;AAAA,IACxD;AAEA,WAAO,EAAE,QAAQ,SAAS,QAAQ,SAAS,SAAS,SAAS,MAAM,MAAM;AAAA,EAC3E;AAAA,EAEA,MAAc,kBACZ,QACA,MACA,SAM4B;AAC5B,UAAM,MAAM,KAAK,SAAS,MAAM,SAAS,MAAM;AAC/C,UAAM,UAAU,KAAK,aAAa,SAAS,OAAO;AAClD,QAAI,SAAS,kBAAkB;AAC7B,aAAO,QAAQ,eAAe;AAAA,IAChC;AACA,UAAM,OAAO,SAAS,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAE5D,SAAK,WAAW,QAAQ,KAAK,SAAS,IAAI;AAC1C,SAAK,aAAa,QAAQ,KAAK,SAAS,IAAI;AAC5C,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,SAAS,KAAK,CAAC;AAC3D,SAAK,YAAY,QAAQ;AAEzB,QAAI;AAEJ,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,SAAS,YAAY,SAAS,MAAM,KAAK,YAAY,SAAS,SAAS,IAAI;AAC7E,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM;AACZ,YAAM,UACJ,KAAK,eAAe,KAAK,UAAU,KAAK,SAAS,KAAK,SAAS,QAAQ,SAAS,MAAM;AACxF,YAAM,IAAI,eAAe,SAAS,SAAS,QAAQ,GAAG;AAAA,IACxD;AAEA,WAAO,EAAE,QAAQ,SAAS,QAAQ,SAAS,SAAS,SAAS,KAAK;AAAA,EACpE;AAAA,EAEA,MAAM,QACJ,QACA,MACA,SAK4B;AAC5B,QAAI;AACF,aAAO,MAAM,KAAK,eAAkB,QAAQ,MAAM,OAAO;AAAA,IAC3D,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB,WAAU,aAAa,GAAG,KAAK,KAAK,WAAW,GAAG;AACrF,cAAM,YAAY,MAAM,KAAK,oBAAoB;AACjD,YAAI,WAAW;AACb,iBAAO,MAAM,KAAK,eAAkB,QAAQ,MAAM,OAAO;AAAA,QAC3D;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,MACA,QACA,SAC4B;AAC5B,WAAO,KAAK,QAAW,OAAO,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,KACJ,MACA,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,QAAQ,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,MACJ,MACA,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,SAAS,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,IACJ,MACA,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,OAAO,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,OACJ,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,UAAU,MAAM,EAAE,OAAO,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,WACJ,QACA,MACA,SAM4B;AAC5B,QAAI;AACF,aAAO,MAAM,KAAK,kBAAqB,QAAQ,MAAM,OAAO;AAAA,IAC9D,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB,WAAU,aAAa,GAAG,KAAK,KAAK,WAAW,GAAG;AACrF,cAAM,YAAY,MAAM,KAAK,oBAAoB;AACjD,YAAI,WAAW;AACb,iBAAO,MAAM,KAAK,kBAAqB,QAAQ,MAAM,OAAO;AAAA,QAC9D;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACgB,QACA,WAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;ACpaO,SAAS,eAAe,KAA6B;AAC1D,QAAM,OAAO,IAAI,gBAAgB;AACjC,QAAM,SAAS,WAAW,KAAK,OAAO;AACtC,SAAO;AAAA,IACL,KAAK,KAAK,OAAO,OAAO;AAAA,IACxB,SAAS,KAAK,WAAW,OAAO;AAAA,IAChC,OAAO,KAAK,SAAS,OAAO;AAAA,IAC5B,QAAQ,KAAK,UAAU,OAAO,UAAU;AAAA,IACxC,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK,UAAU,QAAQ,IAAI,eAAe,OAAO;AAAA,IACzD,QAAQ,KAAK;AAAA,EACf;AACF;AAKO,SAAS,aAAa,KAAyB;AACpD,QAAM,OAAO,eAAe,GAAG;AAC/B,MAAI,CAAC,KAAK,KAAK;AACb,eAAW,qEAAqE;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,OAAK,MAAM,YAAY,KAAK,GAAG;AAC/B,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,gBAAgB,CAAC,CAAC,QAAQ;AAChC,QAAM,SAAS,WAAW,KAAK,OAAO;AACtC,SAAO,IAAI,UAAU;AAAA,IACnB,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,cAAc,gBAAgB,SAAY,OAAO;AAAA,IACjD,UAAU,gBAAgB,SAAY,OAAO;AAAA,IAC7C,cAAc,gBAAgB,SAAY,OAAO;AAAA,IACjD,QAAQ,KAAK;AAAA,IACb,gBAAgB,gBACZ,SACA,CAAC,OAAO,iBAAiB;AACvB,YAAM,MAAM,WAAW,KAAK,OAAO;AACnC,UAAI,QAAQ;AACZ,UAAI,aAAc,KAAI,eAAe;AACrC,iBAAW,KAAK,KAAK,OAAO;AAAA,IAC9B;AAAA,IACJ,iBAAiB,gBACb,SACA,MAAM;AACJ,YAAM,MAAM,WAAW,KAAK,OAAO;AACnC,aAAO,EAAE,OAAO,IAAI,OAAO,cAAc,IAAI,aAAa;AAAA,IAC5D;AAAA,IACJ,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,EACf,CAAC;AACH;AAKO,SAAS,UAAU,KAA4B;AACpD,QAAM,OAAO,eAAe,GAAG;AAC/B,SAAO,KAAK;AACd;AAKO,SAAS,eACd,UACA,QACA,WACM;AACN,MAAI,aAAa,SAAS,UAAU,QAAW;AAC7C,eAAW,SAAS,KAAK;AAAA,EAC3B;AACA,MAAI,SAAS,SAAS,UAAa,SAAS,SAAS,IAAI;AACvD,gBAAY,SAAS,MAAM,MAAM;AAAA,EACnC;AACF;AAKO,SAAS,iBAAsC,IAAmC;AACvF,SAAO,UAAU,SAAY;AAC3B,QAAI;AACF,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB,SAAS,KAAc;AACrB,UAAI,eAAe,cAAc;AAC/B;AAAA,MACF;AACA,UAAI,eAAe,kBAAkB,IAAI,WAAW,KAAK;AACvD,mBAAW,kGAAkG;AAAA,MAC/G,WAAW,eAAe,kBAAkB,IAAI,WAAW,OAAO,4CAA4C,KAAK,IAAI,OAAO,GAAG;AAC/H,mBAAW,kGAAkG;AAAA,MAC/G,WAAW,eAAe,kBAAkB,IAAI,WAAW,KAAK;AAC9D,cAAM,UAAU,IAAI,WAAW,UAAU,IAAI,WAAW,eAAe,IAAI,YAAY;AACvF,YAAI,OAAO,SAAS,aAAa,KAAK,OAAO,SAAS,oBAAoB,GAAG;AAC3E,qBAAW,4BAA4B,IAAI,OAAO,EAAE;AAAA,QACtD,OAAO;AACL,qBAAW,IAAI,OAAO;AAAA,QACxB;AAAA,MACF,WAAW,eAAe,OAAO;AAC/B,mBAAW,IAAI,OAAO;AAAA,MACxB,OAAO;AACL,mBAAW,OAAO,GAAG,CAAC;AAAA,MACxB;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;;;ACvHA,SAAS,uBAAuB;AAEzB,SAAS,gBAAyB;AACvC,SAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AAClE;AAEA,eAAsB,cAA+B;AACnD,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,MAAI;AACF,UAAM,QAAQ,MAAM,GAAG,SAAS,SAAS;AACzC,WAAO,MAAM,KAAK;AAAA,EACpB,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAsB,iBAAkC;AACtD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,QAAQ;AACtB,UAAM,SAAS,QAAQ;AAEvB,WAAO,MAAM,YAAY;AAEzB,QAAI,CAAC,MAAM,OAAO;AAChB,UAAI,OAAO;AACX,YAAM,YAAY,OAAO;AACzB,YAAM,OAAO;AACb,YAAM,UAAU,MAAM;AACpB,cAAM,eAAe,QAAQC,OAAM;AACnC,cAAM,eAAe,OAAO,KAAK;AACjC,cAAM,eAAe,SAASC,QAAO;AACrC,cAAM,MAAM;AAAA,MACd;AACA,YAAMD,UAAS,CAAC,UAAkB;AAChC,cAAM,UAAU,MAAM,QAAQ,IAAI;AAClC,YAAI,YAAY,IAAI;AAClB,kBAAQ,MAAM,MAAM,GAAG,OAAO;AAC9B,kBAAQ;AACR,iBAAO,MAAM,IAAI;AACjB,kBAAQ,IAAI;AAAA,QACd,OAAO;AACL,kBAAQ;AAAA,QACV;AAAA,MACF;AACA,YAAM,QAAQ,MAAM;AAClB,gBAAQ;AACR,eAAO,MAAM,IAAI;AACjB,gBAAQ,IAAI;AAAA,MACd;AACA,YAAMC,WAAU,CAAC,QAAe;AAC9B,gBAAQ;AACR,eAAO,GAAG;AAAA,MACZ;AACA,YAAM,GAAG,QAAQD,OAAM;AACvB,YAAM,GAAG,OAAO,KAAK;AACrB,YAAM,GAAG,SAASC,QAAO;AACzB;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACrB,UAAM,WAAW,IAAI;AACrB,UAAM,OAAO;AACb,UAAM,YAAY,OAAO;AAEzB,QAAI,WAAW;AAEf,UAAM,kBAAkB,MAAM;AAC5B,YAAM,eAAe,QAAQ,MAAM;AACnC,YAAM,eAAe,SAAS,OAAO;AACrC,YAAM,WAAW,UAAU,KAAK;AAChC,YAAM,MAAM;AAAA,IACd;AAEA,UAAM,UAAU,CAAC,QAAe;AAC9B,sBAAgB;AAChB,aAAO,MAAM,IAAI;AACjB,aAAO,GAAG;AAAA,IACZ;AAEA,UAAM,SAAS,CAAC,SAAiB;AAC/B,YAAM,OAAO,KAAK,WAAW,CAAC;AAE9B,UAAI,SAAS,QAAQ,SAAS,MAAM;AAClC,wBAAgB;AAChB,eAAO,MAAM,IAAI;AACjB,gBAAQ,QAAQ;AAAA,MAClB,WAAW,SAAS,GAAG;AACrB,wBAAgB;AAChB,eAAO,MAAM,IAAI;AACjB,eAAO,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACpC,WAAW,SAAS,OAAO,SAAS,GAAG;AACrC,YAAI,SAAS,SAAS,GAAG;AACvB,qBAAW,SAAS,MAAM,GAAG,EAAE;AAC/B,iBAAO,MAAM,OAAO;AAAA,QACtB;AAAA,MACF,WAAW,QAAQ,IAAI;AACrB,oBAAY;AACZ,eAAO,MAAM,GAAG;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,GAAG,QAAQ,MAAM;AACvB,UAAM,GAAG,SAAS,OAAO;AAAA,EAC3B,CAAC;AACH;AAQA,eAAsB,sBACpB,SACA,iBAC6B;AAC7B,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,MAAI;AACF,YAAQ,IAAI,sBAAsB;AAClC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,IAAI,QAAQ,CAAC;AACnB,YAAM,UAAU,EAAE,aAAa,kBAAkB,oBAAe;AAChE,YAAM,SAAS,EAAE,aAAa,kBAAkB,QAAQ;AACxD,YAAM,QAAQ,EAAE,OAAO,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE;AACvD,cAAQ,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,IAAI,IAAI,OAAO,EAAE;AAAA,IAClE;AACA,eAAS;AACP,YAAM,SAAS,MAAM,GAAG,SAAS,kDAAkD;AACnF,YAAM,UAAU,OAAO,KAAK;AAC5B,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,QAAQ,SAAS,SAAS,EAAE,IAAI;AACtC,UAAI,SAAS,KAAK,QAAQ,QAAQ,QAAQ;AACxC,eAAO,QAAQ,KAAK,EAAE;AAAA,MACxB;AACA,cAAQ,IAAI,0DAA0D,QAAQ,MAAM,GAAG;AAAA,IACzF;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;;;ACpIO,SAAS,iBAAiB,OAA+C;AAC9E,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,OAAO,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS,OAAO;AAC5D,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,OAA4B;AACzD,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,CAAC,WAAW,OAAO,QAAQ,QAAQ,UAAU;AAC/C,WAAO,EAAE,WAAW,MAAM,WAAW,OAAO,gBAAgB,OAAO,aAAa,KAAK;AAAA,EACvF;AAEA,QAAM,YAAY,IAAI,KAAK,QAAQ,MAAM,GAAI;AAC7C,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,cAAc,UAAU,QAAQ,IAAI;AAC1C,QAAM,cAAc,IAAI,KAAK;AAE7B,SAAO;AAAA,IACL;AAAA,IACA,WAAW,eAAe;AAAA,IAC1B,gBAAgB,cAAc,KAAK,eAAe;AAAA,IAClD;AAAA,EACF;AACF;AAEO,SAAS,eAAe,IAAoB;AACjD,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,EAAG,OAAM,KAAK,GAAG,IAAI,GAAG;AACnC,MAAI,QAAQ,KAAK,EAAG,OAAM,KAAK,GAAG,QAAQ,EAAE,GAAG;AAC/C,MAAI,UAAU,KAAK,KAAK,SAAS,EAAG,OAAM,KAAK,GAAG,UAAU,EAAE,GAAG;AACjE,MAAI,MAAM,WAAW,EAAG,OAAM,KAAK,GAAG,OAAO,GAAG;AAEhD,SAAO,MAAM,KAAK,GAAG;AACvB;;;ACrDA,OAAO,WAAW;AAClB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,mBAAAC,wBAAuB;AAYhC,eAAsB,eAAe,OAAkC;AAErE,MAAI,UAAU,QAAW;AACvB,QAAI,UAAU,IAAK,QAAO,UAAUD,cAAa,GAAG,OAAO,CAAC;AAC5D,QAAI,MAAM,WAAW,GAAG,EAAG,QAAO,UAAUA,cAAa,MAAM,MAAM,CAAC,GAAG,OAAO,CAAC;AACjF,WAAO,UAAU,KAAK;AAAA,EACxB;AAGA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO,UAAUA,cAAa,GAAG,OAAO,CAAC;AAAA,EAC3C;AAGA,SAAO,oBAAoB;AAC7B;AAEA,SAAS,UAAU,MAAuB;AACxC,SAAO,MAAM,MAAM,KAAK,KAAK,CAAC;AAChC;AAOA,eAAe,sBAAwC;AACrD,QAAM,KAAKC,iBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ;AAAA,EACV,CAAC;AAED,UAAQ,OAAO,MAAM,kEAAkE;AACvF,KAAG,OAAO;AAEV,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,MAAI,iBAAiB;AACrB,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,SAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,OAAG,GAAG,UAAU,MAAM;AACpB,kBAAY;AACZ,SAAG,MAAM;AAAA,IACX,CAAC;AAED,OAAG,GAAG,QAAQ,CAAC,SAAS;AACtB,YAAM,KAAK,IAAI;AACf,YAAM,SAAS,WAAW,MAAM,OAAO,SAAS,gBAAgB,UAAU,UAAU;AACpF,cAAQ,OAAO;AACf,gBAAU,OAAO;AACjB,uBAAiB,OAAO;AACxB,iBAAW,OAAO;AAClB,mBAAa,OAAO;AAEpB,UAAI,WAAW,SAAS,KAAK,CAAC,kBAAkB,CAAC,UAAU;AACzD,WAAG,MAAM;AACT,YAAI;AACF,kBAAQ,UAAU,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,QACrC,SAAS,KAAK;AACZ,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,OAAO;AACL,WAAG,UAAU,OAAO;AACpB,WAAG,OAAO;AAAA,MACZ;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,UAAI,WAAW;AACb,eAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC;AAAA,MACF;AACA,UAAI,MAAM,SAAS,MAAM,CAAC,WAAW,QAAQ,KAAK,kBAAkB,WAAW;AAE7E,YAAI;AACF,kBAAQ,UAAU,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,QACrC,SAAS,KAAK;AACZ,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,WAAW,MAAM,WAAW,GAAG;AAC7B,eAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAMA,SAAS,WACP,MACA,OACA,SACA,gBACA,UACA,YACqG;AAErG,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,KAAK,CAAC;AACjB,UAAM,OAAO,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI;AAEjD,QAAI,gBAAgB;AAClB,UAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,yBAAiB;AACjB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,UAAI,OAAO,QAAQ,IAAI,IAAI,KAAK,QAAQ;AACtC;AAAA,MACF,WAAW,OAAO,YAAY;AAC5B,mBAAW;AAAA,MACb;AACA;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,SAAS,IAAK;AAEhC,QAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,uBAAiB;AACjB;AACA;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,iBAAW;AACX,mBAAa;AAAA,IACf,WAAW,OAAO,OAAO,OAAO,KAAK;AACnC;AACA,gBAAU;AAAA,IACZ,WAAW,OAAO,OAAO,OAAO,KAAK;AACnC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,gBAAgB,UAAU,WAAW;AAChE;;;ACxJO,SAAS,4BAA4B,IAAmB;AAC7D,QAAM,eAAe,GAClB,QAAQ,eAAe,EACvB,YAAY,2BAA2B;AAG1C,QAAM,OAAO,aACV,QAAQ,MAAM,EACd,YAAY,yBAAyB,EACrC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,mBAAmB;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,aACZ,QAAQ,eAAe,EACvB,YAAY,2BAA2B,EACvC,OAAO,iBAAiB,aAAa,EACrC,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,UAAU,4DAA4D,EAC7E;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,IAAI,KAAK;AAMtB,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,QAAQ,KAAK,QAAQ;AAEnC,cAAM,UAAmC,CAAC;AAC1C,YAAI,KAAK,KAAM,SAAQ,OAAO,KAAK;AACnC,YAAI,KAAK,OAAQ,SAAQ,WAAW,KAAK;AACzC,eAAO;AAAA,MACT,OAAO;AAEL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,qBAAqB,EAAE,KAAK,CAAC;AAE9E,YAAM,OAAO,SAAS;AAEtB,UAAI,KAAK,MAAM;AACb,cAAM,aAAa,eAAe,GAAG;AACrC,cAAM,WAAW,KAAK;AACtB,cAAM,eAAe,KAAK;AAE1B,YAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,qBAAW,qEAAqE;AAChF,yBAAe,UAAU,MAAM;AAC/B,uBAAa,uBAAuB;AACpC;AAAA,QACF;AAGA,cAAM,UAAU,YAAY,WAAW,GAAI;AAC3C,cAAM,cAAc,MAAM,uBAAuB;AAAA,UAC/C;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,SAAS,WAAW,WAAW,OAAO;AAC5C,eAAO,WAAW;AAClB,eAAO,eAAe;AACtB,eAAO,QAAQ,YAAY;AAC3B,eAAO,OAAO;AACd,mBAAW,QAAQ,WAAW,OAAO;AAErC,kBAAU,0DAA0D;AAAA,MACtE,OAAO;AACL;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAEA,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,WAAS,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,aACZ,QAAQ,0BAA0B,EAClC,YAAY,wBAAwB,EACpC,OAAO,iBAAiB,aAAa,EACrC,OAAO,wBAAwB,oBAAoB,EACnD,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,YAAY,2BAA2B,EAC9C,OAAO,cAAc,6BAA6B,EAClD;AAAA,IACC,iBAAiB,OAAO,UAAmB,MAAe,OAAgB,QAAiB;AACzF,YAAM,OAAO,IAAI,KAAK;AAQtB,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,QAAQ,KAAK,eAAe,KAAK,aAAa,UAAa,KAAK,UAAU,KAAK,UAAU;AACvG,cAAM,UAAmC,CAAC;AAC1C,YAAI,KAAK,KAAM,SAAQ,OAAO,KAAK;AACnC,YAAI,KAAK,YAAa,SAAQ,cAAc,KAAK;AACjD,YAAI,KAAK,aAAa,OAAW,SAAQ,WAAW,KAAK,aAAa,SAAS,OAAO,KAAK;AAC3F,YAAI,KAAK,OAAQ,SAAQ,WAAW;AACpC,YAAI,KAAK,SAAU,SAAQ,WAAW;AACtC,eAAO;AAAA,MACT,OAAO;AACL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,qBAAqB,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,QACzD,EAAE,KAAK;AAAA,MACT;AACA,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,aACT,QAAQ,aAAa,EACrB,YAAY,mDAAmD,EAC/D;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,qBAAqB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACrD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,mBAAmB,aACtB,QAAQ,8BAA8B,EACtC,YAAY,+EAA0E,EACtF;AAAA,IACC,iBAAiB,OAAO,UAAmB,OAAgB,QAAiB;AAC1E,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,qBAAqB,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC3D;AACA,mBAAa,kEAA6D;AAC1E,qBAAe,UAAU,MAAM;AAC/B,mBAAa,kCAAkC;AAAA,IACjD,CAAC;AAAA,EACH;AAEF,cAAY,kBAAkB;AAAA,IAC5B;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACtPA,SAAS,gBAAgB,MAAwB;AAC/C,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,eAAe;AACxD,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,MAAM,EAAE,GAAI,KAAiC;AACnD,MAAI,IAAI,QAAQ,SAAU,QAAO,IAAI;AACrC,SAAO;AACT;AAGA,SAAS,cACP,MACA,KACS;AACT,QAAM,aAAa,eAAe,GAAG;AACrC,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,KAAK;AACR,eAAW,uEAAuE;AAClF,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,WAAW,WAAW,OAAO;AAC5C,WAAO,SAAS;AAChB,eAAW,QAAQ,WAAW,OAAO;AACrC,YAAQ,MAAM,uEAAuE;AACrF,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,eAAW,qCAAqC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAClG,mBAAe,GAAG;AAClB,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AACF;AAGA,SAAS,cACP,MACA,MACA,KACS;AACT,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,KAAK;AACR,eAAW,+DAA+D;AAC1E,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AACA,MAAI,KAAM,QAAO,cAAc,MAAM,GAAG;AACxC,iBAAe,GAAG;AAClB,SAAO;AACT;AAEO,SAAS,uBAAuB,IAAmB;AACxD,QAAM,UAAU,GACb,QAAQ,UAAU,EAClB,YAAY,sBAAsB;AAGrC,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,cAAc;AAC9D,eAAS,OAAO,gBAAgB,SAAS,IAAI;AAC7C,qBAAe,UAAU,MAAM;AAC/B,cAAQ,MAAM,oMAAwD;AAAA,IACxE,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,eAAe,EACvB,YAAY,sBAAsB,EAClC,OAAO,iBAAiB,UAAU,EAClC,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,mCAAmC,EACjE,OAAO,oBAAoB,uBAAuB,EAClD,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,UAAU,8CAA8C,EAC/D;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,IAAI,KAAK;AAUtB,UAAI,KAAK,YAAY,QAAW;AAC9B,cAAM,SAAS,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAClF,YAAI,OAAO,WAAW,GAAG;AACvB,qBAAW,4EAA4E;AACvF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,QAAQ,KAAK,UAAU,KAAK,WAAW,KAAK,aAAa,KAAK,iBAAiB,QAAW;AACxG,cAAM,UAAmC,CAAC;AAC1C,YAAI,KAAK,KAAM,SAAQ,OAAO,KAAK;AACnC,YAAI,KAAK,OAAQ,SAAQ,WAAW,KAAK;AACzC,YAAI,KAAK,QAAS,SAAQ,iBAAiB,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC9G,YAAI,KAAK,iBAAiB,OAAW,SAAQ,eAAe,KAAK;AACjE,YAAI,KAAK,WAAW;AAClB,gBAAM,MAAM,KAAK,UAAU,KAAK;AAChC,cAAI,CAAC,QAAQ,KAAK,GAAG,GAAG;AACtB,uBAAW,0CAA0C;AACrD,oBAAQ,KAAK,CAAC;AAAA,UAChB;AACA,gBAAM,YAAY,OAAO,GAAG;AAC5B,cAAI,aAAa,GAAG;AAClB,uBAAW,0CAA0C;AACrD,oBAAQ,KAAK,CAAC;AAAA,UAChB;AACA,kBAAQ,YAAY,EAAE,UAAU;AAAA,QAClC;AACA,eAAO;AAAA,MACT,OAAO;AACL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAGA,UAAI,QAAQ,OAAO,SAAS,YAAY,oBAAqB,MAAkC;AAC7F,cAAM,UAAW,KAAiC;AAClD,YAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,OAAO,CAAC,MAAe,OAAO,MAAM,YAAY,EAAE,KAAK,MAAM,EAAE,EAAE,WAAW,GAAG;AACnH,qBAAW,4EAA4E;AACvF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,gBAAgB,EAAE,KAAK,CAAC;AAEzE,YAAM,OAAO,SAAS;AACtB,YAAM,KAAK,cAAc,MAAM,CAAC,CAAC,KAAK,MAAM,GAAG;AAE/C,qBAAe,UAAU,MAAM;AAC/B,UAAI,GAAI,SAAQ,MAAM,kBAAkB;AAAA,IAC1C,CAAC;AAAA,EACH;AAEF,WAAS,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,QACb,QAAQ,iBAAiB,EACzB,YAAY,8DAAyD,EACrE,OAAO,UAAU,kDAAkD,EACnE;AAAA,IACC,iBAAiB,OAAO,OAAgB,OAAgB,QAAiB;AACvE,YAAM,OAAO,IAAI,KAAK;AACtB,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,gBAAgB,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,MACnD;AAEA,YAAM,OAAO,SAAS;AACtB,YAAM,KAAK,cAAc,MAAM,CAAC,CAAC,KAAK,MAAM,GAAG;AAE/C,qBAAe,UAAU,MAAM;AAC/B,UAAI,GAAI,SAAQ,MAAM,oBAAoB;AAAA,IAC5C,CAAC;AAAA,EACH;AAEF,WAAS,SAAS;AAAA,IAChB;AAAA,IACA;AAAA,EACF,CAAC;AAED,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,uBAAuB,EAC/B,YAAY,mBAAmB,EAC/B,OAAO,iBAAiB,UAAU,EAClC,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,uBAAuB,mCAAmC,EACjE,OAAO,oBAAoB,kCAAkC,EAC7D,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,sBAAsB,0BAA0B,EACvD,OAAO,YAAY,sBAAsB,EACzC,OAAO,cAAc,wBAAwB,EAC7C;AAAA,IACC,iBAAiB,OAAO,OAAgB,MAAe,OAAgB,QAAiB;AACtF,YAAM,OAAO,IAAI,KAAK;AAWtB,UAAI,KAAK,YAAY,QAAW;AAC9B,cAAM,SAAS,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAClF,YAAI,OAAO,WAAW,GAAG;AACvB,qBAAW,4EAA4E;AACvF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,QAAQ,KAAK,aAAa,UAAa,KAAK,YAAY,UAAa,KAAK,aAAa,KAAK,iBAAiB,UAAa,KAAK,UAAU,KAAK,UAAU;AACtK,cAAM,UAAmC,CAAC;AAC1C,YAAI,KAAK,KAAM,SAAQ,OAAO,KAAK;AACnC,YAAI,KAAK,aAAa,OAAW,SAAQ,WAAW,KAAK,aAAa,SAAS,OAAO,KAAK;AAC3F,YAAI,KAAK,YAAY,OAAW,SAAQ,iBAAiB,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC5H,YAAI,KAAK,iBAAiB,OAAW,SAAQ,eAAe,KAAK;AACjE,YAAI,KAAK,WAAW;AAClB,gBAAM,MAAM,KAAK,UAAU,KAAK;AAChC,cAAI,CAAC,QAAQ,KAAK,GAAG,GAAG;AACtB,uBAAW,0CAA0C;AACrD,oBAAQ,KAAK,CAAC;AAAA,UAChB;AACA,gBAAM,YAAY,OAAO,GAAG;AAC5B,cAAI,aAAa,GAAG;AAClB,uBAAW,0CAA0C;AACrD,oBAAQ,KAAK,CAAC;AAAA,UAChB;AACA,kBAAQ,YAAY,EAAE,UAAU;AAAA,QAClC;AACA,YAAI,KAAK,OAAQ,SAAQ,WAAW;AACpC,YAAI,KAAK,SAAU,SAAQ,WAAW;AACtC,eAAO;AAAA,MACT,OAAO;AACL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,gBAAgB,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,QACjD,EAAE,KAAK;AAAA,MACT;AACA,qBAAe,UAAU,MAAM;AAC/B,cAAQ,MAAM,kBAAkB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,QACT,QAAQ,gBAAgB,EACxB,YAAY,6EAAwE,EACpF;AAAA,IACC,iBAAiB,OAAO,OAAgB,OAAgB,QAAiB;AACvE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,MACnD;AACA,cAAQ,MAAM,kBAAkB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC/VO,SAAS,wBAAwB,IAAmB;AACzD,QAAM,WAAW,GACd,QAAQ,UAAU,EAClB,YAAY,qCAAqC;AAGpD,QAAM,OAAO,SACV,QAAQ,MAAM,EACd,YAAY,6BAA6B,EACzC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,cAAc;AAC9D,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,gBAAgB,EACxB,YAAY,6EAA6E,EACzF;AAAA,IACC,iBAAiB,OAAO,UAAmB,OAAgB,QAAiB;AAC1E,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,gBAAgB,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,MACtD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,eAAe,EACvB,QAAQ,gCAAgC,EACxC;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBF,EACC,OAAO,oBAAoB,4CAA4C,EACvE,OAAO,wBAAwB,oBAAoB,EACnD;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,IAAI,KAAK;AAEtB,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,YAAY,KAAK,aAAa;AAC5C,cAAM,UAAmC,CAAC;AAC1C,YAAI,KAAK,SAAU,SAAQ,WAAW,KAAK;AAC3C,YAAI,KAAK,YAAa,SAAQ,cAAc,KAAK;AACjD,eAAO;AAAA,MACT,OAAO;AACL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,gBAAgB,EAAE,KAAK,CAAC;AACzE,qBAAe,UAAU,MAAM;AAC/B,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,WAAS,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,0BAA0B,EAClC,YAAY,2CAA2C,EACvD,OAAO,wBAAwB,oBAAoB,EACnD;AAAA,IACC,iBAAiB,OAAO,UAAmB,MAAe,OAAgB,QAAiB;AACzF,YAAM,OAAO,IAAI,KAAK;AAEtB,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,aAAa;AAC3B,eAAO,EAAE,aAAa,KAAK,YAAY;AAAA,MACzC,OAAO;AACL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,gBAAgB,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,QACpD,EAAE,KAAK;AAAA,MACT;AACA,qBAAe,UAAU,MAAM;AAC/B,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,mBAAmB,EAC3B,YAAY,6GAAwG,EACpH;AAAA,IACC,iBAAiB,OAAO,UAAmB,OAAgB,QAAiB;AAC1E,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,MACtD;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ATjLA,SAAS,qBAA8B;AACrC,SAAO,IAAI,QAAQ,OAAO,EACvB,YAAY,6BAA6B,EACzC,OAAO,wBAAwB,uCAAuC,EACtE,OAAO,oBAAoB,iBAAiB,EAC5C,OAAO,4BAA4B,qBAAqB,EACxD,OAAO,oBAAoB,gCAAgC,EAC3D,OAAO,oBAAoB,qCAAqC,EAChE;AAAA,IACC,iBAAiB,UAAU,SAAoB;AAC7C,YAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,YAAM,YAAY,IAAI,KAAK;AAO3B,YAAM,aAAa,eAAe,GAAG;AAErC,UAAI,UAAU,mBAAmB;AAC/B,cAAM,WAAW,UAAU,YAAY,QAAQ,IAAI;AACnD,cAAM,eAAe,UAAU,gBAAgB,QAAQ,IAAI;AAE3D,YAAI,CAAC,YAAY,CAAC,cAAc;AAC9B;AAAA,YACE;AAAA,UACF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,YAAI,CAAC,WAAW,KAAK;AACnB,qBAAW,qEAAqE;AAChF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,SAAS,MAAM,uBAAuB;AAAA,UAC1C,SAAS,WAAW;AAAA,UACpB;AAAA,UACA;AAAA,UACA,OAAO,UAAU;AAAA,QACnB,CAAC;AAED,cAAMC,UAAS,WAAW,WAAW,OAAO;AAC5C,QAAAA,QAAO,QAAQ,OAAO;AACtB,eAAOA,QAAO;AACd,mBAAWA,SAAQ,WAAW,OAAO;AAErC,qBAAa,qEAAqE;AAClF;AAAA,MACF;AAGA,UAAI,CAAC,WAAW,KAAK;AACnB,mBAAW,qEAAqE;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI;AACF,oBAAY,WAAW,GAAG;AAAA,MAC5B,SAAS,KAAK;AACZ,mBAAY,IAAc,OAAO;AACjC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,CAAC,cAAc,GAAG;AACpB;AAAA,UACE;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,QAAQ,MAAM,YAAY;AAChC,YAAM,WAAW,MAAM,eAAe;AAEtC,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAA+B,EAAE,OAAO,SAAS;AAGvD,YAAM,kBAAkB,UAAU;AAClC,YAAM,cAAc,WAAW;AAE/B,UAAI,iBAAiB;AACnB,aAAK,WAAW;AAAA,MAClB;AAEA,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,eAAe;AAAA,QAC9D;AAAA,QACA,kBAAkB;AAAA,MACpB,CAAC;AAED,YAAM,OAAO,SAAS;AACtB,UAAI,QAAS,KAAK,eAAe,KAAK;AACtC,UAAI,eAAe,KAAK;AAExB,UAAI,CAAC,OAAO;AACV,mBAAW,gCAAgC;AAC3C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,mBAAmB,KAAK;AAC9B,UAAI,gBAAgB,KAAK;AAEzB,UAAI,oBAAoB,iBAAiB,SAAS,KAAK,CAAC,iBAAiB;AAEvE,YAAI;AACJ,YAAI,aAAa;AACf,gBAAM,QAAQ,iBAAiB;AAAA,YAC7B,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,aAAa;AAAA,UAClD;AACA,cAAI,OAAO;AACT,+BAAmB,MAAM;AAAA,UAC3B,OAAO;AACL;AAAA,cACE,WAAW,WAAW,2BAA2B,iBAAiB,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA,YAC/G;AACA,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA,QACF;AAEA,YAAI,CAAC,kBAAkB;AACrB,6BAAmB,MAAM,sBAAsB,kBAAkB,aAAa;AAAA,QAChF;AAEA,YAAI,oBAAoB,qBAAqB,eAAe;AAE1D,gBAAM,kBAAkB,MAAM,OAAO,WAAW,QAAQ,eAAe;AAAA,YACrE,MAAM,EAAE,OAAO,UAAU,UAAU,iBAAiB;AAAA,YACpD,kBAAkB;AAAA,UACpB,CAAC;AACD,gBAAM,cAAc,gBAAgB;AACpC,gBAAM,WAAY,YAAY,eAAe,YAAY;AACzD,cAAI,CAAC,UAAU;AACb,uBAAW,yDAAyD;AACpE,oBAAQ,KAAK,CAAC;AAAA,UAChB;AACA,kBAAQ;AACR,yBAAe,YAAY;AAC3B,0BAAgB;AAAA,QAClB;AAAA,MACF;AAEA,YAAM,SAAS,WAAW,WAAW,OAAO;AAC5C,aAAO,QAAQ;AACf,UAAI,cAAc;AAChB,eAAO,eAAe;AAAA,MACxB,OAAO;AACL,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,eAAe;AACjB,eAAO,UAAU;AACjB,eAAO,WAAW;AAAA,MACpB,OAAO;AACL,eAAO,OAAO;AACd,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,oBAAoB,iBAAiB,SAAS,GAAG;AACnD,eAAO,mBAAmB,iBAAiB,IAAI,CAAC,OAAO;AAAA,UACrD,UAAU,EAAE;AAAA,UACZ,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,UACjC,MAAM,EAAE;AAAA,QACV,EAAE;AAAA,MACJ,OAAO;AACL,eAAO,OAAO;AAAA,MAChB;AACA,iBAAW,QAAQ,WAAW,OAAO;AAErC,YAAM,cAAc,gBAChB,aAAa,kBAAkB,KAAK,CAAC,MAAM,EAAE,aAAa,aAAa,GAAG,QAAQ,aAAa,MAC/F;AACJ,mBAAa,mBAAmB,WAAW,0BAA0B;AAAA,IACvE,CAAC;AAAA,EACH;AACJ;AAEA,SAAS,sBAA+B;AACtC,SAAO,IAAI,QAAQ,QAAQ,EACxB,YAAY,wDAAwD,EACpE;AAAA,IACC,iBAAiB,UAAU,SAAoB;AAC7C,YAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,YAAM,aAAa,eAAe,GAAG;AACrC,YAAM,SAAS,WAAW,WAAW,OAAO;AAG5C,UAAI,OAAO,SAAS,WAAW,KAAK;AAClC,YAAI;AACF,gBAAM,SAAS,aAAa,GAAG;AAC/B,gBAAM,OAAO,WAAW,QAAQ,cAAc;AAAA,QAChD,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,aAAO,OAAO;AACd,aAAO,OAAO;AACd,iBAAW,QAAQ,WAAW,OAAO;AACrC,mBAAa,wCAAwC;AAAA,IACvD,CAAC;AAAA,EACH;AACJ;AAEA,SAAS,iBAAiB;AACxB,SAAO,iBAAiB,UAAU,SAAoB;AACpD,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,aAAa,eAAe,GAAG;AAErC,QAAI,CAAC,WAAW,SAAS,CAAC,WAAW,QAAQ;AAC3C,gBAAU,yDAAyD;AACnE;AAAA,IACF;AAEA,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,WAAW,MAAM,OAAO,WAAW,OAAO,KAAK;AACrD,mBAAe,UAAU,MAAM;AAG/B,QAAI,UAAU,WAAW,SAAS;AAChC;AAAA,IACF;AAGA,UAAM,eAAe,WAAW,WAAW,OAAO;AAClD,QAAI,aAAa,OAAO;AACtB,YAAM,SAAS,eAAe,aAAa,KAAK;AAChD,UAAI,OAAO,WAAW;AACpB,YAAI,OAAO,WAAW;AACpB,qBAAW,kBAAkB,OAAO,UAAU,YAAY,CAAC,YAAY;AAAA,QACzE,WAAW,OAAO,gBAAgB;AAChC;AAAA,YACE,kBAAkB,OAAO,UAAU,YAAY,CAAC,KAAK,eAAe,OAAO,WAAY,CAAC;AAAA,UAC1F;AAAA,QACF,OAAO;AACL;AAAA,YACE,kBAAkB,OAAO,UAAU,YAAY,CAAC,KAAK,eAAe,OAAO,WAAY,CAAC;AAAA,UAC1F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,WAAW,WAAW,kBAAkB;AAC5D,cAAU,YAAY,WAAW,EAAE;AAAA,EACrC,CAAC;AACH;AAEA,eAAe,WACb,SACA,QACmE;AACnE,QAAM,SAAS,IAAI,IAAI,OAAO,EAAE;AAChC,QAAM,MAAM,IAAI,IAAI,eAAe,OAAO,EAAE,SAAS;AACrD,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,CAAC;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,yBAAyB,QAAQ,QAAQ,SAAS,MAAM,EAAE,EAAE;AAAA,EAC9E;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;AAEA,SAAS,qBAA8B;AACrC,SAAO,IAAI,QAAQ,OAAO,EACvB,YAAY,iFAAiF,EAC7F,OAAO,mBAAmB,0BAA0B,EACpD;AAAA,IACC,iBAAiB,UAAU,SAAoB;AAC7C,YAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,YAAM,YAAY,IAAI,KAAK;AAC3B,YAAM,aAAa,eAAe,GAAG;AACrC,YAAM,SAAS,UAAU,UAAU,WAAW;AAE9C,UAAI,CAAC,QAAQ;AACX,mBAAW,4FAA4F;AACvG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,CAAC,WAAW,KAAK;AACnB,mBAAW,qEAAqE;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,YAAY,WAAW,GAAG;AAC1C,YAAM,OAAO,MAAM,WAAW,SAAS,MAAM;AAC7C,YAAM,SAAS,UAAU,GAAG;AAC5B,qBAAe,EAAE,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,MAAM;AAAA,IACtE,CAAC;AAAA,EACH;AACJ;AAEA,SAAS,mBAAmB,MAAc,MAAuB;AAC/D,QAAM,YAAY,KAAK,MAAM,OAAO,CAAC;AACrC,QAAM,gBAAgB,OAAO;AAC7B,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,QAAI,KAAK,CAAC,MAAM,EAAG,QAAO;AAAA,EAC5B;AACA,MAAI,gBAAgB,GAAG;AACrB,UAAM,OAAO,OAAS,IAAI;AAC1B,SAAK,KAAK,SAAS,IAAI,UAAU,EAAG,QAAO;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,IAAM,qBAAqB;AAE3B,SAAS,SAAS,WAAmB,YAA4B;AAC/D,WAAS,QAAQ,GAAG,QAAQ,oBAAoB,SAAS;AACvD,UAAM,OAAO,WAAW,QAAQ,EAC7B,OAAO,GAAG,SAAS,GAAG,KAAK,EAAE,EAC7B,OAAO;AACV,QAAI,mBAAmB,MAAM,UAAU,EAAG,QAAO;AAAA,EACnD;AACA,QAAM,IAAI,MAAM,kCAAkC,kBAAkB,aAAa;AACnF;AAEA,SAAS,6BAAsC;AAC7C,SAAO,IAAI,QAAQ,gBAAgB,EAChC,YAAY,kFAAkF,EAC9F,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,UAAU,2CAA2C,EAC5D;AAAA,IACC,iBAAiB,UAAU,SAAoB;AAC7C,YAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,YAAM,eAAe,IAAI,KAAK;AAC9B,YAAM,aAAa,eAAe,GAAG;AACrC,YAAM,SAAS,aAAa,UAAU,WAAW;AAEjD,UAAI,CAAC,QAAQ;AACX,mBAAW,4FAA4F;AACvG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,CAAC,WAAW,KAAK;AACnB,mBAAW,qEAAqE;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,YAAY,WAAW,GAAG;AAC1C,YAAM,SAAS,IAAI,IAAI,OAAO,EAAE;AAGhC,YAAM,YAAY,MAAM,WAAW,SAAS,MAAM;AAElD,gBAAU,2CAA2C,UAAU,UAAU,MAAM;AAG/E,YAAM,WAAW,SAAS,UAAU,WAAW,UAAU,UAAU;AAGnE,YAAM,WAAW,IAAI,IAAI,gBAAgB,OAAO,EAAE,SAAS;AAC3D,YAAM,gBAAgB,MAAM,MAAM,UAAU;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACZ;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,OAAO,UAAU;AAAA,UACjB,OAAO,OAAO,QAAQ;AAAA,QACxB,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAAC,cAAc,IAAI;AACrB,cAAM,OAAO,MAAM,cAAc,KAAK;AACtC,cAAM,IAAI,MAAM,0BAA0B,QAAQ,QAAQ,cAAc,MAAM,EAAE,EAAE;AAAA,MACpF;AAEA,YAAM,YAAa,MAAM,cAAc,KAAK;AAM5C,UAAI,aAAa,MAAM;AACrB,cAAM,SAAS,WAAW,WAAW,OAAO;AAC5C,eAAO,QAAQ,UAAU;AACzB,mBAAW,QAAQ,WAAW,OAAO;AACrC,qBAAa,mDAAmD;AAAA,MAClE,OAAO;AACL,cAAM,SAAS,UAAU,GAAG;AAC5B,uBAAe,EAAE,QAAQ,cAAc,QAAQ,SAAS,cAAc,SAAS,MAAM,UAAU,GAAG,MAAM;AACxG,qBAAa,4BAA4B;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AACJ;AAEO,SAAS,qBAAqBC,UAAwB;AAE3D,QAAM,OAAOA,SACV,QAAQ,MAAM,EACd,YAAY,uBAAuB;AAEtC,QAAM,QAAQ,mBAAmB;AACjC,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,OAAK,WAAW,KAAK;AAErB,QAAM,SAAS,oBAAoB;AACnC,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,OAAK,WAAW,MAAM;AAEtB,QAAM,QAAQ,mBAAmB;AACjC,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,OAAK,WAAW,KAAK;AAErB,QAAM,gBAAgB,2BAA2B;AACjD,cAAY,eAAe;AAAA,IACzB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,OAAK,WAAW,aAAa;AAG7B,QAAM,KAAKA,SACR,QAAQ,IAAI,EACZ,YAAY,8DAA8D;AAG7E,QAAM,SAAS,GACZ,QAAQ,QAAQ,EAAE,WAAW,MAAM,QAAQ,KAAK,CAAC,EACjD,YAAY,oCAAoC,EAChD,OAAO,eAAe,CAAC;AAE1B,cAAY,IAAI;AAAA,IACd;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,8BAA4B,EAAE;AAG9B,yBAAuB,EAAE;AAGzB,0BAAwB,EAAE;AAG1B,EAAAA,SAAQ,WAAW,mBAAmB,GAAG,EAAE,QAAQ,KAAK,CAAC;AACzD,EAAAA,SAAQ,WAAW,oBAAoB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAE1D,QAAM,eAAe,IAAI,QAAQ,QAAQ,EACtC,YAAY,oCAAoC,EAChD,OAAO,eAAe,CAAC;AAC1B,EAAAA,SAAQ,WAAW,cAAc,EAAE,QAAQ,KAAK,CAAC;AACnD;;;AU3gBO,SAAS,wBAAwBC,UAAwB;AAC9D,QAAM,UAAUA,SAAQ,QAAQ,SAAS,EAAE,YAAY,iFAAiF;AAExI,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,kDAAkD,EAC9D,OAAO,MAAM;AACZ,UAAM,WAAW,aAAa;AAC9B,eAAW,KAAK,UAAU;AACxB,YAAM,SAAS,EAAE,SAAS,OAAO;AACjC,cAAQ,IAAI,GAAG,EAAE,IAAI,GAAG,MAAM,EAAE;AAAA,IAClC;AAAA,EACF,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,MAAM,QACT,QAAQ,YAAY,EACpB,YAAY,uDAAuD,EACnE,OAAO,OAAO,SAAiB;AAC9B,QAAI;AACF,wBAAkB,IAAI;AAAA,IACxB,SAAS,KAAK;AACZ,iBAAY,IAAc,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,WAAW,IAAI;AAC9B,UAAM,cAAc,OAAO,WACvB,aAAa,OAAO,kBAAkB,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ,GAAG,QAAQ,OAAO,QAAQ,MAC1G;AAGJ,QAAI,OAAO,SAAS,OAAO,gBAAgB,OAAO,KAAK;AACrD,YAAM,SAAS,eAAe,OAAO,KAAK;AAC1C,UAAI,OAAO,aAAa,OAAO,gBAAgB;AAC7C,YAAI;AACF,gBAAM,UAAU,YAAY,OAAO,GAAG;AACtC,gBAAM,MAAM,IAAI,IAAI,iBAAiB,OAAO,EAAE,SAAS;AACvD,gBAAM,WAAW,MAAM,MAAM,KAAK;AAAA,YAChC,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU,EAAE,cAAc,OAAO,aAAa,CAAC;AAAA,UAC5D,CAAC;AACD,cAAI,SAAS,IAAI;AACf,kBAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,kBAAM,WAAY,KAAK,eAAe,KAAK;AAC3C,kBAAM,kBAAkB,KAAK;AAC7B,gBAAI,UAAU;AACZ,qBAAO,QAAQ;AACf,kBAAI,gBAAiB,QAAO,eAAe;AAC3C,yBAAW,QAAQ,IAAI;AACvB,2BAAa,wBAAwB,IAAI,IAAI,WAAW,oBAAoB;AAC5E;AAAA,YACF;AAAA,UACF;AACA,uBAAa,iDAAiD;AAAA,QAChE,QAAQ;AACN,uBAAa,iDAAiD;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,iBAAa,wBAAwB,IAAI,IAAI,WAAW,GAAG;AAAA,EAC7D,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,QACnB,QAAQ,eAAe,EACvB,YAAY,iEAAiE,EAC7E,OAAO,CAAC,SAAiB;AACxB,QAAI;AACF,oBAAc,IAAI;AAClB,mBAAa,YAAY,IAAI,YAAY;AAAA,IAC3C,SAAS,KAAK;AACZ,iBAAY,IAAc,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,cAAY,eAAe;AAAA,IACzB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,MAAM,QACT,QAAQ,eAAe,EACvB,YAAY,+CAA+C,EAC3D,OAAO,CAAC,SAAiB;AACxB,QAAI;AACF,oBAAc,IAAI;AAClB,mBAAa,YAAY,IAAI,YAAY;AAAA,IAC3C,SAAS,KAAK;AACZ,iBAAY,IAAc,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,OAAO,QACV,QAAQ,aAAa,EACrB,YAAY,yDAAyD,EACrE,OAAO,CAAC,SAAkB;AACzB,UAAM,cAAc,QAAQ,kBAAkB;AAC9C,UAAM,SAAS,WAAW,WAAW;AACrC,UAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS;AACxE,QAAI,QAAQ,WAAW,GAAG;AACxB,gBAAU,YAAY,WAAW,oBAAoB;AACrD;AAAA,IACF;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,WACG,QAAQ,WAAW,QAAQ,kBAAkB,QAAQ,aACtD,OAAO,UAAU,UACjB;AACA,gBAAQ,IAAI,GAAG,GAAG,OAAO;AAAA,MAC3B,WAAW,QAAQ,sBAAsB,MAAM,QAAQ,KAAK,GAAG;AAC7D,gBAAQ,IAAI,GAAG,GAAG,GAAG;AACrB,mBAAW,KAAK,OAA8D;AAC5E,gBAAM,QAAQ,EAAE,OAAO,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE;AACvD,gBAAM,UAAU,EAAE,aAAa,OAAO,WAAW,oBAAe;AAChE,kBAAQ,IAAI,OAAO,KAAK,KAAK,EAAE,IAAI,IAAI,OAAO,EAAE;AAAA,QAClD;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC1KO,SAAS,oBAAoB,OAAsB;AAExD,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,wFAAwF,EACpG,SAAS,cAAc,WAAW,EAClC;AAAA,IACC;AAAA,MACE,OAAO,UAAkB,OAAgB,QAAiB;AACxD,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAE5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,aAAa,mBAAmB,QAAQ,CAAC;AAAA,QAC3C;AACA,uBAAe,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,KAAK,EACb,YAAY,+DAA+D,EAC3E,SAAS,cAAc,WAAW,EAClC,SAAS,cAAc,gBAAgB,EACvC;AAAA,IACC;AAAA,MACE,OACE,UACA,UACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAE5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,aAAa,mBAAmB,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC;AAAA,QACjF;AACA,uBAAe,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,KAAK,EACb,QAAQ,6BAA6B,EACrC;AAAA,IACC;AAAA,EAGF,EACC,SAAS,cAAc,WAAW,EAClC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OACE,UACA,MACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,QAAQ,CAAC;AAAA,UACzC;AAAA,QACF;AACA,qBAAa,mBAAmB;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,MAChB,QAAQ,QAAQ,EAChB,QAAQ,0CAA0C,EAClD;AAAA,IACC;AAAA,EAGF,EACC,SAAS,cAAc,WAAW,EAClC,SAAS,cAAc,gBAAgB,EACvC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OACE,UACA,UACA,MACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC;AAAA,UAC/E;AAAA,QACF;AACA,qBAAa,oBAAoB;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,QAAQ,EAChB,YAAY,gDAAgD,EAC5D,SAAS,cAAc,WAAW,EAClC,SAAS,cAAc,gBAAgB,EACvC;AAAA,IACC;AAAA,MACE,OACE,UACA,UACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAE/B,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC;AAAA,QACjF;AACA,qBAAa,oBAAoB;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AACH;AAEO,SAAS,wBAAwB,aAA4B;AAClE,QAAM,QAAQ,YACX,QAAQ,OAAO,EACf,YAAY,0BAA0B;AAEzC,sBAAoB,KAAK;AAC3B;;;AClNO,SAAS,wBAAwBC,UAAwB;AAC9D,QAAM,WAAWA,SACd,QAAQ,UAAU,EAClB,YAAY,yBAAyB;AAGxC,QAAM,OAAO,SACV,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,sBAAsB,qCAAqC,EAClE,OAAO,eAAe,uBAAuB,EAC7C,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,kBAAkB,+CAA+C,EACxE,OAAO,oBAAoB,0CAA0C,EACrE,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,uBAAuB,+BAA+B,EAC7D,OAAO,eAAe,wCAAwC,QAAQ,EACtE,OAAO,gBAAgB,yBAAyB,QAAQ,EACxD,OAAO,sBAAsB,wBAAwB,EACrD,OAAO,WAAW,iCAAiC,EACnD,OAAO,gBAAgB,oDAAoD,EAC3E,OAAO,gBAAgB,qCAAqC,EAC5D;AAAA,IACC,iBAAiB,OAAO,MAA+B,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,SAAiC,CAAC;AAExC,UAAI,KAAK,KAAM,QAAO,OAAO,OAAO,KAAK,IAAI;AAC7C,UAAI,KAAK,UAAW,QAAO,YAAY,OAAO,KAAK,SAAS;AAC5D,UAAI,KAAK,MAAO,QAAO,IAAI,OAAO,KAAK,KAAK;AAC5C,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,UAAI,KAAK,OAAQ,QAAO,SAAS,OAAO,KAAK,MAAM;AACnD,UAAI,KAAK,SAAU,QAAO,WAAW,OAAO,KAAK,QAAQ;AACzD,UAAI,KAAK,OAAQ,QAAO,cAAc,OAAO,KAAK,MAAM;AACxD,UAAI,KAAK,UAAW,QAAO,YAAY,OAAO,KAAK,SAAS;AAC5D,UAAI,KAAK,UAAU,OAAW,QAAO,QAAQ,OAAO,KAAK,KAAK;AAC9D,UAAI,KAAK,WAAW,OAAW,QAAO,SAAS,OAAO,KAAK,MAAM;AACjE,UAAI,KAAK,QAAS,QAAO,UAAU,OAAO,KAAK,OAAO;AACtD,UAAI,KAAK,SAAS,KAAK,UAAW,QAAO,QAAQ;AACjD,UAAI,KAAK,UAAW,QAAO,QAAQ;AACnC,UAAI,KAAK,UAAW,QAAO,UAAU;AAErC,YAAM,WAAW,MAAM,OAAO,IAAI,aAAa,MAAM;AACrD,UAAI,KAAK,WAAW;AAClB,mBAAW,SAAS,SAAS,CAAC;AAAA,MAChC,OAAO;AACL,uBAAe,UAAU,QAAQ,CAAC,CAAC,KAAK,KAAK;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,SAAS,QAAQ,WAAW,EAC5B,OAAO,gBAAgB,qCAAqC,EAC5D;AAAA,IACC,iBAAiB,OAAO,IAAY,MAA+B,QAAiB;AAClF,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,WAAW;AAClB,eAAO,UAAU;AAAA,MACnB;AAEA,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,aAAa,mBAAmB,EAAE,CAAC;AAAA,QACnC;AAAA,MACF;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,QAAQ,EAChB,QAAQ,qBAAqB,EAC7B;AAAA,IACC;AAAA,EAOF,EACC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC,iBAAiB,OAAO,MAA0B,OAAgB,QAAiB;AACjF,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,YAAM,OAAO,KAAK,aAAa,IAAI;AACnC,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,QAAQ,EAChB,QAAQ,wCAAwC,EAChD;AAAA,IACC;AAAA,EAGF,EACC,SAAS,QAAQ,WAAW,EAC5B,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OAAO,IAAY,MAA0B,OAAgB,QAAiB;AAC5E,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,EAAE,CAAC;AAAA,UACnC;AAAA,QACF;AACA,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,SACb,QAAQ,SAAS,EACjB,QAAQ,2CAA2C,EACnD;AAAA,IACC;AAAA,EAGF,EACC,SAAS,QAAQ,WAAW,EAC5B,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OAAO,IAAY,MAA0B,OAAgB,QAAiB;AAC5E,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,EAAE,CAAC;AAAA,UACnC;AAAA,QACF;AACA,qBAAa,kBAAkB;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC,iBAAiB,OAAO,MAA0B,OAAgB,QAAiB;AACjF,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,YAAM,OAAO,KAAK,4BAA4B,IAAI;AAClD,mBAAa,kBAAkB;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE,SAAS,QAAQ,WAAW,EAC5B;AAAA,IACC,iBAAiB,OAAO,IAAY,OAAgB,QAAiB;AACnE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO,OAAO,aAAa,mBAAmB,EAAE,CAAC,EAAE;AACzD,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,0BAAwB,QAAQ;AAClC;;;ACnVO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,kBAAkB,EAC1B,MAAM,OAAO,EACb,YAAY,sCAAsC;AAGrD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,QAAQ,uBAAuB,EAC/B;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,QAAQ,uBAAuB,EAC/B;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,QAAQ,gCAAgC,EACxC;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,eAAe,EACvB,QAAQ,6BAA6B,EACrC;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,MACX,QAAQ,cAAc,EACtB,QAAQ,2CAA2C,EACnD;AAAA,IACC;AAAA,EAOF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,2BAA2B,IAAI;AAClE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,MACX,QAAQ,cAAc,EACtB,QAAQ,4BAA4B,EACpC;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,2BAA2B,IAAI;AAClE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AClNO,SAAS,6BAA6BC,UAAwB;AACnE,QAAM,gBAAgBA,SACnB,QAAQ,eAAe,EACvB,MAAM,KAAK,EACX,YAAY,8BAA8B;AAG7C,QAAM,OAAO,cACV,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,OAAO,eAAe,6BAA6B,QAAQ,EAC3D,OAAO,gBAAgB,kBAAkB,QAAQ,EACjD,OAAO,WAAW,iCAAiC,EACnD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,UAAU,IAAI,KAAK;AAEzB,YAAM,SAAiC,CAAC;AACxC,UAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,UAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAC1E,UAAI,QAAQ,MAAO,QAAO,OAAO,IAAI;AAErC,YAAM,WAAW,MAAM,OAAO,IAAI,kBAAkB,MAAM;AAC1D,qBAAe,UAAU,QAAQ,CAAC,CAAC,QAAQ,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,UAAU,EAClB,YAAY,6FAA6F,EACzG;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,cACZ,QAAQ,eAAe,EACvB,QAAQ,uBAAuB,EAC/B;AAAA,IACC;AAAA,EAQF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,kBAAkB,IAAI;AACzD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,cACZ,QAAQ,oBAAoB,EAC5B,QAAQ,uBAAuB,EAC/B;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UAChD;AAAA,QACF;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,uBAAuB;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,aAAa,EACrB,YAAY,kDAAkD,EAC9D;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO;AAAA,QACX,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACtLO,SAAS,6BAA6BC,UAAwB;AACnE,QAAM,gBAAgBA,SACnB,QAAQ,eAAe,EACvB,MAAM,KAAK,EACX,YAAY,8BAA8B;AAG7C,QAAM,OAAO,cACV,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,OAAO,eAAe,6BAA6B,QAAQ,EAC3D,OAAO,gBAAgB,kBAAkB,QAAQ,EACjD,OAAO,WAAW,iCAAiC,EACnD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,UAAU,IAAI,KAAK;AAEzB,YAAM,SAAiC,CAAC;AACxC,UAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,UAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAC1E,UAAI,QAAQ,MAAO,QAAO,OAAO,IAAI;AAErC,YAAM,WAAW,MAAM,OAAO,IAAI,yBAAyB,MAAM;AACjE,qBAAe,UAAU,QAAQ,CAAC,CAAC,QAAQ,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,UAAU,EAClB,YAAY,gFAAgF,EAC5F;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,yBAAyB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACzD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,cACZ,QAAQ,eAAe,EACvB,QAAQ,uBAAuB,EAC/B;AAAA,IACC;AAAA,EAOF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,yBAAyB,IAAI;AAChE,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,YAAY,cACf,QAAQ,oBAAoB,EAC5B,YAAY,uBAAuB,EACnC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,yBAAyB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACvD;AAAA,QACF;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,uBAAuB;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,WAAW;AAAA,IACrB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,aAAa,EACrB,YAAY,sDAAsD,EAClE;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO;AAAA,QACX,yBAAyB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACzD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AACH;;;AC9KO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,4EAA4E;AAG3F,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,sDAAsD,EAClE;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO,IAAI,QAAQ;AAC1C,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,gBAAgB,EACxB,YAAY,wDAAwD,EACpE;AAAA,IACC;AAAA,MACE,OAAO,UAAmB,OAAgB,QAAiB;AACzD,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAE5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,UAAU,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,QAChD;AACA,uBAAe,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC5DA,SAAS,uBAAuB,KAAuB;AACrD,SAAO,IACJ,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,eAAe,uBAAuB,EAC7C,OAAO,kBAAkB,+CAA+C,EACxE,OAAO,oBAAoB,0CAA0C,EACrE,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,oBAAoB,gDAAgD,EAC3E,OAAO,oBAAoB,sCAAsC,EACjE,OAAO,wBAAwB,oCAAoC,EACnE,OAAO,gBAAgB,iCAAiC,QAAQ,EAChE,OAAO,eAAe,wCAAwC,QAAQ,EACtE,OAAO,gBAAgB,yBAAyB,QAAQ,EACxD,OAAO,WAAW,iCAAiC;AACxD;AAEA,SAAS,mBAAmB;AAC1B,SAAO,iBAAiB,OAAO,OAAgB,QAAiB;AAC9D,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,SAAiC,CAAC;AAExC,QAAI,QAAQ,KAAM,QAAO,MAAM,IAAI,QAAQ;AAC3C,QAAI,QAAQ,MAAO,QAAO,OAAO,IAAI,QAAQ;AAC7C,QAAI,QAAQ,MAAO,QAAO,GAAG,IAAI,QAAQ;AACzC,QAAI,QAAQ,OAAQ,QAAO,QAAQ,IAAI,QAAQ;AAC/C,QAAI,QAAQ,SAAU,QAAO,UAAU,IAAI,QAAQ;AACnD,QAAI,QAAQ,OAAQ,QAAO,aAAa,IAAI,QAAQ;AACpD,QAAI,QAAQ,QAAS,QAAO,SAAS,IAAI,QAAQ;AACjD,QAAI,QAAQ,OAAQ,QAAO,QAAQ,IAAI,QAAQ;AAC/C,QAAI,QAAQ,UAAW,QAAO,WAAW,IAAI,QAAQ;AACrD,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,QAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAC1E,QAAI,QAAQ,MAAO,QAAO,OAAO,IAAI;AAErC,UAAM,WAAW,MAAM,OAAO,IAAI,sBAAsB,MAAM;AAC9D,mBAAe,UAAU,QAAQ,QAAQ,KAAK;AAAA,EAChD,CAAC;AACH;AAEA,SAAS,sBAAsB,KAAuB;AACpD,SAAO,IACJ,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,oBAAoB,gDAAgD,EAC3E,OAAO,oBAAoB,sCAAsC,EACjE,OAAO,wBAAwB,oCAAoC,EACnE,OAAO,gBAAgB,iCAAiC,QAAQ;AACrE;AAEA,SAAS,kBAAkB;AACzB,SAAO,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AAC3E,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,SAAiC,CAAC;AAExC,QAAI,QAAQ,MAAO,QAAO,OAAO,IAAI,QAAQ;AAC7C,QAAI,QAAQ,QAAS,QAAO,SAAS,IAAI,QAAQ;AACjD,QAAI,QAAQ,OAAQ,QAAO,QAAQ,IAAI,QAAQ;AAC/C,QAAI,QAAQ,UAAW,QAAO,WAAW,IAAI,QAAQ;AACrD,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AAEvE,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B,sBAAsB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACpD;AAAA,IACF;AACA,mBAAe,UAAU,MAAM;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,qBAAqB;AAC5B,SAAO,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AAC7E,UAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,UAAM,SAAS,aAAa,GAAG;AAE/B,UAAM,OAAO,KAAK,sBAAsB,IAAI;AAC5C,iBAAa,0BAA0B;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,qBAAqB;AAC5B,SAAO,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AAC3E,UAAM,SAAS,aAAa,GAAG;AAE/B,UAAM,OAAO;AAAA,MACX,sBAAsB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,IACtD;AACA,iBAAa,0BAA0B;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,oBAAoB;AAC3B,SAAO,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AAC7E,UAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,SAAiC,CAAC;AAExC,QAAI,QAAQ,YAAa,QAAO,aAAa,IAAI,QAAQ;AACzD,QAAI,QAAQ,WAAY,QAAO,oBAAoB,IAAI,QAAQ;AAE/D,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,mBAAe,UAAU,MAAM;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,SAAO,IACJ,OAAO,4BAA4B,2CAA2C,EAC9E,OAAO,0BAA0B,gCAAgC;AACtE;AAEO,SAAS,wBAAwBC,UAAwB;AAC9D,QAAM,WAAWA,SACd,QAAQ,UAAU,EAClB,YAAY,0BAA0B;AAEzC,QAAM,WAAW,SACd,QAAQ,UAAU,EAClB,YAAY,iDAAiD;AAEhE,QAAM,mBAAmB,SACtB,QAAQ,kBAAkB,EAC1B,YAAY,+CAA+C;AAG9D,QAAM,eAAe;AAAA,IACnB,SAAS,QAAQ,MAAM,EAAE,YAAY,8CAA8C;AAAA,EACrF;AACA,eAAa,OAAO,iBAAiB,CAAC;AAEtC,cAAY,cAAc;AAAA,IACxB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,cAAc;AAAA,IAClB,SAAS,QAAQ,UAAU,EAAE,YAAY,6BAA6B;AAAA,EACxE;AACA,cAAY,OAAO,gBAAgB,CAAC;AAEpC,cAAY,aAAa;AAAA,IACvB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,eAAe,EACvB,QAAQ,0BAA0B,EAClC;AAAA,IACC;AAAA,EAGF,EACC,OAAO,mBAAmB,CAAC;AAE9B,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,aAAa,EACrB,YAAY,gEAAgE,EAC5E,OAAO,mBAAmB,CAAC;AAE9B,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW;AAAA,IACf,iBAAiB,QAAQ,cAAc,EAAE,YAAY,gCAAgC;AAAA,EACvF;AACA,WAAS,OAAO,kBAAkB,CAAC;AAEnC,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD;AAAA,IACE,SACG,QAAQ,QAAQ,EAAE,QAAQ,KAAK,CAAC,EAChC,YAAY,iEAAiE;AAAA,EAClF,EAAE,OAAO,iBAAiB,CAAC;AAE3B;AAAA,IACE,SACG,QAAQ,YAAY,EAAE,QAAQ,KAAK,CAAC,EACpC,YAAY,+DAA+D;AAAA,EAChF,EAAE,OAAO,gBAAgB,CAAC;AAE1B,WACG,QAAQ,iBAAiB,EAAE,QAAQ,KAAK,CAAC,EACzC,YAAY,qEAAqE,EACjF,OAAO,mBAAmB,CAAC;AAE9B,WACG,QAAQ,eAAe,EAAE,QAAQ,KAAK,CAAC,EACvC,YAAY,qEAAqE,EACjF,OAAO,mBAAmB,CAAC;AAE9B;AAAA,IACE,SACG,QAAQ,gBAAgB,EAAE,QAAQ,KAAK,CAAC,EACxC,YAAY,2EAA2E;AAAA,EAC5F,EAAE,OAAO,kBAAkB,CAAC;AAC9B;;;AC/QO,SAAS,yBAAyBC,UAAwB;AAC/D,QAAM,YAAYA,SACf,QAAQ,WAAW,EACnB,YAAY,sEAAsE;AAGrF,QAAM,OAAO,UACV,QAAQ,MAAM,EACd,YAAY,qEAAqE,EACjF,OAAO,eAAe,yCAAyC,QAAQ,EACvE,OAAO,gBAAgB,0BAA0B,QAAQ,EACzD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,UAAU,IAAI,KAAK;AAEzB,YAAM,SAAiC,CAAC;AAExC,UAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,UAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAE1E,YAAM,WAAW,MAAM,OAAO,IAAI,cAAc,MAAM;AACtD,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,UACT,QAAQ,UAAU,EAClB,YAAY,2EAA2E,EACvF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,UACZ,QAAQ,QAAQ,EAChB,YAAY,4DAA4D,EACxE;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO,KAAK,YAAY;AAC9B,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,UACT,QAAQ,aAAa,EACrB,YAAY,+CAA+C,EAC3D;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO;AAAA,QACX,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,UACX,QAAQ,YAAY,EACpB,YAAY,iEAAiE,EAC7E;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C;AACA,UAAI,SAAS,SAAS,UAAa,SAAS,SAAS,IAAI;AACvD,uBAAe,UAAU,MAAM;AAAA,MACjC,OAAO;AACL,qBAAa,kBAAkB;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAEF,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC7JO,SAAS,uBAAuB,QAAuB;AAC5D,QAAM,UAAU,OACb,QAAQ,SAAS,EACjB,YAAY,gBAAgB;AAG/B,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,0EAA0E,EACtF;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,gBAAgB;AAChE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,QACT,QAAQ,UAAU,EAClB,YAAY,4EAAuE,EACnF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,eAAe,EACvB,QAAQ,qBAAqB,EAC7B;AAAA,IACC;AAAA,EAMF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,kBAAkB;AAAA,QACjE;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,oBAAoB,EAC5B,QAAQ,iBAAiB,EACzB;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAQ,MAAM,eAAe,IAA0B;AAC7D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UAChD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,QACT,QAAQ,aAAa,EACrB,YAAY,uFAAuF,EACnG;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,QACd,QAAQ,eAAe,EACvB,YAAY,2DAA2D,EACvE;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,QAChB,QAAQ,iBAAiB,EACzB,YAAY,8EAA8E,EAC1F;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,qBAAqB;AAAA,IACpC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC9NO,SAAS,qBAAqB,QAAuB;AAC1D,QAAM,QAAQ,OACX,QAAQ,OAAO,EACf,YAAY,cAAc;AAG7B,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,gEAAgE,EAC5E;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,cAAc;AAC9D,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,UAAU,EAClB,YAAY,4EAAuE,EACnF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,QAAQ,mBAAmB,EAC3B;AAAA,IACC;AAAA,EAUF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,gBAAgB;AAAA,QAC/D;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,oBAAoB,EAC5B,QAAQ,eAAe,EACvB;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UAC9C,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,eAAe;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,aAAa,EACrB,YAAY,iFAAiF,EAC7F;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,MACd,QAAQ,eAAe,EACvB,YAAY,qEAAqE,EACjF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,MAChB,QAAQ,iBAAiB,EACzB,YAAY,+DAA+D,EAC3E;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,aAAa,EACrB,YAAY,6EAA6E,EACzF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,gBAAgB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AChPO,SAAS,wBAAwB,QAAuB;AAC7D,QAAM,WAAW,OACd,QAAQ,UAAU,EAClB,YAAY,sCAAsC;AAGrD,QAAM,OAAO,SACV,QAAQ,MAAM,EACd,YAAY,qEAAqE,EACjF;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,iBAAiB;AACjE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,UAAU,EAClB,YAAY,+EAA0E,EACtF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,eAAe,EACvB,QAAQ,qBAAqB,EAC7B;AAAA,IACC;AAAA,EA2BF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,mBAAmB;AAAA,QAClE;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,oBAAoB,EAC5B,QAAQ,iBAAiB,EACzB;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACjD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,aAAa,EACrB,YAAY,4FAA4F,EACxG;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,SACd,QAAQ,eAAe,EACvB,YAAY,4DAA4D,EACxE;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,SAChB,QAAQ,iBAAiB,EACzB,YAAY,+DAA+D,EAC3E;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,mBAAa,qBAAqB;AAAA,IACpC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACvOO,SAAS,4BAA4B,QAAuB;AACjE,QAAM,eAAe,OAClB,QAAQ,eAAe,EACvB,YAAY,sBAAsB;AAGrC,QAAM,OAAO,aACV,QAAQ,MAAM,EACd,YAAY,4DAA4D,EACxE;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,sBAAsB;AACtE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,aACT,QAAQ,UAAU,EAClB,YAAY,iFAA4E,EACxF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,wBAAwB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACxD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,aACZ,QAAQ,eAAe,EACvB,QAAQ,2BAA2B,EACnC;AAAA,IACC;AAAA,EAMF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,wBAAwB;AAAA,QACvE;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,aACZ,QAAQ,oBAAoB,EAC5B,QAAQ,wBAAwB,EAChC;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,wBAAwB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACtD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,uBAAuB;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,aACT,QAAQ,aAAa,EACrB,YAAY,mFAAmF,EAC/F;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,wBAAwB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACxD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEO,SAAS,qBAAqB,QAAuB;AAC1D,QAAM,QAAQ,OACX,QAAQ,OAAO,EACf,YAAY,4EAA4E;AAG3F,QAAM,WAAW,MACd,QAAQ,KAAK,EACb,YAAY,8EAA8E,EAC1F;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,cAAc;AAC9D,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,MACd,QAAQ,YAAY,EACpB,QAAQ,yBAAyB,EACjC;AAAA,IACC;AAAA,EAMF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,gBAAgB;AAAA,QAC9D;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,0BAA0B;AAAA,IACzC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,MACjB,QAAQ,QAAQ,EAChB,YAAY,qFAAqF,EACjG;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO,WAAW,UAAU,cAAc;AAChD,mBAAa,8BAA8B;AAAA,IAC7C,CAAC;AAAA,EACH;AAEF,cAAY,aAAa;AAAA,IACvB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACjPA,SAASC,iBAAgB,MAAwB;AAC/C,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAIA,gBAAe;AACxD,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,MAAM,EAAE,GAAI,KAAiC;AACnD,MAAI,IAAI,QAAQ,SAAU,QAAO,IAAI;AACrC,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAe,MAAqC;AAE3E,MAAI,KAAK,YAAY,QAAW;AAC9B,UAAM,UAAU,OAAO,KAAK,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC3F,QAAI,QAAQ,WAAW,GAAG;AACxB,iBAAW,4EAA4E;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO,SAAS,YAAY,oBAAqB,MAAkC;AAC7F,UAAM,UAAW,KAAiC;AAClD,QAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,OAAO,CAAC,MAAe,OAAO,MAAM,YAAY,EAAE,KAAK,MAAM,EAAE,EAAE,WAAW,GAAG;AACnH,iBAAW,4EAA4E;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAwD;AAClF,QAAM,UAAmC,CAAC;AAC1C,MAAI,KAAK,KAAM,SAAQ,OAAO,KAAK;AACnC,MAAI,KAAK,OAAQ,SAAQ,WAAW,KAAK;AACzC,MAAI,KAAK,QAAS,SAAQ,iBAAkB,KAAK,QAAmB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC1H,MAAI,KAAK,WAAW;AAClB,UAAM,MAAM,OAAO,KAAK,SAAS,EAAE,KAAK;AACxC,QAAI,CAAC,QAAQ,KAAK,GAAG,GAAG;AACtB,iBAAW,0CAA0C;AACrD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAY,OAAO,GAAG;AAC5B,QAAI,aAAa,GAAG;AAClB,iBAAW,0CAA0C;AACrD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,YAAY,EAAE,UAAU;AAAA,EAClC;AACA,MAAI,KAAK,iBAAiB,OAAW,SAAQ,eAAe,KAAK;AACjE,MAAI,KAAK,SAAU,SAAQ,WAAW,KAAK;AAC3C,SAAO;AACT;AAGA,SAASC,eACP,MACA,KACS;AACT,QAAM,aAAa,eAAe,GAAG;AACrC,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,KAAK;AACR,eAAW,uEAAuE;AAClF,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,WAAW,WAAW,OAAO;AAC5C,WAAO,SAAS;AAChB,eAAW,QAAQ,WAAW,OAAO;AACrC,YAAQ,MAAM,uEAAuE;AACrF,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,eAAW,qCAAqC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAClG,mBAAe,GAAG;AAClB,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AACF;AAGA,SAASC,eACP,MACA,MACA,KACS;AACT,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,KAAK;AACR,eAAW,+DAA+D;AAC1E,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AACA,MAAI,KAAM,QAAOD,eAAc,MAAM,GAAG;AACxC,iBAAe,GAAG;AAClB,SAAO;AACT;AAEO,SAAS,uBAAuB,QAAuB;AAC5D,QAAM,UAAU,OACb,QAAQ,UAAU,EAClB,YAAY,iBAAiB;AAGhC,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,qFAAqF,EACjG,OAAO,oBAAoB,qBAAqB,EAChD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,OAAO,IAAI,KAAK;AACtB,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,SAAU,QAAO,WAAW,KAAK;AAC1C,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,mBAAmB;AAAA,QACjE;AAAA,MACF,CAAC;AACD,eAAS,OAAOD,iBAAgB,SAAS,IAAI;AAC7C,qBAAe,UAAU,MAAM;AAC/B,cAAQ,MAAM,oMAAwD;AAAA,IACxE,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,QACT,QAAQ,aAAa,EACrB,YAAY,sGAAiG,EAC7G;AAAA,IACC,iBAAiB,OAAO,OAAgB,OAAgB,QAAiB;AACvE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,mBAAmB,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,MACtD;AACA,eAAS,OAAOA,iBAAgB,SAAS,IAAI;AAC7C,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,eAAe,EACvB,YAAY,sBAAsB,EAClC,OAAO,iBAAiB,UAAU,EAClC,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,oBAAoB,uBAAuB,EAClD,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,oBAAoB,WAAW,EACtC,OAAO,UAAU,oCAAoC,EACrD;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,IAAI,KAAK;AAUtB,sBAAgB,QAAW,IAAI;AAE/B,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,QAAQ,KAAK,UAAU,KAAK,WAAW,KAAK,aAAa,KAAK,iBAAiB,UAAa,KAAK,UAAU;AACzH,eAAO,mBAAmB,IAAI;AAAA,MAChC,OAAO;AACL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAEA,sBAAgB,MAAM,CAAC,CAAC;AAExB,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,mBAAmB;AAAA,QAClE;AAAA,MACF,CAAC;AACD,YAAM,OAAO,SAAS;AACtB,YAAM,KAAKE,eAAc,MAAM,CAAC,CAAC,KAAK,MAAM,GAAG;AAE/C,qBAAe,UAAU,MAAM;AAC/B,UAAI,GAAI,SAAQ,MAAM,kBAAkB;AAAA,IAC1C,CAAC;AAAA,EACH;AAEF,WAAS,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,QACb,QAAQ,iBAAiB,EACzB,YAAY,8DAAyD,EACrE,OAAO,UAAU,wCAAwC,EACzD;AAAA,IACC,iBAAiB,OAAO,OAAgB,OAAgB,QAAiB;AACvE,YAAM,OAAO,IAAI,KAAK;AACtB,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,mBAAmB,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,MACtD;AAEA,YAAM,OAAO,SAAS;AACtB,YAAM,KAAKA,eAAc,MAAM,CAAC,CAAC,KAAK,MAAM,GAAG;AAE/C,qBAAe,UAAU,MAAM;AAC/B,UAAI,GAAI,SAAQ,MAAM,oBAAoB;AAAA,IAC5C,CAAC;AAAA,EACH;AAEF,WAAS,SAAS;AAAA,IAChB;AAAA,IACA;AAAA,EACF,CAAC;AAED,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,uBAAuB,EAC/B,YAAY,mBAAmB,EAC/B,OAAO,iBAAiB,UAAU,EAClC,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,oBAAoB,uBAAuB,EAClD,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,sBAAsB,4BAA4B,EACzD;AAAA,IACC;AAAA,MACE,OAAO,OAAgB,MAAe,OAAgB,QAAiB;AACrE,cAAM,OAAO,IAAI,KAAK;AAQtB,wBAAgB,QAAW,IAAI;AAE/B,YAAI;AACJ,YAAI,MAAM;AACR,iBAAO,MAAM,eAAe,IAA0B;AAAA,QACxD,WAAW,KAAK,QAAQ,KAAK,UAAU,KAAK,WAAW,KAAK,aAAa,KAAK,iBAAiB,QAAW;AACxG,iBAAO,mBAAmB,IAAI;AAAA,QAChC,OAAO;AACL,iBAAO,MAAM,eAAe;AAAA,QAC9B;AAEA,wBAAgB,MAAM,CAAC,CAAC;AAExB,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,mBAAmB,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,UACpD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,gBAAQ,MAAM,kBAAkB;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEF,WAAS,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,QACT,QAAQ,gBAAgB,EACxB,YAAY,6EAA6E,EACzF;AAAA,IACC,iBAAiB,OAAO,OAAgB,OAAgB,QAAiB;AACvE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,mBAAmB,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,MACtD;AACA,cAAQ,MAAM,kBAAkB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC3WO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,wBAAwB;AAEvC,yBAAuB,KAAK;AAC5B,uBAAqB,KAAK;AAC1B,0BAAwB,KAAK;AAC7B,8BAA4B,KAAK;AACjC,yBAAuB,KAAK;AAC5B,uBAAqB,KAAK;AAC5B;;;ACZO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,wEAAwE;AAGvF,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,oDAAoD,EAChE;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,QAAQ;AACxD,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,UAAU,EAClB,YAAY,wEAAwE,EACpF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,QAAQ,mBAAmB,EAC3B;AAAA,IACC;AAAA,EAQF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,UAAU,EAAE,KAAK,CAAC;AACnE,qBAAe,UAAU,MAAM;AAC/B,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,oBAAoB,EAC5B,QAAQ,eAAe,EACvB;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACxC,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,eAAe;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,aAAa,EACrB,YAAY,mDAAmD,EAC/D;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,MACd,QAAQ,eAAe,EACvB,YAAY,qEAAqE,EACjF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,MAChB,QAAQ,iBAAiB,EACzB,YAAY,8EAA8E,EAC1F;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACtNO,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,SAASA,SACZ,QAAQ,oBAAoB,EAC5B,MAAM,QAAQ,EACd,YAAY,oFAAoF;AAGnG,QAAM,OAAO,OACV,QAAQ,MAAM,EACd,YAAY,wDAAwD,EACpE;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,qBAAqB;AACrE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,OACT,QAAQ,UAAU,EAClB,YAAY,+EAA+E,EAC3F;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,uBAAuB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACvD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,OACZ,QAAQ,eAAe,EACvB,QAAQ,oBAAoB,EAC5B;AAAA,IACC;AAAA,EAUF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,uBAAuB,EAAE,KAAK,CAAC;AAChF,qBAAe,UAAU,MAAM;AAC/B,mBAAa,gBAAgB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,OACZ,QAAQ,oBAAoB,EAC5B,QAAQ,gBAAgB,EACxB;AAAA,IACC;AAAA,EAGF,EACC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,uBAAuB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACrD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,gBAAgB;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,OACT,QAAQ,aAAa,EACrB,YAAY,oEAAoE,EAChF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,uBAAuB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACvD;AACA,mBAAa,gBAAgB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACvKO,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,UAAUA,SACb,QAAQ,SAAS,EACjB,YAAY,yEAAyE;AAGxF,QAAM,MAAM,QACT,QAAQ,KAAK,EACb,YAAY,gFAAgF,EAC5F;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,UAAU;AAC1D,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,QACd,QAAQ,UAAU,EAClB,YAAY,8DAA8D;AAG7E,QAAM,eAAe,SAClB,QAAQ,MAAM,EACd,YAAY,4CAA4C,EACxD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,mBAAmB;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,cAAc;AAAA,IACxB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,SACjB,QAAQ,UAAU,EAClB,YAAY,4EAA4E,EACxF;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,qBAAqB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACrD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,aAAa;AAAA,IACvB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,SACpB,QAAQ,aAAa,EACrB,YAAY,gFAAgF,EAC5F;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,qBAAqB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACrD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,gBAAgB;AAAA,IAC1B;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACnHA,SAAS,qBAAqB;AAWvB,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,SAASA,SACZ,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,SAAS;AACzD,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEO,SAAS,uBAAuBA,UAAwB;AAC7D,QAAM,UAAUA,SACb,QAAQ,SAAS,EACjB,YAAY,iDAAiD,EAC7D;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,YAAM,MAAMA,SAAQ,iBAAiB;AACrC,YAAM,aAAa,IAAI;AAEvB,gBAAU,gBAAgB,UAAU,EAAE;AAEtC,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,UAAU;AAC1D,gBAAU,iBAAiB;AAC3B,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACxEA,SAAS,gBAAgB;AACzB,SAAS,iBAAAC,sBAAqB;AAM9B,SAAS,WACP,KACAC,UACA,MACoB;AACpB,SACE,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,IAAI,KAC3DA,SAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,IAAI;AAEnE;AAEA,SAAS,iBACP,KACAA,UACA,MACS;AACT,QAAM,MAAM,WAAW,KAAKA,UAAS,IAAI;AACzC,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,CAAC,EAAE,IAAI,YAAY,IAAI;AAChC;AAEA,SAAS,eAAe,KAAc,MAAmC;AACvE,SAAO,IAAI,SAAS;AAAA,IAClB,CAAC,MAAM,EAAE,KAAK,MAAM,QAAQ,EAAE,QAAQ,EAAE,SAAS,IAAI;AAAA,EACvD;AACF;AAEO,SAAS,oBACdA,UACA,MACA,OACU;AACV,QAAM,YAAY,KAAK,MAAM,GAAG,KAAK;AACrC,QAAM,SAAS,UAAU,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AAC3D,QAAM,kBAAkB,MAAM,KAAK,SAAS;AAG5C,QAAM,UACJ,CAAC,mBAAmB,OAAO,SAAS,IAAI,OAAO,OAAO,SAAS,CAAC,IAAI;AAGtE,QAAM,aAAa,kBAAkB,OAAO,MAAM,CAAC,IAAI,OAAO,MAAM,GAAG,EAAE;AAGzE,MAAI,aAAaA;AACjB,MAAI,IAAI;AAER,SAAO,IAAI,WAAW,QAAQ;AAC5B,UAAM,QAAQ,WAAW,CAAC;AAE1B,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,UAAI,iBAAiB,YAAYA,UAAS,KAAK,GAAG;AAChD,aAAK;AAAA,MACP,OAAO;AACL,aAAK;AAAA,MACP;AACA;AAAA,IACF;AAEA,UAAM,MAAM,eAAe,YAAY,KAAK;AAC5C,QAAI,KAAK;AACP,mBAAa;AAAA,IACf;AACA;AAAA,EACF;AAGA,MAAI,WAAW,KAAK,MAAM,UAAU,WAAW,WAAWA,UAAS;AACjE,UAAM,UAAU,WAAW,QAAQ,MAAM;AACzC,UAAM,UAAU,WAAW,MAAM,UAAU,CAAC;AAC5C,UAAM,WAAqB,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,IAAI,QAAQ,CAAC;AACnB,UAAI,EAAE,WAAW,GAAG,GAAG;AACrB,YAAI,iBAAiB,YAAYA,UAAS,CAAC,GAAG;AAC5C;AAAA,QACF;AACA;AAAA,MACF;AACA,eAAS,KAAK,CAAC;AAAA,IACjB;AAEA,QAAI,SAASA;AACb,eAAW,OAAO,UAAU;AAC1B,YAAM,MAAM,eAAe,QAAQ,GAAG;AACtC,UAAI,IAAK,UAAS;AAAA,UACb;AAAA,IACP;AAEA,UAAM,OAAO,OAAO,SACjB,OAAO,CAAC,MAAM,CAAE,EAA4B,OAAO,EACnD,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtB,WAAO,KAAK,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AAAA,EACjD;AAGA,QAAM,cAAc,kBAChB,OAAO,OAAO,SAAS,CAAC,IACxB,OAAO,UAAU,IACf,OAAO,OAAO,SAAS,CAAC,IACxB;AAGN,MACE,eACA,YAAY,WAAW,GAAG,KAC1B,iBAAiB,YAAYA,UAAS,WAAW,GACjD;AACA,WAAO,0BAA0B,aAAa,OAAO;AAAA,EACvD;AAGA,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,WAAO,qBAAqB,YAAYA,UAAS,OAAO;AAAA,EAC1D;AAGA,QAAM,cAAc,WAAW,SAC5B,OAAO,CAAC,MAAM,CAAE,EAA4B,OAAO,EACnD,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAEtB,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AAAA,EACxD;AAGA,aAAW,OAAO,WAAW,qBAAqB;AAChD,QAAI,IAAI,eAAe,IAAI,YAAY,SAAS,OAAO,GAAG;AACxD,aAAO,CAAC,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,qBACP,KACAA,UACA,SACU;AACV,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,OAAO,IAAI,SAAS;AAC7B,QAAI,IAAI,OAAQ;AAChB,QAAI,IAAI,KAAM,SAAQ,IAAI,IAAI,IAAI;AAAA,EACpC;AAEA,aAAW,OAAOA,SAAQ,SAAS;AACjC,QAAI,IAAI,OAAQ;AAChB,QAAI,IAAI,KAAM,SAAQ,IAAI,IAAI,IAAI;AAAA,EACpC;AAEA,SAAO,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AACzD;AAEA,SAAS,0BACP,YACA,SACU;AACV,MAAI,eAAe,cAAc,eAAe,MAAM;AACpD,WAAO,CAAC,QAAQ,SAAS,SAAS,EAAE;AAAA,MAAO,CAAC,MAC1C,EAAE,WAAW,OAAO;AAAA,IACtB;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWnB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYb,SAAS,mBAAmBA,UAAwB;AACzD,QAAM,MAAMA,SACT,QAAQ,KAAK,EACb,QAAQ,sBAAsB,EAC9B,YAAY,iDAAiD;AAEhE,QAAM,cAAc,IACjB,QAAQ,aAAa,EACrB,QAAQ,4BAA4B,EACpC,YAAY,4CAA4C,EACxD,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,mBAAmB,qCAAqC,EAC/D,OAAO,CAAC,SAA4C;AACnD,QAAI,KAAK,SAAS,UAAa,KAAK,UAAU,QAAW;AACvD,YAAM,QAAQ,SAAS,KAAK,OAAO,EAAE;AACrC,YAAM,UAAU,oBAAoBA,UAAS,KAAK,MAAM,KAAK;AAC7D,iBAAW,KAAK,SAAS;AACvB,gBAAQ,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAEH,QAAM,OAAO,YACV,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,YAAQ,IAAI,WAAW;AAAA,EACzB,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,QAAM,MAAM,YACT,QAAQ,KAAK,EACb,YAAY,8BAA8B,EAC1C,OAAO,MAAM;AACZ,YAAQ,IAAI,UAAU;AAAA,EACxB,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,QAAM,UAAU,IACb,QAAQ,SAAS,EACjB,YAAY,6CAA6C,EACzD,OAAO,MAAM;AACZ,UAAMC,WAAUC,eAAc,YAAY,GAAG;AAC7C,UAAM,MAAMD,SAAQ,iBAAiB;AACrC,YAAQ,IAAI,IAAI,OAAO;AAAA,EACzB,CAAC;AAEH,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,SAAS,IACZ,QAAQ,QAAQ,EAChB,YAAY,wEAAwE,EACpF;AAAA,IACC,iBAAiB,UAAU,SAAoB;AAC7C,YAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,YAAM,OAAO,eAAe,GAAG;AAC/B,YAAM,gBAAgB;AACtB,UAAI,KAAK,QAAQ;AACf,kBAAU,aAAa,aAAa,EAAE;AACtC;AAAA,MACF;AACA,gBAAU,oCAAoC;AAC9C,eAAS,eAAe,EAAE,OAAO,UAAU,CAAC;AAC5C,mBAAa,kBAAkB;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AlCpSO,SAAS,gBAAyB;AACvC,QAAME,WAAUC,eAAc,YAAY,GAAG;AAC7C,QAAM,MAAMD,SAAQ,iBAAiB;AACrC,QAAME,WAAU,IAAIC,SAAQ;AAE5B,EAAAD,SACG,KAAK,QAAQ,EACb,YAAY,IAAI,WAAW,EAC3B,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,mBAAmB,sBAAsB,EAChD,OAAO,wBAAwB,qBAAqB,EACpD,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,sBAAsB,qCAAqC,EAClE,OAAO,cAAc,sBAAsB,EAC3C,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,aAAa,qDAAqD;AAE5E,sBAAoBA,QAAO;AAC3B,wBAAsBA,QAAO;AAC7B,uBAAqBA,QAAO;AAC5B,0BAAwBA,QAAO;AAC/B,0BAAwBA,QAAO;AAC/B,uBAAqBA,QAAO;AAC5B,+BAA6BA,QAAO;AACpC,+BAA6BA,QAAO;AACpC,uBAAqBA,QAAO;AAC5B,0BAAwBA,QAAO;AAC/B,2BAAyBA,QAAO;AAChC,uBAAqBA,QAAO;AAC5B,uBAAqBA,QAAO;AAC5B,wBAAsBA,QAAO;AAC7B,yBAAuBA,QAAO;AAC9B,wBAAsBA,QAAO;AAC7B,yBAAuBA,QAAO;AAC9B,qBAAmBA,QAAO;AAG1B,QAAM,cAAc,IAAIC,SAAQ,OAAO,EACpC,YAAY,0BAA0B;AACzC,sBAAoB,WAAW;AAC/B,EAAAD,SAAQ,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC;AAEhD,SAAOA;AACT;;;AmCjEA,SAAS,gBAAAE,eAAc,iBAAAC,sBAAqB;AAC5C,SAAS,QAAAC,aAAY;AACrB,OAAOC,YAAW;AAGlB,IAAM,eAAe;AACrB,IAAM,eAAe,8BAA8B,YAAY;AAC/D,IAAM,oBAAoB,KAAK,KAAK,KAAK;AACzC,IAAM,mBAAmB;AAYzB,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAuB;AAC9B,SAAOC,MAAK,aAAa,GAAG,mBAAmB;AACjD;AAEA,SAAS,kBAA2B;AAClC,MAAI,QAAQ,IAAI,mBAAoB,QAAO;AAC3C,MAAI,CAAC,QAAQ,OAAO,MAAO,QAAO;AAClC,aAAW,UAAU,aAAa;AAChC,QAAI,QAAQ,IAAI,MAAM,EAAG,QAAO;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,YAAgC;AACvC,MAAI;AACF,UAAM,MAAMC,cAAa,aAAa,GAAG,OAAO;AAChD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,OAA0B;AAC3C,MAAI;AACF,oBAAgB;AAChB,IAAAC,eAAc,aAAa,GAAG,KAAK,UAAU,KAAK,GAAG,OAAO;AAAA,EAC9D,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,YAAY,OAAoC;AACvD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,KAAK,IAAI,IAAI,MAAM,aAAa;AACzC;AAEO,SAAS,cAAc,SAAiB,QAAyB;AACtE,QAAM,QAAQ,CAAC,MACb,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3C,QAAM,CAAC,QAAQ,QAAQ,MAAM,IAAI,MAAM,OAAO;AAC9C,QAAM,CAAC,QAAQ,QAAQ,MAAM,IAAI,MAAM,MAAM;AAC7C,MAAI,WAAW,OAAQ,QAAO,SAAS;AACvC,MAAI,WAAW,OAAQ,QAAO,SAAS;AACvC,SAAO,SAAS;AAClB;AAEA,eAAe,qBAA6C;AAC1D,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,cAAc;AAAA,MACpC,QAAQ,YAAY,QAAQ,gBAAgB;AAAA,IAC9C,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,oBAA4B;AACnC,SAAO,QAAQ,IAAI,uBAAuB;AAC5C;AAEO,SAAS,gBAAgB,SAAiB,QAAwB;AACvE,QAAM,UAAU,qBAAqB,OAAO,WAAM,MAAM;AACxD,QAAM,UAAU,OAAOC,OAAM,KAAK,YAAY,YAAY,EAAE,CAAC;AAC7D,QAAM,QAAQ,CAAC,SAAS,OAAO;AAC/B,QAAM,SAAS,KAAK;AAAA,IAClB,GAAG,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE,MAAM;AAAA,EACzC;AACA,QAAM,MAAM,CAAC,SAAiB;AAC5B,UAAM,UAAU,UAAU,IAAI,EAAE;AAChC,WAAO,OAAO,IAAI,OAAO,SAAS,OAAO;AAAA,EAC3C;AACA,QAAM,QAAQ,IAAI,OAAO,MAAM;AAC/B,QAAM,MAAM,SAAI,SAAI,OAAO,SAAS,CAAC,CAAC;AACtC,QAAM,SAAS,SAAI,SAAI,OAAO,SAAS,CAAC,CAAC;AACzC,QAAM,WAAW;AAAA,IACf;AAAA,IACA,WAAM,KAAK;AAAA,IACX,GAAG,MAAM,IAAI,CAAC,MAAM,WAAM,IAAI,CAAC,CAAC,UAAK;AAAA,IACrC,WAAM,KAAK;AAAA,IACX;AAAA,EACF;AACA,SAAOA,OAAM,OAAO,SAAS,KAAK,IAAI,CAAC;AACzC;AAEA,SAAS,UAAU,KAAqB;AAEtC,SAAO,IAAI,QAAQ,mBAAmB,EAAE;AAC1C;AAEA,eAAsB,mBAAsD;AAC1E,MAAI,gBAAgB,EAAG,QAAO;AAE9B,MAAI;AACJ,MAAI;AACF,UAAM,UAAU,IAAI,IAAI,mBAAmB,YAAY,GAAG;AAC1D,UAAM,MAAM,KAAK,MAAMF,cAAa,SAAS,OAAO,CAAC;AAGrD,qBAAiB,IAAI;AAAA,EAEvB,QAAQ;AACN,qBAAiB,kBAAkB;AAAA,EACrC;AAGA,QAAM,QAAQ,UAAU;AAExB,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,QAAI,OAAO,iBAAiB,cAAc,gBAAgB,MAAM,aAAa,GAAG;AAC9E,aAAO,EAAE,gBAAgB,eAAe,MAAM,cAAc;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,MAAM,mBAAmB;AAE/C,YAAU;AAAA,IACR,WAAW,KAAK,IAAI;AAAA,IACpB,eAAe,iBAAiB,OAAO;AAAA,EACzC,CAAC;AAED,MAAI,iBAAiB,cAAc,gBAAgB,aAAa,GAAG;AACjE,WAAO,EAAE,gBAAgB,cAAc;AAAA,EACzC;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,QAAwC;AAC9E,MAAI,CAAC,OAAQ;AACb,QAAM,MAAM,gBAAgB,OAAO,gBAAgB,OAAO,aAAa;AACvE,UAAQ,OAAO,MAAM,OAAO,MAAM,IAAI;AACxC;;;ACrKA,IAAM,qBAAqB,iBAAiB;AAC5C,IAAM,UAAU,cAAc;AAC9B,MAAM,QAAQ,WAAW;AACzB,IAAM,eAAe,MAAM;AAC3B,wBAAwB,YAAY;","names":["createRequire","Command","header","chalk","program","program","onData","onError","readFileSync","createInterface","config","program","program","program","program","program","program","program","program","program","cleanApiKeyData","handleSaveKey","showKeyResult","program","program","program","program","program","require","createRequire","program","require","createRequire","require","createRequire","program","Command","readFileSync","writeFileSync","join","chalk","join","readFileSync","writeFileSync","chalk"]}
|