@okx_ai/okx-trade-cli 1.2.2 → 1.2.3
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 +1423 -218
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../core/src/utils/signature.ts","../../core/src/utils/errors.ts","../../core/src/utils/rate-limiter.ts","../../core/src/client/rest-client.ts","../../core/src/constants.ts","../../core/src/tools/helpers.ts","../../core/src/tools/common.ts","../../core/src/tools/account.ts","../../core/src/tools/algo-trade.ts","../../core/src/tools/audit.ts","../../core/src/tools/bot/grid.ts","../../core/src/tools/bot/dca.ts","../../core/src/tools/bot/index.ts","../../core/src/tools/futures-trade.ts","../../core/src/tools/market.ts","../../core/src/tools/option-trade.ts","../../core/src/tools/spot-trade.ts","../../core/src/tools/swap-trade.ts","../../core/src/tools/index.ts","../../core/src/tools/types.ts","../../core/src/config/toml.ts","../../core/src/config.ts","../../core/src/utils/update-check.ts","../../core/src/utils/logger.ts","../../core/src/setup.ts","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../src/config/loader.ts","../src/tips.ts","../src/commands/client-setup.ts","../src/help.ts","../src/parser.ts","../src/formatter.ts","../src/commands/market.ts","../src/commands/account.ts","../src/commands/spot.ts","../src/commands/swap.ts","../src/commands/futures.ts","../src/commands/option.ts","../src/config/toml.ts","../src/commands/config.ts","../src/commands/bot.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { OkxRestClient, toToolErrorPayload, checkForUpdates, createToolRunner } from \"@agent-tradekit/core\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\n\ndeclare const __GIT_HASH__: string;\n\nconst _require = createRequire(import.meta.url);\nconst CLI_VERSION = (_require(\"../package.json\") as { version: string }).version;\nconst GIT_HASH: string = typeof __GIT_HASH__ !== \"undefined\" ? __GIT_HASH__ : \"dev\";\nimport { loadProfileConfig } from \"./config/loader.js\";\nimport { showFirstRunTips } from \"./tips.js\";\nimport { printHelp } from \"./help.js\";\nimport { parseCli } from \"./parser.js\";\nimport type { CliValues } from \"./parser.js\";\nimport {\n cmdMarketTicker,\n cmdMarketTickers,\n cmdMarketOrderbook,\n cmdMarketCandles,\n cmdMarketInstruments,\n cmdMarketFundingRate,\n cmdMarketMarkPrice,\n cmdMarketTrades,\n cmdMarketIndexTicker,\n cmdMarketIndexCandles,\n cmdMarketPriceLimit,\n cmdMarketOpenInterest,\n} from \"./commands/market.js\";\nimport {\n cmdAccountBalance,\n cmdAccountAssetBalance,\n cmdAccountPositions,\n cmdAccountBills,\n cmdAccountFees,\n cmdAccountConfig,\n cmdAccountSetPositionMode,\n cmdAccountMaxSize,\n cmdAccountMaxAvailSize,\n cmdAccountMaxWithdrawal,\n cmdAccountPositionsHistory,\n cmdAccountTransfer,\n cmdAccountAudit,\n} from \"./commands/account.js\";\nimport {\n cmdSpotOrders,\n cmdSpotPlace,\n cmdSpotCancel,\n cmdSpotFills,\n cmdSpotGet,\n cmdSpotAmend,\n cmdSpotAlgoPlace,\n cmdSpotAlgoAmend,\n cmdSpotAlgoCancel,\n cmdSpotAlgoOrders,\n cmdSpotBatch,\n} from \"./commands/spot.js\";\nimport {\n cmdSwapPositions,\n cmdSwapOrders,\n cmdSwapPlace,\n cmdSwapCancel,\n cmdSwapFills,\n cmdSwapGet,\n cmdSwapClose,\n cmdSwapGetLeverage,\n cmdSwapSetLeverage,\n cmdSwapAlgoPlace,\n cmdSwapAlgoAmend,\n cmdSwapAlgoCancel,\n cmdSwapAlgoOrders,\n cmdSwapAlgoTrailPlace,\n cmdSwapAmend,\n cmdSwapBatch,\n} from \"./commands/swap.js\";\nimport {\n cmdFuturesOrders,\n cmdFuturesPositions,\n cmdFuturesFills,\n cmdFuturesPlace,\n cmdFuturesCancel,\n cmdFuturesGet,\n} from \"./commands/futures.js\";\nimport {\n cmdOptionOrders,\n cmdOptionGet,\n cmdOptionPositions,\n cmdOptionFills,\n cmdOptionInstruments,\n cmdOptionGreeks,\n cmdOptionPlace,\n cmdOptionCancel,\n cmdOptionAmend,\n cmdOptionBatchCancel,\n} from \"./commands/option.js\";\nimport { cmdConfigShow, cmdConfigSet, cmdConfigInit, cmdConfigAddProfile, cmdConfigListProfile, cmdConfigUse } from \"./commands/config.js\";\nimport type { Lang } from \"./commands/config.js\";\nimport {\n cmdSetupClients,\n cmdSetupClient,\n printSetupUsage,\n SUPPORTED_CLIENTS,\n} from \"./commands/client-setup.js\";\nimport type { ClientId } from \"./commands/client-setup.js\";\nimport {\n cmdGridOrders,\n cmdGridDetails,\n cmdGridSubOrders,\n cmdGridCreate,\n cmdGridStop,\n cmdDcaCreate,\n cmdDcaStop,\n cmdDcaOrders,\n cmdDcaDetails,\n cmdDcaSubOrders,\n} from \"./commands/bot.js\";\n\n// Re-export for tests and external consumers\nexport { printHelp } from \"./help.js\";\nexport type { CliValues } from \"./parser.js\";\n\n// ---------------------------------------------------------------------------\n// Command handlers\n// ---------------------------------------------------------------------------\n\nexport function handleConfigCommand(action: string, rest: string[], json: boolean, lang?: string, force?: boolean): Promise<void> | void {\n if (action === \"init\") return cmdConfigInit((lang === \"zh\" ? \"zh\" : \"en\") as Lang);\n if (action === \"show\") return cmdConfigShow(json);\n if (action === \"set\") return cmdConfigSet(rest[0], rest[1]);\n if (action === \"setup-clients\") return cmdSetupClients();\n if (action === \"add-profile\") return cmdConfigAddProfile(rest, force ?? false);\n if (action === \"list-profile\") return cmdConfigListProfile();\n if (action === \"use\") return cmdConfigUse(rest[0]);\n process.stderr.write(`Unknown config command: ${action}\\n`);\n process.exitCode = 1;\n}\n\nexport function handleSetupCommand(v: CliValues): void {\n if (!v.client) {\n printSetupUsage();\n return;\n }\n if (!SUPPORTED_CLIENTS.includes(v.client as ClientId)) {\n process.stderr.write(\n `Unknown client: \"${v.client}\"\\nSupported: ${SUPPORTED_CLIENTS.join(\", \")}\\n`\n );\n process.exitCode = 1;\n return;\n }\n cmdSetupClient({\n client: v.client as ClientId,\n profile: v.profile,\n modules: v.modules,\n });\n}\n\nexport function handleMarketPublicCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"ticker\") return cmdMarketTicker(run, rest[0], json);\n if (action === \"tickers\") return cmdMarketTickers(run, rest[0], json);\n if (action === \"instruments\")\n return cmdMarketInstruments(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"mark-price\")\n return cmdMarketMarkPrice(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"index-ticker\")\n return cmdMarketIndexTicker(run, { instId: v.instId, quoteCcy: v.quoteCcy, json });\n if (action === \"price-limit\") return cmdMarketPriceLimit(run, rest[0], json);\n if (action === \"open-interest\")\n return cmdMarketOpenInterest(run, { instType: v.instType!, instId: v.instId, json });\n}\n\nexport function handleMarketDataCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"orderbook\")\n return cmdMarketOrderbook(run, rest[0], v.sz !== undefined ? Number(v.sz) : undefined, json);\n if (action === \"candles\")\n return cmdMarketCandles(run, rest[0], { bar: v.bar, limit, json });\n if (action === \"funding-rate\")\n return cmdMarketFundingRate(run, rest[0], { history: v.history ?? false, limit, json });\n if (action === \"trades\")\n return cmdMarketTrades(run, rest[0], { limit, json });\n if (action === \"index-candles\")\n return cmdMarketIndexCandles(run, rest[0], { bar: v.bar, limit, history: v.history ?? false, json });\n}\n\nexport function handleMarketCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n return (\n handleMarketPublicCommand(run, action, rest, v, json) ??\n handleMarketDataCommand(run, action, rest, v, json)\n );\n}\n\nexport function handleAccountWriteCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"set-position-mode\")\n return cmdAccountSetPositionMode(run, v.posMode!, json);\n if (action === \"max-size\")\n return cmdAccountMaxSize(run, { instId: v.instId!, tdMode: v.tdMode!, px: v.px, json });\n if (action === \"max-avail-size\")\n return cmdAccountMaxAvailSize(run, { instId: v.instId!, tdMode: v.tdMode!, json });\n if (action === \"max-withdrawal\") return cmdAccountMaxWithdrawal(run, v.ccy, json);\n if (action === \"transfer\")\n return cmdAccountTransfer(run, {\n ccy: v.ccy!,\n amt: v.amt!,\n from: v.from!,\n to: v.to!,\n transferType: v.transferType,\n subAcct: v.subAcct,\n json,\n });\n}\n\nfunction handleAccountCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"audit\")\n return cmdAccountAudit({ limit: v.limit, tool: v.tool, since: v.since, json });\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"balance\") return cmdAccountBalance(run, rest[0], json);\n if (action === \"asset-balance\") return cmdAccountAssetBalance(run, v.ccy, json);\n if (action === \"positions\")\n return cmdAccountPositions(run, { instType: v.instType, instId: v.instId, json });\n if (action === \"positions-history\")\n return cmdAccountPositionsHistory(run, {\n instType: v.instType,\n instId: v.instId,\n limit,\n json,\n });\n if (action === \"bills\")\n return cmdAccountBills(run, {\n archive: v.archive ?? false,\n instType: v.instType,\n ccy: v.ccy,\n limit,\n json,\n });\n if (action === \"fees\")\n return cmdAccountFees(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"config\") return cmdAccountConfig(run, json);\n return handleAccountWriteCommand(run, action, v, json);\n}\n\nfunction handleSpotAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"place\")\n return cmdSpotAlgoPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (subAction === \"amend\")\n return cmdSpotAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSpotAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSpotAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nfunction handleSpotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\")\n return cmdSpotOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSpotGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSpotFills(run, { instId: v.instId, ordId: v.ordId, json });\n if (action === \"amend\")\n return cmdSpotAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"place\")\n return cmdSpotPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n px: v.px,\n json,\n });\n if (action === \"cancel\")\n return cmdSpotCancel(run, rest[0], v.ordId!, json);\n if (action === \"algo\")\n return handleSpotAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSpotBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nfunction handleSwapAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdSwapAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"place\")\n return cmdSwapAlgoPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"amend\")\n return cmdSwapAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSwapAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSwapAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nexport function handleSwapCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"positions\")\n return cmdSwapPositions(run, rest[0] ?? v.instId, json);\n if (action === \"orders\")\n return cmdSwapOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSwapGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSwapFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"close\")\n return cmdSwapClose(run, {\n instId: v.instId!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n autoCxl: v.autoCxl,\n json,\n });\n if (action === \"get-leverage\")\n return cmdSwapGetLeverage(run, { instId: v.instId!, mgnMode: v.mgnMode!, json });\n if (action === \"place\")\n return cmdSwapPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n posSide: v.posSide,\n px: v.px,\n tdMode: v.tdMode ?? \"cross\",\n json,\n });\n if (action === \"cancel\")\n return cmdSwapCancel(run, rest[0], v.ordId!, json);\n if (action === \"amend\")\n return cmdSwapAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"leverage\")\n return cmdSwapSetLeverage(run, {\n instId: v.instId!,\n lever: v.lever!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n json,\n });\n if (action === \"algo\")\n return handleSwapAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSwapBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nfunction handleOptionCommand(\n run: ToolRunner,\n action: string,\n _rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\") {\n let status: \"live\" | \"history\" | \"archive\" = \"live\";\n if (v.archive) status = \"archive\";\n else if (v.history) status = \"history\";\n return cmdOptionOrders(run, { instId: v.instId, uly: v.uly, status, json });\n }\n if (action === \"get\")\n return cmdOptionGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"positions\")\n return cmdOptionPositions(run, { instId: v.instId, uly: v.uly, json });\n if (action === \"fills\")\n return cmdOptionFills(run, { instId: v.instId, ordId: v.ordId, archive: v.archive ?? false, json });\n if (action === \"instruments\")\n return cmdOptionInstruments(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"greeks\")\n return cmdOptionGreeks(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"place\")\n return cmdOptionPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n px: v.px,\n reduceOnly: v.reduceOnly,\n clOrdId: v.clOrdId,\n json,\n });\n if (action === \"cancel\")\n return cmdOptionCancel(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdOptionAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"batch-cancel\")\n return cmdOptionBatchCancel(run, { orders: v.orders!, json });\n}\n\nfunction handleFuturesCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\") {\n let status: \"archive\" | \"history\" | \"open\" = \"open\";\n if (v.archive) status = \"archive\";\n else if (v.history) status = \"history\";\n return cmdFuturesOrders(run, { instId: v.instId, status, json });\n }\n if (action === \"positions\") return cmdFuturesPositions(run, v.instId, json);\n if (action === \"fills\")\n return cmdFuturesFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"place\")\n return cmdFuturesPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n tdMode: v.tdMode ?? \"cross\",\n posSide: v.posSide,\n px: v.px,\n reduceOnly: v.reduceOnly,\n json,\n });\n if (action === \"cancel\")\n return cmdFuturesCancel(run, rest[0] ?? v.instId!, v.ordId!, json);\n if (action === \"get\")\n return cmdFuturesGet(run, { instId: rest[0] ?? v.instId!, ordId: v.ordId, json });\n}\n\nexport function handleBotGridCommand(\n run: ToolRunner,\n v: CliValues,\n rest: string[],\n json: boolean\n): Promise<void> | void {\n const subAction = rest[0];\n if (subAction === \"orders\")\n return cmdGridOrders(run, {\n algoOrdType: v.algoOrdType!,\n instId: v.instId,\n algoId: v.algoId,\n status: v.history ? \"history\" : \"active\",\n json,\n });\n if (subAction === \"details\")\n return cmdGridDetails(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n json,\n });\n if (subAction === \"sub-orders\")\n return cmdGridSubOrders(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n type: v.live ? \"live\" : \"filled\",\n json,\n });\n if (subAction === \"create\")\n return cmdGridCreate(run, {\n instId: v.instId!,\n algoOrdType: v.algoOrdType!,\n maxPx: v.maxPx!,\n minPx: v.minPx!,\n gridNum: v.gridNum!,\n runType: v.runType,\n quoteSz: v.quoteSz,\n baseSz: v.baseSz,\n direction: v.direction,\n lever: v.lever,\n sz: v.sz,\n basePos: v.basePos,\n json,\n });\n if (subAction === \"stop\")\n return cmdGridStop(run, {\n algoId: v.algoId!,\n algoOrdType: v.algoOrdType!,\n instId: v.instId!,\n stopType: v.stopType,\n json,\n });\n}\n\nexport function handleBotDcaCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n if (subAction === \"orders\")\n return cmdDcaOrders(run, { history: v.history ?? false, json });\n if (subAction === \"details\")\n return cmdDcaDetails(run, { algoId: v.algoId!, json });\n if (subAction === \"sub-orders\")\n return cmdDcaSubOrders(run, { algoId: v.algoId!, cycleId: v.cycleId, json });\n if (subAction === \"create\")\n return cmdDcaCreate(run, {\n instId: v.instId!,\n lever: v.lever!,\n direction: v.direction!,\n initOrdAmt: v.initOrdAmt!,\n maxSafetyOrds: v.maxSafetyOrds!,\n tpPct: v.tpPct!,\n safetyOrdAmt: v.safetyOrdAmt,\n pxSteps: v.pxSteps,\n pxStepsMult: v.pxStepsMult,\n volMult: v.volMult,\n slPct: v.slPct,\n slMode: v.slMode,\n allowReinvest: v.allowReinvest,\n triggerStrategy: v.triggerStrategy,\n triggerPx: v.triggerPx,\n json,\n });\n if (subAction === \"stop\")\n return cmdDcaStop(run, { algoId: v.algoId!, json });\n}\n\nexport function handleBotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"grid\") return handleBotGridCommand(run, v, rest, json);\n if (action === \"dca\") return handleBotDcaCommand(run, rest[0], v, json);\n}\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n showFirstRunTips(CLI_VERSION);\n checkForUpdates(\"@okx_ai/okx-trade-cli\", CLI_VERSION);\n\n const { values, positionals } = parseCli(process.argv.slice(2));\n\n if (values.version) {\n process.stdout.write(`${CLI_VERSION} (${GIT_HASH})\\n`);\n return;\n }\n\n if (values.help || positionals.length === 0) {\n // Multi-level help: resolve depth from positionals captured before --help\n const [module, subgroup] = positionals;\n if (!module) {\n printHelp();\n } else if (!subgroup) {\n printHelp(module);\n } else {\n printHelp(module, subgroup);\n }\n return;\n }\n\n const [module, action, ...rest] = positionals;\n const v = values;\n const json = v.json ?? false;\n\n if (module === \"config\") return handleConfigCommand(action, rest, json, v.lang, v.force);\n if (module === \"setup\") return handleSetupCommand(v);\n\n const config = loadProfileConfig({ profile: v.profile, demo: v.demo, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n const client = new OkxRestClient(config);\n const run = createToolRunner(client, config);\n\n if (module === \"market\") return handleMarketCommand(run, action, rest, v, json);\n if (module === \"account\") return handleAccountCommand(run, action, rest, v, json);\n if (module === \"spot\") return handleSpotCommand(run, action, rest, v, json);\n if (module === \"swap\") return handleSwapCommand(run, action, rest, v, json);\n if (module === \"futures\") return handleFuturesCommand(run, action, rest, v, json);\n if (module === \"option\") return handleOptionCommand(run, action, rest, v, json);\n if (module === \"bot\") return handleBotCommand(run, action, rest, v, json);\n\n process.stderr.write(`Unknown command: ${module} ${action ?? \"\"}\\n`);\n process.exitCode = 1;\n}\n\nmain().catch((error: unknown) => {\n const payload = toToolErrorPayload(error);\n process.stderr.write(`Error: ${payload.message}\\n`);\n if (payload.traceId) process.stderr.write(`TraceId: ${payload.traceId}\\n`);\n if (payload.suggestion) process.stderr.write(`Hint: ${payload.suggestion}\\n`);\n process.stderr.write(`Version: @okx_ai/okx-trade-cli@${CLI_VERSION}\\n`);\n process.exitCode = 1;\n});\n","import { createHmac } from \"node:crypto\";\n\nexport function getNow(): string {\n return new Date().toISOString();\n}\n\nexport function signOkxPayload(payload: string, secretKey: string): string {\n return createHmac(\"sha256\", secretKey).update(payload).digest(\"base64\");\n}\n","export type ErrorType =\n | \"ConfigError\"\n | \"AuthenticationError\"\n | \"RateLimitError\"\n | \"ValidationError\"\n | \"OkxApiError\"\n | \"NetworkError\"\n | \"InternalError\";\n\nexport interface ToolErrorPayload {\n error: true;\n type: ErrorType;\n code?: string;\n message: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n timestamp: string;\n}\n\nexport class OkxMcpError extends Error {\n public readonly type: ErrorType;\n public readonly code?: string;\n public readonly suggestion?: string;\n public readonly endpoint?: string;\n public readonly traceId?: string;\n\n public constructor(\n type: ErrorType,\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(message, options?.cause ? { cause: options.cause } : undefined);\n this.name = type;\n this.type = type;\n this.code = options?.code;\n this.suggestion = options?.suggestion;\n this.endpoint = options?.endpoint;\n this.traceId = options?.traceId;\n }\n}\n\nexport class ConfigError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ConfigError\", message, { suggestion });\n }\n}\n\nexport class ValidationError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ValidationError\", message, { suggestion });\n }\n}\n\nexport class RateLimitError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"RateLimitError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class AuthenticationError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"AuthenticationError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class OkxApiError extends OkxMcpError {\n public constructor(\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(\"OkxApiError\", message, options);\n }\n}\n\nexport class NetworkError extends OkxMcpError {\n public constructor(message: string, endpoint?: string, cause?: unknown) {\n super(\"NetworkError\", message, {\n endpoint,\n cause,\n suggestion:\n \"Please check network connectivity and retry the request in a few seconds.\",\n });\n }\n}\n\nexport function toToolErrorPayload(\n error: unknown,\n fallbackEndpoint?: string,\n): ToolErrorPayload {\n if (error instanceof OkxMcpError) {\n return {\n error: true,\n type: error.type,\n code: error.code,\n message: error.message,\n suggestion: error.suggestion,\n endpoint: error.endpoint ?? fallbackEndpoint,\n traceId: error.traceId,\n timestamp: new Date().toISOString(),\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n error: true,\n type: \"InternalError\",\n message,\n suggestion:\n \"Unexpected server error. Check tool arguments and retry. If it persists, inspect server logs.\",\n endpoint: fallbackEndpoint,\n timestamp: new Date().toISOString(),\n };\n}\n","import { RateLimitError } from \"./errors.js\";\n\ntype Bucket = {\n tokens: number;\n lastRefillMs: number;\n capacity: number;\n refillPerSecond: number;\n};\n\nexport type RateLimitConfig = {\n key: string;\n capacity: number;\n refillPerSecond: number;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class RateLimiter {\n private readonly buckets = new Map<string, Bucket>();\n private readonly maxWaitMs: number;\n\n public constructor(maxWaitMs = 30_000) {\n this.maxWaitMs = maxWaitMs;\n }\n\n public async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n const bucket = this.getBucket(config);\n this.refill(bucket);\n\n if (bucket.tokens >= amount) {\n bucket.tokens -= amount;\n return;\n }\n\n const missing = amount - bucket.tokens;\n const secondsToWait = missing / bucket.refillPerSecond;\n const waitMs = Math.ceil(secondsToWait * 1000);\n\n if (waitMs > this.maxWaitMs) {\n throw new RateLimitError(\n `Client-side rate limit reached for ${config.key}. Required wait ${waitMs}ms exceeds allowed max ${this.maxWaitMs}ms.`,\n \"Reduce tool call frequency or retry later.\",\n );\n }\n\n await sleep(waitMs);\n this.refill(bucket);\n\n if (bucket.tokens < amount) {\n throw new RateLimitError(\n `Rate limiter failed to acquire enough tokens for ${config.key}.`,\n );\n }\n\n bucket.tokens -= amount;\n }\n\n private getBucket(config: RateLimitConfig): Bucket {\n const existing = this.buckets.get(config.key);\n if (existing) {\n if (\n existing.capacity !== config.capacity ||\n existing.refillPerSecond !== config.refillPerSecond\n ) {\n existing.capacity = config.capacity;\n existing.refillPerSecond = config.refillPerSecond;\n existing.tokens = Math.min(existing.tokens, config.capacity);\n }\n return existing;\n }\n\n const now = Date.now();\n const created: Bucket = {\n tokens: config.capacity,\n lastRefillMs: now,\n capacity: config.capacity,\n refillPerSecond: config.refillPerSecond,\n };\n this.buckets.set(config.key, created);\n return created;\n }\n\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsedMs = now - bucket.lastRefillMs;\n if (elapsedMs <= 0) {\n return;\n }\n\n const refillTokens = (elapsedMs / 1000) * bucket.refillPerSecond;\n bucket.tokens = Math.min(bucket.capacity, bucket.tokens + refillTokens);\n bucket.lastRefillMs = now;\n }\n}\n","import { getNow, signOkxPayload } from \"../utils/signature.js\";\nimport {\n AuthenticationError,\n ConfigError,\n NetworkError,\n OkxApiError,\n RateLimitError,\n} from \"../utils/errors.js\";\n\ntype CodeBehavior =\n | { retry: true; suggestion: string }\n | { retry: false; suggestion: string };\n\nconst OKX_CODE_BEHAVIORS: Record<string, CodeBehavior> = {\n // Rate limit → throw RateLimitError\n \"50011\": { retry: true, suggestion: \"Rate limited. Back off and retry after a delay.\" },\n \"50061\": { retry: true, suggestion: \"Too many connections. Reduce request frequency and retry.\" },\n\n // Server temporarily unavailable → retryable\n \"50001\": { retry: true, suggestion: \"OKX system upgrade in progress. Retry in a few minutes.\" },\n \"50004\": { retry: true, suggestion: \"Endpoint temporarily unavailable. Retry later.\" },\n \"50013\": { retry: true, suggestion: \"System busy. Retry after 1-2 seconds.\" },\n \"50026\": { retry: true, suggestion: \"Order book system upgrading. Retry in a few minutes.\" },\n\n // Region / compliance restriction → do not retry\n \"51155\": { retry: false, suggestion: \"Feature unavailable in your region (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n \"51734\": { retry: false, suggestion: \"Feature not supported for your KYC country (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n\n // Account issues → do not retry\n \"50007\": { retry: false, suggestion: \"Account suspended. Contact OKX support. Do not retry.\" },\n \"50009\": { retry: false, suggestion: \"Account blocked by risk control. Contact OKX support. Do not retry.\" },\n \"51009\": { retry: false, suggestion: \"Account mode not supported for this operation. Check account settings.\" },\n\n // API key permission / expiry → do not retry\n \"50100\": { retry: false, suggestion: \"API key lacks required permissions. Update API key permissions.\" },\n \"50110\": { retry: false, suggestion: \"API key expired. Generate a new API key.\" },\n\n // Insufficient funds / margin → do not retry\n \"51008\": { retry: false, suggestion: \"Insufficient balance. Top up account before retrying.\" },\n \"51119\": { retry: false, suggestion: \"Insufficient margin. Add margin before retrying.\" },\n \"51127\": { retry: false, suggestion: \"Insufficient available margin. Reduce position or add margin.\" },\n\n // Instrument unavailable → do not retry\n \"51021\": { retry: false, suggestion: \"Instrument does not exist. Check instId.\" },\n \"51022\": { retry: false, suggestion: \"Instrument not available for trading.\" },\n \"51027\": { retry: false, suggestion: \"Contract has expired.\" },\n};\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type {\n OkxApiResponse,\n QueryParams,\n QueryValue,\n RequestConfig,\n RequestResult,\n} from \"./types.js\";\n\nfunction isDefined(value: unknown): boolean {\n return value !== undefined && value !== null;\n}\n\nfunction extractTraceId(headers: Headers): string | undefined {\n return (\n headers.get(\"x-trace-id\") ??\n headers.get(\"x-request-id\") ??\n headers.get(\"traceid\") ??\n undefined\n );\n}\n\nfunction stringifyQueryValue(value: QueryValue): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\",\");\n }\n return String(value);\n}\n\nfunction buildQueryString(query?: QueryParams): string {\n if (!query) {\n return \"\";\n }\n\n const entries = Object.entries(query).filter(([, value]) => isDefined(value));\n if (entries.length === 0) {\n return \"\";\n }\n\n const params = new URLSearchParams();\n for (const [key, value] of entries) {\n params.set(key, stringifyQueryValue(value));\n }\n return params.toString();\n}\n\nexport class OkxRestClient {\n private readonly config: OkxConfig;\n private readonly rateLimiter = new RateLimiter();\n\n public constructor(config: OkxConfig) {\n this.config = config;\n }\n\n public async publicGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"public\",\n query,\n rateLimit,\n });\n }\n\n public async privateGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"private\",\n query,\n rateLimit,\n });\n }\n\n public async privatePost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"private\",\n body,\n rateLimit,\n });\n }\n\n private async request<TData = unknown>(\n config: RequestConfig,\n ): Promise<RequestResult<TData>> {\n const queryString = buildQueryString(config.query);\n const requestPath = queryString.length > 0 ? `${config.path}?${queryString}` : config.path;\n const url = `${this.config.baseUrl}${requestPath}`;\n const bodyJson = config.body ? JSON.stringify(config.body) : \"\";\n const timestamp = getNow();\n\n if (config.rateLimit) {\n await this.rateLimiter.consume(config.rateLimit);\n }\n\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n });\n\n if (this.config.userAgent) {\n headers.set(\"User-Agent\", this.config.userAgent);\n }\n\n if (config.auth === \"private\") {\n if (!this.config.hasAuth) {\n throw new ConfigError(\n \"Private endpoint requires API credentials.\",\n \"Configure OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE.\",\n );\n }\n\n if (!this.config.apiKey || !this.config.secretKey || !this.config.passphrase) {\n throw new ConfigError(\n \"Invalid private API credentials state.\",\n \"Ensure all OKX credentials are set.\",\n );\n }\n\n // OKX signature: timestamp + METHOD + requestPath + body\n const payload = `${timestamp}${config.method.toUpperCase()}${requestPath}${bodyJson}`;\n const signature = signOkxPayload(payload, this.config.secretKey);\n headers.set(\"OK-ACCESS-KEY\", this.config.apiKey);\n headers.set(\"OK-ACCESS-SIGN\", signature);\n headers.set(\"OK-ACCESS-PASSPHRASE\", this.config.passphrase);\n headers.set(\"OK-ACCESS-TIMESTAMP\", timestamp);\n }\n\n if (this.config.demo) {\n headers.set(\"x-simulated-trading\", \"1\");\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: config.method,\n headers,\n body: config.method === \"POST\" ? bodyJson : undefined,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n });\n } catch (error) {\n throw new NetworkError(\n `Failed to call OKX endpoint ${config.method} ${requestPath}.`,\n `${config.method} ${requestPath}`,\n error,\n );\n }\n\n const rawText = await response.text();\n const traceId = extractTraceId(response.headers);\n let parsed: OkxApiResponse<TData>;\n try {\n parsed = (rawText ? JSON.parse(rawText) : {}) as OkxApiResponse<TData>;\n } catch (error) {\n if (!response.ok) {\n const messagePreview = rawText.slice(0, 160).replace(/\\s+/g, \" \").trim();\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${messagePreview || \"Non-JSON response body\"}`,\n {\n code: String(response.status),\n endpoint: `${config.method} ${config.path}`,\n suggestion: \"Verify endpoint path and request parameters.\",\n traceId,\n },\n );\n }\n throw new NetworkError(\n `OKX returned non-JSON response for ${config.method} ${requestPath}.`,\n `${config.method} ${requestPath}`,\n error,\n );\n }\n\n if (!response.ok) {\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${parsed.msg ?? \"Unknown error\"}`,\n {\n code: String(response.status),\n endpoint: `${config.method} ${config.path}`,\n suggestion: \"Retry later or verify endpoint parameters.\",\n traceId,\n },\n );\n }\n\n const responseCode = parsed.code;\n if (responseCode && responseCode !== \"0\" && responseCode !== \"1\") {\n const message = parsed.msg || \"OKX API request failed.\";\n const endpoint = `${config.method} ${config.path}`;\n\n if (\n responseCode === \"50111\" ||\n responseCode === \"50112\" ||\n responseCode === \"50113\"\n ) {\n throw new AuthenticationError(\n message,\n \"Check API key, secret, passphrase and permissions.\",\n endpoint,\n traceId,\n );\n }\n\n const behavior = OKX_CODE_BEHAVIORS[responseCode];\n const suggestion = behavior?.suggestion?.replace(\"{site}\", this.config.site);\n\n if (responseCode === \"50011\" || responseCode === \"50061\") {\n throw new RateLimitError(message, suggestion, endpoint, traceId);\n }\n\n throw new OkxApiError(message, {\n code: responseCode,\n endpoint,\n suggestion,\n traceId,\n });\n }\n\n return {\n endpoint: `${config.method} ${config.path}`,\n requestTime: new Date().toISOString(),\n data: (parsed.data ?? null) as TData,\n raw: parsed,\n };\n }\n}\n","export const OKX_API_BASE_URL = \"https://www.okx.com\";\n\n/** Default source tag injected into all order placements for attribution. */\nexport const DEFAULT_SOURCE_TAG = \"MCP\";\n\n// ---------------------------------------------------------------------------\n// Site registry\n// ---------------------------------------------------------------------------\n\nexport interface OkxSite {\n label: string;\n apiBaseUrl: string;\n /** User-facing web URL for account/API key management pages */\n webUrl: string;\n}\n\nexport const OKX_SITES = {\n global: {\n label: \"Global\",\n apiBaseUrl: \"https://www.okx.com\",\n webUrl: \"https://www.okx.com\",\n },\n eea: {\n label: \"EEA\",\n apiBaseUrl: \"https://eea.okx.com\",\n webUrl: \"https://my.okx.com\",\n },\n us: {\n label: \"US\",\n apiBaseUrl: \"https://app.okx.com\",\n webUrl: \"https://app.okx.com\",\n },\n} as const satisfies Record<string, OkxSite>;\n\nexport type SiteId = keyof typeof OKX_SITES;\nexport const SITE_IDS = Object.keys(OKX_SITES) as SiteId[];\n\nexport const BOT_SUB_MODULE_IDS = [\n \"bot.grid\",\n \"bot.dca\",\n] as const;\n\nexport type BotSubModuleId = (typeof BOT_SUB_MODULE_IDS)[number];\n\nexport const BOT_DEFAULT_SUB_MODULES: BotSubModuleId[] = [\"bot.grid\"];\n\nexport const MODULES = [\n \"market\",\n \"spot\",\n \"swap\",\n \"futures\",\n \"option\",\n \"account\",\n ...BOT_SUB_MODULE_IDS,\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"swap\", \"option\", \"account\", ...BOT_DEFAULT_SUB_MODULES];\n// Default: spot, swap, option, account, bot.grid\n// \"all\": every module including market, futures, bot.dca\n// \"bot\": bot.grid only; \"bot.all\": bot.grid + bot.dca\n","import { ValidationError } from \"../utils/errors.js\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n return value as Record<string, unknown>;\n}\n\nexport function readString(\n args: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new ValidationError(`Parameter \"${key}\" must be a string.`);\n }\n return value;\n}\n\nexport function readNumber(\n args: Record<string, unknown>,\n key: string,\n): number | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new ValidationError(`Parameter \"${key}\" must be a number.`);\n }\n return value;\n}\n\nexport function readBoolean(\n args: Record<string, unknown>,\n key: string,\n): boolean | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new ValidationError(`Parameter \"${key}\" must be a boolean.`);\n }\n return value;\n}\n\nexport function readStringArray(\n args: Record<string, unknown>,\n key: string,\n): string[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(`Parameter \"${key}\" must be an array of strings.`);\n }\n return value;\n}\n\nexport function requireString(\n args: Record<string, unknown>,\n key: string,\n): string {\n const value = readString(args, key);\n if (!value || value.length === 0) {\n throw new ValidationError(`Missing required parameter \"${key}\".`);\n }\n return value;\n}\n\nexport function assertEnum(\n value: string | undefined,\n key: string,\n values: readonly string[],\n): void {\n if (value === undefined) {\n return;\n }\n if (!values.includes(value)) {\n throw new ValidationError(\n `Parameter \"${key}\" must be one of: ${values.join(\", \")}.`,\n );\n }\n}\n\nexport function compactObject(\n object: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n if (value !== undefined && value !== null) {\n next[key] = value;\n }\n }\n return next;\n}\n","import type { RateLimitConfig } from \"../utils/rate-limiter.js\";\nimport { ConfigError } from \"../utils/errors.js\";\nimport type { OkxConfig } from \"../config.js\";\n\nexport const OKX_CANDLE_BARS = [\n \"1m\", \"3m\", \"5m\", \"15m\", \"30m\",\n \"1H\", \"2H\", \"4H\", \"6H\", \"12H\",\n \"1D\", \"2D\", \"3D\", \"1W\", \"1M\", \"3M\",\n] as const;\n\nexport const OKX_INST_TYPES = [\n \"SPOT\", \"SWAP\", \"FUTURES\", \"OPTION\", \"MARGIN\",\n] as const;\n\nexport function publicRateLimit(key: string, rps = 20): RateLimitConfig {\n return {\n key: `public:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\nexport function privateRateLimit(key: string, rps = 10): RateLimitConfig {\n return {\n key: `private:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\n/**\n * Throw a ConfigError if demo/simulated trading mode is active.\n * Use this for endpoints that OKX does not support in simulated trading.\n */\nexport function assertNotDemo(config: OkxConfig, endpoint: string): void {\n if (config.demo) {\n throw new ConfigError(\n `\"${endpoint}\" is not supported in simulated trading mode.`,\n \"Disable demo mode (remove OKX_DEMO=1 or --demo flag) to use this endpoint.\",\n );\n }\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerAccountTools(): ToolSpec[] {\n return [\n {\n name: \"account_get_balance\",\n module: \"account\",\n description:\n \"Get account balance for trading account. Returns balances for all currencies or a specific one. Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/balance\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_balance\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_transfer\",\n module: \"account\",\n description:\n \"Transfer funds between accounts (trading, funding, etc.). [CAUTION] Moves real funds. Private endpoint. Rate limit: 2 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Transfer amount\",\n },\n from: {\n type: \"string\",\n description: \"Source account: 6=funding, 18=trading (unified)\",\n },\n to: {\n type: \"string\",\n description: \"Destination account: 6=funding, 18=trading (unified)\",\n },\n type: {\n type: \"string\",\n description: \"0=main account (default), 1=main→sub, 2=sub→main, 3=sub→sub\",\n },\n subAcct: {\n type: \"string\",\n description: \"Sub-account name. Required when type=1/2/3\",\n },\n clientId: {\n type: \"string\",\n description: \"Client ID (max 32 chars)\",\n },\n },\n required: [\"ccy\", \"amt\", \"from\", \"to\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/asset/transfer\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n from: requireString(args, \"from\"),\n to: requireString(args, \"to\"),\n type: readString(args, \"type\"),\n subAcct: readString(args, \"subAcct\"),\n clientId: readString(args, \"clientId\"),\n }),\n privateRateLimit(\"account_transfer\", 2),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_max_size\",\n module: \"account\",\n description:\n \"Get max buy/sell order size for a SWAP/FUTURES instrument given current balance and leverage. Useful before placing orders. Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n px: {\n type: \"string\",\n description: \"Limit order price (omit for market)\",\n },\n leverage: {\n type: \"string\",\n description: \"Leverage (defaults to account setting)\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated mode.\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n px: readString(args, \"px\"),\n leverage: readString(args, \"leverage\"),\n ccy: readString(args, \"ccy\"),\n }),\n privateRateLimit(\"account_get_max_size\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_asset_balance\",\n module: \"account\",\n description:\n \"Get funding account balance (asset account). Different from account_get_balance which queries the trading account. Private. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_bills\",\n module: \"account\",\n description:\n \"Get account ledger: fees paid, funding charges, realized PnL, transfers, etc. \" +\n \"Default 20 records (last 7 days), max 100. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills\", 6),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_positions_history\",\n module: \"account\",\n description:\n \"Get closed position history for SWAP or FUTURES. \" +\n \"Default 20 records, max 100. Private endpoint. Rate limit: 1 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"MARGIN\", \"OPTION\"],\n description: \"Default SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n type: {\n type: \"string\",\n description: \"1=close long,2=close short,3=liq long,4=liq short,5=ADL long,6=ADL short\",\n },\n posId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions-history\",\n compactObject({\n instType: readString(args, \"instType\") ?? \"SWAP\",\n instId: readString(args, \"instId\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n posId: readString(args, \"posId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_positions_history\", 1),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_trade_fee\",\n module: \"account\",\n description:\n \"Get maker/taker fee rates for the account. Useful to understand your fee tier before trading. Private endpoint. Rate limit: 5 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/trade-fee\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n }),\n privateRateLimit(\"account_get_trade_fee\", 5),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_config\",\n module: \"account\",\n description:\n \"Get account configuration: position mode (net vs hedge), account level, auto-loan settings, etc. Private endpoint. Rate limit: 5 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/api/v5/account/config\",\n {},\n privateRateLimit(\"account_get_config\", 5),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_max_withdrawal\",\n module: \"account\",\n description:\n \"Get maximum withdrawable amount for a currency from the trading account. \" +\n \"Useful before initiating a transfer or withdrawal. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-withdrawal\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_max_withdrawal\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_max_avail_size\",\n module: \"account\",\n description:\n \"Get maximum available size for opening or reducing a position. \" +\n \"Different from account_get_max_size which calculates new order size. \" +\n \"Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP or BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\", \"cash\"],\n description: \"cash=spot\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated MARGIN mode.\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"true=calculate max size for closing position\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = readBoolean(args, \"reduceOnly\");\n const response = await context.client.privateGet(\n \"/api/v5/account/max-avail-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n ccy: readString(args, \"ccy\"),\n reduceOnly: reduceOnly !== undefined ? String(reduceOnly) : undefined,\n }),\n privateRateLimit(\"account_get_max_avail_size\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_positions\",\n module: \"account\",\n description:\n \"Get current open positions across all instrument types (MARGIN, SWAP, FUTURES, OPTION). \" +\n \"Use swap_get_positions for SWAP/FUTURES-only queries when the swap module is loaded. \" +\n \"Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: readString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"account_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_bills_archive\",\n module: \"account\",\n description:\n \"Get archived account ledger (bills older than 7 days, up to 3 months). \" +\n \"Use account_get_bills for recent 7-day records. \" +\n \"Default 20 records, max 100. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills-archive\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills_archive\", 6),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_set_position_mode\",\n module: \"account\",\n description:\n \"Switch between net position mode and long/short hedge mode. \" +\n \"net: one position per instrument (default for most accounts). \" +\n \"long_short_mode: separate long and short positions. \" +\n \"[CAUTION] Requires no open positions or pending orders. Private endpoint. Rate limit: 5 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n posMode: {\n type: \"string\",\n enum: [\"long_short_mode\", \"net_mode\"],\n description: \"long_short_mode=hedge; net_mode=one-way\",\n },\n },\n required: [\"posMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-position-mode\",\n { posMode: requireString(args, \"posMode\") },\n privateRateLimit(\"account_set_position_mode\", 5),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerAlgoTradeTools(): ToolSpec[] {\n return [\n {\n name: \"swap_place_algo_order\",\n module: \"swap\",\n description:\n \"Place a SWAP/FUTURES take-profit or stop-loss algo order. [CAUTION] Executes real trades. \" +\n \"Use ordType='conditional' for a single TP, single SL, or combined TP+SL on one order. \" +\n \"Use ordType='oco' (one-cancels-other) to place TP and SL simultaneously — whichever triggers first cancels the other. \" +\n \"Set tpOrdPx='-1' or slOrdPx='-1' to execute the closing leg as a market order. \" +\n \"Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair (first trigger cancels other)\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts to close\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market (recommended)\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"swap_place_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_place_move_stop_order\",\n module: \"swap\",\n description:\n \"Place a SWAP/FUTURES trailing stop order (move_order_stop). [CAUTION] Executes real trades. \" +\n \"The order tracks the market price and triggers when the price reverses by the callback amount. \" +\n \"Specify either callbackRatio (e.g. '0.01' for 1%) or callbackSpread (fixed price distance), not both. \" +\n \"Optionally set activePx so tracking only starts once the market reaches that price. \" +\n \"Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: \"move_order_stop\",\n sz: requireString(args, \"sz\"),\n callbackRatio: readString(args, \"callbackRatio\"),\n callbackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_place_move_stop_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_cancel_algo_orders\",\n module: \"swap\",\n description:\n \"Cancel one or more pending SWAP/FUTURES algo orders (TP/SL). \" +\n \"Accepts a list of {algoId, instId} objects. Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"List of algo orders to cancel. Each item: {algoId, instId}.\",\n items: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"swap_cancel_algo_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_algo_orders\",\n module: \"swap\",\n description:\n \"Query pending or completed SWAP/FUTURES algo orders (TP/SL, OCO, trailing stop). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"SWAP\",\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"swap_get_algo_orders\", 20),\n );\n return normalize(response);\n }\n\n // No filter: fetch all three types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ToolSpec } from \"./types.js\";\nimport { asRecord, readNumber, readString } from \"./helpers.js\";\nimport type { LogEntry } from \"../utils/logger.js\";\n\nconst DEFAULT_LOG_DIR = path.join(os.homedir(), \".okx\", \"logs\");\n\nfunction getLogPaths(logDir: string, days = 7): string[] {\n const paths: string[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n paths.push(path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`));\n }\n return paths;\n}\n\nfunction readEntries(logDir: string): LogEntry[] {\n const entries: LogEntry[] = [];\n for (const filePath of getLogPaths(logDir)) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n entries.push(JSON.parse(trimmed) as LogEntry);\n } catch {\n // skip malformed lines\n }\n }\n }\n return entries;\n}\n\nexport function registerAuditTools(): ToolSpec[] {\n return [\n {\n name: \"trade_get_history\",\n module: \"account\",\n description:\n \"Query local audit log of tool calls made through this MCP server. \" +\n \"Returns recent operations with timestamps, duration, params, and results. \" +\n \"Use to review what trades or queries were executed in this session or past sessions.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n tool: {\n type: \"string\",\n description: \"e.g. swap_place_order\",\n },\n level: {\n type: \"string\",\n enum: [\"INFO\", \"WARN\", \"ERROR\", \"DEBUG\"],\n },\n since: {\n type: \"string\",\n description: \"ISO 8601 timestamp lower bound\",\n },\n },\n },\n handler: async (rawArgs) => {\n const args = asRecord(rawArgs);\n const limit = Math.min(readNumber(args, \"limit\") ?? 20, 100);\n const toolFilter = readString(args, \"tool\");\n const levelFilter = readString(args, \"level\")?.toUpperCase();\n const since = readString(args, \"since\");\n const sinceTime = since ? new Date(since).getTime() : undefined;\n\n let entries = readEntries(DEFAULT_LOG_DIR);\n\n if (toolFilter) {\n entries = entries.filter((e) => e.tool === toolFilter);\n }\n if (levelFilter) {\n entries = entries.filter((e) => e.level === levelFilter);\n }\n if (sinceTime !== undefined) {\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n // most recent first\n entries.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n entries = entries.slice(0, limit);\n\n return { entries, total: entries.length };\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerGridTools(): ToolSpec[] {\n return [\n {\n name: \"grid_get_orders\",\n module: \"bot.grid\",\n description:\n \"Query grid trading bot list. Use status='active' for running bots, status='history' for completed/stopped bots. \" +\n \"Covers Spot Grid, Contract Grid, and Moon Grid. Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n status: {\n type: \"string\",\n enum: [\"active\", \"history\"],\n description: \"active=running (default); history=stopped\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n required: [\"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const status = readString(args, \"status\") ?? \"active\";\n const path =\n status === \"history\"\n ? \"/api/v5/tradingBot/grid/orders-algo-history\"\n : \"/api/v5/tradingBot/grid/orders-algo-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType,\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"grid_get_order_details\",\n module: \"bot.grid\",\n description:\n \"Query details of a single grid trading bot by its algo ID. \" +\n \"Returns configuration, current status, PnL, and position info. \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n algoId: {\n type: \"string\",\n },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/orders-algo-details\",\n {\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n },\n privateRateLimit(\"grid_get_order_details\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"grid_get_sub_orders\",\n module: \"bot.grid\",\n description:\n \"Query individual sub-orders (grid trades) generated by a grid bot. \" +\n \"Use type='filled' for executed trades, type='live' for pending orders. \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n algoId: {\n type: \"string\",\n },\n type: {\n type: \"string\",\n enum: [\"filled\", \"live\"],\n description: \"filled=executed trades (default); live=pending orders\",\n },\n groupId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/sub-orders\",\n compactObject({\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n type: readString(args, \"type\") ?? \"filled\",\n groupId: readString(args, \"groupId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_sub_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"grid_create_order\",\n module: \"bot.grid\",\n description:\n \"Create a new grid trading bot. [CAUTION] Executes real trades and locks funds. \" +\n \"Supports Spot Grid ('grid') and Contract Grid ('contract_grid'). \" +\n \"For spot grid, provide quoteSz (invest in quote currency) or baseSz (invest in base currency). \" +\n \"For contract grids, provide direction, lever, and sz (investment amount in margin currency, e.g. USDT for USDT-margined contracts). \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n maxPx: {\n type: \"string\",\n description: \"Upper price boundary\",\n },\n minPx: {\n type: \"string\",\n description: \"Lower price boundary\",\n },\n gridNum: {\n type: \"string\",\n description: \"Grid levels (e.g. '10')\",\n },\n runType: {\n type: \"string\",\n enum: [\"1\", \"2\"],\n description: \"1=arithmetic (default); 2=geometric\",\n },\n quoteSz: {\n type: \"string\",\n description: \"Spot grid: invest in quote (e.g. USDT). Provide quoteSz or baseSz.\",\n },\n baseSz: {\n type: \"string\",\n description: \"Spot grid: invest in base (e.g. BTC). Provide quoteSz or baseSz.\",\n },\n direction: {\n type: \"string\",\n enum: [\"long\", \"short\", \"neutral\"],\n description: \"Required for contract_grid\",\n },\n lever: {\n type: \"string\",\n description: \"Leverage (e.g. '5'). Required for contract_grid.\",\n },\n sz: {\n type: \"string\",\n description: \"Investment amount in margin currency (e.g. USDT for USDT-margined contracts). Required for contract_grid.\",\n },\n basePos: {\n type: \"boolean\",\n description:\n \"Whether to open a base position for contract grid. \" +\n \"Ignored for neutral direction and spot grid. Default: true\",\n },\n },\n required: [\"instId\", \"algoOrdType\", \"maxPx\", \"minPx\", \"gridNum\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const body: Record<string, unknown> = compactObject({\n instId: requireString(args, \"instId\"),\n algoOrdType,\n maxPx: requireString(args, \"maxPx\"),\n minPx: requireString(args, \"minPx\"),\n gridNum: requireString(args, \"gridNum\"),\n runType: readString(args, \"runType\"),\n quoteSz: readString(args, \"quoteSz\"),\n baseSz: readString(args, \"baseSz\"),\n direction: readString(args, \"direction\"),\n lever: readString(args, \"lever\"),\n sz: readString(args, \"sz\"),\n tag: context.config.sourceTag,\n });\n if (algoOrdType === \"contract_grid\") {\n body.triggerParams = [{ triggerAction: \"start\", triggerStrategy: \"instant\" }];\n body.basePos = readBoolean(args, \"basePos\") ?? true;\n }\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/order-algo\",\n body,\n privateRateLimit(\"grid_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"grid_stop_order\",\n module: \"bot.grid\",\n description:\n \"Stop a running grid trading bot. [CAUTION] This will close or cancel the bot's orders. \" +\n \"For contract grids, stopType controls whether open positions are closed ('1') or only orders are cancelled ('2'). \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n stopType: {\n type: \"string\",\n enum: [\"1\", \"2\", \"3\", \"5\", \"6\"],\n description: \"1=stop+sell/close all; 2=stop+keep assets (default); 3=close at limit; 5=partial close; 6=stop without selling (smart arb)\",\n },\n },\n required: [\"algoId\", \"algoOrdType\", \"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/stop-order-algo\",\n [compactObject({\n algoId: requireString(args, \"algoId\"),\n algoOrdType: requireString(args, \"algoOrdType\"),\n instId: requireString(args, \"instId\"),\n stopType: readString(args, \"stopType\") ?? \"2\",\n })],\n privateRateLimit(\"grid_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\nconst BASE = \"/api/v5/tradingBot/dca\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerDcaTools(): ToolSpec[] {\n return [\n {\n name: \"dca_create_order\",\n module: \"bot.dca\",\n description:\n \"Create a Contract DCA (Martingale) bot order with leverage on futures/swaps. \" +\n \"Required: instId, lever, direction, initOrdAmt, maxSafetyOrds, tpPct. \" +\n \"Conditionally required (when maxSafetyOrds > 0): safetyOrdAmt, pxSteps, pxStepsMult, volMult. \" +\n \"Optional: slPct, slMode, allowReinvest, triggerStrategy, triggerPx. \" +\n \"[CAUTION] Executes real trades. Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"Instrument ID, e.g. BTC-USDT-SWAP\" },\n lever: { type: \"string\", description: \"Leverage multiplier, e.g. '3'\" },\n direction: { type: \"string\", enum: [\"long\", \"short\"], description: \"Strategy direction: 'long' or 'short'\" },\n initOrdAmt: { type: \"string\", description: \"Initial order amount (USDT)\" },\n maxSafetyOrds: { type: \"string\", description: \"Max number of safety orders, e.g. '3'\" },\n tpPct: { type: \"string\", description: \"Take-profit ratio, e.g. '0.03' = 3%\" },\n safetyOrdAmt: { type: \"string\", description: \"Safety order amount (USDT). Required when maxSafetyOrds > 0\" },\n pxSteps: { type: \"string\", description: \"Price drop % per safety order, e.g. '0.03' = 3%. Required when maxSafetyOrds > 0\" },\n pxStepsMult: { type: \"string\", description: \"Price step multiplier, e.g. '1.2'. Required when maxSafetyOrds > 0\" },\n volMult: { type: \"string\", description: \"Safety order size multiplier, e.g. '1.5'. Required when maxSafetyOrds > 0\" },\n slPct: { type: \"string\", description: \"Stop-loss ratio, e.g. '0.05' = 5% (optional)\" },\n slMode: { type: \"string\", enum: [\"limit\", \"market\"], description: \"Stop-loss price type: 'limit' or 'market'. Defaults to market if omitted (optional)\" },\n allowReinvest: { type: \"string\", enum: [\"true\", \"false\"], description: \"Reinvest profit into the next cycle. Default 'true' (optional)\" },\n triggerStrategy: { type: \"string\", enum: [\"instant\", \"price\", \"rsi\"], default: \"instant\", description: \"How the bot starts: 'instant' (default), 'price' (wait for trigger price), or 'rsi' (RSI signal) (optional)\" },\n triggerPx: { type: \"string\", description: \"Trigger price — required when triggerStrategy='price' (optional)\" },\n },\n required: [\"instId\", \"lever\", \"direction\", \"initOrdAmt\", \"maxSafetyOrds\", \"tpPct\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instId = requireString(args, \"instId\");\n\n // Build triggerParams: default to instant; support price/rsi strategies\n const triggerStrategy = readString(args, \"triggerStrategy\") ?? \"instant\";\n const triggerParam: Record<string, string> = {\n triggerAction: \"start\",\n triggerStrategy,\n };\n if (triggerStrategy === \"price\") {\n triggerParam[\"triggerPx\"] = requireString(args, \"triggerPx\");\n }\n\n const response = await context.client.privatePost(\n `${BASE}/create`,\n compactObject({\n instId,\n algoOrdType: \"contract_dca\",\n lever: requireString(args, \"lever\"),\n direction: requireString(args, \"direction\"),\n initOrdAmt: requireString(args, \"initOrdAmt\"),\n safetyOrdAmt: readString(args, \"safetyOrdAmt\"),\n maxSafetyOrds: requireString(args, \"maxSafetyOrds\"),\n pxSteps: readString(args, \"pxSteps\"),\n pxStepsMult: readString(args, \"pxStepsMult\"),\n volMult: readString(args, \"volMult\"),\n tpPct: requireString(args, \"tpPct\"),\n slPct: readString(args, \"slPct\"),\n slMode: readString(args, \"slMode\"),\n allowReinvest: readString(args, \"allowReinvest\"),\n triggerParams: [triggerParam],\n }),\n privateRateLimit(\"dca_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_stop_order\",\n module: \"bot.dca\",\n description:\n \"Stop a running Contract DCA bot. \" +\n \"[CAUTION] This will stop the bot. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID of the DCA bot to stop\" },\n },\n required: [\"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n\n const response = await context.client.privatePost(\n `${BASE}/stop`,\n { algoId, algoOrdType: \"contract_dca\" },\n privateRateLimit(\"dca_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_get_orders\",\n module: \"bot.dca\",\n description:\n \"Query Contract DCA bot orders. \" +\n \"Use status='active' for running bots, status='history' for completed/stopped. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"active\", \"history\"],\n description: \"active=running (default); history=stopped\",\n },\n algoId: { type: \"string\" },\n instId: { type: \"string\", description: \"Filter by instrument, e.g. BTC-USDT-SWAP (optional)\" },\n after: { type: \"string\", description: \"Pagination: before this algo ID\" },\n before: { type: \"string\", description: \"Pagination: after this algo ID\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"active\";\n\n const path = status === \"history\" ? `${BASE}/history-list` : `${BASE}/ongoing-list`;\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType: \"contract_dca\",\n algoId: readString(args, \"algoId\"),\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"dca_get_order_details\",\n module: \"bot.dca\",\n description:\n \"Query details of a single Contract DCA bot by algo ID. \" +\n \"Returns current position details. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\" },\n },\n required: [\"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n\n const response = await context.client.privateGet(\n `${BASE}/position-details`,\n { algoId, algoOrdType: \"contract_dca\" },\n privateRateLimit(\"dca_get_order_details\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"dca_get_sub_orders\",\n module: \"bot.dca\",\n description:\n \"Query cycles or orders within a cycle of a Contract DCA bot. \" +\n \"Returns cycle list when cycleId is omitted; returns orders within a specific cycle when cycleId is provided. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID of the DCA bot\" },\n cycleId: { type: \"string\", description: \"Omit to list all cycles; provide to get orders within a cycle\" },\n after: { type: \"string\", description: \"Pagination cursor — applies to cycle-list mode only (when cycleId is omitted)\" },\n before: { type: \"string\", description: \"Pagination cursor — applies to cycle-list mode only (when cycleId is omitted)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n required: [\"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const cycleId = readString(args, \"cycleId\");\n\n if (cycleId) {\n // orders within a specific cycle\n const response = await context.client.privateGet(\n `${BASE}/orders`,\n compactObject({\n algoId,\n algoOrdType: \"contract_dca\",\n cycleId,\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalize(response);\n }\n // cycle list\n const response = await context.client.privateGet(\n `${BASE}/cycle-list`,\n compactObject({\n algoId,\n algoOrdType: \"contract_dca\",\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport { registerGridTools } from \"./grid.js\";\nimport { registerDcaTools } from \"./dca.js\";\n\nexport function registerBotTools(): ToolSpec[] {\n return [\n ...registerGridTools(),\n ...registerDcaTools(),\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nconst FUTURES_INST_TYPES = [\"FUTURES\", \"SWAP\"] as const;\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerFuturesTools(): ToolSpec[] {\n return [\n {\n name: \"futures_place_order\",\n module: \"futures\",\n description:\n \"Place a FUTURES delivery contract order (e.g. instId: BTC-USDT-240329). Optionally attach TP/SL via tpTriggerPx/slTriggerPx. [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"one-way: buy=open long, sell=open short (use reduceOnly=true to close); hedge: combined with posSide\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way mode (default); long/short=hedge mode only\",\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Close/reduce only, no new position (one-way mode)\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price; places TP at tpOrdPx\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price; places SL at slOrdPx\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const tpTriggerPx = readString(args, \"tpTriggerPx\");\n const tpOrdPx = readString(args, \"tpOrdPx\");\n const slTriggerPx = readString(args, \"slTriggerPx\");\n const slOrdPx = readString(args, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds = Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"futures_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_cancel_order\",\n module: \"futures\",\n description:\n \"Cancel an unfilled FUTURES delivery order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"futures_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_order\",\n module: \"futures\",\n description:\n \"Get details of a single FUTURES delivery order by ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"futures_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_orders\",\n module: \"futures\",\n description:\n \"Query FUTURES open orders, history (last 7 days), or archive (up to 3 months). Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instType: {\n type: \"string\",\n enum: [...FUTURES_INST_TYPES],\n description: \"FUTURES (default) or SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const instType = readString(args, \"instType\") ?? \"FUTURES\";\n assertEnum(instType, \"instType\", FUTURES_INST_TYPES);\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"futures_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_positions\",\n module: \"futures\",\n description:\n \"Get current FUTURES delivery contract positions. Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...FUTURES_INST_TYPES],\n description: \"FUTURES (default) or SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? \"FUTURES\";\n assertEnum(instType, \"instType\", FUTURES_INST_TYPES);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"futures_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_fills\",\n module: \"futures\",\n description:\n \"Get FUTURES fill details. archive=false: last 3 days. archive=true: up to 3 months. Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instType: {\n type: \"string\",\n enum: [...FUTURES_INST_TYPES],\n description: \"FUTURES (default) or SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const instType = readString(args, \"instType\") ?? \"FUTURES\";\n assertEnum(instType, \"instType\", FUTURES_INST_TYPES);\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"futures_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport { asRecord, compactObject, readBoolean, readNumber, readString, requireString } from \"./helpers.js\";\nimport { publicRateLimit, OKX_CANDLE_BARS, OKX_INST_TYPES } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerMarketTools(): ToolSpec[] {\n return [\n {\n name: \"market_get_ticker\",\n module: \"market\",\n description:\n \"Get ticker data for a single instrument. Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT, BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/ticker\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_ticker\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_tickers\",\n module: \"market\",\n description:\n \"Get ticker data for all instruments of a given type. Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD. Required for OPTION\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/tickers\",\n compactObject({\n instType: requireString(args, \"instType\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_tickers\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_orderbook\",\n module: \"market\",\n description:\n \"Get the order book (bids/asks) for an instrument. Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n sz: {\n type: \"number\",\n description: \"Depth per side, default 1, max 400\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/books\",\n compactObject({\n instId: requireString(args, \"instId\"),\n sz: readNumber(args, \"sz\"),\n }),\n publicRateLimit(\"market_get_orderbook\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_candles\",\n module: \"market\",\n description:\n \"Get candlestick (OHLCV) data for an instrument. \" +\n \"history=false (default): recent candles up to 1440 bars. \" +\n \"history=true: older historical data beyond the recent window. \" +\n \"Public endpoint, no authentication required. Rate limit: 40 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data beyond recent window\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-candles\"\n : \"/api/v5/market/candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_candles\", 40),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_instruments\",\n module: \"market\",\n description:\n \"Get tradable instruments for a given type. Returns contract specs: min order size, lot size, tick size, contract value, settlement currency, listing/expiry time. Essential before placing orders. Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n instId: {\n type: \"string\",\n description: \"Filter by ID, e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"Required for OPTION, e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_instruments\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_funding_rate\",\n module: \"market\",\n description:\n \"Get funding rate for a SWAP instrument. \" +\n \"history=false (default): current rate and estimated next rate + settlement time. \" +\n \"history=true: historical rates, default 20 records, max 100. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP instrument, e.g. BTC-USDT-SWAP\",\n },\n history: {\n type: \"boolean\",\n description: \"true=fetch historical rates\",\n },\n after: {\n type: \"string\",\n description: \"Pagination (history): before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination (history): after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"History records (default 20, max 100)\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n if (isHistory) {\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate-history\",\n compactObject({\n instId: requireString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalize(response);\n }\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_mark_price\",\n module: \"market\",\n description:\n \"Get mark price for SWAP, FUTURES, or MARGIN instruments. \" +\n \"Mark price is used for liquidation calculations and unrealized PnL. \" +\n \"Public endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/mark-price\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_mark_price\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_trades\",\n module: \"market\",\n description:\n \"Get recent trades for an instrument. Default 20 records, max 500. \" +\n \"Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n limit: {\n type: \"number\",\n description: \"Default 20, max 500\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/trades\",\n compactObject({\n instId: requireString(args, \"instId\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_trades\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_index_ticker\",\n module: \"market\",\n description:\n \"Get index ticker data (e.g. BTC-USD, ETH-USD index prices). \" +\n \"Index prices are used for mark price calculation and are independent of any single exchange. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD. Omit for all indices\",\n },\n quoteCcy: {\n type: \"string\",\n description: \"e.g. USD or USDT\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/index-tickers\",\n compactObject({\n instId: readString(args, \"instId\"),\n quoteCcy: readString(args, \"quoteCcy\"),\n }),\n publicRateLimit(\"market_get_index_ticker\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_index_candles\",\n module: \"market\",\n description:\n \"Get candlestick data for an index (e.g. BTC-USD index). \" +\n \"history=false (default): recent candles up to 1440 bars. \" +\n \"history=true: older historical data beyond the recent window. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"Index ID, e.g. BTC-USD\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-index-candles\"\n : \"/api/v5/market/index-candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_index_candles\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_price_limit\",\n module: \"market\",\n description:\n \"Get the current price limit (upper and lower bands) for a SWAP or FUTURES instrument. \" +\n \"Orders placed outside these limits will be rejected by OKX. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP or FUTURES ID, e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/price-limit\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_price_limit\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_open_interest\",\n module: \"market\",\n description:\n \"Get open interest for SWAP, FUTURES, or OPTION instruments. \" +\n \"Useful for gauging market sentiment and positioning. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/open-interest\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_open_interest\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerOptionTools(): ToolSpec[] {\n return [\n {\n name: \"option_place_order\",\n module: \"option\",\n description:\n \"Place an OPTION order (buy/sell call or put). instId format: {uly}-{expiry}-{strike}-{C|P}, e.g. BTC-USD-241227-50000-C. tdMode: cash (buyer) or cross/isolated (seller). [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C (call) or BTC-USD-241227-50000-P (put)\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=buyer full premium; cross/isolated=seller margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok|ioc\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Reduce/close only\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"option_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_cancel_order\",\n module: \"option\",\n description:\n \"Cancel an unfilled OPTION order. Provide ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_batch_cancel\",\n module: \"option\",\n description:\n \"[CAUTION] Batch cancel up to 20 OPTION orders. Each item: {instId, ordId?, clOrdId?}. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"option_batch_cancel\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_amend_order\",\n module: \"option\",\n description:\n \"Amend an unfilled OPTION order (price and/or size). Provide ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New quantity (contracts)\" },\n newPx: { type: \"string\", description: \"New price\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n }),\n privateRateLimit(\"option_amend_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_order\",\n module: \"option\",\n description:\n \"Get details of a single OPTION order by ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_orders\",\n module: \"option\",\n description:\n \"List OPTION orders. status: live=pending (default), history=7d, archive=3mo. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"live\", \"history\", \"archive\"],\n description: \"live=pending (default), history=7d, archive=3mo\",\n },\n uly: { type: \"string\", description: \"Underlying filter, e.g. BTC-USD\" },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordType: { type: \"string\", description: \"Order type filter\" },\n state: { type: \"string\", description: \"canceled|filled\" },\n after: { type: \"string\", description: \"Pagination: before this order ID\" },\n before: { type: \"string\", description: \"Pagination: after this order ID\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"live\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n uly: readString(args, \"uly\"),\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"option_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_positions\",\n module: \"option\",\n description:\n \"Get current OPTION positions including Greeks (delta, gamma, theta, vega). Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"Filter by specific contract\" },\n uly: { type: \"string\", description: \"Filter by underlying, e.g. BTC-USD\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n }),\n privateRateLimit(\"option_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_fills\",\n module: \"option\",\n description:\n \"Get OPTION fill history. archive=false: last 3 days (default). archive=true: up to 3 months. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordId: { type: \"string\", description: \"Order ID filter\" },\n after: { type: \"string\", description: \"Pagination: before this bill ID\" },\n before: { type: \"string\", description: \"Pagination: after this bill ID\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"option_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_instruments\",\n module: \"option\",\n description:\n \"List available OPTION contracts for a given underlying (option chain). Use to find valid instIds before placing orders. Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: \"OPTION\",\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_instruments\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_greeks\",\n module: \"option\",\n description:\n \"Get implied volatility and Greeks (delta, gamma, theta, vega) for OPTION contracts by underlying. Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/opt-summary\",\n compactObject({\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_greeks\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerSpotTradeTools(): ToolSpec[] {\n return [\n {\n name: \"spot_place_order\",\n module: \"spot\",\n description:\n \"Place a spot order. Optionally attach take-profit/stop-loss via tpTriggerPx/slTriggerPx (assembled into attachAlgoOrds automatically). [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=regular spot; cross/isolated=margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Buy market: quote amount; all others: base amount\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price; places TP at tpOrdPx\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price; places SL at slOrdPx\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const tpTriggerPx = readString(args, \"tpTriggerPx\");\n const tpOrdPx = readString(args, \"tpOrdPx\");\n const slTriggerPx = readString(args, \"slTriggerPx\");\n const slOrdPx = readString(args, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds = Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"spot_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_cancel_order\",\n module: \"spot\",\n description:\n \"Cancel an unfilled spot order by order ID or client order ID. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_amend_order\",\n module: \"spot\",\n description:\n \"Amend an unfilled spot order (modify price or size). Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n newSz: {\n type: \"string\",\n },\n newPx: {\n type: \"string\",\n },\n newClOrdId: {\n type: \"string\",\n description: \"New client order ID after amendment\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n newClOrdId: readString(args, \"newClOrdId\"),\n }),\n privateRateLimit(\"spot_amend_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_orders\",\n module: \"spot\",\n description:\n \"Query spot open orders, order history (last 7 days), or order archive (up to 3 months). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"spot_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_place_algo_order\",\n module: \"spot\",\n description:\n \"Place a spot algo order with take-profit and/or stop-loss. [CAUTION] Executes real trades. Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=non-margin spot (default); cross/isolated=margin mode\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"conditional=single TP/SL; oco=TP+SL pair (one-cancels-other)\",\n },\n sz: {\n type: \"string\",\n description: \"Quantity in base currency\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: readString(args, \"tdMode\") ?? \"cash\",\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"spot_place_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_amend_algo_order\",\n module: \"spot\",\n description:\n \"Amend a pending spot algo order (modify TP/SL prices or size). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"spot_amend_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_cancel_algo_order\",\n module: \"spot\",\n description:\n \"Cancel a spot algo order (TP/SL). Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n [\n {\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n },\n ],\n privateRateLimit(\"spot_cancel_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_algo_orders\",\n module: \"spot\",\n description:\n \"Query spot algo orders (TP/SL) — pending or history. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"Filter by type; omit for all\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"spot_get_algo_orders\", 20),\n );\n return normalize(response);\n }\n\n // ordType is required by OKX; fetch both spot types in parallel and merge\n const [r1, r2] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n {\n name: \"spot_get_fills\",\n module: \"spot\",\n description:\n \"Get spot transaction fill details. \" +\n \"archive=false (default): last 3 days. \" +\n \"archive=true: up to 3 months, default limit 20. \" +\n \"Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"spot_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_batch_orders\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch place/cancel/amend up to 20 spot orders in one request. Use action='place'/'cancel'/'amend'. Private. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n description: \"place|cancel|amend\",\n },\n orders: {\n type: \"array\",\n description:\n \"Array (max 20). place: {instId,side,ordType,sz,tdMode?,px?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?} (tdMode defaults to cash for non-margin accounts; use cross for unified/margin accounts). cancel: {instId,ordId|clOrdId}. amend: {instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: {\n type: \"object\",\n },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const tpTriggerPx = readString(o, \"tpTriggerPx\");\n const tpOrdPx = readString(o, \"tpOrdPx\");\n const slTriggerPx = readString(o, \"slTriggerPx\");\n const slOrdPx = readString(o, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds =\n Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: readString(o, \"tdMode\") ?? \"cash\",\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"spot_batch_orders\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_order\",\n module: \"spot\",\n description:\n \"Get details of a single spot order by order ID or client order ID. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_batch_amend\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch amend up to 20 unfilled spot orders in one request. Modify price and/or size per order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_amend\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_batch_cancel\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch cancel up to 20 spot orders in one request. Provide instId plus ordId or clOrdId for each order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_cancel\", 60),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nconst SWAP_INST_TYPES = [\"SWAP\", \"FUTURES\"] as const;\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerSwapTradeTools(): ToolSpec[] {\n return [\n {\n name: \"swap_place_order\",\n module: \"swap\",\n description:\n \"Place a SWAP or FUTURES perpetual/delivery contract order. Optionally attach take-profit/stop-loss via tpTriggerPx/slTriggerPx (assembled into attachAlgoOrds automatically). [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP (perp) or BTC-USD-240329 (delivery)\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"one-way: buy=open long, sell=open short (use reduceOnly=true to close); hedge: combined with posSide\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way mode (default for most accounts); long/short=hedge mode only. Error 'posSide not valid' → use net\",\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Contracts (e.g. '1'; BTC-USDT-SWAP: 1ct=0.01 BTC)\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Close/reduce only, no new position (one-way mode)\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price; places TP at tpOrdPx\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price; places SL at slOrdPx\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const tpTriggerPx = readString(args, \"tpTriggerPx\");\n const tpOrdPx = readString(args, \"tpOrdPx\");\n const slTriggerPx = readString(args, \"slTriggerPx\");\n const slOrdPx = readString(args, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds = Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"swap_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_cancel_order\",\n module: \"swap\",\n description:\n \"Cancel an unfilled SWAP or FUTURES order. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_orders\",\n module: \"swap\",\n description:\n \"Query SWAP or FUTURES open orders, order history (last 7 days), or order archive (up to 3 months). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instType: {\n type: \"string\",\n enum: [...SWAP_INST_TYPES],\n description: \"SWAP (default) or FUTURES\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n assertEnum(instType, \"instType\", SWAP_INST_TYPES);\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"swap_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_positions\",\n module: \"swap\",\n description:\n \"Get current SWAP or FUTURES positions. Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...SWAP_INST_TYPES],\n description: \"SWAP (default) or FUTURES\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n assertEnum(instType, \"instType\", SWAP_INST_TYPES);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"swap_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_set_leverage\",\n module: \"swap\",\n description:\n \"Set leverage for a SWAP or FUTURES instrument or position. [CAUTION] Changes risk parameters. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n lever: {\n type: \"string\",\n description: \"Leverage, e.g. '10'\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"Required for isolated margin in hedge mode\",\n },\n },\n required: [\"instId\", \"lever\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-leverage\",\n compactObject({\n instId: requireString(args, \"instId\"),\n lever: requireString(args, \"lever\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n }),\n privateRateLimit(\"swap_set_leverage\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_amend_algo_order\",\n module: \"swap\",\n description:\n \"Amend a pending SWAP/FUTURES algo order (modify TP/SL prices or size). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-SWAP\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New quantity (contracts)\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"swap_amend_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_fills\",\n module: \"swap\",\n description:\n \"Get SWAP or FUTURES transaction fill details. \" +\n \"archive=false (default): last 3 days. \" +\n \"archive=true: up to 3 months, default limit 20. \" +\n \"Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instType: {\n type: \"string\",\n enum: [...SWAP_INST_TYPES],\n description: \"SWAP (default) or FUTURES\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n assertEnum(instType, \"instType\", SWAP_INST_TYPES);\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"swap_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_order\",\n module: \"swap\",\n description:\n \"Get details of a single SWAP or FUTURES order by order ID or client order ID. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_close_position\",\n module: \"swap\",\n description:\n \"[CAUTION] Close an entire SWAP/FUTURES position at market. Simpler than swap_place_order with reduceOnly when closing the full position. Private. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"long/short=hedge mode; omit for one-way (net)\",\n },\n autoCxl: {\n type: \"boolean\",\n description: \"Cancel pending orders for this instrument on close\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID for close order\",\n },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const autoCxl = args.autoCxl;\n const response = await context.client.privatePost(\n \"/api/v5/trade/close-position\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n autoCxl: typeof autoCxl === \"boolean\" ? String(autoCxl) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"swap_close_position\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_batch_orders\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch place/cancel/amend up to 20 SWAP/FUTURES orders in one request. Use action='place'/'cancel'/'amend'. Private. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n },\n orders: {\n type: \"array\",\n description:\n \"Array (max 20). place: {instId,tdMode,side,ordType,sz,px?,posSide?,reduceOnly?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?}. cancel: {instId,ordId|clOrdId}. amend: {instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: {\n type: \"object\",\n },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const tpTriggerPx = readString(o, \"tpTriggerPx\");\n const tpOrdPx = readString(o, \"tpOrdPx\");\n const slTriggerPx = readString(o, \"slTriggerPx\");\n const slOrdPx = readString(o, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds =\n Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const reduceOnly = o.reduceOnly;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: requireString(o, \"tdMode\"),\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n posSide: readString(o, \"posSide\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"swap_batch_orders\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_leverage\",\n module: \"swap\",\n description:\n \"Get current leverage for a SWAP/FUTURES instrument. Call before swap_place_order to verify leverage. Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/leverage-info\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n }),\n privateRateLimit(\"swap_get_leverage\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_batch_amend\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch amend up to 20 unfilled SWAP/FUTURES orders in one request. Modify price and/or size per order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"swap_batch_amend\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_batch_cancel\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch cancel up to 20 SWAP/FUTURES orders in one request. Provide instId plus ordId or clOrdId for each order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"swap_batch_cancel\", 60),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { OkxConfig } from \"../config.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport { MODULES, type ModuleId } from \"../constants.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerAlgoTradeTools } from \"./algo-trade.js\";\nimport { registerAuditTools } from \"./audit.js\";\nimport { registerBotTools } from \"./bot/index.js\";\nimport { registerFuturesTools } from \"./futures-trade.js\";\nimport { registerMarketTools } from \"./market.js\";\nimport { registerOptionTools } from \"./option-trade.js\";\nimport { registerSpotTradeTools } from \"./spot-trade.js\";\nimport { registerSwapTradeTools } from \"./swap-trade.js\";\nimport type { ToolSpec, ToolArgs } from \"./types.js\";\n\nfunction allToolSpecs(): ToolSpec[] {\n return [\n ...registerMarketTools(),\n ...registerSpotTradeTools(),\n ...registerSwapTradeTools(),\n ...registerFuturesTools(),\n ...registerOptionTools(),\n ...registerAlgoTradeTools(),\n ...registerAccountTools(),\n ...registerBotTools(),\n ...registerAuditTools(),\n ];\n}\n\nexport function buildTools(config: OkxConfig): ToolSpec[] {\n const enabledModules = new Set(config.modules);\n const tools = allToolSpecs().filter((tool) => enabledModules.has(tool.module));\n if (!config.readOnly) {\n return tools;\n }\n return tools.filter((tool) => !tool.isWrite);\n}\n\nexport interface ToolResult {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}\n\nexport type ToolRunner = (toolName: string, args: ToolArgs) => Promise<ToolResult>;\n\n/**\n * Create a function that can call any registered tool by name.\n * All modules are enabled regardless of config.modules, since CLI\n * controls which commands to expose at the routing level.\n */\nexport function createToolRunner(client: OkxRestClient, config: OkxConfig): ToolRunner {\n const fullConfig: OkxConfig = { ...config, modules: [...MODULES] as ModuleId[], readOnly: false };\n const tools = allToolSpecs();\n const toolMap = new Map<string, ToolSpec>(tools.map((t) => [t.name, t]));\n\n return async (toolName: string, args: ToolArgs): Promise<ToolResult> => {\n const tool = toolMap.get(toolName);\n if (!tool) throw new Error(`Unknown tool: ${toolName}`);\n const result = await tool.handler(args, { config: fullConfig, client });\n return result as ToolResult;\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\n\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n config: OkxConfig;\n client: OkxRestClient;\n}\n\nexport interface ToolSpec {\n name: string;\n module: ModuleId;\n description: string;\n inputSchema: JsonSchema;\n isWrite: boolean;\n handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n readOnlyHint: !tool.isWrite,\n destructiveHint: tool.isWrite,\n idempotentHint: !tool.isWrite,\n openWorldHint: true,\n },\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\n\nexport { stringify as tomlStringify };\n\nexport interface OkxProfile {\n api_key?: string;\n secret_key?: string;\n passphrase?: string;\n base_url?: string;\n timeout_ms?: number;\n demo?: boolean;\n site?: string;\n}\n\nexport interface OkxTomlConfig {\n default_profile?: string;\n profiles: Record<string, OkxProfile>;\n}\n\nexport function configFilePath(): string {\n return join(homedir(), \".okx\", \"config.toml\");\n}\n\n/**\n * Read the full config from ~/.okx/config.toml.\n * Returns a config with empty profiles if the file does not exist.\n */\nexport function readFullConfig(): OkxTomlConfig {\n const path = configFilePath();\n if (!existsSync(path)) return { profiles: {} };\n const raw = readFileSync(path, \"utf-8\");\n return parse(raw) as unknown as OkxTomlConfig;\n}\n\n/**\n * Read a profile from ~/.okx/config.toml.\n * Returns an empty object if the file does not exist or the profile is not found.\n */\nexport function readTomlProfile(profileName?: string): OkxProfile {\n const config = readFullConfig();\n const name = profileName ?? config.default_profile ?? \"default\";\n return config.profiles?.[name] ?? {};\n}\n\n/**\n * Write the full config to ~/.okx/config.toml.\n * Creates the parent directory if it does not exist.\n */\nexport function writeFullConfig(config: OkxTomlConfig): void {\n const path = configFilePath();\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, stringify(config as unknown as Record<string, unknown>), \"utf-8\");\n}\n","import { BOT_DEFAULT_SUB_MODULES, BOT_SUB_MODULE_IDS, DEFAULT_MODULES, DEFAULT_SOURCE_TAG, MODULES, OKX_API_BASE_URL, OKX_SITES, SITE_IDS, type BotSubModuleId, type ModuleId, type SiteId } from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\nimport { readTomlProfile } from \"./config/toml.js\";\n\nexport interface CliOptions {\n modules?: string;\n readOnly: boolean;\n demo: boolean;\n profile?: string;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n}\n\nexport interface OkxConfig {\n apiKey?: string;\n secretKey?: string;\n passphrase?: string;\n hasAuth: boolean;\n baseUrl: string;\n timeoutMs: number;\n modules: ModuleId[];\n readOnly: boolean;\n demo: boolean;\n site: SiteId;\n userAgent?: string;\n sourceTag: string;\n}\n\n/** Base (non-bot) modules — used when expanding \"all\". */\nconst BASE_MODULES = MODULES.filter(\n (m) => !BOT_SUB_MODULE_IDS.includes(m as BotSubModuleId),\n);\n\nfunction parseModuleList(rawModules?: string): ModuleId[] {\n if (!rawModules || rawModules.trim().length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const trimmed = rawModules.trim().toLowerCase();\n if (trimmed === \"all\") {\n // \"all\" → every module including all bot sub-modules\n return [...BASE_MODULES, ...BOT_SUB_MODULE_IDS] as ModuleId[];\n }\n\n const requested = trimmed\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n\n if (requested.length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const deduped = new Set<ModuleId>();\n for (const moduleId of requested) {\n // \"bot\" shorthand → expand to default bot sub-modules\n if (moduleId === \"bot\") {\n for (const sub of BOT_DEFAULT_SUB_MODULES) deduped.add(sub);\n continue;\n }\n // \"bot.all\" → expand to all bot sub-modules\n if (moduleId === \"bot.all\") {\n for (const sub of BOT_SUB_MODULE_IDS) deduped.add(sub);\n continue;\n }\n if (!MODULES.includes(moduleId as ModuleId)) {\n throw new ConfigError(\n `Unknown module \"${moduleId}\".`,\n `Use one of: ${MODULES.join(\", \")}, \"bot\", \"bot.all\", or \"all\".`,\n );\n }\n deduped.add(moduleId as ModuleId);\n }\n\n return Array.from(deduped);\n}\n\n/**\n * Credential priority (highest to lowest):\n * 1. Environment variables (OKX_API_KEY / OKX_SECRET_KEY / OKX_PASSPHRASE)\n * 2. ~/.okx/config.toml — profile selected by cli.profile or default_profile\n *\n * Site priority (highest to lowest):\n * 1. cli.site arg\n * 2. OKX_SITE env var\n * 3. toml profile site field\n * 4. default: \"global\"\n *\n * Base URL priority (highest to lowest):\n * 1. OKX_API_BASE_URL env var (explicit override — advanced users)\n * 2. toml profile base_url\n * 3. site's apiBaseUrl (auto-derived from site)\n */\nexport function loadConfig(cli: CliOptions): OkxConfig {\n // Read toml profile as fallback\n const toml = readTomlProfile(cli.profile);\n\n const apiKey = process.env.OKX_API_KEY?.trim() ?? toml.api_key;\n const secretKey = process.env.OKX_SECRET_KEY?.trim() ?? toml.secret_key;\n const passphrase = process.env.OKX_PASSPHRASE?.trim() ?? toml.passphrase;\n\n const hasAuth = Boolean(apiKey && secretKey && passphrase);\n const partialAuth = Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);\n\n if (partialAuth && !hasAuth) {\n throw new ConfigError(\n \"Partial API credentials detected.\",\n \"Set OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE together (env vars or config.toml profile).\",\n );\n }\n\n // demo flag: cli arg > env var > toml profile\n const demo =\n cli.demo ||\n process.env.OKX_DEMO === \"1\" ||\n process.env.OKX_DEMO === \"true\" ||\n (toml.demo ?? false);\n\n // site: cli arg > env var > toml profile > default \"global\"\n const rawSite = cli.site?.trim() ?? process.env.OKX_SITE?.trim() ?? toml.site ?? \"global\";\n if (!SITE_IDS.includes(rawSite as SiteId)) {\n throw new ConfigError(\n `Unknown site \"${rawSite}\".`,\n `Use one of: ${SITE_IDS.join(\", \")}.`,\n );\n }\n const site = rawSite as SiteId;\n\n // base url: env var > toml profile > site's apiBaseUrl\n const rawBaseUrl =\n process.env.OKX_API_BASE_URL?.trim() ?? toml.base_url ?? OKX_SITES[site].apiBaseUrl;\n if (!rawBaseUrl.startsWith(\"http://\") && !rawBaseUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid base URL \"${rawBaseUrl}\".`,\n \"OKX_API_BASE_URL must start with http:// or https://\",\n );\n }\n const baseUrl = rawBaseUrl.replace(/\\/+$/, \"\");\n\n // timeout: env var > toml profile > default\n const rawTimeout = process.env.OKX_TIMEOUT_MS\n ? Number(process.env.OKX_TIMEOUT_MS)\n : (toml.timeout_ms ?? 15_000);\n if (!Number.isFinite(rawTimeout) || rawTimeout <= 0) {\n throw new ConfigError(\n `Invalid timeout value \"${rawTimeout}\".`,\n \"Set OKX_TIMEOUT_MS as a positive integer in milliseconds.\",\n );\n }\n\n return {\n apiKey,\n secretKey,\n passphrase,\n hasAuth,\n baseUrl,\n timeoutMs: Math.floor(rawTimeout),\n modules: parseModuleList(cli.modules),\n readOnly: cli.readOnly,\n demo,\n site,\n userAgent: cli.userAgent,\n sourceTag: cli.sourceTag ?? DEFAULT_SOURCE_TAG,\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CACHE_FILE = join(homedir(), \".okx\", \"update-check.json\");\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface PackageCache {\n latestVersion: string;\n checkedAt: number;\n}\n\ntype UpdateCache = Record<string, PackageCache>;\n\nfunction readCache(): UpdateCache {\n try {\n if (existsSync(CACHE_FILE)) {\n return JSON.parse(readFileSync(CACHE_FILE, \"utf-8\")) as UpdateCache;\n }\n } catch {\n // ignore corrupt cache\n }\n return {};\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n mkdirSync(join(homedir(), \".okx\"), { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2), \"utf-8\");\n } catch {\n // ignore write failures\n }\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v\n .replace(/^v/, \"\")\n .split(\".\")\n .map((n) => parseInt(n, 10));\n const [cMaj, cMin, cPat] = parse(current);\n const [lMaj, lMin, lPat] = parse(latest);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`, {\n signal: controller.signal,\n headers: { accept: \"application/json\" },\n });\n clearTimeout(timeout);\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\nfunction refreshCacheInBackground(packageName: string): void {\n fetchLatestVersion(packageName)\n .then((latest) => {\n if (!latest) return;\n const cache = readCache();\n cache[packageName] = { latestVersion: latest, checkedAt: Date.now() };\n writeCache(cache);\n })\n .catch(() => {\n // ignore\n });\n}\n\n/**\n * Check if an update is available and print a notice to stderr.\n * Uses a local cache (~/.okx/update-check.json) so network calls happen\n * at most once per 24 hours, in the background without blocking startup.\n */\nexport function checkForUpdates(packageName: string, currentVersion: string): void {\n const cache = readCache();\n const entry = cache[packageName];\n\n if (entry && isNewerVersion(currentVersion, entry.latestVersion)) {\n process.stderr.write(\n `\\nUpdate available for ${packageName}: ${currentVersion} → ${entry.latestVersion}\\n` +\n `Run: npm install -g ${packageName}\\n\\n`,\n );\n }\n\n if (!entry || Date.now() - entry.checkedAt > CHECK_INTERVAL_MS) {\n refreshCacheInBackground(packageName);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nconst SENSITIVE_KEY_PATTERN = /apiKey|secretKey|passphrase|password|secret/i;\n\nfunction sanitize(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(sanitize);\n }\n if (typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (SENSITIVE_KEY_PATTERN.test(k)) {\n result[k] = \"[REDACTED]\";\n } else {\n result[k] = sanitize(v);\n }\n }\n return result;\n }\n return value;\n}\n\nexport interface LogEntry {\n timestamp: string;\n level: Uppercase<LogLevel>;\n tool: string;\n durationMs: number;\n params: unknown;\n result: unknown;\n}\n\nexport class TradeLogger {\n private readonly logLevel: LogLevel;\n private readonly logDir: string;\n\n constructor(logLevel: LogLevel = \"info\", logDir?: string) {\n this.logLevel = logLevel;\n this.logDir = logDir ?? path.join(os.homedir(), \".okx\", \"logs\");\n }\n\n getLogPath(date?: Date): string {\n const d = date ?? new Date();\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n return path.join(this.logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n }\n\n log(\n level: LogLevel,\n tool: string,\n params: unknown,\n result: unknown,\n durationMs: number,\n ): void {\n if (LOG_LEVEL_PRIORITY[level] > LOG_LEVEL_PRIORITY[this.logLevel]) {\n return;\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level: level.toUpperCase() as Uppercase<LogLevel>,\n tool,\n durationMs,\n params: sanitize(params),\n result: sanitize(result),\n };\n\n try {\n fs.mkdirSync(this.logDir, { recursive: true });\n fs.appendFileSync(this.getLogPath(), JSON.stringify(entry) + \"\\n\", \"utf8\");\n } catch {\n // silent fail\n }\n }\n\n static sanitize(params: unknown): unknown {\n return sanitize(params);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport { configFilePath } from \"./config/toml.js\";\n\nexport type ClientId = \"claude-desktop\" | \"cursor\" | \"windsurf\" | \"vscode\" | \"claude-code\";\n\nexport interface SetupOptions {\n client: ClientId;\n profile?: string;\n modules?: string;\n}\n\nconst CLIENT_NAMES: Record<ClientId, string> = {\n \"claude-desktop\": \"Claude Desktop\",\n cursor: \"Cursor\",\n windsurf: \"Windsurf\",\n vscode: \"VS Code\",\n \"claude-code\": \"Claude Code CLI\",\n};\n\nexport const SUPPORTED_CLIENTS = Object.keys(CLIENT_NAMES) as ClientId[];\n\nfunction appData(): string {\n return process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n}\n\nconst CLAUDE_CONFIG_FILE = \"claude_desktop_config.json\";\n\n/**\n * Detect Microsoft Store installation of Claude Desktop on Windows.\n * MS Store apps use a sandboxed path:\n * %LOCALAPPDATA%\\Packages\\Claude_<hash>\\LocalCache\\Roaming\\Claude\\\n * Returns the config file path if found, null otherwise.\n */\nfunction findMsStoreClaudePath(): string | null {\n const localAppData = process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\");\n const packagesDir = path.join(localAppData, \"Packages\");\n try {\n const entries = fs.readdirSync(packagesDir);\n const claudePkg = entries.find((e) => e.startsWith(\"Claude_\"));\n if (claudePkg) {\n const configPath = path.join(\n packagesDir, claudePkg, \"LocalCache\", \"Roaming\", \"Claude\", CLAUDE_CONFIG_FILE,\n );\n // Return if the config file or its parent directory already exists\n if (fs.existsSync(configPath) || fs.existsSync(path.dirname(configPath))) {\n return configPath;\n }\n }\n } catch {\n // Packages dir may not exist or may not be readable\n }\n return null;\n}\n\nexport function getConfigPath(client: ClientId): string | null {\n const home = os.homedir();\n const platform = process.platform;\n switch (client) {\n case \"claude-desktop\":\n if (platform === \"win32\") {\n // Prefer MS Store path if detected, otherwise standard %APPDATA%\n return findMsStoreClaudePath() ?? path.join(appData(), \"Claude\", CLAUDE_CONFIG_FILE);\n }\n if (platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"Claude\", CLAUDE_CONFIG_FILE);\n }\n // Linux / other\n return path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"Claude\", CLAUDE_CONFIG_FILE);\n case \"cursor\":\n return path.join(home, \".cursor\", \"mcp.json\");\n case \"windsurf\":\n return path.join(home, \".codeium\", \"windsurf\", \"mcp_config.json\");\n case \"vscode\":\n return path.join(process.cwd(), \".mcp.json\");\n case \"claude-code\":\n return null;\n }\n}\n\nconst NPX_PACKAGE = \"@okx_ai/okx-trade-mcp\";\n\nfunction buildEntry(\n client: ClientId,\n args: string[]\n): Record<string, unknown> {\n if (client === \"vscode\") {\n // VS Code inherits the terminal PATH — bare command is fine\n return { type: \"stdio\", command: \"okx-trade-mcp\", args };\n }\n // Standalone apps (Claude Desktop, Cursor, Windsurf) have a limited PATH\n // that often can't find globally-installed npm bins. Use npx to ensure\n // the binary is always resolved.\n return { command: \"npx\", args: [\"-y\", NPX_PACKAGE, ...args] };\n}\n\nfunction buildArgs(options: SetupOptions): string[] {\n const args: string[] = [];\n if (options.profile) args.push(\"--profile\", options.profile);\n args.push(\"--modules\", options.modules ?? \"all\");\n return args;\n}\n\nfunction mergeJsonConfig(\n configPath: string,\n serverName: string,\n entry: Record<string, unknown>\n): void {\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n\n let data: Record<string, unknown> = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new Error(`Failed to parse existing config at ${configPath}`);\n }\n // Backup before modifying\n const backupPath = configPath + \".bak\";\n fs.copyFileSync(configPath, backupPath);\n process.stdout.write(` Backup → ${backupPath}\\n`);\n }\n\n if (typeof data.mcpServers !== \"object\" || data.mcpServers === null) {\n data.mcpServers = {};\n }\n (data.mcpServers as Record<string, unknown>)[serverName] = entry;\n\n fs.writeFileSync(configPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function printSetupUsage(): void {\n process.stdout.write(\n `Usage: okx-trade-mcp setup --client <client> [--profile <name>] [--modules <list>]\\n\\n` +\n `Clients:\\n` +\n SUPPORTED_CLIENTS.map((id) => ` ${id.padEnd(16)} ${CLIENT_NAMES[id]}`).join(\"\\n\") +\n `\\n\\nOptions:\\n` +\n ` --profile <name> Profile from ${configFilePath()} (default: uses default_profile)\\n` +\n ` --modules <list> Comma-separated modules or \"all\" (default: all)\\n`\n );\n}\n\nexport function runSetup(options: SetupOptions): void {\n const { client } = options;\n const name = CLIENT_NAMES[client];\n const args = buildArgs(options);\n const serverName = options.profile ? `okx-trade-mcp-${options.profile}` : \"okx-trade-mcp\";\n\n if (client === \"claude-code\") {\n const claudeArgs = [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"stdio\",\n serverName,\n \"--\",\n \"okx-trade-mcp\",\n ...args,\n ];\n process.stdout.write(`Running: claude ${claudeArgs.join(\" \")}\\n`);\n execFileSync(\"claude\", claudeArgs, { stdio: \"inherit\" }); // NOSONAR\n process.stdout.write(`✓ Configured ${name}\\n`);\n return;\n }\n\n const configPath = getConfigPath(client);\n if (!configPath) {\n throw new Error(`${name} is not supported on this platform`);\n }\n\n const entry = buildEntry(client, args);\n mergeJsonConfig(configPath, serverName, entry);\n process.stdout.write(\n `✓ Configured ${name}\\n` +\n ` ${configPath}\\n` +\n ` Server args: ${args.join(\" \")}\\n`\n );\n if (client !== \"vscode\") {\n process.stdout.write(` Restart ${name} to apply changes.\\n`);\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","import type { OkxConfig } from \"@agent-tradekit/core\";\nimport { loadConfig } from \"@agent-tradekit/core\";\n\nexport interface LoadProfileOptions {\n profile?: string;\n modules?: string;\n readOnly?: boolean;\n demo?: boolean;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n}\n\n/**\n * Load config for CLI commands.\n * Delegates to core's loadConfig which handles the full priority chain:\n * env vars > ~/.okx/config.toml (selected profile) > defaults\n */\nexport function loadProfileConfig(opts: LoadProfileOptions): OkxConfig {\n return loadConfig({\n profile: opts.profile,\n modules: opts.modules,\n readOnly: opts.readOnly ?? false,\n demo: opts.demo ?? false,\n site: opts.site,\n userAgent: opts.userAgent,\n sourceTag: opts.sourceTag,\n });\n}\n","/**\n * First-run security tips — shown once after install, then never again.\n *\n * Marker file: ~/.okx/.tips-shown\n * Tips are written to stderr so they don't interfere with JSON output.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport function showFirstRunTips(version: string): void {\n const okxDir = join(homedir(), \".okx\");\n const marker = join(okxDir, \".tips-shown\");\n\n if (existsSync(marker)) return;\n\n const w = (s: string) => process.stderr.write(s);\n w(\"\\n\");\n w(` @okx_ai/okx-trade-cli v${version}\\n`);\n w(\" ⚠️ Security Tips: NEVER send API keys in agent chat. Create a dedicated sub-account for your agent. Test on demo before going live.\\n\");\n w(\" ⚠️ 安全提示:切勿在Agent对话中发送API Key。请创建Agent专用子账户接入。先在模拟盘充分测试,再接入实盘。\\n\");\n w(\"\\n\");\n\n try {\n mkdirSync(okxDir, { recursive: true });\n writeFileSync(marker, new Date().toISOString() + \"\\n\");\n } catch {\n // Best-effort — if we can't write the marker, tips show again next time.\n }\n}\n","import * as fs from \"node:fs\";\nimport { runSetup, printSetupUsage, getConfigPath, SUPPORTED_CLIENTS } from \"@agent-tradekit/core\";\nimport type { ClientId, SetupOptions } from \"@agent-tradekit/core\";\n\nexport type { ClientId, SetupOptions };\nexport { runSetup, printSetupUsage, SUPPORTED_CLIENTS };\n\n/** Clients whose config files can be auto-detected on disk. */\nconst DETECTABLE_CLIENTS: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n\n/**\n * Non-interactive setup for a specific client.\n */\nexport function cmdSetupClient(options: SetupOptions): void {\n runSetup(options);\n}\n\n/**\n * Auto-detect installed clients and print what was found.\n * Kept for backward compatibility with `okx config setup-clients`.\n */\nexport function cmdSetupClients(): void {\n const detected: { id: ClientId; path: string }[] = [];\n for (const id of DETECTABLE_CLIENTS) {\n const p = getConfigPath(id);\n if (p && fs.existsSync(p)) {\n detected.push({ id, path: p });\n }\n }\n\n if (detected.length > 0) {\n process.stdout.write(`Detected clients:\\n`);\n for (const { id, path } of detected) {\n process.stdout.write(` ${id.padEnd(16)} ${path}\\n`);\n }\n process.stdout.write(`\\n`);\n }\n\n printSetupUsage();\n}\n","import { SUPPORTED_CLIENTS } from \"./commands/client-setup.js\";\nimport { configFilePath } from \"@agent-tradekit/core\";\n\n// ---------------------------------------------------------------------------\n// Help tree data structures\n// ---------------------------------------------------------------------------\n\ninterface CommandInfo {\n /** Full usage line, e.g. \"okx bot grid create --instId <id> ...\" */\n usage: string;\n /** Short description of what the command does */\n description: string;\n}\n\ninterface GroupInfo {\n /** One-line description shown in parent overview */\n description: string;\n /** Optional direct usage line when the group has no sub-commands */\n usage?: string;\n /** Leaf commands within this group */\n commands?: Record<string, CommandInfo>;\n /** Nested sub-groups (e.g. bot → grid, spot → algo) */\n subgroups?: Record<string, GroupInfo>;\n}\n\ntype HelpTree = Record<string, GroupInfo>;\n\n// ---------------------------------------------------------------------------\n// Help data — descriptions are intentionally kept in sync with core ToolSpec\n// ---------------------------------------------------------------------------\n\nconst HELP_TREE: HelpTree = {\n market: {\n description: \"Market data (ticker, orderbook, candles, trades)\",\n commands: {\n ticker: {\n usage: \"okx market ticker <instId>\",\n description: \"Get latest ticker data for an instrument\",\n },\n tickers: {\n usage: \"okx market tickers <instType>\",\n description: \"Get all tickers for an instrument type (SPOT|SWAP|FUTURES|OPTION)\",\n },\n orderbook: {\n usage: \"okx market orderbook <instId> [--sz <n>]\",\n description: \"Get order book depth for an instrument\",\n },\n candles: {\n usage: \"okx market candles <instId> [--bar <bar>] [--limit <n>]\",\n description: \"Get candlestick (OHLCV) data\",\n },\n instruments: {\n usage: \"okx market instruments --instType <type> [--instId <id>]\",\n description: \"List tradable instruments of a given type\",\n },\n \"funding-rate\": {\n usage: \"okx market funding-rate <instId> [--history] [--limit <n>]\",\n description: \"Get current or historical funding rate for perpetual swaps\",\n },\n \"mark-price\": {\n usage: \"okx market mark-price --instType <MARGIN|SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get mark price for instruments\",\n },\n trades: {\n usage: \"okx market trades <instId> [--limit <n>]\",\n description: \"Get recent trades for an instrument\",\n },\n \"index-ticker\": {\n usage: \"okx market index-ticker [--instId <id>] [--quoteCcy <ccy>]\",\n description: \"Get index ticker data\",\n },\n \"index-candles\": {\n usage: \"okx market index-candles <instId> [--bar <bar>] [--limit <n>] [--history]\",\n description: \"Get index candlestick data\",\n },\n \"price-limit\": {\n usage: \"okx market price-limit <instId>\",\n description: \"Get price limit for an instrument\",\n },\n \"open-interest\": {\n usage: \"okx market open-interest --instType <SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get open interest for instruments\",\n },\n },\n },\n\n account: {\n description: \"Account balance, positions, bills, and configuration\",\n commands: {\n balance: {\n usage: \"okx account balance [<ccy>]\",\n description: \"Get trading account balance\",\n },\n \"asset-balance\": {\n usage: \"okx account asset-balance [--ccy <ccy>]\",\n description: \"Get funding account asset balance\",\n },\n positions: {\n usage: \"okx account positions [--instType <type>] [--instId <id>]\",\n description: \"Get current open positions\",\n },\n \"positions-history\": {\n usage: \"okx account positions-history [--instType <type>] [--instId <id>] [--limit <n>]\",\n description: \"Get historical positions\",\n },\n bills: {\n usage: \"okx account bills [--instType <type>] [--ccy <ccy>] [--limit <n>] [--archive]\",\n description: \"Get account bill history\",\n },\n fees: {\n usage: \"okx account fees --instType <type> [--instId <id>]\",\n description: \"Get trading fee rates\",\n },\n config: {\n usage: \"okx account config\",\n description: \"Get account configuration\",\n },\n \"set-position-mode\": {\n usage: \"okx account set-position-mode --posMode <long_short_mode|net_mode>\",\n description: \"Set position mode (long/short or net)\",\n },\n \"max-size\": {\n usage: \"okx account max-size --instId <id> --tdMode <cross|isolated> [--px <price>]\",\n description: \"Get maximum order size for an instrument\",\n },\n \"max-avail-size\": {\n usage: \"okx account max-avail-size --instId <id> --tdMode <cross|isolated|cash>\",\n description: \"Get maximum available tradable amount\",\n },\n \"max-withdrawal\": {\n usage: \"okx account max-withdrawal [--ccy <ccy>]\",\n description: \"Get maximum withdrawable amount\",\n },\n transfer: {\n usage: \"okx account transfer --ccy <ccy> --amt <n> --from <acct> --to <acct> [--transferType <0|1|2|3>]\",\n description: \"Transfer funds between accounts\",\n },\n audit: {\n usage: \"okx account audit [--tool <name>] [--since <ISO-date>] [--limit <n>]\",\n description: \"Audit account activity and tool call history\",\n },\n },\n },\n\n spot: {\n description: \"Spot trading (orders, algo orders)\",\n commands: {\n orders: {\n usage: \"okx spot orders [--instId <id>] [--history]\",\n description: \"List open or historical spot orders\",\n },\n get: {\n usage: \"okx spot get --instId <id> --ordId <id>\",\n description: \"Get details of a specific spot order\",\n },\n fills: {\n usage: \"okx spot fills [--instId <id>] [--ordId <id>]\",\n description: \"Get trade fill history for spot orders\",\n },\n place: {\n usage: \"okx spot place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--px <price>] [--tdMode <cash|cross|isolated>]\",\n description: \"Place a new spot order\",\n },\n amend: {\n usage: \"okx spot amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending spot order\",\n },\n cancel: {\n usage: \"okx spot cancel <instId> --ordId <id>\",\n description: \"Cancel a pending spot order\",\n },\n batch: {\n usage: \"okx spot batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel spot orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Spot algo orders (conditional, OCO, take-profit/stop-loss)\",\n commands: {\n orders: {\n usage: \"okx spot algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List spot algo orders\",\n },\n place: {\n usage: \"okx spot algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>] [--tdMode <cash|cross|isolated>]\",\n description: \"Place a spot algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx spot algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending spot algo order\",\n },\n cancel: {\n usage: \"okx spot algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending spot algo order\",\n },\n },\n },\n },\n },\n\n swap: {\n description: \"Perpetual swap trading (orders, algo orders)\",\n commands: {\n positions: {\n usage: \"okx swap positions [<instId>]\",\n description: \"Get current perpetual swap positions\",\n },\n orders: {\n usage: \"okx swap orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical swap orders\",\n },\n get: {\n usage: \"okx swap get --instId <id> --ordId <id>\",\n description: \"Get details of a specific swap order\",\n },\n fills: {\n usage: \"okx swap fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for swap orders\",\n },\n place: {\n usage: \"okx swap place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--posSide <side>] [--px <price>] [--tdMode <cross|isolated>]\",\n description: \"Place a new perpetual swap order\",\n },\n cancel: {\n usage: \"okx swap cancel <instId> --ordId <id>\",\n description: \"Cancel a pending swap order\",\n },\n amend: {\n usage: \"okx swap amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending swap order\",\n },\n close: {\n usage: \"okx swap close --instId <id> --mgnMode <cross|isolated> [--posSide <net|long|short>] [--autoCxl]\",\n description: \"Close a swap position\",\n },\n leverage: {\n usage: \"okx swap leverage --instId <id> --lever <n> --mgnMode <cross|isolated> [--posSide <side>]\",\n description: \"Set leverage for a swap instrument\",\n },\n \"get-leverage\": {\n usage: \"okx swap get-leverage --instId <id> --mgnMode <cross|isolated>\",\n description: \"Get current leverage setting for a swap instrument\",\n },\n batch: {\n usage: \"okx swap batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel swap orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Perpetual swap algo orders (trailing stop, conditional, OCO)\",\n commands: {\n orders: {\n usage: \"okx swap algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List swap algo orders\",\n },\n trail: {\n usage: \"okx swap algo trail --instId <id> --side <buy|sell> --sz <n> --callbackRatio <ratio>\\n [--activePx <price>] [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a trailing stop algo order for perpetual swap\",\n },\n place: {\n usage: \"okx swap algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>]\\n [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a swap algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx swap algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending swap algo order\",\n },\n cancel: {\n usage: \"okx swap algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending swap algo order\",\n },\n },\n },\n },\n },\n\n futures: {\n description: \"Futures trading (orders, positions)\",\n commands: {\n orders: {\n usage: \"okx futures orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical futures orders\",\n },\n positions: {\n usage: \"okx futures positions [--instId <id>]\",\n description: \"Get current futures positions\",\n },\n fills: {\n usage: \"okx futures fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for futures orders\",\n },\n place: {\n usage: \"okx futures place --instId <id> --side <buy|sell> --ordType <type> --sz <n>\\n [--tdMode <cross|isolated>] [--posSide <net|long|short>] [--px <price>] [--reduceOnly]\",\n description: \"Place a new futures order\",\n },\n cancel: {\n usage: \"okx futures cancel <instId> --ordId <id>\",\n description: \"Cancel a pending futures order\",\n },\n get: {\n usage: \"okx futures get --instId <id> --ordId <id>\",\n description: \"Get details of a specific futures order\",\n },\n },\n },\n\n option: {\n description: \"Options trading (orders, positions, greeks)\",\n commands: {\n orders: {\n usage: \"okx option orders [--instId <id>] [--uly <uly>] [--history] [--archive]\",\n description: \"List open or historical option orders\",\n },\n get: {\n usage: \"okx option get --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Get details of a specific option order\",\n },\n positions: {\n usage: \"okx option positions [--instId <id>] [--uly <uly>]\",\n description: \"Get current option positions\",\n },\n fills: {\n usage: \"okx option fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for option orders\",\n },\n instruments: {\n usage: \"okx option instruments --uly <uly> [--expTime <date>]\",\n description: \"List tradable option instruments for an underlying\",\n },\n greeks: {\n usage: \"okx option greeks --uly <uly> [--expTime <date>]\",\n description: \"Get option greeks (delta, gamma, theta, vega)\",\n },\n place: {\n usage: \"okx option place --instId <id> --tdMode <cash|cross|isolated> --side <buy|sell> --ordType <type> --sz <n>\\n [--px <price>] [--reduceOnly] [--clOrdId <id>]\",\n description: \"Place a new option order\",\n },\n cancel: {\n usage: \"okx option cancel --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Cancel a pending option order\",\n },\n amend: {\n usage: \"okx option amend --instId <id> [--ordId <id>] [--clOrdId <id>] [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending option order\",\n },\n \"batch-cancel\": {\n usage: \"okx option batch-cancel --orders '<json>'\",\n description: \"Batch cancel option orders\",\n },\n },\n },\n\n bot: {\n description: \"Trading bot strategies (grid, dca)\",\n subgroups: {\n grid: {\n description: \"Grid trading bot — create, monitor, and stop grid orders\",\n commands: {\n orders: {\n usage: \"okx bot grid orders --algoOrdType <grid|contract_grid|moon_grid> [--instId <id>] [--algoId <id>] [--history]\",\n description: \"List active or historical grid bot orders\",\n },\n details: {\n usage: \"okx bot grid details --algoOrdType <type> --algoId <id>\",\n description: \"Get details of a specific grid bot order\",\n },\n \"sub-orders\": {\n usage: \"okx bot grid sub-orders --algoOrdType <type> --algoId <id> [--live]\",\n description: \"List sub-orders of a grid bot (filled or live)\",\n },\n create: {\n usage: \"okx bot grid create --instId <id> --algoOrdType <grid|contract_grid> --maxPx <px> --minPx <px> --gridNum <n>\\n [--runType <1|2>] [--quoteSz <n>] [--baseSz <n>]\\n [--direction <long|short|neutral>] [--lever <n>] [--sz <n>] [--basePos] [--no-basePos]\",\n description: \"Create a new grid bot order (contract grid opens base position by default)\",\n },\n stop: {\n usage: \"okx bot grid stop --algoId <id> --algoOrdType <type> --instId <id> [--stopType <1|2|3|5|6>]\",\n description: \"Stop a running grid bot order\",\n },\n },\n },\n dca: {\n description: \"Contract DCA (Martingale) bot — leveraged recurring buys on futures/swaps\",\n commands: {\n orders: {\n usage: \"okx bot dca orders [--history]\",\n description: \"List active or historical Contract DCA bot orders\",\n },\n details: {\n usage: \"okx bot dca details --algoId <id>\",\n description: \"Get details of a specific Contract DCA bot order\",\n },\n \"sub-orders\": {\n usage: \"okx bot dca sub-orders --algoId <id> [--cycleId <id>]\",\n description: \"List cycles or orders within a cycle of a Contract DCA bot\",\n },\n create: {\n usage: \"okx bot dca create --instId <id> --lever <n> --direction <long|short>\\n --initOrdAmt <n> --maxSafetyOrds <n> --tpPct <n>\\n [--safetyOrdAmt <n>] [--pxSteps <n>] [--pxStepsMult <n>] [--volMult <n>]\\n [--slPct <n>] [--slMode <limit|market>]\\n [--allowReinvest <true|false>] [--triggerStrategy <instant|price|rsi>] [--triggerPx <price>]\\n Note: safetyOrdAmt, pxSteps, pxStepsMult, volMult are required when maxSafetyOrds > 0\",\n description: \"Create a new Contract DCA bot order\",\n },\n stop: {\n usage: \"okx bot dca stop --algoId <id>\",\n description: \"Stop a running Contract DCA bot order\",\n },\n },\n },\n },\n },\n\n config: {\n description: \"Manage CLI configuration profiles\",\n commands: {\n init: {\n usage: \"okx config init [--lang zh]\",\n description: \"Initialize a new configuration profile interactively\",\n },\n show: {\n usage: \"okx config show\",\n description: `Show current configuration (file: ${configFilePath()})`,\n },\n set: {\n usage: \"okx config set <key> <value>\",\n description: \"Set a configuration value\",\n },\n \"setup-clients\": {\n usage: \"okx config setup-clients\",\n description: \"Set up MCP client integrations (Cursor, Windsurf, etc.)\",\n },\n },\n },\n\n setup: {\n description: \"Set up client integrations (Cursor, Windsurf, Claude, etc.)\",\n usage: `okx setup --client <${SUPPORTED_CLIENTS.join(\"|\")}> [--profile <name>] [--modules <list>]`,\n },\n};\n\n// ---------------------------------------------------------------------------\n// Rendering helpers\n// ---------------------------------------------------------------------------\n\n/** Render the global overview (no path arguments). */\nfunction printGlobalHelp(): void {\n const lines: string[] = [\n \"\",\n `Usage: okx [--profile <name>] [--demo] [--json] <module> <action> [args...]`,\n \"\",\n \"Global Options:\",\n ` --profile <name> Use a named profile from ${configFilePath()}`,\n \" --demo Use simulated trading (demo) mode\",\n \" --json Output raw JSON\",\n \" --version, -v Show version\",\n \" --help Show this help\",\n \"\",\n \"Modules:\",\n ];\n\n const colWidth = 12;\n for (const [name, group] of Object.entries(HELP_TREE)) {\n lines.push(` ${name.padEnd(colWidth)}${group.description}`);\n }\n\n lines.push(\"\", 'Run \"okx <module> --help\" for module details.', \"\");\n process.stdout.write(lines.join(\"\\n\"));\n}\n\n/** Render module-level help (one path argument, e.g. \"spot\"). */\nfunction printModuleHelp(moduleName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n process.stderr.write(`Unknown module: ${moduleName}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const hasSubgroups = group.subgroups && Object.keys(group.subgroups).length > 0;\n const hasCommands = group.commands && Object.keys(group.commands).length > 0;\n\n const lines: string[] = [\"\"];\n\n if (hasSubgroups && !hasCommands) {\n // Pure subgroup module (e.g. bot)\n const subgroupNames = Object.keys(group.subgroups!);\n lines.push(`Usage: okx ${moduleName} <strategy> <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\");\n lines.push(\"Strategies:\");\n const colWidth = Math.max(...subgroupNames.map((n) => n.length)) + 4;\n for (const [sgName, sg] of Object.entries(group.subgroups!)) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <strategy> --help\" for details.`);\n } else if (hasSubgroups && hasCommands) {\n // Mixed: has both direct commands and subgroups (e.g. spot, swap)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n lines.push(\"\", \"Subgroups:\");\n const subgroupEntries = Object.entries(group.subgroups!);\n const colWidth = Math.max(...subgroupEntries.map(([n]) => n.length)) + 4;\n for (const [sgName, sg] of subgroupEntries) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <subgroup> --help\" for subgroup details.`);\n } else if (hasCommands) {\n // Plain module with direct commands only (e.g. market, account)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n } else if (group.usage) {\n // Module with no sub-commands (e.g. setup)\n lines.push(`Usage: ${group.usage}`);\n lines.push(\"\", `${group.description}.`);\n if (group.commands) {\n lines.push(\"\");\n for (const cmd of Object.values(group.commands)) {\n lines.push(` ${cmd.description}`);\n lines.push(` Usage: ${cmd.usage}`);\n }\n }\n }\n\n lines.push(\"\");\n process.stdout.write(lines.join(\"\\n\"));\n}\n\n/** Render subgroup-level help (two path arguments, e.g. \"bot\", \"grid\"). */\nfunction printSubgroupHelp(moduleName: string, subgroupName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n process.stderr.write(`Unknown module: ${moduleName}\\n`);\n process.exitCode = 1;\n return;\n }\n const subgroup = group.subgroups?.[subgroupName];\n if (!subgroup) {\n process.stderr.write(`Unknown subgroup: ${moduleName} ${subgroupName}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const lines: string[] = [\n \"\",\n `Usage: okx ${moduleName} ${subgroupName} <action> [args...]`,\n \"\",\n `${subgroup.description}.`,\n \"\",\n \"Commands:\",\n ];\n\n if (subgroup.commands) {\n printCommandList(lines, subgroup.commands);\n }\n\n lines.push(\"\");\n process.stdout.write(lines.join(\"\\n\"));\n}\n\n/** Append a formatted command list to the lines array. */\nfunction printCommandList(lines: string[], commands: Record<string, CommandInfo>): void {\n const names = Object.keys(commands);\n const colWidth = Math.max(...names.map((n) => n.length)) + 4;\n\n for (const [name, cmd] of Object.entries(commands)) {\n lines.push(` ${name.padEnd(colWidth)}${cmd.description}`);\n // Indent usage lines to align with the description column\n const usageLines = cmd.usage.split(\"\\n\");\n lines.push(` ${\" \".repeat(colWidth)}Usage: ${usageLines[0]}`);\n for (const extra of usageLines.slice(1)) {\n lines.push(` ${\" \".repeat(colWidth)} ${extra.trimStart()}`);\n }\n lines.push(\"\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Print help text to stdout.\n *\n * - `printHelp()` — global module overview\n * - `printHelp(\"market\")` — module detail with all commands\n * - `printHelp(\"bot\")` — module overview listing sub-strategies\n * - `printHelp(\"bot\", \"grid\")` — subgroup detail with all commands\n * - `printHelp(\"spot\", \"algo\")` — subgroup detail with all commands\n */\nexport function printHelp(...path: string[]): void {\n const [moduleName, subgroupName] = path;\n if (!moduleName) {\n printGlobalHelp();\n } else if (!subgroupName) {\n printModuleHelp(moduleName);\n } else {\n printSubgroupHelp(moduleName, subgroupName);\n }\n}\n","import { parseArgs } from \"node:util\";\n\nexport interface CliValues {\n profile?: string;\n demo?: boolean;\n json?: boolean;\n help?: boolean;\n version?: boolean;\n client?: string;\n modules?: string;\n bar?: string;\n limit?: string;\n sz?: string;\n instId?: string;\n history?: boolean;\n ordId?: string;\n side?: string;\n ordType?: string;\n px?: string;\n posSide?: string;\n tdMode?: string;\n lever?: string;\n mgnMode?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n algoId?: string;\n reduceOnly?: boolean;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n algoOrdType?: string;\n gridNum?: string;\n maxPx?: string;\n minPx?: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n basePos?: boolean;\n stopType?: string;\n live?: boolean;\n instType?: string;\n quoteCcy?: string;\n archive?: boolean;\n posMode?: string;\n ccy?: string;\n from?: string;\n to?: string;\n transferType?: string;\n subAcct?: string;\n amt?: string;\n autoCxl?: boolean;\n clOrdId?: string;\n newPx?: string;\n // dca bot (contract only)\n initOrdAmt?: string;\n safetyOrdAmt?: string;\n maxSafetyOrds?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n tpPct?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n cycleId?: string;\n lang?: string;\n // option\n uly?: string;\n expTime?: string;\n // batch\n action?: string;\n orders?: string;\n // audit\n since?: string;\n tool?: string;\n // config profile\n force?: boolean;\n}\n\nexport const CLI_OPTIONS = {\n profile: { type: \"string\" },\n demo: { type: \"boolean\", default: false },\n json: { type: \"boolean\", default: false },\n help: { type: \"boolean\", default: false },\n version: { type: \"boolean\", short: \"v\", default: false },\n // setup command\n client: { type: \"string\" },\n modules: { type: \"string\" },\n // market candles\n bar: { type: \"string\" },\n limit: { type: \"string\" },\n sz: { type: \"string\" },\n // orders\n instId: { type: \"string\" },\n history: { type: \"boolean\", default: false },\n ordId: { type: \"string\" },\n // trade\n side: { type: \"string\" },\n ordType: { type: \"string\" },\n px: { type: \"string\" },\n posSide: { type: \"string\" },\n tdMode: { type: \"string\" },\n // leverage\n lever: { type: \"string\" },\n mgnMode: { type: \"string\" },\n // algo orders\n tpTriggerPx: { type: \"string\" },\n tpOrdPx: { type: \"string\" },\n slTriggerPx: { type: \"string\" },\n slOrdPx: { type: \"string\" },\n algoId: { type: \"string\" },\n reduceOnly: { type: \"boolean\", default: false },\n // algo amend\n newSz: { type: \"string\" },\n newTpTriggerPx: { type: \"string\" },\n newTpOrdPx: { type: \"string\" },\n newSlTriggerPx: { type: \"string\" },\n newSlOrdPx: { type: \"string\" },\n // trailing stop\n callbackRatio: { type: \"string\" },\n callbackSpread: { type: \"string\" },\n activePx: { type: \"string\" },\n // grid bot\n algoOrdType: { type: \"string\" },\n gridNum: { type: \"string\" },\n maxPx: { type: \"string\" },\n minPx: { type: \"string\" },\n runType: { type: \"string\" },\n quoteSz: { type: \"string\" },\n baseSz: { type: \"string\" },\n direction: { type: \"string\" },\n basePos: { type: \"boolean\", default: true },\n stopType: { type: \"string\" },\n live: { type: \"boolean\", default: false },\n // market extras\n instType: { type: \"string\" },\n quoteCcy: { type: \"string\" },\n // account extras\n archive: { type: \"boolean\", default: false },\n posMode: { type: \"string\" },\n ccy: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n transferType: { type: \"string\" },\n subAcct: { type: \"string\" },\n amt: { type: \"string\" },\n // swap/order extras\n autoCxl: { type: \"boolean\", default: false },\n clOrdId: { type: \"string\" },\n newPx: { type: \"string\" },\n // dca bot (contract only)\n initOrdAmt: { type: \"string\" },\n safetyOrdAmt: { type: \"string\" },\n maxSafetyOrds: { type: \"string\" },\n pxSteps: { type: \"string\" },\n pxStepsMult: { type: \"string\" },\n volMult: { type: \"string\" },\n tpPct: { type: \"string\" },\n slPct: { type: \"string\" },\n slMode: { type: \"string\" },\n allowReinvest: { type: \"string\" },\n triggerStrategy: { type: \"string\" },\n triggerPx: { type: \"string\" },\n cycleId: { type: \"string\" },\n // i18n\n lang: { type: \"string\" },\n // option\n uly: { type: \"string\" },\n expTime: { type: \"string\" },\n // batch\n action: { type: \"string\" },\n orders: { type: \"string\" },\n // audit\n since: { type: \"string\" },\n tool: { type: \"string\" },\n // config profile\n force: { type: \"boolean\", default: false },\n} as const;\n\nexport function parseCli(argv: string[]): { values: CliValues; positionals: string[] } {\n // Pre-process --no-<flag> for boolean options (parseArgs doesn't support negation natively)\n const negated = new Set<string>();\n const filtered = argv.filter((arg) => {\n if (arg.startsWith(\"--no-\")) {\n const key = arg.slice(5);\n if (key in CLI_OPTIONS && (CLI_OPTIONS as Record<string, { type: string }>)[key].type === \"boolean\") {\n negated.add(key);\n return false;\n }\n }\n return true;\n });\n\n const { values, positionals } = parseArgs({\n args: filtered,\n options: CLI_OPTIONS,\n allowPositionals: true,\n });\n\n for (const key of negated) {\n (values as Record<string, unknown>)[key] = false;\n }\n\n return { values: values as CliValues, positionals };\n}\n","export function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function printTable(rows: Record<string, unknown>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(no data)\\n\");\n return;\n }\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => String(r[k] ?? \"\").length)),\n );\n const header = keys.map((k, i) => k.padEnd(widths[i])).join(\" \");\n const divider = widths.map((w) => \"-\".repeat(w)).join(\" \");\n process.stdout.write(header + \"\\n\" + divider + \"\\n\");\n for (const row of rows) {\n process.stdout.write(\n keys.map((k, i) => String(row[k] ?? \"\").padEnd(widths[i])).join(\" \") + \"\\n\",\n );\n }\n}\n\nexport function printKv(obj: Record<string, unknown>, indent = 0): void {\n const pad = \" \".repeat(indent);\n for (const [k, v] of Object.entries(obj)) {\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n process.stdout.write(`${pad}${k}:\\n`);\n printKv(v as Record<string, unknown>, indent + 2);\n } else {\n process.stdout.write(`${pad}${k.padEnd(20 - indent)} ${v}\\n`);\n }\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdMarketInstruments(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_instruments\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).slice(0, 50).map((t) => ({\n instId: t[\"instId\"],\n ctVal: t[\"ctVal\"],\n lotSz: t[\"lotSz\"],\n minSz: t[\"minSz\"],\n tickSz: t[\"tickSz\"],\n state: t[\"state\"],\n })),\n );\n}\n\nexport async function cmdMarketFundingRate(\n run: ToolRunner,\n instId: string,\n opts: { history: boolean; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_funding_rate\", { instId, history: opts.history, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (opts.history) {\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n realizedRate: r[\"realizedRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n })),\n );\n } else {\n const r = items?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n nextFundingRate: r[\"nextFundingRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n nextFundingTime: new Date(Number(r[\"nextFundingTime\"])).toLocaleString(),\n });\n }\n}\n\nexport async function cmdMarketMarkPrice(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_mark_price\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n instType: r[\"instType\"],\n markPx: r[\"markPx\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTrades(\n run: ToolRunner,\n instId: string,\n opts: { limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_trades\", { instId, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n tradeId: t[\"tradeId\"],\n px: t[\"px\"],\n sz: t[\"sz\"],\n side: t[\"side\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexTicker(\n run: ToolRunner,\n opts: { instId?: string; quoteCcy?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_ticker\", { instId: opts.instId, quoteCcy: opts.quoteCcy });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n idxPx: t[\"idxPx\"],\n high24h: t[\"high24h\"],\n low24h: t[\"low24h\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_candles\", { instId, bar: opts.bar, limit: opts.limit, history: opts.history });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c,\n })),\n );\n}\n\nexport async function cmdMarketPriceLimit(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_price_limit\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n const r = items?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n instId: r[\"instId\"],\n buyLmt: r[\"buyLmt\"],\n sellLmt: r[\"sellLmt\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketOpenInterest(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_open_interest\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n oi: r[\"oi\"],\n oiCcy: r[\"oiCcy\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTicker(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_ticker\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { process.stdout.write(\"No data\\n\"); return; }\n const t = items[0];\n printKv({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h change %\": t[\"sodUtc8\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n time: new Date(Number(t[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketTickers(\n run: ToolRunner,\n instType: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_tickers\", { instType });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n })),\n );\n}\n\nexport async function cmdMarketOrderbook(\n run: ToolRunner,\n instId: string,\n sz: number | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_orderbook\", { instId, sz });\n const data = getData(result);\n if (json) return printJson(data);\n const book = (data as Record<string, unknown>[])[0];\n if (!book) { process.stdout.write(\"No data\\n\"); return; }\n const asks = (book[\"asks\"] as string[][]).slice(0, 5);\n const bids = (book[\"bids\"] as string[][]).slice(0, 5);\n process.stdout.write(\"Asks (price / size):\\n\");\n for (const [p, s] of asks.reverse()) process.stdout.write(` ${p.padStart(16)} ${s}\\n`);\n process.stdout.write(\"Bids (price / size):\\n\");\n for (const [p, s] of bids) process.stdout.write(` ${p.padStart(16)} ${s}\\n`);\n}\n\nexport async function cmdMarketCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_candles\", { instId, bar: opts.bar, limit: opts.limit });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c, vol]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c, vol,\n })),\n );\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdAccountBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const details = (data?.[0]?.[\"details\"] as Record<string, unknown>[]) ?? [];\n printTable(\n details\n .filter((d) => Number(d[\"eq\"]) > 0)\n .map((d) => ({\n currency: d[\"ccy\"],\n equity: d[\"eq\"],\n available: d[\"availEq\"],\n frozen: d[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountAssetBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_asset_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? [])\n .filter((r) => Number(r[\"bal\"]) > 0)\n .map((r) => ({\n ccy: r[\"ccy\"],\n bal: r[\"bal\"],\n availBal: r[\"availBal\"],\n frozenBal: r[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountPositions(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions\", { instType: opts.instType, instId: opts.instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n instType: p[\"instType\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdAccountBills(\n run: ToolRunner,\n opts: { archive: boolean; instType?: string; ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const toolName = opts.archive ? \"account_get_bills_archive\" : \"account_get_bills\";\n const result = await run(toolName, { instType: opts.instType, ccy: opts.ccy, limit: opts.limit });\n const bills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(bills);\n printTable(\n (bills ?? []).map((b) => ({\n billId: b[\"billId\"],\n instId: b[\"instId\"],\n type: b[\"type\"],\n ccy: b[\"ccy\"],\n balChg: b[\"balChg\"],\n bal: b[\"bal\"],\n ts: new Date(Number(b[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountFees(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_trade_fee\", { instType: opts.instType, instId: opts.instId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const fee = data?.[0];\n if (!fee) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n level: fee[\"level\"],\n maker: fee[\"maker\"],\n taker: fee[\"taker\"],\n makerU: fee[\"makerU\"],\n takerU: fee[\"takerU\"],\n ts: new Date(Number(fee[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdAccountConfig(\n run: ToolRunner,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_config\", {});\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const cfg = data?.[0];\n if (!cfg) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n uid: cfg[\"uid\"],\n acctLv: cfg[\"acctLv\"],\n posMode: cfg[\"posMode\"],\n autoLoan: cfg[\"autoLoan\"],\n greeksType: cfg[\"greeksType\"],\n level: cfg[\"level\"],\n levelTmp: cfg[\"levelTmp\"],\n });\n}\n\nexport async function cmdAccountSetPositionMode(\n run: ToolRunner,\n posMode: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_set_position_mode\", { posMode });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Position mode set: ${r?.[\"posMode\"]}\\n`);\n}\n\nexport async function cmdAccountMaxSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; px?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_size\", { instId: opts.instId, tdMode: opts.tdMode, px: opts.px });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({ instId: r[\"instId\"], maxBuy: r[\"maxBuy\"], maxSell: r[\"maxSell\"] });\n}\n\nexport async function cmdAccountMaxAvailSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_avail_size\", { instId: opts.instId, tdMode: opts.tdMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({ instId: r[\"instId\"], availBuy: r[\"availBuy\"], availSell: r[\"availSell\"] });\n}\n\nexport async function cmdAccountMaxWithdrawal(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_max_withdrawal\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n ccy: r[\"ccy\"],\n maxWd: r[\"maxWd\"],\n maxWdEx: r[\"maxWdEx\"],\n })),\n );\n}\n\nexport async function cmdAccountPositionsHistory(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions_history\", { instType: opts.instType, instId: opts.instId, limit: opts.limit });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((p) => ({\n instId: p[\"instId\"],\n direction: p[\"direction\"],\n openAvgPx: p[\"openAvgPx\"],\n closeAvgPx: p[\"closeAvgPx\"],\n realizedPnl: p[\"realizedPnl\"],\n uTime: new Date(Number(p[\"uTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountTransfer(\n run: ToolRunner,\n opts: {\n ccy: string;\n amt: string;\n from: string;\n to: string;\n transferType?: string;\n subAcct?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"account_transfer\", {\n ccy: opts.ccy,\n amt: opts.amt,\n from: opts.from,\n to: opts.to,\n type: opts.transferType,\n subAcct: opts.subAcct,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Transfer: ${r?.[\"transId\"]} (${r?.[\"ccy\"]} ${r?.[\"amt\"]})\\n`);\n}\n\ninterface LogEntry {\n timestamp: string;\n tool: string;\n level: string;\n durationMs?: number;\n error?: boolean;\n}\n\nfunction readAuditLogs(logDir: string, days = 7): LogEntry[] {\n const entries: LogEntry[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n const filePath = path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n let content: string;\n try { content = fs.readFileSync(filePath, \"utf8\"); } catch { continue; }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try { entries.push(JSON.parse(trimmed) as LogEntry); } catch { /* skip */ }\n }\n }\n return entries;\n}\n\nexport function cmdAccountAudit(\n opts: { limit?: string; tool?: string; since?: string; json: boolean },\n): void {\n const logDir = path.join(os.homedir(), \".okx\", \"logs\");\n const limit = Math.min(Number(opts.limit) || 20, 100);\n\n let entries = readAuditLogs(logDir);\n\n if (opts.tool) entries = entries.filter((e) => e.tool === opts.tool);\n if (opts.since) {\n const sinceTime = new Date(opts.since).getTime();\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n entries.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n entries = entries.slice(0, limit);\n\n if (opts.json) return printJson(entries);\n if (!entries.length) { process.stdout.write(\"No audit log entries\\n\"); return; }\n printTable(\n entries.map((e) => ({\n timestamp: e.timestamp,\n tool: e.tool,\n level: e.level,\n duration: e.durationMs != null ? `${e.durationMs}ms` : \"-\",\n status: e.error ? \"ERROR\" : \"OK\",\n })),\n );\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdSpotOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n filled: o[\"fillSz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n px?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n px: opts.px,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSpotCancel(\n run: ToolRunner,\n instId: string,\n ordId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"spot_cancel_order\", { instId, ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSpotAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(\n `Algo order placed: ${order?.[\"algoId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSpotAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order amended: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSpotAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"spot_cancel_algo_order\", { instId, algoId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order cancelled: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSpotGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSpotAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Order amended: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSpotAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { process.stdout.write(\"No algo orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_fills\", { instId: opts.instId, ordId: opts.ordId });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSpotBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n process.stderr.write(\"Error: --orders must be a valid JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n process.stderr.write(\"Error: --orders must be a non-empty JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"spot_batch_orders\",\n amend: \"spot_batch_amend\",\n cancel: \"spot_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n process.stderr.write(`Error: --action must be one of: place, amend, cancel\\n`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"spot_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n for (const r of data ?? []) {\n process.stdout.write(`${r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\"}: ${r[\"sCode\"] === \"0\" ? \"OK\" : r[\"sMsg\"]}\\n`);\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdSwapPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n size: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n uplRatio: p[\"uplRatio\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n px?: string;\n tdMode: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n posSide: opts.posSide,\n px: opts.px,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSwapCancel(\n run: ToolRunner,\n instId: string,\n ordId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_cancel_order\", { instId, ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSwapAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n tdMode: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n posSide: opts.posSide,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(\n `Algo order placed: ${order?.[\"algoId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order amended: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n posSide?: string;\n tdMode: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_move_stop_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n posSide: opts.posSide,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(\n `Trailing stop placed: ${order?.[\"algoId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_cancel_algo_orders\", { instId, algoId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order cancelled: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { process.stdout.write(\"No algo orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSwapGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSwapClose(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; posSide?: string; autoCxl?: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_close_position\", {\n instId: opts.instId,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n autoCxl: opts.autoCxl,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Position closed: ${r?.[\"instId\"]} ${r?.[\"posSide\"] ?? \"\"}\\n`);\n}\n\nexport async function cmdSwapGetLeverage(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_leverage\", { instId: opts.instId, mgnMode: opts.mgnMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n instId: r[\"instId\"],\n mgnMode: r[\"mgnMode\"],\n posSide: r[\"posSide\"],\n lever: r[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Order amended: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSwapSetLeverage(\n run: ToolRunner,\n opts: { instId: string; lever: string; mgnMode: string; posSide?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_set_leverage\", {\n instId: opts.instId,\n lever: opts.lever,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Leverage set: ${r?.[\"lever\"]}x ${r?.[\"instId\"]}\\n`);\n}\n\nexport async function cmdSwapBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n process.stderr.write(\"Error: --orders must be a valid JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n process.stderr.write(\"Error: --orders must be a non-empty JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"swap_batch_orders\",\n amend: \"swap_batch_amend\",\n cancel: \"swap_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n process.stderr.write(`Error: --action must be one of: place, amend, cancel\\n`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"swap_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n for (const r of data ?? []) {\n process.stdout.write(`${r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\"}: ${r[\"sCode\"] === \"0\" ? \"OK\" : r[\"sMsg\"]}\\n`);\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdFuturesOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdFuturesPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdFuturesFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdFuturesPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n tdMode: string;\n posSide?: string;\n px?: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n posSide: opts.posSide,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdFuturesCancel(\n run: ToolRunner,\n instId: string,\n ordId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_cancel_order\", { instId, ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdFuturesGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_order\", { instId: opts.instId, ordId: opts.ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdOptionOrders(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; status: \"live\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_orders\", {\n instId: opts.instId,\n uly: opts.uly,\n status: opts.status,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdOptionPositions(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_positions\", {\n instId: opts.instId,\n uly: opts.uly,\n });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n posSide: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n delta: p[\"deltaPA\"],\n gamma: p[\"gammaPA\"],\n theta: p[\"thetaPA\"],\n vega: p[\"vegaPA\"],\n })),\n );\n}\n\nexport async function cmdOptionFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_fills\", {\n instId: opts.instId,\n ordId: opts.ordId,\n archive: opts.archive,\n });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdOptionInstruments(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_instruments\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const instruments = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(instruments);\n printTable(\n (instruments ?? []).map((i) => ({\n instId: i[\"instId\"],\n uly: i[\"uly\"],\n expTime: i[\"expTime\"],\n stk: i[\"stk\"],\n optType: i[\"optType\"],\n state: i[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGreeks(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_greeks\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const greeks = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(greeks);\n printTable(\n (greeks ?? []).map((g) => ({\n instId: g[\"instId\"],\n delta: g[\"deltaBS\"],\n gamma: g[\"gammaBS\"],\n theta: g[\"thetaBS\"],\n vega: g[\"vegaBS\"],\n iv: g[\"markVol\"],\n markPx: g[\"markPx\"],\n })),\n );\n}\n\nexport async function cmdOptionPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode: string;\n side: string;\n ordType: string;\n sz: string;\n px?: string;\n reduceOnly?: boolean;\n clOrdId?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdOptionCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_cancel_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdOptionAmend(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; newSz?: string; newPx?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Amended: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdOptionBatchCancel(\n run: ToolRunner,\n opts: { orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n process.stderr.write(\"Error: --orders must be a valid JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n process.stderr.write(\"Error: --orders must be a non-empty JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"option_batch_cancel\", { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n for (const r of data ?? []) {\n process.stdout.write(`${r[\"ordId\"]}: ${r[\"sCode\"] === \"0\" ? \"OK\" : r[\"sMsg\"]}\\n`);\n }\n}\n","import { writeFullConfig } from \"@agent-tradekit/core\";\nimport type { OkxTomlConfig } from \"@agent-tradekit/core\";\n\nexport function writeCliConfig(config: OkxTomlConfig): void {\n writeFullConfig(config);\n}\n","import { readFullConfig, configFilePath, OKX_SITES, SITE_IDS, tomlStringify } from \"@agent-tradekit/core\";\nimport type { SiteId } from \"@agent-tradekit/core\";\nimport { writeCliConfig } from \"../config/toml.js\";\nimport { printJson, printKv } from \"../formatter.js\";\nimport type { OkxTomlConfig, OkxProfile } from \"@agent-tradekit/core\";\nimport { createInterface } from \"node:readline\";\nimport { spawnSync } from \"node:child_process\";\n\nexport type Lang = \"en\" | \"zh\";\n\nconst messages = {\n en: {\n title: \"OKX Trade CLI — Configuration Wizard\",\n selectSite: \"Select site:\",\n sitePrompt: \"Site (1/2/3, default: 1): \",\n demoPrompt: \"Use demo trading? (Y/n) \",\n hintDemo: \"The page will redirect to demo trading API management\",\n hintLive: \"The page will redirect to live trading API management\",\n createApiKey: (url: string) => `\\nGo to ${url} to create an API Key (trade permission required)\\n`,\n hint: (h: string) => `Tip: ${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile name (default: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" already exists. Overwrite? (y/N) `,\n cancelled: \"Cancelled.\",\n emptyApiKey: \"Error: API Key cannot be empty\",\n emptySecretKey: \"Error: Secret Key cannot be empty\",\n emptyPassphrase: \"Error: Passphrase cannot be empty\",\n demoSelected: \"Demo trading mode selected. Switch to live anytime via okx config set.\",\n saved: (p: string) => `\\nConfig saved to ${p}\\n`,\n defaultProfile: (name: string) => `Default profile set to: ${name}\\n`,\n usage: \"Usage: okx account balance\\n\",\n writeFailed: (msg: string) => `Failed to write config: ${msg}\\n`,\n permissionDenied: (p: string) => `Permission denied. Check read/write access for ${p} and its parent directory.\\n`,\n manualWrite: (p: string) => `Please manually write the following to ${p}:\\n\\n`,\n },\n zh: {\n title: \"OKX Trade CLI — 配置向导\",\n selectSite: \"请选择站点:\",\n sitePrompt: \"站点 (1/2/3, 默认: 1): \",\n demoPrompt: \"使用模拟盘?(Y/n) \",\n hintDemo: \"页面会自动跳转到模拟盘 API 管理\",\n hintLive: \"页面会自动跳转到实盘 API 管理\",\n createApiKey: (url: string) => `\\n请前往 ${url} 创建 API Key(需要 trade 权限)\\n`,\n hint: (h: string) => `提示:${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile 名称 (默认: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" 已存在,是否覆盖?(y/N) `,\n cancelled: \"已取消。\",\n emptyApiKey: \"错误: API Key 不能为空\",\n emptySecretKey: \"错误: Secret Key 不能为空\",\n emptyPassphrase: \"错误: Passphrase 不能为空\",\n demoSelected: \"已选择模拟盘模式,可随时通过 okx config set 切换为实盘。\",\n saved: (p: string) => `\\n配置已保存到 ${p}\\n`,\n defaultProfile: (name: string) => `已设为默认 profile: ${name}\\n`,\n usage: \"使用方式: okx account balance\\n\",\n writeFailed: (msg: string) => `写入配置文件失败: ${msg}\\n`,\n permissionDenied: (p: string) => `权限不足,请检查 ${p} 及其父目录的读写权限。\\n`,\n manualWrite: (p: string) => `请手动将以下内容写入 ${p}:\\n\\n`,\n },\n} as const;\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((resolve) => rl.question(question, resolve));\n}\n\nexport function cmdConfigShow(json: boolean): void {\n const config = readFullConfig();\n if (json) return printJson(config);\n process.stdout.write(`Config: ${configFilePath()}\\n\\n`);\n process.stdout.write(`default_profile: ${config.default_profile ?? \"(not set)\"}\\n\\n`);\n for (const [name, profile] of Object.entries(config.profiles)) {\n process.stdout.write(`[${name}]\\n`);\n printKv({\n api_key: profile.api_key ? maskSecret(profile.api_key) : \"(not set)\",\n demo: profile.demo ?? false,\n base_url: profile.base_url ?? \"(default)\",\n }, 2);\n process.stdout.write(\"\\n\");\n }\n}\n\nexport function cmdConfigSet(key: string, value: string): void {\n const config = readFullConfig();\n if (key === \"default_profile\") {\n config.default_profile = value;\n writeCliConfig(config);\n process.stdout.write(`default_profile set to \"${value}\"\\n`);\n } else {\n process.stderr.write(`Unknown config key: ${key}\\n`);\n process.exitCode = 1;\n }\n}\n\nexport type SiteKey = SiteId;\n\n/** Maps raw user input (\"1\"/\"2\"/\"3\", site names like \"global\"/\"eea\"/\"us\", or empty) to a site key. */\nexport function parseSiteKey(raw: string): SiteKey {\n const lower = raw.toLowerCase();\n if (lower === \"eea\" || raw === \"2\") return \"eea\";\n if (lower === \"us\" || raw === \"3\") return \"us\";\n if (lower === \"global\" || raw === \"1\") return \"global\";\n return \"global\";\n}\n\n/** Infers site key from a base_url value (for backward-compat with old profiles lacking a site field). */\nexport function inferSiteFromBaseUrl(baseUrl?: string): SiteKey {\n if (!baseUrl) return \"global\";\n for (const id of SITE_IDS) {\n const site = OKX_SITES[id];\n if (baseUrl === site.apiBaseUrl || baseUrl === site.webUrl) return id;\n }\n return \"global\";\n}\n\n/** Masks a secret value, showing only the last 4 characters. */\nexport function maskSecret(value?: string): string {\n if (!value || value.length < 4) return \"****\";\n return \"***\" + value.slice(-4);\n}\n\n/** Builds the targeted API creation URL for the given site and trading mode. */\nexport function buildApiUrl(siteKey: SiteKey, demo: boolean): string {\n const query = demo ? \"?go-demo-trading=1\" : \"?go-live-trading=1\";\n return `${OKX_SITES[siteKey].webUrl}/account/my-api${query}`;\n}\n\n/** Builds a profile entry, omitting base_url for the global site. */\nexport function buildProfileEntry(\n siteKey: SiteKey,\n apiKey: string,\n secretKey: string,\n passphrase: string,\n demo: boolean,\n): OkxProfile {\n const entry: OkxProfile = { api_key: apiKey, secret_key: secretKey, passphrase, demo };\n if (siteKey !== \"global\") {\n entry.base_url = OKX_SITES[siteKey].webUrl;\n }\n return entry;\n}\n\nexport async function cmdConfigInit(lang: Lang = \"en\"): Promise<void> {\n const t = messages[lang];\n process.stdout.write(`${t.title}\\n\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n // Step 1: site selection\n process.stdout.write(`${t.selectSite}\\n`);\n process.stdout.write(\" 1) Global (www.okx.com) [default]\\n\");\n process.stdout.write(\" 2) EEA (my.okx.com)\\n\");\n process.stdout.write(\" 3) US (app.okx.com)\\n\");\n const siteRaw = (await prompt(rl, t.sitePrompt)).trim();\n const siteKey = parseSiteKey(siteRaw);\n\n // Step 2: demo / live selection — must happen before URL construction\n const demoRaw = (await prompt(rl, t.demoPrompt)).trim().toLowerCase();\n const demo = demoRaw !== \"n\";\n\n // Step 3: open targeted API creation page\n const apiUrl = buildApiUrl(siteKey, demo);\n const hintText = demo ? t.hintDemo : t.hintLive;\n process.stdout.write(t.createApiKey(apiUrl));\n process.stdout.write(t.hint(hintText));\n\n // Try to open the URL; silently ignore failures\n try {\n const opener = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n spawnSync(opener, [apiUrl], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n } catch {\n // silently ignore\n }\n\n const defaultProfileName = demo ? \"okx-demo\" : \"okx-prod\";\n const profileNameRaw = await prompt(rl, t.profilePrompt(defaultProfileName));\n const profileName = profileNameRaw.trim() || defaultProfileName;\n\n // Check if profile already exists\n const config = readFullConfig();\n if (config.profiles[profileName]) {\n const overwrite = (await prompt(rl, t.profileExists(profileName))).trim().toLowerCase();\n if (overwrite !== \"y\") {\n process.stdout.write(`${t.cancelled}\\n`);\n return;\n }\n }\n\n const apiKey = (await prompt(rl, \"API Key: \")).trim();\n if (!apiKey) {\n process.stderr.write(`${t.emptyApiKey}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const secretKey = (await prompt(rl, \"Secret Key: \")).trim();\n if (!secretKey) {\n process.stderr.write(`${t.emptySecretKey}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const passphrase = (await prompt(rl, \"Passphrase: \")).trim();\n if (!passphrase) {\n process.stderr.write(`${t.emptyPassphrase}\\n`);\n process.exitCode = 1;\n return;\n }\n\n if (demo) {\n process.stdout.write(`${t.demoSelected}\\n`);\n }\n\n const profileEntry = buildProfileEntry(siteKey, apiKey, secretKey, passphrase, demo);\n config.profiles[profileName] = profileEntry;\n\n // Auto-set as default_profile\n if (!config.default_profile || config.default_profile !== profileName) {\n config.default_profile = profileName;\n }\n\n const configPath = configFilePath();\n try {\n writeCliConfig(config);\n process.stdout.write(t.saved(configPath));\n process.stdout.write(t.defaultProfile(profileName));\n process.stdout.write(t.usage);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const isPermission = err instanceof Error && \"code\" in err && (err.code === \"EACCES\" || err.code === \"EPERM\");\n process.stderr.write(t.writeFailed(message));\n if (isPermission) {\n process.stderr.write(t.permissionDenied(configPath));\n }\n process.stderr.write(t.manualWrite(configPath));\n process.stdout.write(tomlStringify(config as unknown as Record<string, unknown>) + \"\\n\");\n process.exitCode = 1;\n }\n } finally {\n rl.close();\n }\n}\n\n/**\n * Non-interactive profile creation / update.\n * Usage: okx config add-profile AK=xxx SK=yyy PP=zzz [site=global|eea|us] [demo=true|false] [name=xxx] [--force]\n */\nexport function cmdConfigAddProfile(kvPairs: string[], force: boolean): void {\n // Parse key=value pairs (split on first '=' only to handle values containing '=')\n const params: Record<string, string> = {};\n for (const pair of kvPairs) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1);\n params[key.toUpperCase()] = value;\n }\n\n const ak = params[\"AK\"];\n const sk = params[\"SK\"];\n const pp = params[\"PP\"];\n\n // Validate required fields\n const missing: string[] = [];\n if (!ak) missing.push(\"AK\");\n if (!sk) missing.push(\"SK\");\n if (!pp) missing.push(\"PP\");\n if (missing.length > 0) {\n process.stderr.write(`Error: missing required parameter(s): ${missing.join(\", \")}\\n`);\n process.stderr.write(\"Usage: okx config add-profile AK=<key> SK=<secret> PP=<passphrase> [site=global|eea|us] [demo=true|false] [name=<name>] [--force]\\n\");\n process.exitCode = 1;\n return;\n }\n\n const siteKey = parseSiteKey(params[\"SITE\"] ?? \"\");\n const demo = params[\"DEMO\"] !== undefined ? params[\"DEMO\"].toLowerCase() !== \"false\" : true;\n const defaultName = demo ? \"demo\" : \"live\";\n const profileName = params[\"NAME\"] ?? defaultName;\n\n const config = readFullConfig();\n\n // Check for conflict\n if (config.profiles[profileName] && !force) {\n process.stderr.write(`Error: profile \"${profileName}\" already exists. Use --force to overwrite.\\n`);\n process.exitCode = 1;\n return;\n }\n\n // Build profile entry and set site field\n const entry = buildProfileEntry(siteKey, ak, sk, pp, demo);\n entry.site = siteKey;\n config.profiles[profileName] = entry;\n config.default_profile = profileName;\n\n writeCliConfig(config);\n process.stdout.write(`Profile \"${profileName}\" saved to ${configFilePath()}\\n`);\n process.stdout.write(`Default profile set to: ${profileName}\\n`);\n}\n\n/**\n * Lists all profiles, masking sensitive fields.\n * Default profile is marked with *.\n */\nexport function cmdConfigListProfile(): void {\n const config = readFullConfig();\n const entries = Object.entries(config.profiles);\n if (entries.length === 0) {\n process.stdout.write(\"No profiles found. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\\n\");\n return;\n }\n process.stdout.write(`Config: ${configFilePath()}\\n\\n`);\n for (const [name, profile] of entries) {\n const isDefault = name === config.default_profile;\n const marker = isDefault ? \" *\" : \"\";\n const site = profile.site ?? inferSiteFromBaseUrl(profile.base_url);\n const mode = profile.demo !== false ? \"demo (模拟盘)\" : \"live (实盘)\";\n process.stdout.write(`[${name}]${marker}\\n`);\n process.stdout.write(` api_key: ${maskSecret(profile.api_key)}\\n`);\n process.stdout.write(` secret_key: ${maskSecret(profile.secret_key)}\\n`);\n process.stdout.write(` passphrase: ${maskSecret(profile.passphrase)}\\n`);\n process.stdout.write(` site: ${site}\\n`);\n process.stdout.write(` mode: ${mode}\\n`);\n process.stdout.write(\"\\n\");\n }\n}\n\n/**\n * Switches the default profile.\n * Usage: okx config use <profile-name>\n */\nexport function cmdConfigUse(profileName: string): void {\n if (!profileName) {\n process.stderr.write(\"Error: profile name is required.\\nUsage: okx config use <profile-name>\\n\");\n process.exitCode = 1;\n return;\n }\n\n const config = readFullConfig();\n const available = Object.keys(config.profiles);\n\n if (!config.profiles[profileName]) {\n process.stderr.write(`Error: profile \"${profileName}\" does not exist.\\n`);\n if (available.length > 0) {\n process.stderr.write(`Available profiles: ${available.join(\", \")}\\n`);\n } else {\n process.stderr.write(\"No profiles configured. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\\n\");\n }\n process.exitCode = 1;\n return;\n }\n\n config.default_profile = profileName;\n writeCliConfig(config);\n process.stdout.write(`Default profile set to: \"${profileName}\"\\n`);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printTable, printKv } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdGridOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n instId?: string;\n algoId?: string;\n status: \"active\" | \"history\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_orders\", {\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n algoId: opts.algoId,\n status: opts.status,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No grid bots\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"algoOrdType\"],\n state: o[\"state\"],\n pnl: o[\"pnlRatio\"],\n gridNum: o[\"gridNum\"],\n maxPx: o[\"maxPx\"],\n minPx: o[\"minPx\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdGridDetails(\n run: ToolRunner,\n opts: { algoOrdType: string; algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"grid_get_order_details\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { process.stdout.write(\"Bot not found\\n\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n instId: detail[\"instId\"],\n type: detail[\"algoOrdType\"],\n state: detail[\"state\"],\n maxPx: detail[\"maxPx\"],\n minPx: detail[\"minPx\"],\n gridNum: detail[\"gridNum\"],\n runType: detail[\"runType\"] === \"1\" ? \"arithmetic\" : \"geometric\",\n pnl: detail[\"pnl\"],\n pnlRatio: detail[\"pnlRatio\"],\n investAmt: detail[\"investAmt\"],\n totalAnnRate: detail[\"totalAnnRate\"],\n createdAt: new Date(Number(detail[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdGridSubOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n algoId: string;\n type: \"filled\" | \"live\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_sub_orders\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n type: opts.type,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No sub-orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n ordId: o[\"ordId\"],\n side: o[\"side\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillPx: o[\"fillPx\"],\n fillSz: o[\"fillSz\"],\n state: o[\"state\"],\n fee: o[\"fee\"],\n })),\n );\n}\n\nexport async function cmdGridCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n algoOrdType: string;\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n lever?: string;\n sz?: string;\n basePos?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_create_order\", {\n instId: opts.instId,\n algoOrdType: opts.algoOrdType,\n maxPx: opts.maxPx,\n minPx: opts.minPx,\n gridNum: opts.gridNum,\n runType: opts.runType,\n quoteSz: opts.quoteSz,\n baseSz: opts.baseSz,\n direction: opts.direction,\n lever: opts.lever,\n sz: opts.sz,\n basePos: opts.basePos,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Grid bot created: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdGridStop(\n run: ToolRunner,\n opts: {\n algoId: string;\n algoOrdType: string;\n instId: string;\n stopType?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_stop_order\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n stopType: opts.stopType,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Grid bot stopped: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// DCA (Contract) commands\n// ---------------------------------------------------------------------------\n\nexport async function cmdDcaCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n lever: string;\n direction: string;\n initOrdAmt: string;\n maxSafetyOrds: string;\n tpPct: string;\n safetyOrdAmt?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"dca_create_order\", {\n instId: opts.instId,\n lever: opts.lever,\n direction: opts.direction,\n initOrdAmt: opts.initOrdAmt,\n maxSafetyOrds: opts.maxSafetyOrds,\n tpPct: opts.tpPct,\n safetyOrdAmt: opts.safetyOrdAmt,\n pxSteps: opts.pxSteps,\n pxStepsMult: opts.pxStepsMult,\n volMult: opts.volMult,\n slPct: opts.slPct,\n slMode: opts.slMode,\n allowReinvest: opts.allowReinvest,\n triggerStrategy: opts.triggerStrategy,\n triggerPx: opts.triggerPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `DCA bot created: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdDcaStop(\n run: ToolRunner,\n opts: { algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_stop_order\", {\n algoId: opts.algoId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `DCA bot stopped: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdDcaOrders(\n run: ToolRunner,\n opts: { history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_orders\", {\n status: opts.history ? \"history\" : \"active\",\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No DCA bots\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n state: o[\"state\"],\n pnl: o[\"pnl\"],\n pnlRatio: o[\"pnlRatio\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdDcaDetails(\n run: ToolRunner,\n opts: { algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_order_details\", {\n algoId: opts.algoId,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { process.stdout.write(\"DCA bot not found\\n\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n instId: detail[\"instId\"],\n sz: detail[\"sz\"],\n avgPx: detail[\"avgPx\"],\n initPx: detail[\"initPx\"],\n tpPx: detail[\"tpPx\"],\n slPx: detail[\"slPx\"] || \"-\",\n upl: detail[\"upl\"],\n fee: detail[\"fee\"],\n fundingFee: detail[\"fundingFee\"],\n curCycleId: detail[\"curCycleId\"],\n fillSafetyOrds: detail[\"fillSafetyOrds\"],\n createdAt: new Date(Number(detail[\"startTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdDcaSubOrders(\n run: ToolRunner,\n opts: { algoId: string; cycleId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_sub_orders\", {\n algoId: opts.algoId,\n cycleId: opts.cycleId,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No sub-orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n cycleId: o[\"cycleId\"],\n status: o[\"cycleStatus\"],\n current: o[\"currentCycle\"] ? \"yes\" : \"\",\n avgPx: o[\"avgPx\"],\n tpPx: o[\"tpPx\"],\n realizedPnl: o[\"realizedPnl\"],\n fee: o[\"fee\"],\n startTime: o[\"startTime\"] ? new Date(Number(o[\"startTime\"] as string)).toLocaleString() : \"\",\n })),\n );\n}\n"],"mappings":"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","names":["endPtr","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","fs","path","os","normalize","path","messages","normalizeWrite","response","path","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","parse","existsSync","mkdirSync","writeFileSync","join","homedir","fs","path","path","fs","path","os","getData","getData","getData","getData","getData","getData","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../core/src/client/rest-client.ts","../../core/src/utils/signature.ts","../../core/src/utils/errors.ts","../../core/src/utils/rate-limiter.ts","../../core/src/constants.ts","../../core/src/tools/helpers.ts","../../core/src/tools/common.ts","../../core/src/tools/account.ts","../../core/src/tools/algo-trade.ts","../../core/src/tools/audit.ts","../../core/src/tools/bot/grid.ts","../../core/src/tools/bot/dca.ts","../../core/src/tools/bot/index.ts","../../core/src/tools/earn.ts","../../core/src/tools/futures-trade.ts","../../core/src/tools/onchain-earn.ts","../../core/src/tools/market.ts","../../core/src/tools/option-trade.ts","../../core/src/tools/spot-trade.ts","../../core/src/tools/swap-trade.ts","../../core/src/tools/index.ts","../../core/src/tools/types.ts","../../core/src/config/toml.ts","../../core/src/config.ts","../../core/src/utils/update-check.ts","../../core/src/utils/logger.ts","../../core/src/setup.ts","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../src/commands/diagnose.ts","../src/config/loader.ts","../src/commands/client-setup.ts","../src/help.ts","../src/parser.ts","../src/formatter.ts","../src/commands/market.ts","../src/commands/account.ts","../src/commands/spot.ts","../src/commands/swap.ts","../src/commands/futures.ts","../src/commands/option.ts","../src/config/toml.ts","../src/commands/config.ts","../src/commands/earn.ts","../src/commands/bot.ts","../src/commands/onchain-earn.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { OkxRestClient, toToolErrorPayload, checkForUpdates, createToolRunner } from \"@agent-tradekit/core\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\n\ndeclare const __GIT_HASH__: string;\n\nconst _require = createRequire(import.meta.url);\nconst CLI_VERSION = (_require(\"../package.json\") as { version: string }).version;\nconst GIT_HASH: string = typeof __GIT_HASH__ !== \"undefined\" ? __GIT_HASH__ : \"dev\";\nimport { cmdDiagnose } from \"./commands/diagnose.js\";\nimport { loadProfileConfig } from \"./config/loader.js\";\nimport { printHelp } from \"./help.js\";\nimport { parseCli } from \"./parser.js\";\nimport type { CliValues } from \"./parser.js\";\nimport {\n cmdMarketTicker,\n cmdMarketTickers,\n cmdMarketOrderbook,\n cmdMarketCandles,\n cmdMarketInstruments,\n cmdMarketFundingRate,\n cmdMarketMarkPrice,\n cmdMarketTrades,\n cmdMarketIndexTicker,\n cmdMarketIndexCandles,\n cmdMarketPriceLimit,\n cmdMarketOpenInterest,\n} from \"./commands/market.js\";\nimport {\n cmdAccountBalance,\n cmdAccountAssetBalance,\n cmdAccountPositions,\n cmdAccountBills,\n cmdAccountFees,\n cmdAccountConfig,\n cmdAccountSetPositionMode,\n cmdAccountMaxSize,\n cmdAccountMaxAvailSize,\n cmdAccountMaxWithdrawal,\n cmdAccountPositionsHistory,\n cmdAccountTransfer,\n cmdAccountAudit,\n} from \"./commands/account.js\";\nimport {\n cmdSpotOrders,\n cmdSpotPlace,\n cmdSpotCancel,\n cmdSpotFills,\n cmdSpotGet,\n cmdSpotAmend,\n cmdSpotAlgoPlace,\n cmdSpotAlgoAmend,\n cmdSpotAlgoCancel,\n cmdSpotAlgoOrders,\n cmdSpotBatch,\n} from \"./commands/spot.js\";\nimport {\n cmdSwapPositions,\n cmdSwapOrders,\n cmdSwapPlace,\n cmdSwapCancel,\n cmdSwapFills,\n cmdSwapGet,\n cmdSwapClose,\n cmdSwapGetLeverage,\n cmdSwapSetLeverage,\n cmdSwapAlgoPlace,\n cmdSwapAlgoAmend,\n cmdSwapAlgoCancel,\n cmdSwapAlgoOrders,\n cmdSwapAlgoTrailPlace,\n cmdSwapAmend,\n cmdSwapBatch,\n} from \"./commands/swap.js\";\nimport {\n cmdFuturesOrders,\n cmdFuturesPositions,\n cmdFuturesFills,\n cmdFuturesPlace,\n cmdFuturesCancel,\n cmdFuturesGet,\n} from \"./commands/futures.js\";\nimport {\n cmdOptionOrders,\n cmdOptionGet,\n cmdOptionPositions,\n cmdOptionFills,\n cmdOptionInstruments,\n cmdOptionGreeks,\n cmdOptionPlace,\n cmdOptionCancel,\n cmdOptionAmend,\n cmdOptionBatchCancel,\n} from \"./commands/option.js\";\nimport { cmdConfigShow, cmdConfigSet, cmdConfigInit, cmdConfigAddProfile, cmdConfigListProfile, cmdConfigUse } from \"./commands/config.js\";\nimport type { Lang } from \"./commands/config.js\";\nimport {\n cmdSetupClients,\n cmdSetupClient,\n printSetupUsage,\n SUPPORTED_CLIENTS,\n} from \"./commands/client-setup.js\";\nimport type { ClientId } from \"./commands/client-setup.js\";\nimport {\n cmdEarnSavingsBalance,\n cmdEarnSavingsPurchase,\n cmdEarnSavingsRedeem,\n cmdEarnSetLendingRate,\n cmdEarnLendingHistory,\n cmdEarnLendingRateSummary,\n cmdEarnLendingRateHistory,\n} from \"./commands/earn.js\";\nimport {\n cmdGridOrders,\n cmdGridDetails,\n cmdGridSubOrders,\n cmdGridCreate,\n cmdGridStop,\n cmdDcaCreate,\n cmdDcaStop,\n cmdDcaOrders,\n cmdDcaDetails,\n cmdDcaSubOrders,\n} from \"./commands/bot.js\";\nimport {\n cmdOnchainEarnOffers,\n cmdOnchainEarnPurchase,\n cmdOnchainEarnRedeem,\n cmdOnchainEarnCancel,\n cmdOnchainEarnActiveOrders,\n cmdOnchainEarnOrderHistory,\n} from \"./commands/onchain-earn.js\";\n\n// Re-export for tests and external consumers\nexport { printHelp } from \"./help.js\";\nexport type { CliValues } from \"./parser.js\";\n\n// ---------------------------------------------------------------------------\n// Command handlers\n// ---------------------------------------------------------------------------\n\nexport function handleConfigCommand(action: string, rest: string[], json: boolean, lang?: string, force?: boolean): Promise<void> | void {\n if (action === \"init\") return cmdConfigInit((lang === \"zh\" ? \"zh\" : \"en\") as Lang);\n if (action === \"show\") return cmdConfigShow(json);\n if (action === \"set\") return cmdConfigSet(rest[0], rest[1]);\n if (action === \"setup-clients\") return cmdSetupClients();\n if (action === \"add-profile\") return cmdConfigAddProfile(rest, force ?? false);\n if (action === \"list-profile\") return cmdConfigListProfile();\n if (action === \"use\") return cmdConfigUse(rest[0]);\n process.stderr.write(`Unknown config command: ${action}\\n`);\n process.exitCode = 1;\n}\n\nexport function handleSetupCommand(v: CliValues): void {\n if (!v.client) {\n printSetupUsage();\n return;\n }\n if (!SUPPORTED_CLIENTS.includes(v.client as ClientId)) {\n process.stderr.write(\n `Unknown client: \"${v.client}\"\\nSupported: ${SUPPORTED_CLIENTS.join(\", \")}\\n`\n );\n process.exitCode = 1;\n return;\n }\n cmdSetupClient({\n client: v.client as ClientId,\n profile: v.profile,\n modules: v.modules,\n });\n}\n\nexport function handleMarketPublicCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"ticker\") return cmdMarketTicker(run, rest[0], json);\n if (action === \"tickers\") return cmdMarketTickers(run, rest[0], json);\n if (action === \"instruments\")\n return cmdMarketInstruments(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"mark-price\")\n return cmdMarketMarkPrice(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"index-ticker\")\n return cmdMarketIndexTicker(run, { instId: v.instId, quoteCcy: v.quoteCcy, json });\n if (action === \"price-limit\") return cmdMarketPriceLimit(run, rest[0], json);\n if (action === \"open-interest\")\n return cmdMarketOpenInterest(run, { instType: v.instType!, instId: v.instId, json });\n}\n\nexport function handleMarketDataCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"orderbook\")\n return cmdMarketOrderbook(run, rest[0], v.sz !== undefined ? Number(v.sz) : undefined, json);\n if (action === \"candles\")\n return cmdMarketCandles(run, rest[0], { bar: v.bar, limit, json });\n if (action === \"funding-rate\")\n return cmdMarketFundingRate(run, rest[0], { history: v.history ?? false, limit, json });\n if (action === \"trades\")\n return cmdMarketTrades(run, rest[0], { limit, json });\n if (action === \"index-candles\")\n return cmdMarketIndexCandles(run, rest[0], { bar: v.bar, limit, history: v.history ?? false, json });\n}\n\nexport function handleMarketCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n return (\n handleMarketPublicCommand(run, action, rest, v, json) ??\n handleMarketDataCommand(run, action, rest, v, json)\n );\n}\n\nexport function handleAccountWriteCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"set-position-mode\")\n return cmdAccountSetPositionMode(run, v.posMode!, json);\n if (action === \"max-size\")\n return cmdAccountMaxSize(run, { instId: v.instId!, tdMode: v.tdMode!, px: v.px, json });\n if (action === \"max-avail-size\")\n return cmdAccountMaxAvailSize(run, { instId: v.instId!, tdMode: v.tdMode!, json });\n if (action === \"max-withdrawal\") return cmdAccountMaxWithdrawal(run, v.ccy, json);\n if (action === \"transfer\")\n return cmdAccountTransfer(run, {\n ccy: v.ccy!,\n amt: v.amt!,\n from: v.from!,\n to: v.to!,\n transferType: v.transferType,\n subAcct: v.subAcct,\n json,\n });\n}\n\nfunction handleAccountCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"audit\")\n return cmdAccountAudit({ limit: v.limit, tool: v.tool, since: v.since, json });\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"balance\") return cmdAccountBalance(run, rest[0], json);\n if (action === \"asset-balance\") return cmdAccountAssetBalance(run, v.ccy, json);\n if (action === \"positions\")\n return cmdAccountPositions(run, { instType: v.instType, instId: v.instId, json });\n if (action === \"positions-history\")\n return cmdAccountPositionsHistory(run, {\n instType: v.instType,\n instId: v.instId,\n limit,\n json,\n });\n if (action === \"bills\")\n return cmdAccountBills(run, {\n archive: v.archive ?? false,\n instType: v.instType,\n ccy: v.ccy,\n limit,\n json,\n });\n if (action === \"fees\")\n return cmdAccountFees(run, { instType: v.instType!, instId: v.instId, json });\n if (action === \"config\") return cmdAccountConfig(run, json);\n return handleAccountWriteCommand(run, action, v, json);\n}\n\nfunction handleSpotAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"place\")\n return cmdSpotAlgoPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (subAction === \"amend\")\n return cmdSpotAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSpotAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSpotAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nfunction handleSpotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\")\n return cmdSpotOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSpotGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSpotFills(run, { instId: v.instId, ordId: v.ordId, json });\n if (action === \"amend\")\n return cmdSpotAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"place\")\n return cmdSpotPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n px: v.px,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdSpotCancel(run, rest[0], v.ordId!, json);\n if (action === \"algo\")\n return handleSpotAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSpotBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nfunction handleSwapAlgoCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (subAction === \"trail\")\n return cmdSwapAlgoTrailPlace(run, {\n instId: v.instId!,\n side: v.side!,\n sz: v.sz!,\n callbackRatio: v.callbackRatio,\n callbackSpread: v.callbackSpread,\n activePx: v.activePx,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"place\")\n return cmdSwapAlgoPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType ?? \"conditional\",\n sz: v.sz!,\n posSide: v.posSide,\n tdMode: v.tdMode ?? \"cross\",\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n reduceOnly: v.reduceOnly,\n json,\n });\n if (subAction === \"amend\")\n return cmdSwapAlgoAmend(run, {\n instId: v.instId!,\n algoId: v.algoId!,\n newSz: v.newSz,\n newTpTriggerPx: v.newTpTriggerPx,\n newTpOrdPx: v.newTpOrdPx,\n newSlTriggerPx: v.newSlTriggerPx,\n newSlOrdPx: v.newSlOrdPx,\n json,\n });\n if (subAction === \"cancel\")\n return cmdSwapAlgoCancel(run, v.instId!, v.algoId!, json);\n if (subAction === \"orders\")\n return cmdSwapAlgoOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"pending\",\n ordType: v.ordType,\n json,\n });\n}\n\nexport function handleSwapCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"positions\")\n return cmdSwapPositions(run, rest[0] ?? v.instId, json);\n if (action === \"orders\")\n return cmdSwapOrders(run, {\n instId: v.instId,\n status: v.history ? \"history\" : \"open\",\n json,\n });\n if (action === \"get\")\n return cmdSwapGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"fills\")\n return cmdSwapFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"close\")\n return cmdSwapClose(run, {\n instId: v.instId!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n autoCxl: v.autoCxl,\n json,\n });\n if (action === \"get-leverage\")\n return cmdSwapGetLeverage(run, { instId: v.instId!, mgnMode: v.mgnMode!, json });\n if (action === \"place\")\n return cmdSwapPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n posSide: v.posSide,\n px: v.px,\n tdMode: v.tdMode ?? \"cross\",\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdSwapCancel(run, rest[0], v.ordId!, json);\n if (action === \"amend\")\n return cmdSwapAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"leverage\")\n return cmdSwapSetLeverage(run, {\n instId: v.instId!,\n lever: v.lever!,\n mgnMode: v.mgnMode!,\n posSide: v.posSide,\n json,\n });\n if (action === \"algo\")\n return handleSwapAlgoCommand(run, rest[0], v, json);\n if (action === \"batch\")\n return cmdSwapBatch(run, { action: v.action!, orders: v.orders!, json });\n}\n\nfunction handleOptionCommand(\n run: ToolRunner,\n action: string,\n _rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\") {\n let status: \"live\" | \"history\" | \"archive\" = \"live\";\n if (v.archive) status = \"archive\";\n else if (v.history) status = \"history\";\n return cmdOptionOrders(run, { instId: v.instId, uly: v.uly, status, json });\n }\n if (action === \"get\")\n return cmdOptionGet(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"positions\")\n return cmdOptionPositions(run, { instId: v.instId, uly: v.uly, json });\n if (action === \"fills\")\n return cmdOptionFills(run, { instId: v.instId, ordId: v.ordId, archive: v.archive ?? false, json });\n if (action === \"instruments\")\n return cmdOptionInstruments(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"greeks\")\n return cmdOptionGreeks(run, { uly: v.uly!, expTime: v.expTime, json });\n if (action === \"place\")\n return cmdOptionPlace(run, {\n instId: v.instId!,\n tdMode: v.tdMode!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n px: v.px,\n reduceOnly: v.reduceOnly,\n clOrdId: v.clOrdId,\n json,\n });\n if (action === \"cancel\")\n return cmdOptionCancel(run, { instId: v.instId!, ordId: v.ordId, clOrdId: v.clOrdId, json });\n if (action === \"amend\")\n return cmdOptionAmend(run, {\n instId: v.instId!,\n ordId: v.ordId,\n clOrdId: v.clOrdId,\n newSz: v.newSz,\n newPx: v.newPx,\n json,\n });\n if (action === \"batch-cancel\")\n return cmdOptionBatchCancel(run, { orders: v.orders!, json });\n}\n\nfunction handleFuturesCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"orders\") {\n let status: \"archive\" | \"history\" | \"open\" = \"open\";\n if (v.archive) status = \"archive\";\n else if (v.history) status = \"history\";\n return cmdFuturesOrders(run, { instId: v.instId, status, json });\n }\n if (action === \"positions\") return cmdFuturesPositions(run, v.instId, json);\n if (action === \"fills\")\n return cmdFuturesFills(run, {\n instId: v.instId,\n ordId: v.ordId,\n archive: v.archive ?? false,\n json,\n });\n if (action === \"place\")\n return cmdFuturesPlace(run, {\n instId: v.instId!,\n side: v.side!,\n ordType: v.ordType!,\n sz: v.sz!,\n tdMode: v.tdMode ?? \"cross\",\n posSide: v.posSide,\n px: v.px,\n reduceOnly: v.reduceOnly,\n tpTriggerPx: v.tpTriggerPx,\n tpOrdPx: v.tpOrdPx,\n slTriggerPx: v.slTriggerPx,\n slOrdPx: v.slOrdPx,\n json,\n });\n if (action === \"cancel\")\n return cmdFuturesCancel(run, rest[0] ?? v.instId!, v.ordId!, json);\n if (action === \"get\")\n return cmdFuturesGet(run, { instId: rest[0] ?? v.instId!, ordId: v.ordId, json });\n}\n\nexport function handleBotGridCommand(\n run: ToolRunner,\n v: CliValues,\n rest: string[],\n json: boolean\n): Promise<void> | void {\n const subAction = rest[0];\n if (subAction === \"orders\")\n return cmdGridOrders(run, {\n algoOrdType: v.algoOrdType!,\n instId: v.instId,\n algoId: v.algoId,\n status: v.history ? \"history\" : \"active\",\n json,\n });\n if (subAction === \"details\")\n return cmdGridDetails(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n json,\n });\n if (subAction === \"sub-orders\")\n return cmdGridSubOrders(run, {\n algoOrdType: v.algoOrdType!,\n algoId: v.algoId!,\n type: v.live ? \"live\" : \"filled\",\n json,\n });\n if (subAction === \"create\")\n return cmdGridCreate(run, {\n instId: v.instId!,\n algoOrdType: v.algoOrdType!,\n maxPx: v.maxPx!,\n minPx: v.minPx!,\n gridNum: v.gridNum!,\n runType: v.runType,\n quoteSz: v.quoteSz,\n baseSz: v.baseSz,\n direction: v.direction,\n lever: v.lever,\n sz: v.sz,\n basePos: v.basePos,\n json,\n });\n if (subAction === \"stop\")\n return cmdGridStop(run, {\n algoId: v.algoId!,\n algoOrdType: v.algoOrdType!,\n instId: v.instId!,\n stopType: v.stopType,\n json,\n });\n}\n\nexport function handleBotDcaCommand(\n run: ToolRunner,\n subAction: string,\n v: CliValues,\n json: boolean,\n): Promise<void> | void {\n if (subAction === \"orders\")\n return cmdDcaOrders(run, { history: v.history ?? false, json });\n if (subAction === \"details\")\n return cmdDcaDetails(run, { algoId: v.algoId!, json });\n if (subAction === \"sub-orders\")\n return cmdDcaSubOrders(run, { algoId: v.algoId!, cycleId: v.cycleId, json });\n if (subAction === \"create\")\n return cmdDcaCreate(run, {\n instId: v.instId!,\n lever: v.lever!,\n direction: v.direction!,\n initOrdAmt: v.initOrdAmt!,\n maxSafetyOrds: v.maxSafetyOrds!,\n tpPct: v.tpPct!,\n safetyOrdAmt: v.safetyOrdAmt,\n pxSteps: v.pxSteps,\n pxStepsMult: v.pxStepsMult,\n volMult: v.volMult,\n slPct: v.slPct,\n slMode: v.slMode,\n allowReinvest: v.allowReinvest,\n triggerStrategy: v.triggerStrategy,\n triggerPx: v.triggerPx,\n json,\n });\n if (subAction === \"stop\")\n return cmdDcaStop(run, { algoId: v.algoId!, json });\n}\n\nexport function handleBotCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"grid\") return handleBotGridCommand(run, v, rest, json);\n if (action === \"dca\") return handleBotDcaCommand(run, rest[0], v, json);\n}\n\nexport function handleEarnCommand(\n run: ToolRunner,\n submodule: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const action = rest[0];\n const innerRest = rest.slice(1);\n if (submodule === \"savings\") return handleEarnSavingsCommand(run, action, innerRest, v, json);\n if (submodule === \"onchain\") return handleEarnOnchainCommand(run, action, v, json);\n process.stderr.write(`Unknown earn sub-module: ${submodule}\\nValid: savings, onchain\\n`);\n process.exitCode = 1;\n}\n\nfunction handleEarnSavingsCommand(\n run: ToolRunner,\n action: string,\n rest: string[],\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n const limit = v.limit !== undefined ? Number(v.limit) : undefined;\n if (action === \"balance\") return cmdEarnSavingsBalance(run, rest[0] ?? v.ccy, json);\n if (action === \"purchase\") return cmdEarnSavingsPurchase(run, { ccy: v.ccy!, amt: v.amt!, rate: v.rate, json });\n if (action === \"redeem\") return cmdEarnSavingsRedeem(run, { ccy: v.ccy!, amt: v.amt!, json });\n if (action === \"set-rate\") return cmdEarnSetLendingRate(run, { ccy: v.ccy!, rate: v.rate!, json });\n if (action === \"lending-history\") return cmdEarnLendingHistory(run, { ccy: v.ccy, limit, json });\n if (action === \"rate-summary\") return cmdEarnLendingRateSummary(run, rest[0] ?? v.ccy, json);\n if (action === \"rate-history\") return cmdEarnLendingRateHistory(run, { ccy: v.ccy, limit, json });\n process.stderr.write(`Unknown earn savings command: ${action}\\n`);\n process.exitCode = 1;\n}\n\nfunction handleEarnOnchainCommand(\n run: ToolRunner,\n action: string,\n v: CliValues,\n json: boolean\n): Promise<void> | void {\n if (action === \"offers\") return cmdOnchainEarnOffers(run, v).then((r) => outputResult(r, json));\n if (action === \"purchase\") return cmdOnchainEarnPurchase(run, v).then((r) => outputResult(r, json));\n if (action === \"redeem\") return cmdOnchainEarnRedeem(run, v).then((r) => outputResult(r, json));\n if (action === \"cancel\") return cmdOnchainEarnCancel(run, v).then((r) => outputResult(r, json));\n if (action === \"orders\") return cmdOnchainEarnActiveOrders(run, v).then((r) => outputResult(r, json));\n if (action === \"history\") return cmdOnchainEarnOrderHistory(run, v).then((r) => outputResult(r, json));\n process.stderr.write(`Unknown earn onchain command: ${action}\\n`);\n process.exitCode = 1;\n}\n\nfunction outputResult(result: { endpoint: string; requestTime: string; data: unknown }, json: boolean): void {\n if (json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n process.stdout.write(JSON.stringify(result.data, null, 2) + \"\\n\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\nfunction printHelpForLevel(positionals: string[]): void {\n const [module, subgroup] = positionals;\n if (!module) printHelp();\n else if (!subgroup) printHelp(module);\n else printHelp(module, subgroup);\n}\n\nfunction printVerboseConfigSummary(config: import(\"@agent-tradekit/core\").OkxConfig, profile?: string): void {\n let authLabel = \"\\u2717\";\n if (config.hasAuth && config.apiKey) {\n authLabel = `\\u2713(${config.apiKey.slice(0, 3)}***${config.apiKey.slice(-3)})`;\n } else if (config.hasAuth) {\n authLabel = \"\\u2713\";\n }\n process.stderr.write(\n `[verbose] config: profile=${profile ?? \"default\"} site=${config.site} base=${config.baseUrl} auth=${authLabel} demo=${config.demo ? \"on\" : \"off\"} modules=${config.modules.join(\",\")}\\n`,\n );\n}\n\nasync function main(): Promise<void> {\n checkForUpdates(\"@okx_ai/okx-trade-cli\", CLI_VERSION);\n\n const { values, positionals } = parseCli(process.argv.slice(2));\n\n if (values.version) {\n process.stdout.write(`${CLI_VERSION} (${GIT_HASH})\\n`);\n return;\n }\n\n if (values.help || positionals.length === 0) {\n printHelpForLevel(positionals);\n return;\n }\n\n const [module, action, ...rest] = positionals;\n const v = values;\n const json = v.json ?? false;\n\n if (module === \"config\") return handleConfigCommand(action, rest, json, v.lang, v.force);\n if (module === \"setup\") return handleSetupCommand(v);\n\n const config = loadProfileConfig({ profile: v.profile, demo: v.demo, verbose: v.verbose, userAgent: `okx-trade-cli/${CLI_VERSION}`, sourceTag: \"CLI\" });\n\n if (config.verbose) printVerboseConfigSummary(config, v.profile);\n\n if (module === \"diagnose\") return cmdDiagnose(config, v.profile ?? \"default\");\n\n const client = new OkxRestClient(config);\n const run = createToolRunner(client, config);\n\n const moduleHandlers: Record<string, () => Promise<void> | void> = {\n market: () => handleMarketCommand(run, action, rest, v, json),\n account: () => handleAccountCommand(run, action, rest, v, json),\n spot: () => handleSpotCommand(run, action, rest, v, json),\n swap: () => handleSwapCommand(run, action, rest, v, json),\n futures: () => handleFuturesCommand(run, action, rest, v, json),\n option: () => handleOptionCommand(run, action, rest, v, json),\n bot: () => handleBotCommand(run, action, rest, v, json),\n earn: () => handleEarnCommand(run, action, rest, v, json),\n };\n const handler = moduleHandlers[module];\n if (handler) return handler();\n process.stderr.write(`Unknown command: ${module} ${action ?? \"\"}\\n`);\n process.exitCode = 1;\n}\n\nmain().catch((error: unknown) => {\n const payload = toToolErrorPayload(error);\n process.stderr.write(`Error: ${payload.message}\\n`);\n if (payload.traceId) process.stderr.write(`TraceId: ${payload.traceId}\\n`);\n if (payload.suggestion) process.stderr.write(`Hint: ${payload.suggestion}\\n`);\n process.stderr.write(`Version: @okx_ai/okx-trade-cli@${CLI_VERSION}\\n`);\n process.exitCode = 1;\n});\n","import { ProxyAgent } from \"undici\";\nimport { getNow, signOkxPayload } from \"../utils/signature.js\";\nimport {\n AuthenticationError,\n ConfigError,\n NetworkError,\n OkxApiError,\n RateLimitError,\n} from \"../utils/errors.js\";\n\ntype CodeBehavior =\n | { retry: true; suggestion: string }\n | { retry: false; suggestion: string };\n\nconst OKX_CODE_BEHAVIORS: Record<string, CodeBehavior> = {\n // Rate limit → throw RateLimitError\n \"50011\": { retry: true, suggestion: \"Rate limited. Back off and retry after a delay.\" },\n \"50061\": { retry: true, suggestion: \"Too many connections. Reduce request frequency and retry.\" },\n\n // Server temporarily unavailable → retryable\n \"50001\": { retry: true, suggestion: \"OKX system upgrade in progress. Retry in a few minutes.\" },\n \"50004\": { retry: true, suggestion: \"Endpoint temporarily unavailable. Retry later.\" },\n \"50013\": { retry: true, suggestion: \"System busy. Retry after 1-2 seconds.\" },\n \"50026\": { retry: true, suggestion: \"Order book system upgrading. Retry in a few minutes.\" },\n\n // Region / compliance restriction → do not retry\n \"51155\": { retry: false, suggestion: \"Feature unavailable in your region (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n \"51734\": { retry: false, suggestion: \"Feature not supported for your KYC country (site: {site}). Verify your site setting matches your account registration region. Available sites: global, eea, us. Do not retry.\" },\n\n // Account issues → do not retry\n \"50007\": { retry: false, suggestion: \"Account suspended. Contact OKX support. Do not retry.\" },\n \"50009\": { retry: false, suggestion: \"Account blocked by risk control. Contact OKX support. Do not retry.\" },\n \"51009\": { retry: false, suggestion: \"Account mode not supported for this operation. Check account settings.\" },\n\n // API key permission / expiry → do not retry\n \"50100\": { retry: false, suggestion: \"API key lacks required permissions. Update API key permissions.\" },\n \"50110\": { retry: false, suggestion: \"API key expired. Generate a new API key.\" },\n\n // Insufficient funds / margin → do not retry\n \"51008\": { retry: false, suggestion: \"Insufficient balance. Top up account before retrying.\" },\n \"51119\": { retry: false, suggestion: \"Insufficient margin. Add margin before retrying.\" },\n \"51127\": { retry: false, suggestion: \"Insufficient available margin. Reduce position or add margin.\" },\n\n // Instrument unavailable → do not retry\n \"51021\": { retry: false, suggestion: \"Instrument does not exist. Check instId.\" },\n \"51022\": { retry: false, suggestion: \"Instrument not available for trading.\" },\n \"51027\": { retry: false, suggestion: \"Contract has expired.\" },\n};\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type {\n OkxApiResponse,\n QueryParams,\n QueryValue,\n RequestConfig,\n RequestResult,\n} from \"./types.js\";\n\nfunction isDefined(value: unknown): boolean {\n return value !== undefined && value !== null;\n}\n\nfunction extractTraceId(headers: Headers): string | undefined {\n return (\n headers.get(\"x-trace-id\") ??\n headers.get(\"x-request-id\") ??\n headers.get(\"traceid\") ??\n undefined\n );\n}\n\nfunction stringifyQueryValue(value: QueryValue): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\",\");\n }\n return String(value);\n}\n\nfunction buildQueryString(query?: QueryParams): string {\n if (!query) {\n return \"\";\n }\n\n const entries = Object.entries(query).filter(([, value]) => isDefined(value));\n if (entries.length === 0) {\n return \"\";\n }\n\n const params = new URLSearchParams();\n for (const [key, value] of entries) {\n params.set(key, stringifyQueryValue(value));\n }\n return params.toString();\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return \"***\";\n return `${key.slice(0, 3)}***${key.slice(-3)}`;\n}\n\nfunction vlog(message: string): void {\n process.stderr.write(`[verbose] ${message}\\n`);\n}\n\nexport class OkxRestClient {\n private readonly config: OkxConfig;\n private readonly rateLimiter: RateLimiter;\n private readonly dispatcher?: ProxyAgent;\n\n public constructor(config: OkxConfig) {\n this.config = config;\n this.rateLimiter = new RateLimiter(30_000, config.verbose);\n if (config.proxyUrl) {\n this.dispatcher = new ProxyAgent(config.proxyUrl);\n }\n }\n\n private logRequest(method: string, url: string, auth: string): void {\n if (!this.config.verbose) return;\n vlog(`\\u2192 ${method} ${url}`);\n const authInfo = auth === \"private\" && this.config.apiKey\n ? `auth=\\u2713(${maskKey(this.config.apiKey)})` : `auth=${auth}`;\n vlog(` ${authInfo} demo=${this.config.demo} timeout=${this.config.timeoutMs}ms`);\n }\n\n private logResponse(\n status: number, rawLen: number, elapsed: number,\n traceId: string | undefined, code?: string, msg?: string,\n ): void {\n if (!this.config.verbose) return;\n if (code && code !== \"0\" && code !== \"1\") {\n vlog(`\\u2717 ${status} | code=${code} | msg=${msg ?? \"-\"} | ${rawLen}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n } else {\n vlog(`\\u2190 ${status} | code=${code ?? \"0\"} | ${rawLen}B | ${elapsed}ms | trace=${traceId ?? \"-\"}`);\n }\n }\n\n public async publicGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"public\",\n query,\n rateLimit,\n });\n }\n\n public async privateGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"private\",\n query,\n rateLimit,\n });\n }\n\n public async privatePost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"private\",\n body,\n rateLimit,\n });\n }\n\n private setAuthHeaders(\n headers: Headers, method: string, requestPath: string, bodyJson: string, timestamp: string,\n ): void {\n if (!this.config.hasAuth) {\n throw new ConfigError(\n \"Private endpoint requires API credentials.\",\n \"Configure OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE.\",\n );\n }\n\n if (!this.config.apiKey || !this.config.secretKey || !this.config.passphrase) {\n throw new ConfigError(\n \"Invalid private API credentials state.\",\n \"Ensure all OKX credentials are set.\",\n );\n }\n\n // OKX signature: timestamp + METHOD + requestPath + body\n const payload = `${timestamp}${method.toUpperCase()}${requestPath}${bodyJson}`;\n const signature = signOkxPayload(payload, this.config.secretKey);\n headers.set(\"OK-ACCESS-KEY\", this.config.apiKey);\n headers.set(\"OK-ACCESS-SIGN\", signature);\n headers.set(\"OK-ACCESS-PASSPHRASE\", this.config.passphrase);\n headers.set(\"OK-ACCESS-TIMESTAMP\", timestamp);\n }\n\n private throwOkxError(\n code: string, msg: string | undefined, reqConfig: RequestConfig, traceId: string | undefined,\n ): never {\n const message = msg || \"OKX API request failed.\";\n const endpoint = `${reqConfig.method} ${reqConfig.path}`;\n\n if (code === \"50111\" || code === \"50112\" || code === \"50113\") {\n throw new AuthenticationError(\n message,\n \"Check API key, secret, passphrase and permissions.\",\n endpoint,\n traceId,\n );\n }\n\n const behavior = OKX_CODE_BEHAVIORS[code];\n const suggestion = behavior?.suggestion?.replace(\"{site}\", this.config.site);\n\n if (code === \"50011\" || code === \"50061\") {\n throw new RateLimitError(message, suggestion, endpoint, traceId);\n }\n\n throw new OkxApiError(message, {\n code,\n endpoint,\n suggestion,\n traceId,\n });\n }\n\n private processResponse<TData>(\n rawText: string,\n response: Response,\n elapsed: number,\n traceId: string | undefined,\n reqConfig: RequestConfig,\n requestPath: string,\n ): RequestResult<TData> {\n let parsed: OkxApiResponse<TData>;\n try {\n parsed = (rawText ? JSON.parse(rawText) : {}) as OkxApiResponse<TData>;\n } catch (error) {\n this.logResponse(response.status, rawText.length, elapsed, traceId, \"non-JSON\");\n if (!response.ok) {\n const messagePreview = rawText.slice(0, 160).replace(/\\s+/g, \" \").trim();\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${messagePreview || \"Non-JSON response body\"}`,\n {\n code: String(response.status),\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n suggestion: \"Verify endpoint path and request parameters.\",\n traceId,\n },\n );\n }\n throw new NetworkError(\n `OKX returned non-JSON response for ${reqConfig.method} ${requestPath}.`,\n `${reqConfig.method} ${requestPath}`,\n error,\n );\n }\n\n if (!response.ok) {\n this.logResponse(response.status, rawText.length, elapsed, traceId, parsed.code ?? \"-\", parsed.msg);\n throw new OkxApiError(\n `HTTP ${response.status} from OKX: ${parsed.msg ?? \"Unknown error\"}`,\n {\n code: String(response.status),\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n suggestion: \"Retry later or verify endpoint parameters.\",\n traceId,\n },\n );\n }\n\n const responseCode = parsed.code;\n this.logResponse(response.status, rawText.length, elapsed, traceId, responseCode, parsed.msg);\n\n if (responseCode && responseCode !== \"0\" && responseCode !== \"1\") {\n this.throwOkxError(responseCode, parsed.msg, reqConfig, traceId);\n }\n\n return {\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n requestTime: new Date().toISOString(),\n data: (parsed.data ?? null) as TData,\n raw: parsed,\n };\n }\n\n private async request<TData = unknown>(\n reqConfig: RequestConfig,\n ): Promise<RequestResult<TData>> {\n const queryString = buildQueryString(reqConfig.query);\n const requestPath = queryString.length > 0 ? `${reqConfig.path}?${queryString}` : reqConfig.path;\n const url = `${this.config.baseUrl}${requestPath}`;\n const bodyJson = reqConfig.body ? JSON.stringify(reqConfig.body) : \"\";\n const timestamp = getNow();\n\n this.logRequest(reqConfig.method, url, reqConfig.auth);\n\n if (reqConfig.rateLimit) {\n await this.rateLimiter.consume(reqConfig.rateLimit);\n }\n\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n });\n\n if (this.config.userAgent) {\n headers.set(\"User-Agent\", this.config.userAgent);\n }\n\n if (reqConfig.auth === \"private\") {\n this.setAuthHeaders(headers, reqConfig.method, requestPath, bodyJson, timestamp);\n }\n\n if (this.config.demo) {\n headers.set(\"x-simulated-trading\", \"1\");\n }\n\n const t0 = Date.now();\n let response: Response;\n try {\n const fetchOptions: Record<string, unknown> = {\n method: reqConfig.method,\n headers,\n body: reqConfig.method === \"POST\" ? bodyJson : undefined,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n };\n if (this.dispatcher) {\n fetchOptions.dispatcher = this.dispatcher;\n }\n response = await fetch(url, fetchOptions as RequestInit);\n } catch (error) {\n if (this.config.verbose) {\n const elapsed = Date.now() - t0;\n const cause = error instanceof Error ? error.message : String(error);\n vlog(`\\u2717 NetworkError after ${elapsed}ms: ${cause}`);\n }\n throw new NetworkError(\n `Failed to call OKX endpoint ${reqConfig.method} ${requestPath}.`,\n `${reqConfig.method} ${requestPath}`,\n error,\n );\n }\n\n const rawText = await response.text();\n const elapsed = Date.now() - t0;\n const traceId = extractTraceId(response.headers);\n return this.processResponse<TData>(rawText, response, elapsed, traceId, reqConfig, requestPath);\n }\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function getNow(): string {\n return new Date().toISOString();\n}\n\nexport function signOkxPayload(payload: string, secretKey: string): string {\n return createHmac(\"sha256\", secretKey).update(payload).digest(\"base64\");\n}\n","export type ErrorType =\n | \"ConfigError\"\n | \"AuthenticationError\"\n | \"RateLimitError\"\n | \"ValidationError\"\n | \"OkxApiError\"\n | \"NetworkError\"\n | \"InternalError\";\n\nexport interface ToolErrorPayload {\n error: true;\n type: ErrorType;\n code?: string;\n message: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n timestamp: string;\n}\n\nexport class OkxMcpError extends Error {\n public readonly type: ErrorType;\n public readonly code?: string;\n public readonly suggestion?: string;\n public readonly endpoint?: string;\n public readonly traceId?: string;\n\n public constructor(\n type: ErrorType,\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(message, options?.cause ? { cause: options.cause } : undefined);\n this.name = type;\n this.type = type;\n this.code = options?.code;\n this.suggestion = options?.suggestion;\n this.endpoint = options?.endpoint;\n this.traceId = options?.traceId;\n }\n}\n\nexport class ConfigError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ConfigError\", message, { suggestion });\n }\n}\n\nexport class ValidationError extends OkxMcpError {\n public constructor(message: string, suggestion?: string) {\n super(\"ValidationError\", message, { suggestion });\n }\n}\n\nexport class RateLimitError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"RateLimitError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class AuthenticationError extends OkxMcpError {\n public constructor(\n message: string,\n suggestion?: string,\n endpoint?: string,\n traceId?: string,\n ) {\n super(\"AuthenticationError\", message, { suggestion, endpoint, traceId });\n }\n}\n\nexport class OkxApiError extends OkxMcpError {\n public constructor(\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n traceId?: string;\n cause?: unknown;\n },\n ) {\n super(\"OkxApiError\", message, options);\n }\n}\n\nexport class NetworkError extends OkxMcpError {\n public constructor(message: string, endpoint?: string, cause?: unknown) {\n super(\"NetworkError\", message, {\n endpoint,\n cause,\n suggestion:\n \"Please check network connectivity and retry the request in a few seconds.\",\n });\n }\n}\n\nexport function toToolErrorPayload(\n error: unknown,\n fallbackEndpoint?: string,\n): ToolErrorPayload {\n if (error instanceof OkxMcpError) {\n return {\n error: true,\n type: error.type,\n code: error.code,\n message: error.message,\n suggestion: error.suggestion,\n endpoint: error.endpoint ?? fallbackEndpoint,\n traceId: error.traceId,\n timestamp: new Date().toISOString(),\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n error: true,\n type: \"InternalError\",\n message,\n suggestion:\n \"Unexpected server error. Check tool arguments and retry. If it persists, inspect server logs.\",\n endpoint: fallbackEndpoint,\n timestamp: new Date().toISOString(),\n };\n}\n","import { RateLimitError } from \"./errors.js\";\n\ntype Bucket = {\n tokens: number;\n lastRefillMs: number;\n capacity: number;\n refillPerSecond: number;\n};\n\nexport type RateLimitConfig = {\n key: string;\n capacity: number;\n refillPerSecond: number;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class RateLimiter {\n private readonly buckets = new Map<string, Bucket>();\n private readonly maxWaitMs: number;\n private readonly verbose: boolean;\n\n public constructor(maxWaitMs = 30_000, verbose = false) {\n this.maxWaitMs = maxWaitMs;\n this.verbose = verbose;\n }\n\n public async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n const bucket = this.getBucket(config);\n this.refill(bucket);\n\n if (bucket.tokens >= amount) {\n bucket.tokens -= amount;\n return;\n }\n\n const missing = amount - bucket.tokens;\n const secondsToWait = missing / bucket.refillPerSecond;\n const waitMs = Math.ceil(secondsToWait * 1000);\n\n if (waitMs > this.maxWaitMs) {\n throw new RateLimitError(\n `Client-side rate limit reached for ${config.key}. Required wait ${waitMs}ms exceeds allowed max ${this.maxWaitMs}ms.`,\n \"Reduce tool call frequency or retry later.\",\n );\n }\n\n if (this.verbose) {\n process.stderr.write(`[verbose] \\u23F3 rate-limit: waiting ${waitMs}ms for \"${config.key}\"\\n`);\n }\n await sleep(waitMs);\n this.refill(bucket);\n\n if (bucket.tokens < amount) {\n throw new RateLimitError(\n `Rate limiter failed to acquire enough tokens for ${config.key}.`,\n );\n }\n\n bucket.tokens -= amount;\n }\n\n private getBucket(config: RateLimitConfig): Bucket {\n const existing = this.buckets.get(config.key);\n if (existing) {\n if (\n existing.capacity !== config.capacity ||\n existing.refillPerSecond !== config.refillPerSecond\n ) {\n existing.capacity = config.capacity;\n existing.refillPerSecond = config.refillPerSecond;\n existing.tokens = Math.min(existing.tokens, config.capacity);\n }\n return existing;\n }\n\n const now = Date.now();\n const created: Bucket = {\n tokens: config.capacity,\n lastRefillMs: now,\n capacity: config.capacity,\n refillPerSecond: config.refillPerSecond,\n };\n this.buckets.set(config.key, created);\n return created;\n }\n\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsedMs = now - bucket.lastRefillMs;\n if (elapsedMs <= 0) {\n return;\n }\n\n const refillTokens = (elapsedMs / 1000) * bucket.refillPerSecond;\n bucket.tokens = Math.min(bucket.capacity, bucket.tokens + refillTokens);\n bucket.lastRefillMs = now;\n }\n}\n","export const OKX_API_BASE_URL = \"https://www.okx.com\";\n\n/** Default source tag injected into all order placements for attribution. */\nexport const DEFAULT_SOURCE_TAG = \"MCP\";\n\n// ---------------------------------------------------------------------------\n// Site registry\n// ---------------------------------------------------------------------------\n\nexport interface OkxSite {\n label: string;\n apiBaseUrl: string;\n /** User-facing web URL for account/API key management pages */\n webUrl: string;\n}\n\nexport const OKX_SITES = {\n global: {\n label: \"Global\",\n apiBaseUrl: \"https://www.okx.com\",\n webUrl: \"https://www.okx.com\",\n },\n eea: {\n label: \"EEA\",\n apiBaseUrl: \"https://eea.okx.com\",\n webUrl: \"https://my.okx.com\",\n },\n us: {\n label: \"US\",\n apiBaseUrl: \"https://app.okx.com\",\n webUrl: \"https://app.okx.com\",\n },\n} as const satisfies Record<string, OkxSite>;\n\nexport type SiteId = keyof typeof OKX_SITES;\nexport const SITE_IDS = Object.keys(OKX_SITES) as SiteId[];\n\nexport const BOT_SUB_MODULE_IDS = [\n \"bot.grid\",\n \"bot.dca\",\n] as const;\n\nexport type BotSubModuleId = (typeof BOT_SUB_MODULE_IDS)[number];\n\nexport const BOT_DEFAULT_SUB_MODULES: BotSubModuleId[] = [\"bot.grid\"];\n\nexport const EARN_SUB_MODULE_IDS = [\n \"earn.savings\",\n \"earn.onchain\",\n] as const;\n\nexport type EarnSubModuleId = (typeof EARN_SUB_MODULE_IDS)[number];\n\nexport const MODULES = [\n \"market\",\n \"spot\",\n \"swap\",\n \"futures\",\n \"option\",\n \"account\",\n ...EARN_SUB_MODULE_IDS,\n ...BOT_SUB_MODULE_IDS,\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"swap\", \"option\", \"account\", ...BOT_DEFAULT_SUB_MODULES];\n// Default: spot, swap, option, account, bot.grid\n// \"all\": every module including market, futures, bot.dca — earn is NOT included (requires explicit opt-in)\n// \"bot\": bot.grid only; \"bot.all\": bot.grid + bot.dca\n// \"earn\" / \"earn.all\": all earn sub-modules (earn.savings + earn.onchain) — must be requested explicitly\n// \"earn.savings\": Simple Earn only; \"earn.onchain\": On-chain Earn only\n// To enable earn alongside all other modules, use: \"all,earn\" or \"all,earn.savings\" / \"all,earn.onchain\"\n","import { ValidationError } from \"../utils/errors.js\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n return value as Record<string, unknown>;\n}\n\nexport function readString(\n args: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new ValidationError(`Parameter \"${key}\" must be a string.`);\n }\n return value;\n}\n\nexport function readNumber(\n args: Record<string, unknown>,\n key: string,\n): number | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new ValidationError(`Parameter \"${key}\" must be a number.`);\n }\n return value;\n}\n\nexport function readBoolean(\n args: Record<string, unknown>,\n key: string,\n): boolean | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new ValidationError(`Parameter \"${key}\" must be a boolean.`);\n }\n return value;\n}\n\nexport function readStringArray(\n args: Record<string, unknown>,\n key: string,\n): string[] | undefined {\n const value = args[key];\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(`Parameter \"${key}\" must be an array of strings.`);\n }\n return value;\n}\n\nexport function requireString(\n args: Record<string, unknown>,\n key: string,\n): string {\n const value = readString(args, key);\n if (!value || value.length === 0) {\n throw new ValidationError(`Missing required parameter \"${key}\".`);\n }\n return value;\n}\n\nexport function assertEnum(\n value: string | undefined,\n key: string,\n values: readonly string[],\n): void {\n if (value === undefined) {\n return;\n }\n if (!values.includes(value)) {\n throw new ValidationError(\n `Parameter \"${key}\" must be one of: ${values.join(\", \")}.`,\n );\n }\n}\n\nexport function compactObject(\n object: Record<string, unknown>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n if (value !== undefined && value !== null) {\n next[key] = value;\n }\n }\n return next;\n}\n\nexport function normalizeResponse(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n","import type { RateLimitConfig } from \"../utils/rate-limiter.js\";\nimport { ConfigError } from \"../utils/errors.js\";\nimport type { OkxConfig } from \"../config.js\";\n\nexport const OKX_CANDLE_BARS = [\n \"1m\", \"3m\", \"5m\", \"15m\", \"30m\",\n \"1H\", \"2H\", \"4H\", \"6H\", \"12H\",\n \"1D\", \"2D\", \"3D\", \"1W\", \"1M\", \"3M\",\n] as const;\n\nexport const OKX_INST_TYPES = [\n \"SPOT\", \"SWAP\", \"FUTURES\", \"OPTION\", \"MARGIN\",\n] as const;\n\nexport function publicRateLimit(key: string, rps = 20): RateLimitConfig {\n return {\n key: `public:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\nexport function privateRateLimit(key: string, rps = 10): RateLimitConfig {\n return {\n key: `private:${key}`,\n capacity: rps,\n refillPerSecond: rps,\n };\n}\n\n/**\n * Throw a ConfigError if demo/simulated trading mode is active.\n * Use this for endpoints that OKX does not support in simulated trading.\n */\nexport function assertNotDemo(config: OkxConfig, endpoint: string): void {\n if (config.demo) {\n throw new ConfigError(\n `\"${endpoint}\" is not supported in simulated trading mode.`,\n \"Disable demo mode (remove OKX_DEMO=1 or --demo flag) to use this endpoint.\",\n );\n }\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerAccountTools(): ToolSpec[] {\n return [\n {\n name: \"account_get_balance\",\n module: \"account\",\n description:\n \"Get account balance for trading account. Returns balances for all currencies or a specific one. Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/balance\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_balance\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_transfer\",\n module: \"account\",\n description:\n \"Transfer funds between accounts (trading, funding, etc.). [CAUTION] Moves real funds. Private endpoint. Rate limit: 2 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Transfer amount\",\n },\n from: {\n type: \"string\",\n description: \"Source account: 6=funding, 18=trading (unified)\",\n },\n to: {\n type: \"string\",\n description: \"Destination account: 6=funding, 18=trading (unified)\",\n },\n type: {\n type: \"string\",\n description: \"0=main account (default), 1=main→sub, 2=sub→main, 3=sub→sub\",\n },\n subAcct: {\n type: \"string\",\n description: \"Sub-account name. Required when type=1/2/3\",\n },\n clientId: {\n type: \"string\",\n description: \"Client ID (max 32 chars)\",\n },\n },\n required: [\"ccy\", \"amt\", \"from\", \"to\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/asset/transfer\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n from: requireString(args, \"from\"),\n to: requireString(args, \"to\"),\n type: readString(args, \"type\"),\n subAcct: readString(args, \"subAcct\"),\n clientId: readString(args, \"clientId\"),\n }),\n privateRateLimit(\"account_transfer\", 2),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_max_size\",\n module: \"account\",\n description:\n \"Get max buy/sell order size for a SWAP/FUTURES instrument given current balance and leverage. Useful before placing orders. Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n px: {\n type: \"string\",\n description: \"Limit order price (omit for market)\",\n },\n leverage: {\n type: \"string\",\n description: \"Leverage (defaults to account setting)\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated mode.\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n px: readString(args, \"px\"),\n leverage: readString(args, \"leverage\"),\n ccy: readString(args, \"ccy\"),\n }),\n privateRateLimit(\"account_get_max_size\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_asset_balance\",\n module: \"account\",\n description:\n \"Get funding account balance (asset account). Different from account_get_balance which queries the trading account. Private. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. BTC or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/asset/balances\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_asset_balance\", 6),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_bills\",\n module: \"account\",\n description:\n \"Get account ledger: fees paid, funding charges, realized PnL, transfers, etc. \" +\n \"Default 20 records (last 7 days), max 100. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills\", 6),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_positions_history\",\n module: \"account\",\n description:\n \"Get closed position history for SWAP or FUTURES. \" +\n \"Default 20 records, max 100. Private endpoint. Rate limit: 1 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"MARGIN\", \"OPTION\"],\n description: \"Default SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n type: {\n type: \"string\",\n description: \"1=close long,2=close short,3=liq long,4=liq short,5=ADL long,6=ADL short\",\n },\n posId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions-history\",\n compactObject({\n instType: readString(args, \"instType\") ?? \"SWAP\",\n instId: readString(args, \"instId\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n posId: readString(args, \"posId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_positions_history\", 1),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_trade_fee\",\n module: \"account\",\n description:\n \"Get maker/taker fee rates for the account. Useful to understand your fee tier before trading. Private endpoint. Rate limit: 5 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/trade-fee\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n }),\n privateRateLimit(\"account_get_trade_fee\", 5),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_config\",\n module: \"account\",\n description:\n \"Get account configuration: position mode (net vs hedge), account level, auto-loan settings, etc. Private endpoint. Rate limit: 5 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/api/v5/account/config\",\n {},\n privateRateLimit(\"account_get_config\", 5),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_max_withdrawal\",\n module: \"account\",\n description:\n \"Get maximum withdrawable amount for a currency from the trading account. \" +\n \"Useful before initiating a transfer or withdrawal. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT or BTC,ETH. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/max-withdrawal\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"account_get_max_withdrawal\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_max_avail_size\",\n module: \"account\",\n description:\n \"Get maximum available size for opening or reducing a position. \" +\n \"Different from account_get_max_size which calculates new order size. \" +\n \"Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP or BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\", \"cash\"],\n description: \"cash=spot\",\n },\n ccy: {\n type: \"string\",\n description: \"Margin currency. Required for isolated MARGIN mode.\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"true=calculate max size for closing position\",\n },\n },\n required: [\"instId\", \"tdMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = readBoolean(args, \"reduceOnly\");\n const response = await context.client.privateGet(\n \"/api/v5/account/max-avail-size\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n ccy: readString(args, \"ccy\"),\n reduceOnly: reduceOnly !== undefined ? String(reduceOnly) : undefined,\n }),\n privateRateLimit(\"account_get_max_avail_size\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_positions\",\n module: \"account\",\n description:\n \"Get current open positions across all instrument types (MARGIN, SWAP, FUTURES, OPTION). \" +\n \"Use swap_get_positions for SWAP/FUTURES-only queries when the swap module is loaded. \" +\n \"Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: readString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"account_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_get_bills_archive\",\n module: \"account\",\n description:\n \"Get archived account ledger (bills older than 7 days, up to 3 months). \" +\n \"Use account_get_bills for recent 7-day records. \" +\n \"Default 20 records, max 100. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SPOT\", \"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n ccy: {\n type: \"string\",\n description: \"e.g. USDT\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"isolated\", \"cross\"],\n },\n type: {\n type: \"string\",\n description: \"1=transfer,2=trade,3=delivery,4=auto convert,5=liquidation,6=margin transfer,7=interest,8=funding fee,9=adl,10=clawback,11=sys convert,12=strategy transfer,13=ddh\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/bills-archive\",\n compactObject({\n instType: readString(args, \"instType\"),\n ccy: readString(args, \"ccy\"),\n mgnMode: readString(args, \"mgnMode\"),\n type: readString(args, \"type\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n privateRateLimit(\"account_get_bills_archive\", 6),\n );\n return normalize(response);\n },\n },\n {\n name: \"account_set_position_mode\",\n module: \"account\",\n description:\n \"Switch between net position mode and long/short hedge mode. \" +\n \"net: one position per instrument (default for most accounts). \" +\n \"long_short_mode: separate long and short positions. \" +\n \"[CAUTION] Requires no open positions or pending orders. Private endpoint. Rate limit: 5 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n posMode: {\n type: \"string\",\n enum: [\"long_short_mode\", \"net_mode\"],\n description: \"long_short_mode=hedge; net_mode=one-way\",\n },\n },\n required: [\"posMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-position-mode\",\n { posMode: requireString(args, \"posMode\") },\n privateRateLimit(\"account_set_position_mode\", 5),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerAlgoTradeTools(): ToolSpec[] {\n return [\n {\n name: \"swap_place_algo_order\",\n module: \"swap\",\n description:\n \"Place a SWAP/FUTURES take-profit or stop-loss algo order. [CAUTION] Executes real trades. \" +\n \"Use ordType='conditional' for a single TP, single SL, or combined TP+SL on one order. \" +\n \"Use ordType='oco' (one-cancels-other) to place TP and SL simultaneously — whichever triggers first cancels the other. \" +\n \"Set tpOrdPx='-1' or slOrdPx='-1' to execute the closing leg as a market order. \" +\n \"Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"conditional=single TP/SL or both; oco=TP+SL pair (first trigger cancels other)\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts to close (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n tpTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market (recommended)\",\n },\n slTriggerPxType: {\n type: \"string\",\n enum: [\"last\", \"index\", \"mark\"],\n description: \"last(default)|index|mark\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n tpTriggerPxType: readString(args, \"tpTriggerPxType\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n slTriggerPxType: readString(args, \"slTriggerPxType\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"swap_place_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_place_move_stop_order\",\n module: \"swap\",\n description:\n \"Place a SWAP/FUTURES trailing stop order (move_order_stop). [CAUTION] Executes real trades. \" +\n \"The order tracks the market price and triggers when the price reverses by the callback amount. \" +\n \"Specify either callbackRatio (e.g. '0.01' for 1%) or callbackSpread (fixed price distance), not both. \" +\n \"Optionally set activePx so tracking only starts once the market reaches that price. \" +\n \"Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"sell=close long, buy=close short\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way (default); long/short=hedge mode\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n callbackRatio: {\n type: \"string\",\n description: \"Callback ratio (e.g. '0.01'=1%); provide either ratio or spread\",\n },\n callbackSpread: {\n type: \"string\",\n description: \"Callback spread in price units; provide either ratio or spread\",\n },\n activePx: {\n type: \"string\",\n description: \"Activation price; tracking starts after market reaches this level\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Ensure order only reduces position\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: \"move_order_stop\",\n sz: requireString(args, \"sz\"),\n callbackRatio: readString(args, \"callbackRatio\"),\n callbackSpread: readString(args, \"callbackSpread\"),\n activePx: readString(args, \"activePx\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_place_move_stop_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_cancel_algo_orders\",\n module: \"swap\",\n description:\n \"Cancel one or more pending SWAP/FUTURES algo orders (TP/SL). \" +\n \"Accepts a list of {algoId, instId} objects. Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"List of algo orders to cancel. Each item: {algoId, instId}.\",\n items: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"algoId\", \"instId\"],\n },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n orders,\n privateRateLimit(\"swap_cancel_algo_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_algo_orders\",\n module: \"swap\",\n description:\n \"Query pending or completed SWAP/FUTURES algo orders (TP/SL, OCO, trailing stop). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\", \"move_order_stop\"],\n description: \"Filter by type; omit for all\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n algoId: {\n type: \"string\",\n description: \"Filter by algo order ID\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"SWAP\",\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"swap_get_algo_orders\", 20),\n );\n return normalize(response);\n }\n\n // No filter: fetch all three types in parallel and merge\n const [r1, r2, r3] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"move_order_stop\" }, privateRateLimit(\"swap_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ...((r3.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n ];\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ToolSpec } from \"./types.js\";\nimport { asRecord, readNumber, readString } from \"./helpers.js\";\nimport type { LogEntry } from \"../utils/logger.js\";\n\nconst DEFAULT_LOG_DIR = path.join(os.homedir(), \".okx\", \"logs\");\n\nfunction getLogPaths(logDir: string, days = 7): string[] {\n const paths: string[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n paths.push(path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`));\n }\n return paths;\n}\n\nfunction readEntries(logDir: string): LogEntry[] {\n const entries: LogEntry[] = [];\n for (const filePath of getLogPaths(logDir)) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n entries.push(JSON.parse(trimmed) as LogEntry);\n } catch {\n // skip malformed lines\n }\n }\n }\n return entries;\n}\n\nexport function registerAuditTools(): ToolSpec[] {\n return [\n {\n name: \"trade_get_history\",\n module: \"account\",\n description:\n \"Query local audit log of tool calls made through this MCP server. \" +\n \"Returns recent operations with timestamps, duration, params, and results. \" +\n \"Use to review what trades or queries were executed in this session or past sessions.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Max results (default 20)\",\n },\n tool: {\n type: \"string\",\n description: \"e.g. swap_place_order\",\n },\n level: {\n type: \"string\",\n enum: [\"INFO\", \"WARN\", \"ERROR\", \"DEBUG\"],\n },\n since: {\n type: \"string\",\n description: \"ISO 8601 timestamp lower bound\",\n },\n },\n },\n handler: async (rawArgs) => {\n const args = asRecord(rawArgs);\n const limit = Math.min(readNumber(args, \"limit\") ?? 20, 100);\n const toolFilter = readString(args, \"tool\");\n const levelFilter = readString(args, \"level\")?.toUpperCase();\n const since = readString(args, \"since\");\n const sinceTime = since ? new Date(since).getTime() : undefined;\n\n let entries = readEntries(DEFAULT_LOG_DIR);\n\n if (toolFilter) {\n entries = entries.filter((e) => e.tool === toolFilter);\n }\n if (levelFilter) {\n entries = entries.filter((e) => e.level === levelFilter);\n }\n if (sinceTime !== undefined) {\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n // most recent first\n entries.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n entries = entries.slice(0, limit);\n\n return { entries, total: entries.length };\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerGridTools(): ToolSpec[] {\n return [\n {\n name: \"grid_get_orders\",\n module: \"bot.grid\",\n description:\n \"Query grid trading bot list. Use status='active' for running bots, status='history' for completed/stopped bots. \" +\n \"Covers Spot Grid, Contract Grid, and Moon Grid. Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n status: {\n type: \"string\",\n enum: [\"active\", \"history\"],\n description: \"active=running (default); history=stopped\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n required: [\"algoOrdType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const status = readString(args, \"status\") ?? \"active\";\n const path =\n status === \"history\"\n ? \"/api/v5/tradingBot/grid/orders-algo-history\"\n : \"/api/v5/tradingBot/grid/orders-algo-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType,\n instId: readString(args, \"instId\"),\n algoId: readString(args, \"algoId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"grid_get_order_details\",\n module: \"bot.grid\",\n description:\n \"Query details of a single grid trading bot by its algo ID. \" +\n \"Returns configuration, current status, PnL, and position info. \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n algoId: {\n type: \"string\",\n },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/orders-algo-details\",\n {\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n },\n privateRateLimit(\"grid_get_order_details\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"grid_get_sub_orders\",\n module: \"bot.grid\",\n description:\n \"Query individual sub-orders (grid trades) generated by a grid bot. \" +\n \"Use type='filled' for executed trades, type='live' for pending orders. \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n algoId: {\n type: \"string\",\n },\n type: {\n type: \"string\",\n enum: [\"filled\", \"live\"],\n description: \"filled=executed trades (default); live=pending orders\",\n },\n groupId: {\n type: \"string\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n required: [\"algoOrdType\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/tradingBot/grid/sub-orders\",\n compactObject({\n algoOrdType: requireString(args, \"algoOrdType\"),\n algoId: requireString(args, \"algoId\"),\n type: readString(args, \"type\") ?? \"filled\",\n groupId: readString(args, \"groupId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"grid_get_sub_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"grid_create_order\",\n module: \"bot.grid\",\n description:\n \"Create a new grid trading bot. [CAUTION] Executes real trades and locks funds. \" +\n \"Supports Spot Grid ('grid') and Contract Grid ('contract_grid'). \" +\n \"For spot grid, provide quoteSz (invest in quote currency) or baseSz (invest in base currency). \" +\n \"For contract grids, provide direction, lever, and sz (investment amount in margin currency, e.g. USDT for USDT-margined contracts). \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\"],\n description: \"grid=Spot, contract_grid=Contract\",\n },\n maxPx: {\n type: \"string\",\n description: \"Upper price boundary\",\n },\n minPx: {\n type: \"string\",\n description: \"Lower price boundary\",\n },\n gridNum: {\n type: \"string\",\n description: \"Grid levels (e.g. '10')\",\n },\n runType: {\n type: \"string\",\n enum: [\"1\", \"2\"],\n description: \"1=arithmetic (default); 2=geometric\",\n },\n quoteSz: {\n type: \"string\",\n description: \"Spot grid: invest in quote (e.g. USDT). Provide quoteSz or baseSz.\",\n },\n baseSz: {\n type: \"string\",\n description: \"Spot grid: invest in base (e.g. BTC). Provide quoteSz or baseSz.\",\n },\n direction: {\n type: \"string\",\n enum: [\"long\", \"short\", \"neutral\"],\n description: \"Required for contract_grid\",\n },\n lever: {\n type: \"string\",\n description: \"Leverage (e.g. '5'). Required for contract_grid.\",\n },\n sz: {\n type: \"string\",\n description: \"Investment amount in margin currency (e.g. USDT for USDT-margined contracts). Required for contract_grid.\",\n },\n basePos: {\n type: \"boolean\",\n description:\n \"Whether to open a base position for contract grid. \" +\n \"Ignored for neutral direction and spot grid. Default: true\",\n },\n },\n required: [\"instId\", \"algoOrdType\", \"maxPx\", \"minPx\", \"gridNum\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoOrdType = requireString(args, \"algoOrdType\");\n const body: Record<string, unknown> = compactObject({\n instId: requireString(args, \"instId\"),\n algoOrdType,\n maxPx: requireString(args, \"maxPx\"),\n minPx: requireString(args, \"minPx\"),\n gridNum: requireString(args, \"gridNum\"),\n runType: readString(args, \"runType\"),\n quoteSz: readString(args, \"quoteSz\"),\n baseSz: readString(args, \"baseSz\"),\n direction: readString(args, \"direction\"),\n lever: readString(args, \"lever\"),\n sz: readString(args, \"sz\"),\n tag: context.config.sourceTag,\n });\n if (algoOrdType === \"contract_grid\") {\n body.triggerParams = [{ triggerAction: \"start\", triggerStrategy: \"instant\" }];\n body.basePos = readBoolean(args, \"basePos\") ?? true;\n }\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/order-algo\",\n body,\n privateRateLimit(\"grid_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"grid_stop_order\",\n module: \"bot.grid\",\n description:\n \"Stop a running grid trading bot. [CAUTION] This will close or cancel the bot's orders. \" +\n \"For contract grids, stopType controls whether open positions are closed ('1') or only orders are cancelled ('2'). \" +\n \"Private endpoint. Rate limit: 20 req/2s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: {\n type: \"string\",\n },\n algoOrdType: {\n type: \"string\",\n enum: [\"grid\", \"contract_grid\", \"moon_grid\"],\n description: \"grid=Spot, contract_grid=Contract, moon_grid=Moon\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n stopType: {\n type: \"string\",\n enum: [\"1\", \"2\", \"3\", \"5\", \"6\"],\n description: \"1=stop+sell/close all; 2=stop+keep assets (default); 3=close at limit; 5=partial close; 6=stop without selling (smart arb)\",\n },\n },\n required: [\"algoId\", \"algoOrdType\", \"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/tradingBot/grid/stop-order-algo\",\n [compactObject({\n algoId: requireString(args, \"algoId\"),\n algoOrdType: requireString(args, \"algoOrdType\"),\n instId: requireString(args, \"instId\"),\n stopType: readString(args, \"stopType\") ?? \"2\",\n })],\n privateRateLimit(\"grid_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport {\n asRecord,\n compactObject,\n readNumber,\n readString,\n requireString,\n} from \"../helpers.js\";\nimport { privateRateLimit } from \"../common.js\";\nimport { OkxApiError } from \"../../utils/errors.js\";\n\nconst BASE = \"/api/v5/tradingBot/dca\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\n/** For write operations: surface any inner sCode/sMsg errors from data items. */\nfunction normalizeWrite(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n const data = response.data;\n if (Array.isArray(data) && data.length > 0) {\n const failed = data.filter(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n \"sCode\" in (item as object) &&\n (item as Record<string, unknown>)[\"sCode\"] !== \"0\",\n ) as Record<string, unknown>[];\n if (failed.length > 0) {\n const messages = failed.map(\n (item) => `[${item[\"sCode\"]}] ${item[\"sMsg\"] ?? \"Operation failed\"}`,\n );\n throw new OkxApiError(messages.join(\"; \"), {\n code: String(failed[0]![\"sCode\"] ?? \"\"),\n endpoint: response.endpoint,\n });\n }\n }\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data,\n };\n}\n\nexport function registerDcaTools(): ToolSpec[] {\n return [\n {\n name: \"dca_create_order\",\n module: \"bot.dca\",\n description:\n \"Create a Contract DCA (Martingale) bot order with leverage on futures/swaps. \" +\n \"Required: instId, lever, direction, initOrdAmt, maxSafetyOrds, tpPct. \" +\n \"Conditionally required (when maxSafetyOrds > 0): safetyOrdAmt, pxSteps, pxStepsMult, volMult. \" +\n \"Optional: slPct, slMode, allowReinvest, triggerStrategy, triggerPx. \" +\n \"[CAUTION] Executes real trades. Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"Instrument ID, e.g. BTC-USDT-SWAP\" },\n lever: { type: \"string\", description: \"Leverage multiplier, e.g. '3'\" },\n direction: { type: \"string\", enum: [\"long\", \"short\"], description: \"Strategy direction: 'long' or 'short'\" },\n initOrdAmt: { type: \"string\", description: \"Initial order amount (USDT)\" },\n maxSafetyOrds: { type: \"string\", description: \"Max number of safety orders, e.g. '3'\" },\n tpPct: { type: \"string\", description: \"Take-profit ratio, e.g. '0.03' = 3%\" },\n safetyOrdAmt: { type: \"string\", description: \"Safety order amount (USDT). Required when maxSafetyOrds > 0\" },\n pxSteps: { type: \"string\", description: \"Price drop % per safety order, e.g. '0.03' = 3%. Required when maxSafetyOrds > 0\" },\n pxStepsMult: { type: \"string\", description: \"Price step multiplier, e.g. '1.2'. Required when maxSafetyOrds > 0\" },\n volMult: { type: \"string\", description: \"Safety order size multiplier, e.g. '1.5'. Required when maxSafetyOrds > 0\" },\n slPct: { type: \"string\", description: \"Stop-loss ratio, e.g. '0.05' = 5% (optional)\" },\n slMode: { type: \"string\", enum: [\"limit\", \"market\"], description: \"Stop-loss price type: 'limit' or 'market'. Defaults to market if omitted (optional)\" },\n allowReinvest: { type: \"string\", enum: [\"true\", \"false\"], description: \"Reinvest profit into the next cycle. Default 'true' (optional)\" },\n triggerStrategy: { type: \"string\", enum: [\"instant\", \"price\", \"rsi\"], default: \"instant\", description: \"How the bot starts: 'instant' (default), 'price' (wait for trigger price), or 'rsi' (RSI signal) (optional)\" },\n triggerPx: { type: \"string\", description: \"Trigger price — required when triggerStrategy='price' (optional)\" },\n },\n required: [\"instId\", \"lever\", \"direction\", \"initOrdAmt\", \"maxSafetyOrds\", \"tpPct\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instId = requireString(args, \"instId\");\n\n // Build triggerParams: default to instant; support price/rsi strategies\n const triggerStrategy = readString(args, \"triggerStrategy\") ?? \"instant\";\n const triggerParam: Record<string, string> = {\n triggerAction: \"start\",\n triggerStrategy,\n };\n if (triggerStrategy === \"price\") {\n triggerParam[\"triggerPx\"] = requireString(args, \"triggerPx\");\n }\n\n const response = await context.client.privatePost(\n `${BASE}/create`,\n compactObject({\n instId,\n algoOrdType: \"contract_dca\",\n lever: requireString(args, \"lever\"),\n direction: requireString(args, \"direction\"),\n initOrdAmt: requireString(args, \"initOrdAmt\"),\n safetyOrdAmt: readString(args, \"safetyOrdAmt\"),\n maxSafetyOrds: requireString(args, \"maxSafetyOrds\"),\n pxSteps: readString(args, \"pxSteps\"),\n pxStepsMult: readString(args, \"pxStepsMult\"),\n volMult: readString(args, \"volMult\"),\n tpPct: requireString(args, \"tpPct\"),\n slPct: readString(args, \"slPct\"),\n slMode: readString(args, \"slMode\"),\n allowReinvest: readString(args, \"allowReinvest\"),\n triggerParams: [triggerParam],\n }),\n privateRateLimit(\"dca_create_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_stop_order\",\n module: \"bot.dca\",\n description:\n \"Stop a running Contract DCA bot. \" +\n \"[CAUTION] This will stop the bot. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID of the DCA bot to stop\" },\n },\n required: [\"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n\n const response = await context.client.privatePost(\n `${BASE}/stop`,\n { algoId, algoOrdType: \"contract_dca\" },\n privateRateLimit(\"dca_stop_order\", 20),\n );\n return normalizeWrite(response);\n },\n },\n {\n name: \"dca_get_orders\",\n module: \"bot.dca\",\n description:\n \"Query Contract DCA bot orders. \" +\n \"Use status='active' for running bots, status='history' for completed/stopped. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"active\", \"history\"],\n description: \"active=running (default); history=stopped\",\n },\n algoId: { type: \"string\" },\n instId: { type: \"string\", description: \"Filter by instrument, e.g. BTC-USDT-SWAP (optional)\" },\n after: { type: \"string\", description: \"Pagination: before this algo ID\" },\n before: { type: \"string\", description: \"Pagination: after this algo ID\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"active\";\n\n const path = status === \"history\" ? `${BASE}/history-list` : `${BASE}/ongoing-list`;\n const response = await context.client.privateGet(\n path,\n compactObject({\n algoOrdType: \"contract_dca\",\n algoId: readString(args, \"algoId\"),\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"dca_get_order_details\",\n module: \"bot.dca\",\n description:\n \"Query details of a single Contract DCA bot by algo ID. \" +\n \"Returns current position details. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\" },\n },\n required: [\"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n\n const response = await context.client.privateGet(\n `${BASE}/position-details`,\n { algoId, algoOrdType: \"contract_dca\" },\n privateRateLimit(\"dca_get_order_details\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"dca_get_sub_orders\",\n module: \"bot.dca\",\n description:\n \"Query cycles or orders within a cycle of a Contract DCA bot. \" +\n \"Returns cycle list when cycleId is omitted; returns orders within a specific cycle when cycleId is provided. \" +\n \"Private endpoint. Rate limit: 20 req/2s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n algoId: { type: \"string\", description: \"Algo order ID of the DCA bot\" },\n cycleId: { type: \"string\", description: \"Omit to list all cycles; provide to get orders within a cycle\" },\n after: { type: \"string\", description: \"Pagination cursor — applies to cycle-list mode only (when cycleId is omitted)\" },\n before: { type: \"string\", description: \"Pagination cursor — applies to cycle-list mode only (when cycleId is omitted)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n required: [\"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algoId = requireString(args, \"algoId\");\n const cycleId = readString(args, \"cycleId\");\n\n if (cycleId) {\n // orders within a specific cycle\n const response = await context.client.privateGet(\n `${BASE}/orders`,\n compactObject({\n algoId,\n algoOrdType: \"contract_dca\",\n cycleId,\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalize(response);\n }\n // cycle list\n const response = await context.client.privateGet(\n `${BASE}/cycle-list`,\n compactObject({\n algoId,\n algoOrdType: \"contract_dca\",\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"dca_get_sub_orders\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"../types.js\";\nimport { registerGridTools } from \"./grid.js\";\nimport { registerDcaTools } from \"./dca.js\";\n\nexport function registerBotTools(): ToolSpec[] {\n return [\n ...registerGridTools(),\n ...registerDcaTools(),\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { assertNotDemo, privateRateLimit, publicRateLimit } from \"./common.js\";\n\nexport function registerEarnTools(): ToolSpec[] {\n return [\n {\n name: \"earn_get_savings_balance\",\n module: \"earn.savings\",\n description:\n \"Get Simple Earn (savings/flexible earn) balance. Returns current holdings for all currencies or a specific one. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT or BTC. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/savings/balance\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n privateRateLimit(\"earn_get_savings_balance\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_savings_purchase\",\n module: \"earn.savings\",\n description:\n \"Purchase Simple Earn (savings/flexible earn). [CAUTION] Moves real funds into earn product. \" +\n \"Not supported in demo/simulated trading mode. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency to purchase, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Purchase amount\",\n },\n rate: {\n type: \"string\",\n description:\n \"Lending rate. Annual rate in decimal, e.g. 0.01 = 1%. Defaults to 0.01 (1%, minimum rate, easiest to match).\",\n },\n },\n required: [\"ccy\", \"amt\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_savings_purchase\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/purchase-redempt\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n side: \"purchase\",\n rate: readString(args, \"rate\") ?? \"0.01\",\n }),\n privateRateLimit(\"earn_savings_purchase\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_savings_redeem\",\n module: \"earn.savings\",\n description:\n \"Redeem Simple Earn (savings/flexible earn). [CAUTION] Withdraws funds from earn product. \" +\n \"Not supported in demo/simulated trading mode. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency to redeem, e.g. USDT\",\n },\n amt: {\n type: \"string\",\n description: \"Redemption amount\",\n },\n },\n required: [\"ccy\", \"amt\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_savings_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/purchase-redempt\",\n compactObject({\n ccy: requireString(args, \"ccy\"),\n amt: requireString(args, \"amt\"),\n side: \"redempt\",\n }),\n privateRateLimit(\"earn_savings_redeem\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_set_lending_rate\",\n module: \"earn.savings\",\n description:\n \"Set lending rate for Simple Earn. [CAUTION] Changes your lending rate preference. \" +\n \"Not supported in demo/simulated trading mode. Private endpoint. Rate limit: 6 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"Currency, e.g. USDT\",\n },\n rate: {\n type: \"string\",\n description: \"Lending rate. Annual rate in decimal, e.g. 0.01 = 1%\",\n },\n },\n required: [\"ccy\", \"rate\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"earn_set_lending_rate\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/savings/set-lending-rate\",\n {\n ccy: requireString(args, \"ccy\"),\n rate: requireString(args, \"rate\"),\n },\n privateRateLimit(\"earn_set_lending_rate\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_get_lending_history\",\n module: \"earn.savings\",\n description:\n \"Get lending history for Simple Earn. Returns lending records with details like amount, rate, and earnings. \" +\n \"Private endpoint. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT. Omit for all.\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this record ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this record ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/savings/lending-history\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"earn_get_lending_history\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_get_lending_rate_summary\",\n module: \"earn.savings\",\n description:\n \"Get market lending rate summary for Simple Earn. Public endpoint (no API key required). \" +\n \"Returns current lending rates, estimated APY, and available amounts. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT. Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-summary\",\n compactObject({ ccy: readString(args, \"ccy\") }),\n publicRateLimit(\"earn_get_lending_rate_summary\", 6),\n );\n return normalizeResponse(response);\n },\n },\n {\n name: \"earn_get_lending_rate_history\",\n module: \"earn.savings\",\n description:\n \"Get historical lending rates for Simple Earn. Public endpoint (no API key required). \" +\n \"Returns past lending rate data for trend analysis. Rate limit: 6 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n ccy: {\n type: \"string\",\n description: \"e.g. USDT. Omit for all.\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/finance/savings/lending-rate-history\",\n compactObject({\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"earn_get_lending_rate_history\", 6),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nconst FUTURES_INST_TYPES = [\"FUTURES\", \"SWAP\"] as const;\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerFuturesTools(): ToolSpec[] {\n return [\n {\n name: \"futures_place_order\",\n module: \"futures\",\n description:\n \"Place a FUTURES delivery contract order (e.g. instId: BTC-USDT-240329). Optionally attach TP/SL via tpTriggerPx/slTriggerPx. [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"one-way: buy=open long, sell=open short (use reduceOnly=true to close); hedge: combined with posSide\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way mode (default); long/short=hedge mode only\",\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Close/reduce only, no new position (one-way mode)\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price; places TP at tpOrdPx\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price; places SL at slOrdPx\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const tpTriggerPx = readString(args, \"tpTriggerPx\");\n const tpOrdPx = readString(args, \"tpOrdPx\");\n const slTriggerPx = readString(args, \"slTriggerPx\");\n const slOrdPx = readString(args, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds = Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"futures_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_cancel_order\",\n module: \"futures\",\n description:\n \"Cancel an unfilled FUTURES delivery order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"futures_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_order\",\n module: \"futures\",\n description:\n \"Get details of a single FUTURES delivery order by ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"futures_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_orders\",\n module: \"futures\",\n description:\n \"Query FUTURES open orders, history (last 7 days), or archive (up to 3 months). Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instType: {\n type: \"string\",\n enum: [...FUTURES_INST_TYPES],\n description: \"FUTURES (default) or SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const instType = readString(args, \"instType\") ?? \"FUTURES\";\n assertEnum(instType, \"instType\", FUTURES_INST_TYPES);\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"futures_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_positions\",\n module: \"futures\",\n description:\n \"Get current FUTURES delivery contract positions. Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...FUTURES_INST_TYPES],\n description: \"FUTURES (default) or SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-240329\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? \"FUTURES\";\n assertEnum(instType, \"instType\", FUTURES_INST_TYPES);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"futures_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"futures_get_fills\",\n module: \"futures\",\n description:\n \"Get FUTURES fill details. archive=false: last 3 days. archive=true: up to 3 months. Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instType: {\n type: \"string\",\n enum: [...FUTURES_INST_TYPES],\n description: \"FUTURES (default) or SWAP\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const instType = readString(args, \"instType\") ?? \"FUTURES\";\n assertEnum(instType, \"instType\", FUTURES_INST_TYPES);\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"futures_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { assertNotDemo, privateRateLimit } from \"./common.js\";\n\nexport function registerOnchainEarnTools(): ToolSpec[] {\n return [\n // -------------------------------------------------------------------------\n // Get Offers\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_offers\",\n module: \"earn.onchain\",\n description:\n \"Get available on-chain earn (staking/DeFi) offers. Returns investment products with APY, terms, and limits. \" +\n \"Private endpoint. Rate limit: 3 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Specific product ID to query. Omit for all offers.\",\n },\n protocolType: {\n type: \"string\",\n description:\n \"Protocol type filter: staking, defi. Omit for all types.\",\n },\n ccy: {\n type: \"string\",\n description: \"Currency filter, e.g. ETH. Omit for all currencies.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/offers\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n }),\n privateRateLimit(\"onchain_earn_get_offers\", 3),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Purchase\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_purchase\",\n module: \"earn.onchain\",\n description:\n \"Purchase on-chain earn (staking/DeFi) product. [CAUTION] Moves real funds into staking/DeFi product. \" +\n \"Not supported in demo/simulated trading mode. Private endpoint. Rate limit: 2 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Product ID to purchase\",\n },\n investData: {\n type: \"array\",\n description:\n \"Investment data array: [{ccy, amt}]. Each item specifies currency and amount.\",\n items: {\n type: \"object\",\n properties: {\n ccy: { type: \"string\", description: \"Currency, e.g. ETH\" },\n amt: { type: \"string\", description: \"Amount to invest\" },\n },\n required: [\"ccy\", \"amt\"],\n },\n },\n term: {\n type: \"string\",\n description:\n \"Investment term in days. Required for fixed-term products.\",\n },\n tag: {\n type: \"string\",\n description: \"Order tag for tracking (optional).\",\n },\n },\n required: [\"productId\", \"investData\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_purchase\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/purchase\",\n compactObject({\n productId: requireString(args, \"productId\"),\n investData: args.investData,\n term: readString(args, \"term\"),\n tag: readString(args, \"tag\"),\n }),\n privateRateLimit(\"onchain_earn_purchase\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Redeem\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_redeem\",\n module: \"earn.onchain\",\n description:\n \"Redeem on-chain earn (staking/DeFi) investment. [CAUTION] Withdraws funds from staking/DeFi product. \" +\n \"Some products may have lock periods. Not supported in demo mode. Private endpoint. Rate limit: 2 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: {\n type: \"string\",\n description: \"Order ID to redeem\",\n },\n protocolType: {\n type: \"string\",\n description: \"Protocol type: staking, defi\",\n },\n allowEarlyRedeem: {\n type: \"boolean\",\n description:\n \"Allow early redemption for fixed-term products (may incur penalties). Default false.\",\n },\n },\n required: [\"ordId\", \"protocolType\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_redeem\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/redeem\",\n compactObject({\n ordId: requireString(args, \"ordId\"),\n protocolType: requireString(args, \"protocolType\"),\n allowEarlyRedeem: readBoolean(args, \"allowEarlyRedeem\"),\n }),\n privateRateLimit(\"onchain_earn_redeem\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Cancel\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_cancel\",\n module: \"earn.onchain\",\n description:\n \"Cancel pending on-chain earn purchase. [CAUTION] Cancels a pending investment order. \" +\n \"Not supported in demo mode. Private endpoint. Rate limit: 2 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n ordId: {\n type: \"string\",\n description: \"Order ID to cancel\",\n },\n protocolType: {\n type: \"string\",\n description: \"Protocol type: staking, defi\",\n },\n },\n required: [\"ordId\", \"protocolType\"],\n },\n handler: async (rawArgs, context) => {\n assertNotDemo(context.config, \"onchain_earn_cancel\");\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/finance/staking-defi/cancel\",\n {\n ordId: requireString(args, \"ordId\"),\n protocolType: requireString(args, \"protocolType\"),\n },\n privateRateLimit(\"onchain_earn_cancel\", 2),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Get Active Orders\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_active_orders\",\n module: \"earn.onchain\",\n description:\n \"Get active on-chain earn orders. Returns current staking/DeFi investments. \" +\n \"Private endpoint. Rate limit: 3 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Filter by product ID. Omit for all.\",\n },\n protocolType: {\n type: \"string\",\n description: \"Filter by protocol type: staking, defi. Omit for all.\",\n },\n ccy: {\n type: \"string\",\n description: \"Filter by currency, e.g. ETH. Omit for all.\",\n },\n state: {\n type: \"string\",\n description:\n \"Filter by state: 8 (pending), 13 (cancelling), 9 (onchain), 1 (earning), 2 (redeeming). Omit for all.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/orders-active\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n state: readString(args, \"state\"),\n }),\n privateRateLimit(\"onchain_earn_get_active_orders\", 3),\n );\n return normalizeResponse(response);\n },\n },\n\n // -------------------------------------------------------------------------\n // Get Order History\n // -------------------------------------------------------------------------\n {\n name: \"onchain_earn_get_order_history\",\n module: \"earn.onchain\",\n description:\n \"Get on-chain earn order history. Returns past staking/DeFi investments including redeemed orders. \" +\n \"Private endpoint. Rate limit: 3 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n productId: {\n type: \"string\",\n description: \"Filter by product ID. Omit for all.\",\n },\n protocolType: {\n type: \"string\",\n description: \"Filter by protocol type: staking, defi. Omit for all.\",\n },\n ccy: {\n type: \"string\",\n description: \"Filter by currency, e.g. ETH. Omit for all.\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: return results before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: return results after this order ID\",\n },\n limit: {\n type: \"string\",\n description: \"Max results to return (default 100, max 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/finance/staking-defi/orders-history\",\n compactObject({\n productId: readString(args, \"productId\"),\n protocolType: readString(args, \"protocolType\"),\n ccy: readString(args, \"ccy\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readString(args, \"limit\"),\n }),\n privateRateLimit(\"onchain_earn_get_order_history\", 3),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport { asRecord, compactObject, readBoolean, readNumber, readString, requireString } from \"./helpers.js\";\nimport { publicRateLimit, OKX_CANDLE_BARS, OKX_INST_TYPES } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerMarketTools(): ToolSpec[] {\n return [\n {\n name: \"market_get_ticker\",\n module: \"market\",\n description:\n \"Get ticker data for a single instrument. Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT, BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/ticker\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_ticker\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_tickers\",\n module: \"market\",\n description:\n \"Get ticker data for all instruments of a given type. Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD. Required for OPTION\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/tickers\",\n compactObject({\n instType: requireString(args, \"instType\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_tickers\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_orderbook\",\n module: \"market\",\n description:\n \"Get the order book (bids/asks) for an instrument. Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n sz: {\n type: \"number\",\n description: \"Depth per side, default 1, max 400\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/books\",\n compactObject({\n instId: requireString(args, \"instId\"),\n sz: readNumber(args, \"sz\"),\n }),\n publicRateLimit(\"market_get_orderbook\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_candles\",\n module: \"market\",\n description:\n \"Get candlestick (OHLCV) data for an instrument. \" +\n \"history=false (default): recent candles up to 1440 bars. \" +\n \"history=true: older historical data beyond the recent window. \" +\n \"Public endpoint, no authentication required. Rate limit: 40 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data beyond recent window\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-candles\"\n : \"/api/v5/market/candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_candles\", 40),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_instruments\",\n module: \"market\",\n description:\n \"Get tradable instruments for a given type. Returns contract specs: min order size, lot size, tick size, contract value, settlement currency, listing/expiry time. Essential before placing orders. Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...OKX_INST_TYPES],\n },\n instId: {\n type: \"string\",\n description: \"Filter by ID, e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"Required for OPTION, e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_instruments\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_funding_rate\",\n module: \"market\",\n description:\n \"Get funding rate for a SWAP instrument. \" +\n \"history=false (default): current rate and estimated next rate + settlement time. \" +\n \"history=true: historical rates, default 20 records, max 100. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP instrument, e.g. BTC-USDT-SWAP\",\n },\n history: {\n type: \"boolean\",\n description: \"true=fetch historical rates\",\n },\n after: {\n type: \"string\",\n description: \"Pagination (history): before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination (history): after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"History records (default 20, max 100)\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n if (isHistory) {\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate-history\",\n compactObject({\n instId: requireString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalize(response);\n }\n const response = await context.client.publicGet(\n \"/api/v5/public/funding-rate\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_funding_rate\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_mark_price\",\n module: \"market\",\n description:\n \"Get mark price for SWAP, FUTURES, or MARGIN instruments. \" +\n \"Mark price is used for liquidation calculations and unrealized PnL. \" +\n \"Public endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"MARGIN\", \"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/mark-price\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_mark_price\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_trades\",\n module: \"market\",\n description:\n \"Get recent trades for an instrument. Default 20 records, max 500. \" +\n \"Public endpoint, no authentication required. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n limit: {\n type: \"number\",\n description: \"Default 20, max 500\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/trades\",\n compactObject({\n instId: requireString(args, \"instId\"),\n limit: readNumber(args, \"limit\") ?? 20,\n }),\n publicRateLimit(\"market_get_trades\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_index_ticker\",\n module: \"market\",\n description:\n \"Get index ticker data (e.g. BTC-USD, ETH-USD index prices). \" +\n \"Index prices are used for mark price calculation and are independent of any single exchange. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD. Omit for all indices\",\n },\n quoteCcy: {\n type: \"string\",\n description: \"e.g. USD or USDT\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/market/index-tickers\",\n compactObject({\n instId: readString(args, \"instId\"),\n quoteCcy: readString(args, \"quoteCcy\"),\n }),\n publicRateLimit(\"market_get_index_ticker\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_index_candles\",\n module: \"market\",\n description:\n \"Get candlestick data for an index (e.g. BTC-USD index). \" +\n \"history=false (default): recent candles up to 1440 bars. \" +\n \"history=true: older historical data beyond the recent window. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"Index ID, e.g. BTC-USD\",\n },\n bar: {\n type: \"string\",\n enum: [...OKX_CANDLE_BARS],\n description: \"Default 1m\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this timestamp (ms)\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this timestamp (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n history: {\n type: \"boolean\",\n description: \"true=older historical data\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const isHistory = readBoolean(args, \"history\") ?? false;\n const path = isHistory\n ? \"/api/v5/market/history-index-candles\"\n : \"/api/v5/market/index-candles\";\n const response = await context.client.publicGet(\n path,\n compactObject({\n instId: requireString(args, \"instId\"),\n bar: readString(args, \"bar\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n }),\n publicRateLimit(\"market_get_index_candles\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_price_limit\",\n module: \"market\",\n description:\n \"Get the current price limit (upper and lower bands) for a SWAP or FUTURES instrument. \" +\n \"Orders placed outside these limits will be rejected by OKX. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"SWAP or FUTURES ID, e.g. BTC-USDT-SWAP\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/price-limit\",\n { instId: requireString(args, \"instId\") },\n publicRateLimit(\"market_get_price_limit\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"market_get_open_interest\",\n module: \"market\",\n description:\n \"Get open interest for SWAP, FUTURES, or OPTION instruments. \" +\n \"Useful for gauging market sentiment and positioning. \" +\n \"Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [\"SWAP\", \"FUTURES\", \"OPTION\"],\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n uly: {\n type: \"string\",\n description: \"e.g. BTC-USD\",\n },\n instFamily: {\n type: \"string\",\n },\n },\n required: [\"instType\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/open-interest\",\n compactObject({\n instType: requireString(args, \"instType\"),\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n instFamily: readString(args, \"instFamily\"),\n }),\n publicRateLimit(\"market_get_open_interest\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerOptionTools(): ToolSpec[] {\n return [\n {\n name: \"option_place_order\",\n module: \"option\",\n description:\n \"Place an OPTION order (buy/sell call or put). instId format: {uly}-{expiry}-{strike}-{C|P}, e.g. BTC-USD-241227-50000-C. tdMode: cash (buyer) or cross/isolated (seller). [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USD-241227-50000-C (call) or BTC-USD-241227-50000-P (put)\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=buyer full premium; cross/isolated=seller margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok|ioc\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Reduce/close only\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"option_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_cancel_order\",\n module: \"option\",\n description:\n \"Cancel an unfilled OPTION order. Provide ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_batch_cancel\",\n module: \"option\",\n description:\n \"[CAUTION] Batch cancel up to 20 OPTION orders. Each item: {instId, ordId?, clOrdId?}. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"option_batch_cancel\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_amend_order\",\n module: \"option\",\n description:\n \"Amend an unfilled OPTION order (price and/or size). Provide ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\" },\n clOrdId: { type: \"string\" },\n newSz: { type: \"string\", description: \"New number of contracts (NOT USDT amount)\" },\n newPx: { type: \"string\", description: \"New price\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n }),\n privateRateLimit(\"option_amend_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_order\",\n module: \"option\",\n description:\n \"Get details of a single OPTION order by ordId or clOrdId. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USD-241227-50000-C\" },\n ordId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n clOrdId: { type: \"string\", description: \"Provide ordId or clOrdId\" },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"option_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_orders\",\n module: \"option\",\n description:\n \"List OPTION orders. status: live=pending (default), history=7d, archive=3mo. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"live\", \"history\", \"archive\"],\n description: \"live=pending (default), history=7d, archive=3mo\",\n },\n uly: { type: \"string\", description: \"Underlying filter, e.g. BTC-USD\" },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordType: { type: \"string\", description: \"Order type filter\" },\n state: { type: \"string\", description: \"canceled|filled\" },\n after: { type: \"string\", description: \"Pagination: before this order ID\" },\n before: { type: \"string\", description: \"Pagination: after this order ID\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results (default 100)\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"live\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n uly: readString(args, \"uly\"),\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"option_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_positions\",\n module: \"option\",\n description:\n \"Get current OPTION positions including Greeks (delta, gamma, theta, vega). Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"Filter by specific contract\" },\n uly: { type: \"string\", description: \"Filter by underlying, e.g. BTC-USD\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n uly: readString(args, \"uly\"),\n }),\n privateRateLimit(\"option_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_fills\",\n module: \"option\",\n description:\n \"Get OPTION fill history. archive=false: last 3 days (default). archive=true: up to 3 months. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instId: { type: \"string\", description: \"Instrument filter\" },\n ordId: { type: \"string\", description: \"Order ID filter\" },\n after: { type: \"string\", description: \"Pagination: before this bill ID\" },\n before: { type: \"string\", description: \"Pagination: after this bill ID\" },\n begin: { type: \"string\", description: \"Start time (ms)\" },\n end: { type: \"string\", description: \"End time (ms)\" },\n limit: { type: \"number\", description: \"Max results\" },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"OPTION\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"option_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_instruments\",\n module: \"option\",\n description:\n \"List available OPTION contracts for a given underlying (option chain). Use to find valid instIds before placing orders. Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/instruments\",\n compactObject({\n instType: \"OPTION\",\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_instruments\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"option_get_greeks\",\n module: \"option\",\n description:\n \"Get implied volatility and Greeks (delta, gamma, theta, vega) for OPTION contracts by underlying. Public endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uly: {\n type: \"string\",\n description: \"Underlying, e.g. BTC-USD or ETH-USD\",\n },\n expTime: {\n type: \"string\",\n description: \"Filter by expiry date, e.g. 241227\",\n },\n },\n required: [\"uly\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/api/v5/public/opt-summary\",\n compactObject({\n uly: requireString(args, \"uly\"),\n expTime: readString(args, \"expTime\"),\n }),\n privateRateLimit(\"option_get_greeks\", 20),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerSpotTradeTools(): ToolSpec[] {\n return [\n {\n name: \"spot_place_order\",\n module: \"spot\",\n description:\n \"Place a spot order. Optionally attach take-profit/stop-loss via tpTriggerPx/slTriggerPx (assembled into attachAlgoOrds automatically). [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=regular spot; cross/isolated=margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Buy market: quote amount; all others: base amount\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price; places TP at tpOrdPx\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price; places SL at slOrdPx\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const tpTriggerPx = readString(args, \"tpTriggerPx\");\n const tpOrdPx = readString(args, \"tpOrdPx\");\n const slTriggerPx = readString(args, \"slTriggerPx\");\n const slOrdPx = readString(args, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds = Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"spot_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_cancel_order\",\n module: \"spot\",\n description:\n \"Cancel an unfilled spot order by order ID or client order ID. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_amend_order\",\n module: \"spot\",\n description:\n \"Amend an unfilled spot order (modify price or size). Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n newSz: {\n type: \"string\",\n },\n newPx: {\n type: \"string\",\n },\n newClOrdId: {\n type: \"string\",\n description: \"New client order ID after amendment\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n newSz: readString(args, \"newSz\"),\n newPx: readString(args, \"newPx\"),\n newClOrdId: readString(args, \"newClOrdId\"),\n }),\n privateRateLimit(\"spot_amend_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_orders\",\n module: \"spot\",\n description:\n \"Query spot open orders, order history (last 7 days), or order archive (up to 3 months). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"spot_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_place_algo_order\",\n module: \"spot\",\n description:\n \"Place a spot algo order with take-profit and/or stop-loss. [CAUTION] Executes real trades. Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cash\", \"cross\", \"isolated\"],\n description: \"cash=non-margin spot (default); cross/isolated=margin mode\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"conditional=single TP/SL; oco=TP+SL pair (one-cancels-other)\",\n },\n sz: {\n type: \"string\",\n description: \"Quantity in base currency\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/order-algo\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: readString(args, \"tdMode\") ?? \"cash\",\n side: requireString(args, \"side\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n tpTriggerPx: readString(args, \"tpTriggerPx\"),\n tpOrdPx: readString(args, \"tpOrdPx\"),\n slTriggerPx: readString(args, \"slTriggerPx\"),\n slOrdPx: readString(args, \"slOrdPx\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"spot_place_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_amend_algo_order\",\n module: \"spot\",\n description:\n \"Amend a pending spot algo order (modify TP/SL prices or size). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"spot_amend_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_cancel_algo_order\",\n module: \"spot\",\n description:\n \"Cancel a spot algo order (TP/SL). Private endpoint. Rate limit: 20 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n algoId: {\n type: \"string\",\n description: \"Algo order ID\",\n },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-algos\",\n [\n {\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n },\n ],\n privateRateLimit(\"spot_cancel_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_algo_orders\",\n module: \"spot\",\n description:\n \"Query spot algo orders (TP/SL) — pending or history. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"pending\", \"history\"],\n description: \"pending=active (default); history=completed\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n enum: [\"conditional\", \"oco\"],\n description: \"Filter by type; omit for all\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this algo ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this algo ID\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n state: {\n type: \"string\",\n enum: [\"effective\", \"canceled\", \"order_failed\"],\n description:\n \"Required when status=history. effective=triggered, canceled, order_failed. Defaults to effective.\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"pending\";\n const isHistory = status === \"history\";\n const path = isHistory\n ? \"/api/v5/trade/orders-algo-history\"\n : \"/api/v5/trade/orders-algo-pending\";\n const ordType = readString(args, \"ordType\");\n const state = isHistory\n ? readString(args, \"state\") ?? \"effective\"\n : undefined;\n const baseParams = compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n limit: readNumber(args, \"limit\"),\n state,\n });\n\n if (ordType) {\n const response = await context.client.privateGet(\n path,\n { ...baseParams, ordType },\n privateRateLimit(\"spot_get_algo_orders\", 20),\n );\n return normalize(response);\n }\n\n // ordType is required by OKX; fetch both spot types in parallel and merge\n const [r1, r2] = await Promise.all([\n context.client.privateGet(path, { ...baseParams, ordType: \"conditional\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n context.client.privateGet(path, { ...baseParams, ordType: \"oco\" }, privateRateLimit(\"spot_get_algo_orders\", 20)),\n ]);\n const merged = [\n ...((r1.data as unknown[]) ?? []),\n ...((r2.data as unknown[]) ?? []),\n ];\n return { endpoint: r1.endpoint, requestTime: r1.requestTime, data: merged };\n },\n },\n {\n name: \"spot_get_fills\",\n module: \"spot\",\n description:\n \"Get spot transaction fill details. \" +\n \"archive=false (default): last 3 days. \" +\n \"archive=true: up to 3 months, default limit 20. \" +\n \"Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType: \"SPOT\",\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"spot_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_batch_orders\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch place/cancel/amend up to 20 spot orders in one request. Use action='place'/'cancel'/'amend'. Private. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n description: \"place|cancel|amend\",\n },\n orders: {\n type: \"array\",\n description:\n \"Array (max 20). place: {instId,side,ordType,sz,tdMode?,px?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?} (tdMode defaults to cash for non-margin accounts; use cross for unified/margin accounts). cancel: {instId,ordId|clOrdId}. amend: {instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: {\n type: \"object\",\n },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const tpTriggerPx = readString(o, \"tpTriggerPx\");\n const tpOrdPx = readString(o, \"tpOrdPx\");\n const slTriggerPx = readString(o, \"slTriggerPx\");\n const slOrdPx = readString(o, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds =\n Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: readString(o, \"tdMode\") ?? \"cash\",\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"spot_batch_orders\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_get_order\",\n module: \"spot\",\n description:\n \"Get details of a single spot order by order ID or client order ID. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"spot_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_batch_amend\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch amend up to 20 unfilled spot orders in one request. Modify price and/or size per order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_amend\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"spot_batch_cancel\",\n module: \"spot\",\n description:\n \"[CAUTION] Batch cancel up to 20 spot orders in one request. Provide instId plus ordId or clOrdId for each order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"spot_batch_cancel\", 60),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n assertEnum,\n compactObject,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nconst SWAP_INST_TYPES = [\"SWAP\", \"FUTURES\"] as const;\n\nfunction normalize(response: {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}): Record<string, unknown> {\n return {\n endpoint: response.endpoint,\n requestTime: response.requestTime,\n data: response.data,\n };\n}\n\nexport function registerSwapTradeTools(): ToolSpec[] {\n return [\n {\n name: \"swap_place_order\",\n module: \"swap\",\n description:\n \"Place a SWAP or FUTURES perpetual/delivery contract order. Optionally attach take-profit/stop-loss via tpTriggerPx/slTriggerPx (assembled into attachAlgoOrds automatically). [CAUTION] Executes real trades. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP (perp) or BTC-USD-240329 (delivery)\",\n },\n tdMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n description: \"cross|isolated margin\",\n },\n side: {\n type: \"string\",\n enum: [\"buy\", \"sell\"],\n description: \"one-way: buy=open long, sell=open short (use reduceOnly=true to close); hedge: combined with posSide\",\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"net=one-way mode (default for most accounts); long/short=hedge mode only. Error 'posSide not valid' → use net\",\n },\n ordType: {\n type: \"string\",\n enum: [\"market\", \"limit\", \"post_only\", \"fok\", \"ioc\"],\n description: \"market(no px)|limit(px req)|post_only(maker)|fok(all-or-cancel)|ioc(partial fill)\",\n },\n sz: {\n type: \"string\",\n description: \"Number of contracts (NOT USDT amount). Use market_get_instruments to get ctVal for conversion.\",\n },\n px: {\n type: \"string\",\n description: \"Required for limit/post_only/fok/ioc\",\n },\n reduceOnly: {\n type: \"boolean\",\n description: \"Close/reduce only, no new position (one-way mode)\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID (max 32 chars)\",\n },\n tpTriggerPx: {\n type: \"string\",\n description: \"TP trigger price; places TP at tpOrdPx\",\n },\n tpOrdPx: {\n type: \"string\",\n description: \"TP order price; -1=market\",\n },\n slTriggerPx: {\n type: \"string\",\n description: \"SL trigger price; places SL at slOrdPx\",\n },\n slOrdPx: {\n type: \"string\",\n description: \"SL order price; -1=market\",\n },\n },\n required: [\"instId\", \"tdMode\", \"side\", \"ordType\", \"sz\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const reduceOnly = args.reduceOnly;\n const tpTriggerPx = readString(args, \"tpTriggerPx\");\n const tpOrdPx = readString(args, \"tpOrdPx\");\n const slTriggerPx = readString(args, \"slTriggerPx\");\n const slOrdPx = readString(args, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds = Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const response = await context.client.privatePost(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n tdMode: requireString(args, \"tdMode\"),\n side: requireString(args, \"side\"),\n posSide: readString(args, \"posSide\"),\n ordType: requireString(args, \"ordType\"),\n sz: requireString(args, \"sz\"),\n px: readString(args, \"px\"),\n reduceOnly: typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n }),\n privateRateLimit(\"swap_place_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_cancel_order\",\n module: \"swap\",\n description:\n \"Cancel an unfilled SWAP or FUTURES order. Private endpoint. Rate limit: 60 req/s per UID.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n ordId: {\n type: \"string\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_cancel_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_orders\",\n module: \"swap\",\n description:\n \"Query SWAP or FUTURES open orders, order history (last 7 days), or order archive (up to 3 months). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\"open\", \"history\", \"archive\"],\n description: \"open=active, history=7d, archive=3mo\",\n },\n instType: {\n type: \"string\",\n enum: [...SWAP_INST_TYPES],\n description: \"SWAP (default) or FUTURES\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordType: {\n type: \"string\",\n description: \"Order type filter\",\n },\n state: {\n type: \"string\",\n description: \"canceled|filled\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this order ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this order ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const status = readString(args, \"status\") ?? \"open\";\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n assertEnum(instType, \"instType\", SWAP_INST_TYPES);\n const path =\n status === \"archive\"\n ? \"/api/v5/trade/orders-history-archive\"\n : status === \"history\"\n ? \"/api/v5/trade/orders-history\"\n : \"/api/v5/trade/orders-pending\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordType: readString(args, \"ordType\"),\n state: readString(args, \"state\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\"),\n }),\n privateRateLimit(\"swap_get_orders\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_positions\",\n module: \"swap\",\n description:\n \"Get current SWAP or FUTURES positions. Private endpoint. Rate limit: 10 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instType: {\n type: \"string\",\n enum: [...SWAP_INST_TYPES],\n description: \"SWAP (default) or FUTURES\",\n },\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n posId: {\n type: \"string\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n assertEnum(instType, \"instType\", SWAP_INST_TYPES);\n const response = await context.client.privateGet(\n \"/api/v5/account/positions\",\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n posId: readString(args, \"posId\"),\n }),\n privateRateLimit(\"swap_get_positions\", 10),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_set_leverage\",\n module: \"swap\",\n description:\n \"Set leverage for a SWAP or FUTURES instrument or position. [CAUTION] Changes risk parameters. Private endpoint. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n lever: {\n type: \"string\",\n description: \"Leverage, e.g. '10'\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"Required for isolated margin in hedge mode\",\n },\n },\n required: [\"instId\", \"lever\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/account/set-leverage\",\n compactObject({\n instId: requireString(args, \"instId\"),\n lever: requireString(args, \"lever\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n }),\n privateRateLimit(\"swap_set_leverage\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_amend_algo_order\",\n module: \"swap\",\n description:\n \"Amend a pending SWAP/FUTURES algo order (modify TP/SL prices or size). Private endpoint. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: { type: \"string\", description: \"e.g. BTC-USDT-SWAP\" },\n algoId: { type: \"string\", description: \"Algo order ID\" },\n newSz: { type: \"string\", description: \"New number of contracts (NOT USDT amount)\" },\n newTpTriggerPx: { type: \"string\", description: \"New TP trigger price\" },\n newTpOrdPx: { type: \"string\", description: \"New TP order price; -1=market\" },\n newSlTriggerPx: { type: \"string\", description: \"New SL trigger price\" },\n newSlOrdPx: { type: \"string\", description: \"New SL order price; -1=market\" },\n },\n required: [\"instId\", \"algoId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-algos\",\n compactObject({\n instId: requireString(args, \"instId\"),\n algoId: requireString(args, \"algoId\"),\n newSz: readString(args, \"newSz\"),\n newTpTriggerPx: readString(args, \"newTpTriggerPx\"),\n newTpOrdPx: readString(args, \"newTpOrdPx\"),\n newSlTriggerPx: readString(args, \"newSlTriggerPx\"),\n newSlOrdPx: readString(args, \"newSlOrdPx\"),\n }),\n privateRateLimit(\"swap_amend_algo_order\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_fills\",\n module: \"swap\",\n description:\n \"Get SWAP or FUTURES transaction fill details. \" +\n \"archive=false (default): last 3 days. \" +\n \"archive=true: up to 3 months, default limit 20. \" +\n \"Private endpoint. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n archive: {\n type: \"boolean\",\n description: \"true=up to 3 months; false=last 3 days (default)\",\n },\n instType: {\n type: \"string\",\n enum: [...SWAP_INST_TYPES],\n description: \"SWAP (default) or FUTURES\",\n },\n instId: {\n type: \"string\",\n description: \"Instrument ID filter\",\n },\n ordId: {\n type: \"string\",\n description: \"Order ID filter\",\n },\n after: {\n type: \"string\",\n description: \"Pagination: before this bill ID\",\n },\n before: {\n type: \"string\",\n description: \"Pagination: after this bill ID\",\n },\n begin: {\n type: \"string\",\n description: \"Start time (ms)\",\n },\n end: {\n type: \"string\",\n description: \"End time (ms)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results (default 100 or 20 for archive)\",\n },\n },\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const archive = readBoolean(args, \"archive\") ?? false;\n const instType = readString(args, \"instType\") ?? \"SWAP\";\n assertEnum(instType, \"instType\", SWAP_INST_TYPES);\n const path = archive ? \"/api/v5/trade/fills-history\" : \"/api/v5/trade/fills\";\n const response = await context.client.privateGet(\n path,\n compactObject({\n instType,\n instId: readString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n after: readString(args, \"after\"),\n before: readString(args, \"before\"),\n begin: readString(args, \"begin\"),\n end: readString(args, \"end\"),\n limit: readNumber(args, \"limit\") ?? (archive ? 20 : undefined),\n }),\n privateRateLimit(\"swap_get_fills\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_order\",\n module: \"swap\",\n description:\n \"Get details of a single SWAP or FUTURES order by order ID or client order ID. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n ordId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Provide ordId or clOrdId\",\n },\n },\n required: [\"instId\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/trade/order\",\n compactObject({\n instId: requireString(args, \"instId\"),\n ordId: readString(args, \"ordId\"),\n clOrdId: readString(args, \"clOrdId\"),\n }),\n privateRateLimit(\"swap_get_order\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_close_position\",\n module: \"swap\",\n description:\n \"[CAUTION] Close an entire SWAP/FUTURES position at market. Simpler than swap_place_order with reduceOnly when closing the full position. Private. Rate limit: 20 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n posSide: {\n type: \"string\",\n enum: [\"long\", \"short\", \"net\"],\n description: \"long/short=hedge mode; omit for one-way (net)\",\n },\n autoCxl: {\n type: \"boolean\",\n description: \"Cancel pending orders for this instrument on close\",\n },\n clOrdId: {\n type: \"string\",\n description: \"Client order ID for close order\",\n },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const autoCxl = args.autoCxl;\n const response = await context.client.privatePost(\n \"/api/v5/trade/close-position\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n posSide: readString(args, \"posSide\"),\n autoCxl: typeof autoCxl === \"boolean\" ? String(autoCxl) : undefined,\n clOrdId: readString(args, \"clOrdId\"),\n tag: context.config.sourceTag,\n }),\n privateRateLimit(\"swap_close_position\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_batch_orders\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch place/cancel/amend up to 20 SWAP/FUTURES orders in one request. Use action='place'/'cancel'/'amend'. Private. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"place\", \"cancel\", \"amend\"],\n },\n orders: {\n type: \"array\",\n description:\n \"Array (max 20). place: {instId,tdMode,side,ordType,sz,px?,posSide?,reduceOnly?,clOrdId?,tpTriggerPx?,tpOrdPx?,slTriggerPx?,slOrdPx?}. cancel: {instId,ordId|clOrdId}. amend: {instId,ordId|clOrdId,newSz?,newPx?}.\",\n items: {\n type: \"object\",\n },\n },\n },\n required: [\"action\", \"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const action = requireString(args, \"action\");\n assertEnum(action, \"action\", [\"place\", \"cancel\", \"amend\"]);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const endpointMap: Record<string, string> = {\n place: \"/api/v5/trade/batch-orders\",\n cancel: \"/api/v5/trade/cancel-batch-orders\",\n amend: \"/api/v5/trade/amend-batch-orders\",\n };\n const body: Record<string, unknown>[] =\n action === \"place\"\n ? orders.map((order: unknown) => {\n const o = asRecord(order);\n const tpTriggerPx = readString(o, \"tpTriggerPx\");\n const tpOrdPx = readString(o, \"tpOrdPx\");\n const slTriggerPx = readString(o, \"slTriggerPx\");\n const slOrdPx = readString(o, \"slOrdPx\");\n const algoEntry = compactObject({ tpTriggerPx, tpOrdPx, slTriggerPx, slOrdPx });\n const attachAlgoOrds =\n Object.keys(algoEntry).length > 0 ? [algoEntry] : undefined;\n const reduceOnly = o.reduceOnly;\n return compactObject({\n instId: requireString(o, \"instId\"),\n tdMode: requireString(o, \"tdMode\"),\n side: requireString(o, \"side\"),\n ordType: requireString(o, \"ordType\"),\n sz: requireString(o, \"sz\"),\n px: readString(o, \"px\"),\n posSide: readString(o, \"posSide\"),\n reduceOnly:\n typeof reduceOnly === \"boolean\" ? String(reduceOnly) : undefined,\n clOrdId: readString(o, \"clOrdId\"),\n tag: context.config.sourceTag,\n attachAlgoOrds,\n });\n })\n : (orders as Record<string, unknown>[]);\n const response = await context.client.privatePost(\n endpointMap[action],\n body,\n privateRateLimit(\"swap_batch_orders\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_get_leverage\",\n module: \"swap\",\n description:\n \"Get current leverage for a SWAP/FUTURES instrument. Call before swap_place_order to verify leverage. Private. Rate limit: 20 req/s.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n instId: {\n type: \"string\",\n description: \"e.g. BTC-USDT-SWAP\",\n },\n mgnMode: {\n type: \"string\",\n enum: [\"cross\", \"isolated\"],\n },\n },\n required: [\"instId\", \"mgnMode\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/api/v5/account/leverage-info\",\n compactObject({\n instId: requireString(args, \"instId\"),\n mgnMode: requireString(args, \"mgnMode\"),\n }),\n privateRateLimit(\"swap_get_leverage\", 20),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_batch_amend\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch amend up to 20 unfilled SWAP/FUTURES orders in one request. Modify price and/or size per order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?, newSz?, newPx?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/amend-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"swap_batch_amend\", 60),\n );\n return normalize(response);\n },\n },\n {\n name: \"swap_batch_cancel\",\n module: \"swap\",\n description:\n \"[CAUTION] Batch cancel up to 20 SWAP/FUTURES orders in one request. Provide instId plus ordId or clOrdId for each order. Private endpoint. Rate limit: 60 req/s.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n orders: {\n type: \"array\",\n description: \"Array (max 20): {instId, ordId?, clOrdId?}\",\n items: { type: \"object\" },\n },\n },\n required: [\"orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const orders = args.orders;\n if (!Array.isArray(orders) || orders.length === 0) {\n throw new Error(\"orders must be a non-empty array.\");\n }\n const response = await context.client.privatePost(\n \"/api/v5/trade/cancel-batch-orders\",\n orders as Record<string, unknown>[],\n privateRateLimit(\"swap_batch_cancel\", 60),\n );\n return normalize(response);\n },\n },\n ];\n}\n","import type { OkxConfig } from \"../config.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport { MODULES, type ModuleId } from \"../constants.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerAlgoTradeTools } from \"./algo-trade.js\";\nimport { registerAuditTools } from \"./audit.js\";\nimport { registerBotTools } from \"./bot/index.js\";\nimport { registerEarnTools } from \"./earn.js\";\nimport { registerFuturesTools } from \"./futures-trade.js\";\nimport { registerOnchainEarnTools } from \"./onchain-earn.js\";\nimport { registerMarketTools } from \"./market.js\";\nimport { registerOptionTools } from \"./option-trade.js\";\nimport { registerSpotTradeTools } from \"./spot-trade.js\";\nimport { registerSwapTradeTools } from \"./swap-trade.js\";\nimport type { ToolSpec, ToolArgs } from \"./types.js\";\n\nfunction allToolSpecs(): ToolSpec[] {\n return [\n ...registerMarketTools(),\n ...registerSpotTradeTools(),\n ...registerSwapTradeTools(),\n ...registerFuturesTools(),\n ...registerOptionTools(),\n ...registerAlgoTradeTools(),\n ...registerAccountTools(),\n ...registerBotTools(),\n ...registerEarnTools(),\n ...registerOnchainEarnTools(),\n ...registerAuditTools(),\n ];\n}\n\nexport function buildTools(config: OkxConfig): ToolSpec[] {\n const enabledModules = new Set(config.modules);\n const tools = allToolSpecs().filter((tool) => enabledModules.has(tool.module));\n if (!config.readOnly) {\n return tools;\n }\n return tools.filter((tool) => !tool.isWrite);\n}\n\nexport interface ToolResult {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}\n\nexport type ToolRunner = (toolName: string, args: ToolArgs) => Promise<ToolResult>;\n\n/**\n * Create a function that can call any registered tool by name.\n * All modules are enabled regardless of config.modules, since CLI\n * controls which commands to expose at the routing level.\n */\nexport function createToolRunner(client: OkxRestClient, config: OkxConfig): ToolRunner {\n const fullConfig: OkxConfig = { ...config, modules: [...MODULES] as ModuleId[], readOnly: false };\n const tools = allToolSpecs();\n const toolMap = new Map<string, ToolSpec>(tools.map((t) => [t.name, t]));\n\n return async (toolName: string, args: ToolArgs): Promise<ToolResult> => {\n const tool = toolMap.get(toolName);\n if (!tool) throw new Error(`Unknown tool: ${toolName}`);\n const result = await tool.handler(args, { config: fullConfig, client });\n return result as ToolResult;\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { OkxRestClient } from \"../client/rest-client.js\";\nimport type { OkxConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\n\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n config: OkxConfig;\n client: OkxRestClient;\n}\n\nexport interface ToolSpec {\n name: string;\n module: ModuleId;\n description: string;\n inputSchema: JsonSchema;\n isWrite: boolean;\n handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n readOnlyHint: !tool.isWrite,\n destructiveHint: tool.isWrite,\n idempotentHint: !tool.isWrite,\n openWorldHint: true,\n },\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\n\nexport { stringify as tomlStringify };\n\nexport interface OkxProfile {\n api_key?: string;\n secret_key?: string;\n passphrase?: string;\n base_url?: string;\n timeout_ms?: number;\n demo?: boolean;\n site?: string;\n proxy_url?: string;\n}\n\nexport interface OkxTomlConfig {\n default_profile?: string;\n profiles: Record<string, OkxProfile>;\n}\n\nexport function configFilePath(): string {\n return join(homedir(), \".okx\", \"config.toml\");\n}\n\n/**\n * Read the full config from ~/.okx/config.toml.\n * Returns a config with empty profiles if the file does not exist.\n */\nexport function readFullConfig(): OkxTomlConfig {\n const path = configFilePath();\n if (!existsSync(path)) return { profiles: {} };\n const raw = readFileSync(path, \"utf-8\");\n return parse(raw) as unknown as OkxTomlConfig;\n}\n\n/**\n * Read a profile from ~/.okx/config.toml.\n * Returns an empty object if the file does not exist or the profile is not found.\n */\nexport function readTomlProfile(profileName?: string): OkxProfile {\n const config = readFullConfig();\n const name = profileName ?? config.default_profile ?? \"default\";\n return config.profiles?.[name] ?? {};\n}\n\n/**\n * Write the full config to ~/.okx/config.toml.\n * Creates the parent directory if it does not exist.\n */\nexport function writeFullConfig(config: OkxTomlConfig): void {\n const path = configFilePath();\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, stringify(config as unknown as Record<string, unknown>), \"utf-8\");\n}\n","import { BOT_DEFAULT_SUB_MODULES, BOT_SUB_MODULE_IDS, EARN_SUB_MODULE_IDS, DEFAULT_MODULES, DEFAULT_SOURCE_TAG, MODULES, OKX_SITES, SITE_IDS, type BotSubModuleId, type EarnSubModuleId, type ModuleId, type SiteId } from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\nimport { readTomlProfile } from \"./config/toml.js\";\nimport type { OkxProfile } from \"./config/toml.js\";\n\nexport interface CliOptions {\n modules?: string;\n readOnly: boolean;\n demo: boolean;\n profile?: string;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n verbose?: boolean;\n}\n\nexport interface OkxConfig {\n apiKey?: string;\n secretKey?: string;\n passphrase?: string;\n hasAuth: boolean;\n baseUrl: string;\n timeoutMs: number;\n modules: ModuleId[];\n readOnly: boolean;\n demo: boolean;\n site: SiteId;\n userAgent?: string;\n sourceTag: string;\n proxyUrl?: string;\n verbose: boolean;\n}\n\n/** Base (non-bot, non-earn) modules — used when expanding \"all\". */\nconst BASE_MODULES = MODULES.filter(\n (m) => !BOT_SUB_MODULE_IDS.includes(m as BotSubModuleId) && !EARN_SUB_MODULE_IDS.includes(m as EarnSubModuleId),\n);\n\n/**\n * Expand a single module shorthand into its concrete sub-module IDs.\n * Returns the expanded IDs, or null if the input is not a shorthand.\n */\nfunction expandShorthand(moduleId: string): ModuleId[] | null {\n // \"all\" expands to BASE_MODULES + all bot sub-modules; earn is intentionally excluded (opt-in only)\n if (moduleId === \"all\") return [...BASE_MODULES, ...BOT_SUB_MODULE_IDS] as ModuleId[];\n if (moduleId === \"earn\" || moduleId === \"earn.all\") return [...EARN_SUB_MODULE_IDS];\n if (moduleId === \"bot\") return [...BOT_DEFAULT_SUB_MODULES];\n if (moduleId === \"bot.all\") return [...BOT_SUB_MODULE_IDS];\n return null;\n}\n\nfunction parseModuleList(rawModules?: string): ModuleId[] {\n if (!rawModules || rawModules.trim().length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const trimmed = rawModules.trim().toLowerCase();\n if (trimmed === \"all\") {\n // NOTE: earn sub-modules are intentionally excluded from \"all\".\n // Earn tools require explicit opt-in via \"earn\", \"earn.all\", \"earn.savings\", or \"earn.onchain\".\n return [...BASE_MODULES, ...BOT_SUB_MODULE_IDS] as ModuleId[];\n }\n\n const requested = trimmed.split(\",\").map((s) => s.trim()).filter(Boolean);\n if (requested.length === 0) {\n return [...DEFAULT_MODULES];\n }\n\n const deduped = new Set<ModuleId>();\n for (const moduleId of requested) {\n const expanded = expandShorthand(moduleId);\n if (expanded) {\n expanded.forEach((sub) => deduped.add(sub));\n continue;\n }\n if (!MODULES.includes(moduleId as ModuleId)) {\n throw new ConfigError(\n `Unknown module \"${moduleId}\".`,\n `Use one of: ${MODULES.join(\", \")}, \"earn\", \"earn.all\", \"bot\", \"bot.all\", or \"all\".`,\n );\n }\n deduped.add(moduleId as ModuleId);\n }\n\n return Array.from(deduped);\n}\n\nfunction loadCredentials(toml: OkxProfile): { apiKey?: string; secretKey?: string; passphrase?: string; hasAuth: boolean } {\n const apiKey = process.env.OKX_API_KEY?.trim() ?? toml.api_key;\n const secretKey = process.env.OKX_SECRET_KEY?.trim() ?? toml.secret_key;\n const passphrase = process.env.OKX_PASSPHRASE?.trim() ?? toml.passphrase;\n const hasAuth = Boolean(apiKey && secretKey && passphrase);\n const partialAuth = Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);\n if (partialAuth && !hasAuth) {\n throw new ConfigError(\n \"Partial API credentials detected.\",\n \"Set OKX_API_KEY, OKX_SECRET_KEY and OKX_PASSPHRASE together (env vars or config.toml profile).\",\n );\n }\n return { apiKey, secretKey, passphrase, hasAuth };\n}\n\nfunction resolveSite(cliSite?: string, tomlSite?: string): SiteId {\n const rawSite = cliSite?.trim() ?? process.env.OKX_SITE?.trim() ?? tomlSite ?? \"global\";\n if (!SITE_IDS.includes(rawSite as SiteId)) {\n throw new ConfigError(\n `Unknown site \"${rawSite}\".`,\n `Use one of: ${SITE_IDS.join(\", \")}.`,\n );\n }\n return rawSite as SiteId;\n}\n\nfunction resolveBaseUrl(site: SiteId, tomlBaseUrl?: string): string {\n const rawBaseUrl =\n process.env.OKX_API_BASE_URL?.trim() ?? tomlBaseUrl ?? OKX_SITES[site].apiBaseUrl;\n if (!rawBaseUrl.startsWith(\"http://\") && !rawBaseUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid base URL \"${rawBaseUrl}\".`,\n \"OKX_API_BASE_URL must start with http:// or https://\",\n );\n }\n return rawBaseUrl.replace(/\\/+$/, \"\");\n}\n\n/**\n * Credential priority (highest to lowest):\n * 1. Environment variables (OKX_API_KEY / OKX_SECRET_KEY / OKX_PASSPHRASE)\n * 2. ~/.okx/config.toml — profile selected by cli.profile or default_profile\n *\n * Site priority (highest to lowest):\n * 1. cli.site arg\n * 2. OKX_SITE env var\n * 3. toml profile site field\n * 4. default: \"global\"\n *\n * Base URL priority (highest to lowest):\n * 1. OKX_API_BASE_URL env var (explicit override — advanced users)\n * 2. toml profile base_url\n * 3. site's apiBaseUrl (auto-derived from site)\n */\nexport function loadConfig(cli: CliOptions): OkxConfig {\n const toml = readTomlProfile(cli.profile);\n const creds = loadCredentials(toml);\n\n const demo =\n cli.demo ||\n process.env.OKX_DEMO === \"1\" ||\n process.env.OKX_DEMO === \"true\" ||\n (toml.demo ?? false);\n\n const site = resolveSite(cli.site, toml.site);\n const baseUrl = resolveBaseUrl(site, toml.base_url);\n\n const rawTimeout = process.env.OKX_TIMEOUT_MS\n ? Number(process.env.OKX_TIMEOUT_MS)\n : (toml.timeout_ms ?? 15_000);\n if (!Number.isFinite(rawTimeout) || rawTimeout <= 0) {\n throw new ConfigError(\n `Invalid timeout value \"${rawTimeout}\".`,\n \"Set OKX_TIMEOUT_MS as a positive integer in milliseconds.\",\n );\n }\n\n // proxy: toml profile only (no env vars — keep it explicit)\n const rawProxyUrl = toml.proxy_url?.trim();\n if (rawProxyUrl && !rawProxyUrl.startsWith(\"http://\") && !rawProxyUrl.startsWith(\"https://\")) {\n throw new ConfigError(\n `Invalid proxy URL \"${rawProxyUrl}\".`,\n \"proxy_url must start with http:// or https://. SOCKS proxies are not supported.\",\n );\n }\n\n return {\n ...creds,\n baseUrl,\n timeoutMs: Math.floor(rawTimeout),\n modules: parseModuleList(cli.modules),\n readOnly: cli.readOnly,\n demo,\n site,\n userAgent: cli.userAgent,\n sourceTag: cli.sourceTag ?? DEFAULT_SOURCE_TAG,\n proxyUrl: rawProxyUrl || undefined,\n verbose: cli.verbose ?? false,\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CACHE_FILE = join(homedir(), \".okx\", \"update-check.json\");\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface PackageCache {\n latestVersion: string;\n checkedAt: number;\n}\n\ntype UpdateCache = Record<string, PackageCache>;\n\nfunction readCache(): UpdateCache {\n try {\n if (existsSync(CACHE_FILE)) {\n return JSON.parse(readFileSync(CACHE_FILE, \"utf-8\")) as UpdateCache;\n }\n } catch {\n // ignore corrupt cache\n }\n return {};\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n mkdirSync(join(homedir(), \".okx\"), { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2), \"utf-8\");\n } catch {\n // ignore write failures\n }\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v\n .replace(/^v/, \"\")\n .split(\".\")\n .map((n) => parseInt(n, 10));\n const [cMaj, cMin, cPat] = parse(current);\n const [lMaj, lMin, lPat] = parse(latest);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`, {\n signal: controller.signal,\n headers: { accept: \"application/json\" },\n });\n clearTimeout(timeout);\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\nfunction refreshCacheInBackground(packageName: string): void {\n fetchLatestVersion(packageName)\n .then((latest) => {\n if (!latest) return;\n const cache = readCache();\n cache[packageName] = { latestVersion: latest, checkedAt: Date.now() };\n writeCache(cache);\n })\n .catch(() => {\n // ignore\n });\n}\n\n/**\n * Check if an update is available and print a notice to stderr.\n * Uses a local cache (~/.okx/update-check.json) so network calls happen\n * at most once per 24 hours, in the background without blocking startup.\n */\nexport function checkForUpdates(packageName: string, currentVersion: string): void {\n const cache = readCache();\n const entry = cache[packageName];\n\n if (entry && isNewerVersion(currentVersion, entry.latestVersion)) {\n process.stderr.write(\n `\\nUpdate available for ${packageName}: ${currentVersion} → ${entry.latestVersion}\\n` +\n `Run: npm install -g ${packageName}\\n\\n`,\n );\n }\n\n if (!entry || Date.now() - entry.checkedAt > CHECK_INTERVAL_MS) {\n refreshCacheInBackground(packageName);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nconst SENSITIVE_KEY_PATTERN = /apiKey|secretKey|passphrase|password|secret/i;\n\nfunction sanitize(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(sanitize);\n }\n if (typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (SENSITIVE_KEY_PATTERN.test(k)) {\n result[k] = \"[REDACTED]\";\n } else {\n result[k] = sanitize(v);\n }\n }\n return result;\n }\n return value;\n}\n\nexport interface LogEntry {\n timestamp: string;\n level: Uppercase<LogLevel>;\n tool: string;\n durationMs: number;\n params: unknown;\n result: unknown;\n}\n\nexport class TradeLogger {\n private readonly logLevel: LogLevel;\n private readonly logDir: string;\n\n constructor(logLevel: LogLevel = \"info\", logDir?: string) {\n this.logLevel = logLevel;\n this.logDir = logDir ?? path.join(os.homedir(), \".okx\", \"logs\");\n }\n\n getLogPath(date?: Date): string {\n const d = date ?? new Date();\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n return path.join(this.logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n }\n\n log(\n level: LogLevel,\n tool: string,\n params: unknown,\n result: unknown,\n durationMs: number,\n ): void {\n if (LOG_LEVEL_PRIORITY[level] > LOG_LEVEL_PRIORITY[this.logLevel]) {\n return;\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level: level.toUpperCase() as Uppercase<LogLevel>,\n tool,\n durationMs,\n params: sanitize(params),\n result: sanitize(result),\n };\n\n try {\n fs.mkdirSync(this.logDir, { recursive: true });\n fs.appendFileSync(this.getLogPath(), JSON.stringify(entry) + \"\\n\", \"utf8\");\n } catch {\n // silent fail\n }\n }\n\n static sanitize(params: unknown): unknown {\n return sanitize(params);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport { configFilePath } from \"./config/toml.js\";\n\nexport type ClientId = \"claude-desktop\" | \"cursor\" | \"windsurf\" | \"vscode\" | \"claude-code\";\n\nexport interface SetupOptions {\n client: ClientId;\n profile?: string;\n modules?: string;\n}\n\nconst CLIENT_NAMES: Record<ClientId, string> = {\n \"claude-desktop\": \"Claude Desktop\",\n cursor: \"Cursor\",\n windsurf: \"Windsurf\",\n vscode: \"VS Code\",\n \"claude-code\": \"Claude Code CLI\",\n};\n\nexport const SUPPORTED_CLIENTS = Object.keys(CLIENT_NAMES) as ClientId[];\n\nfunction appData(): string {\n return process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n}\n\nconst CLAUDE_CONFIG_FILE = \"claude_desktop_config.json\";\n\n/**\n * Detect Microsoft Store installation of Claude Desktop on Windows.\n * MS Store apps use a sandboxed path:\n * %LOCALAPPDATA%\\Packages\\Claude_<hash>\\LocalCache\\Roaming\\Claude\\\n * Returns the config file path if found, null otherwise.\n */\nfunction findMsStoreClaudePath(): string | null {\n const localAppData = process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\");\n const packagesDir = path.join(localAppData, \"Packages\");\n try {\n const entries = fs.readdirSync(packagesDir);\n const claudePkg = entries.find((e) => e.startsWith(\"Claude_\"));\n if (claudePkg) {\n const configPath = path.join(\n packagesDir, claudePkg, \"LocalCache\", \"Roaming\", \"Claude\", CLAUDE_CONFIG_FILE,\n );\n // Return if the config file or its parent directory already exists\n if (fs.existsSync(configPath) || fs.existsSync(path.dirname(configPath))) {\n return configPath;\n }\n }\n } catch {\n // Packages dir may not exist or may not be readable\n }\n return null;\n}\n\nexport function getConfigPath(client: ClientId): string | null {\n const home = os.homedir();\n const platform = process.platform;\n switch (client) {\n case \"claude-desktop\":\n if (platform === \"win32\") {\n // Prefer MS Store path if detected, otherwise standard %APPDATA%\n return findMsStoreClaudePath() ?? path.join(appData(), \"Claude\", CLAUDE_CONFIG_FILE);\n }\n if (platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"Claude\", CLAUDE_CONFIG_FILE);\n }\n // Linux / other\n return path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"Claude\", CLAUDE_CONFIG_FILE);\n case \"cursor\":\n return path.join(home, \".cursor\", \"mcp.json\");\n case \"windsurf\":\n return path.join(home, \".codeium\", \"windsurf\", \"mcp_config.json\");\n case \"vscode\":\n return path.join(process.cwd(), \".mcp.json\");\n case \"claude-code\":\n return null;\n }\n}\n\nconst NPX_PACKAGE = \"@okx_ai/okx-trade-mcp\";\n\nfunction buildEntry(\n client: ClientId,\n args: string[]\n): Record<string, unknown> {\n if (client === \"vscode\") {\n // VS Code inherits the terminal PATH — bare command is fine\n return { type: \"stdio\", command: \"okx-trade-mcp\", args };\n }\n // Standalone apps (Claude Desktop, Cursor, Windsurf) have a limited PATH\n // that often can't find globally-installed npm bins. Use npx to ensure\n // the binary is always resolved.\n return { command: \"npx\", args: [\"-y\", NPX_PACKAGE, ...args] };\n}\n\nfunction buildArgs(options: SetupOptions): string[] {\n const args: string[] = [];\n if (options.profile) args.push(\"--profile\", options.profile);\n args.push(\"--modules\", options.modules ?? \"all\");\n return args;\n}\n\nfunction mergeJsonConfig(\n configPath: string,\n serverName: string,\n entry: Record<string, unknown>\n): void {\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n\n let data: Record<string, unknown> = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new Error(`Failed to parse existing config at ${configPath}`);\n }\n // Backup before modifying\n const backupPath = configPath + \".bak\";\n fs.copyFileSync(configPath, backupPath);\n process.stdout.write(` Backup → ${backupPath}\\n`);\n }\n\n if (typeof data.mcpServers !== \"object\" || data.mcpServers === null) {\n data.mcpServers = {};\n }\n (data.mcpServers as Record<string, unknown>)[serverName] = entry;\n\n fs.writeFileSync(configPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function printSetupUsage(): void {\n process.stdout.write(\n `Usage: okx-trade-mcp setup --client <client> [--profile <name>] [--modules <list>]\\n\\n` +\n `Clients:\\n` +\n SUPPORTED_CLIENTS.map((id) => ` ${id.padEnd(16)} ${CLIENT_NAMES[id]}`).join(\"\\n\") +\n `\\n\\nOptions:\\n` +\n ` --profile <name> Profile from ${configFilePath()} (default: uses default_profile)\\n` +\n ` --modules <list> Comma-separated modules or \"all\" (default: all)\\n`\n );\n}\n\nexport function runSetup(options: SetupOptions): void {\n const { client } = options;\n const name = CLIENT_NAMES[client];\n const args = buildArgs(options);\n const serverName = options.profile ? `okx-trade-mcp-${options.profile}` : \"okx-trade-mcp\";\n\n if (client === \"claude-code\") {\n const claudeArgs = [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"stdio\",\n serverName,\n \"--\",\n \"okx-trade-mcp\",\n ...args,\n ];\n process.stdout.write(`Running: claude ${claudeArgs.join(\" \")}\\n`);\n execFileSync(\"claude\", claudeArgs, { stdio: \"inherit\" }); // NOSONAR\n process.stdout.write(`✓ Configured ${name}\\n`);\n return;\n }\n\n const configPath = getConfigPath(client);\n if (!configPath) {\n throw new Error(`${name} is not supported on this platform`);\n }\n\n const entry = buildEntry(client, args);\n mergeJsonConfig(configPath, serverName, entry);\n process.stdout.write(\n `✓ Configured ${name}\\n` +\n ` ${configPath}\\n` +\n ` Server args: ${args.join(\" \")}\\n`\n );\n if (client !== \"vscode\") {\n process.stdout.write(` Restart ${name} to apply changes.\\n`);\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","import dns from \"node:dns/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport tls from \"node:tls\";\nimport { createRequire } from \"node:module\";\nimport type { OkxConfig } from \"@agent-tradekit/core\";\nimport { OkxRestClient } from \"@agent-tradekit/core\";\n\nconst _require = createRequire(import.meta.url);\n\nfunction readCliVersion(): string {\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n try {\n return (_require(rel) as { version: string }).version;\n } catch (_err: unknown) {\n // Path not found in this layout (bundled vs source) — try next\n }\n }\n return \"0.0.0\";\n}\n\nconst CLI_VERSION = readCliVersion();\n\ndeclare const __GIT_HASH__: string;\nconst GIT_HASH: string = typeof __GIT_HASH__ !== \"undefined\" ? __GIT_HASH__ : \"dev\";\n\n// ---------------------------------------------------------------------------\n// Report collector — accumulates raw data for the copy-paste block\n// ---------------------------------------------------------------------------\n\ninterface ReportLine { key: string; value: string }\n\nclass Report {\n private lines: ReportLine[] = [];\n\n add(key: string, value: string): void {\n this.lines.push({ key, value });\n }\n\n print(): void {\n const w = process.stdout.write.bind(process.stdout);\n const sep = \"\\u2500\".repeat(52);\n w(`\\n \\u2500\\u2500 Diagnostic Report (copy & share) ${sep.slice(35)}\\n`);\n for (const { key, value } of this.lines) {\n w(` ${key.padEnd(14)} ${value}\\n`);\n }\n w(` ${sep}\\n\\n`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Display helpers\n// ---------------------------------------------------------------------------\n\nfunction ok(label: string, detail: string): void {\n process.stdout.write(` \\u2713 ${label.padEnd(14)} ${detail}\\n`);\n}\n\nfunction fail(label: string, detail: string, hints: string[]): void {\n process.stdout.write(` \\u2717 ${label.padEnd(14)} ${detail}\\n`);\n for (const hint of hints) {\n process.stdout.write(` \\u2192 ${hint}\\n`);\n }\n}\n\nfunction section(title: string): void {\n process.stdout.write(`\\n ${title}\\n`);\n}\n\nfunction maskKey(key: string | undefined): string {\n if (!key) return \"(not set)\";\n if (key.length <= 8) return \"****\";\n return `${key.slice(0, 2)}****${key.slice(-2)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Network probes\n// ---------------------------------------------------------------------------\n\ninterface ProbeResult { ok: boolean; ms: number; ip?: string; error?: string }\n\nasync function checkDns(hostname: string): Promise<ProbeResult> {\n const t0 = Date.now();\n try {\n const addresses = await dns.resolve4(hostname);\n return { ok: true, ip: addresses[0], ms: Date.now() - t0 };\n } catch (e) {\n return { ok: false, ms: Date.now() - t0, error: e instanceof Error ? e.message : String(e) };\n }\n}\n\nasync function checkSocket(\n createFn: () => net.Socket | tls.TLSSocket,\n successEvent: string,\n timeoutMs: number,\n): Promise<ProbeResult> {\n const t0 = Date.now();\n return new Promise((resolve) => {\n const socket = createFn();\n const cleanup = (): void => { socket.removeAllListeners(); socket.destroy(); };\n socket.once(successEvent, () => {\n cleanup();\n resolve({ ok: true, ms: Date.now() - t0 });\n });\n socket.once(\"timeout\", () => {\n cleanup();\n resolve({ ok: false, ms: Date.now() - t0, error: `timed out after ${timeoutMs}ms` });\n });\n socket.once(\"error\", (err: Error) => {\n cleanup();\n resolve({ ok: false, ms: Date.now() - t0, error: err.message });\n });\n });\n}\n\nasync function checkTcp(hostname: string, port: number, timeoutMs = 5000): Promise<ProbeResult> {\n return checkSocket(\n () => net.createConnection({ host: hostname, port, timeout: timeoutMs }),\n \"connect\",\n timeoutMs,\n );\n}\n\nasync function checkTls(hostname: string, port: number, timeoutMs = 5000): Promise<ProbeResult> {\n return checkSocket(\n () => tls.connect({ host: hostname, port, timeout: timeoutMs, servername: hostname }),\n \"secureConnect\",\n timeoutMs,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Diagnostic check helpers (extracted to reduce cmdDiagnose complexity)\n// ---------------------------------------------------------------------------\n\nfunction checkProxyEnv(report: Report): void {\n const httpProxy = process.env.HTTP_PROXY ?? process.env.http_proxy;\n const httpsProxy = process.env.HTTPS_PROXY ?? process.env.https_proxy;\n const noProxy = process.env.NO_PROXY ?? process.env.no_proxy;\n if (httpProxy || httpsProxy) {\n ok(\"HTTP_PROXY\", httpProxy ?? \"(not set)\");\n ok(\"HTTPS_PROXY\", httpsProxy ?? \"(not set)\");\n if (noProxy) ok(\"NO_PROXY\", noProxy);\n report.add(\"http_proxy\", httpProxy ?? \"-\");\n report.add(\"https_proxy\", httpsProxy ?? \"-\");\n if (noProxy) report.add(\"no_proxy\", noProxy);\n } else {\n ok(\"Proxy\", \"(none)\");\n report.add(\"proxy\", \"none\");\n }\n}\n\nfunction checkEnvironment(report: Report): boolean {\n let passed = true;\n section(\"Environment\");\n\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1), 10);\n if (nodeMajor >= 18) {\n ok(\"Node.js\", `${nodeVersion} (>= 18 required)`);\n } else {\n fail(\"Node.js\", `${nodeVersion} (>= 18 required)`, [\"Upgrade Node.js to v18 or later\"]);\n passed = false;\n }\n ok(\"CLI\", `v${CLI_VERSION} (${GIT_HASH})`);\n ok(\"OS\", `${process.platform} ${process.arch}`);\n ok(\"OS release\", os.release());\n ok(\"Shell\", process.env.SHELL ?? \"(unknown)\");\n ok(\"Locale\", `${process.env.LANG ?? process.env.LC_ALL ?? \"(unknown)\"}`);\n ok(\"Timezone\", Intl.DateTimeFormat().resolvedOptions().timeZone);\n\n report.add(\"cli\", `${CLI_VERSION} (${GIT_HASH})`);\n report.add(\"node\", `${nodeVersion} ${process.platform} ${process.arch}`);\n // os.machine() available since Node 19.9 — fall back to process.arch for Node 18\n const machine = typeof os.machine === \"function\" ? os.machine() : process.arch;\n report.add(\"os\", `${os.type()} ${os.release()} ${machine}`);\n report.add(\"shell\", process.env.SHELL ?? \"-\");\n report.add(\"locale\", process.env.LANG ?? process.env.LC_ALL ?? \"-\");\n report.add(\"tz\", Intl.DateTimeFormat().resolvedOptions().timeZone);\n\n checkProxyEnv(report);\n\n return passed;\n}\n\nfunction checkConfig(config: OkxConfig, profile: string, report: Report): boolean {\n let passed = true;\n section(`Config (profile: ${profile})`);\n\n if (config.hasAuth) {\n ok(\"API key\", maskKey(config.apiKey));\n ok(\"Secret\", \"****\");\n ok(\"Passphrase\", \"****\");\n } else {\n fail(\"Credentials\", \"not configured\", [\n \"Set OKX_API_KEY, OKX_SECRET_KEY, OKX_PASSPHRASE env vars\",\n \"Or run: okx config init\",\n ]);\n passed = false;\n }\n ok(\"Demo mode\", String(config.demo));\n ok(\"Site\", config.site);\n ok(\"Base URL\", config.baseUrl);\n ok(\"Timeout\", `${config.timeoutMs}ms`);\n\n report.add(\"profile\", profile);\n report.add(\"site\", config.site);\n report.add(\"base\", config.baseUrl);\n report.add(\"auth\", config.hasAuth ? `true (key=${maskKey(config.apiKey)})` : \"false\");\n report.add(\"demo\", String(config.demo));\n report.add(\"timeout\", `${config.timeoutMs}ms`);\n\n return passed;\n}\n\nasync function checkTcpTls(\n hostname: string, port: number, protocol: string, report: Report,\n): Promise<boolean> {\n let passed = true;\n const tcpResult = await checkTcp(hostname, port);\n if (tcpResult.ok) {\n ok(\"TCP connect\", `port ${port} (${tcpResult.ms}ms)`);\n report.add(\"tcp\", `${port} OK (${tcpResult.ms}ms)`);\n } else {\n fail(\"TCP connect\", `port ${port} \\u2014 ${tcpResult.error}`, [\n \"Check firewall/proxy/VPN settings\",\n `Try: nc -zv ${hostname} ${port}`,\n ]);\n report.add(\"tcp\", `FAIL ${port} ${tcpResult.error} (${tcpResult.ms}ms)`);\n return false;\n }\n\n if (protocol === \"https:\") {\n const tlsResult = await checkTls(hostname, port);\n if (tlsResult.ok) {\n ok(\"TLS handshake\", `(${tlsResult.ms}ms)`);\n report.add(\"tls\", `OK (${tlsResult.ms}ms)`);\n } else {\n fail(\"TLS handshake\", tlsResult.error ?? \"failed\", [\n \"Check system certificates or proxy MITM settings\",\n ]);\n passed = false;\n report.add(\"tls\", `FAIL ${tlsResult.error} (${tlsResult.ms}ms)`);\n }\n }\n return passed;\n}\n\nasync function checkNetwork(config: OkxConfig, client: OkxRestClient, report: Report): Promise<boolean> {\n let passed = true;\n section(\"Network\");\n\n const url = new URL(config.baseUrl);\n const hostname = url.hostname;\n const defaultPort = url.protocol === \"https:\" ? 443 : 80;\n const port = url.port ? parseInt(url.port, 10) : defaultPort;\n\n const dnsResult = await checkDns(hostname);\n if (dnsResult.ok) {\n ok(\"DNS resolve\", `${hostname} \\u2192 ${dnsResult.ip} (${dnsResult.ms}ms)`);\n report.add(\"dns\", `${hostname} \\u2192 ${dnsResult.ip} (${dnsResult.ms}ms)`);\n } else {\n fail(\"DNS resolve\", `${hostname} \\u2014 ${dnsResult.error}`, [\n \"Check DNS settings or network connection\",\n `Try: nslookup ${hostname}`,\n ]);\n passed = false;\n report.add(\"dns\", `FAIL ${hostname} ${dnsResult.error} (${dnsResult.ms}ms)`);\n }\n\n if (dnsResult.ok) {\n const tcpTlsPassed = await checkTcpTls(hostname, port, url.protocol, report);\n if (!tcpTlsPassed) passed = false;\n }\n\n // Public API check\n const t0 = Date.now();\n try {\n await client.publicGet(\"/api/v5/public/time\");\n const ms = Date.now() - t0;\n ok(\"API /public/time\", `200 (${ms}ms)`);\n report.add(\"api\", `/public/time 200 (${ms}ms)`);\n } catch (e) {\n const ms = Date.now() - t0;\n const msg = e instanceof Error ? e.message : String(e);\n fail(\"API /public/time\", msg, [\n \"OKX API may be down or blocked in your network\",\n `Try: curl ${config.baseUrl}/api/v5/public/time`,\n ]);\n passed = false;\n report.add(\"api\", `FAIL /public/time ${msg} (${ms}ms)`);\n }\n\n return passed;\n}\n\nfunction getAuthHints(msg: string): string[] {\n if (msg.includes(\"50111\") || msg.includes(\"Invalid OK-ACCESS-KEY\")) {\n return [\"API key is invalid or expired\", \"Regenerate at https://www.okx.com/account/my-api\"];\n }\n if (msg.includes(\"50112\") || msg.includes(\"Invalid Sign\")) {\n return [\"Secret key or passphrase may be wrong\", \"Regenerate API key at https://www.okx.com/account/my-api\"];\n }\n if (msg.includes(\"50113\")) {\n return [\"Passphrase is incorrect\"];\n }\n if (msg.includes(\"50100\")) {\n return [\"API key lacks required permissions\", \"Update permissions at https://www.okx.com/account/my-api\"];\n }\n return [\"Check API credentials and permissions\"];\n}\n\nasync function checkAuth(client: OkxRestClient, config: OkxConfig, report: Report): Promise<boolean> {\n if (!config.hasAuth) {\n report.add(\"auth_api\", \"skipped (no credentials)\");\n return true;\n }\n\n let passed = true;\n section(\"Authentication\");\n\n const t1 = Date.now();\n try {\n await client.privateGet(\"/api/v5/account/balance\");\n const ms = Date.now() - t1;\n ok(\"Account balance\", `200 (${ms}ms)`);\n if (config.demo) {\n ok(\"Demo header\", \"x-simulated-trading: 1\");\n }\n report.add(\"auth_api\", `/account/balance 200 (${ms}ms)`);\n } catch (e) {\n const ms = Date.now() - t1;\n const msg = e instanceof Error ? e.message : String(e);\n const hints = getAuthHints(msg);\n fail(\"Account balance\", msg, hints);\n passed = false;\n report.add(\"auth_api\", `FAIL /account/balance ${msg} (${ms}ms)`);\n }\n\n return passed;\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nexport async function cmdDiagnose(config: OkxConfig, profile: string): Promise<void> {\n process.stdout.write(\"\\n OKX Trade CLI Diagnostics\\n\");\n process.stdout.write(\" \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\n\");\n\n const report = new Report();\n report.add(\"ts\", new Date().toISOString());\n\n const envPassed = checkEnvironment(report);\n const cfgPassed = checkConfig(config, profile, report);\n const client = new OkxRestClient(config);\n const netPassed = await checkNetwork(config, client, report);\n const authPassed = await checkAuth(client, config, report);\n\n const allPassed = envPassed && cfgPassed && netPassed && authPassed;\n\n // --- Result ---\n process.stdout.write(\"\\n\");\n if (allPassed) {\n process.stdout.write(\" Result: All checks passed \\u2713\\n\");\n } else {\n process.stdout.write(\" Result: Some checks failed \\u2717\\n\");\n process.exitCode = 1;\n }\n\n report.add(\"result\", allPassed ? \"PASS\" : \"FAIL\");\n report.print();\n}\n","import type { OkxConfig } from \"@agent-tradekit/core\";\nimport { loadConfig } from \"@agent-tradekit/core\";\n\nexport interface LoadProfileOptions {\n profile?: string;\n modules?: string;\n readOnly?: boolean;\n demo?: boolean;\n site?: string;\n userAgent?: string;\n sourceTag?: string;\n verbose?: boolean;\n}\n\n/**\n * Load config for CLI commands.\n * Delegates to core's loadConfig which handles the full priority chain:\n * env vars > ~/.okx/config.toml (selected profile) > defaults\n */\nexport function loadProfileConfig(opts: LoadProfileOptions): OkxConfig {\n return loadConfig({\n profile: opts.profile,\n modules: opts.modules,\n readOnly: opts.readOnly ?? false,\n demo: opts.demo ?? false,\n site: opts.site,\n userAgent: opts.userAgent,\n sourceTag: opts.sourceTag,\n verbose: opts.verbose,\n });\n}\n","import * as fs from \"node:fs\";\nimport { runSetup, printSetupUsage, getConfigPath, SUPPORTED_CLIENTS } from \"@agent-tradekit/core\";\nimport type { ClientId, SetupOptions } from \"@agent-tradekit/core\";\n\nexport type { ClientId, SetupOptions };\nexport { runSetup, printSetupUsage, SUPPORTED_CLIENTS };\n\n/** Clients whose config files can be auto-detected on disk. */\nconst DETECTABLE_CLIENTS: ClientId[] = [\"claude-desktop\", \"cursor\", \"windsurf\"];\n\n/**\n * Non-interactive setup for a specific client.\n */\nexport function cmdSetupClient(options: SetupOptions): void {\n runSetup(options);\n}\n\n/**\n * Auto-detect installed clients and print what was found.\n * Kept for backward compatibility with `okx config setup-clients`.\n */\nexport function cmdSetupClients(): void {\n const detected: { id: ClientId; path: string }[] = [];\n for (const id of DETECTABLE_CLIENTS) {\n const p = getConfigPath(id);\n if (p && fs.existsSync(p)) {\n detected.push({ id, path: p });\n }\n }\n\n if (detected.length > 0) {\n process.stdout.write(`Detected clients:\\n`);\n for (const { id, path } of detected) {\n process.stdout.write(` ${id.padEnd(16)} ${path}\\n`);\n }\n process.stdout.write(`\\n`);\n }\n\n printSetupUsage();\n}\n","import { SUPPORTED_CLIENTS } from \"./commands/client-setup.js\";\nimport { configFilePath } from \"@agent-tradekit/core\";\n\n// ---------------------------------------------------------------------------\n// Help tree data structures\n// ---------------------------------------------------------------------------\n\ninterface CommandInfo {\n /** Full usage line, e.g. \"okx bot grid create --instId <id> ...\" */\n usage: string;\n /** Short description of what the command does */\n description: string;\n}\n\ninterface GroupInfo {\n /** One-line description shown in parent overview */\n description: string;\n /** Optional direct usage line when the group has no sub-commands */\n usage?: string;\n /** Leaf commands within this group */\n commands?: Record<string, CommandInfo>;\n /** Nested sub-groups (e.g. bot → grid, spot → algo) */\n subgroups?: Record<string, GroupInfo>;\n}\n\ntype HelpTree = Record<string, GroupInfo>;\n\n// ---------------------------------------------------------------------------\n// Help data — descriptions are intentionally kept in sync with core ToolSpec\n// ---------------------------------------------------------------------------\n\nconst HELP_TREE: HelpTree = {\n market: {\n description: \"Market data (ticker, orderbook, candles, trades)\",\n commands: {\n ticker: {\n usage: \"okx market ticker <instId>\",\n description: \"Get latest ticker data for an instrument\",\n },\n tickers: {\n usage: \"okx market tickers <instType>\",\n description: \"Get all tickers for an instrument type (SPOT|SWAP|FUTURES|OPTION)\",\n },\n orderbook: {\n usage: \"okx market orderbook <instId> [--sz <n>]\",\n description: \"Get order book depth for an instrument\",\n },\n candles: {\n usage: \"okx market candles <instId> [--bar <bar>] [--limit <n>]\",\n description: \"Get candlestick (OHLCV) data\",\n },\n instruments: {\n usage: \"okx market instruments --instType <type> [--instId <id>]\",\n description: \"List tradable instruments of a given type\",\n },\n \"funding-rate\": {\n usage: \"okx market funding-rate <instId> [--history] [--limit <n>]\",\n description: \"Get current or historical funding rate for perpetual swaps\",\n },\n \"mark-price\": {\n usage: \"okx market mark-price --instType <MARGIN|SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get mark price for instruments\",\n },\n trades: {\n usage: \"okx market trades <instId> [--limit <n>]\",\n description: \"Get recent trades for an instrument\",\n },\n \"index-ticker\": {\n usage: \"okx market index-ticker [--instId <id>] [--quoteCcy <ccy>]\",\n description: \"Get index ticker data\",\n },\n \"index-candles\": {\n usage: \"okx market index-candles <instId> [--bar <bar>] [--limit <n>] [--history]\",\n description: \"Get index candlestick data\",\n },\n \"price-limit\": {\n usage: \"okx market price-limit <instId>\",\n description: \"Get price limit for an instrument\",\n },\n \"open-interest\": {\n usage: \"okx market open-interest --instType <SWAP|FUTURES|OPTION> [--instId <id>]\",\n description: \"Get open interest for instruments\",\n },\n },\n },\n\n account: {\n description: \"Account balance, positions, bills, and configuration\",\n commands: {\n balance: {\n usage: \"okx account balance [<ccy>]\",\n description: \"Get trading account balance\",\n },\n \"asset-balance\": {\n usage: \"okx account asset-balance [--ccy <ccy>]\",\n description: \"Get funding account asset balance\",\n },\n positions: {\n usage: \"okx account positions [--instType <type>] [--instId <id>]\",\n description: \"Get current open positions\",\n },\n \"positions-history\": {\n usage: \"okx account positions-history [--instType <type>] [--instId <id>] [--limit <n>]\",\n description: \"Get historical positions\",\n },\n bills: {\n usage: \"okx account bills [--instType <type>] [--ccy <ccy>] [--limit <n>] [--archive]\",\n description: \"Get account bill history\",\n },\n fees: {\n usage: \"okx account fees --instType <type> [--instId <id>]\",\n description: \"Get trading fee rates\",\n },\n config: {\n usage: \"okx account config\",\n description: \"Get account configuration\",\n },\n \"set-position-mode\": {\n usage: \"okx account set-position-mode --posMode <long_short_mode|net_mode>\",\n description: \"Set position mode (long/short or net)\",\n },\n \"max-size\": {\n usage: \"okx account max-size --instId <id> --tdMode <cross|isolated> [--px <price>]\",\n description: \"Get maximum order size for an instrument\",\n },\n \"max-avail-size\": {\n usage: \"okx account max-avail-size --instId <id> --tdMode <cross|isolated|cash>\",\n description: \"Get maximum available tradable amount\",\n },\n \"max-withdrawal\": {\n usage: \"okx account max-withdrawal [--ccy <ccy>]\",\n description: \"Get maximum withdrawable amount\",\n },\n transfer: {\n usage: \"okx account transfer --ccy <ccy> --amt <n> --from <acct> --to <acct> [--transferType <0|1|2|3>]\",\n description: \"Transfer funds between accounts\",\n },\n audit: {\n usage: \"okx account audit [--tool <name>] [--since <ISO-date>] [--limit <n>]\",\n description: \"Audit account activity and tool call history\",\n },\n },\n },\n\n spot: {\n description: \"Spot trading (orders, algo orders)\",\n commands: {\n orders: {\n usage: \"okx spot orders [--instId <id>] [--history]\",\n description: \"List open or historical spot orders\",\n },\n get: {\n usage: \"okx spot get --instId <id> --ordId <id>\",\n description: \"Get details of a specific spot order\",\n },\n fills: {\n usage: \"okx spot fills [--instId <id>] [--ordId <id>]\",\n description: \"Get trade fill history for spot orders\",\n },\n place: {\n usage: \"okx spot place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--px <price>] [--tdMode <cash|cross|isolated>] [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new spot order (supports attached TP/SL)\",\n },\n amend: {\n usage: \"okx spot amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending spot order\",\n },\n cancel: {\n usage: \"okx spot cancel <instId> --ordId <id>\",\n description: \"Cancel a pending spot order\",\n },\n batch: {\n usage: \"okx spot batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel spot orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Spot algo orders (conditional, OCO, take-profit/stop-loss)\",\n commands: {\n orders: {\n usage: \"okx spot algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List spot algo orders\",\n },\n place: {\n usage: \"okx spot algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>] [--tdMode <cash|cross|isolated>]\",\n description: \"Place a spot algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx spot algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending spot algo order\",\n },\n cancel: {\n usage: \"okx spot algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending spot algo order\",\n },\n },\n },\n },\n },\n\n swap: {\n description: \"Perpetual swap trading (orders, algo orders)\",\n commands: {\n positions: {\n usage: \"okx swap positions [<instId>]\",\n description: \"Get current perpetual swap positions\",\n },\n orders: {\n usage: \"okx swap orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical swap orders\",\n },\n get: {\n usage: \"okx swap get --instId <id> --ordId <id>\",\n description: \"Get details of a specific swap order\",\n },\n fills: {\n usage: \"okx swap fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for swap orders\",\n },\n place: {\n usage: \"okx swap place --instId <id> --side <buy|sell> --ordType <type> --sz <n> [--posSide <side>] [--px <price>] [--tdMode <cross|isolated>] [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new perpetual swap order (supports attached TP/SL)\",\n },\n cancel: {\n usage: \"okx swap cancel <instId> --ordId <id>\",\n description: \"Cancel a pending swap order\",\n },\n amend: {\n usage: \"okx swap amend --instId <id> --ordId <id> [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending swap order\",\n },\n close: {\n usage: \"okx swap close --instId <id> --mgnMode <cross|isolated> [--posSide <net|long|short>] [--autoCxl]\",\n description: \"Close a swap position\",\n },\n leverage: {\n usage: \"okx swap leverage --instId <id> --lever <n> --mgnMode <cross|isolated> [--posSide <side>]\",\n description: \"Set leverage for a swap instrument\",\n },\n \"get-leverage\": {\n usage: \"okx swap get-leverage --instId <id> --mgnMode <cross|isolated>\",\n description: \"Get current leverage setting for a swap instrument\",\n },\n batch: {\n usage: \"okx swap batch --action <place|amend|cancel> --orders '<json>'\",\n description: \"Batch place, amend, or cancel swap orders\",\n },\n },\n subgroups: {\n algo: {\n description: \"Perpetual swap algo orders (trailing stop, conditional, OCO)\",\n commands: {\n orders: {\n usage: \"okx swap algo orders [--instId <id>] [--history] [--ordType <conditional|oco>]\",\n description: \"List swap algo orders\",\n },\n trail: {\n usage: \"okx swap algo trail --instId <id> --side <buy|sell> --sz <n> --callbackRatio <ratio>\\n [--activePx <price>] [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a trailing stop algo order for perpetual swap\",\n },\n place: {\n usage: \"okx swap algo place --instId <id> --side <buy|sell> --sz <n> [--ordType <conditional|oco>]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>]\\n [--slTriggerPx <price>] [--slOrdPx <price|-1>]\\n [--posSide <net|long|short>] [--tdMode <cross|isolated>] [--reduceOnly]\",\n description: \"Place a swap algo order (take-profit/stop-loss)\",\n },\n amend: {\n usage: \"okx swap algo amend --instId <id> --algoId <id> [--newSz <n>]\\n [--newTpTriggerPx <price>] [--newTpOrdPx <price|-1>]\\n [--newSlTriggerPx <price>] [--newSlOrdPx <price|-1>]\",\n description: \"Amend a pending swap algo order\",\n },\n cancel: {\n usage: \"okx swap algo cancel --instId <id> --algoId <id>\",\n description: \"Cancel a pending swap algo order\",\n },\n },\n },\n },\n },\n\n futures: {\n description: \"Futures trading (orders, positions)\",\n commands: {\n orders: {\n usage: \"okx futures orders [--instId <id>] [--history] [--archive]\",\n description: \"List open or historical futures orders\",\n },\n positions: {\n usage: \"okx futures positions [--instId <id>]\",\n description: \"Get current futures positions\",\n },\n fills: {\n usage: \"okx futures fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for futures orders\",\n },\n place: {\n usage: \"okx futures place --instId <id> --side <buy|sell> --ordType <type> --sz <n>\\n [--tdMode <cross|isolated>] [--posSide <net|long|short>] [--px <price>] [--reduceOnly]\\n [--tpTriggerPx <price>] [--tpOrdPx <price|-1>] [--slTriggerPx <price>] [--slOrdPx <price|-1>]\",\n description: \"Place a new futures order (supports attached TP/SL)\",\n },\n cancel: {\n usage: \"okx futures cancel <instId> --ordId <id>\",\n description: \"Cancel a pending futures order\",\n },\n get: {\n usage: \"okx futures get --instId <id> --ordId <id>\",\n description: \"Get details of a specific futures order\",\n },\n },\n },\n\n option: {\n description: \"Options trading (orders, positions, greeks)\",\n commands: {\n orders: {\n usage: \"okx option orders [--instId <id>] [--uly <uly>] [--history] [--archive]\",\n description: \"List open or historical option orders\",\n },\n get: {\n usage: \"okx option get --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Get details of a specific option order\",\n },\n positions: {\n usage: \"okx option positions [--instId <id>] [--uly <uly>]\",\n description: \"Get current option positions\",\n },\n fills: {\n usage: \"okx option fills [--instId <id>] [--ordId <id>] [--archive]\",\n description: \"Get trade fill history for option orders\",\n },\n instruments: {\n usage: \"okx option instruments --uly <uly> [--expTime <date>]\",\n description: \"List tradable option instruments for an underlying\",\n },\n greeks: {\n usage: \"okx option greeks --uly <uly> [--expTime <date>]\",\n description: \"Get option greeks (delta, gamma, theta, vega)\",\n },\n place: {\n usage: \"okx option place --instId <id> --tdMode <cash|cross|isolated> --side <buy|sell> --ordType <type> --sz <n>\\n [--px <price>] [--reduceOnly] [--clOrdId <id>]\",\n description: \"Place a new option order\",\n },\n cancel: {\n usage: \"okx option cancel --instId <id> [--ordId <id>] [--clOrdId <id>]\",\n description: \"Cancel a pending option order\",\n },\n amend: {\n usage: \"okx option amend --instId <id> [--ordId <id>] [--clOrdId <id>] [--newSz <n>] [--newPx <price>]\",\n description: \"Amend a pending option order\",\n },\n \"batch-cancel\": {\n usage: \"okx option batch-cancel --orders '<json>'\",\n description: \"Batch cancel option orders\",\n },\n },\n },\n\n earn: {\n description: \"Earn products — Simple Earn (savings/lending) and On-chain Earn (staking/DeFi)\",\n subgroups: {\n savings: {\n description: \"Simple Earn — flexible savings and lending\",\n commands: {\n balance: {\n usage: \"okx earn savings balance [<ccy>]\",\n description: \"Get savings balance (optionally filter by currency)\",\n },\n purchase: {\n usage: \"okx earn savings purchase --ccy <ccy> --amt <n> [--rate <rate>]\",\n description: \"Purchase Simple Earn (flexible savings). Rate defaults to 0.01 (1%)\",\n },\n redeem: {\n usage: \"okx earn savings redeem --ccy <ccy> --amt <n>\",\n description: \"Redeem Simple Earn (flexible savings)\",\n },\n \"set-rate\": {\n usage: \"okx earn savings set-rate --ccy <ccy> --rate <rate>\",\n description: \"Set lending rate for a currency\",\n },\n \"lending-history\": {\n usage: \"okx earn savings lending-history [--ccy <ccy>] [--limit <n>]\",\n description: \"Get lending history\",\n },\n \"rate-summary\": {\n usage: \"okx earn savings rate-summary [<ccy>]\",\n description: \"Get market lending rate summary (public, no auth needed)\",\n },\n \"rate-history\": {\n usage: \"okx earn savings rate-history [--ccy <ccy>] [--limit <n>]\",\n description: \"Get historical lending rates (public, no auth needed)\",\n },\n },\n },\n onchain: {\n description: \"On-chain Earn — staking and DeFi products\",\n commands: {\n offers: {\n usage: \"okx earn onchain offers [--productId <id>] [--protocolType <type>] [--ccy <ccy>]\",\n description: \"Browse available on-chain earn products (staking, DeFi)\",\n },\n purchase: {\n usage: \"okx earn onchain purchase --productId <id> --ccy <ccy> --amt <n> [--term <term>] [--tag <tag>]\",\n description: \"Purchase an on-chain earn product (stake/deposit)\",\n },\n redeem: {\n usage: \"okx earn onchain redeem --ordId <id> --protocolType <type> [--allowEarlyRedeem]\",\n description: \"Redeem an on-chain earn position\",\n },\n cancel: {\n usage: \"okx earn onchain cancel --ordId <id> --protocolType <type>\",\n description: \"Cancel a pending on-chain earn order\",\n },\n orders: {\n usage: \"okx earn onchain orders [--productId <id>] [--protocolType <type>] [--ccy <ccy>] [--state <state>]\",\n description: \"List active on-chain earn orders\",\n },\n history: {\n usage: \"okx earn onchain history [--productId <id>] [--protocolType <type>] [--ccy <ccy>]\",\n description: \"Get on-chain earn order history\",\n },\n },\n },\n },\n },\n\n bot: {\n description: \"Trading bot strategies (grid, dca)\",\n subgroups: {\n grid: {\n description: \"Grid trading bot — create, monitor, and stop grid orders\",\n commands: {\n orders: {\n usage: \"okx bot grid orders --algoOrdType <grid|contract_grid|moon_grid> [--instId <id>] [--algoId <id>] [--history]\",\n description: \"List active or historical grid bot orders\",\n },\n details: {\n usage: \"okx bot grid details --algoOrdType <type> --algoId <id>\",\n description: \"Get details of a specific grid bot order\",\n },\n \"sub-orders\": {\n usage: \"okx bot grid sub-orders --algoOrdType <type> --algoId <id> [--live]\",\n description: \"List sub-orders of a grid bot (filled or live)\",\n },\n create: {\n usage: \"okx bot grid create --instId <id> --algoOrdType <grid|contract_grid> --maxPx <px> --minPx <px> --gridNum <n>\\n [--runType <1|2>] [--quoteSz <n>] [--baseSz <n>]\\n [--direction <long|short|neutral>] [--lever <n>] [--sz <n>] [--basePos] [--no-basePos]\",\n description: \"Create a new grid bot order (contract grid opens base position by default)\",\n },\n stop: {\n usage: \"okx bot grid stop --algoId <id> --algoOrdType <type> --instId <id> [--stopType <1|2|3|5|6>]\",\n description: \"Stop a running grid bot order\",\n },\n },\n },\n dca: {\n description: \"Contract DCA (Martingale) bot — leveraged recurring buys on futures/swaps\",\n commands: {\n orders: {\n usage: \"okx bot dca orders [--history]\",\n description: \"List active or historical Contract DCA bot orders\",\n },\n details: {\n usage: \"okx bot dca details --algoId <id>\",\n description: \"Get details of a specific Contract DCA bot order\",\n },\n \"sub-orders\": {\n usage: \"okx bot dca sub-orders --algoId <id> [--cycleId <id>]\",\n description: \"List cycles or orders within a cycle of a Contract DCA bot\",\n },\n create: {\n usage: \"okx bot dca create --instId <id> --lever <n> --direction <long|short>\\n --initOrdAmt <n> --maxSafetyOrds <n> --tpPct <n>\\n [--safetyOrdAmt <n>] [--pxSteps <n>] [--pxStepsMult <n>] [--volMult <n>]\\n [--slPct <n>] [--slMode <limit|market>]\\n [--allowReinvest <true|false>] [--triggerStrategy <instant|price|rsi>] [--triggerPx <price>]\\n Note: safetyOrdAmt, pxSteps, pxStepsMult, volMult are required when maxSafetyOrds > 0\",\n description: \"Create a new Contract DCA bot order\",\n },\n stop: {\n usage: \"okx bot dca stop --algoId <id>\",\n description: \"Stop a running Contract DCA bot order\",\n },\n },\n },\n },\n },\n\n config: {\n description: \"Manage CLI configuration profiles\",\n commands: {\n init: {\n usage: \"okx config init [--lang zh]\",\n description: \"Initialize a new configuration profile interactively\",\n },\n show: {\n usage: \"okx config show\",\n description: `Show current configuration (file: ${configFilePath()})`,\n },\n set: {\n usage: \"okx config set <key> <value>\",\n description: \"Set a configuration value\",\n },\n \"setup-clients\": {\n usage: \"okx config setup-clients\",\n description: \"Set up MCP client integrations (Cursor, Windsurf, etc.)\",\n },\n },\n },\n\n setup: {\n description: \"Set up client integrations (Cursor, Windsurf, Claude, etc.)\",\n usage: `okx setup --client <${SUPPORTED_CLIENTS.join(\"|\")}> [--profile <name>] [--modules <list>]`,\n },\n\n diagnose: {\n description: \"Run network diagnostics (DNS, TCP, TLS, API, auth)\",\n usage: \"okx diagnose [--profile <name>] [--demo]\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Rendering helpers\n// ---------------------------------------------------------------------------\n\n/** Render the global overview (no path arguments). */\nfunction printGlobalHelp(): void {\n const lines: string[] = [\n \"\",\n `Usage: okx [--profile <name>] [--demo] [--json] <module> <action> [args...]`,\n \"\",\n \"Global Options:\",\n ` --profile <name> Use a named profile from ${configFilePath()}`,\n \" --demo Use simulated trading (demo) mode\",\n \" --json Output raw JSON\",\n \" --verbose Show detailed network request/response info (stderr)\",\n \" --version, -v Show version\",\n \" --help Show this help\",\n \"\",\n \"Modules:\",\n ];\n\n const colWidth = 12;\n for (const [name, group] of Object.entries(HELP_TREE)) {\n lines.push(` ${name.padEnd(colWidth)}${group.description}`);\n }\n\n lines.push(\"\", 'Run \"okx <module> --help\" for module details.', \"\");\n process.stdout.write(lines.join(\"\\n\"));\n}\n\n/** Render module-level help (one path argument, e.g. \"spot\"). */\nfunction printModuleHelp(moduleName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n process.stderr.write(`Unknown module: ${moduleName}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const hasSubgroups = group.subgroups && Object.keys(group.subgroups).length > 0;\n const hasCommands = group.commands && Object.keys(group.commands).length > 0;\n\n const lines: string[] = [\"\"];\n\n if (hasSubgroups && !hasCommands) {\n // Pure subgroup module (e.g. bot)\n const subgroupNames = Object.keys(group.subgroups!);\n lines.push(`Usage: okx ${moduleName} <strategy> <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\");\n lines.push(\"Strategies:\");\n const colWidth = Math.max(...subgroupNames.map((n) => n.length)) + 4;\n for (const [sgName, sg] of Object.entries(group.subgroups!)) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <strategy> --help\" for details.`);\n } else if (hasSubgroups && hasCommands) {\n // Mixed: has both direct commands and subgroups (e.g. spot, swap)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n lines.push(\"\", \"Subgroups:\");\n const subgroupEntries = Object.entries(group.subgroups!);\n const colWidth = Math.max(...subgroupEntries.map(([n]) => n.length)) + 4;\n for (const [sgName, sg] of subgroupEntries) {\n lines.push(` ${sgName.padEnd(colWidth)}${sg.description}`);\n }\n lines.push(\"\", `Run \"okx ${moduleName} <subgroup> --help\" for subgroup details.`);\n } else if (hasCommands) {\n // Plain module with direct commands only (e.g. market, account)\n lines.push(`Usage: okx ${moduleName} <action> [args...]`);\n lines.push(\"\", `${group.description}.`, \"\", \"Commands:\");\n printCommandList(lines, group.commands!);\n } else if (group.usage) {\n // Module with no sub-commands (e.g. setup)\n lines.push(`Usage: ${group.usage}`);\n lines.push(\"\", `${group.description}.`);\n if (group.commands) {\n lines.push(\"\");\n for (const cmd of Object.values(group.commands)) {\n lines.push(` ${cmd.description}`);\n lines.push(` Usage: ${cmd.usage}`);\n }\n }\n }\n\n lines.push(\"\");\n process.stdout.write(lines.join(\"\\n\"));\n}\n\n/** Render subgroup-level help (two path arguments, e.g. \"bot\", \"grid\"). */\nfunction printSubgroupHelp(moduleName: string, subgroupName: string): void {\n const group = HELP_TREE[moduleName];\n if (!group) {\n process.stderr.write(`Unknown module: ${moduleName}\\n`);\n process.exitCode = 1;\n return;\n }\n const subgroup = group.subgroups?.[subgroupName];\n if (!subgroup) {\n process.stderr.write(`Unknown subgroup: ${moduleName} ${subgroupName}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const lines: string[] = [\n \"\",\n `Usage: okx ${moduleName} ${subgroupName} <action> [args...]`,\n \"\",\n `${subgroup.description}.`,\n \"\",\n \"Commands:\",\n ];\n\n if (subgroup.commands) {\n printCommandList(lines, subgroup.commands);\n }\n\n lines.push(\"\");\n process.stdout.write(lines.join(\"\\n\"));\n}\n\n/** Append a formatted command list to the lines array. */\nfunction printCommandList(lines: string[], commands: Record<string, CommandInfo>): void {\n const names = Object.keys(commands);\n const colWidth = Math.max(...names.map((n) => n.length)) + 4;\n\n for (const [name, cmd] of Object.entries(commands)) {\n lines.push(` ${name.padEnd(colWidth)}${cmd.description}`);\n // Indent usage lines to align with the description column\n const usageLines = cmd.usage.split(\"\\n\");\n lines.push(` ${\" \".repeat(colWidth)}Usage: ${usageLines[0]}`);\n for (const extra of usageLines.slice(1)) {\n lines.push(` ${\" \".repeat(colWidth)} ${extra.trimStart()}`);\n }\n lines.push(\"\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Print help text to stdout.\n *\n * - `printHelp()` — global module overview\n * - `printHelp(\"market\")` — module detail with all commands\n * - `printHelp(\"bot\")` — module overview listing sub-strategies\n * - `printHelp(\"bot\", \"grid\")` — subgroup detail with all commands\n * - `printHelp(\"spot\", \"algo\")` — subgroup detail with all commands\n */\nexport function printHelp(...path: string[]): void {\n const [moduleName, subgroupName] = path;\n if (!moduleName) {\n printGlobalHelp();\n } else if (!subgroupName) {\n printModuleHelp(moduleName);\n } else {\n printSubgroupHelp(moduleName, subgroupName);\n }\n}\n","import { parseArgs } from \"node:util\";\n\nexport interface CliValues {\n profile?: string;\n demo?: boolean;\n json?: boolean;\n help?: boolean;\n version?: boolean;\n client?: string;\n modules?: string;\n bar?: string;\n limit?: string;\n sz?: string;\n instId?: string;\n history?: boolean;\n ordId?: string;\n side?: string;\n ordType?: string;\n px?: string;\n posSide?: string;\n tdMode?: string;\n lever?: string;\n mgnMode?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n algoId?: string;\n reduceOnly?: boolean;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n algoOrdType?: string;\n gridNum?: string;\n maxPx?: string;\n minPx?: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n basePos?: boolean;\n stopType?: string;\n live?: boolean;\n instType?: string;\n quoteCcy?: string;\n archive?: boolean;\n posMode?: string;\n ccy?: string;\n from?: string;\n to?: string;\n transferType?: string;\n subAcct?: string;\n amt?: string;\n autoCxl?: boolean;\n clOrdId?: string;\n newPx?: string;\n // dca bot (contract only)\n initOrdAmt?: string;\n safetyOrdAmt?: string;\n maxSafetyOrds?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n tpPct?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n cycleId?: string;\n lang?: string;\n // option\n uly?: string;\n expTime?: string;\n // batch\n action?: string;\n orders?: string;\n // earn\n rate?: string;\n // audit\n since?: string;\n tool?: string;\n // config profile\n force?: boolean;\n // onchain-earn\n productId?: string;\n protocolType?: string;\n term?: string;\n tag?: string;\n allowEarlyRedeem?: boolean;\n state?: string;\n // diagnostics\n verbose?: boolean;\n}\n\nexport const CLI_OPTIONS = {\n profile: { type: \"string\" },\n demo: { type: \"boolean\", default: false },\n json: { type: \"boolean\", default: false },\n help: { type: \"boolean\", default: false },\n version: { type: \"boolean\", short: \"v\", default: false },\n // setup command\n client: { type: \"string\" },\n modules: { type: \"string\" },\n // market candles\n bar: { type: \"string\" },\n limit: { type: \"string\" },\n sz: { type: \"string\" },\n // orders\n instId: { type: \"string\" },\n history: { type: \"boolean\", default: false },\n ordId: { type: \"string\" },\n // trade\n side: { type: \"string\" },\n ordType: { type: \"string\" },\n px: { type: \"string\" },\n posSide: { type: \"string\" },\n tdMode: { type: \"string\" },\n // leverage\n lever: { type: \"string\" },\n mgnMode: { type: \"string\" },\n // algo orders\n tpTriggerPx: { type: \"string\" },\n tpOrdPx: { type: \"string\" },\n slTriggerPx: { type: \"string\" },\n slOrdPx: { type: \"string\" },\n algoId: { type: \"string\" },\n reduceOnly: { type: \"boolean\", default: false },\n // algo amend\n newSz: { type: \"string\" },\n newTpTriggerPx: { type: \"string\" },\n newTpOrdPx: { type: \"string\" },\n newSlTriggerPx: { type: \"string\" },\n newSlOrdPx: { type: \"string\" },\n // trailing stop\n callbackRatio: { type: \"string\" },\n callbackSpread: { type: \"string\" },\n activePx: { type: \"string\" },\n // grid bot\n algoOrdType: { type: \"string\" },\n gridNum: { type: \"string\" },\n maxPx: { type: \"string\" },\n minPx: { type: \"string\" },\n runType: { type: \"string\" },\n quoteSz: { type: \"string\" },\n baseSz: { type: \"string\" },\n direction: { type: \"string\" },\n basePos: { type: \"boolean\", default: true },\n stopType: { type: \"string\" },\n live: { type: \"boolean\", default: false },\n // market extras\n instType: { type: \"string\" },\n quoteCcy: { type: \"string\" },\n // account extras\n archive: { type: \"boolean\", default: false },\n posMode: { type: \"string\" },\n ccy: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n transferType: { type: \"string\" },\n subAcct: { type: \"string\" },\n amt: { type: \"string\" },\n // swap/order extras\n autoCxl: { type: \"boolean\", default: false },\n clOrdId: { type: \"string\" },\n newPx: { type: \"string\" },\n // dca bot (contract only)\n initOrdAmt: { type: \"string\" },\n safetyOrdAmt: { type: \"string\" },\n maxSafetyOrds: { type: \"string\" },\n pxSteps: { type: \"string\" },\n pxStepsMult: { type: \"string\" },\n volMult: { type: \"string\" },\n tpPct: { type: \"string\" },\n slPct: { type: \"string\" },\n slMode: { type: \"string\" },\n allowReinvest: { type: \"string\" },\n triggerStrategy: { type: \"string\" },\n triggerPx: { type: \"string\" },\n cycleId: { type: \"string\" },\n // i18n\n lang: { type: \"string\" },\n // option\n uly: { type: \"string\" },\n expTime: { type: \"string\" },\n // batch\n action: { type: \"string\" },\n orders: { type: \"string\" },\n // earn\n rate: { type: \"string\" },\n // audit\n since: { type: \"string\" },\n tool: { type: \"string\" },\n // config profile\n force: { type: \"boolean\", default: false },\n // onchain-earn\n productId: { type: \"string\" },\n protocolType: { type: \"string\" },\n term: { type: \"string\" },\n tag: { type: \"string\" },\n allowEarlyRedeem: { type: \"boolean\", default: false },\n state: { type: \"string\" },\n // diagnostics\n verbose: { type: \"boolean\", default: false },\n} as const;\n\nexport function parseCli(argv: string[]): { values: CliValues; positionals: string[] } {\n // Pre-process --no-<flag> for boolean options (parseArgs doesn't support negation natively)\n const negated = new Set<string>();\n const filtered = argv.filter((arg) => {\n if (arg.startsWith(\"--no-\")) {\n const key = arg.slice(5);\n if (key in CLI_OPTIONS && (CLI_OPTIONS as Record<string, { type: string }>)[key].type === \"boolean\") {\n negated.add(key);\n return false;\n }\n }\n return true;\n });\n\n const { values, positionals } = parseArgs({\n args: filtered,\n options: CLI_OPTIONS,\n allowPositionals: true,\n });\n\n for (const key of negated) {\n (values as Record<string, unknown>)[key] = false;\n }\n\n return { values: values as CliValues, positionals };\n}\n","export function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function printTable(rows: Record<string, unknown>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(no data)\\n\");\n return;\n }\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => String(r[k] ?? \"\").length)),\n );\n const header = keys.map((k, i) => k.padEnd(widths[i])).join(\" \");\n const divider = widths.map((w) => \"-\".repeat(w)).join(\" \");\n process.stdout.write(header + \"\\n\" + divider + \"\\n\");\n for (const row of rows) {\n process.stdout.write(\n keys.map((k, i) => String(row[k] ?? \"\").padEnd(widths[i])).join(\" \") + \"\\n\",\n );\n }\n}\n\nexport function printKv(obj: Record<string, unknown>, indent = 0): void {\n const pad = \" \".repeat(indent);\n for (const [k, v] of Object.entries(obj)) {\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n process.stdout.write(`${pad}${k}:\\n`);\n printKv(v as Record<string, unknown>, indent + 2);\n } else {\n process.stdout.write(`${pad}${k.padEnd(20 - indent)} ${v}\\n`);\n }\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdMarketInstruments(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_instruments\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).slice(0, 50).map((t) => ({\n instId: t[\"instId\"],\n ctVal: t[\"ctVal\"],\n lotSz: t[\"lotSz\"],\n minSz: t[\"minSz\"],\n tickSz: t[\"tickSz\"],\n state: t[\"state\"],\n })),\n );\n}\n\nexport async function cmdMarketFundingRate(\n run: ToolRunner,\n instId: string,\n opts: { history: boolean; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_funding_rate\", { instId, history: opts.history, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n if (opts.history) {\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n realizedRate: r[\"realizedRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n })),\n );\n } else {\n const r = items?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n instId: r[\"instId\"],\n fundingRate: r[\"fundingRate\"],\n nextFundingRate: r[\"nextFundingRate\"],\n fundingTime: new Date(Number(r[\"fundingTime\"])).toLocaleString(),\n nextFundingTime: new Date(Number(r[\"nextFundingTime\"])).toLocaleString(),\n });\n }\n}\n\nexport async function cmdMarketMarkPrice(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_mark_price\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n instType: r[\"instType\"],\n markPx: r[\"markPx\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTrades(\n run: ToolRunner,\n instId: string,\n opts: { limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_trades\", { instId, limit: opts.limit });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n tradeId: t[\"tradeId\"],\n px: t[\"px\"],\n sz: t[\"sz\"],\n side: t[\"side\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexTicker(\n run: ToolRunner,\n opts: { instId?: string; quoteCcy?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_ticker\", { instId: opts.instId, quoteCcy: opts.quoteCcy });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n idxPx: t[\"idxPx\"],\n high24h: t[\"high24h\"],\n low24h: t[\"low24h\"],\n ts: new Date(Number(t[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketIndexCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_index_candles\", { instId, bar: opts.bar, limit: opts.limit, history: opts.history });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c,\n })),\n );\n}\n\nexport async function cmdMarketPriceLimit(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_price_limit\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n const r = items?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n instId: r[\"instId\"],\n buyLmt: r[\"buyLmt\"],\n sellLmt: r[\"sellLmt\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketOpenInterest(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_open_interest\", { instType: opts.instType, instId: opts.instId });\n const items = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(items);\n printTable(\n (items ?? []).map((r) => ({\n instId: r[\"instId\"],\n oi: r[\"oi\"],\n oiCcy: r[\"oiCcy\"],\n ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdMarketTicker(\n run: ToolRunner,\n instId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_ticker\", { instId });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n if (!items?.length) { process.stdout.write(\"No data\\n\"); return; }\n const t = items[0];\n printKv({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h change %\": t[\"sodUtc8\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n time: new Date(Number(t[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdMarketTickers(\n run: ToolRunner,\n instType: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_tickers\", { instType });\n const items = getData(result) as Record<string, unknown>[];\n if (json) return printJson(items);\n printTable(\n (items ?? []).map((t) => ({\n instId: t[\"instId\"],\n last: t[\"last\"],\n \"24h high\": t[\"high24h\"],\n \"24h low\": t[\"low24h\"],\n \"24h vol\": t[\"vol24h\"],\n })),\n );\n}\n\nexport async function cmdMarketOrderbook(\n run: ToolRunner,\n instId: string,\n sz: number | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"market_get_orderbook\", { instId, sz });\n const data = getData(result);\n if (json) return printJson(data);\n const book = (data as Record<string, unknown>[])[0];\n if (!book) { process.stdout.write(\"No data\\n\"); return; }\n const asks = (book[\"asks\"] as string[][]).slice(0, 5);\n const bids = (book[\"bids\"] as string[][]).slice(0, 5);\n process.stdout.write(\"Asks (price / size):\\n\");\n for (const [p, s] of asks.reverse()) process.stdout.write(` ${p.padStart(16)} ${s}\\n`);\n process.stdout.write(\"Bids (price / size):\\n\");\n for (const [p, s] of bids) process.stdout.write(` ${p.padStart(16)} ${s}\\n`);\n}\n\nexport async function cmdMarketCandles(\n run: ToolRunner,\n instId: string,\n opts: { bar?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"market_get_candles\", { instId, bar: opts.bar, limit: opts.limit });\n const candles = getData(result) as string[][];\n if (opts.json) return printJson(candles);\n printTable(\n (candles ?? []).map(([ts, o, h, l, c, vol]) => ({\n time: new Date(Number(ts)).toLocaleString(),\n open: o, high: h, low: l, close: c, vol,\n })),\n );\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdAccountBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const details = (data?.[0]?.[\"details\"] as Record<string, unknown>[]) ?? [];\n printTable(\n details\n .filter((d) => Number(d[\"eq\"]) > 0)\n .map((d) => ({\n currency: d[\"ccy\"],\n equity: d[\"eq\"],\n available: d[\"availEq\"],\n frozen: d[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountAssetBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_asset_balance\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? [])\n .filter((r) => Number(r[\"bal\"]) > 0)\n .map((r) => ({\n ccy: r[\"ccy\"],\n bal: r[\"bal\"],\n availBal: r[\"availBal\"],\n frozenBal: r[\"frozenBal\"],\n })),\n );\n}\n\nexport async function cmdAccountPositions(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions\", { instType: opts.instType, instId: opts.instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n instType: p[\"instType\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdAccountBills(\n run: ToolRunner,\n opts: { archive: boolean; instType?: string; ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const toolName = opts.archive ? \"account_get_bills_archive\" : \"account_get_bills\";\n const result = await run(toolName, { instType: opts.instType, ccy: opts.ccy, limit: opts.limit });\n const bills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(bills);\n printTable(\n (bills ?? []).map((b) => ({\n billId: b[\"billId\"],\n instId: b[\"instId\"],\n type: b[\"type\"],\n ccy: b[\"ccy\"],\n balChg: b[\"balChg\"],\n bal: b[\"bal\"],\n ts: new Date(Number(b[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountFees(\n run: ToolRunner,\n opts: { instType: string; instId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_trade_fee\", { instType: opts.instType, instId: opts.instId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const fee = data?.[0];\n if (!fee) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n level: fee[\"level\"],\n maker: fee[\"maker\"],\n taker: fee[\"taker\"],\n makerU: fee[\"makerU\"],\n takerU: fee[\"takerU\"],\n ts: new Date(Number(fee[\"ts\"])).toLocaleString(),\n });\n}\n\nexport async function cmdAccountConfig(\n run: ToolRunner,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_config\", {});\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const cfg = data?.[0];\n if (!cfg) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n uid: cfg[\"uid\"],\n acctLv: cfg[\"acctLv\"],\n posMode: cfg[\"posMode\"],\n autoLoan: cfg[\"autoLoan\"],\n greeksType: cfg[\"greeksType\"],\n level: cfg[\"level\"],\n levelTmp: cfg[\"levelTmp\"],\n });\n}\n\nexport async function cmdAccountSetPositionMode(\n run: ToolRunner,\n posMode: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_set_position_mode\", { posMode });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Position mode set: ${r?.[\"posMode\"]}\\n`);\n}\n\nexport async function cmdAccountMaxSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; px?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_size\", { instId: opts.instId, tdMode: opts.tdMode, px: opts.px });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({ instId: r[\"instId\"], maxBuy: r[\"maxBuy\"], maxSell: r[\"maxSell\"] });\n}\n\nexport async function cmdAccountMaxAvailSize(\n run: ToolRunner,\n opts: { instId: string; tdMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_max_avail_size\", { instId: opts.instId, tdMode: opts.tdMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n if (!r) { process.stdout.write(\"No data\\n\"); return; }\n printKv({ instId: r[\"instId\"], availBuy: r[\"availBuy\"], availSell: r[\"availSell\"] });\n}\n\nexport async function cmdAccountMaxWithdrawal(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"account_get_max_withdrawal\", { ccy });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n ccy: r[\"ccy\"],\n maxWd: r[\"maxWd\"],\n maxWdEx: r[\"maxWdEx\"],\n })),\n );\n}\n\nexport async function cmdAccountPositionsHistory(\n run: ToolRunner,\n opts: { instType?: string; instId?: string; limit?: number; json: boolean },\n): Promise<void> {\n const result = await run(\"account_get_positions_history\", { instType: opts.instType, instId: opts.instId, limit: opts.limit });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((p) => ({\n instId: p[\"instId\"],\n direction: p[\"direction\"],\n openAvgPx: p[\"openAvgPx\"],\n closeAvgPx: p[\"closeAvgPx\"],\n realizedPnl: p[\"realizedPnl\"],\n uTime: new Date(Number(p[\"uTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdAccountTransfer(\n run: ToolRunner,\n opts: {\n ccy: string;\n amt: string;\n from: string;\n to: string;\n transferType?: string;\n subAcct?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"account_transfer\", {\n ccy: opts.ccy,\n amt: opts.amt,\n from: opts.from,\n to: opts.to,\n type: opts.transferType,\n subAcct: opts.subAcct,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Transfer: ${r?.[\"transId\"]} (${r?.[\"ccy\"]} ${r?.[\"amt\"]})\\n`);\n}\n\ninterface LogEntry {\n timestamp: string;\n tool: string;\n level: string;\n durationMs?: number;\n error?: boolean;\n}\n\nfunction readAuditLogs(logDir: string, days = 7): LogEntry[] {\n const entries: LogEntry[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setUTCDate(now.getUTCDate() - i);\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n const filePath = path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`);\n let content: string;\n try { content = fs.readFileSync(filePath, \"utf8\"); } catch { continue; }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try { entries.push(JSON.parse(trimmed) as LogEntry); } catch { /* skip */ }\n }\n }\n return entries;\n}\n\nexport function cmdAccountAudit(\n opts: { limit?: string; tool?: string; since?: string; json: boolean },\n): void {\n const logDir = path.join(os.homedir(), \".okx\", \"logs\");\n const limit = Math.min(Number(opts.limit) || 20, 100);\n\n let entries = readAuditLogs(logDir);\n\n if (opts.tool) entries = entries.filter((e) => e.tool === opts.tool);\n if (opts.since) {\n const sinceTime = new Date(opts.since).getTime();\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= sinceTime);\n }\n\n entries.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n entries = entries.slice(0, limit);\n\n if (opts.json) return printJson(entries);\n if (!entries.length) { process.stdout.write(\"No audit log entries\\n\"); return; }\n printTable(\n entries.map((e) => ({\n timestamp: e.timestamp,\n tool: e.tool,\n level: e.level,\n duration: e.durationMs != null ? `${e.durationMs}ms` : \"-\",\n status: e.error ? \"ERROR\" : \"OK\",\n })),\n );\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdSpotOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n filled: o[\"fillSz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n px?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n px: opts.px,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSpotCancel(\n run: ToolRunner,\n instId: string,\n ordId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"spot_cancel_order\", { instId, ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSpotAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode?: string;\n side: string;\n ordType: string;\n sz: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode ?? \"cash\",\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(\n `Algo order placed: ${order?.[\"algoId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSpotAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order amended: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSpotAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"spot_cancel_algo_order\", { instId, algoId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order cancelled: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSpotGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSpotAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Order amended: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSpotAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { process.stdout.write(\"No algo orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSpotFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"spot_get_fills\", { instId: opts.instId, ordId: opts.ordId });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSpotBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n process.stderr.write(\"Error: --orders must be a valid JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n process.stderr.write(\"Error: --orders must be a non-empty JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"spot_batch_orders\",\n amend: \"spot_batch_amend\",\n cancel: \"spot_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n process.stderr.write(`Error: --action must be one of: place, amend, cancel\\n`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"spot_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n for (const r of data ?? []) {\n process.stdout.write(`${r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\"}: ${r[\"sCode\"] === \"0\" ? \"OK\" : r[\"sMsg\"]}\\n`);\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdSwapPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n size: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n uplRatio: p[\"uplRatio\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\"; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n px?: string;\n tdMode: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n posSide: opts.posSide,\n px: opts.px,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSwapCancel(\n run: ToolRunner,\n instId: string,\n ordId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_cancel_order\", { instId, ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSwapAlgoPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n posSide?: string;\n tdMode: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_algo_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n posSide: opts.posSide,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(\n `Algo order placed: ${order?.[\"algoId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n algoId: string;\n newSz?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_amend_algo_order\", {\n instId: opts.instId,\n algoId: opts.algoId,\n newSz: opts.newSz,\n newTpTriggerPx: opts.newTpTriggerPx,\n newTpOrdPx: opts.newTpOrdPx,\n newSlTriggerPx: opts.newSlTriggerPx,\n newSlOrdPx: opts.newSlOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order amended: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoTrailPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n sz: string;\n callbackRatio?: string;\n callbackSpread?: string;\n activePx?: string;\n posSide?: string;\n tdMode: string;\n reduceOnly?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"swap_place_move_stop_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n sz: opts.sz,\n callbackRatio: opts.callbackRatio,\n callbackSpread: opts.callbackSpread,\n activePx: opts.activePx,\n posSide: opts.posSide,\n reduceOnly: opts.reduceOnly,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(\n `Trailing stop placed: ${order?.[\"algoId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoCancel(\n run: ToolRunner,\n instId: string,\n algoId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"swap_cancel_algo_orders\", { instId, algoId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Algo order cancelled: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdSwapAlgoOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"pending\" | \"history\"; ordType?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_algo_orders\", {\n instId: opts.instId,\n status: opts.status,\n ordType: opts.ordType,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n if (!(orders ?? []).length) { process.stdout.write(\"No algo orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"ordType\"],\n side: o[\"side\"],\n sz: o[\"sz\"],\n tpTrigger: o[\"tpTriggerPx\"],\n slTrigger: o[\"slTriggerPx\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdSwapFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdSwapGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_order\", { instId: opts.instId, ordId: opts.ordId, clOrdId: opts.clOrdId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdSwapClose(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; posSide?: string; autoCxl?: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_close_position\", {\n instId: opts.instId,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n autoCxl: opts.autoCxl,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Position closed: ${r?.[\"instId\"]} ${r?.[\"posSide\"] ?? \"\"}\\n`);\n}\n\nexport async function cmdSwapGetLeverage(\n run: ToolRunner,\n opts: { instId: string; mgnMode: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_get_leverage\", { instId: opts.instId, mgnMode: opts.mgnMode });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n printTable(\n (data ?? []).map((r) => ({\n instId: r[\"instId\"],\n mgnMode: r[\"mgnMode\"],\n posSide: r[\"posSide\"],\n lever: r[\"lever\"],\n })),\n );\n}\n\nexport async function cmdSwapAmend(\n run: ToolRunner,\n opts: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n newSz?: string;\n newPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"spot_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Order amended: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdSwapSetLeverage(\n run: ToolRunner,\n opts: { instId: string; lever: string; mgnMode: string; posSide?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"swap_set_leverage\", {\n instId: opts.instId,\n lever: opts.lever,\n mgnMode: opts.mgnMode,\n posSide: opts.posSide,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Leverage set: ${r?.[\"lever\"]}x ${r?.[\"instId\"]}\\n`);\n}\n\nexport async function cmdSwapBatch(\n run: ToolRunner,\n opts: { action: string; orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n process.stderr.write(\"Error: --orders must be a valid JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n process.stderr.write(\"Error: --orders must be a non-empty JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n\n const toolMap: Record<string, string> = {\n place: \"swap_batch_orders\",\n amend: \"swap_batch_amend\",\n cancel: \"swap_batch_cancel\",\n };\n const tool = toolMap[opts.action];\n if (!tool) {\n process.stderr.write(`Error: --action must be one of: place, amend, cancel\\n`);\n process.exitCode = 1;\n return;\n }\n\n const result = await run(tool, tool === \"swap_batch_orders\" ? { action: opts.action, orders: parsed } : { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n for (const r of data ?? []) {\n process.stdout.write(`${r[\"ordId\"] ?? r[\"clOrdId\"] ?? \"?\"}: ${r[\"sCode\"] === \"0\" ? \"OK\" : r[\"sMsg\"]}\\n`);\n }\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdFuturesOrders(\n run: ToolRunner,\n opts: { instId?: string; status: \"open\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_orders\", { instId: opts.instId, status: opts.status });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n type: o[\"ordType\"],\n price: o[\"px\"],\n size: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdFuturesPositions(\n run: ToolRunner,\n instId: string | undefined,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_get_positions\", { instId });\n const positions = getData(result) as Record<string, unknown>[];\n if (json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n side: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n lever: p[\"lever\"],\n })),\n );\n}\n\nexport async function cmdFuturesFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_fills\", { instId: opts.instId, ordId: opts.ordId, archive: opts.archive });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdFuturesPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n side: string;\n ordType: string;\n sz: string;\n tdMode: string;\n posSide?: string;\n px?: string;\n reduceOnly?: boolean;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"futures_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n posSide: opts.posSide,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n tpTriggerPx: opts.tpTriggerPx,\n tpOrdPx: opts.tpOrdPx,\n slTriggerPx: opts.slTriggerPx,\n slOrdPx: opts.slOrdPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdFuturesCancel(\n run: ToolRunner,\n instId: string,\n ordId: string,\n json: boolean,\n): Promise<void> {\n const result = await run(\"futures_cancel_order\", { instId, ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdFuturesGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"futures_get_order\", { instId: opts.instId, ordId: opts.ordId });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n posSide: o[\"posSide\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printKv, printTable } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdOptionOrders(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; status: \"live\" | \"history\" | \"archive\"; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_orders\", {\n instId: opts.instId,\n uly: opts.uly,\n status: opts.status,\n });\n const orders = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(orders);\n printTable(\n (orders ?? []).map((o) => ({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n state: o[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGet(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const o = data?.[0];\n if (!o) { process.stdout.write(\"No data\\n\"); return; }\n printKv({\n ordId: o[\"ordId\"],\n instId: o[\"instId\"],\n side: o[\"side\"],\n ordType: o[\"ordType\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillSz: o[\"fillSz\"],\n avgPx: o[\"avgPx\"],\n state: o[\"state\"],\n cTime: new Date(Number(o[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdOptionPositions(\n run: ToolRunner,\n opts: { instId?: string; uly?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_positions\", {\n instId: opts.instId,\n uly: opts.uly,\n });\n const positions = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(positions);\n const open = (positions ?? []).filter((p) => Number(p[\"pos\"]) !== 0);\n if (!open.length) { process.stdout.write(\"No open positions\\n\"); return; }\n printTable(\n open.map((p) => ({\n instId: p[\"instId\"],\n posSide: p[\"posSide\"],\n pos: p[\"pos\"],\n avgPx: p[\"avgPx\"],\n upl: p[\"upl\"],\n delta: p[\"deltaPA\"],\n gamma: p[\"gammaPA\"],\n theta: p[\"thetaPA\"],\n vega: p[\"vegaPA\"],\n })),\n );\n}\n\nexport async function cmdOptionFills(\n run: ToolRunner,\n opts: { instId?: string; ordId?: string; archive: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_fills\", {\n instId: opts.instId,\n ordId: opts.ordId,\n archive: opts.archive,\n });\n const fills = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(fills);\n printTable(\n (fills ?? []).map((f) => ({\n instId: f[\"instId\"],\n side: f[\"side\"],\n fillPx: f[\"fillPx\"],\n fillSz: f[\"fillSz\"],\n fee: f[\"fee\"],\n ts: new Date(Number(f[\"ts\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdOptionInstruments(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_instruments\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const instruments = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(instruments);\n printTable(\n (instruments ?? []).map((i) => ({\n instId: i[\"instId\"],\n uly: i[\"uly\"],\n expTime: i[\"expTime\"],\n stk: i[\"stk\"],\n optType: i[\"optType\"],\n state: i[\"state\"],\n })),\n );\n}\n\nexport async function cmdOptionGreeks(\n run: ToolRunner,\n opts: { uly: string; expTime?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_get_greeks\", {\n uly: opts.uly,\n expTime: opts.expTime,\n });\n const greeks = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(greeks);\n printTable(\n (greeks ?? []).map((g) => ({\n instId: g[\"instId\"],\n delta: g[\"deltaBS\"],\n gamma: g[\"gammaBS\"],\n theta: g[\"thetaBS\"],\n vega: g[\"vegaBS\"],\n iv: g[\"markVol\"],\n markPx: g[\"markPx\"],\n })),\n );\n}\n\nexport async function cmdOptionPlace(\n run: ToolRunner,\n opts: {\n instId: string;\n tdMode: string;\n side: string;\n ordType: string;\n sz: string;\n px?: string;\n reduceOnly?: boolean;\n clOrdId?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"option_place_order\", {\n instId: opts.instId,\n tdMode: opts.tdMode,\n side: opts.side,\n ordType: opts.ordType,\n sz: opts.sz,\n px: opts.px,\n reduceOnly: opts.reduceOnly,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const order = data?.[0];\n process.stdout.write(`Order placed: ${order?.[\"ordId\"]} (${order?.[\"sCode\"] === \"0\" ? \"OK\" : order?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdOptionCancel(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_cancel_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Cancelled: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdOptionAmend(\n run: ToolRunner,\n opts: { instId: string; ordId?: string; clOrdId?: string; newSz?: string; newPx?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"option_amend_order\", {\n instId: opts.instId,\n ordId: opts.ordId,\n clOrdId: opts.clOrdId,\n newSz: opts.newSz,\n newPx: opts.newPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(`Amended: ${r?.[\"ordId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`);\n}\n\nexport async function cmdOptionBatchCancel(\n run: ToolRunner,\n opts: { orders: string; json: boolean },\n): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.orders);\n } catch {\n process.stderr.write(\"Error: --orders must be a valid JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n if (!Array.isArray(parsed) || parsed.length === 0) {\n process.stderr.write(\"Error: --orders must be a non-empty JSON array\\n\");\n process.exitCode = 1;\n return;\n }\n const result = await run(\"option_batch_cancel\", { orders: parsed });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n for (const r of data ?? []) {\n process.stdout.write(`${r[\"ordId\"]}: ${r[\"sCode\"] === \"0\" ? \"OK\" : r[\"sMsg\"]}\\n`);\n }\n}\n","import { writeFullConfig } from \"@agent-tradekit/core\";\nimport type { OkxTomlConfig } from \"@agent-tradekit/core\";\n\nexport function writeCliConfig(config: OkxTomlConfig): void {\n writeFullConfig(config);\n}\n","import { readFullConfig, configFilePath, OKX_SITES, SITE_IDS, tomlStringify } from \"@agent-tradekit/core\";\nimport type { SiteId } from \"@agent-tradekit/core\";\nimport { writeCliConfig } from \"../config/toml.js\";\nimport { printJson, printKv } from \"../formatter.js\";\nimport type { OkxTomlConfig, OkxProfile } from \"@agent-tradekit/core\";\nimport { createInterface } from \"node:readline\";\nimport { spawnSync } from \"node:child_process\";\n\nexport type Lang = \"en\" | \"zh\";\n\nconst messages = {\n en: {\n title: \"OKX Trade CLI — Configuration Wizard\",\n selectSite: \"Select site:\",\n sitePrompt: \"Site (1/2/3, default: 1): \",\n demoPrompt: \"Use demo trading? (Y/n) \",\n hintDemo: \"The page will redirect to demo trading API management\",\n hintLive: \"The page will redirect to live trading API management\",\n createApiKey: (url: string) => `\\nGo to ${url} to create an API Key (trade permission required)\\n`,\n hint: (h: string) => `Tip: ${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile name (default: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" already exists. Overwrite? (y/N) `,\n cancelled: \"Cancelled.\",\n emptyApiKey: \"Error: API Key cannot be empty\",\n emptySecretKey: \"Error: Secret Key cannot be empty\",\n emptyPassphrase: \"Error: Passphrase cannot be empty\",\n demoSelected: \"Demo trading mode selected. Switch to live anytime via okx config set.\",\n saved: (p: string) => `\\nConfig saved to ${p}\\n`,\n defaultProfile: (name: string) => `Default profile set to: ${name}\\n`,\n usage: \"Usage: okx account balance\\n\",\n writeFailed: (msg: string) => `Failed to write config: ${msg}\\n`,\n permissionDenied: (p: string) => `Permission denied. Check read/write access for ${p} and its parent directory.\\n`,\n manualWrite: (p: string) => `Please manually write the following to ${p}:\\n\\n`,\n },\n zh: {\n title: \"OKX Trade CLI — 配置向导\",\n selectSite: \"请选择站点:\",\n sitePrompt: \"站点 (1/2/3, 默认: 1): \",\n demoPrompt: \"使用模拟盘?(Y/n) \",\n hintDemo: \"页面会自动跳转到模拟盘 API 管理\",\n hintLive: \"页面会自动跳转到实盘 API 管理\",\n createApiKey: (url: string) => `\\n请前往 ${url} 创建 API Key(需要 trade 权限)\\n`,\n hint: (h: string) => `提示:${h}\\n\\n`,\n profilePrompt: (name: string) => `Profile 名称 (默认: ${name}): `,\n profileExists: (name: string) => `Profile \"${name}\" 已存在,是否覆盖?(y/N) `,\n cancelled: \"已取消。\",\n emptyApiKey: \"错误: API Key 不能为空\",\n emptySecretKey: \"错误: Secret Key 不能为空\",\n emptyPassphrase: \"错误: Passphrase 不能为空\",\n demoSelected: \"已选择模拟盘模式,可随时通过 okx config set 切换为实盘。\",\n saved: (p: string) => `\\n配置已保存到 ${p}\\n`,\n defaultProfile: (name: string) => `已设为默认 profile: ${name}\\n`,\n usage: \"使用方式: okx account balance\\n\",\n writeFailed: (msg: string) => `写入配置文件失败: ${msg}\\n`,\n permissionDenied: (p: string) => `权限不足,请检查 ${p} 及其父目录的读写权限。\\n`,\n manualWrite: (p: string) => `请手动将以下内容写入 ${p}:\\n\\n`,\n },\n} as const;\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((resolve) => rl.question(question, resolve));\n}\n\nexport function cmdConfigShow(json: boolean): void {\n const config = readFullConfig();\n if (json) return printJson(config);\n process.stdout.write(`Config: ${configFilePath()}\\n\\n`);\n process.stdout.write(`default_profile: ${config.default_profile ?? \"(not set)\"}\\n\\n`);\n for (const [name, profile] of Object.entries(config.profiles)) {\n process.stdout.write(`[${name}]\\n`);\n printKv({\n api_key: profile.api_key ? maskSecret(profile.api_key) : \"(not set)\",\n demo: profile.demo ?? false,\n base_url: profile.base_url ?? \"(default)\",\n }, 2);\n process.stdout.write(\"\\n\");\n }\n}\n\nexport function cmdConfigSet(key: string, value: string): void {\n const config = readFullConfig();\n if (key === \"default_profile\") {\n config.default_profile = value;\n writeCliConfig(config);\n process.stdout.write(`default_profile set to \"${value}\"\\n`);\n } else {\n process.stderr.write(`Unknown config key: ${key}\\n`);\n process.exitCode = 1;\n }\n}\n\nexport type SiteKey = SiteId;\n\n/** Maps raw user input (\"1\"/\"2\"/\"3\", site names like \"global\"/\"eea\"/\"us\", or empty) to a site key. */\nexport function parseSiteKey(raw: string): SiteKey {\n const lower = raw.toLowerCase();\n if (lower === \"eea\" || raw === \"2\") return \"eea\";\n if (lower === \"us\" || raw === \"3\") return \"us\";\n if (lower === \"global\" || raw === \"1\") return \"global\";\n return \"global\";\n}\n\n/** Infers site key from a base_url value (for backward-compat with old profiles lacking a site field). */\nexport function inferSiteFromBaseUrl(baseUrl?: string): SiteKey {\n if (!baseUrl) return \"global\";\n for (const id of SITE_IDS) {\n const site = OKX_SITES[id];\n if (baseUrl === site.apiBaseUrl || baseUrl === site.webUrl) return id;\n }\n return \"global\";\n}\n\n/** Masks a secret value, showing only the last 4 characters. */\nexport function maskSecret(value?: string): string {\n if (!value || value.length < 4) return \"****\";\n return \"***\" + value.slice(-4);\n}\n\n/** Builds the targeted API creation URL for the given site and trading mode. */\nexport function buildApiUrl(siteKey: SiteKey, demo: boolean): string {\n const query = demo ? \"?go-demo-trading=1\" : \"?go-live-trading=1\";\n return `${OKX_SITES[siteKey].webUrl}/account/my-api${query}`;\n}\n\n/** Builds a profile entry, omitting base_url for the global site. */\nexport function buildProfileEntry(\n siteKey: SiteKey,\n apiKey: string,\n secretKey: string,\n passphrase: string,\n demo: boolean,\n): OkxProfile {\n const entry: OkxProfile = { api_key: apiKey, secret_key: secretKey, passphrase, demo };\n if (siteKey !== \"global\") {\n entry.base_url = OKX_SITES[siteKey].webUrl;\n }\n return entry;\n}\n\nexport async function cmdConfigInit(lang: Lang = \"en\"): Promise<void> {\n const t = messages[lang];\n process.stdout.write(`${t.title}\\n\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n // Step 1: site selection\n process.stdout.write(`${t.selectSite}\\n`);\n process.stdout.write(\" 1) Global (www.okx.com) [default]\\n\");\n process.stdout.write(\" 2) EEA (my.okx.com)\\n\");\n process.stdout.write(\" 3) US (app.okx.com)\\n\");\n const siteRaw = (await prompt(rl, t.sitePrompt)).trim();\n const siteKey = parseSiteKey(siteRaw);\n\n // Step 2: demo / live selection — must happen before URL construction\n const demoRaw = (await prompt(rl, t.demoPrompt)).trim().toLowerCase();\n const demo = demoRaw !== \"n\";\n\n // Step 3: open targeted API creation page\n const apiUrl = buildApiUrl(siteKey, demo);\n const hintText = demo ? t.hintDemo : t.hintLive;\n process.stdout.write(t.createApiKey(apiUrl));\n process.stdout.write(t.hint(hintText));\n\n // Try to open the URL; silently ignore failures\n try {\n const opener = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n spawnSync(opener, [apiUrl], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n } catch {\n // silently ignore\n }\n\n const defaultProfileName = demo ? \"okx-demo\" : \"okx-prod\";\n const profileNameRaw = await prompt(rl, t.profilePrompt(defaultProfileName));\n const profileName = profileNameRaw.trim() || defaultProfileName;\n\n // Check if profile already exists\n const config = readFullConfig();\n if (config.profiles[profileName]) {\n const overwrite = (await prompt(rl, t.profileExists(profileName))).trim().toLowerCase();\n if (overwrite !== \"y\") {\n process.stdout.write(`${t.cancelled}\\n`);\n return;\n }\n }\n\n const apiKey = (await prompt(rl, \"API Key: \")).trim();\n if (!apiKey) {\n process.stderr.write(`${t.emptyApiKey}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const secretKey = (await prompt(rl, \"Secret Key: \")).trim();\n if (!secretKey) {\n process.stderr.write(`${t.emptySecretKey}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const passphrase = (await prompt(rl, \"Passphrase: \")).trim();\n if (!passphrase) {\n process.stderr.write(`${t.emptyPassphrase}\\n`);\n process.exitCode = 1;\n return;\n }\n\n if (demo) {\n process.stdout.write(`${t.demoSelected}\\n`);\n }\n\n const profileEntry = buildProfileEntry(siteKey, apiKey, secretKey, passphrase, demo);\n config.profiles[profileName] = profileEntry;\n\n // Auto-set as default_profile\n if (!config.default_profile || config.default_profile !== profileName) {\n config.default_profile = profileName;\n }\n\n const configPath = configFilePath();\n try {\n writeCliConfig(config);\n process.stdout.write(t.saved(configPath));\n process.stdout.write(t.defaultProfile(profileName));\n process.stdout.write(t.usage);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const isPermission = err instanceof Error && \"code\" in err && (err.code === \"EACCES\" || err.code === \"EPERM\");\n process.stderr.write(t.writeFailed(message));\n if (isPermission) {\n process.stderr.write(t.permissionDenied(configPath));\n }\n process.stderr.write(t.manualWrite(configPath));\n process.stdout.write(tomlStringify(config as unknown as Record<string, unknown>) + \"\\n\");\n process.exitCode = 1;\n }\n } finally {\n rl.close();\n }\n}\n\n/**\n * Non-interactive profile creation / update.\n * Usage: okx config add-profile AK=xxx SK=yyy PP=zzz [site=global|eea|us] [demo=true|false] [name=xxx] [--force]\n */\nexport function cmdConfigAddProfile(kvPairs: string[], force: boolean): void {\n // Parse key=value pairs (split on first '=' only to handle values containing '=')\n const params: Record<string, string> = {};\n for (const pair of kvPairs) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1);\n params[key.toUpperCase()] = value;\n }\n\n const ak = params[\"AK\"];\n const sk = params[\"SK\"];\n const pp = params[\"PP\"];\n\n // Validate required fields\n const missing: string[] = [];\n if (!ak) missing.push(\"AK\");\n if (!sk) missing.push(\"SK\");\n if (!pp) missing.push(\"PP\");\n if (missing.length > 0) {\n process.stderr.write(`Error: missing required parameter(s): ${missing.join(\", \")}\\n`);\n process.stderr.write(\"Usage: okx config add-profile AK=<key> SK=<secret> PP=<passphrase> [site=global|eea|us] [demo=true|false] [name=<name>] [--force]\\n\");\n process.exitCode = 1;\n return;\n }\n\n const siteKey = parseSiteKey(params[\"SITE\"] ?? \"\");\n const demo = params[\"DEMO\"] !== undefined ? params[\"DEMO\"].toLowerCase() !== \"false\" : true;\n const defaultName = demo ? \"demo\" : \"live\";\n const profileName = params[\"NAME\"] ?? defaultName;\n\n const config = readFullConfig();\n\n // Check for conflict\n if (config.profiles[profileName] && !force) {\n process.stderr.write(`Error: profile \"${profileName}\" already exists. Use --force to overwrite.\\n`);\n process.exitCode = 1;\n return;\n }\n\n // Build profile entry and set site field\n const entry = buildProfileEntry(siteKey, ak, sk, pp, demo);\n entry.site = siteKey;\n config.profiles[profileName] = entry;\n config.default_profile = profileName;\n\n writeCliConfig(config);\n process.stdout.write(`Profile \"${profileName}\" saved to ${configFilePath()}\\n`);\n process.stdout.write(`Default profile set to: ${profileName}\\n`);\n}\n\n/**\n * Lists all profiles, masking sensitive fields.\n * Default profile is marked with *.\n */\nexport function cmdConfigListProfile(): void {\n const config = readFullConfig();\n const entries = Object.entries(config.profiles);\n if (entries.length === 0) {\n process.stdout.write(\"No profiles found. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\\n\");\n return;\n }\n process.stdout.write(`Config: ${configFilePath()}\\n\\n`);\n for (const [name, profile] of entries) {\n const isDefault = name === config.default_profile;\n const marker = isDefault ? \" *\" : \"\";\n const site = profile.site ?? inferSiteFromBaseUrl(profile.base_url);\n const mode = profile.demo !== false ? \"demo (模拟盘)\" : \"live (实盘)\";\n process.stdout.write(`[${name}]${marker}\\n`);\n process.stdout.write(` api_key: ${maskSecret(profile.api_key)}\\n`);\n process.stdout.write(` secret_key: ${maskSecret(profile.secret_key)}\\n`);\n process.stdout.write(` passphrase: ${maskSecret(profile.passphrase)}\\n`);\n process.stdout.write(` site: ${site}\\n`);\n process.stdout.write(` mode: ${mode}\\n`);\n process.stdout.write(\"\\n\");\n }\n}\n\n/**\n * Switches the default profile.\n * Usage: okx config use <profile-name>\n */\nexport function cmdConfigUse(profileName: string): void {\n if (!profileName) {\n process.stderr.write(\"Error: profile name is required.\\nUsage: okx config use <profile-name>\\n\");\n process.exitCode = 1;\n return;\n }\n\n const config = readFullConfig();\n const available = Object.keys(config.profiles);\n\n if (!config.profiles[profileName]) {\n process.stderr.write(`Error: profile \"${profileName}\" does not exist.\\n`);\n if (available.length > 0) {\n process.stderr.write(`Available profiles: ${available.join(\", \")}\\n`);\n } else {\n process.stderr.write(\"No profiles configured. Run: okx config add-profile AK=<key> SK=<secret> PP=<passphrase>\\n\");\n }\n process.exitCode = 1;\n return;\n }\n\n config.default_profile = profileName;\n writeCliConfig(config);\n process.stdout.write(`Default profile set to: \"${profileName}\"\\n`);\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printTable, printKv } from \"../formatter.js\";\n\nfunction extractData(result: unknown): Record<string, unknown>[] {\n if (result && typeof result === \"object\") {\n const data = (result as Record<string, unknown>)[\"data\"];\n if (Array.isArray(data)) return data as Record<string, unknown>[];\n }\n return [];\n}\n\nfunction printDataList(\n data: Record<string, unknown>[],\n json: boolean,\n emptyMsg: string,\n mapper: (r: Record<string, unknown>) => Record<string, unknown>,\n): void {\n if (json) { printJson(data); return; }\n if (!data.length) { process.stdout.write(emptyMsg + \"\\n\"); return; }\n printTable(data.map(mapper));\n}\n\nexport async function cmdEarnSavingsBalance(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const data = extractData(await run(\"earn_get_savings_balance\", { ccy }));\n printDataList(data, json, \"No savings balance\", (r) => ({\n ccy: r[\"ccy\"], amt: r[\"amt\"], earnings: r[\"earnings\"],\n rate: r[\"rate\"], loanAmt: r[\"loanAmt\"], pendingAmt: r[\"pendingAmt\"],\n }));\n}\n\nexport async function cmdEarnSavingsPurchase(\n run: ToolRunner,\n opts: { ccy: string; amt: string; rate?: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_savings_purchase\", { ccy: opts.ccy, amt: opts.amt, rate: opts.rate }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { process.stdout.write(\"No response data\\n\"); return; }\n printKv({ ccy: r[\"ccy\"], amt: r[\"amt\"], side: r[\"side\"], rate: r[\"rate\"] });\n}\n\nexport async function cmdEarnSavingsRedeem(\n run: ToolRunner,\n opts: { ccy: string; amt: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_savings_redeem\", { ccy: opts.ccy, amt: opts.amt }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n if (!r) { process.stdout.write(\"No response data\\n\"); return; }\n printKv({ ccy: r[\"ccy\"], amt: r[\"amt\"], side: r[\"side\"] });\n}\n\nexport async function cmdEarnSetLendingRate(\n run: ToolRunner,\n opts: { ccy: string; rate: string; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_set_lending_rate\", { ccy: opts.ccy, rate: opts.rate }));\n if (opts.json) { printJson(data); return; }\n const r = data[0];\n process.stdout.write(`Lending rate set: ${r?.[\"ccy\"]} → ${r?.[\"rate\"]}\\n`);\n}\n\nexport async function cmdEarnLendingHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_lending_history\", { ccy: opts.ccy, limit: opts.limit }));\n printDataList(data, opts.json, \"No lending history\", (r) => ({\n ccy: r[\"ccy\"], amt: r[\"amt\"], earnings: r[\"earnings\"],\n rate: r[\"rate\"], ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n}\n\nexport async function cmdEarnLendingRateSummary(\n run: ToolRunner,\n ccy: string | undefined,\n json: boolean,\n): Promise<void> {\n const data = extractData(await run(\"earn_get_lending_rate_summary\", { ccy }));\n printDataList(data, json, \"No rate summary data\", (r) => ({\n ccy: r[\"ccy\"], avgRate: r[\"avgRate\"], estRate: r[\"estRate\"], avgAmt: r[\"avgAmt\"],\n }));\n}\n\nexport async function cmdEarnLendingRateHistory(\n run: ToolRunner,\n opts: { ccy?: string; limit?: number; json: boolean },\n): Promise<void> {\n const data = extractData(await run(\"earn_get_lending_rate_history\", { ccy: opts.ccy, limit: opts.limit }));\n printDataList(data, opts.json, \"No rate history data\", (r) => ({\n ccy: r[\"ccy\"], lendingRate: r[\"lendingRate\"],\n rate: r[\"rate\"], ts: new Date(Number(r[\"ts\"])).toLocaleString(),\n }));\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport { printJson, printTable, printKv } from \"../formatter.js\";\n\nfunction getData(result: unknown): unknown {\n return (result as Record<string, unknown>).data;\n}\n\nexport async function cmdGridOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n instId?: string;\n algoId?: string;\n status: \"active\" | \"history\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_orders\", {\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n algoId: opts.algoId,\n status: opts.status,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No grid bots\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n type: o[\"algoOrdType\"],\n state: o[\"state\"],\n pnl: o[\"pnlRatio\"],\n gridNum: o[\"gridNum\"],\n maxPx: o[\"maxPx\"],\n minPx: o[\"minPx\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdGridDetails(\n run: ToolRunner,\n opts: { algoOrdType: string; algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"grid_get_order_details\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { process.stdout.write(\"Bot not found\\n\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n instId: detail[\"instId\"],\n type: detail[\"algoOrdType\"],\n state: detail[\"state\"],\n maxPx: detail[\"maxPx\"],\n minPx: detail[\"minPx\"],\n gridNum: detail[\"gridNum\"],\n runType: detail[\"runType\"] === \"1\" ? \"arithmetic\" : \"geometric\",\n pnl: detail[\"pnl\"],\n pnlRatio: detail[\"pnlRatio\"],\n investAmt: detail[\"investAmt\"],\n totalAnnRate: detail[\"totalAnnRate\"],\n createdAt: new Date(Number(detail[\"cTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdGridSubOrders(\n run: ToolRunner,\n opts: {\n algoOrdType: string;\n algoId: string;\n type: \"filled\" | \"live\";\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_get_sub_orders\", {\n algoOrdType: opts.algoOrdType,\n algoId: opts.algoId,\n type: opts.type,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No sub-orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n ordId: o[\"ordId\"],\n side: o[\"side\"],\n px: o[\"px\"],\n sz: o[\"sz\"],\n fillPx: o[\"fillPx\"],\n fillSz: o[\"fillSz\"],\n state: o[\"state\"],\n fee: o[\"fee\"],\n })),\n );\n}\n\nexport async function cmdGridCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n algoOrdType: string;\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType?: string;\n quoteSz?: string;\n baseSz?: string;\n direction?: string;\n lever?: string;\n sz?: string;\n basePos?: boolean;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_create_order\", {\n instId: opts.instId,\n algoOrdType: opts.algoOrdType,\n maxPx: opts.maxPx,\n minPx: opts.minPx,\n gridNum: opts.gridNum,\n runType: opts.runType,\n quoteSz: opts.quoteSz,\n baseSz: opts.baseSz,\n direction: opts.direction,\n lever: opts.lever,\n sz: opts.sz,\n basePos: opts.basePos,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Grid bot created: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdGridStop(\n run: ToolRunner,\n opts: {\n algoId: string;\n algoOrdType: string;\n instId: string;\n stopType?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"grid_stop_order\", {\n algoId: opts.algoId,\n algoOrdType: opts.algoOrdType,\n instId: opts.instId,\n stopType: opts.stopType,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `Grid bot stopped: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// DCA (Contract) commands\n// ---------------------------------------------------------------------------\n\nexport async function cmdDcaCreate(\n run: ToolRunner,\n opts: {\n instId: string;\n lever: string;\n direction: string;\n initOrdAmt: string;\n maxSafetyOrds: string;\n tpPct: string;\n safetyOrdAmt?: string;\n pxSteps?: string;\n pxStepsMult?: string;\n volMult?: string;\n slPct?: string;\n slMode?: string;\n allowReinvest?: string;\n triggerStrategy?: string;\n triggerPx?: string;\n json: boolean;\n },\n): Promise<void> {\n const result = await run(\"dca_create_order\", {\n instId: opts.instId,\n lever: opts.lever,\n direction: opts.direction,\n initOrdAmt: opts.initOrdAmt,\n maxSafetyOrds: opts.maxSafetyOrds,\n tpPct: opts.tpPct,\n safetyOrdAmt: opts.safetyOrdAmt,\n pxSteps: opts.pxSteps,\n pxStepsMult: opts.pxStepsMult,\n volMult: opts.volMult,\n slPct: opts.slPct,\n slMode: opts.slMode,\n allowReinvest: opts.allowReinvest,\n triggerStrategy: opts.triggerStrategy,\n triggerPx: opts.triggerPx,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `DCA bot created: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdDcaStop(\n run: ToolRunner,\n opts: { algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_stop_order\", {\n algoId: opts.algoId,\n });\n const data = getData(result) as Record<string, unknown>[];\n if (opts.json) return printJson(data);\n const r = data?.[0];\n process.stdout.write(\n `DCA bot stopped: ${r?.[\"algoId\"]} (${r?.[\"sCode\"] === \"0\" ? \"OK\" : r?.[\"sMsg\"]})\\n`,\n );\n}\n\nexport async function cmdDcaOrders(\n run: ToolRunner,\n opts: { history: boolean; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_orders\", {\n status: opts.history ? \"history\" : \"active\",\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No DCA bots\\n\"); return; }\n printTable(\n orders.map((o) => ({\n algoId: o[\"algoId\"],\n instId: o[\"instId\"],\n state: o[\"state\"],\n pnl: o[\"pnl\"],\n pnlRatio: o[\"pnlRatio\"],\n createdAt: new Date(Number(o[\"cTime\"])).toLocaleString(),\n })),\n );\n}\n\nexport async function cmdDcaDetails(\n run: ToolRunner,\n opts: { algoId: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_order_details\", {\n algoId: opts.algoId,\n });\n const detail = ((getData(result) as Record<string, unknown>[]) ?? [])[0];\n if (!detail) { process.stdout.write(\"DCA bot not found\\n\"); return; }\n if (opts.json) return printJson(detail);\n printKv({\n algoId: detail[\"algoId\"],\n instId: detail[\"instId\"],\n sz: detail[\"sz\"],\n avgPx: detail[\"avgPx\"],\n initPx: detail[\"initPx\"],\n tpPx: detail[\"tpPx\"],\n slPx: detail[\"slPx\"] || \"-\",\n upl: detail[\"upl\"],\n fee: detail[\"fee\"],\n fundingFee: detail[\"fundingFee\"],\n curCycleId: detail[\"curCycleId\"],\n fillSafetyOrds: detail[\"fillSafetyOrds\"],\n createdAt: new Date(Number(detail[\"startTime\"])).toLocaleString(),\n });\n}\n\nexport async function cmdDcaSubOrders(\n run: ToolRunner,\n opts: { algoId: string; cycleId?: string; json: boolean },\n): Promise<void> {\n const result = await run(\"dca_get_sub_orders\", {\n algoId: opts.algoId,\n cycleId: opts.cycleId,\n });\n const orders = (getData(result) as Record<string, unknown>[]) ?? [];\n if (opts.json) return printJson(orders);\n if (!orders.length) { process.stdout.write(\"No sub-orders\\n\"); return; }\n printTable(\n orders.map((o) => ({\n cycleId: o[\"cycleId\"],\n status: o[\"cycleStatus\"],\n current: o[\"currentCycle\"] ? \"yes\" : \"\",\n avgPx: o[\"avgPx\"],\n tpPx: o[\"tpPx\"],\n realizedPnl: o[\"realizedPnl\"],\n fee: o[\"fee\"],\n startTime: o[\"startTime\"] ? new Date(Number(o[\"startTime\"] as string)).toLocaleString() : \"\",\n })),\n );\n}\n","import type { ToolRunner } from \"@agent-tradekit/core\";\nimport type { CliValues } from \"../parser.js\";\n\nexport function cmdOnchainEarnOffers(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_offers\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n });\n}\n\nexport function cmdOnchainEarnPurchase(run: ToolRunner, v: CliValues) {\n // Parse investData from ccy + amt flags\n const investData = v.ccy && v.amt ? [{ ccy: v.ccy, amt: v.amt }] : undefined;\n return run(\"onchain_earn_purchase\", {\n productId: v.productId,\n investData,\n term: v.term,\n tag: v.tag,\n });\n}\n\nexport function cmdOnchainEarnRedeem(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_redeem\", {\n ordId: v.ordId,\n protocolType: v.protocolType,\n allowEarlyRedeem: v.allowEarlyRedeem,\n });\n}\n\nexport function cmdOnchainEarnCancel(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_cancel\", {\n ordId: v.ordId,\n protocolType: v.protocolType,\n });\n}\n\nexport function cmdOnchainEarnActiveOrders(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_active_orders\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n state: v.state,\n });\n}\n\nexport function cmdOnchainEarnOrderHistory(run: ToolRunner, v: CliValues) {\n return run(\"onchain_earn_get_order_history\", {\n productId: v.productId,\n protocolType: v.protocolType,\n ccy: v.ccy,\n });\n}\n"],"mappings":";;;AAAA,SAAS,iBAAAA,sBAAqB;;;ACA9B,SAAS,kBAAkB;ACA3B,SAAS,kBAAkB;AQA3B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AaFf,SAAS,cAAc,eAAe,WAAW,kBAAkB;AACnE,SAAS,MAAM,eAAe;AAC9B,SAAS,eAAe;;;AKyBxB,SAAS,kBAAkB,QAAQ,KAAK;AACpC,MAAI,QAAQ,OAAO,MAAM,GAAG,GAAG,EAAE,MAAM,aAAa;AACpD,SAAO,CAAC,MAAM,QAAQ,MAAM,IAAI,EAAE,SAAS,CAAC;AAChD;AACA,SAAS,cAAc,QAAQ,MAAM,QAAQ;AACzC,MAAI,QAAQ,OAAO,MAAM,aAAa;AACtC,MAAI,YAAY;AAChB,MAAI,aAAa,KAAK,MAAM,OAAO,CAAC,IAAI,KAAK;AAC7C,WAAS,IAAI,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK;AACvC,QAAI,IAAI,MAAM,IAAI,CAAC;AACnB,QAAI,CAAC;AACD;AACJ,iBAAa,EAAE,SAAS,EAAE,OAAO,WAAW,GAAG;AAC/C,iBAAa;AACb,iBAAa;AACb,iBAAa;AACb,QAAI,MAAM,MAAM;AACZ,mBAAa,IAAI,OAAO,YAAY,SAAS,CAAC;AAC9C,mBAAa;AAAA,IACjB;AAAA,EACJ;AACA,SAAO;AACX;AACO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,SAAS,SAAS;AAC1B,UAAM,CAAC,MAAM,MAAM,IAAI,kBAAkB,QAAQ,MAAM,QAAQ,GAAG;AAClE,UAAM,YAAY,cAAc,QAAQ,MAAM,MAAM,MAAM;AAC1D,UAAM,0BAA0B,OAAO;AAAA;AAAA,EAAO,SAAS,IAAI,OAAO;AAClE,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACrB;AACJ;;;AClCA,SAAS,UAAU,KAAK,KAAK;AACzB,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,EAAE,CAAC,MAAM;AACtB;AACJ,SAAO,EAAE,KAAM,IAAI;AACvB;AACO,SAAS,eAAe,KAAK,QAAQ,GAAG,MAAM,IAAI,QAAQ;AAC7D,MAAI,MAAM,IAAI,QAAQ,MAAM,KAAK;AACjC,MAAI,IAAI,MAAM,CAAC,MAAM;AACjB;AACJ,SAAO,OAAO,MAAM,MAAM;AAC9B;AACO,SAAS,YAAY,KAAK,KAAK;AAClC,WAAS,IAAI,KAAK,IAAI,IAAI,QAAQ,KAAK;AACnC,QAAI,IAAI,IAAI,CAAC;AACb,QAAI,MAAM;AACN,aAAO;AACX,QAAI,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM;AAC7B,aAAO,IAAI;AACf,QAAK,IAAI,OAAU,MAAM,OAAS,MAAM,QAAQ;AAC5C,YAAM,IAAI,UAAU,kDAAkD;AAAA,QAClE,MAAM;AAAA,QACN;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACA,SAAO,IAAI;AACf;AACO,SAAS,SAAS,KAAK,KAAK,aAAa,aAAa;AACzD,MAAI;AACJ,UAAQ,IAAI,IAAI,GAAG,OAAO,OAAO,MAAM,OAAS,CAAC,gBAAgB,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM;AAC1G;AACJ,SAAO,eAAe,MAAM,MACtB,MACA,SAAS,KAAK,YAAY,KAAK,GAAG,GAAG,WAAW;AAC1D;AACO,SAAS,UAAU,KAAK,KAAK,KAAK,KAAK,cAAc,OAAO;AAC/D,MAAI,CAAC,KAAK;AACN,UAAM,eAAe,KAAK,GAAG;AAC7B,WAAO,MAAM,IAAI,IAAI,SAAS;AAAA,EAClC;AACA,WAAS,IAAI,KAAK,IAAI,IAAI,QAAQ,KAAK;AACnC,QAAI,IAAI,IAAI,CAAC;AACb,QAAI,MAAM,KAAK;AACX,UAAI,eAAe,KAAK,CAAC;AAAA,IAC7B,WACS,MAAM,KAAK;AAChB,aAAO,IAAI;AAAA,IACf,WACS,MAAM,OAAQ,gBAAgB,MAAM,QAAS,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,OAAS;AACxF,aAAO;AAAA,IACX;AAAA,EACJ;AACA,QAAM,IAAI,UAAU,gCAAgC;AAAA,IAChD,MAAM;AAAA,IACN;AAAA,EACJ,CAAC;AACL;AACO,SAAS,aAAa,KAAK,MAAM;AACpC,MAAI,QAAQ,IAAI,IAAI;AACpB,MAAI,SAAS,UAAU,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAChE,IAAI,MAAM,MAAM,OAAO,CAAC,IACxB;AACN,UAAQ,OAAO,SAAS;AACxB;AACI,WAAO,IAAI,QAAQ,QAAQ,EAAE,IAAI;AAAA,SAC9B,OAAO,MAAM,UAAU,OAAO,UAAU,KAAK,IAAI;AACxD,MAAI,OAAO,IAAI;AACX,YAAQ,OAAO;AACf,QAAI,OAAO,SAAS,GAAG;AACnB,UAAI,IAAI,IAAI,MAAM;AACd;AACJ,UAAI,IAAI,IAAI,MAAM;AACd;AAAA,IACR;AAAA,EACJ;AACA,SAAO;AACX;;;AC9EA,IAAI,eAAe;AACZ,IAAM,WAAN,MAAM,kBAAiB,KAAK;AAAA,EAC/B,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY,MAAM;AACd,QAAI,UAAU;AACd,QAAI,UAAU;AACd,QAAI,SAAS;AACb,QAAI,OAAO,SAAS,UAAU;AAC1B,UAAI,QAAQ,KAAK,MAAM,YAAY;AACnC,UAAI,OAAO;AACP,YAAI,CAAC,MAAM,CAAC,GAAG;AACX,oBAAU;AACV,iBAAO,cAAc,IAAI;AAAA,QAC7B;AACA,kBAAU,CAAC,CAAC,MAAM,CAAC;AAEnB,mBAAW,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,QAAQ,KAAK,GAAG;AAE5D,YAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI;AAC5B,iBAAO;AAAA,QACX,OACK;AACD,mBAAS,MAAM,CAAC,KAAK;AACrB,iBAAO,KAAK,YAAY;AACxB,cAAI,CAAC,UAAU;AACX,oBAAQ;AAAA,QAChB;AAAA,MACJ,OACK;AACD,eAAO;AAAA,MACX;AAAA,IACJ;AACA,UAAM,IAAI;AACV,QAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,GAAG;AACxB,WAAK,WAAW;AAChB,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAAA,EACA,aAAa;AACT,WAAO,KAAK,YAAY,KAAK;AAAA,EACjC;AAAA,EACA,UAAU;AACN,WAAO,CAAC,KAAK,YAAY,CAAC,KAAK,YAAY,CAAC,KAAK;AAAA,EACrD;AAAA,EACA,SAAS;AACL,WAAO,KAAK,YAAY,CAAC,KAAK;AAAA,EAClC;AAAA,EACA,SAAS;AACL,WAAO,KAAK,YAAY,CAAC,KAAK;AAAA,EAClC;AAAA,EACA,UAAU;AACN,WAAO,KAAK,YAAY,KAAK;AAAA,EACjC;AAAA,EACA,cAAc;AACV,QAAI,MAAM,MAAM,YAAY;AAE5B,QAAI,KAAK,OAAO;AACZ,aAAO,IAAI,MAAM,GAAG,EAAE;AAE1B,QAAI,KAAK,OAAO;AACZ,aAAO,IAAI,MAAM,IAAI,EAAE;AAE3B,QAAI,KAAK,YAAY;AACjB,aAAO,IAAI,MAAM,GAAG,EAAE;AAE1B,QAAI,KAAK,YAAY;AACjB,aAAO;AAGX,QAAI,SAAU,CAAE,KAAK,QAAQ,MAAM,GAAG,CAAC,IAAK,KAAM,CAAE,KAAK,QAAQ,MAAM,GAAG,CAAC;AAC3E,aAAS,KAAK,QAAQ,CAAC,MAAM,MAAM,SAAS,CAAC;AAC7C,QAAI,aAAa,IAAI,KAAK,KAAK,QAAQ,IAAK,SAAS,GAAK;AAC1D,WAAO,WAAW,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EACxD;AAAA,EACA,OAAO,qBAAqB,QAAQ,SAAS,KAAK;AAC9C,QAAI,OAAO,IAAI,UAAS,MAAM;AAC9B,SAAK,UAAU;AACf,WAAO;AAAA,EACX;AAAA,EACA,OAAO,oBAAoB,QAAQ;AAC/B,QAAI,OAAO,IAAI,UAAS,MAAM;AAC9B,SAAK,UAAU;AACf,WAAO;AAAA,EACX;AAAA,EACA,OAAO,gBAAgB,QAAQ;AAC3B,QAAI,OAAO,IAAI,UAAS,MAAM;AAC9B,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,WAAO;AAAA,EACX;AAAA,EACA,OAAO,gBAAgB,QAAQ;AAC3B,QAAI,OAAO,IAAI,UAAS,MAAM;AAC9B,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,WAAO;AAAA,EACX;AACJ;;;AChGA,IAAI,YAAY;AAChB,IAAI,cAAc;AAClB,IAAI,eAAe;AACnB,IAAI,eAAe;AACnB,IAAI,UAAU;AAAA,EACV,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,MAAM;AACV;AACO,SAAS,YAAY,KAAK,MAAM,GAAG,SAAS,IAAI,QAAQ;AAC3D,MAAI,YAAY,IAAI,GAAG,MAAM;AAC7B,MAAI,cAAc,IAAI,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC;AACrE,MAAI,aAAa;AACb,cAAU;AACV,QAAI,IAAI,OAAO,CAAC,MAAM;AAClB;AACJ,QAAI,IAAI,GAAG,MAAM;AACb;AAAA,EACR;AACA,MAAI,MAAM;AACV,MAAI;AACJ,MAAI,SAAS;AACb,MAAI,aAAa;AACjB,SAAO,MAAM,SAAS,GAAG;AACrB,QAAI,IAAI,IAAI,KAAK;AACjB,QAAI,MAAM,QAAS,MAAM,QAAQ,IAAI,GAAG,MAAM,MAAO;AACjD,UAAI,CAAC,aAAa;AACd,cAAM,IAAI,UAAU,uCAAuC;AAAA,UACvD,MAAM;AAAA,UACN,KAAK,MAAM;AAAA,QACf,CAAC;AAAA,MACL;AAAA,IACJ,WACU,IAAI,OAAU,MAAM,OAAS,MAAM,QAAQ;AACjD,YAAM,IAAI,UAAU,iDAAiD;AAAA,QACjE,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,MACf,CAAC;AAAA,IACL;AACA,QAAI,UAAU;AACV,iBAAW;AACX,UAAI,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AAErC,YAAI,OAAO,IAAI,MAAM,KAAM,OAAQ,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,CAAG;AACtE,YAAI,CAAC,aAAa,KAAK,IAAI,GAAG;AAC1B,gBAAM,IAAI,UAAU,0BAA0B;AAAA,YAC1C,MAAM;AAAA,YACN,KAAK;AAAA,UACT,CAAC;AAAA,QACL;AACA,YAAI;AACA,oBAAU,OAAO,cAAc,SAAS,MAAM,EAAE,CAAC;AAAA,QACrD,QACM;AACF,gBAAM,IAAI,UAAU,0BAA0B;AAAA,YAC1C,MAAM;AAAA,YACN,KAAK;AAAA,UACT,CAAC;AAAA,QACL;AAAA,MACJ,WACS,gBAAgB,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAQ,MAAM,OAAO;AAE3E,cAAM,SAAS,KAAK,MAAM,GAAG,IAAI;AACjC,YAAI,IAAI,GAAG,MAAM,QAAQ,IAAI,GAAG,MAAM,MAAM;AACxC,gBAAM,IAAI,UAAU,8DAA8D;AAAA,YAC9E,MAAM;AAAA,YACN,KAAK;AAAA,UACT,CAAC;AAAA,QACL;AACA,cAAM,SAAS,KAAK,GAAG;AAAA,MAC3B,WACS,KAAK,SAAS;AAEnB,kBAAU,QAAQ,CAAC;AAAA,MACvB,OACK;AACD,cAAM,IAAI,UAAU,gCAAgC;AAAA,UAChD,MAAM;AAAA,UACN,KAAK;AAAA,QACT,CAAC;AAAA,MACL;AACA,mBAAa;AAAA,IACjB,WACS,CAAC,aAAa,MAAM,MAAM;AAC/B,YAAM,MAAM;AACZ,iBAAW;AACX,gBAAU,IAAI,MAAM,YAAY,GAAG;AAAA,IACvC;AAAA,EACJ;AACA,SAAO,SAAS,IAAI,MAAM,YAAY,SAAS,CAAC;AACpD;AACO,SAAS,WAAW,OAAO,MAAM,KAAK,kBAAkB;AAE3D,MAAI,UAAU;AACV,WAAO;AACX,MAAI,UAAU;AACV,WAAO;AACX,MAAI,UAAU;AACV,WAAO;AACX,MAAI,UAAU,SAAS,UAAU;AAC7B,WAAO;AACX,MAAI,UAAU,SAAS,UAAU,UAAU,UAAU;AACjD,WAAO;AAEX,MAAI,UAAU;AACV,WAAO,mBAAmB,KAAK;AAEnC,MAAI,QAAQ,UAAU,KAAK,KAAK;AAChC,MAAI,SAAS,YAAY,KAAK,KAAK,GAAG;AAClC,QAAI,aAAa,KAAK,KAAK,GAAG;AAC1B,YAAM,IAAI,UAAU,kCAAkC;AAAA,QAClD;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AACA,YAAQ,MAAM,QAAQ,MAAM,EAAE;AAC9B,QAAI,UAAU,CAAC;AACf,QAAI,MAAM,OAAO,GAAG;AAChB,YAAM,IAAI,UAAU,kBAAkB;AAAA,QAClC;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AACA,QAAI,OAAO;AACP,WAAK,QAAQ,CAAC,OAAO,cAAc,OAAO,MAAM,CAAC,kBAAkB;AAC/D,cAAM,IAAI,UAAU,kDAAkD;AAAA,UAClE;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AACA,UAAI,SAAS,qBAAqB;AAC9B,kBAAU,OAAO,KAAK;AAAA,IAC9B;AACA,WAAO;AAAA,EACX;AACA,QAAM,OAAO,IAAI,SAAS,KAAK;AAC/B,MAAI,CAAC,KAAK,QAAQ,GAAG;AACjB,UAAM,IAAI,UAAU,iBAAiB;AAAA,MACjC;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AACA,SAAO;AACX;;;ACnJA,SAAS,kBAAkB,KAAK,UAAU,QAAQ;AAC9C,MAAI,QAAQ,IAAI,MAAM,UAAU,MAAM;AACtC,MAAI,aAAa,MAAM,QAAQ,GAAG;AAClC,MAAI,aAAa,IAAI;AAGjB,gBAAY,KAAK,UAAU;AAC3B,YAAQ,MAAM,MAAM,GAAG,UAAU;AAAA,EACrC;AACA,SAAO,CAAC,MAAM,QAAQ,GAAG,UAAU;AACvC;AACO,SAAS,aAAa,KAAK,KAAK,KAAK,OAAO,kBAAkB;AACjE,MAAI,UAAU,GAAG;AACb,UAAM,IAAI,UAAU,8DAA8D;AAAA,MAC9E,MAAM;AAAA,MACN;AAAA,IACJ,CAAC;AAAA,EACL;AACA,MAAI,IAAI,IAAI,GAAG;AACf,MAAI,MAAM,OAAO,MAAM,KAAK;AACxB,QAAI,CAAC,OAAOC,OAAM,IAAI,MAAM,MACtB,WAAW,KAAK,KAAK,OAAO,gBAAgB,IAC5C,iBAAiB,KAAK,KAAK,OAAO,gBAAgB;AACxD,QAAI,KAAK;AACL,MAAAA,UAAS,SAAS,KAAKA,OAAM;AAC7B,UAAI,IAAIA,OAAM,MAAM;AAChB,QAAAA;AAAA,eACK,IAAIA,OAAM,MAAM,KAAK;AAC1B,cAAM,IAAI,UAAU,sCAAsC;AAAA,UACtD,MAAM;AAAA,UACN,KAAKA;AAAA,QACT,CAAC;AAAA,MACL;AAAA,IACJ;AACA,WAAO,CAAC,OAAOA,OAAM;AAAA,EACzB;AACA,MAAI;AACJ,MAAI,MAAM,OAAO,MAAM,KAAK;AACxB,aAAS,aAAa,KAAK,GAAG;AAC9B,QAAI,SAAS,YAAY,KAAK,KAAK,MAAM;AACzC,QAAI,KAAK;AACL,eAAS,SAAS,KAAK,MAAM;AAC7B,UAAI,IAAI,MAAM,KAAK,IAAI,MAAM,MAAM,OAAO,IAAI,MAAM,MAAM,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,MAAM,MAAM,MAAM;AAC3G,cAAM,IAAI,UAAU,oCAAoC;AAAA,UACpD,MAAM;AAAA,UACN,KAAK;AAAA,QACT,CAAC;AAAA,MACL;AACA,gBAAW,EAAE,IAAI,MAAM,MAAM;AAAA,IACjC;AACA,WAAO,CAAC,QAAQ,MAAM;AAAA,EAC1B;AACA,WAAS,UAAU,KAAK,KAAK,KAAK,GAAG;AACrC,MAAI,QAAQ,kBAAkB,KAAK,KAAK,SAAU,EAAE,IAAI,SAAS,CAAC,MAAM,IAAK;AAC7E,MAAI,CAAC,MAAM,CAAC,GAAG;AACX,UAAM,IAAI,UAAU,wDAAwD;AAAA,MACxE,MAAM;AAAA,MACN;AAAA,IACJ,CAAC;AAAA,EACL;AACA,MAAI,OAAO,MAAM,CAAC,IAAI,IAAI;AACtB,aAAS,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC;AACrC,cAAU,EAAE,IAAI,MAAM,MAAM;AAAA,EAChC;AACA,SAAO;AAAA,IACH,WAAW,MAAM,CAAC,GAAG,KAAK,KAAK,gBAAgB;AAAA,IAC/C;AAAA,EACJ;AACJ;;;ACpEA,IAAI,cAAc;AACX,SAAS,SAAS,KAAK,KAAK,MAAM,KAAK;AAC1C,MAAI,MAAM,MAAM;AAChB,MAAI,SAAS,CAAC;AACd,MAAI,SAAS,IAAI,QAAQ,KAAK,GAAG;AACjC,MAAI,SAAS,GAAG;AACZ,UAAM,IAAI,UAAU,gDAAgD;AAAA,MAChE,MAAM;AAAA,MACN;AAAA,IACJ,CAAC;AAAA,EACL;AACA,KAAG;AACC,QAAI,IAAI,IAAI,MAAM,EAAE,GAAG;AAEvB,QAAI,MAAM,OAAO,MAAM,KAAM;AAEzB,UAAI,MAAM,OAAO,MAAM,KAAM;AACzB,YAAI,MAAM,IAAI,MAAM,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,GAAG;AAC1C,gBAAM,IAAI,UAAU,6CAA6C;AAAA,YAC7D,MAAM;AAAA,YACN;AAAA,UACJ,CAAC;AAAA,QACL;AACA,YAAI,MAAM,aAAa,KAAK,GAAG;AAC/B,YAAI,MAAM,GAAG;AACT,gBAAM,IAAI,UAAU,iCAAiC;AAAA,YACjD,MAAM;AAAA,YACN;AAAA,UACJ,CAAC;AAAA,QACL;AACA,cAAM,IAAI,QAAQ,KAAK,GAAG;AAC1B,YAAI,SAAS,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,SAAS,SAAS,GAAG;AAClE,YAAI,UAAU,eAAe,MAAM;AACnC,YAAI,UAAU,IAAI;AACd,gBAAM,IAAI,UAAU,oCAAoC;AAAA,YACpD,MAAM;AAAA,YACN,KAAK,MAAM,MAAM;AAAA,UACrB,CAAC;AAAA,QACL;AACA,YAAI,OAAO,UAAU,GAAG;AACpB,gBAAM,IAAI,UAAU,4CAA4C;AAAA,YAC5D,MAAM;AAAA,YACN,KAAK;AAAA,UACT,CAAC;AAAA,QACL;AACA,YAAI,SAAS,KAAK;AACd,mBAAS,IAAI,QAAQ,KAAK,GAAG;AAC7B,cAAI,SAAS,GAAG;AACZ,kBAAM,IAAI,UAAU,gDAAgD;AAAA,cAChE,MAAM;AAAA,cACN;AAAA,YACJ,CAAC;AAAA,UACL;AAAA,QACJ;AACA,eAAO,KAAK,YAAY,KAAK,KAAK,GAAG,CAAC;AAAA,MAC1C,OACK;AAED,cAAM,IAAI,QAAQ,KAAK,GAAG;AAC1B,YAAI,OAAO,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,SAAS,SAAS,GAAG;AAChE,YAAI,CAAC,YAAY,KAAK,IAAI,GAAG;AACzB,gBAAM,IAAI,UAAU,oEAAoE;AAAA,YACpF,MAAM;AAAA,YACN;AAAA,UACJ,CAAC;AAAA,QACL;AACA,eAAO,KAAK,KAAK,QAAQ,CAAC;AAAA,MAC9B;AAAA,IACJ;AAAA,EAEJ,SAAS,MAAM,KAAK,MAAM;AAC1B,SAAO,CAAC,QAAQ,SAAS,KAAK,SAAS,GAAG,MAAM,IAAI,CAAC;AACzD;AACO,SAAS,iBAAiB,KAAK,KAAK,OAAO,kBAAkB;AAChE,MAAI,MAAM,CAAC;AACX,MAAI,OAAO,oBAAI,IAAI;AACnB,MAAI;AACJ;AACA,UAAQ,IAAI,IAAI,KAAK,OAAO,OAAO,GAAG;AAClC,QAAI,MAAM,KAAK;AACX,YAAM,IAAI,UAAU,+BAA+B;AAAA,QAC/C,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,MACf,CAAC;AAAA,IACL,WACS,MAAM;AACX,YAAM,YAAY,KAAK,GAAG;AAAA,aACrB,MAAM,OAAO,MAAM,OAAQ,MAAM,QAAQ,MAAM,MAAM;AAC1D,UAAI;AACJ,UAAI,IAAI;AACR,UAAI,SAAS;AACb,UAAI,CAAC,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,CAAC;AAC5C,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,YAAI;AACA,cAAI,SAAS,EAAE,CAAC,IAAK,EAAE,CAAC,IAAI,CAAC;AACjC,YAAI,IAAI,CAAC;AACT,aAAK,SAAS,OAAO,OAAO,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,MAAM,YAAY,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI;AAChF,gBAAM,IAAI,UAAU,+CAA+C;AAAA,YAC/D,MAAM;AAAA,YACN;AAAA,UACJ,CAAC;AAAA,QACL;AACA,YAAI,CAAC,UAAU,MAAM,aAAa;AAC9B,iBAAO,eAAe,GAAG,GAAG,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,KAAK,CAAC;AAAA,QACxF;AAAA,MACJ;AACA,UAAI,QAAQ;AACR,cAAM,IAAI,UAAU,+CAA+C;AAAA,UAC/D,MAAM;AAAA,UACN;AAAA,QACJ,CAAC;AAAA,MACL;AACA,UAAI,CAAC,OAAO,WAAW,IAAI,aAAa,KAAK,WAAW,KAAK,QAAQ,GAAG,gBAAgB;AACxF,WAAK,IAAI,KAAK;AACd,QAAE,CAAC,IAAI;AACP,YAAM;AAAA,IACV;AAAA,EACJ;AACA,MAAI,CAAC,GAAG;AACJ,UAAM,IAAI,UAAU,gCAAgC;AAAA,MAChD,MAAM;AAAA,MACN;AAAA,IACJ,CAAC;AAAA,EACL;AACA,SAAO,CAAC,KAAK,GAAG;AACpB;AACO,SAAS,WAAW,KAAK,KAAK,OAAO,kBAAkB;AAC1D,MAAI,MAAM,CAAC;AACX,MAAI;AACJ;AACA,UAAQ,IAAI,IAAI,KAAK,OAAO,OAAO,GAAG;AAClC,QAAI,MAAM,KAAK;AACX,YAAM,IAAI,UAAU,+BAA+B;AAAA,QAC/C,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,MACf,CAAC;AAAA,IACL,WACS,MAAM;AACX,YAAM,YAAY,KAAK,GAAG;AAAA,aACrB,MAAM,OAAO,MAAM,OAAQ,MAAM,QAAQ,MAAM,MAAM;AAC1D,UAAI,IAAI,aAAa,KAAK,MAAM,GAAG,KAAK,QAAQ,GAAG,gBAAgB;AACnE,UAAI,KAAK,EAAE,CAAC,CAAC;AACb,YAAM,EAAE,CAAC;AAAA,IACb;AAAA,EACJ;AACA,MAAI,CAAC,GAAG;AACJ,UAAM,IAAI,UAAU,gCAAgC;AAAA,MAChD,MAAM;AAAA,MACN;AAAA,IACJ,CAAC;AAAA,EACL;AACA,SAAO,CAAC,KAAK,GAAG;AACpB;;;ACxJA,SAAS,UAAU,KAAK,OAAO,MAAM,MAAM;AACvC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI;AACJ,MAAI,SAAS;AACb,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,QAAI,GAAG;AACH,UAAI,SAAS,EAAE,CAAC,IAAK,EAAE,CAAC,IAAI,CAAC;AAC7B,WAAK,QAAQ,EAAE,CAAC,GAAG;AACnB,UAAI,SAAS,MAAwB,MAAM,MAAM,KAAyB,MAAM,MAAM,IAAqB;AACvG,eAAO;AAAA,MACX;AACA,UAAI,MAAM,MAAM,GAAoB;AAChC,YAAI,IAAI,EAAE,SAAS;AACnB,YAAI,EAAE,CAAC;AACP,YAAI,EAAE,CAAC,EAAE;AAAA,MACb;AAAA,IACJ;AACA,QAAI,IAAI,CAAC;AACT,SAAK,SAAS,OAAO,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,KAAuB,EAAE,CAAC,GAAG,GAAG;AAC9E,aAAO;AAAA,IACX;AACA,QAAI,CAAC,QAAQ;AACT,UAAI,MAAM,aAAa;AACnB,eAAO,eAAe,GAAG,GAAG,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,KAAK,CAAC;AACpF,eAAO,eAAe,GAAG,GAAG,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,KAAK,CAAC;AAAA,MACxF;AACA,QAAE,CAAC,IAAI;AAAA,QACH,GAAG,IAAI,IAAI,SAAS,KAAK,SAAS,IAC5B,IACA;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG,CAAC;AAAA,MACR;AAAA,IACJ;AAAA,EACJ;AACA,UAAQ,EAAE,CAAC;AACX,MAAI,MAAM,MAAM,QAAQ,EAAE,SAAS,KAAyB,MAAM,MAAM,IAA4B;AAEhG,WAAO;AAAA,EACX;AACA,MAAI,SAAS,GAAoB;AAC7B,QAAI,CAAC,MAAM,GAAG;AACV,YAAM,IAAI;AACV,QAAE,CAAC,IAAI,CAAC;AAAA,IACZ;AACA,MAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAChB,UAAM,EAAE,MAAM,GAAG,IAAK,QAAQ,EAAE,GAAG,GAAuB,GAAG,OAAO,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,EACpF;AACA,MAAI,MAAM,GAAG;AAET,WAAO;AAAA,EACX;AACA,QAAM,IAAI;AACV,MAAI,SAAS,GAAuB;AAChC,QAAI,SAAS,EAAE,CAAC,IAAK,EAAE,CAAC,IAAI,CAAC;AAAA,EACjC,WACS,SAAS,KAAuB,QAAQ;AAC7C,WAAO;AAAA,EACX;AACA,SAAO,CAAC,GAAG,GAAG,MAAM,CAAC;AACzB;AACO,SAAS,MAAM,MAAM,EAAE,WAAW,KAAM,iBAAiB,IAAI,CAAC,GAAG;AACpE,MAAI,MAAM,CAAC;AACX,MAAI,OAAO,CAAC;AACZ,MAAI,MAAM;AACV,MAAI,IAAI;AACR,WAAS,MAAM,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,UAAS;AAClD,QAAI,KAAK,GAAG,MAAM,KAAK;AACnB,UAAI,eAAe,KAAK,EAAE,GAAG,MAAM;AACnC,UAAI,IAAI,SAAS,MAAM,OAAO,CAAC,cAAc,GAAG;AAChD,UAAI,cAAc;AACd,YAAI,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK;AACxB,gBAAM,IAAI,UAAU,qCAAqC;AAAA,YACrD;AAAA,YACA,KAAK,EAAE,CAAC,IAAI;AAAA,UAChB,CAAC;AAAA,QACL;AACA,UAAE,CAAC;AAAA,MACP;AACA,UAAI,IAAI;AAAA,QAAU,EAAE,CAAC;AAAA,QAAG;AAAA,QAAK;AAAA,QAAM,eAAe,IAAqB;AAAA;AAAA,MAAqB;AAC5F,UAAI,CAAC,GAAG;AACJ,cAAM,IAAI,UAAU,wDAAwD;AAAA,UACxE;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AACA,UAAI,EAAE,CAAC;AACP,YAAM,EAAE,CAAC;AACT,YAAM,EAAE,CAAC;AAAA,IACb,OACK;AACD,UAAI,IAAI,SAAS,MAAM,GAAG;AAC1B,UAAI,IAAI;AAAA,QAAU,EAAE,CAAC;AAAA,QAAG;AAAA,QAAK;AAAA,QAAG;AAAA;AAAA,MAAmB;AACnD,UAAI,CAAC,GAAG;AACJ,cAAM,IAAI,UAAU,wDAAwD;AAAA,UACxE;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AACA,UAAI,IAAI,aAAa,MAAM,EAAE,CAAC,GAAG,QAAQ,UAAU,gBAAgB;AACnE,QAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAChB,YAAM,EAAE,CAAC;AAAA,IACb;AACA,UAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,QAAI,KAAK,GAAG,KAAK,KAAK,GAAG,MAAM,QAAQ,KAAK,GAAG,MAAM,MAAM;AACvD,YAAM,IAAI,UAAU,iEAAiE;AAAA,QACjF;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AACA,UAAM,SAAS,MAAM,GAAG;AAAA,EAC5B;AACA,SAAO;AACX;;;ACxHA,IAAI,WAAW;AACf,SAAS,eAAe,KAAK;AACzB,MAAI,OAAO,OAAO;AAClB,MAAI,SAAS,UAAU;AACnB,QAAI,MAAM,QAAQ,GAAG;AACjB,aAAO;AACX,QAAI,eAAe;AACf,aAAO;AAAA,EACf;AACA,SAAO;AACX;AACA,SAAS,gBAAgB,KAAK;AAC1B,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,QAAI,eAAe,IAAI,CAAC,CAAC,MAAM;AAC3B,aAAO;AAAA,EACf;AACA,SAAO,IAAI,UAAU;AACzB;AACA,SAAS,aAAa,GAAG;AACrB,SAAO,KAAK,UAAU,CAAC,EAAE,QAAQ,SAAS,SAAS;AACvD;AACA,SAAS,eAAe,KAAK,MAAM,OAAO,eAAe;AACrD,MAAI,UAAU,GAAG;AACb,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACnF;AACA,MAAI,SAAS,UAAU;AACnB,QAAI,MAAM,GAAG;AACT,aAAO;AACX,QAAI,QAAQ;AACR,aAAO;AACX,QAAI,QAAQ;AACR,aAAO;AACX,QAAI,iBAAiB,OAAO,UAAU,GAAG;AACrC,aAAO,IAAI,QAAQ,CAAC;AACxB,WAAO,IAAI,SAAS;AAAA,EACxB;AACA,MAAI,SAAS,YAAY,SAAS,WAAW;AACzC,WAAO,IAAI,SAAS;AAAA,EACxB;AACA,MAAI,SAAS,UAAU;AACnB,WAAO,aAAa,GAAG;AAAA,EAC3B;AACA,MAAI,SAAS,QAAQ;AACjB,QAAI,MAAM,IAAI,QAAQ,CAAC,GAAG;AACtB,YAAM,IAAI,UAAU,+BAA+B;AAAA,IACvD;AACA,WAAO,IAAI,YAAY;AAAA,EAC3B;AACA,MAAI,SAAS,UAAU;AACnB,WAAO,qBAAqB,KAAK,OAAO,aAAa;AAAA,EACzD;AACA,MAAI,SAAS,SAAS;AAClB,WAAO,eAAe,KAAK,OAAO,aAAa;AAAA,EACnD;AACJ;AACA,SAAS,qBAAqB,KAAK,OAAO,eAAe;AACrD,MAAI,OAAO,OAAO,KAAK,GAAG;AAC1B,MAAI,KAAK,WAAW;AAChB,WAAO;AACX,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,QAAI,IAAI,KAAK,CAAC;AACd,QAAI;AACA,aAAO;AACX,WAAO,SAAS,KAAK,CAAC,IAAI,IAAI,aAAa,CAAC;AAC5C,WAAO;AACP,WAAO,eAAe,IAAI,CAAC,GAAG,eAAe,IAAI,CAAC,CAAC,GAAG,QAAQ,GAAG,aAAa;AAAA,EAClF;AACA,SAAO,MAAM;AACjB;AACA,SAAS,eAAe,OAAO,OAAO,eAAe;AACjD,MAAI,MAAM,WAAW;AACjB,WAAO;AACX,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,QAAI;AACA,aAAO;AACX,QAAI,MAAM,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,QAAQ;AAC1C,YAAM,IAAI,UAAU,gDAAgD;AAAA,IACxE;AACA,WAAO,eAAe,MAAM,CAAC,GAAG,eAAe,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,aAAa;AAAA,EACtF;AACA,SAAO,MAAM;AACjB;AACA,SAAS,oBAAoB,OAAO,KAAK,OAAO,eAAe;AAC3D,MAAI,UAAU,GAAG;AACb,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACnF;AACA,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,WAAO,GAAG,OAAO,IAAI,KAAK,GAAG;AAAA;AAC7B,WAAO,eAAe,GAAG,MAAM,CAAC,GAAG,KAAK,OAAO,aAAa;AAAA,EAChE;AACA,SAAO;AACX;AACA,SAAS,eAAe,UAAU,KAAK,QAAQ,OAAO,eAAe;AACjE,MAAI,UAAU,GAAG;AACb,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACnF;AACA,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI,OAAO,OAAO,KAAK,GAAG;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,QAAI,IAAI,KAAK,CAAC;AACd,QAAI,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,MAAM,QAAQ;AACtC,UAAI,OAAO,eAAe,IAAI,CAAC,CAAC;AAChC,UAAI,SAAS,YAAY,SAAS,YAAY;AAC1C,cAAM,IAAI,UAAU,oCAAoC,IAAI,GAAG;AAAA,MACnE;AACA,UAAI,MAAM,SAAS,KAAK,CAAC,IAAI,IAAI,aAAa,CAAC;AAC/C,UAAI,SAAS,WAAW,gBAAgB,IAAI,CAAC,CAAC,GAAG;AAC7C,mBAAW,UAAU,QAAQ,oBAAoB,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK,KAAK,QAAQ,GAAG,aAAa;AAAA,MACxH,WACS,SAAS,UAAU;AACxB,YAAI,SAAS,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAC3C,mBAAW,UAAU,QAAQ,eAAe,QAAQ,IAAI,CAAC,GAAG,QAAQ,QAAQ,GAAG,aAAa;AAAA,MAChG,OACK;AACD,oBAAY;AACZ,oBAAY;AACZ,oBAAY,eAAe,IAAI,CAAC,GAAG,MAAM,OAAO,aAAa;AAC7D,oBAAY;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,aAAa,YAAY,CAAC;AAC1B,eAAW,WAAW,IAAI,QAAQ;AAAA,EAAM,QAAQ,KAAK,IAAI,QAAQ;AACrE,SAAO,YAAY,SACb,GAAG,QAAQ;AAAA,EAAK,MAAM,KACtB,YAAY;AACtB;AACO,SAAS,UAAU,KAAK,EAAE,WAAW,KAAM,iBAAiB,MAAM,IAAI,CAAC,GAAG;AAC7E,MAAI,eAAe,GAAG,MAAM,UAAU;AAClC,UAAM,IAAI,UAAU,6CAA6C;AAAA,EACrE;AACA,MAAI,MAAM,eAAe,GAAG,KAAK,IAAI,UAAU,cAAc;AAC7D,MAAI,IAAI,IAAI,SAAS,CAAC,MAAM;AACxB,WAAO,MAAM;AACjB,SAAO;AACX;;;AVtKA,SAAS,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,mBAAkB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AEFxB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AACpB,SAAS,oBAAoB;AzBDtB,SAAS,SAAiB;AAC/B,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEO,SAAS,eAAe,SAAiB,WAA2B;AACzE,SAAO,WAAW,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,OAAO,QAAQ;AACxE;ACYO,IAAM,cAAN,cAA0B,MAAM;EACrB;EACA;EACA;EACA;EACA;EAET,YACL,MACA,SACA,SAOA;AACA,UAAM,SAAS,SAAS,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,MAAS;AACpE,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO,SAAS;AACrB,SAAK,aAAa,SAAS;AAC3B,SAAK,WAAW,SAAS;AACzB,SAAK,UAAU,SAAS;EAC1B;AACF;AAEO,IAAM,cAAN,cAA0B,YAAY;EACpC,YAAY,SAAiB,YAAqB;AACvD,UAAM,eAAe,SAAS,EAAE,WAAW,CAAC;EAC9C;AACF;AAEO,IAAM,kBAAN,cAA8B,YAAY;EACxC,YAAY,SAAiB,YAAqB;AACvD,UAAM,mBAAmB,SAAS,EAAE,WAAW,CAAC;EAClD;AACF;AAEO,IAAM,iBAAN,cAA6B,YAAY;EACvC,YACL,SACA,YACA,UACA,SACA;AACA,UAAM,kBAAkB,SAAS,EAAE,YAAY,UAAU,QAAQ,CAAC;EACpE;AACF;AAEO,IAAM,sBAAN,cAAkC,YAAY;EAC5C,YACL,SACA,YACA,UACA,SACA;AACA,UAAM,uBAAuB,SAAS,EAAE,YAAY,UAAU,QAAQ,CAAC;EACzE;AACF;AAEO,IAAM,cAAN,cAA0B,YAAY;EACpC,YACL,SACA,SAOA;AACA,UAAM,eAAe,SAAS,OAAO;EACvC;AACF;AAEO,IAAM,eAAN,cAA2B,YAAY;EACrC,YAAY,SAAiB,UAAmB,OAAiB;AACtE,UAAM,gBAAgB,SAAS;MAC7B;MACA;MACA,YACE;IACJ,CAAC;EACH;AACF;AAEO,SAAS,mBACd,OACA,kBACkB;AAClB,MAAI,iBAAiB,aAAa;AAChC,WAAO;MACL,OAAO;MACP,MAAM,MAAM;MACZ,MAAM,MAAM;MACZ,SAAS,MAAM;MACf,YAAY,MAAM;MAClB,UAAU,MAAM,YAAY;MAC5B,SAAS,MAAM;MACf,YAAW,oBAAI,KAAK,GAAE,YAAY;IACpC;EACF;AAEA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,SAAO;IACL,OAAO;IACP,MAAM;IACN;IACA,YACE;IACF,UAAU;IACV,YAAW,oBAAI,KAAK,GAAE,YAAY;EACpC;AACF;ACzHA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;EACxB,CAAC;AACH;AAEO,IAAM,cAAN,MAAkB;EACN,UAAU,oBAAI,IAAoB;EAClC;EACA;EAEV,YAAY,YAAY,KAAQ,UAAU,OAAO;AACtD,SAAK,YAAY;AACjB,SAAK,UAAU;EACjB;EAEA,MAAa,QAAQ,QAAyB,SAAS,GAAkB;AACvE,UAAM,SAAS,KAAK,UAAU,MAAM;AACpC,SAAK,OAAO,MAAM;AAElB,QAAI,OAAO,UAAU,QAAQ;AAC3B,aAAO,UAAU;AACjB;IACF;AAEA,UAAM,UAAU,SAAS,OAAO;AAChC,UAAM,gBAAgB,UAAU,OAAO;AACvC,UAAM,SAAS,KAAK,KAAK,gBAAgB,GAAI;AAE7C,QAAI,SAAS,KAAK,WAAW;AAC3B,YAAM,IAAI;QACR,sCAAsC,OAAO,GAAG,mBAAmB,MAAM,0BAA0B,KAAK,SAAS;QACjH;MACF;IACF;AAEA,QAAI,KAAK,SAAS;AAChB,cAAQ,OAAO,MAAM,wCAAwC,MAAM,WAAW,OAAO,GAAG;CAAK;IAC/F;AACA,UAAM,MAAM,MAAM;AAClB,SAAK,OAAO,MAAM;AAElB,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,IAAI;QACR,oDAAoD,OAAO,GAAG;MAChE;IACF;AAEA,WAAO,UAAU;EACnB;EAEQ,UAAU,QAAiC;AACjD,UAAM,WAAW,KAAK,QAAQ,IAAI,OAAO,GAAG;AAC5C,QAAI,UAAU;AACZ,UACE,SAAS,aAAa,OAAO,YAC7B,SAAS,oBAAoB,OAAO,iBACpC;AACA,iBAAS,WAAW,OAAO;AAC3B,iBAAS,kBAAkB,OAAO;AAClC,iBAAS,SAAS,KAAK,IAAI,SAAS,QAAQ,OAAO,QAAQ;MAC7D;AACA,aAAO;IACT;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,UAAkB;MACtB,QAAQ,OAAO;MACf,cAAc;MACd,UAAU,OAAO;MACjB,iBAAiB,OAAO;IAC1B;AACA,SAAK,QAAQ,IAAI,OAAO,KAAK,OAAO;AACpC,WAAO;EACT;EAEQ,OAAO,QAAsB;AACnC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,YAAY,MAAM,OAAO;AAC/B,QAAI,aAAa,GAAG;AAClB;IACF;AAEA,UAAM,eAAgB,YAAY,MAAQ,OAAO;AACjD,WAAO,SAAS,KAAK,IAAI,OAAO,UAAU,OAAO,SAAS,YAAY;AACtE,WAAO,eAAe;EACxB;AACF;AHxFA,IAAM,qBAAmD;;EAEvD,SAAS,EAAE,OAAO,MAAO,YAAY,kDAAkD;EACvF,SAAS,EAAE,OAAO,MAAO,YAAY,4DAA4D;;EAGjG,SAAS,EAAE,OAAO,MAAO,YAAY,0DAA0D;EAC/F,SAAS,EAAE,OAAO,MAAO,YAAY,iDAAiD;EACtF,SAAS,EAAE,OAAO,MAAO,YAAY,wCAAwC;EAC7E,SAAS,EAAE,OAAO,MAAO,YAAY,uDAAuD;;EAG5F,SAAS,EAAE,OAAO,OAAO,YAAY,wKAAwK;EAC7M,SAAS,EAAE,OAAO,OAAO,YAAY,gLAAgL;;EAGrN,SAAS,EAAE,OAAO,OAAO,YAAY,wDAAwD;EAC7F,SAAS,EAAE,OAAO,OAAO,YAAY,sEAAsE;EAC3G,SAAS,EAAE,OAAO,OAAO,YAAY,yEAAyE;;EAG9G,SAAS,EAAE,OAAO,OAAO,YAAY,kEAAkE;EACvG,SAAS,EAAE,OAAO,OAAO,YAAY,2CAA2C;;EAGhF,SAAS,EAAE,OAAO,OAAO,YAAY,wDAAwD;EAC7F,SAAS,EAAE,OAAO,OAAO,YAAY,mDAAmD;EACxF,SAAS,EAAE,OAAO,OAAO,YAAY,gEAAgE;;EAGrG,SAAS,EAAE,OAAO,OAAO,YAAY,2CAA2C;EAChF,SAAS,EAAE,OAAO,OAAO,YAAY,wCAAwC;EAC7E,SAAS,EAAE,OAAO,OAAO,YAAY,wBAAwB;AAC/D;AAWA,SAAS,UAAU,OAAyB;AAC1C,SAAO,UAAU,UAAa,UAAU;AAC1C;AAEA,SAAS,eAAe,SAAsC;AAC5D,SACE,QAAQ,IAAI,YAAY,KACxB,QAAQ,IAAI,cAAc,KAC1B,QAAQ,IAAI,SAAS,KACrB;AAEJ;AAEA,SAAS,oBAAoB,OAA2B;AACtD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,EAAE,KAAK,GAAG;EACnD;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,iBAAiB,OAA6B;AACrD,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,KAAK,CAAC;AAC5E,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;EACT;AAEA,QAAM,SAAS,IAAI,gBAAgB;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,WAAO,IAAI,KAAK,oBAAoB,KAAK,CAAC;EAC5C;AACA,SAAO,OAAO,SAAS;AACzB;AAEA,SAAS,QAAQ,KAAqB;AACpC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;AAC9C;AAEA,SAAS,KAAK,SAAuB;AACnC,UAAQ,OAAO,MAAM,aAAa,OAAO;CAAI;AAC/C;AAEO,IAAM,gBAAN,MAAoB;EACR;EACA;EACA;EAEV,YAAY,QAAmB;AACpC,SAAK,SAAS;AACd,SAAK,cAAc,IAAI,YAAY,KAAQ,OAAO,OAAO;AACzD,QAAI,OAAO,UAAU;AACnB,WAAK,aAAa,IAAI,WAAW,OAAO,QAAQ;IAClD;EACF;EAEQ,WAAW,QAAgB,KAAa,MAAoB;AAClE,QAAI,CAAC,KAAK,OAAO,QAAS;AAC1B,SAAK,UAAU,MAAM,IAAI,GAAG,EAAE;AAC9B,UAAM,WAAW,SAAS,aAAa,KAAK,OAAO,SAC/C,eAAe,QAAQ,KAAK,OAAO,MAAM,CAAC,MAAM,QAAQ,IAAI;AAChE,SAAK,KAAK,QAAQ,SAAS,KAAK,OAAO,IAAI,YAAY,KAAK,OAAO,SAAS,IAAI;EAClF;EAEQ,YACN,QAAgB,QAAgB,SAChC,SAA6B,MAAe,KACtC;AACN,QAAI,CAAC,KAAK,OAAO,QAAS;AAC1B,QAAI,QAAQ,SAAS,OAAO,SAAS,KAAK;AACxC,WAAK,UAAU,MAAM,WAAW,IAAI,UAAU,OAAO,GAAG,MAAM,MAAM,OAAO,OAAO,cAAc,WAAW,GAAG,EAAE;IAClH,OAAO;AACL,WAAK,UAAU,MAAM,WAAW,QAAQ,GAAG,MAAM,MAAM,OAAO,OAAO,cAAc,WAAW,GAAG,EAAE;IACrG;EACF;EAEA,MAAa,UACXD,OACA,OACA,WAC+B;AAC/B,WAAO,KAAK,QAAe;MACzB,QAAQ;MACR,MAAAA;MACA,MAAM;MACN;MACA;IACF,CAAC;EACH;EAEA,MAAa,WACXA,OACA,OACA,WAC+B;AAC/B,WAAO,KAAK,QAAe;MACzB,QAAQ;MACR,MAAAA;MACA,MAAM;MACN;MACA;IACF,CAAC;EACH;EAEA,MAAa,YACXA,OACA,MACA,WAC+B;AAC/B,WAAO,KAAK,QAAe;MACzB,QAAQ;MACR,MAAAA;MACA,MAAM;MACN;MACA;IACF,CAAC;EACH;EAEQ,eACN,SAAkB,QAAgB,aAAqB,UAAkB,WACnE;AACN,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,YAAM,IAAI;QACR;QACA;MACF;IACF;AAEA,QAAI,CAAC,KAAK,OAAO,UAAU,CAAC,KAAK,OAAO,aAAa,CAAC,KAAK,OAAO,YAAY;AAC5E,YAAM,IAAI;QACR;QACA;MACF;IACF;AAGA,UAAM,UAAU,GAAG,SAAS,GAAG,OAAO,YAAY,CAAC,GAAG,WAAW,GAAG,QAAQ;AAC5E,UAAM,YAAY,eAAe,SAAS,KAAK,OAAO,SAAS;AAC/D,YAAQ,IAAI,iBAAiB,KAAK,OAAO,MAAM;AAC/C,YAAQ,IAAI,kBAAkB,SAAS;AACvC,YAAQ,IAAI,wBAAwB,KAAK,OAAO,UAAU;AAC1D,YAAQ,IAAI,uBAAuB,SAAS;EAC9C;EAEQ,cACN,MAAc,KAAyB,WAA0B,SAC1D;AACP,UAAM,UAAU,OAAO;AACvB,UAAM,WAAW,GAAG,UAAU,MAAM,IAAI,UAAU,IAAI;AAEtD,QAAI,SAAS,WAAW,SAAS,WAAW,SAAS,SAAS;AAC5D,YAAM,IAAI;QACR;QACA;QACA;QACA;MACF;IACF;AAEA,UAAM,WAAW,mBAAmB,IAAI;AACxC,UAAM,aAAa,UAAU,YAAY,QAAQ,UAAU,KAAK,OAAO,IAAI;AAE3E,QAAI,SAAS,WAAW,SAAS,SAAS;AACxC,YAAM,IAAI,eAAe,SAAS,YAAY,UAAU,OAAO;IACjE;AAEA,UAAM,IAAI,YAAY,SAAS;MAC7B;MACA;MACA;MACA;IACF,CAAC;EACH;EAEQ,gBACN,SACA,UACA,SACA,SACA,WACA,aACsB;AACtB,QAAI;AACJ,QAAI;AACF,eAAU,UAAU,KAAK,MAAM,OAAO,IAAI,CAAC;IAC7C,SAAS,OAAO;AACd,WAAK,YAAY,SAAS,QAAQ,QAAQ,QAAQ,SAAS,SAAS,UAAU;AAC9E,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,iBAAiB,QAAQ,MAAM,GAAG,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvE,cAAM,IAAI;UACR,QAAQ,SAAS,MAAM,cAAc,kBAAkB,wBAAwB;UAC/E;YACE,MAAM,OAAO,SAAS,MAAM;YAC5B,UAAU,GAAG,UAAU,MAAM,IAAI,UAAU,IAAI;YAC/C,YAAY;YACZ;UACF;QACF;MACF;AACA,YAAM,IAAI;QACR,sCAAsC,UAAU,MAAM,IAAI,WAAW;QACrE,GAAG,UAAU,MAAM,IAAI,WAAW;QAClC;MACF;IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,WAAK,YAAY,SAAS,QAAQ,QAAQ,QAAQ,SAAS,SAAS,OAAO,QAAQ,KAAK,OAAO,GAAG;AAClG,YAAM,IAAI;QACR,QAAQ,SAAS,MAAM,cAAc,OAAO,OAAO,eAAe;QAClE;UACE,MAAM,OAAO,SAAS,MAAM;UAC5B,UAAU,GAAG,UAAU,MAAM,IAAI,UAAU,IAAI;UAC/C,YAAY;UACZ;QACF;MACF;IACF;AAEA,UAAM,eAAe,OAAO;AAC5B,SAAK,YAAY,SAAS,QAAQ,QAAQ,QAAQ,SAAS,SAAS,cAAc,OAAO,GAAG;AAE5F,QAAI,gBAAgB,iBAAiB,OAAO,iBAAiB,KAAK;AAChE,WAAK,cAAc,cAAc,OAAO,KAAK,WAAW,OAAO;IACjE;AAEA,WAAO;MACL,UAAU,GAAG,UAAU,MAAM,IAAI,UAAU,IAAI;MAC/C,cAAa,oBAAI,KAAK,GAAE,YAAY;MACpC,MAAO,OAAO,QAAQ;MACtB,KAAK;IACP;EACF;EAEA,MAAc,QACZ,WAC+B;AAC/B,UAAM,cAAc,iBAAiB,UAAU,KAAK;AACpD,UAAM,cAAc,YAAY,SAAS,IAAI,GAAG,UAAU,IAAI,IAAI,WAAW,KAAK,UAAU;AAC5F,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,WAAW;AAChD,UAAM,WAAW,UAAU,OAAO,KAAK,UAAU,UAAU,IAAI,IAAI;AACnE,UAAM,YAAY,OAAO;AAEzB,SAAK,WAAW,UAAU,QAAQ,KAAK,UAAU,IAAI;AAErD,QAAI,UAAU,WAAW;AACvB,YAAM,KAAK,YAAY,QAAQ,UAAU,SAAS;IACpD;AAEA,UAAM,UAAU,IAAI,QAAQ;MAC1B,gBAAgB;MAChB,QAAQ;IACV,CAAC;AAED,QAAI,KAAK,OAAO,WAAW;AACzB,cAAQ,IAAI,cAAc,KAAK,OAAO,SAAS;IACjD;AAEA,QAAI,UAAU,SAAS,WAAW;AAChC,WAAK,eAAe,SAAS,UAAU,QAAQ,aAAa,UAAU,SAAS;IACjF;AAEA,QAAI,KAAK,OAAO,MAAM;AACpB,cAAQ,IAAI,uBAAuB,GAAG;IACxC;AAEA,UAAM,KAAK,KAAK,IAAI;AACpB,QAAI;AACJ,QAAI;AACF,YAAM,eAAwC;QAC5C,QAAQ,UAAU;QAClB;QACA,MAAM,UAAU,WAAW,SAAS,WAAW;QAC/C,QAAQ,YAAY,QAAQ,KAAK,OAAO,SAAS;MACnD;AACA,UAAI,KAAK,YAAY;AACnB,qBAAa,aAAa,KAAK;MACjC;AACA,iBAAW,MAAM,MAAM,KAAK,YAA2B;IACzD,SAAS,OAAO;AACd,UAAI,KAAK,OAAO,SAAS;AACvB,cAAME,WAAU,KAAK,IAAI,IAAI;AAC7B,cAAM,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACnE,aAAK,6BAA6BA,QAAO,OAAO,KAAK,EAAE;MACzD;AACA,YAAM,IAAI;QACR,+BAA+B,UAAU,MAAM,IAAI,WAAW;QAC9D,GAAG,UAAU,MAAM,IAAI,WAAW;QAClC;MACF;IACF;AAEA,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,UAAM,UAAU,eAAe,SAAS,OAAO;AAC/C,WAAO,KAAK,gBAAuB,SAAS,UAAU,SAAS,SAAS,WAAW,WAAW;EAChG;AACF;AInWO,IAAM,qBAAqB;AAa3B,IAAM,YAAY;EACvB,QAAQ;IACN,OAAO;IACP,YAAY;IACZ,QAAQ;EACV;EACA,KAAK;IACH,OAAO;IACP,YAAY;IACZ,QAAQ;EACV;EACA,IAAI;IACF,OAAO;IACP,YAAY;IACZ,QAAQ;EACV;AACF;AAGO,IAAM,WAAW,OAAO,KAAK,SAAS;AAEtC,IAAM,qBAAqB;EAChC;EACA;AACF;AAIO,IAAM,0BAA4C,CAAC,UAAU;AAE7D,IAAM,sBAAsB;EACjC;EACA;AACF;AAIO,IAAM,UAAU;EACrB;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH,GAAG;AACL;AAIO,IAAM,kBAA8B,CAAC,QAAQ,QAAQ,UAAU,WAAW,GAAG,uBAAuB;AChEpG,SAAS,SAAS,OAAyC;AAChE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO,CAAC;EACV;AACA,SAAO;AACT;AAEO,SAAS,WACd,MACA,KACoB;AACpB,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,gBAAgB,cAAc,GAAG,qBAAqB;EAClE;AACA,SAAO;AACT;AAEO,SAAS,WACd,MACA,KACoB;AACpB,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,GAAG;AACpD,UAAM,IAAI,gBAAgB,cAAc,GAAG,qBAAqB;EAClE;AACA,SAAO;AACT;AAEO,SAAS,YACd,MACA,KACqB;AACrB,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;EACT;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,UAAM,IAAI,gBAAgB,cAAc,GAAG,sBAAsB;EACnE;AACA,SAAO;AACT;AAgBO,SAAS,cACd,MACA,KACQ;AACR,QAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,UAAM,IAAI,gBAAgB,+BAA+B,GAAG,IAAI;EAClE;AACA,SAAO;AACT;AAEO,SAAS,WACd,OACA,KACA,QACM;AACN,MAAI,UAAU,QAAW;AACvB;EACF;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,UAAM,IAAI;MACR,cAAc,GAAG,qBAAqB,OAAO,KAAK,IAAI,CAAC;IACzD;EACF;AACF;AAEO,SAAS,cACd,QACyB;AACzB,QAAM,OAAgC,CAAC;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAK,GAAG,IAAI;IACd;EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,UAIN;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AC7GO,IAAM,kBAAkB;EAC7B;EAAM;EAAM;EAAM;EAAO;EACzB;EAAM;EAAM;EAAM;EAAM;EACxB;EAAM;EAAM;EAAM;EAAM;EAAM;AAChC;AAEO,IAAM,iBAAiB;EAC5B;EAAQ;EAAQ;EAAW;EAAU;AACvC;AAEO,SAAS,gBAAgB,KAAa,MAAM,IAAqB;AACtE,SAAO;IACL,KAAK,UAAU,GAAG;IAClB,UAAU;IACV,iBAAiB;EACnB;AACF;AAEO,SAAS,iBAAiB,KAAa,MAAM,IAAqB;AACvE,SAAO;IACL,KAAK,WAAW,GAAG;IACnB,UAAU;IACV,iBAAiB;EACnB;AACF;AAMO,SAAS,cAAc,QAAmB,UAAwB;AACvE,MAAI,OAAO,MAAM;AACf,UAAM,IAAI;MACR,IAAI,QAAQ;MACZ;IACF;EACF;AACF;AC9BA,SAAS,UAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAEO,SAAS,uBAAmC;AACjD,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc,EAAE,KAAK,WAAW,MAAM,KAAK,EAAE,CAAC;UAC9C,iBAAiB,uBAAuB,EAAE;QAC5C;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,OAAO,OAAO,QAAQ,IAAI;MACvC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,KAAK,cAAc,MAAM,KAAK;YAC9B,KAAK,cAAc,MAAM,KAAK;YAC9B,MAAM,cAAc,MAAM,MAAM;YAChC,IAAI,cAAc,MAAM,IAAI;YAC5B,MAAM,WAAW,MAAM,MAAM;YAC7B,SAAS,WAAW,MAAM,SAAS;YACnC,UAAU,WAAW,MAAM,UAAU;UACvC,CAAC;UACD,iBAAiB,oBAAoB,CAAC;QACxC;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;UAC5B;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,QAAQ;MAC/B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,IAAI,WAAW,MAAM,IAAI;YACzB,UAAU,WAAW,MAAM,UAAU;YACrC,KAAK,WAAW,MAAM,KAAK;UAC7B,CAAC;UACD,iBAAiB,wBAAwB,EAAE;QAC7C;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc,EAAE,KAAK,WAAW,MAAM,KAAK,EAAE,CAAC;UAC9C,iBAAiB,6BAA6B,CAAC;QACjD;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,QAAQ,UAAU,QAAQ,WAAW,QAAQ;UACtD;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,YAAY,OAAO;UAC5B;UACA,MAAM;YACJ,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,WAAW,MAAM,UAAU;YACrC,KAAK,WAAW,MAAM,KAAK;YAC3B,SAAS,WAAW,MAAM,SAAS;YACnC,MAAM,WAAW,MAAM,MAAM;YAC7B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO,KAAK;UACtC,CAAC;UACD,iBAAiB,qBAAqB,CAAC;QACzC;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,QAAQ,WAAW,UAAU,QAAQ;YAC5C,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;UAC5B;UACA,MAAM;YACJ,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,WAAW,MAAM,UAAU,KAAK;YAC1C,QAAQ,WAAW,MAAM,QAAQ;YACjC,SAAS,WAAW,MAAM,SAAS;YACnC,MAAM,WAAW,MAAM,MAAM;YAC7B,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO,KAAK;UACtC,CAAC;UACD,iBAAiB,iCAAiC,CAAC;QACrD;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,QAAQ,UAAU,QAAQ,WAAW,QAAQ;UACtD;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU;MACvB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,cAAc,MAAM,UAAU;YACxC,QAAQ,WAAW,MAAM,QAAQ;UACnC,CAAC;UACD,iBAAiB,yBAAyB,CAAC;QAC7C;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY,CAAC;MACf;MACA,SAAS,OAAO,UAAU,YAAY;AACpC,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,CAAC;UACD,iBAAiB,sBAAsB,CAAC;QAC1C;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc,EAAE,KAAK,WAAW,MAAM,KAAK,EAAE,CAAC;UAC9C,iBAAiB,8BAA8B,EAAE;QACnD;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,YAAY,MAAM;YAClC,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,QAAQ;MAC/B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,YAAY,MAAM,YAAY;AACjD,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,KAAK,WAAW,MAAM,KAAK;YAC3B,YAAY,eAAe,SAAY,OAAO,UAAU,IAAI;UAC9D,CAAC;UACD,iBAAiB,8BAA8B,EAAE;QACnD;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,UAAU,QAAQ,WAAW,QAAQ;UAC9C;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,WAAW,MAAM,UAAU;YACrC,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,yBAAyB,EAAE;QAC9C;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,QAAQ,UAAU,QAAQ,WAAW,QAAQ;UACtD;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,YAAY,OAAO;UAC5B;UACA,MAAM;YACJ,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,WAAW,MAAM,UAAU;YACrC,KAAK,WAAW,MAAM,KAAK;YAC3B,SAAS,WAAW,MAAM,SAAS;YACnC,MAAM,WAAW,MAAM,MAAM;YAC7B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO,KAAK;UACtC,CAAC;UACD,iBAAiB,6BAA6B,CAAC;QACjD;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAIF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,SAAS;YACP,MAAM;YACN,MAAM,CAAC,mBAAmB,UAAU;YACpC,aAAa;UACf;QACF;QACA,UAAU,CAAC,SAAS;MACtB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,EAAE,SAAS,cAAc,MAAM,SAAS,EAAE;UAC1C,iBAAiB,6BAA6B,CAAC;QACjD;AACA,eAAO,UAAU,QAAQ;MAC3B;IACF;EACF;AACF;ACrjBA,SAASC,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAEO,SAAS,yBAAqC;AACnD,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAKF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;YAC1B,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,OAAO,MAAM;YACpB,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,KAAK;YAC7B,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,eAAe,KAAK;YAC3B,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,iBAAiB;YACf,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,MAAM;YAC9B,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,iBAAiB;YACf,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,MAAM;YAC9B,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,UAAU,QAAQ,WAAW,IAAI;MACxD;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,KAAK;AACxB,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,MAAM,cAAc,MAAM,MAAM;YAChC,SAAS,WAAW,MAAM,SAAS;YACnC,SAAS,cAAc,MAAM,SAAS;YACtC,IAAI,cAAc,MAAM,IAAI;YAC5B,aAAa,WAAW,MAAM,aAAa;YAC3C,SAAS,WAAW,MAAM,SAAS;YACnC,iBAAiB,WAAW,MAAM,iBAAiB;YACnD,aAAa,WAAW,MAAM,aAAa;YAC3C,SAAS,WAAW,MAAM,SAAS;YACnC,iBAAiB,WAAW,MAAM,iBAAiB;YACnD,YACE,OAAO,eAAe,YAAY,OAAO,UAAU,IAAI;YACzD,SAAS,WAAW,MAAM,SAAS;YACnC,KAAK,QAAQ,OAAO;UACtB,CAAC;UACD,iBAAiB,yBAAyB,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAKF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;YAC1B,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,OAAO,MAAM;YACpB,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,KAAK;YAC7B,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,eAAe;YACb,MAAM;YACN,aAAa;UACf;UACA,gBAAgB;YACd,MAAM;YACN,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,UAAU,QAAQ,IAAI;MAC7C;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,KAAK;AACxB,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,MAAM,cAAc,MAAM,MAAM;YAChC,SAAS,WAAW,MAAM,SAAS;YACnC,SAAS;YACT,IAAI,cAAc,MAAM,IAAI;YAC5B,eAAe,WAAW,MAAM,eAAe;YAC/C,gBAAgB,WAAW,MAAM,gBAAgB;YACjD,UAAU,WAAW,MAAM,UAAU;YACrC,YACE,OAAO,eAAe,YAAY,OAAO,UAAU,IAAI;YACzD,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,8BAA8B,EAAE;QACnD;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;YACb,OAAO;cACL,MAAM;cACN,YAAY;gBACV,QAAQ;kBACN,MAAM;kBACN,aAAa;gBACf;gBACA,QAAQ;kBACN,MAAM;kBACN,aAAa;gBACf;cACF;cACA,UAAU,CAAC,UAAU,QAAQ;YAC/B;UACF;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;UACA,iBAAiB,2BAA2B,EAAE;QAChD;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,WAAW,SAAS;YAC3B,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,eAAe,OAAO,iBAAiB;YAC9C,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,MAAM,CAAC,aAAa,YAAY,cAAc;YAC9C,aACE;UACJ;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAM,YAAY,WAAW;AAC7B,cAAMC,QAAO,YACT,sCACA;AACJ,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,QAAQ,YACV,WAAW,MAAM,OAAO,KAAK,cAC7B;AACJ,cAAM,aAAa,cAAc;UAC/B,UAAU;UACV,QAAQ,WAAW,MAAM,QAAQ;UACjC,QAAQ,WAAW,MAAM,QAAQ;UACjC,OAAO,WAAW,MAAM,OAAO;UAC/B,QAAQ,WAAW,MAAM,QAAQ;UACjC,OAAO,WAAW,MAAM,OAAO;UAC/B;QACF,CAAC;AAED,YAAI,SAAS;AACX,gBAAM,WAAW,MAAM,QAAQ,OAAO;YACpCA;YACA,EAAE,GAAG,YAAY,QAAQ;YACzB,iBAAiB,wBAAwB,EAAE;UAC7C;AACA,iBAAOD,WAAU,QAAQ;QAC3B;AAGA,cAAM,CAAC,IAAI,IAAI,EAAE,IAAI,MAAM,QAAQ,IAAI;UACrC,QAAQ,OAAO,WAAWC,OAAM,EAAE,GAAG,YAAY,SAAS,cAAc,GAAG,iBAAiB,wBAAwB,EAAE,CAAC;UACvH,QAAQ,OAAO,WAAWA,OAAM,EAAE,GAAG,YAAY,SAAS,MAAM,GAAG,iBAAiB,wBAAwB,EAAE,CAAC;UAC/G,QAAQ,OAAO,WAAWA,OAAM,EAAE,GAAG,YAAY,SAAS,kBAAkB,GAAG,iBAAiB,wBAAwB,EAAE,CAAC;QAC7H,CAAC;AACD,cAAM,SAAS;UACb,GAAK,GAAG,QAAsB,CAAC;UAC/B,GAAK,GAAG,QAAsB,CAAC;UAC/B,GAAK,GAAG,QAAsB,CAAC;QACjC;AACA,eAAO,EAAE,UAAU,GAAG,UAAU,aAAa,GAAG,aAAa,MAAM,OAAO;MAC5E;IACF;EACF;AACF;ACvVA,IAAM,kBAAkB,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ,MAAM;AAE9D,SAAS,YAAY,QAAgB,OAAO,GAAa;AACvD,QAAM,QAAkB,CAAC;AACzB,QAAM,MAAM,oBAAI,KAAK;AACrB,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAM,IAAI,IAAI,KAAK,GAAG;AACtB,MAAE,WAAW,IAAI,WAAW,IAAI,CAAC;AACjC,UAAM,OAAO,EAAE,eAAe;AAC9B,UAAM,KAAK,OAAO,EAAE,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACtD,UAAM,KAAK,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACjD,UAAM,KAAK,KAAK,KAAK,QAAQ,SAAS,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;EAC/D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAA4B;AAC/C,QAAM,UAAsB,CAAC;AAC7B,aAAW,YAAY,YAAY,MAAM,GAAG;AAC1C,QAAI;AACJ,QAAI;AACF,gBAAU,GAAG,aAAa,UAAU,MAAM;IAC5C,QAAQ;AACN;IACF;AACA,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AACd,UAAI;AACF,gBAAQ,KAAK,KAAK,MAAM,OAAO,CAAa;MAC9C,QAAQ;MAER;IACF;EACF;AACA,SAAO;AACT;AAEO,SAAS,qBAAiC;AAC/C,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,MAAM,CAAC,QAAQ,QAAQ,SAAS,OAAO;UACzC;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,YAAY;AAC1B,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,QAAQ,KAAK,IAAI,WAAW,MAAM,OAAO,KAAK,IAAI,GAAG;AAC3D,cAAM,aAAa,WAAW,MAAM,MAAM;AAC1C,cAAM,cAAc,WAAW,MAAM,OAAO,GAAG,YAAY;AAC3D,cAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,cAAM,YAAY,QAAQ,IAAI,KAAK,KAAK,EAAE,QAAQ,IAAI;AAEtD,YAAI,UAAU,YAAY,eAAe;AAEzC,YAAI,YAAY;AACd,oBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;QACvD;AACA,YAAI,aAAa;AACf,oBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,WAAW;QACzD;AACA,YAAI,cAAc,QAAW;AAC3B,oBAAU,QAAQ,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK,SAAS;QAC9E;AAGA,gBAAQ;UACN,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;QAC5E;AACA,kBAAU,QAAQ,MAAM,GAAG,KAAK;AAEhC,eAAO,EAAE,SAAS,OAAO,QAAQ,OAAO;MAC1C;IACF;EACF;AACF;AC9FA,SAASD,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAGA,SAAS,eAAe,UAII;AAC1B,QAAM,OAAO,SAAS;AACtB,MAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AAC1C,UAAM,SAAS,KAAK;MAClB,CAAC,SACC,SAAS,QACT,OAAO,SAAS,YAChB,WAAY,QACX,KAAiC,OAAO,MAAM;IACnD;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAME,YAAW,OAAO;QACtB,CAAC,SAAS,IAAI,KAAK,OAAO,CAAC,KAAK,KAAK,MAAM,KAAK,kBAAkB;MACpE;AACA,YAAM,IAAI,YAAYA,UAAS,KAAK,IAAI,GAAG;QACzC,MAAM,OAAO,OAAO,CAAC,EAAG,OAAO,KAAK,EAAE;QACtC,UAAU,SAAS;MACrB,CAAC;IACH;EACF;AACA,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB;EACF;AACF;AAEO,SAAS,oBAAgC;AAC9C,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,aAAa;YACX,MAAM;YACN,MAAM,CAAC,QAAQ,iBAAiB,WAAW;YAC3C,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,UAAU,SAAS;YAC1B,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;UACR;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,aAAa;MAC1B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAMD,QACJ,WAAW,YACP,gDACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ;YACA,QAAQ,WAAW,MAAM,QAAQ;YACjC,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,mBAAmB,EAAE;QACxC;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,aAAa;YACX,MAAM;YACN,MAAM,CAAC,QAAQ,iBAAiB,WAAW;YAC3C,aAAa;UACf;UACA,QAAQ;YACN,MAAM;UACR;QACF;QACA,UAAU,CAAC,eAAe,QAAQ;MACpC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;YACE,aAAa,cAAc,MAAM,aAAa;YAC9C,QAAQ,cAAc,MAAM,QAAQ;UACtC;UACA,iBAAiB,0BAA0B,EAAE;QAC/C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,aAAa;YACX,MAAM;YACN,MAAM,CAAC,QAAQ,iBAAiB,WAAW;YAC3C,aAAa;UACf;UACA,QAAQ;YACN,MAAM;UACR;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,UAAU,MAAM;YACvB,aAAa;UACf;UACA,SAAS;YACP,MAAM;UACR;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,eAAe,QAAQ;MACpC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,aAAa,cAAc,MAAM,aAAa;YAC9C,QAAQ,cAAc,MAAM,QAAQ;YACpC,MAAM,WAAW,MAAM,MAAM,KAAK;YAClC,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,uBAAuB,EAAE;QAC5C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAKF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,MAAM,CAAC,QAAQ,eAAe;YAC9B,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,KAAK,GAAG;YACf,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,WAAW;YACT,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,SAAS;YACjC,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aACE;UAEJ;QACF;QACA,UAAU,CAAC,UAAU,eAAe,SAAS,SAAS,SAAS;MACjE;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,OAAgC,cAAc;UAClD,QAAQ,cAAc,MAAM,QAAQ;UACpC;UACA,OAAO,cAAc,MAAM,OAAO;UAClC,OAAO,cAAc,MAAM,OAAO;UAClC,SAAS,cAAc,MAAM,SAAS;UACtC,SAAS,WAAW,MAAM,SAAS;UACnC,SAAS,WAAW,MAAM,SAAS;UACnC,QAAQ,WAAW,MAAM,QAAQ;UACjC,WAAW,WAAW,MAAM,WAAW;UACvC,OAAO,WAAW,MAAM,OAAO;UAC/B,IAAI,WAAW,MAAM,IAAI;UACzB,KAAK,QAAQ,OAAO;QACtB,CAAC;AACD,YAAI,gBAAgB,iBAAiB;AACnC,eAAK,gBAAgB,CAAC,EAAE,eAAe,SAAS,iBAAiB,UAAU,CAAC;AAC5E,eAAK,UAAU,YAAY,MAAM,SAAS,KAAK;QACjD;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;UACA,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAO,eAAe,QAAQ;MAChC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;UACR;UACA,aAAa;YACX,MAAM;YACN,MAAM,CAAC,QAAQ,iBAAiB,WAAW;YAC3C,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,MAAM,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;YAC9B,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,eAAe,QAAQ;MAC9C;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,CAAC,cAAc;YACb,QAAQ,cAAc,MAAM,QAAQ;YACpC,aAAa,cAAc,MAAM,aAAa;YAC9C,QAAQ,cAAc,MAAM,QAAQ;YACpC,UAAU,WAAW,MAAM,UAAU,KAAK;UAC5C,CAAC,CAAC;UACF,iBAAiB,mBAAmB,EAAE;QACxC;AACA,eAAO,eAAe,QAAQ;MAChC;IACF;EACF;AACF;AChWA,IAAM,OAAO;AAEb,SAASA,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAGA,SAASG,gBAAe,UAII;AAC1B,QAAM,OAAO,SAAS;AACtB,MAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AAC1C,UAAM,SAAS,KAAK;MAClB,CAAC,SACC,SAAS,QACT,OAAO,SAAS,YAChB,WAAY,QACX,KAAiC,OAAO,MAAM;IACnD;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAMD,YAAW,OAAO;QACtB,CAAC,SAAS,IAAI,KAAK,OAAO,CAAC,KAAK,KAAK,MAAM,KAAK,kBAAkB;MACpE;AACA,YAAM,IAAI,YAAYA,UAAS,KAAK,IAAI,GAAG;QACzC,MAAM,OAAO,OAAO,CAAC,EAAG,OAAO,KAAK,EAAE;QACtC,UAAU,SAAS;MACrB,CAAC;IACH;EACF;AACA,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB;EACF;AACF;AAEO,SAAS,mBAA+B;AAC7C,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAKF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC;UAC3E,OAAO,EAAE,MAAM,UAAU,aAAa,gCAAgC;UACtE,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,GAAG,aAAa,wCAAwC;UAC3G,YAAY,EAAE,MAAM,UAAU,aAAa,8BAA8B;UACzE,eAAe,EAAE,MAAM,UAAU,aAAa,wCAAwC;UACtF,OAAO,EAAE,MAAM,UAAU,aAAa,sCAAsC;UAC5E,cAAc,EAAE,MAAM,UAAU,aAAa,8DAA8D;UAC3G,SAAS,EAAE,MAAM,UAAU,aAAa,mFAAmF;UAC3H,aAAa,EAAE,MAAM,UAAU,aAAa,qEAAqE;UACjH,SAAS,EAAE,MAAM,UAAU,aAAa,4EAA4E;UACpH,OAAO,EAAE,MAAM,UAAU,aAAa,+CAA+C;UACrF,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,QAAQ,GAAG,aAAa,sFAAsF;UACxJ,eAAe,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,GAAG,aAAa,iEAAiE;UACxI,iBAAiB,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,SAAS,KAAK,GAAG,SAAS,WAAW,aAAa,8GAA8G;UACrN,WAAW,EAAE,MAAM,UAAU,aAAa,wEAAmE;QAC/G;QACA,UAAU,CAAC,UAAU,SAAS,aAAa,cAAc,iBAAiB,OAAO;MACnF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAG3C,cAAM,kBAAkB,WAAW,MAAM,iBAAiB,KAAK;AAC/D,cAAM,eAAuC;UAC3C,eAAe;UACf;QACF;AACA,YAAI,oBAAoB,SAAS;AAC/B,uBAAa,WAAW,IAAI,cAAc,MAAM,WAAW;QAC7D;AAEA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC,GAAG,IAAI;UACP,cAAc;YACZ;YACA,aAAa;YACb,OAAO,cAAc,MAAM,OAAO;YAClC,WAAW,cAAc,MAAM,WAAW;YAC1C,YAAY,cAAc,MAAM,YAAY;YAC5C,cAAc,WAAW,MAAM,cAAc;YAC7C,eAAe,cAAc,MAAM,eAAe;YAClD,SAAS,WAAW,MAAM,SAAS;YACnC,aAAa,WAAW,MAAM,aAAa;YAC3C,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,cAAc,MAAM,OAAO;YAClC,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,eAAe,WAAW,MAAM,eAAe;YAC/C,eAAe,CAAC,YAAY;UAC9B,CAAC;UACD,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOC,gBAAe,QAAQ;MAChC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,uCAAuC;QAChF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAE3C,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC,GAAG,IAAI;UACP,EAAE,QAAQ,aAAa,eAAe;UACtC,iBAAiB,kBAAkB,EAAE;QACvC;AACA,eAAOA,gBAAe,QAAQ;MAChC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,UAAU,SAAS;YAC1B,aAAa;UACf;UACA,QAAQ,EAAE,MAAM,SAAS;UACzB,QAAQ,EAAE,MAAM,UAAU,aAAa,sDAAsD;UAC7F,OAAO,EAAE,MAAM,UAAU,aAAa,kCAAkC;UACxE,QAAQ,EAAE,MAAM,UAAU,aAAa,iCAAiC;UACxE,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;QACpE;QACA,UAAU,CAAC;MACb;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAE7C,cAAMF,QAAO,WAAW,YAAY,GAAG,IAAI,kBAAkB,GAAG,IAAI;AACpE,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ,aAAa;YACb,QAAQ,WAAW,MAAM,QAAQ;YACjC,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,kBAAkB,EAAE;QACvC;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,SAAS;QAC3B;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAE3C,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC,GAAG,IAAI;UACP,EAAE,QAAQ,aAAa,eAAe;UACtC,iBAAiB,yBAAyB,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,+BAA+B;UACtE,SAAS,EAAE,MAAM,UAAU,aAAa,gEAAgE;UACxG,OAAO,EAAE,MAAM,UAAU,aAAa,qFAAgF;UACtH,QAAQ,EAAE,MAAM,UAAU,aAAa,qFAAgF;UACvH,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;QACpE;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,cAAM,UAAU,WAAW,MAAM,SAAS;AAE1C,YAAI,SAAS;AAEX,gBAAMI,YAAW,MAAM,QAAQ,OAAO;YACpC,GAAG,IAAI;YACP,cAAc;cACZ;cACA,aAAa;cACb;cACA,OAAO,WAAW,MAAM,OAAO;YACjC,CAAC;YACD,iBAAiB,sBAAsB,EAAE;UAC3C;AACA,iBAAOJ,WAAUI,SAAQ;QAC3B;AAEA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC,GAAG,IAAI;UACP,cAAc;YACZ;YACA,aAAa;YACb,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,sBAAsB,EAAE;QAC3C;AACA,eAAOJ,WAAU,QAAQ;MAC3B;IACF;EACF;AACF;ACpRO,SAAS,mBAA+B;AAC7C,SAAO;IACL,GAAG,kBAAkB;IACrB,GAAG,iBAAiB;EACtB;AACF;ACEO,SAAS,oBAAgC;AAC9C,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc,EAAE,KAAK,WAAW,MAAM,KAAK,EAAE,CAAC;UAC9C,iBAAiB,4BAA4B,CAAC;QAChD;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,aACE;UACJ;QACF;QACA,UAAU,CAAC,OAAO,KAAK;MACzB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,sBAAc,QAAQ,QAAQ,uBAAuB;AACrD,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,KAAK,cAAc,MAAM,KAAK;YAC9B,KAAK,cAAc,MAAM,KAAK;YAC9B,MAAM;YACN,MAAM,WAAW,MAAM,MAAM,KAAK;UACpC,CAAC;UACD,iBAAiB,yBAAyB,CAAC;QAC7C;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,OAAO,KAAK;MACzB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,sBAAc,QAAQ,QAAQ,qBAAqB;AACnD,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,KAAK,cAAc,MAAM,KAAK;YAC9B,KAAK,cAAc,MAAM,KAAK;YAC9B,MAAM;UACR,CAAC;UACD,iBAAiB,uBAAuB,CAAC;QAC3C;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,OAAO,MAAM;MAC1B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,sBAAc,QAAQ,QAAQ,uBAAuB;AACrD,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;YACE,KAAK,cAAc,MAAM,KAAK;YAC9B,MAAM,cAAc,MAAM,MAAM;UAClC;UACA,iBAAiB,yBAAyB,CAAC;QAC7C;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,4BAA4B,CAAC;QAChD;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc,EAAE,KAAK,WAAW,MAAM,KAAK,EAAE,CAAC;UAC9C,gBAAgB,iCAAiC,CAAC;QACpD;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,gBAAgB,iCAAiC,CAAC;QACpD;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;EACF;AACF;AC5PA,IAAM,qBAAqB,CAAC,WAAW,MAAM;AAE7C,SAASA,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAEO,SAAS,uBAAmC;AACjD,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;YAC1B,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,OAAO,MAAM;YACpB,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,KAAK;YAC7B,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,UAAU,SAAS,aAAa,OAAO,KAAK;YACnD,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,UAAU,QAAQ,WAAW,IAAI;MACxD;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,KAAK;AACxB,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,YAAY,cAAc,EAAE,aAAa,SAAS,aAAa,QAAQ,CAAC;AAC9E,cAAM,iBAAiB,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,CAAC,SAAS,IAAI;AACzE,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,MAAM,cAAc,MAAM,MAAM;YAChC,SAAS,WAAW,MAAM,SAAS;YACnC,SAAS,cAAc,MAAM,SAAS;YACtC,IAAI,cAAc,MAAM,IAAI;YAC5B,IAAI,WAAW,MAAM,IAAI;YACzB,YAAY,OAAO,eAAe,YAAY,OAAO,UAAU,IAAI;YACnE,SAAS,WAAW,MAAM,SAAS;YACnC,KAAK,QAAQ,OAAO;YACpB;UACF,CAAC;UACD,iBAAiB,uBAAuB,EAAE;QAC5C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,wBAAwB,EAAE;QAC7C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,QAAQ,WAAW,SAAS;YACnC,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,kBAAkB;YAC5B,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAM,WAAW,WAAW,MAAM,UAAU,KAAK;AACjD,mBAAW,UAAU,YAAY,kBAAkB;AACnD,cAAMC,QACJ,WAAW,YACP,yCACA,WAAW,YACT,iCACA;AACR,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ;YACA,QAAQ,WAAW,MAAM,QAAQ;YACjC,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,sBAAsB,EAAE;QAC3C;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,kBAAkB;YAC5B,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,WAAW,MAAM,UAAU,KAAK;AACjD,mBAAW,UAAU,YAAY,kBAAkB;AACnD,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ;YACA,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,yBAAyB,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,kBAAkB;YAC5B,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,YAAY,MAAM,SAAS,KAAK;AAChD,cAAM,WAAW,WAAW,MAAM,UAAU,KAAK;AACjD,mBAAW,UAAU,YAAY,kBAAkB;AACnD,cAAMC,QAAO,UAAU,gCAAgC;AACvD,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ;YACA,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO,MAAM,UAAU,KAAK;UACtD,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;EACF;AACF;AC9XO,SAAS,2BAAuC;AACrD,SAAO;;;;IAIL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,WAAW;YACT,MAAM;YACN,aAAa;UACf;UACA,cAAc;YACZ,MAAM;YACN,aACE;UACJ;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,WAAW,WAAW,MAAM,WAAW;YACvC,cAAc,WAAW,MAAM,cAAc;YAC7C,KAAK,WAAW,MAAM,KAAK;UAC7B,CAAC;UACD,iBAAiB,2BAA2B,CAAC;QAC/C;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;;;;IAKA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,WAAW;YACT,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aACE;YACF,OAAO;cACL,MAAM;cACN,YAAY;gBACV,KAAK,EAAE,MAAM,UAAU,aAAa,qBAAqB;gBACzD,KAAK,EAAE,MAAM,UAAU,aAAa,mBAAmB;cACzD;cACA,UAAU,CAAC,OAAO,KAAK;YACzB;UACF;UACA,MAAM;YACJ,MAAM;YACN,aACE;UACJ;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,aAAa,YAAY;MACtC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,sBAAc,QAAQ,QAAQ,uBAAuB;AACrD,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,WAAW,cAAc,MAAM,WAAW;YAC1C,YAAY,KAAK;YACjB,MAAM,WAAW,MAAM,MAAM;YAC7B,KAAK,WAAW,MAAM,KAAK;UAC7B,CAAC;UACD,iBAAiB,yBAAyB,CAAC;QAC7C;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;;;;IAKA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,cAAc;YACZ,MAAM;YACN,aAAa;UACf;UACA,kBAAkB;YAChB,MAAM;YACN,aACE;UACJ;QACF;QACA,UAAU,CAAC,SAAS,cAAc;MACpC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,sBAAc,QAAQ,QAAQ,qBAAqB;AACnD,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,OAAO,cAAc,MAAM,OAAO;YAClC,cAAc,cAAc,MAAM,cAAc;YAChD,kBAAkB,YAAY,MAAM,kBAAkB;UACxD,CAAC;UACD,iBAAiB,uBAAuB,CAAC;QAC3C;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;;;;IAKA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,cAAc;YACZ,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,SAAS,cAAc;MACpC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,sBAAc,QAAQ,QAAQ,qBAAqB;AACnD,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;YACE,OAAO,cAAc,MAAM,OAAO;YAClC,cAAc,cAAc,MAAM,cAAc;UAClD;UACA,iBAAiB,uBAAuB,CAAC;QAC3C;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;;;;IAKA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,WAAW;YACT,MAAM;YACN,aAAa;UACf;UACA,cAAc;YACZ,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aACE;UACJ;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,WAAW,WAAW,MAAM,WAAW;YACvC,cAAc,WAAW,MAAM,cAAc;YAC7C,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,kCAAkC,CAAC;QACtD;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;;;;IAKA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,WAAW;YACT,MAAM;YACN,aAAa;UACf;UACA,cAAc;YACZ,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,WAAW,WAAW,MAAM,WAAW;YACvC,cAAc,WAAW,MAAM,cAAc;YAC7C,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,kCAAkC,CAAC;QACtD;AACA,eAAO,kBAAkB,QAAQ;MACnC;IACF;EACF;AACF;AC5SA,SAASA,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAEO,SAAS,sBAAkC;AAChD,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,EAAE,QAAQ,cAAc,MAAM,QAAQ,EAAE;UACxC,gBAAgB,qBAAqB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,cAAc;UAC1B;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU;MACvB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,cAAc,MAAM,UAAU;YACxC,KAAK,WAAW,MAAM,KAAK;YAC3B,YAAY,WAAW,MAAM,YAAY;UAC3C,CAAC;UACD,gBAAgB,sBAAsB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,IAAI,WAAW,MAAM,IAAI;UAC3B,CAAC;UACD,gBAAgB,wBAAwB,EAAE;QAC5C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAIF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,MAAM,CAAC,GAAG,eAAe;YACzB,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,YAAY,YAAY,MAAM,SAAS,KAAK;AAClD,cAAMC,QAAO,YACT,mCACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,gBAAgB,sBAAsB,EAAE;QAC1C;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,cAAc;UAC1B;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU;MACvB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,cAAc,MAAM,UAAU;YACxC,QAAQ,WAAW,MAAM,QAAQ;YACjC,KAAK,WAAW,MAAM,KAAK;YAC3B,YAAY,WAAW,MAAM,YAAY;UAC3C,CAAC;UACD,gBAAgB,0BAA0B,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAIF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,YAAY,YAAY,MAAM,SAAS,KAAK;AAClD,YAAI,WAAW;AACb,gBAAMI,YAAW,MAAM,QAAQ,OAAO;YACpC;YACA,cAAc;cACZ,QAAQ,cAAc,MAAM,QAAQ;cACpC,OAAO,WAAW,MAAM,OAAO;cAC/B,QAAQ,WAAW,MAAM,QAAQ;cACjC,OAAO,WAAW,MAAM,OAAO,KAAK;YACtC,CAAC;YACD,gBAAgB,2BAA2B,EAAE;UAC/C;AACA,iBAAOJ,WAAUI,SAAQ;QAC3B;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,EAAE,QAAQ,cAAc,MAAM,QAAQ,EAAE;UACxC,gBAAgB,2BAA2B,EAAE;QAC/C;AACA,eAAOJ,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,UAAU,QAAQ,WAAW,QAAQ;UAC9C;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;UACR;QACF;QACA,UAAU,CAAC,UAAU;MACvB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,cAAc,MAAM,UAAU;YACxC,QAAQ,WAAW,MAAM,QAAQ;YACjC,KAAK,WAAW,MAAM,KAAK;YAC3B,YAAY,WAAW,MAAM,YAAY;UAC3C,CAAC;UACD,gBAAgB,yBAAyB,EAAE;QAC7C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAEF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO,KAAK;UACtC,CAAC;UACD,gBAAgB,qBAAqB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,WAAW,MAAM,QAAQ;YACjC,UAAU,WAAW,MAAM,UAAU;UACvC,CAAC;UACD,gBAAgB,2BAA2B,EAAE;QAC/C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAIF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,MAAM,CAAC,GAAG,eAAe;YACzB,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,YAAY,YAAY,MAAM,SAAS,KAAK;AAClD,cAAMC,QAAO,YACT,yCACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,gBAAgB,4BAA4B,EAAE;QAChD;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,EAAE,QAAQ,cAAc,MAAM,QAAQ,EAAE;UACxC,gBAAgB,0BAA0B,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAGF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,QAAQ,WAAW,QAAQ;UACpC;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;UACR;QACF;QACA,UAAU,CAAC,UAAU;MACvB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU,cAAc,MAAM,UAAU;YACxC,QAAQ,WAAW,MAAM,QAAQ;YACjC,KAAK,WAAW,MAAM,KAAK;YAC3B,YAAY,WAAW,MAAM,YAAY;UAC3C,CAAC;UACD,gBAAgB,4BAA4B,EAAE;QAChD;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;EACF;AACF;AC/fA,SAASA,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAEO,SAAS,sBAAkC;AAChD,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,UAAU;YAClC,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,OAAO,MAAM;UACtB;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,UAAU,SAAS,aAAa,OAAO,KAAK;YACnD,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,UAAU,QAAQ,WAAW,IAAI;MACxD;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,KAAK;AACxB,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,MAAM,cAAc,MAAM,MAAM;YAChC,SAAS,cAAc,MAAM,SAAS;YACtC,IAAI,cAAc,MAAM,IAAI;YAC5B,IAAI,WAAW,MAAM,IAAI;YACzB,YAAY,OAAO,eAAe,YAAY,OAAO,UAAU,IAAI;YACnE,SAAS,WAAW,MAAM,SAAS;YACnC,KAAK,QAAQ,OAAO;UACtB,CAAC;UACD,iBAAiB,sBAAsB,EAAE;QAC3C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,8BAA8B;UACrE,OAAO,EAAE,MAAM,SAAS;UACxB,SAAS,EAAE,MAAM,SAAS;QAC5B;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,uBAAuB,EAAE;QAC5C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;YACb,OAAO,EAAE,MAAM,SAAS;UAC1B;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;UACA,iBAAiB,uBAAuB,EAAE;QAC5C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,8BAA8B;UACrE,OAAO,EAAE,MAAM,SAAS;UACxB,SAAS,EAAE,MAAM,SAAS;UAC1B,OAAO,EAAE,MAAM,UAAU,aAAa,4CAA4C;UAClF,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY;QACpD;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,sBAAsB,EAAE;QAC3C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,8BAA8B;UACrE,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B;UACjE,SAAS,EAAE,MAAM,UAAU,aAAa,2BAA2B;QACrE;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,QAAQ,WAAW,SAAS;YACnC,aAAa;UACf;UACA,KAAK,EAAE,MAAM,UAAU,aAAa,kCAAkC;UACtE,QAAQ,EAAE,MAAM,UAAU,aAAa,oBAAoB;UAC3D,SAAS,EAAE,MAAM,UAAU,aAAa,oBAAoB;UAC5D,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;UACxD,OAAO,EAAE,MAAM,UAAU,aAAa,mCAAmC;UACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,kCAAkC;UACzE,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;UACxD,KAAK,EAAE,MAAM,UAAU,aAAa,gBAAgB;UACpD,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;QACpE;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAMC,QACJ,WAAW,YACP,yCACA,WAAW,YACT,iCACA;AACR,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ,UAAU;YACV,KAAK,WAAW,MAAM,KAAK;YAC3B,QAAQ,WAAW,MAAM,QAAQ;YACjC,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,8BAA8B;UACrE,KAAK,EAAE,MAAM,UAAU,aAAa,qCAAqC;QAC3E;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU;YACV,QAAQ,WAAW,MAAM,QAAQ;YACjC,KAAK,WAAW,MAAM,KAAK;UAC7B,CAAC;UACD,iBAAiB,wBAAwB,EAAE;QAC7C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,QAAQ,EAAE,MAAM,UAAU,aAAa,oBAAoB;UAC3D,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;UACxD,OAAO,EAAE,MAAM,UAAU,aAAa,kCAAkC;UACxE,QAAQ,EAAE,MAAM,UAAU,aAAa,iCAAiC;UACxE,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;UACxD,KAAK,EAAE,MAAM,UAAU,aAAa,gBAAgB;UACpD,OAAO,EAAE,MAAM,UAAU,aAAa,cAAc;QACtD;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,YAAY,MAAM,SAAS,KAAK;AAChD,cAAMC,QAAO,UAAU,gCAAgC;AACvD,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ,UAAU;YACV,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO,MAAM,UAAU,KAAK;UACtD,CAAC;UACD,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,KAAK;MAClB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,UAAU;YACV,KAAK,cAAc,MAAM,KAAK;YAC9B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,0BAA0B,EAAE;QAC/C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,KAAK;MAClB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,KAAK,cAAc,MAAM,KAAK;YAC9B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;EACF;AACF;ACzYA,SAASA,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAEO,SAAS,yBAAqC;AACnD,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,UAAU;YAClC,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,OAAO,MAAM;UACtB;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,UAAU,SAAS,aAAa,OAAO,KAAK;YACnD,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,UAAU,QAAQ,WAAW,IAAI;MACxD;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,YAAY,cAAc,EAAE,aAAa,SAAS,aAAa,QAAQ,CAAC;AAC9E,cAAM,iBAAiB,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,CAAC,SAAS,IAAI;AACzE,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,MAAM,cAAc,MAAM,MAAM;YAChC,SAAS,cAAc,MAAM,SAAS;YACtC,IAAI,cAAc,MAAM,IAAI;YAC5B,IAAI,WAAW,MAAM,IAAI;YACzB,SAAS,WAAW,MAAM,SAAS;YACnC,KAAK,QAAQ,OAAO;YACpB;UACF,CAAC;UACD,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;UACA,OAAO;YACL,MAAM;UACR;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,YAAY,WAAW,MAAM,YAAY;UAC3C,CAAC;UACD,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,QAAQ,WAAW,SAAS;YACnC,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAMC,QACJ,WAAW,YACP,yCACA,WAAW,YACT,iCACA;AACR,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ,UAAU;YACV,QAAQ,WAAW,MAAM,QAAQ;YACjC,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,mBAAmB,EAAE;QACxC;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,UAAU;YAClC,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,OAAO,MAAM;UACtB;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,eAAe,KAAK;YAC3B,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,QAAQ,WAAW,IAAI;MAC9C;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,WAAW,MAAM,QAAQ,KAAK;YACtC,MAAM,cAAc,MAAM,MAAM;YAChC,SAAS,cAAc,MAAM,SAAS;YACtC,IAAI,cAAc,MAAM,IAAI;YAC5B,aAAa,WAAW,MAAM,aAAa;YAC3C,SAAS,WAAW,MAAM,SAAS;YACnC,aAAa,WAAW,MAAM,aAAa;YAC3C,SAAS,WAAW,MAAM,SAAS;YACnC,KAAK,QAAQ,OAAO;UACtB,CAAC;UACD,iBAAiB,yBAAyB,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB;UACvD,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB;UACvD,OAAO,EAAE,MAAM,SAAS;UACxB,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB;UACtE,YAAY,EAAE,MAAM,UAAU,aAAa,gCAAgC;UAC3E,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB;UACtE,YAAY,EAAE,MAAM,UAAU,aAAa,gCAAgC;QAC7E;QACA,UAAU,CAAC,UAAU,QAAQ;MAC/B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,gBAAgB,WAAW,MAAM,gBAAgB;YACjD,YAAY,WAAW,MAAM,YAAY;YACzC,gBAAgB,WAAW,MAAM,gBAAgB;YACjD,YAAY,WAAW,MAAM,YAAY;UAC3C,CAAC;UACD,iBAAiB,yBAAyB,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,QAAQ;MAC/B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;YACE;cACE,QAAQ,cAAc,MAAM,QAAQ;cACpC,QAAQ,cAAc,MAAM,QAAQ;YACtC;UACF;UACA,iBAAiB,0BAA0B,EAAE;QAC/C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,WAAW,SAAS;YAC3B,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,eAAe,KAAK;YAC3B,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,MAAM,CAAC,aAAa,YAAY,cAAc;YAC9C,aACE;UACJ;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAM,YAAY,WAAW;AAC7B,cAAMC,QAAO,YACT,sCACA;AACJ,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,QAAQ,YACV,WAAW,MAAM,OAAO,KAAK,cAC7B;AACJ,cAAM,aAAa,cAAc;UAC/B,UAAU;UACV,QAAQ,WAAW,MAAM,QAAQ;UACjC,OAAO,WAAW,MAAM,OAAO;UAC/B,QAAQ,WAAW,MAAM,QAAQ;UACjC,OAAO,WAAW,MAAM,OAAO;UAC/B;QACF,CAAC;AAED,YAAI,SAAS;AACX,gBAAM,WAAW,MAAM,QAAQ,OAAO;YACpCA;YACA,EAAE,GAAG,YAAY,QAAQ;YACzB,iBAAiB,wBAAwB,EAAE;UAC7C;AACA,iBAAOD,WAAU,QAAQ;QAC3B;AAGA,cAAM,CAAC,IAAI,EAAE,IAAI,MAAM,QAAQ,IAAI;UACjC,QAAQ,OAAO,WAAWC,OAAM,EAAE,GAAG,YAAY,SAAS,cAAc,GAAG,iBAAiB,wBAAwB,EAAE,CAAC;UACvH,QAAQ,OAAO,WAAWA,OAAM,EAAE,GAAG,YAAY,SAAS,MAAM,GAAG,iBAAiB,wBAAwB,EAAE,CAAC;QACjH,CAAC;AACD,cAAM,SAAS;UACb,GAAK,GAAG,QAAsB,CAAC;UAC/B,GAAK,GAAG,QAAsB,CAAC;QACjC;AACA,eAAO,EAAE,UAAU,GAAG,UAAU,aAAa,GAAG,aAAa,MAAM,OAAO;MAC5E;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAIF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,YAAY,MAAM,SAAS,KAAK;AAChD,cAAMA,QAAO,UAAU,gCAAgC;AACvD,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ,UAAU;YACV,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO,MAAM,UAAU,KAAK;UACtD,CAAC;UACD,iBAAiB,kBAAkB,EAAE;QACvC;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,UAAU,OAAO;YACjC,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aACE;YACF,OAAO;cACL,MAAM;YACR;UACF;QACF;QACA,UAAU,CAAC,UAAU,QAAQ;MAC/B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,QAAQ,UAAU,CAAC,SAAS,UAAU,OAAO,CAAC;AACzD,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,cAAsC;UAC1C,OAAO;UACP,QAAQ;UACR,OAAO;QACT;AACA,cAAM,OACJ,WAAW,UACP,OAAO,IAAI,CAAC,UAAmB;AAC7B,gBAAM,IAAI,SAAS,KAAK;AACxB,gBAAM,cAAc,WAAW,GAAG,aAAa;AAC/C,gBAAM,UAAU,WAAW,GAAG,SAAS;AACvC,gBAAM,cAAc,WAAW,GAAG,aAAa;AAC/C,gBAAM,UAAU,WAAW,GAAG,SAAS;AACvC,gBAAM,YAAY,cAAc,EAAE,aAAa,SAAS,aAAa,QAAQ,CAAC;AAC9E,gBAAM,iBACJ,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,CAAC,SAAS,IAAI;AACpD,iBAAO,cAAc;YACnB,QAAQ,cAAc,GAAG,QAAQ;YACjC,QAAQ,WAAW,GAAG,QAAQ,KAAK;YACnC,MAAM,cAAc,GAAG,MAAM;YAC7B,SAAS,cAAc,GAAG,SAAS;YACnC,IAAI,cAAc,GAAG,IAAI;YACzB,IAAI,WAAW,GAAG,IAAI;YACtB,SAAS,WAAW,GAAG,SAAS;YAChC,KAAK,QAAQ,OAAO;YACpB;UACF,CAAC;QACH,CAAC,IACA;AACP,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC,YAAY,MAAM;UAClB;UACA,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,kBAAkB,EAAE;QACvC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;YACb,OAAO,EAAE,MAAM,SAAS;UAC1B;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;UACA,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;YACb,OAAO,EAAE,MAAM,SAAS;UAC1B;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;UACA,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;EACF;AACF;ACrtBA,IAAM,kBAAkB,CAAC,QAAQ,SAAS;AAE1C,SAASA,WAAU,UAIS;AAC1B,SAAO;IACL,UAAU,SAAS;IACnB,aAAa,SAAS;IACtB,MAAM,SAAS;EACjB;AACF;AAEO,SAAS,yBAAqC;AACnD,SAAO;IACL;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;YAC1B,aAAa;UACf;UACA,MAAM;YACJ,MAAM;YACN,MAAM,CAAC,OAAO,MAAM;YACpB,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,KAAK;YAC7B,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,UAAU,SAAS,aAAa,OAAO,KAAK;YACnD,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,IAAI;YACF,MAAM;YACN,aAAa;UACf;UACA,YAAY;YACV,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,aAAa;YACX,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,UAAU,QAAQ,WAAW,IAAI;MACxD;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,KAAK;AACxB,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,YAAY,cAAc,EAAE,aAAa,SAAS,aAAa,QAAQ,CAAC;AAC9E,cAAM,iBAAiB,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,CAAC,SAAS,IAAI;AACzE,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,MAAM,cAAc,MAAM,MAAM;YAChC,SAAS,WAAW,MAAM,SAAS;YACnC,SAAS,cAAc,MAAM,SAAS;YACtC,IAAI,cAAc,MAAM,IAAI;YAC5B,IAAI,WAAW,MAAM,IAAI;YACzB,YAAY,OAAO,eAAe,YAAY,OAAO,UAAU,IAAI;YACnE,SAAS,WAAW,MAAM,SAAS;YACnC,KAAK,QAAQ,OAAO;YACpB;UACF,CAAC;UACD,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,QAAQ,WAAW,SAAS;YACnC,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,eAAe;YACzB,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAM,WAAW,WAAW,MAAM,UAAU,KAAK;AACjD,mBAAW,UAAU,YAAY,eAAe;AAChD,cAAMC,QACJ,WAAW,YACP,yCACA,WAAW,YACT,iCACA;AACR,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ;YACA,QAAQ,WAAW,MAAM,QAAQ;YACjC,SAAS,WAAW,MAAM,SAAS;YACnC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,mBAAmB,EAAE;QACxC;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,eAAe;YACzB,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;UACR;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,WAAW,MAAM,UAAU,KAAK;AACjD,mBAAW,UAAU,YAAY,eAAe;AAChD,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ;YACA,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;UACjC,CAAC;UACD,iBAAiB,sBAAsB,EAAE;QAC3C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;UAC5B;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,KAAK;YAC7B,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,SAAS,SAAS;MACzC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,cAAc,MAAM,OAAO;YAClC,SAAS,cAAc,MAAM,SAAS;YACtC,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB;UAC5D,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB;UACvD,OAAO,EAAE,MAAM,UAAU,aAAa,4CAA4C;UAClF,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB;UACtE,YAAY,EAAE,MAAM,UAAU,aAAa,gCAAgC;UAC3E,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB;UACtE,YAAY,EAAE,MAAM,UAAU,aAAa,gCAAgC;QAC7E;QACA,UAAU,CAAC,UAAU,QAAQ;MAC/B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,gBAAgB,WAAW,MAAM,gBAAgB;YACjD,YAAY,WAAW,MAAM,YAAY;YACzC,gBAAgB,WAAW,MAAM,gBAAgB;YACjD,YAAY,WAAW,MAAM,YAAY;UAC3C,CAAC;UACD,iBAAiB,yBAAyB,EAAE;QAC9C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MAIF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,UAAU;YACR,MAAM;YACN,MAAM,CAAC,GAAG,eAAe;YACzB,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,KAAK;YACH,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;QACF;MACF;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,YAAY,MAAM,SAAS,KAAK;AAChD,cAAM,WAAW,WAAW,MAAM,UAAU,KAAK;AACjD,mBAAW,UAAU,YAAY,eAAe;AAChD,cAAMC,QAAO,UAAU,gCAAgC;AACvD,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpCA;UACA,cAAc;YACZ;YACA,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,OAAO,WAAW,MAAM,OAAO;YAC/B,QAAQ,WAAW,MAAM,QAAQ;YACjC,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,WAAW,MAAM,KAAK;YAC3B,OAAO,WAAW,MAAM,OAAO,MAAM,UAAU,KAAK;UACtD,CAAC;UACD,iBAAiB,kBAAkB,EAAE;QACvC;AACA,eAAOD,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,OAAO;YACL,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,OAAO,WAAW,MAAM,OAAO;YAC/B,SAAS,WAAW,MAAM,SAAS;UACrC,CAAC;UACD,iBAAiB,kBAAkB,EAAE;QACvC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;UAC5B;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,QAAQ,SAAS,KAAK;YAC7B,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,aAAa;UACf;QACF;QACA,UAAU,CAAC,UAAU,SAAS;MAChC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,KAAK;AACrB,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,SAAS,cAAc,MAAM,SAAS;YACtC,SAAS,WAAW,MAAM,SAAS;YACnC,SAAS,OAAO,YAAY,YAAY,OAAO,OAAO,IAAI;YAC1D,SAAS,WAAW,MAAM,SAAS;YACnC,KAAK,QAAQ,OAAO;UACtB,CAAC;UACD,iBAAiB,uBAAuB,EAAE;QAC5C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,MAAM,CAAC,SAAS,UAAU,OAAO;UACnC;UACA,QAAQ;YACN,MAAM;YACN,aACE;YACF,OAAO;cACL,MAAM;YACR;UACF;QACF;QACA,UAAU,CAAC,UAAU,QAAQ;MAC/B;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,QAAQ,UAAU,CAAC,SAAS,UAAU,OAAO,CAAC;AACzD,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,cAAsC;UAC1C,OAAO;UACP,QAAQ;UACR,OAAO;QACT;AACA,cAAM,OACJ,WAAW,UACP,OAAO,IAAI,CAAC,UAAmB;AAC7B,gBAAM,IAAI,SAAS,KAAK;AACxB,gBAAM,cAAc,WAAW,GAAG,aAAa;AAC/C,gBAAM,UAAU,WAAW,GAAG,SAAS;AACvC,gBAAM,cAAc,WAAW,GAAG,aAAa;AAC/C,gBAAM,UAAU,WAAW,GAAG,SAAS;AACvC,gBAAM,YAAY,cAAc,EAAE,aAAa,SAAS,aAAa,QAAQ,CAAC;AAC9E,gBAAM,iBACJ,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,CAAC,SAAS,IAAI;AACpD,gBAAM,aAAa,EAAE;AACrB,iBAAO,cAAc;YACnB,QAAQ,cAAc,GAAG,QAAQ;YACjC,QAAQ,cAAc,GAAG,QAAQ;YACjC,MAAM,cAAc,GAAG,MAAM;YAC7B,SAAS,cAAc,GAAG,SAAS;YACnC,IAAI,cAAc,GAAG,IAAI;YACzB,IAAI,WAAW,GAAG,IAAI;YACtB,SAAS,WAAW,GAAG,SAAS;YAChC,YACE,OAAO,eAAe,YAAY,OAAO,UAAU,IAAI;YACzD,SAAS,WAAW,GAAG,SAAS;YAChC,KAAK,QAAQ,OAAO;YACpB;UACF,CAAC;QACH,CAAC,IACA;AACP,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC,YAAY,MAAM;UAClB;UACA,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;UACf;UACA,SAAS;YACP,MAAM;YACN,MAAM,CAAC,SAAS,UAAU;UAC5B;QACF;QACA,UAAU,CAAC,UAAU,SAAS;MAChC;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA,cAAc;YACZ,QAAQ,cAAc,MAAM,QAAQ;YACpC,SAAS,cAAc,MAAM,SAAS;UACxC,CAAC;UACD,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;YACb,OAAO,EAAE,MAAM,SAAS;UAC1B;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;UACA,iBAAiB,oBAAoB,EAAE;QACzC;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;IACA;MACE,MAAM;MACN,QAAQ;MACR,aACE;MACF,SAAS;MACT,aAAa;QACX,MAAM;QACN,YAAY;UACV,QAAQ;YACN,MAAM;YACN,aAAa;YACb,OAAO,EAAE,MAAM,SAAS;UAC1B;QACF;QACA,UAAU,CAAC,QAAQ;MACrB;MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,gBAAM,IAAI,MAAM,mCAAmC;QACrD;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;UACpC;UACA;UACA,iBAAiB,qBAAqB,EAAE;QAC1C;AACA,eAAOA,WAAU,QAAQ;MAC3B;IACF;EACF;AACF;ACxqBA,SAAS,eAA2B;AAClC,SAAO;IACL,GAAG,oBAAoB;IACvB,GAAG,uBAAuB;IAC1B,GAAG,uBAAuB;IAC1B,GAAG,qBAAqB;IACxB,GAAG,oBAAoB;IACvB,GAAG,uBAAuB;IAC1B,GAAG,qBAAqB;IACxB,GAAG,iBAAiB;IACpB,GAAG,kBAAkB;IACrB,GAAG,yBAAyB;IAC5B,GAAG,mBAAmB;EACxB;AACF;AAwBO,SAAS,iBAAiB,QAAuB,QAA+B;AACrF,QAAM,aAAwB,EAAE,GAAG,QAAQ,SAAS,CAAC,GAAG,OAAO,GAAiB,UAAU,MAAM;AAChG,QAAM,QAAQ,aAAa;AAC3B,QAAM,UAAU,IAAI,IAAsB,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvE,SAAO,OAAO,UAAkB,SAAwC;AACtE,UAAM,OAAO,QAAQ,IAAI,QAAQ;AACjC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,iBAAiB,QAAQ,EAAE;AACtD,UAAM,SAAS,MAAM,KAAK,QAAQ,MAAM,EAAE,QAAQ,YAAY,OAAO,CAAC;AACtE,WAAO;EACT;AACF;AE1CO,SAAS,iBAAyB;AACvC,SAAO,KAAK,QAAQ,GAAG,QAAQ,aAAa;AAC9C;AAMO,SAAS,iBAAgC;AAC9C,QAAMK,QAAO,eAAe;AAC5B,MAAI,CAAC,WAAWA,KAAI,EAAG,QAAO,EAAE,UAAU,CAAC,EAAE;AAC7C,QAAM,MAAM,aAAaA,OAAM,OAAO;AACtC,SAAO,MAAM,GAAG;AAClB;AAMO,SAAS,gBAAgB,aAAkC;AAChE,QAAM,SAAS,eAAe;AAC9B,QAAM,OAAO,eAAe,OAAO,mBAAmB;AACtD,SAAO,OAAO,WAAW,IAAI,KAAK,CAAC;AACrC;AAMO,SAAS,gBAAgB,QAA6B;AAC3D,QAAMA,QAAO,eAAe;AAC5B,QAAM,MAAM,QAAQA,KAAI;AACxB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;EACpC;AACA,gBAAcA,OAAM,UAAU,MAA4C,GAAG,OAAO;AACtF;ACzBA,IAAM,eAAe,QAAQ;EAC3B,CAAC,MAAM,CAAC,mBAAmB,SAAS,CAAmB,KAAK,CAAC,oBAAoB,SAAS,CAAoB;AAChH;AAMA,SAAS,gBAAgB,UAAqC;AAE5D,MAAI,aAAa,MAAO,QAAO,CAAC,GAAG,cAAc,GAAG,kBAAkB;AACtE,MAAI,aAAa,UAAU,aAAa,WAAY,QAAO,CAAC,GAAG,mBAAmB;AAClF,MAAI,aAAa,MAAO,QAAO,CAAC,GAAG,uBAAuB;AAC1D,MAAI,aAAa,UAAW,QAAO,CAAC,GAAG,kBAAkB;AACzD,SAAO;AACT;AAEA,SAAS,gBAAgB,YAAiC;AACxD,MAAI,CAAC,cAAc,WAAW,KAAK,EAAE,WAAW,GAAG;AACjD,WAAO,CAAC,GAAG,eAAe;EAC5B;AAEA,QAAM,UAAU,WAAW,KAAK,EAAE,YAAY;AAC9C,MAAI,YAAY,OAAO;AAGrB,WAAO,CAAC,GAAG,cAAc,GAAG,kBAAkB;EAChD;AAEA,QAAM,YAAY,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACxE,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,CAAC,GAAG,eAAe;EAC5B;AAEA,QAAM,UAAU,oBAAI,IAAc;AAClC,aAAW,YAAY,WAAW;AAChC,UAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAI,UAAU;AACZ,eAAS,QAAQ,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAC1C;IACF;AACA,QAAI,CAAC,QAAQ,SAAS,QAAoB,GAAG;AAC3C,YAAM,IAAI;QACR,mBAAmB,QAAQ;QAC3B,eAAe,QAAQ,KAAK,IAAI,CAAC;MACnC;IACF;AACA,YAAQ,IAAI,QAAoB;EAClC;AAEA,SAAO,MAAM,KAAK,OAAO;AAC3B;AAEA,SAAS,gBAAgB,MAAkG;AACzH,QAAM,SAAS,QAAQ,IAAI,aAAa,KAAK,KAAK,KAAK;AACvD,QAAM,YAAY,QAAQ,IAAI,gBAAgB,KAAK,KAAK,KAAK;AAC7D,QAAM,aAAa,QAAQ,IAAI,gBAAgB,KAAK,KAAK,KAAK;AAC9D,QAAM,UAAU,QAAQ,UAAU,aAAa,UAAU;AACzD,QAAM,cAAc,QAAQ,MAAM,KAAK,QAAQ,SAAS,KAAK,QAAQ,UAAU;AAC/E,MAAI,eAAe,CAAC,SAAS;AAC3B,UAAM,IAAI;MACR;MACA;IACF;EACF;AACA,SAAO,EAAE,QAAQ,WAAW,YAAY,QAAQ;AAClD;AAEA,SAAS,YAAY,SAAkB,UAA2B;AAChE,QAAM,UAAU,SAAS,KAAK,KAAK,QAAQ,IAAI,UAAU,KAAK,KAAK,YAAY;AAC/E,MAAI,CAAC,SAAS,SAAS,OAAiB,GAAG;AACzC,UAAM,IAAI;MACR,iBAAiB,OAAO;MACxB,eAAe,SAAS,KAAK,IAAI,CAAC;IACpC;EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAc,aAA8B;AAClE,QAAM,aACJ,QAAQ,IAAI,kBAAkB,KAAK,KAAK,eAAe,UAAU,IAAI,EAAE;AACzE,MAAI,CAAC,WAAW,WAAW,SAAS,KAAK,CAAC,WAAW,WAAW,UAAU,GAAG;AAC3E,UAAM,IAAI;MACR,qBAAqB,UAAU;MAC/B;IACF;EACF;AACA,SAAO,WAAW,QAAQ,QAAQ,EAAE;AACtC;AAkBO,SAAS,WAAW,KAA4B;AACrD,QAAM,OAAO,gBAAgB,IAAI,OAAO;AACxC,QAAM,QAAQ,gBAAgB,IAAI;AAElC,QAAM,OACJ,IAAI,QACJ,QAAQ,IAAI,aAAa,OACzB,QAAQ,IAAI,aAAa,WACxB,KAAK,QAAQ;AAEhB,QAAM,OAAO,YAAY,IAAI,MAAM,KAAK,IAAI;AAC5C,QAAM,UAAU,eAAe,MAAM,KAAK,QAAQ;AAElD,QAAM,aAAa,QAAQ,IAAI,iBAC3B,OAAO,QAAQ,IAAI,cAAc,IAChC,KAAK,cAAc;AACxB,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,GAAG;AACnD,UAAM,IAAI;MACR,0BAA0B,UAAU;MACpC;IACF;EACF;AAGA,QAAM,cAAc,KAAK,WAAW,KAAK;AACzC,MAAI,eAAe,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC,YAAY,WAAW,UAAU,GAAG;AAC5F,UAAM,IAAI;MACR,sBAAsB,WAAW;MACjC;IACF;EACF;AAEA,SAAO;IACL,GAAG;IACH;IACA,WAAW,KAAK,MAAM,UAAU;IAChC,SAAS,gBAAgB,IAAI,OAAO;IACpC,UAAU,IAAI;IACd;IACA;IACA,WAAW,IAAI;IACf,WAAW,IAAI,aAAa;IAC5B,UAAU,eAAe;IACzB,SAAS,IAAI,WAAW;EAC1B;AACF;ACtLA,IAAM,aAAaC,MAAKC,SAAQ,GAAG,QAAQ,mBAAmB;AAC9D,IAAM,oBAAoB,KAAK,KAAK,KAAK;AASzC,SAAS,YAAyB;AAChC,MAAI;AACF,QAAIC,YAAW,UAAU,GAAG;AAC1B,aAAO,KAAK,MAAMC,cAAa,YAAY,OAAO,CAAC;IACrD;EACF,QAAQ;EAER;AACA,SAAO,CAAC;AACV;AAEA,SAAS,WAAW,OAA0B;AAC5C,MAAI;AACFC,eAAUJ,MAAKC,SAAQ,GAAG,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACtDI,mBAAc,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;EACnE,QAAQ;EAER;AACF;AAEA,SAAS,eAAe,SAAiB,QAAyB;AAChE,QAAMC,SAAQ,CAAC,MACb,EACG,QAAQ,MAAM,EAAE,EAChB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAC/B,QAAM,CAAC,MAAM,MAAM,IAAI,IAAIA,OAAM,OAAO;AACxC,QAAM,CAAC,MAAM,MAAM,IAAI,IAAIA,OAAM,MAAM;AACvC,MAAI,SAAS,KAAM,QAAO,OAAO;AACjC,MAAI,SAAS,KAAM,QAAO,OAAO;AACjC,SAAO,OAAO;AAChB;AAEA,eAAe,mBAAmB,aAA6C;AAC7E,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AACzD,UAAM,MAAM,MAAM,MAAM,8BAA8B,mBAAmB,WAAW,CAAC,WAAW;MAC9F,QAAQ,WAAW;MACnB,SAAS,EAAE,QAAQ,mBAAmB;IACxC,CAAC;AACD,iBAAa,OAAO;AACpB,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW;EACzB,QAAQ;AACN,WAAO;EACT;AACF;AAEA,SAAS,yBAAyB,aAA2B;AAC3D,qBAAmB,WAAW,EAC3B,KAAK,CAAC,WAAW;AAChB,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,UAAU;AACxB,UAAM,WAAW,IAAI,EAAE,eAAe,QAAQ,WAAW,KAAK,IAAI,EAAE;AACpE,eAAW,KAAK;EAClB,CAAC,EACA,MAAM,MAAM;EAEb,CAAC;AACL;AAOO,SAAS,gBAAgB,aAAqB,gBAA8B;AACjF,QAAM,QAAQ,UAAU;AACxB,QAAM,QAAQ,MAAM,WAAW;AAE/B,MAAI,SAAS,eAAe,gBAAgB,MAAM,aAAa,GAAG;AAChE,YAAQ,OAAO;MACb;uBAA0B,WAAW,KAAK,cAAc,WAAM,MAAM,aAAa;sBACxD,WAAW;;;IACtC;EACF;AAEA,MAAI,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,YAAY,mBAAmB;AAC9D,6BAAyB,WAAW;EACtC;AACF;AElFA,IAAM,eAAyC;EAC7C,kBAAkB;EAClB,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,eAAe;AACjB;AAEO,IAAM,oBAAoB,OAAO,KAAK,YAAY;AAEzD,SAAS,UAAkB;AACzB,SAAO,QAAQ,IAAI,WAAgB,WAAQ,YAAQ,GAAG,WAAW,SAAS;AAC5E;AAEA,IAAM,qBAAqB;AAQ3B,SAAS,wBAAuC;AAC9C,QAAM,eAAe,QAAQ,IAAI,gBAAqB,WAAQ,YAAQ,GAAG,WAAW,OAAO;AAC3F,QAAM,cAAmB,WAAK,cAAc,UAAU;AACtD,MAAI;AACF,UAAM,UAAa,gBAAY,WAAW;AAC1C,UAAM,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,SAAS,CAAC;AAC7D,QAAI,WAAW;AACb,YAAM,aAAkB;QACtB;QAAa;QAAW;QAAc;QAAW;QAAU;MAC7D;AAEA,UAAO,eAAW,UAAU,KAAQ,eAAgB,cAAQ,UAAU,CAAC,GAAG;AACxE,eAAO;MACT;IACF;EACF,QAAQ;EAER;AACA,SAAO;AACT;AAEO,SAAS,cAAc,QAAiC;AAC7D,QAAM,OAAU,YAAQ;AACxB,QAAM,WAAW,QAAQ;AACzB,UAAQ,QAAQ;IACd,KAAK;AACH,UAAI,aAAa,SAAS;AAExB,eAAO,sBAAsB,KAAU,WAAK,QAAQ,GAAG,UAAU,kBAAkB;MACrF;AACA,UAAI,aAAa,UAAU;AACzB,eAAY,WAAK,MAAM,WAAW,uBAAuB,UAAU,kBAAkB;MACvF;AAEA,aAAY,WAAK,QAAQ,IAAI,mBAAwB,WAAK,MAAM,SAAS,GAAG,UAAU,kBAAkB;IAC1G,KAAK;AACH,aAAY,WAAK,MAAM,WAAW,UAAU;IAC9C,KAAK;AACH,aAAY,WAAK,MAAM,YAAY,YAAY,iBAAiB;IAClE,KAAK;AACH,aAAY,WAAK,QAAQ,IAAI,GAAG,WAAW;IAC7C,KAAK;AACH,aAAO;EACX;AACF;AAEA,IAAM,cAAc;AAEpB,SAAS,WACP,QACA,MACyB;AACzB,MAAI,WAAW,UAAU;AAEvB,WAAO,EAAE,MAAM,SAAS,SAAS,iBAAiB,KAAK;EACzD;AAIA,SAAO,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,EAAE;AAC9D;AAEA,SAAS,UAAU,SAAiC;AAClD,QAAM,OAAiB,CAAC;AACxB,MAAI,QAAQ,QAAS,MAAK,KAAK,aAAa,QAAQ,OAAO;AAC3D,OAAK,KAAK,aAAa,QAAQ,WAAW,KAAK;AAC/C,SAAO;AACT;AAEA,SAAS,gBACP,YACA,YACA,OACM;AACN,QAAM,MAAW,cAAQ,UAAU;AACnC,MAAI,CAAI,eAAW,GAAG,EAAM,CAAA,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAE9D,MAAI,OAAgC,CAAC;AACrC,MAAO,eAAW,UAAU,GAAG;AAC7B,UAAM,MAAS,iBAAa,YAAY,OAAO;AAC/C,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;IACvB,QAAQ;AACN,YAAM,IAAI,MAAM,sCAAsC,UAAU,EAAE;IACpE;AAEA,UAAM,aAAa,aAAa;AAC7B,IAAA,iBAAa,YAAY,UAAU;AACtC,YAAQ,OAAO,MAAM,mBAAc,UAAU;CAAI;EACnD;AAEA,MAAI,OAAO,KAAK,eAAe,YAAY,KAAK,eAAe,MAAM;AACnE,SAAK,aAAa,CAAC;EACrB;AACC,OAAK,WAAuC,UAAU,IAAI;AAExD,EAAA,kBAAc,YAAY,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AAC5E;AAEO,SAAS,kBAAwB;AACtC,UAAQ,OAAO;IACb;;;IAEE,kBAAkB,IAAI,CAAC,OAAO,KAAK,GAAG,OAAO,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,IACjF;;;oCACqC,eAAe,CAAC;;;EAEzD;AACF;AAEO,SAAS,SAAS,SAA6B;AACpD,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,OAAO,aAAa,MAAM;AAChC,QAAM,OAAO,UAAU,OAAO;AAC9B,QAAM,aAAa,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,KAAK;AAE1E,MAAI,WAAW,eAAe;AAC5B,UAAM,aAAa;MACjB;MACA;MACA;MACA;MACA;MACA;MACA;MACA,GAAG;IACL;AACA,YAAQ,OAAO,MAAM,mBAAmB,WAAW,KAAK,GAAG,CAAC;CAAI;AAChE,iBAAa,UAAU,YAAY,EAAE,OAAO,UAAU,CAAC;AACvD,YAAQ,OAAO,MAAM,qBAAgB,IAAI;CAAI;AAC7C;EACF;AAEA,QAAM,aAAa,cAAc,MAAM;AACvC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,GAAG,IAAI,oCAAoC;EAC7D;AAEA,QAAM,QAAQ,WAAW,QAAQ,IAAI;AACrC,kBAAgB,YAAY,YAAY,KAAK;AAC7C,UAAQ,OAAO;IACb,qBAAgB,IAAI;IACb,UAAU;iBACG,KAAK,KAAK,GAAG,CAAC;;EACpC;AACA,MAAI,WAAW,UAAU;AACvB,YAAQ,OAAO,MAAM,aAAa,IAAI;CAAsB;EAC9D;AACF;;;ASxLA,OAAO,SAAS;AAChB,OAAO,SAAS;AAChB,OAAOC,SAAQ;AACf,OAAO,SAAS;AAChB,SAAS,qBAAqB;AAI9B,IAAM,WAAW,cAAc,YAAY,GAAG;AAE9C,SAAS,iBAAyB;AAChC,aAAW,OAAO,CAAC,mBAAmB,oBAAoB,GAAG;AAC3D,QAAI;AACF,aAAQ,SAAS,GAAG,EAA0B;AAAA,IAChD,SAAS,MAAe;AAAA,IAExB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,cAAc,eAAe;AAGnC,IAAM,WAAmB,OAAsC,YAAe;AAQ9E,IAAM,SAAN,MAAa;AAAA,EACH,QAAsB,CAAC;AAAA,EAE/B,IAAI,KAAa,OAAqB;AACpC,SAAK,MAAM,KAAK,EAAE,KAAK,MAAM,CAAC;AAAA,EAChC;AAAA,EAEA,QAAc;AACZ,UAAM,IAAI,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;AAClD,UAAM,MAAM,SAAS,OAAO,EAAE;AAC9B,MAAE;AAAA,kDAAqD,IAAI,MAAM,EAAE,CAAC;AAAA,CAAI;AACxE,eAAW,EAAE,KAAK,MAAM,KAAK,KAAK,OAAO;AACvC,QAAE,KAAK,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK;AAAA,CAAI;AAAA,IACpC;AACA,MAAE,KAAK,GAAG;AAAA;AAAA,CAAM;AAAA,EAClB;AACF;AAMA,SAAS,GAAG,OAAe,QAAsB;AAC/C,UAAQ,OAAO,MAAM,YAAY,MAAM,OAAO,EAAE,CAAC,IAAI,MAAM;AAAA,CAAI;AACjE;AAEA,SAAS,KAAK,OAAe,QAAgB,OAAuB;AAClE,UAAQ,OAAO,MAAM,YAAY,MAAM,OAAO,EAAE,CAAC,IAAI,MAAM;AAAA,CAAI;AAC/D,aAAW,QAAQ,OAAO;AACxB,YAAQ,OAAO,MAAM,cAAc,IAAI;AAAA,CAAI;AAAA,EAC7C;AACF;AAEA,SAAS,QAAQ,OAAqB;AACpC,UAAQ,OAAO,MAAM;AAAA,IAAO,KAAK;AAAA,CAAI;AACvC;AAEA,SAASC,SAAQ,KAAiC;AAChD,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;AAC/C;AAQA,eAAe,SAAS,UAAwC;AAC9D,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI;AACF,UAAM,YAAY,MAAM,IAAI,SAAS,QAAQ;AAC7C,WAAO,EAAE,IAAI,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG;AAAA,EAC3D,SAAS,GAAG;AACV,WAAO,EAAE,IAAI,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE;AAAA,EAC7F;AACF;AAEA,eAAe,YACb,UACA,cACA,WACsB;AACtB,QAAM,KAAK,KAAK,IAAI;AACpB,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,SAAS,SAAS;AACxB,UAAM,UAAU,MAAY;AAAE,aAAO,mBAAmB;AAAG,aAAO,QAAQ;AAAA,IAAG;AAC7E,WAAO,KAAK,cAAc,MAAM;AAC9B,cAAQ;AACR,cAAQ,EAAE,IAAI,MAAM,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAAA,IAC3C,CAAC;AACD,WAAO,KAAK,WAAW,MAAM;AAC3B,cAAQ;AACR,cAAQ,EAAE,IAAI,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,mBAAmB,SAAS,KAAK,CAAC;AAAA,IACrF,CAAC;AACD,WAAO,KAAK,SAAS,CAAC,QAAe;AACnC,cAAQ;AACR,cAAQ,EAAE,IAAI,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,QAAQ,CAAC;AAAA,IAChE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,SAAS,UAAkB,MAAc,YAAY,KAA4B;AAC9F,SAAO;AAAA,IACL,MAAM,IAAI,iBAAiB,EAAE,MAAM,UAAU,MAAM,SAAS,UAAU,CAAC;AAAA,IACvE;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,SAAS,UAAkB,MAAc,YAAY,KAA4B;AAC9F,SAAO;AAAA,IACL,MAAM,IAAI,QAAQ,EAAE,MAAM,UAAU,MAAM,SAAS,WAAW,YAAY,SAAS,CAAC;AAAA,IACpF;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,cAAc,QAAsB;AAC3C,QAAM,YAAY,QAAQ,IAAI,cAAc,QAAQ,IAAI;AACxD,QAAM,aAAa,QAAQ,IAAI,eAAe,QAAQ,IAAI;AAC1D,QAAM,UAAU,QAAQ,IAAI,YAAY,QAAQ,IAAI;AACpD,MAAI,aAAa,YAAY;AAC3B,OAAG,cAAc,aAAa,WAAW;AACzC,OAAG,eAAe,cAAc,WAAW;AAC3C,QAAI,QAAS,IAAG,YAAY,OAAO;AACnC,WAAO,IAAI,cAAc,aAAa,GAAG;AACzC,WAAO,IAAI,eAAe,cAAc,GAAG;AAC3C,QAAI,QAAS,QAAO,IAAI,YAAY,OAAO;AAAA,EAC7C,OAAO;AACL,OAAG,SAAS,QAAQ;AACpB,WAAO,IAAI,SAAS,MAAM;AAAA,EAC5B;AACF;AAEA,SAAS,iBAAiB,QAAyB;AACjD,MAAI,SAAS;AACb,UAAQ,aAAa;AAErB,QAAM,cAAc,QAAQ;AAC5B,QAAM,YAAY,SAAS,YAAY,MAAM,CAAC,GAAG,EAAE;AACnD,MAAI,aAAa,IAAI;AACnB,OAAG,WAAW,GAAG,WAAW,mBAAmB;AAAA,EACjD,OAAO;AACL,SAAK,WAAW,GAAG,WAAW,qBAAqB,CAAC,iCAAiC,CAAC;AACtF,aAAS;AAAA,EACX;AACA,KAAG,OAAO,IAAI,WAAW,KAAK,QAAQ,GAAG;AACzC,KAAG,MAAM,GAAG,QAAQ,QAAQ,IAAI,QAAQ,IAAI,EAAE;AAC9C,KAAG,cAAcC,IAAG,QAAQ,CAAC;AAC7B,KAAG,SAAS,QAAQ,IAAI,SAAS,WAAW;AAC5C,KAAG,UAAU,GAAG,QAAQ,IAAI,QAAQ,QAAQ,IAAI,UAAU,WAAW,EAAE;AACvE,KAAG,YAAY,KAAK,eAAe,EAAE,gBAAgB,EAAE,QAAQ;AAE/D,SAAO,IAAI,OAAO,GAAG,WAAW,KAAK,QAAQ,GAAG;AAChD,SAAO,IAAI,QAAQ,GAAG,WAAW,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI,EAAE;AAEvE,QAAM,UAAU,OAAOA,IAAG,YAAY,aAAaA,IAAG,QAAQ,IAAI,QAAQ;AAC1E,SAAO,IAAI,MAAM,GAAGA,IAAG,KAAK,CAAC,IAAIA,IAAG,QAAQ,CAAC,IAAI,OAAO,EAAE;AAC1D,SAAO,IAAI,SAAS,QAAQ,IAAI,SAAS,GAAG;AAC5C,SAAO,IAAI,UAAU,QAAQ,IAAI,QAAQ,QAAQ,IAAI,UAAU,GAAG;AAClE,SAAO,IAAI,MAAM,KAAK,eAAe,EAAE,gBAAgB,EAAE,QAAQ;AAEjE,gBAAc,MAAM;AAEpB,SAAO;AACT;AAEA,SAAS,YAAY,QAAmB,SAAiB,QAAyB;AAChF,MAAI,SAAS;AACb,UAAQ,oBAAoB,OAAO,GAAG;AAEtC,MAAI,OAAO,SAAS;AAClB,OAAG,WAAWD,SAAQ,OAAO,MAAM,CAAC;AACpC,OAAG,UAAU,MAAM;AACnB,OAAG,cAAc,MAAM;AAAA,EACzB,OAAO;AACL,SAAK,eAAe,kBAAkB;AAAA,MACpC;AAAA,MACA;AAAA,IACF,CAAC;AACD,aAAS;AAAA,EACX;AACA,KAAG,aAAa,OAAO,OAAO,IAAI,CAAC;AACnC,KAAG,QAAQ,OAAO,IAAI;AACtB,KAAG,YAAY,OAAO,OAAO;AAC7B,KAAG,WAAW,GAAG,OAAO,SAAS,IAAI;AAErC,SAAO,IAAI,WAAW,OAAO;AAC7B,SAAO,IAAI,QAAQ,OAAO,IAAI;AAC9B,SAAO,IAAI,QAAQ,OAAO,OAAO;AACjC,SAAO,IAAI,QAAQ,OAAO,UAAU,aAAaA,SAAQ,OAAO,MAAM,CAAC,MAAM,OAAO;AACpF,SAAO,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACtC,SAAO,IAAI,WAAW,GAAG,OAAO,SAAS,IAAI;AAE7C,SAAO;AACT;AAEA,eAAe,YACb,UAAkB,MAAc,UAAkB,QAChC;AAClB,MAAI,SAAS;AACb,QAAM,YAAY,MAAM,SAAS,UAAU,IAAI;AAC/C,MAAI,UAAU,IAAI;AAChB,OAAG,eAAe,QAAQ,IAAI,KAAK,UAAU,EAAE,KAAK;AACpD,WAAO,IAAI,OAAO,GAAG,IAAI,QAAQ,UAAU,EAAE,KAAK;AAAA,EACpD,OAAO;AACL,SAAK,eAAe,QAAQ,IAAI,WAAW,UAAU,KAAK,IAAI;AAAA,MAC5D;AAAA,MACA,eAAe,QAAQ,IAAI,IAAI;AAAA,IACjC,CAAC;AACD,WAAO,IAAI,OAAO,QAAQ,IAAI,IAAI,UAAU,KAAK,KAAK,UAAU,EAAE,KAAK;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,UAAU;AACzB,UAAM,YAAY,MAAM,SAAS,UAAU,IAAI;AAC/C,QAAI,UAAU,IAAI;AAChB,SAAG,iBAAiB,IAAI,UAAU,EAAE,KAAK;AACzC,aAAO,IAAI,OAAO,OAAO,UAAU,EAAE,KAAK;AAAA,IAC5C,OAAO;AACL,WAAK,iBAAiB,UAAU,SAAS,UAAU;AAAA,QACjD;AAAA,MACF,CAAC;AACD,eAAS;AACT,aAAO,IAAI,OAAO,QAAQ,UAAU,KAAK,KAAK,UAAU,EAAE,KAAK;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,aAAa,QAAmB,QAAuB,QAAkC;AACtG,MAAI,SAAS;AACb,UAAQ,SAAS;AAEjB,QAAM,MAAM,IAAI,IAAI,OAAO,OAAO;AAClC,QAAM,WAAW,IAAI;AACrB,QAAM,cAAc,IAAI,aAAa,WAAW,MAAM;AACtD,QAAM,OAAO,IAAI,OAAO,SAAS,IAAI,MAAM,EAAE,IAAI;AAEjD,QAAM,YAAY,MAAM,SAAS,QAAQ;AACzC,MAAI,UAAU,IAAI;AAChB,OAAG,eAAe,GAAG,QAAQ,WAAW,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK;AAC1E,WAAO,IAAI,OAAO,GAAG,QAAQ,WAAW,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK;AAAA,EAC5E,OAAO;AACL,SAAK,eAAe,GAAG,QAAQ,WAAW,UAAU,KAAK,IAAI;AAAA,MAC3D;AAAA,MACA,iBAAiB,QAAQ;AAAA,IAC3B,CAAC;AACD,aAAS;AACT,WAAO,IAAI,OAAO,QAAQ,QAAQ,IAAI,UAAU,KAAK,KAAK,UAAU,EAAE,KAAK;AAAA,EAC7E;AAEA,MAAI,UAAU,IAAI;AAChB,UAAM,eAAe,MAAM,YAAY,UAAU,MAAM,IAAI,UAAU,MAAM;AAC3E,QAAI,CAAC,aAAc,UAAS;AAAA,EAC9B;AAGA,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI;AACF,UAAM,OAAO,UAAU,qBAAqB;AAC5C,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,OAAG,oBAAoB,QAAQ,EAAE,KAAK;AACtC,WAAO,IAAI,OAAO,qBAAqB,EAAE,KAAK;AAAA,EAChD,SAAS,GAAG;AACV,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,SAAK,oBAAoB,KAAK;AAAA,MAC5B;AAAA,MACA,aAAa,OAAO,OAAO;AAAA,IAC7B,CAAC;AACD,aAAS;AACT,WAAO,IAAI,OAAO,qBAAqB,GAAG,KAAK,EAAE,KAAK;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,KAAuB;AAC3C,MAAI,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,uBAAuB,GAAG;AAClE,WAAO,CAAC,iCAAiC,kDAAkD;AAAA,EAC7F;AACA,MAAI,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,cAAc,GAAG;AACzD,WAAO,CAAC,yCAAyC,0DAA0D;AAAA,EAC7G;AACA,MAAI,IAAI,SAAS,OAAO,GAAG;AACzB,WAAO,CAAC,yBAAyB;AAAA,EACnC;AACA,MAAI,IAAI,SAAS,OAAO,GAAG;AACzB,WAAO,CAAC,sCAAsC,0DAA0D;AAAA,EAC1G;AACA,SAAO,CAAC,uCAAuC;AACjD;AAEA,eAAe,UAAU,QAAuB,QAAmB,QAAkC;AACnG,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,IAAI,YAAY,0BAA0B;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,UAAQ,gBAAgB;AAExB,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI;AACF,UAAM,OAAO,WAAW,yBAAyB;AACjD,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,OAAG,mBAAmB,QAAQ,EAAE,KAAK;AACrC,QAAI,OAAO,MAAM;AACf,SAAG,eAAe,wBAAwB;AAAA,IAC5C;AACA,WAAO,IAAI,YAAY,yBAAyB,EAAE,KAAK;AAAA,EACzD,SAAS,GAAG;AACV,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,QAAQ,aAAa,GAAG;AAC9B,SAAK,mBAAmB,KAAK,KAAK;AAClC,aAAS;AACT,WAAO,IAAI,YAAY,yBAAyB,GAAG,KAAK,EAAE,KAAK;AAAA,EACjE;AAEA,SAAO;AACT;AAMA,eAAsB,YAAY,QAAmB,SAAgC;AACnF,UAAQ,OAAO,MAAM,iCAAiC;AACtD,UAAQ,OAAO,MAAM,4JAA4J;AAEjL,QAAM,SAAS,IAAI,OAAO;AAC1B,SAAO,IAAI,OAAM,oBAAI,KAAK,GAAE,YAAY,CAAC;AAEzC,QAAM,YAAY,iBAAiB,MAAM;AACzC,QAAM,YAAY,YAAY,QAAQ,SAAS,MAAM;AACrD,QAAM,SAAS,IAAI,cAAc,MAAM;AACvC,QAAM,YAAY,MAAM,aAAa,QAAQ,QAAQ,MAAM;AAC3D,QAAM,aAAa,MAAM,UAAU,QAAQ,QAAQ,MAAM;AAEzD,QAAM,YAAY,aAAa,aAAa,aAAa;AAGzD,UAAQ,OAAO,MAAM,IAAI;AACzB,MAAI,WAAW;AACb,YAAQ,OAAO,MAAM,sCAAsC;AAAA,EAC7D,OAAO;AACL,YAAQ,OAAO,MAAM,uCAAuC;AAC5D,YAAQ,WAAW;AAAA,EACrB;AAEA,SAAO,IAAI,UAAU,YAAY,SAAS,MAAM;AAChD,SAAO,MAAM;AACf;;;ACrWO,SAAS,kBAAkB,MAAqC;AACrE,SAAO,WAAW;AAAA,IAChB,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,UAAU,KAAK,YAAY;AAAA,IAC3B,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,SAAS,KAAK;AAAA,EAChB,CAAC;AACH;;;AC9BA,YAAYE,SAAQ;AAQpB,IAAM,qBAAiC,CAAC,kBAAkB,UAAU,UAAU;AAKvE,SAAS,eAAe,SAA6B;AAC1D,WAAS,OAAO;AAClB;AAMO,SAAS,kBAAwB;AACtC,QAAM,WAA6C,CAAC;AACpD,aAAW,MAAM,oBAAoB;AACnC,UAAM,IAAI,cAAc,EAAE;AAC1B,QAAI,KAAQ,eAAW,CAAC,GAAG;AACzB,eAAS,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,YAAQ,OAAO,MAAM;AAAA,CAAqB;AAC1C,eAAW,EAAE,IAAI,MAAAC,MAAK,KAAK,UAAU;AACnC,cAAQ,OAAO,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,IAAIA,KAAI;AAAA,CAAI;AAAA,IACrD;AACA,YAAQ,OAAO,MAAM;AAAA,CAAI;AAAA,EAC3B;AAEA,kBAAgB;AAClB;;;ACRA,IAAM,YAAsB;AAAA,EAC1B,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,eAAe;AAAA,QACb,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,MACR,SAAS;AAAA,QACP,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,qBAAqB;AAAA,QACnB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,qBAAqB;AAAA,QACnB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,kBAAkB;AAAA,QAChB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,kBAAkB;AAAA,QAChB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,QACJ,aAAa;AAAA,QACb,UAAU;AAAA,UACR,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,MACR,WAAW;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,QACJ,aAAa;AAAA,QACb,UAAU;AAAA,UACR,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,WAAW;AAAA,MACT,SAAS;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,UACR,SAAS;AAAA,YACP,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,UAAU;AAAA,YACR,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,YAAY;AAAA,YACV,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,mBAAmB;AAAA,YACjB,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,gBAAgB;AAAA,YACd,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,gBAAgB;AAAA,YACd,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,UACR,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,UAAU;AAAA,YACR,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,SAAS;AAAA,YACP,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK;AAAA,IACH,aAAa;AAAA,IACb,WAAW;AAAA,MACT,MAAM;AAAA,QACJ,aAAa;AAAA,QACb,UAAU;AAAA,UACR,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,SAAS;AAAA,YACP,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,cAAc;AAAA,YACZ,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,MAAM;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,aAAa;AAAA,QACb,UAAU;AAAA,UACR,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,SAAS;AAAA,YACP,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,cAAc;AAAA,YACZ,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA,MAAM;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,aAAa,qCAAqC,eAAe,CAAC;AAAA,MACpE;AAAA,MACA,KAAK;AAAA,QACH,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,aAAa;AAAA,IACb,OAAO,uBAAuB,kBAAkB,KAAK,GAAG,CAAC;AAAA,EAC3D;AAAA,EAEA,UAAU;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AACF;AAOA,SAAS,kBAAwB;AAC/B,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iDAAiD,eAAe,CAAC;AAAA,IACjE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW;AACjB,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,KAAK,KAAK,KAAK,OAAO,QAAQ,CAAC,GAAG,MAAM,WAAW,EAAE;AAAA,EAC7D;AAEA,QAAM,KAAK,IAAI,iDAAiD,EAAE;AAClE,UAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC;AACvC;AAGA,SAAS,gBAAgB,YAA0B;AACjD,QAAM,QAAQ,UAAU,UAAU;AAClC,MAAI,CAAC,OAAO;AACV,YAAQ,OAAO,MAAM,mBAAmB,UAAU;AAAA,CAAI;AACtD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,aAAa,OAAO,KAAK,MAAM,SAAS,EAAE,SAAS;AAC9E,QAAM,cAAc,MAAM,YAAY,OAAO,KAAK,MAAM,QAAQ,EAAE,SAAS;AAE3E,QAAM,QAAkB,CAAC,EAAE;AAE3B,MAAI,gBAAgB,CAAC,aAAa;AAEhC,UAAM,gBAAgB,OAAO,KAAK,MAAM,SAAU;AAClD,UAAM,KAAK,cAAc,UAAU,gCAAgC;AACnE,UAAM,KAAK,IAAI,GAAG,MAAM,WAAW,KAAK,EAAE;AAC1C,UAAM,KAAK,aAAa;AACxB,UAAM,WAAW,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;AACnE,eAAW,CAAC,QAAQ,EAAE,KAAK,OAAO,QAAQ,MAAM,SAAU,GAAG;AAC3D,YAAM,KAAK,KAAK,OAAO,OAAO,QAAQ,CAAC,GAAG,GAAG,WAAW,EAAE;AAAA,IAC5D;AACA,UAAM,KAAK,IAAI,YAAY,UAAU,kCAAkC;AAAA,EACzE,WAAW,gBAAgB,aAAa;AAEtC,UAAM,KAAK,cAAc,UAAU,qBAAqB;AACxD,UAAM,KAAK,IAAI,GAAG,MAAM,WAAW,KAAK,IAAI,WAAW;AACvD,qBAAiB,OAAO,MAAM,QAAS;AACvC,UAAM,KAAK,IAAI,YAAY;AAC3B,UAAM,kBAAkB,OAAO,QAAQ,MAAM,SAAU;AACvD,UAAM,WAAW,KAAK,IAAI,GAAG,gBAAgB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;AACvE,eAAW,CAAC,QAAQ,EAAE,KAAK,iBAAiB;AAC1C,YAAM,KAAK,KAAK,OAAO,OAAO,QAAQ,CAAC,GAAG,GAAG,WAAW,EAAE;AAAA,IAC5D;AACA,UAAM,KAAK,IAAI,YAAY,UAAU,2CAA2C;AAAA,EAClF,WAAW,aAAa;AAEtB,UAAM,KAAK,cAAc,UAAU,qBAAqB;AACxD,UAAM,KAAK,IAAI,GAAG,MAAM,WAAW,KAAK,IAAI,WAAW;AACvD,qBAAiB,OAAO,MAAM,QAAS;AAAA,EACzC,WAAW,MAAM,OAAO;AAEtB,UAAM,KAAK,UAAU,MAAM,KAAK,EAAE;AAClC,UAAM,KAAK,IAAI,GAAG,MAAM,WAAW,GAAG;AACtC,QAAI,MAAM,UAAU;AAClB,YAAM,KAAK,EAAE;AACb,iBAAW,OAAO,OAAO,OAAO,MAAM,QAAQ,GAAG;AAC/C,cAAM,KAAK,KAAK,IAAI,WAAW,EAAE;AACjC,cAAM,KAAK,YAAY,IAAI,KAAK,EAAE;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,UAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC;AACvC;AAGA,SAAS,kBAAkB,YAAoB,cAA4B;AACzE,QAAM,QAAQ,UAAU,UAAU;AAClC,MAAI,CAAC,OAAO;AACV,YAAQ,OAAO,MAAM,mBAAmB,UAAU;AAAA,CAAI;AACtD,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,QAAM,WAAW,MAAM,YAAY,YAAY;AAC/C,MAAI,CAAC,UAAU;AACb,YAAQ,OAAO,MAAM,qBAAqB,UAAU,IAAI,YAAY;AAAA,CAAI;AACxE,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,cAAc,UAAU,IAAI,YAAY;AAAA,IACxC;AAAA,IACA,GAAG,SAAS,WAAW;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,qBAAiB,OAAO,SAAS,QAAQ;AAAA,EAC3C;AAEA,QAAM,KAAK,EAAE;AACb,UAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC;AACvC;AAGA,SAAS,iBAAiB,OAAiB,UAA6C;AACtF,QAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;AAE3D,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClD,UAAM,KAAK,KAAK,KAAK,OAAO,QAAQ,CAAC,GAAG,IAAI,WAAW,EAAE;AAEzD,UAAM,aAAa,IAAI,MAAM,MAAM,IAAI;AACvC,UAAM,KAAK,KAAK,IAAI,OAAO,QAAQ,CAAC,UAAU,WAAW,CAAC,CAAC,EAAE;AAC7D,eAAW,SAAS,WAAW,MAAM,CAAC,GAAG;AACvC,YAAM,KAAK,KAAK,IAAI,OAAO,QAAQ,CAAC,UAAU,MAAM,UAAU,CAAC,EAAE;AAAA,IACnE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AACF;AAeO,SAAS,aAAaC,OAAsB;AACjD,QAAM,CAAC,YAAY,YAAY,IAAIA;AACnC,MAAI,CAAC,YAAY;AACf,oBAAgB;AAAA,EAClB,WAAW,CAAC,cAAc;AACxB,oBAAgB,UAAU;AAAA,EAC5B,OAAO;AACL,sBAAkB,YAAY,YAAY;AAAA,EAC5C;AACF;;;AC/pBA,SAAS,iBAAiB;AAoGnB,IAAM,cAAc;AAAA,EACzB,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,EACxC,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,EACxC,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,EACxC,SAAS,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA;AAAA,EAEvD,QAAQ,EAAE,MAAM,SAAS;AAAA,EACzB,SAAS,EAAE,MAAM,SAAS;AAAA;AAAA,EAE1B,KAAK,EAAE,MAAM,SAAS;AAAA,EACtB,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,IAAI,EAAE,MAAM,SAAS;AAAA;AAAA,EAErB,QAAQ,EAAE,MAAM,SAAS;AAAA,EACzB,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,EAC3C,OAAO,EAAE,MAAM,SAAS;AAAA;AAAA,EAExB,MAAM,EAAE,MAAM,SAAS;AAAA,EACvB,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,IAAI,EAAE,MAAM,SAAS;AAAA,EACrB,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,QAAQ,EAAE,MAAM,SAAS;AAAA;AAAA,EAEzB,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,SAAS,EAAE,MAAM,SAAS;AAAA;AAAA,EAE1B,aAAa,EAAE,MAAM,SAAS;AAAA,EAC9B,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,aAAa,EAAE,MAAM,SAAS;AAAA,EAC9B,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,QAAQ,EAAE,MAAM,SAAS;AAAA,EACzB,YAAY,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA;AAAA,EAE9C,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,gBAAgB,EAAE,MAAM,SAAS;AAAA,EACjC,YAAY,EAAE,MAAM,SAAS;AAAA,EAC7B,gBAAgB,EAAE,MAAM,SAAS;AAAA,EACjC,YAAY,EAAE,MAAM,SAAS;AAAA;AAAA,EAE7B,eAAe,EAAE,MAAM,SAAS;AAAA,EAChC,gBAAgB,EAAE,MAAM,SAAS;AAAA,EACjC,UAAU,EAAE,MAAM,SAAS;AAAA;AAAA,EAE3B,aAAa,EAAE,MAAM,SAAS;AAAA,EAC9B,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,QAAQ,EAAE,MAAM,SAAS;AAAA,EACzB,WAAW,EAAE,MAAM,SAAS;AAAA,EAC5B,SAAS,EAAE,MAAM,WAAW,SAAS,KAAK;AAAA,EAC1C,UAAU,EAAE,MAAM,SAAS;AAAA,EAC3B,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA;AAAA,EAExC,UAAU,EAAE,MAAM,SAAS;AAAA,EAC3B,UAAU,EAAE,MAAM,SAAS;AAAA;AAAA,EAE3B,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,EAC3C,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,KAAK,EAAE,MAAM,SAAS;AAAA,EACtB,MAAM,EAAE,MAAM,SAAS;AAAA,EACvB,IAAI,EAAE,MAAM,SAAS;AAAA,EACrB,cAAc,EAAE,MAAM,SAAS;AAAA,EAC/B,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,KAAK,EAAE,MAAM,SAAS;AAAA;AAAA,EAEtB,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,EAC3C,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,OAAO,EAAE,MAAM,SAAS;AAAA;AAAA,EAExB,YAAY,EAAE,MAAM,SAAS;AAAA,EAC7B,cAAc,EAAE,MAAM,SAAS;AAAA,EAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,EAChC,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,aAAa,EAAE,MAAM,SAAS;AAAA,EAC9B,SAAS,EAAE,MAAM,SAAS;AAAA,EAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,QAAQ,EAAE,MAAM,SAAS;AAAA,EACzB,eAAe,EAAE,MAAM,SAAS;AAAA,EAChC,iBAAiB,EAAE,MAAM,SAAS;AAAA,EAClC,WAAW,EAAE,MAAM,SAAS;AAAA,EAC5B,SAAS,EAAE,MAAM,SAAS;AAAA;AAAA,EAE1B,MAAM,EAAE,MAAM,SAAS;AAAA;AAAA,EAEvB,KAAK,EAAE,MAAM,SAAS;AAAA,EACtB,SAAS,EAAE,MAAM,SAAS;AAAA;AAAA,EAE1B,QAAQ,EAAE,MAAM,SAAS;AAAA,EACzB,QAAQ,EAAE,MAAM,SAAS;AAAA;AAAA,EAEzB,MAAM,EAAE,MAAM,SAAS;AAAA;AAAA,EAEvB,OAAO,EAAE,MAAM,SAAS;AAAA,EACxB,MAAM,EAAE,MAAM,SAAS;AAAA;AAAA,EAEvB,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA;AAAA,EAEzC,WAAW,EAAE,MAAM,SAAS;AAAA,EAC5B,cAAc,EAAE,MAAM,SAAS;AAAA,EAC/B,MAAM,EAAE,MAAM,SAAS;AAAA,EACvB,KAAK,EAAE,MAAM,SAAS;AAAA,EACtB,kBAAkB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,EACpD,OAAO,EAAE,MAAM,SAAS;AAAA;AAAA,EAExB,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAC7C;AAEO,SAAS,SAAS,MAA8D;AAErF,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,KAAK,OAAO,CAAC,QAAQ;AACpC,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,YAAM,MAAM,IAAI,MAAM,CAAC;AACvB,UAAI,OAAO,eAAgB,YAAiD,GAAG,EAAE,SAAS,WAAW;AACnG,gBAAQ,IAAI,GAAG;AACf,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,EAAE,QAAQ,YAAY,IAAI,UAAU;AAAA,IACxC,MAAM;AAAA,IACN,SAAS;AAAA,IACT,kBAAkB;AAAA,EACpB,CAAC;AAED,aAAW,OAAO,SAAS;AACzB,IAAC,OAAmC,GAAG,IAAI;AAAA,EAC7C;AAEA,SAAO,EAAE,QAA6B,YAAY;AACpD;;;AC5OO,SAAS,UAAU,MAAqB;AAC7C,UAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAC3D;AAEO,SAAS,WAAW,MAAuC;AAChE,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,OAAO,MAAM,aAAa;AAClC;AAAA,EACF;AACA,QAAM,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC;AAChC,QAAM,SAAS,KAAK;AAAA,IAAI,CAAC,MACvB,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC;AAAA,EAClE;AACA,QAAM,SAAS,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAChE,QAAM,UAAU,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAC1D,UAAQ,OAAO,MAAM,SAAS,OAAO,UAAU,IAAI;AACnD,aAAW,OAAO,MAAM;AACtB,YAAQ,OAAO;AAAA,MACb,KAAK,IAAI,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AAAA,IAC1E;AAAA,EACF;AACF;AAEO,SAAS,QAAQ,KAA8B,SAAS,GAAS;AACtE,QAAM,MAAM,IAAI,OAAO,MAAM;AAC7B,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,QAAI,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC,GAAG;AAC5D,cAAQ,OAAO,MAAM,GAAG,GAAG,GAAG,CAAC;AAAA,CAAK;AACpC,cAAQ,GAA8B,SAAS,CAAC;AAAA,IAClD,OAAO;AACL,cAAQ,OAAO,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;AAAA,CAAI;AAAA,IAC/D;AAAA,EACF;AACF;;;AC9BA,SAAS,QAAQ,QAA0B;AACzC,SAAQ,OAAmC;AAC7C;AAEA,eAAsB,qBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,0BAA0B,EAAE,UAAU,KAAK,UAAU,QAAQ,KAAK,OAAO,CAAC;AACnG,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO;AAAA,MACrC,QAAQ,EAAE,QAAQ;AAAA,MAClB,OAAO,EAAE,OAAO;AAAA,MAChB,OAAO,EAAE,OAAO;AAAA,MAChB,OAAO,EAAE,OAAO;AAAA,MAChB,QAAQ,EAAE,QAAQ;AAAA,MAClB,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,qBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,2BAA2B,EAAE,QAAQ,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,CAAC;AACxG,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC,MAAI,KAAK,SAAS;AAChB;AAAA,OACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,QACxB,QAAQ,EAAE,QAAQ;AAAA,QAClB,aAAa,EAAE,aAAa;AAAA,QAC5B,cAAc,EAAE,cAAc;AAAA,QAC9B,aAAa,IAAI,KAAK,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,eAAe;AAAA,MACjE,EAAE;AAAA,IACJ;AAAA,EACF,OAAO;AACL,UAAM,IAAI,QAAQ,CAAC;AACnB,QAAI,CAAC,GAAG;AAAE,cAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,IAAQ;AACrD,YAAQ;AAAA,MACN,QAAQ,EAAE,QAAQ;AAAA,MAClB,aAAa,EAAE,aAAa;AAAA,MAC5B,iBAAiB,EAAE,iBAAiB;AAAA,MACpC,aAAa,IAAI,KAAK,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,eAAe;AAAA,MAC/D,iBAAiB,IAAI,KAAK,OAAO,EAAE,iBAAiB,CAAC,CAAC,EAAE,eAAe;AAAA,IACzE,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,mBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB,EAAE,UAAU,KAAK,UAAU,QAAQ,KAAK,OAAO,CAAC;AAClG,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,UAAU,EAAE,UAAU;AAAA,MACtB,QAAQ,EAAE,QAAQ;AAAA,MAClB,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,gBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC3E,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,SAAS,EAAE,SAAS;AAAA,MACpB,IAAI,EAAE,IAAI;AAAA,MACV,IAAI,EAAE,IAAI;AAAA,MACV,MAAM,EAAE,MAAM;AAAA,MACd,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,qBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,2BAA2B,EAAE,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AACpG,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,OAAO,EAAE,OAAO;AAAA,MAChB,SAAS,EAAE,SAAS;AAAA,MACpB,QAAQ,EAAE,QAAQ;AAAA,MAClB,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,sBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,4BAA4B,EAAE,QAAQ,KAAK,KAAK,KAAK,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,CAAC;AACxH,QAAM,UAAU,QAAQ,MAAM;AAC9B,MAAI,KAAK,KAAM,QAAO,UAAU,OAAO;AACvC;AAAA,KACG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO;AAAA,MACzC,MAAM,IAAI,KAAK,OAAO,EAAE,CAAC,EAAE,eAAe;AAAA,MAC1C,MAAM;AAAA,MAAG,MAAM;AAAA,MAAG,KAAK;AAAA,MAAG,OAAO;AAAA,IACnC,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,oBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,0BAA0B,EAAE,OAAO,CAAC;AAC7D,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAM,QAAO,UAAU,KAAK;AAChC,QAAM,IAAI,QAAQ,CAAC;AACnB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACrD,UAAQ;AAAA,IACN,QAAQ,EAAE,QAAQ;AAAA,IAClB,QAAQ,EAAE,QAAQ;AAAA,IAClB,SAAS,EAAE,SAAS;AAAA,IACpB,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,EAC/C,CAAC;AACH;AAEA,eAAsB,sBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,4BAA4B,EAAE,UAAU,KAAK,UAAU,QAAQ,KAAK,OAAO,CAAC;AACrG,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,IAAI,EAAE,IAAI;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,MAChB,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,gBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,OAAO,CAAC;AACxD,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAM,QAAO,UAAU,KAAK;AAChC,MAAI,CAAC,OAAO,QAAQ;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACjE,QAAM,IAAI,MAAM,CAAC;AACjB,UAAQ;AAAA,IACN,QAAQ,EAAE,QAAQ;AAAA,IAClB,MAAM,EAAE,MAAM;AAAA,IACd,gBAAgB,EAAE,SAAS;AAAA,IAC3B,YAAY,EAAE,SAAS;AAAA,IACvB,WAAW,EAAE,QAAQ;AAAA,IACrB,WAAW,EAAE,QAAQ;AAAA,IACrB,MAAM,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,EACjD,CAAC;AACH;AAEA,eAAsB,iBACpB,KACA,UACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB,EAAE,SAAS,CAAC;AAC3D,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,KAAM,QAAO,UAAU,KAAK;AAChC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,YAAY,EAAE,SAAS;AAAA,MACvB,WAAW,EAAE,QAAQ;AAAA,MACrB,WAAW,EAAE,QAAQ;AAAA,IACvB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,mBACpB,KACA,QACA,IACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,wBAAwB,EAAE,QAAQ,GAAG,CAAC;AAC/D,QAAM,OAAO,QAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,OAAQ,KAAmC,CAAC;AAClD,MAAI,CAAC,MAAM;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACxD,QAAM,OAAQ,KAAK,MAAM,EAAiB,MAAM,GAAG,CAAC;AACpD,QAAM,OAAQ,KAAK,MAAM,EAAiB,MAAM,GAAG,CAAC;AACpD,UAAQ,OAAO,MAAM,wBAAwB;AAC7C,aAAW,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAG,SAAQ,OAAO,MAAM,KAAK,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC;AAAA,CAAI;AACvF,UAAQ,OAAO,MAAM,wBAAwB;AAC7C,aAAW,CAAC,GAAG,CAAC,KAAK,KAAM,SAAQ,OAAO,MAAM,KAAK,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC;AAAA,CAAI;AAC/E;AAEA,eAAsB,iBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB,EAAE,QAAQ,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC;AAC3F,QAAM,UAAU,QAAQ,MAAM;AAC9B,MAAI,KAAK,KAAM,QAAO,UAAU,OAAO;AACvC;AAAA,KACG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO;AAAA,MAC9C,MAAM,IAAI,KAAK,OAAO,EAAE,CAAC,EAAE,eAAe;AAAA,MAC1C,MAAM;AAAA,MAAG,MAAM;AAAA,MAAG,KAAK;AAAA,MAAG,OAAO;AAAA,MAAG;AAAA,IACtC,EAAE;AAAA,EACJ;AACF;;;AC1OA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AAIpB,SAASC,SAAQ,QAA0B;AACzC,SAAQ,OAAmC;AAC7C;AAEA,eAAsB,kBACpB,KACA,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,uBAAuB,EAAE,IAAI,CAAC;AACvD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,UAAW,OAAO,CAAC,IAAI,SAAS,KAAmC,CAAC;AAC1E;AAAA,IACE,QACG,OAAO,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EACjC,IAAI,CAAC,OAAO;AAAA,MACX,UAAU,EAAE,KAAK;AAAA,MACjB,QAAQ,EAAE,IAAI;AAAA,MACd,WAAW,EAAE,SAAS;AAAA,MACtB,QAAQ,EAAE,WAAW;AAAA,IACvB,EAAE;AAAA,EACN;AACF;AAEA,eAAsB,uBACpB,KACA,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,6BAA6B,EAAE,IAAI,CAAC;AAC7D,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B;AAAA,KACG,QAAQ,CAAC,GACP,OAAO,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAClC,IAAI,CAAC,OAAO;AAAA,MACX,KAAK,EAAE,KAAK;AAAA,MACZ,KAAK,EAAE,KAAK;AAAA,MACZ,UAAU,EAAE,UAAU;AAAA,MACtB,WAAW,EAAE,WAAW;AAAA,IAC1B,EAAE;AAAA,EACN;AACF;AAEA,eAAsB,oBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB,EAAE,UAAU,KAAK,UAAU,QAAQ,KAAK,OAAO,CAAC;AAClG,QAAM,YAAYA,SAAQ,MAAM;AAChC,MAAI,KAAK,KAAM,QAAO,UAAU,SAAS;AACzC,QAAM,QAAQ,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;AACnE,MAAI,CAAC,KAAK,QAAQ;AAAE,YAAQ,OAAO,MAAM,qBAAqB;AAAG;AAAA,EAAQ;AACzE;AAAA,IACE,KAAK,IAAI,CAAC,OAAO;AAAA,MACf,QAAQ,EAAE,QAAQ;AAAA,MAClB,UAAU,EAAE,UAAU;AAAA,MACtB,MAAM,EAAE,SAAS;AAAA,MACjB,KAAK,EAAE,KAAK;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,MAChB,KAAK,EAAE,KAAK;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,gBACpB,KACA,MACe;AACf,QAAM,WAAW,KAAK,UAAU,8BAA8B;AAC9D,QAAM,SAAS,MAAM,IAAI,UAAU,EAAE,UAAU,KAAK,UAAU,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC;AAChG,QAAM,QAAQA,SAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,KAAK,EAAE,KAAK;AAAA,MACZ,QAAQ,EAAE,QAAQ;AAAA,MAClB,KAAK,EAAE,KAAK;AAAA,MACZ,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,eACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB,EAAE,UAAU,KAAK,UAAU,QAAQ,KAAK,OAAO,CAAC;AAClG,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,MAAM,OAAO,CAAC;AACpB,MAAI,CAAC,KAAK;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACvD,UAAQ;AAAA,IACN,OAAO,IAAI,OAAO;AAAA,IAClB,OAAO,IAAI,OAAO;AAAA,IAClB,OAAO,IAAI,OAAO;AAAA,IAClB,QAAQ,IAAI,QAAQ;AAAA,IACpB,QAAQ,IAAI,QAAQ;AAAA,IACpB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,EACjD,CAAC;AACH;AAEA,eAAsB,iBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB,CAAC,CAAC;AACjD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,MAAM,OAAO,CAAC;AACpB,MAAI,CAAC,KAAK;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACvD,UAAQ;AAAA,IACN,KAAK,IAAI,KAAK;AAAA,IACd,QAAQ,IAAI,QAAQ;AAAA,IACpB,SAAS,IAAI,SAAS;AAAA,IACtB,UAAU,IAAI,UAAU;AAAA,IACxB,YAAY,IAAI,YAAY;AAAA,IAC5B,OAAO,IAAI,OAAO;AAAA,IAClB,UAAU,IAAI,UAAU;AAAA,EAC1B,CAAC;AACH;AAEA,eAAsB,0BACpB,KACA,SACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,6BAA6B,EAAE,QAAQ,CAAC;AACjE,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,sBAAsB,IAAI,SAAS,CAAC;AAAA,CAAI;AAC/D;AAEA,eAAsB,kBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,wBAAwB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC;AAC1G,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACrD,UAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC;AAC7E;AAEA,eAAsB,uBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,8BAA8B,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACnG,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACrD,UAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,WAAW,EAAE,WAAW,EAAE,CAAC;AACrF;AAEA,eAAsB,wBACpB,KACA,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,8BAA8B,EAAE,IAAI,CAAC;AAC9D,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B;AAAA,KACG,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACvB,KAAK,EAAE,KAAK;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,MAChB,SAAS,EAAE,SAAS;AAAA,IACtB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,2BACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,iCAAiC,EAAE,UAAU,KAAK,UAAU,QAAQ,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC7H,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC;AAAA,KACG,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACvB,QAAQ,EAAE,QAAQ;AAAA,MAClB,WAAW,EAAE,WAAW;AAAA,MACxB,WAAW,EAAE,WAAW;AAAA,MACxB,YAAY,EAAE,YAAY;AAAA,MAC1B,aAAa,EAAE,aAAa;AAAA,MAC5B,OAAO,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,IACrD,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,mBACpB,KACA,MASe;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,aAAa,IAAI,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;AAAA,CAAK;AACpF;AAUA,SAAS,cAAc,QAAgB,OAAO,GAAe;AAC3D,QAAM,UAAsB,CAAC;AAC7B,QAAM,MAAM,oBAAI,KAAK;AACrB,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAM,IAAI,IAAI,KAAK,GAAG;AACtB,MAAE,WAAW,IAAI,WAAW,IAAI,CAAC;AACjC,UAAM,OAAO,EAAE,eAAe;AAC9B,UAAM,KAAK,OAAO,EAAE,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACtD,UAAM,KAAK,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACjD,UAAM,WAAgB,WAAK,QAAQ,SAAS,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM;AAClE,QAAI;AACJ,QAAI;AAAE,gBAAa,iBAAa,UAAU,MAAM;AAAA,IAAG,QAAQ;AAAE;AAAA,IAAU;AACvE,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AACd,UAAI;AAAE,gBAAQ,KAAK,KAAK,MAAM,OAAO,CAAa;AAAA,MAAG,QAAQ;AAAA,MAAa;AAAA,IAC5E;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBACd,MACM;AACN,QAAM,SAAc,WAAQ,YAAQ,GAAG,QAAQ,MAAM;AACrD,QAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,KAAK,KAAK,IAAI,GAAG;AAEpD,MAAI,UAAU,cAAc,MAAM;AAElC,MAAI,KAAK,KAAM,WAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AACnE,MAAI,KAAK,OAAO;AACd,UAAM,YAAY,IAAI,KAAK,KAAK,KAAK,EAAE,QAAQ;AAC/C,cAAU,QAAQ,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK,SAAS;AAAA,EAC9E;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;AACxF,YAAU,QAAQ,MAAM,GAAG,KAAK;AAEhC,MAAI,KAAK,KAAM,QAAO,UAAU,OAAO;AACvC,MAAI,CAAC,QAAQ,QAAQ;AAAE,YAAQ,OAAO,MAAM,wBAAwB;AAAG;AAAA,EAAQ;AAC/E;AAAA,IACE,QAAQ,IAAI,CAAC,OAAO;AAAA,MAClB,WAAW,EAAE;AAAA,MACb,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,MACT,UAAU,EAAE,cAAc,OAAO,GAAG,EAAE,UAAU,OAAO;AAAA,MACvD,QAAQ,EAAE,QAAQ,UAAU;AAAA,IAC9B,EAAE;AAAA,EACJ;AACF;;;AC7RA,SAASC,SAAQ,QAA0B;AACzC,SAAQ,OAAmC;AAC7C;AAEA,eAAsB,cACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,mBAAmB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACxF,QAAM,SAASA,SAAQ,MAAM;AAC7B,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC;AAAA,KACG,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACzB,OAAO,EAAE,OAAO;AAAA,MAChB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,MAAM,EAAE,SAAS;AAAA,MACjB,OAAO,EAAE,IAAI;AAAA,MACb,MAAM,EAAE,IAAI;AAAA,MACZ,QAAQ,EAAE,QAAQ;AAAA,MAClB,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,aACpB,KACA,MAae;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK,UAAU;AAAA,IACvB,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,IAAI,KAAK;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,QAAQ,OAAO,CAAC;AACtB,UAAQ,OAAO,MAAM,iBAAiB,QAAQ,OAAO,CAAC,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,CAAK;AACnH;AAEA,eAAsB,cACpB,KACA,QACA,OACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,QAAQ,MAAM,CAAC;AAC/D,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,cAAc,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,CAAK;AACpG;AAEA,eAAsB,iBACpB,KACA,MAYe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB;AAAA,IAChD,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK,UAAU;AAAA,IACvB,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,QAAQ,OAAO,CAAC;AACtB,UAAQ,OAAO;AAAA,IACb,sBAAsB,QAAQ,QAAQ,CAAC,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA;AAAA,EAC/F;AACF;AAEA,eAAsB,iBACpB,KACA,MAUe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB;AAAA,IAChD,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK;AAAA,IACjB,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,uBAAuB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EACpF;AACF;AAEA,eAAsB,kBACpB,KACA,QACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,0BAA0B,EAAE,QAAQ,OAAO,CAAC;AACrE,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,yBAAyB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EACtF;AACF;AAEA,eAAsB,WACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,kBAAkB,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,CAAC;AAC5G,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACrD,UAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,IAChB,QAAQ,EAAE,QAAQ;AAAA,IAClB,MAAM,EAAE,MAAM;AAAA,IACd,SAAS,EAAE,SAAS;AAAA,IACpB,IAAI,EAAE,IAAI;AAAA,IACV,IAAI,EAAE,IAAI;AAAA,IACV,QAAQ,EAAE,QAAQ;AAAA,IAClB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,EACrD,CAAC;AACH;AAEA,eAAsB,aACpB,KACA,MAQe;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,EACd,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,kBAAkB,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,CAAK;AACxG;AAEA,eAAsB,kBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,wBAAwB;AAAA,IAC/C,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,SAASA,SAAQ,MAAM;AAC7B,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,MAAI,EAAE,UAAU,CAAC,GAAG,QAAQ;AAAE,YAAQ,OAAO,MAAM,kBAAkB;AAAG;AAAA,EAAQ;AAChF;AAAA,IACE,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,QAAQ,EAAE,QAAQ;AAAA,MAClB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,SAAS;AAAA,MACjB,MAAM,EAAE,MAAM;AAAA,MACd,IAAI,EAAE,IAAI;AAAA,MACV,WAAW,EAAE,aAAa;AAAA,MAC1B,WAAW,EAAE,aAAa;AAAA,MAC1B,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,aACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,kBAAkB,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC;AACrF,QAAM,QAAQA,SAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,QAAQ,EAAE,QAAQ;AAAA,MAClB,QAAQ,EAAE,QAAQ;AAAA,MAClB,KAAK,EAAE,KAAK;AAAA,MACZ,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,aACpB,KACA,MACe;AACf,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK,MAAM;AAAA,EACjC,QAAQ;AACN,YAAQ,OAAO,MAAM,8CAA8C;AACnE,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,YAAQ,OAAO,MAAM,kDAAkD;AACvE,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,MAAI,CAAC,MAAM;AACT,YAAQ,OAAO,MAAM;AAAA,CAAwD;AAC7E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,IAAI,MAAM,SAAS,sBAAsB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,OAAO,IAAI,EAAE,QAAQ,OAAO,CAAC;AAC1H,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,aAAW,KAAK,QAAQ,CAAC,GAAG;AAC1B,YAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,KAAK,EAAE,SAAS,KAAK,GAAG,KAAK,EAAE,OAAO,MAAM,MAAM,OAAO,EAAE,MAAM,CAAC;AAAA,CAAI;AAAA,EACzG;AACF;;;ACvRA,SAASC,SAAQ,QAA0B;AACzC,SAAQ,OAAmC;AAC7C;AAEA,eAAsB,iBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB,EAAE,OAAO,CAAC;AACzD,QAAM,YAAYA,SAAQ,MAAM;AAChC,MAAI,KAAM,QAAO,UAAU,SAAS;AACpC,QAAM,QAAQ,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;AACnE,MAAI,CAAC,KAAK,QAAQ;AAAE,YAAQ,OAAO,MAAM,qBAAqB;AAAG;AAAA,EAAQ;AACzE;AAAA,IACE,KAAK,IAAI,CAAC,OAAO;AAAA,MACf,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,SAAS;AAAA,MACjB,MAAM,EAAE,KAAK;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,MAChB,KAAK,EAAE,KAAK;AAAA,MACZ,UAAU,EAAE,UAAU;AAAA,MACtB,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,cACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,mBAAmB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACxF,QAAM,SAASA,SAAQ,MAAM;AAC7B,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC;AAAA,KACG,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACzB,OAAO,EAAE,OAAO;AAAA,MAChB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,SAAS,EAAE,SAAS;AAAA,MACpB,MAAM,EAAE,SAAS;AAAA,MACjB,OAAO,EAAE,IAAI;AAAA,MACb,MAAM,EAAE,IAAI;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,aACpB,KACA,MAce;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,QAAQ,OAAO,CAAC;AACtB,UAAQ,OAAO,MAAM,iBAAiB,QAAQ,OAAO,CAAC,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,CAAK;AACnH;AAEA,eAAsB,cACpB,KACA,QACA,OACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,QAAQ,MAAM,CAAC;AAC/D,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,cAAc,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,CAAK;AACpG;AAEA,eAAsB,iBACpB,KACA,MAce;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB;AAAA,IAChD,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,QAAQ,OAAO,CAAC;AACtB,UAAQ,OAAO;AAAA,IACb,sBAAsB,QAAQ,QAAQ,CAAC,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA;AAAA,EAC/F;AACF;AAEA,eAAsB,iBACpB,KACA,MAUe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB;AAAA,IAChD,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK;AAAA,IACjB,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,uBAAuB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EACpF;AACF;AAEA,eAAsB,sBACpB,KACA,MAYe;AACf,QAAM,SAAS,MAAM,IAAI,8BAA8B;AAAA,IACrD,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,eAAe,KAAK;AAAA,IACpB,gBAAgB,KAAK;AAAA,IACrB,UAAU,KAAK;AAAA,IACf,SAAS,KAAK;AAAA,IACd,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,QAAQ,OAAO,CAAC;AACtB,UAAQ,OAAO;AAAA,IACb,yBAAyB,QAAQ,QAAQ,CAAC,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA;AAAA,EAClG;AACF;AAEA,eAAsB,kBACpB,KACA,QACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,2BAA2B,EAAE,QAAQ,OAAO,CAAC;AACtE,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,yBAAyB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EACtF;AACF;AAEA,eAAsB,kBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,wBAAwB;AAAA,IAC/C,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,SAASA,SAAQ,MAAM;AAC7B,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,MAAI,EAAE,UAAU,CAAC,GAAG,QAAQ;AAAE,YAAQ,OAAO,MAAM,kBAAkB;AAAG;AAAA,EAAQ;AAChF;AAAA,IACE,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,QAAQ,EAAE,QAAQ;AAAA,MAClB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,SAAS;AAAA,MACjB,MAAM,EAAE,MAAM;AAAA,MACd,IAAI,EAAE,IAAI;AAAA,MACV,WAAW,EAAE,aAAa;AAAA,MAC1B,WAAW,EAAE,aAAa;AAAA,MAC1B,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,aACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,kBAAkB,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,CAAC;AAC5G,QAAM,QAAQA,SAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,QAAQ,EAAE,QAAQ;AAAA,MAClB,QAAQ,EAAE,QAAQ;AAAA,MAClB,KAAK,EAAE,KAAK;AAAA,MACZ,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,WACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,kBAAkB,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,CAAC;AAC5G,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACrD,UAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,IAChB,QAAQ,EAAE,QAAQ;AAAA,IAClB,MAAM,EAAE,MAAM;AAAA,IACd,SAAS,EAAE,SAAS;AAAA,IACpB,SAAS,EAAE,SAAS;AAAA,IACpB,IAAI,EAAE,IAAI;AAAA,IACV,IAAI,EAAE,IAAI;AAAA,IACV,QAAQ,EAAE,QAAQ;AAAA,IAClB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,EACrD,CAAC;AACH;AAEA,eAAsB,aACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,uBAAuB;AAAA,IAC9C,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,oBAAoB,IAAI,QAAQ,CAAC,IAAI,IAAI,SAAS,KAAK,EAAE;AAAA,CAAI;AACpF;AAEA,eAAsB,mBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,QAAQ,KAAK,QAAQ,SAAS,KAAK,QAAQ,CAAC;AAC5F,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC;AAAA,KACG,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACvB,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS,EAAE,SAAS;AAAA,MACpB,SAAS,EAAE,SAAS;AAAA,MACpB,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,aACpB,KACA,MAQe;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,EACd,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,kBAAkB,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,CAAK;AACxG;AAEA,eAAsB,mBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB;AAAA,IAC5C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,iBAAiB,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;AAAA,CAAI;AAC1E;AAEA,eAAsB,aACpB,KACA,MACe;AACf,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK,MAAM;AAAA,EACjC,QAAQ;AACN,YAAQ,OAAO,MAAM,8CAA8C;AACnE,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,YAAQ,OAAO,MAAM,kDAAkD;AACvE,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,MAAI,CAAC,MAAM;AACT,YAAQ,OAAO,MAAM;AAAA,CAAwD;AAC7E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,IAAI,MAAM,SAAS,sBAAsB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,OAAO,IAAI,EAAE,QAAQ,OAAO,CAAC;AAC1H,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,aAAW,KAAK,QAAQ,CAAC,GAAG;AAC1B,YAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,KAAK,EAAE,SAAS,KAAK,GAAG,KAAK,EAAE,OAAO,MAAM,MAAM,OAAO,EAAE,MAAM,CAAC;AAAA,CAAI;AAAA,EACzG;AACF;;;ACxYA,SAASC,SAAQ,QAA0B;AACzC,SAAQ,OAAmC;AAC7C;AAEA,eAAsB,iBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK,OAAO,CAAC;AAC3F,QAAM,SAASA,SAAQ,MAAM;AAC7B,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC;AAAA,KACG,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACzB,OAAO,EAAE,OAAO;AAAA,MAChB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,SAAS,EAAE,SAAS;AAAA,MACpB,MAAM,EAAE,SAAS;AAAA,MACjB,OAAO,EAAE,IAAI;AAAA,MACb,MAAM,EAAE,IAAI;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,oBACpB,KACA,QACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB,EAAE,OAAO,CAAC;AAC5D,QAAM,YAAYA,SAAQ,MAAM;AAChC,MAAI,KAAM,QAAO,UAAU,SAAS;AACpC,QAAM,QAAQ,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;AACnE,MAAI,CAAC,KAAK,QAAQ;AAAE,YAAQ,OAAO,MAAM,qBAAqB;AAAG;AAAA,EAAQ;AACzE;AAAA,IACE,KAAK,IAAI,CAAC,OAAO;AAAA,MACf,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,SAAS;AAAA,MACjB,KAAK,EAAE,KAAK;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,MAChB,KAAK,EAAE,KAAK;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,gBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,CAAC;AAC/G,QAAM,QAAQA,SAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,QAAQ,EAAE,QAAQ;AAAA,MAClB,QAAQ,EAAE,QAAQ;AAAA,MAClB,KAAK,EAAE,KAAK;AAAA,MACZ,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,gBACpB,KACA,MAee;AACf,QAAM,SAAS,MAAM,IAAI,uBAAuB;AAAA,IAC9C,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,YAAY,KAAK;AAAA,IACjB,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,QAAQ,OAAO,CAAC;AACtB,UAAQ,OAAO,MAAM,iBAAiB,QAAQ,OAAO,CAAC,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,CAAK;AACnH;AAEA,eAAsB,iBACpB,KACA,QACA,OACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,wBAAwB,EAAE,QAAQ,MAAM,CAAC;AAClE,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAM,QAAO,UAAU,IAAI;AAC/B,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,cAAc,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,CAAK;AACpG;AAEA,eAAsB,cACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,QAAQ,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC;AACxF,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACrD,UAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,IAChB,QAAQ,EAAE,QAAQ;AAAA,IAClB,MAAM,EAAE,MAAM;AAAA,IACd,SAAS,EAAE,SAAS;AAAA,IACpB,SAAS,EAAE,SAAS;AAAA,IACpB,IAAI,EAAE,IAAI;AAAA,IACV,IAAI,EAAE,IAAI;AAAA,IACV,QAAQ,EAAE,QAAQ;AAAA,IAClB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,EACrD,CAAC;AACH;;;AC3IA,SAASC,SAAQ,QAA0B;AACzC,SAAQ,OAAmC;AAC7C;AAEA,eAAsB,gBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB;AAAA,IAC5C,QAAQ,KAAK;AAAA,IACb,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK;AAAA,EACf,CAAC;AACD,QAAM,SAASA,SAAQ,MAAM;AAC7B,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC;AAAA,KACG,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACzB,OAAO,EAAE,OAAO;AAAA,MAChB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,SAAS,EAAE,SAAS;AAAA,MACpB,IAAI,EAAE,IAAI;AAAA,MACV,IAAI,EAAE,IAAI;AAAA,MACV,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,aACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,WAAW;AAAG;AAAA,EAAQ;AACrD,UAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,IAChB,QAAQ,EAAE,QAAQ;AAAA,IAClB,MAAM,EAAE,MAAM;AAAA,IACd,SAAS,EAAE,SAAS;AAAA,IACpB,IAAI,EAAE,IAAI;AAAA,IACV,IAAI,EAAE,IAAI;AAAA,IACV,QAAQ,EAAE,QAAQ;AAAA,IAClB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,EAAE,OAAO;AAAA,IAChB,OAAO,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,EACrD,CAAC;AACH;AAEA,eAAsB,mBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,wBAAwB;AAAA,IAC/C,QAAQ,KAAK;AAAA,IACb,KAAK,KAAK;AAAA,EACZ,CAAC;AACD,QAAM,YAAYA,SAAQ,MAAM;AAChC,MAAI,KAAK,KAAM,QAAO,UAAU,SAAS;AACzC,QAAM,QAAQ,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;AACnE,MAAI,CAAC,KAAK,QAAQ;AAAE,YAAQ,OAAO,MAAM,qBAAqB;AAAG;AAAA,EAAQ;AACzE;AAAA,IACE,KAAK,IAAI,CAAC,OAAO;AAAA,MACf,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS,EAAE,SAAS;AAAA,MACpB,KAAK,EAAE,KAAK;AAAA,MACZ,OAAO,EAAE,OAAO;AAAA,MAChB,KAAK,EAAE,KAAK;AAAA,MACZ,OAAO,EAAE,SAAS;AAAA,MAClB,OAAO,EAAE,SAAS;AAAA,MAClB,OAAO,EAAE,SAAS;AAAA,MAClB,MAAM,EAAE,QAAQ;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,eACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,QAAQA,SAAQ,MAAM;AAC5B,MAAI,KAAK,KAAM,QAAO,UAAU,KAAK;AACrC;AAAA,KACG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACxB,QAAQ,EAAE,QAAQ;AAAA,MAClB,MAAM,EAAE,MAAM;AAAA,MACd,QAAQ,EAAE,QAAQ;AAAA,MAClB,QAAQ,EAAE,QAAQ;AAAA,MAClB,KAAK,EAAE,KAAK;AAAA,MACZ,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,qBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,0BAA0B;AAAA,IACjD,KAAK,KAAK;AAAA,IACV,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,cAAcA,SAAQ,MAAM;AAClC,MAAI,KAAK,KAAM,QAAO,UAAU,WAAW;AAC3C;AAAA,KACG,eAAe,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MAC9B,QAAQ,EAAE,QAAQ;AAAA,MAClB,KAAK,EAAE,KAAK;AAAA,MACZ,SAAS,EAAE,SAAS;AAAA,MACpB,KAAK,EAAE,KAAK;AAAA,MACZ,SAAS,EAAE,SAAS;AAAA,MACpB,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,gBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB;AAAA,IAC5C,KAAK,KAAK;AAAA,IACV,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,SAASA,SAAQ,MAAM;AAC7B,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC;AAAA,KACG,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACzB,QAAQ,EAAE,QAAQ;AAAA,MAClB,OAAO,EAAE,SAAS;AAAA,MAClB,OAAO,EAAE,SAAS;AAAA,MAClB,OAAO,EAAE,SAAS;AAAA,MAClB,MAAM,EAAE,QAAQ;AAAA,MAChB,IAAI,EAAE,SAAS;AAAA,MACf,QAAQ,EAAE,QAAQ;AAAA,IACpB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,eACpB,KACA,MAWe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB;AAAA,IAC7C,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,IAAI,KAAK;AAAA,IACT,IAAI,KAAK;AAAA,IACT,YAAY,KAAK;AAAA,IACjB,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,QAAQ,OAAO,CAAC;AACtB,UAAQ,OAAO,MAAM,iBAAiB,QAAQ,OAAO,CAAC,KAAK,QAAQ,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,CAAK;AACnH;AAEA,eAAsB,gBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,uBAAuB;AAAA,IAC9C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,cAAc,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,CAAK;AACpG;AAEA,eAAsB,eACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB;AAAA,IAC7C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,EACd,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO,MAAM,YAAY,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA,CAAK;AAClG;AAEA,eAAsB,qBACpB,KACA,MACe;AACf,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK,MAAM;AAAA,EACjC,QAAQ;AACN,YAAQ,OAAO,MAAM,8CAA8C;AACnE,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,YAAQ,OAAO,MAAM,kDAAkD;AACvE,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,QAAM,SAAS,MAAM,IAAI,uBAAuB,EAAE,QAAQ,OAAO,CAAC;AAClE,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,aAAW,KAAK,QAAQ,CAAC,GAAG;AAC1B,YAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,MAAM,MAAM,OAAO,EAAE,MAAM,CAAC;AAAA,CAAI;AAAA,EAClF;AACF;;;AC3OO,SAAS,eAAe,QAA6B;AAC1D,kBAAgB,MAAM;AACxB;;;ACAA,SAAS,uBAAuB;AAChC,SAAS,iBAAiB;AAI1B,IAAM,WAAW;AAAA,EACf,IAAI;AAAA,IACF,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc,CAAC,QAAgB;AAAA,QAAW,GAAG;AAAA;AAAA,IAC7C,MAAM,CAAC,MAAc,QAAQ,CAAC;AAAA;AAAA;AAAA,IAC9B,eAAe,CAAC,SAAiB,0BAA0B,IAAI;AAAA,IAC/D,eAAe,CAAC,SAAiB,YAAY,IAAI;AAAA,IACjD,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,OAAO,CAAC,MAAc;AAAA,kBAAqB,CAAC;AAAA;AAAA,IAC5C,gBAAgB,CAAC,SAAiB,2BAA2B,IAAI;AAAA;AAAA,IACjE,OAAO;AAAA,IACP,aAAa,CAAC,QAAgB,2BAA2B,GAAG;AAAA;AAAA,IAC5D,kBAAkB,CAAC,MAAc,kDAAkD,CAAC;AAAA;AAAA,IACpF,aAAa,CAAC,MAAc,0CAA0C,CAAC;AAAA;AAAA;AAAA,EACzE;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc,CAAC,QAAgB;AAAA,qBAAS,GAAG;AAAA;AAAA,IAC3C,MAAM,CAAC,MAAc,qBAAM,CAAC;AAAA;AAAA;AAAA,IAC5B,eAAe,CAAC,SAAiB,uCAAmB,IAAI;AAAA,IACxD,eAAe,CAAC,SAAiB,YAAY,IAAI;AAAA,IACjD,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,OAAO,CAAC,MAAc;AAAA,uCAAY,CAAC;AAAA;AAAA,IACnC,gBAAgB,CAAC,SAAiB,2CAAkB,IAAI;AAAA;AAAA,IACxD,OAAO;AAAA,IACP,aAAa,CAAC,QAAgB,qDAAa,GAAG;AAAA;AAAA,IAC9C,kBAAkB,CAAC,MAAc,oDAAY,CAAC;AAAA;AAAA,IAC9C,aAAa,CAAC,MAAc,gEAAc,CAAC;AAAA;AAAA;AAAA,EAC7C;AACF;AAEA,SAAS,OAAO,IAAwC,UAAmC;AACzF,SAAO,IAAI,QAAQ,CAAC,YAAY,GAAG,SAAS,UAAU,OAAO,CAAC;AAChE;AAEO,SAAS,cAAc,MAAqB;AACjD,QAAM,SAAS,eAAe;AAC9B,MAAI,KAAM,QAAO,UAAU,MAAM;AACjC,UAAQ,OAAO,MAAM,WAAW,eAAe,CAAC;AAAA;AAAA,CAAM;AACtD,UAAQ,OAAO,MAAM,oBAAoB,OAAO,mBAAmB,WAAW;AAAA;AAAA,CAAM;AACpF,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC7D,YAAQ,OAAO,MAAM,IAAI,IAAI;AAAA,CAAK;AAClC,YAAQ;AAAA,MACN,SAAS,QAAQ,UAAU,WAAW,QAAQ,OAAO,IAAI;AAAA,MACzD,MAAM,QAAQ,QAAQ;AAAA,MACtB,UAAU,QAAQ,YAAY;AAAA,IAChC,GAAG,CAAC;AACJ,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AACF;AAEO,SAAS,aAAa,KAAa,OAAqB;AAC7D,QAAM,SAAS,eAAe;AAC9B,MAAI,QAAQ,mBAAmB;AAC7B,WAAO,kBAAkB;AACzB,mBAAe,MAAM;AACrB,YAAQ,OAAO,MAAM,2BAA2B,KAAK;AAAA,CAAK;AAAA,EAC5D,OAAO;AACL,YAAQ,OAAO,MAAM,uBAAuB,GAAG;AAAA,CAAI;AACnD,YAAQ,WAAW;AAAA,EACrB;AACF;AAKO,SAAS,aAAa,KAAsB;AACjD,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI,UAAU,SAAS,QAAQ,IAAK,QAAO;AAC3C,MAAI,UAAU,QAAQ,QAAQ,IAAK,QAAO;AAC1C,MAAI,UAAU,YAAY,QAAQ,IAAK,QAAO;AAC9C,SAAO;AACT;AAGO,SAAS,qBAAqB,SAA2B;AAC9D,MAAI,CAAC,QAAS,QAAO;AACrB,aAAW,MAAM,UAAU;AACzB,UAAM,OAAO,UAAU,EAAE;AACzB,QAAI,YAAY,KAAK,cAAc,YAAY,KAAK,OAAQ,QAAO;AAAA,EACrE;AACA,SAAO;AACT;AAGO,SAAS,WAAW,OAAwB;AACjD,MAAI,CAAC,SAAS,MAAM,SAAS,EAAG,QAAO;AACvC,SAAO,QAAQ,MAAM,MAAM,EAAE;AAC/B;AAGO,SAAS,YAAY,SAAkB,MAAuB;AACnE,QAAM,QAAQ,OAAO,uBAAuB;AAC5C,SAAO,GAAG,UAAU,OAAO,EAAE,MAAM,kBAAkB,KAAK;AAC5D;AAGO,SAAS,kBACd,SACA,QACA,WACA,YACA,MACY;AACZ,QAAM,QAAoB,EAAE,SAAS,QAAQ,YAAY,WAAW,YAAY,KAAK;AACrF,MAAI,YAAY,UAAU;AACxB,UAAM,WAAW,UAAU,OAAO,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAEA,eAAsB,cAAc,OAAa,MAAqB;AACpE,QAAM,IAAI,SAAS,IAAI;AACvB,UAAQ,OAAO,MAAM,GAAG,EAAE,KAAK;AAAA;AAAA,CAAM;AAErC,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAE3E,MAAI;AAEF,YAAQ,OAAO,MAAM,GAAG,EAAE,UAAU;AAAA,CAAI;AACxC,YAAQ,OAAO,MAAM,wCAAwC;AAC7D,YAAQ,OAAO,MAAM,2BAA2B;AAChD,YAAQ,OAAO,MAAM,4BAA4B;AACjD,UAAM,WAAW,MAAM,OAAO,IAAI,EAAE,UAAU,GAAG,KAAK;AACtD,UAAM,UAAU,aAAa,OAAO;AAGpC,UAAM,WAAW,MAAM,OAAO,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,YAAY;AACpE,UAAM,OAAO,YAAY;AAGzB,UAAM,SAAS,YAAY,SAAS,IAAI;AACxC,UAAM,WAAW,OAAO,EAAE,WAAW,EAAE;AACvC,YAAQ,OAAO,MAAM,EAAE,aAAa,MAAM,CAAC;AAC3C,YAAQ,OAAO,MAAM,EAAE,KAAK,QAAQ,CAAC;AAGrC,QAAI;AACF,YAAM,SAAS,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,UAAU;AACjG,gBAAU,QAAQ,CAAC,MAAM,GAAG,EAAE,OAAO,UAAU,OAAO,QAAQ,aAAa,QAAQ,CAAC;AAAA,IACtF,QAAQ;AAAA,IAER;AAEA,UAAM,qBAAqB,OAAO,aAAa;AAC/C,UAAM,iBAAiB,MAAM,OAAO,IAAI,EAAE,cAAc,kBAAkB,CAAC;AAC3E,UAAM,cAAc,eAAe,KAAK,KAAK;AAG7C,UAAM,SAAS,eAAe;AAC9B,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,YAAM,aAAa,MAAM,OAAO,IAAI,EAAE,cAAc,WAAW,CAAC,GAAG,KAAK,EAAE,YAAY;AACtF,UAAI,cAAc,KAAK;AACrB,gBAAQ,OAAO,MAAM,GAAG,EAAE,SAAS;AAAA,CAAI;AACvC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,OAAO,IAAI,WAAW,GAAG,KAAK;AACpD,QAAI,CAAC,QAAQ;AACX,cAAQ,OAAO,MAAM,GAAG,EAAE,WAAW;AAAA,CAAI;AACzC,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,OAAO,IAAI,cAAc,GAAG,KAAK;AAC1D,QAAI,CAAC,WAAW;AACd,cAAQ,OAAO,MAAM,GAAG,EAAE,cAAc;AAAA,CAAI;AAC5C,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,OAAO,IAAI,cAAc,GAAG,KAAK;AAC3D,QAAI,CAAC,YAAY;AACf,cAAQ,OAAO,MAAM,GAAG,EAAE,eAAe;AAAA,CAAI;AAC7C,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,MAAM;AACR,cAAQ,OAAO,MAAM,GAAG,EAAE,YAAY;AAAA,CAAI;AAAA,IAC5C;AAEA,UAAM,eAAe,kBAAkB,SAAS,QAAQ,WAAW,YAAY,IAAI;AACnF,WAAO,SAAS,WAAW,IAAI;AAG/B,QAAI,CAAC,OAAO,mBAAmB,OAAO,oBAAoB,aAAa;AACrE,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,aAAa,eAAe;AAClC,QAAI;AACF,qBAAe,MAAM;AACrB,cAAQ,OAAO,MAAM,EAAE,MAAM,UAAU,CAAC;AACxC,cAAQ,OAAO,MAAM,EAAE,eAAe,WAAW,CAAC;AAClD,cAAQ,OAAO,MAAM,EAAE,KAAK;AAAA,IAC9B,SAAS,KAAc;AACrB,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAM,eAAe,eAAe,SAAS,UAAU,QAAQ,IAAI,SAAS,YAAY,IAAI,SAAS;AACrG,cAAQ,OAAO,MAAM,EAAE,YAAY,OAAO,CAAC;AAC3C,UAAI,cAAc;AAChB,gBAAQ,OAAO,MAAM,EAAE,iBAAiB,UAAU,CAAC;AAAA,MACrD;AACA,cAAQ,OAAO,MAAM,EAAE,YAAY,UAAU,CAAC;AAC9C,cAAQ,OAAO,MAAM,UAAc,MAA4C,IAAI,IAAI;AACvF,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAMO,SAAS,oBAAoB,SAAmB,OAAsB;AAE3E,QAAM,SAAiC,CAAC;AACxC,aAAW,QAAQ,SAAS;AAC1B,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,QAAI,UAAU,GAAI;AAClB,UAAM,MAAM,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK;AACtC,UAAM,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAClC,WAAO,IAAI,YAAY,CAAC,IAAI;AAAA,EAC9B;AAEA,QAAM,KAAK,OAAO,IAAI;AACtB,QAAM,KAAK,OAAO,IAAI;AACtB,QAAM,KAAK,OAAO,IAAI;AAGtB,QAAM,UAAoB,CAAC;AAC3B,MAAI,CAAC,GAAI,SAAQ,KAAK,IAAI;AAC1B,MAAI,CAAC,GAAI,SAAQ,KAAK,IAAI;AAC1B,MAAI,CAAC,GAAI,SAAQ,KAAK,IAAI;AAC1B,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,OAAO,MAAM,yCAAyC,QAAQ,KAAK,IAAI,CAAC;AAAA,CAAI;AACpF,YAAQ,OAAO,MAAM,qIAAqI;AAC1J,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAU,aAAa,OAAO,MAAM,KAAK,EAAE;AACjD,QAAM,OAAO,OAAO,MAAM,MAAM,SAAY,OAAO,MAAM,EAAE,YAAY,MAAM,UAAU;AACvF,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,cAAc,OAAO,MAAM,KAAK;AAEtC,QAAM,SAAS,eAAe;AAG9B,MAAI,OAAO,SAAS,WAAW,KAAK,CAAC,OAAO;AAC1C,YAAQ,OAAO,MAAM,mBAAmB,WAAW;AAAA,CAA+C;AAClG,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,QAAQ,kBAAkB,SAAS,IAAI,IAAI,IAAI,IAAI;AACzD,QAAM,OAAO;AACb,SAAO,SAAS,WAAW,IAAI;AAC/B,SAAO,kBAAkB;AAEzB,iBAAe,MAAM;AACrB,UAAQ,OAAO,MAAM,YAAY,WAAW,cAAc,eAAe,CAAC;AAAA,CAAI;AAC9E,UAAQ,OAAO,MAAM,2BAA2B,WAAW;AAAA,CAAI;AACjE;AAMO,SAAS,uBAA6B;AAC3C,QAAM,SAAS,eAAe;AAC9B,QAAM,UAAU,OAAO,QAAQ,OAAO,QAAQ;AAC9C,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,OAAO,MAAM,uFAAuF;AAC5G;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,WAAW,eAAe,CAAC;AAAA;AAAA,CAAM;AACtD,aAAW,CAAC,MAAM,OAAO,KAAK,SAAS;AACrC,UAAM,YAAY,SAAS,OAAO;AAClC,UAAM,SAAS,YAAY,OAAO;AAClC,UAAM,OAAO,QAAQ,QAAQ,qBAAqB,QAAQ,QAAQ;AAClE,UAAM,OAAO,QAAQ,SAAS,QAAQ,8BAAe;AACrD,YAAQ,OAAO,MAAM,IAAI,IAAI,IAAI,MAAM;AAAA,CAAI;AAC3C,YAAQ,OAAO,MAAM,iBAAiB,WAAW,QAAQ,OAAO,CAAC;AAAA,CAAI;AACrE,YAAQ,OAAO,MAAM,iBAAiB,WAAW,QAAQ,UAAU,CAAC;AAAA,CAAI;AACxE,YAAQ,OAAO,MAAM,iBAAiB,WAAW,QAAQ,UAAU,CAAC;AAAA,CAAI;AACxE,YAAQ,OAAO,MAAM,iBAAiB,IAAI;AAAA,CAAI;AAC9C,YAAQ,OAAO,MAAM,iBAAiB,IAAI;AAAA,CAAI;AAC9C,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AACF;AAMO,SAAS,aAAa,aAA2B;AACtD,MAAI,CAAC,aAAa;AAChB,YAAQ,OAAO,MAAM,0EAA0E;AAC/F,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,SAAS,eAAe;AAC9B,QAAM,YAAY,OAAO,KAAK,OAAO,QAAQ;AAE7C,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AACjC,YAAQ,OAAO,MAAM,mBAAmB,WAAW;AAAA,CAAqB;AACxE,QAAI,UAAU,SAAS,GAAG;AACxB,cAAQ,OAAO,MAAM,uBAAuB,UAAU,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,IACtE,OAAO;AACL,cAAQ,OAAO,MAAM,4FAA4F;AAAA,IACnH;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,SAAO,kBAAkB;AACzB,iBAAe,MAAM;AACrB,UAAQ,OAAO,MAAM,4BAA4B,WAAW;AAAA,CAAK;AACnE;;;AC7VA,SAAS,YAAY,QAA4C;AAC/D,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,UAAM,OAAQ,OAAmC,MAAM;AACvD,QAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAAA,EAClC;AACA,SAAO,CAAC;AACV;AAEA,SAAS,cACP,MACA,MACA,UACA,QACM;AACN,MAAI,MAAM;AAAE,cAAU,IAAI;AAAG;AAAA,EAAQ;AACrC,MAAI,CAAC,KAAK,QAAQ;AAAE,YAAQ,OAAO,MAAM,WAAW,IAAI;AAAG;AAAA,EAAQ;AACnE,aAAW,KAAK,IAAI,MAAM,CAAC;AAC7B;AAEA,eAAsB,sBACpB,KACA,KACA,MACe;AACf,QAAM,OAAO,YAAY,MAAM,IAAI,4BAA4B,EAAE,IAAI,CAAC,CAAC;AACvE,gBAAc,MAAM,MAAM,sBAAsB,CAAC,OAAO;AAAA,IACtD,KAAK,EAAE,KAAK;AAAA,IAAG,KAAK,EAAE,KAAK;AAAA,IAAG,UAAU,EAAE,UAAU;AAAA,IACpD,MAAM,EAAE,MAAM;AAAA,IAAG,SAAS,EAAE,SAAS;AAAA,IAAG,YAAY,EAAE,YAAY;AAAA,EACpE,EAAE;AACJ;AAEA,eAAsB,uBACpB,KACA,MACe;AACf,QAAM,OAAO,YAAY,MAAM,IAAI,yBAAyB,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,CAAC;AAC9G,MAAI,KAAK,MAAM;AAAE,cAAU,IAAI;AAAG;AAAA,EAAQ;AAC1C,QAAM,IAAI,KAAK,CAAC;AAChB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,oBAAoB;AAAG;AAAA,EAAQ;AAC9D,UAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5E;AAEA,eAAsB,qBACpB,KACA,MACe;AACf,QAAM,OAAO,YAAY,MAAM,IAAI,uBAAuB,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3F,MAAI,KAAK,MAAM;AAAE,cAAU,IAAI;AAAG;AAAA,EAAQ;AAC1C,QAAM,IAAI,KAAK,CAAC;AAChB,MAAI,CAAC,GAAG;AAAE,YAAQ,OAAO,MAAM,oBAAoB;AAAG;AAAA,EAAQ;AAC9D,UAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;AAC3D;AAEA,eAAsB,sBACpB,KACA,MACe;AACf,QAAM,OAAO,YAAY,MAAM,IAAI,yBAAyB,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,CAAC;AAC/F,MAAI,KAAK,MAAM;AAAE,cAAU,IAAI;AAAG;AAAA,EAAQ;AAC1C,QAAM,IAAI,KAAK,CAAC;AAChB,UAAQ,OAAO,MAAM,qBAAqB,IAAI,KAAK,CAAC,WAAM,IAAI,MAAM,CAAC;AAAA,CAAI;AAC3E;AAEA,eAAsB,sBACpB,KACA,MACe;AACf,QAAM,OAAO,YAAY,MAAM,IAAI,4BAA4B,EAAE,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC,CAAC;AACpG,gBAAc,MAAM,KAAK,MAAM,sBAAsB,CAAC,OAAO;AAAA,IAC3D,KAAK,EAAE,KAAK;AAAA,IAAG,KAAK,EAAE,KAAK;AAAA,IAAG,UAAU,EAAE,UAAU;AAAA,IACpD,MAAM,EAAE,MAAM;AAAA,IAAG,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,EAChE,EAAE;AACJ;AAEA,eAAsB,0BACpB,KACA,KACA,MACe;AACf,QAAM,OAAO,YAAY,MAAM,IAAI,iCAAiC,EAAE,IAAI,CAAC,CAAC;AAC5E,gBAAc,MAAM,MAAM,wBAAwB,CAAC,OAAO;AAAA,IACxD,KAAK,EAAE,KAAK;AAAA,IAAG,SAAS,EAAE,SAAS;AAAA,IAAG,SAAS,EAAE,SAAS;AAAA,IAAG,QAAQ,EAAE,QAAQ;AAAA,EACjF,EAAE;AACJ;AAEA,eAAsB,0BACpB,KACA,MACe;AACf,QAAM,OAAO,YAAY,MAAM,IAAI,iCAAiC,EAAE,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC,CAAC;AACzG,gBAAc,MAAM,KAAK,MAAM,wBAAwB,CAAC,OAAO;AAAA,IAC7D,KAAK,EAAE,KAAK;AAAA,IAAG,aAAa,EAAE,aAAa;AAAA,IAC3C,MAAM,EAAE,MAAM;AAAA,IAAG,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe;AAAA,EAChE,EAAE;AACJ;;;AC9FA,SAASC,SAAQ,QAA0B;AACzC,SAAQ,OAAmC;AAC7C;AAEA,eAAsB,cACpB,KACA,MAOe;AACf,QAAM,SAAS,MAAM,IAAI,mBAAmB;AAAA,IAC1C,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,EACf,CAAC;AACD,QAAM,SAAUA,SAAQ,MAAM,KAAmC,CAAC;AAClE,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,MAAI,CAAC,OAAO,QAAQ;AAAE,YAAQ,OAAO,MAAM,gBAAgB;AAAG;AAAA,EAAQ;AACtE;AAAA,IACE,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,QAAY,EAAE,QAAQ;AAAA,MACtB,QAAY,EAAE,QAAQ;AAAA,MACtB,MAAY,EAAE,aAAa;AAAA,MAC3B,OAAY,EAAE,OAAO;AAAA,MACrB,KAAY,EAAE,UAAU;AAAA,MACxB,SAAY,EAAE,SAAS;AAAA,MACvB,OAAY,EAAE,OAAO;AAAA,MACrB,OAAY,EAAE,OAAO;AAAA,MACrB,WAAY,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,IAC1D,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,eACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,0BAA0B;AAAA,IACjD,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK;AAAA,EACf,CAAC;AACD,QAAM,UAAWA,SAAQ,MAAM,KAAmC,CAAC,GAAG,CAAC;AACvE,MAAI,CAAC,QAAQ;AAAE,YAAQ,OAAO,MAAM,iBAAiB;AAAG;AAAA,EAAQ;AAChE,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,UAAQ;AAAA,IACN,QAAc,OAAO,QAAQ;AAAA,IAC7B,QAAc,OAAO,QAAQ;AAAA,IAC7B,MAAc,OAAO,aAAa;AAAA,IAClC,OAAc,OAAO,OAAO;AAAA,IAC5B,OAAc,OAAO,OAAO;AAAA,IAC5B,OAAc,OAAO,OAAO;AAAA,IAC5B,SAAc,OAAO,SAAS;AAAA,IAC9B,SAAc,OAAO,SAAS,MAAM,MAAM,eAAe;AAAA,IACzD,KAAc,OAAO,KAAK;AAAA,IAC1B,UAAc,OAAO,UAAU;AAAA,IAC/B,WAAc,OAAO,WAAW;AAAA,IAChC,cAAc,OAAO,cAAc;AAAA,IACnC,WAAc,IAAI,KAAK,OAAO,OAAO,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,EACjE,CAAC;AACH;AAEA,eAAsB,iBACpB,KACA,MAMe;AACf,QAAM,SAAS,MAAM,IAAI,uBAAuB;AAAA,IAC9C,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,EACb,CAAC;AACD,QAAM,SAAUA,SAAQ,MAAM,KAAmC,CAAC;AAClE,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,MAAI,CAAC,OAAO,QAAQ;AAAE,YAAQ,OAAO,MAAM,iBAAiB;AAAG;AAAA,EAAQ;AACvE;AAAA,IACE,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,OAAS,EAAE,OAAO;AAAA,MAClB,MAAS,EAAE,MAAM;AAAA,MACjB,IAAS,EAAE,IAAI;AAAA,MACf,IAAS,EAAE,IAAI;AAAA,MACf,QAAS,EAAE,QAAQ;AAAA,MACnB,QAAS,EAAE,QAAQ;AAAA,MACnB,OAAS,EAAE,OAAO;AAAA,MAClB,KAAS,EAAE,KAAK;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,cACpB,KACA,MAee;AACf,QAAM,SAAS,MAAM,IAAI,qBAAqB;AAAA,IAC5C,QAAQ,KAAK;AAAA,IACb,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,qBAAqB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EAClF;AACF;AAEA,eAAsB,YACpB,KACA,MAOe;AACf,QAAM,SAAS,MAAM,IAAI,mBAAmB;AAAA,IAC1C,QAAQ,KAAK;AAAA,IACb,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,qBAAqB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EAClF;AACF;AAMA,eAAsB,aACpB,KACA,MAkBe;AACf,QAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,eAAe,KAAK;AAAA,IACpB,OAAO,KAAK;AAAA,IACZ,cAAc,KAAK;AAAA,IACnB,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,eAAe,KAAK;AAAA,IACpB,iBAAiB,KAAK;AAAA,IACtB,WAAW,KAAK;AAAA,EAClB,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,oBAAoB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EACjF;AACF;AAEA,eAAsB,WACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,kBAAkB;AAAA,IACzC,QAAQ,KAAK;AAAA,EACf,CAAC;AACD,QAAM,OAAOA,SAAQ,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,UAAU,IAAI;AACpC,QAAM,IAAI,OAAO,CAAC;AAClB,UAAQ,OAAO;AAAA,IACb,oBAAoB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC;AAAA;AAAA,EACjF;AACF;AAEA,eAAsB,aACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,kBAAkB;AAAA,IACzC,QAAQ,KAAK,UAAU,YAAY;AAAA,EACrC,CAAC;AACD,QAAM,SAAUA,SAAQ,MAAM,KAAmC,CAAC;AAClE,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,MAAI,CAAC,OAAO,QAAQ;AAAE,YAAQ,OAAO,MAAM,eAAe;AAAG;AAAA,EAAQ;AACrE;AAAA,IACE,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,QAAW,EAAE,QAAQ;AAAA,MACrB,QAAW,EAAE,QAAQ;AAAA,MACrB,OAAW,EAAE,OAAO;AAAA,MACpB,KAAW,EAAE,KAAK;AAAA,MAClB,UAAW,EAAE,UAAU;AAAA,MACvB,WAAW,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe;AAAA,IACzD,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,cACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,yBAAyB;AAAA,IAChD,QAAQ,KAAK;AAAA,EACf,CAAC;AACD,QAAM,UAAWA,SAAQ,MAAM,KAAmC,CAAC,GAAG,CAAC;AACvE,MAAI,CAAC,QAAQ;AAAE,YAAQ,OAAO,MAAM,qBAAqB;AAAG;AAAA,EAAQ;AACpE,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,UAAQ;AAAA,IACN,QAAe,OAAO,QAAQ;AAAA,IAC9B,QAAe,OAAO,QAAQ;AAAA,IAC9B,IAAe,OAAO,IAAI;AAAA,IAC1B,OAAe,OAAO,OAAO;AAAA,IAC7B,QAAe,OAAO,QAAQ;AAAA,IAC9B,MAAe,OAAO,MAAM;AAAA,IAC5B,MAAe,OAAO,MAAM,KAAK;AAAA,IACjC,KAAe,OAAO,KAAK;AAAA,IAC3B,KAAe,OAAO,KAAK;AAAA,IAC3B,YAAe,OAAO,YAAY;AAAA,IAClC,YAAe,OAAO,YAAY;AAAA,IAClC,gBAAgB,OAAO,gBAAgB;AAAA,IACvC,WAAe,IAAI,KAAK,OAAO,OAAO,WAAW,CAAC,CAAC,EAAE,eAAe;AAAA,EACtE,CAAC;AACH;AAEA,eAAsB,gBACpB,KACA,MACe;AACf,QAAM,SAAS,MAAM,IAAI,sBAAsB;AAAA,IAC7C,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,QAAM,SAAUA,SAAQ,MAAM,KAAmC,CAAC;AAClE,MAAI,KAAK,KAAM,QAAO,UAAU,MAAM;AACtC,MAAI,CAAC,OAAO,QAAQ;AAAE,YAAQ,OAAO,MAAM,iBAAiB;AAAG;AAAA,EAAQ;AACvE;AAAA,IACE,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,SAAa,EAAE,SAAS;AAAA,MACxB,QAAa,EAAE,aAAa;AAAA,MAC5B,SAAa,EAAE,cAAc,IAAI,QAAQ;AAAA,MACzC,OAAa,EAAE,OAAO;AAAA,MACtB,MAAa,EAAE,MAAM;AAAA,MACrB,aAAa,EAAE,aAAa;AAAA,MAC5B,KAAa,EAAE,KAAK;AAAA,MACpB,WAAa,EAAE,WAAW,IAAI,IAAI,KAAK,OAAO,EAAE,WAAW,CAAW,CAAC,EAAE,eAAe,IAAI;AAAA,IAC9F,EAAE;AAAA,EACJ;AACF;;;AC1SO,SAAS,qBAAqB,KAAiB,GAAc;AAClE,SAAO,IAAI,2BAA2B;AAAA,IACpC,WAAW,EAAE;AAAA,IACb,cAAc,EAAE;AAAA,IAChB,KAAK,EAAE;AAAA,EACT,CAAC;AACH;AAEO,SAAS,uBAAuB,KAAiB,GAAc;AAEpE,QAAM,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC,IAAI;AACnE,SAAO,IAAI,yBAAyB;AAAA,IAClC,WAAW,EAAE;AAAA,IACb;AAAA,IACA,MAAM,EAAE;AAAA,IACR,KAAK,EAAE;AAAA,EACT,CAAC;AACH;AAEO,SAAS,qBAAqB,KAAiB,GAAc;AAClE,SAAO,IAAI,uBAAuB;AAAA,IAChC,OAAO,EAAE;AAAA,IACT,cAAc,EAAE;AAAA,IAChB,kBAAkB,EAAE;AAAA,EACtB,CAAC;AACH;AAEO,SAAS,qBAAqB,KAAiB,GAAc;AAClE,SAAO,IAAI,uBAAuB;AAAA,IAChC,OAAO,EAAE;AAAA,IACT,cAAc,EAAE;AAAA,EAClB,CAAC;AACH;AAEO,SAAS,2BAA2B,KAAiB,GAAc;AACxE,SAAO,IAAI,kCAAkC;AAAA,IAC3C,WAAW,EAAE;AAAA,IACb,cAAc,EAAE;AAAA,IAChB,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,EACX,CAAC;AACH;AAEO,SAAS,2BAA2B,KAAiB,GAAc;AACxE,SAAO,IAAI,kCAAkC;AAAA,IAC3C,WAAW,EAAE;AAAA,IACb,cAAc,EAAE;AAAA,IAChB,KAAK,EAAE;AAAA,EACT,CAAC;AACH;;;ApD9CA,IAAMC,YAAWC,eAAc,YAAY,GAAG;AAC9C,IAAMC,eAAeF,UAAS,iBAAiB,EAA0B;AACzE,IAAMG,YAAmB,OAAsC,YAAe;AAqIvE,SAAS,oBAAoB,QAAgB,MAAgB,MAAe,MAAe,OAAuC;AACvI,MAAI,WAAW,OAAQ,QAAO,cAAe,SAAS,OAAO,OAAO,IAAa;AACjF,MAAI,WAAW,OAAQ,QAAO,cAAc,IAAI;AAChD,MAAI,WAAW,MAAO,QAAO,aAAa,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC1D,MAAI,WAAW,gBAAiB,QAAO,gBAAgB;AACvD,MAAI,WAAW,cAAe,QAAO,oBAAoB,MAAM,SAAS,KAAK;AAC7E,MAAI,WAAW,eAAgB,QAAO,qBAAqB;AAC3D,MAAI,WAAW,MAAO,QAAO,aAAa,KAAK,CAAC,CAAC;AACjD,UAAQ,OAAO,MAAM,2BAA2B,MAAM;AAAA,CAAI;AAC1D,UAAQ,WAAW;AACrB;AAEO,SAAS,mBAAmB,GAAoB;AACrD,MAAI,CAAC,EAAE,QAAQ;AACb,oBAAgB;AAChB;AAAA,EACF;AACA,MAAI,CAAC,kBAAkB,SAAS,EAAE,MAAkB,GAAG;AACrD,YAAQ,OAAO;AAAA,MACb,oBAAoB,EAAE,MAAM;AAAA,aAAiB,kBAAkB,KAAK,IAAI,CAAC;AAAA;AAAA,IAC3E;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,iBAAe;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,SAAS,EAAE;AAAA,IACX,SAAS,EAAE;AAAA,EACb,CAAC;AACH;AAEO,SAAS,0BACd,KACA,QACA,MACA,GACA,MACsB;AACtB,MAAI,WAAW,SAAU,QAAO,gBAAgB,KAAK,KAAK,CAAC,GAAG,IAAI;AAClE,MAAI,WAAW,UAAW,QAAO,iBAAiB,KAAK,KAAK,CAAC,GAAG,IAAI;AACpE,MAAI,WAAW;AACb,WAAO,qBAAqB,KAAK,EAAE,UAAU,EAAE,UAAW,QAAQ,EAAE,QAAQ,KAAK,CAAC;AACpF,MAAI,WAAW;AACb,WAAO,mBAAmB,KAAK,EAAE,UAAU,EAAE,UAAW,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAClF,MAAI,WAAW;AACb,WAAO,qBAAqB,KAAK,EAAE,QAAQ,EAAE,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AACnF,MAAI,WAAW,cAAe,QAAO,oBAAoB,KAAK,KAAK,CAAC,GAAG,IAAI;AAC3E,MAAI,WAAW;AACb,WAAO,sBAAsB,KAAK,EAAE,UAAU,EAAE,UAAW,QAAQ,EAAE,QAAQ,KAAK,CAAC;AACvF;AAEO,SAAS,wBACd,KACA,QACA,MACA,GACA,MACsB;AACtB,QAAM,QAAQ,EAAE,UAAU,SAAY,OAAO,EAAE,KAAK,IAAI;AACxD,MAAI,WAAW;AACb,WAAO,mBAAmB,KAAK,KAAK,CAAC,GAAG,EAAE,OAAO,SAAY,OAAO,EAAE,EAAE,IAAI,QAAW,IAAI;AAC7F,MAAI,WAAW;AACb,WAAO,iBAAiB,KAAK,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,OAAO,KAAK,CAAC;AACnE,MAAI,WAAW;AACb,WAAO,qBAAqB,KAAK,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,OAAO,OAAO,KAAK,CAAC;AACxF,MAAI,WAAW;AACb,WAAO,gBAAgB,KAAK,KAAK,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC;AACtD,MAAI,WAAW;AACb,WAAO,sBAAsB,KAAK,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,OAAO,SAAS,EAAE,WAAW,OAAO,KAAK,CAAC;AACvG;AAEO,SAAS,oBACd,KACA,QACA,MACA,GACA,MACsB;AACtB,SACE,0BAA0B,KAAK,QAAQ,MAAM,GAAG,IAAI,KACpD,wBAAwB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAEtD;AAEO,SAAS,0BACd,KACA,QACA,GACA,MACsB;AACtB,MAAI,WAAW;AACb,WAAO,0BAA0B,KAAK,EAAE,SAAU,IAAI;AACxD,MAAI,WAAW;AACb,WAAO,kBAAkB,KAAK,EAAE,QAAQ,EAAE,QAAS,QAAQ,EAAE,QAAS,IAAI,EAAE,IAAI,KAAK,CAAC;AACxF,MAAI,WAAW;AACb,WAAO,uBAAuB,KAAK,EAAE,QAAQ,EAAE,QAAS,QAAQ,EAAE,QAAS,KAAK,CAAC;AACnF,MAAI,WAAW,iBAAkB,QAAO,wBAAwB,KAAK,EAAE,KAAK,IAAI;AAChF,MAAI,WAAW;AACb,WAAO,mBAAmB,KAAK;AAAA,MAC7B,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,MAAM,EAAE;AAAA,MACR,IAAI,EAAE;AAAA,MACN,cAAc,EAAE;AAAA,MAChB,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACL;AAEA,SAAS,qBACP,KACA,QACA,MACA,GACA,MACsB;AACtB,MAAI,WAAW;AACb,WAAO,gBAAgB,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,KAAK,CAAC;AAC/E,QAAM,QAAQ,EAAE,UAAU,SAAY,OAAO,EAAE,KAAK,IAAI;AACxD,MAAI,WAAW,UAAW,QAAO,kBAAkB,KAAK,KAAK,CAAC,GAAG,IAAI;AACrE,MAAI,WAAW,gBAAiB,QAAO,uBAAuB,KAAK,EAAE,KAAK,IAAI;AAC9E,MAAI,WAAW;AACb,WAAO,oBAAoB,KAAK,EAAE,UAAU,EAAE,UAAU,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAClF,MAAI,WAAW;AACb,WAAO,2BAA2B,KAAK;AAAA,MACrC,UAAU,EAAE;AAAA,MACZ,QAAQ,EAAE;AAAA,MACV;AAAA,MACA;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,gBAAgB,KAAK;AAAA,MAC1B,SAAS,EAAE,WAAW;AAAA,MACtB,UAAU,EAAE;AAAA,MACZ,KAAK,EAAE;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,eAAe,KAAK,EAAE,UAAU,EAAE,UAAW,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAC9E,MAAI,WAAW,SAAU,QAAO,iBAAiB,KAAK,IAAI;AAC1D,SAAO,0BAA0B,KAAK,QAAQ,GAAG,IAAI;AACvD;AAEA,SAAS,sBACP,KACA,WACA,GACA,MACsB;AACtB,MAAI,cAAc;AAChB,WAAO,iBAAiB,KAAK;AAAA,MAC3B,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,SAAS,EAAE,WAAW;AAAA,MACtB,IAAI,EAAE;AAAA,MACN,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,iBAAiB,KAAK;AAAA,MAC3B,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,gBAAgB,EAAE;AAAA,MAClB,YAAY,EAAE;AAAA,MACd,gBAAgB,EAAE;AAAA,MAClB,YAAY,EAAE;AAAA,MACd;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,kBAAkB,KAAK,EAAE,QAAS,EAAE,QAAS,IAAI;AAC1D,MAAI,cAAc;AAChB,WAAO,kBAAkB,KAAK;AAAA,MAC5B,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE,UAAU,YAAY;AAAA,MAChC,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACL;AAEA,SAAS,kBACP,KACA,QACA,MACA,GACA,MACsB;AACtB,MAAI,WAAW;AACb,WAAO,cAAc,KAAK;AAAA,MACxB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE,UAAU,YAAY;AAAA,MAChC;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,WAAW,KAAK,EAAE,QAAQ,EAAE,QAAS,OAAO,EAAE,OAAO,SAAS,EAAE,SAAS,KAAK,CAAC;AACxF,MAAI,WAAW;AACb,WAAO,aAAa,KAAK,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,KAAK,CAAC;AACrE,MAAI,WAAW;AACb,WAAO,aAAa,KAAK;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,MACX,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,aAAa,KAAK;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,IAAI,EAAE;AAAA,MACN,IAAI,EAAE;AAAA,MACN,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,cAAc,KAAK,KAAK,CAAC,GAAG,EAAE,OAAQ,IAAI;AACnD,MAAI,WAAW;AACb,WAAO,sBAAsB,KAAK,KAAK,CAAC,GAAG,GAAG,IAAI;AACpD,MAAI,WAAW;AACb,WAAO,aAAa,KAAK,EAAE,QAAQ,EAAE,QAAS,QAAQ,EAAE,QAAS,KAAK,CAAC;AAC3E;AAEA,SAAS,sBACP,KACA,WACA,GACA,MACsB;AACtB,MAAI,cAAc;AAChB,WAAO,sBAAsB,KAAK;AAAA,MAChC,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,IAAI,EAAE;AAAA,MACN,eAAe,EAAE;AAAA,MACjB,gBAAgB,EAAE;AAAA,MAClB,UAAU,EAAE;AAAA,MACZ,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE,UAAU;AAAA,MACpB,YAAY,EAAE;AAAA,MACd;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,iBAAiB,KAAK;AAAA,MAC3B,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,SAAS,EAAE,WAAW;AAAA,MACtB,IAAI,EAAE;AAAA,MACN,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE,UAAU;AAAA,MACpB,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,YAAY,EAAE;AAAA,MACd;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,iBAAiB,KAAK;AAAA,MAC3B,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,gBAAgB,EAAE;AAAA,MAClB,YAAY,EAAE;AAAA,MACd,gBAAgB,EAAE;AAAA,MAClB,YAAY,EAAE;AAAA,MACd;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,kBAAkB,KAAK,EAAE,QAAS,EAAE,QAAS,IAAI;AAC1D,MAAI,cAAc;AAChB,WAAO,kBAAkB,KAAK;AAAA,MAC5B,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE,UAAU,YAAY;AAAA,MAChC,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACL;AAEO,SAAS,kBACd,KACA,QACA,MACA,GACA,MACsB;AACtB,MAAI,WAAW;AACb,WAAO,iBAAiB,KAAK,KAAK,CAAC,KAAK,EAAE,QAAQ,IAAI;AACxD,MAAI,WAAW;AACb,WAAO,cAAc,KAAK;AAAA,MACxB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE,UAAU,YAAY;AAAA,MAChC;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,WAAW,KAAK,EAAE,QAAQ,EAAE,QAAS,OAAO,EAAE,OAAO,SAAS,EAAE,SAAS,KAAK,CAAC;AACxF,MAAI,WAAW;AACb,WAAO,aAAa,KAAK;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,SAAS,EAAE,WAAW;AAAA,MACtB;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,aAAa,KAAK;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,mBAAmB,KAAK,EAAE,QAAQ,EAAE,QAAS,SAAS,EAAE,SAAU,KAAK,CAAC;AACjF,MAAI,WAAW;AACb,WAAO,aAAa,KAAK;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,IAAI,EAAE;AAAA,MACN,SAAS,EAAE;AAAA,MACX,IAAI,EAAE;AAAA,MACN,QAAQ,EAAE,UAAU;AAAA,MACpB,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,cAAc,KAAK,KAAK,CAAC,GAAG,EAAE,OAAQ,IAAI;AACnD,MAAI,WAAW;AACb,WAAO,aAAa,KAAK;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,MACX,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,mBAAmB,KAAK;AAAA,MAC7B,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,sBAAsB,KAAK,KAAK,CAAC,GAAG,GAAG,IAAI;AACpD,MAAI,WAAW;AACb,WAAO,aAAa,KAAK,EAAE,QAAQ,EAAE,QAAS,QAAQ,EAAE,QAAS,KAAK,CAAC;AAC3E;AAEA,SAAS,oBACP,KACA,QACA,OACA,GACA,MACsB;AACtB,MAAI,WAAW,UAAU;AACvB,QAAI,SAAyC;AAC7C,QAAI,EAAE,QAAS,UAAS;AAAA,aACf,EAAE,QAAS,UAAS;AAC7B,WAAO,gBAAgB,KAAK,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC5E;AACA,MAAI,WAAW;AACb,WAAO,aAAa,KAAK,EAAE,QAAQ,EAAE,QAAS,OAAO,EAAE,OAAO,SAAS,EAAE,SAAS,KAAK,CAAC;AAC1F,MAAI,WAAW;AACb,WAAO,mBAAmB,KAAK,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,KAAK,KAAK,CAAC;AACvE,MAAI,WAAW;AACb,WAAO,eAAe,KAAK,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,SAAS,EAAE,WAAW,OAAO,KAAK,CAAC;AACpG,MAAI,WAAW;AACb,WAAO,qBAAqB,KAAK,EAAE,KAAK,EAAE,KAAM,SAAS,EAAE,SAAS,KAAK,CAAC;AAC5E,MAAI,WAAW;AACb,WAAO,gBAAgB,KAAK,EAAE,KAAK,EAAE,KAAM,SAAS,EAAE,SAAS,KAAK,CAAC;AACvE,MAAI,WAAW;AACb,WAAO,eAAe,KAAK;AAAA,MACzB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,IAAI,EAAE;AAAA,MACN,IAAI,EAAE;AAAA,MACN,YAAY,EAAE;AAAA,MACd,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,gBAAgB,KAAK,EAAE,QAAQ,EAAE,QAAS,OAAO,EAAE,OAAO,SAAS,EAAE,SAAS,KAAK,CAAC;AAC7F,MAAI,WAAW;AACb,WAAO,eAAe,KAAK;AAAA,MACzB,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,MACX,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,qBAAqB,KAAK,EAAE,QAAQ,EAAE,QAAS,KAAK,CAAC;AAChE;AAEA,SAAS,qBACP,KACA,QACA,MACA,GACA,MACsB;AACtB,MAAI,WAAW,UAAU;AACvB,QAAI,SAAyC;AAC7C,QAAI,EAAE,QAAS,UAAS;AAAA,aACf,EAAE,QAAS,UAAS;AAC7B,WAAO,iBAAiB,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAAA,EACjE;AACA,MAAI,WAAW,YAAa,QAAO,oBAAoB,KAAK,EAAE,QAAQ,IAAI;AAC1E,MAAI,WAAW;AACb,WAAO,gBAAgB,KAAK;AAAA,MAC1B,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,SAAS,EAAE,WAAW;AAAA,MACtB;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,gBAAgB,KAAK;AAAA,MAC1B,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,IAAI,EAAE;AAAA,MACN,QAAQ,EAAE,UAAU;AAAA,MACpB,SAAS,EAAE;AAAA,MACX,IAAI,EAAE;AAAA,MACN,YAAY,EAAE;AAAA,MACd,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,WAAW;AACb,WAAO,iBAAiB,KAAK,KAAK,CAAC,KAAK,EAAE,QAAS,EAAE,OAAQ,IAAI;AACnE,MAAI,WAAW;AACb,WAAO,cAAc,KAAK,EAAE,QAAQ,KAAK,CAAC,KAAK,EAAE,QAAS,OAAO,EAAE,OAAO,KAAK,CAAC;AACpF;AAEO,SAAS,qBACd,KACA,GACA,MACA,MACsB;AACtB,QAAM,YAAY,KAAK,CAAC;AACxB,MAAI,cAAc;AAChB,WAAO,cAAc,KAAK;AAAA,MACxB,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE,UAAU,YAAY;AAAA,MAChC;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,eAAe,KAAK;AAAA,MACzB,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,MACV;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,iBAAiB,KAAK;AAAA,MAC3B,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE,OAAO,SAAS;AAAA,MACxB;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,cAAc,KAAK;AAAA,MACxB,QAAQ,EAAE;AAAA,MACV,aAAa,EAAE;AAAA,MACf,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE;AAAA,MACV,WAAW,EAAE;AAAA,MACb,OAAO,EAAE;AAAA,MACT,IAAI,EAAE;AAAA,MACN,SAAS,EAAE;AAAA,MACX;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,YAAY,KAAK;AAAA,MACtB,QAAQ,EAAE;AAAA,MACV,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,MACV,UAAU,EAAE;AAAA,MACZ;AAAA,IACF,CAAC;AACL;AAEO,SAAS,oBACd,KACA,WACA,GACA,MACsB;AACtB,MAAI,cAAc;AAChB,WAAO,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,OAAO,KAAK,CAAC;AAChE,MAAI,cAAc;AAChB,WAAO,cAAc,KAAK,EAAE,QAAQ,EAAE,QAAS,KAAK,CAAC;AACvD,MAAI,cAAc;AAChB,WAAO,gBAAgB,KAAK,EAAE,QAAQ,EAAE,QAAS,SAAS,EAAE,SAAS,KAAK,CAAC;AAC7E,MAAI,cAAc;AAChB,WAAO,aAAa,KAAK;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,MACb,YAAY,EAAE;AAAA,MACd,eAAe,EAAE;AAAA,MACjB,OAAO,EAAE;AAAA,MACT,cAAc,EAAE;AAAA,MAChB,SAAS,EAAE;AAAA,MACX,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,OAAO,EAAE;AAAA,MACT,QAAQ,EAAE;AAAA,MACV,eAAe,EAAE;AAAA,MACjB,iBAAiB,EAAE;AAAA,MACnB,WAAW,EAAE;AAAA,MACb;AAAA,IACF,CAAC;AACH,MAAI,cAAc;AAChB,WAAO,WAAW,KAAK,EAAE,QAAQ,EAAE,QAAS,KAAK,CAAC;AACtD;AAEO,SAAS,iBACd,KACA,QACA,MACA,GACA,MACsB;AACtB,MAAI,WAAW,OAAQ,QAAO,qBAAqB,KAAK,GAAG,MAAM,IAAI;AACrE,MAAI,WAAW,MAAO,QAAO,oBAAoB,KAAK,KAAK,CAAC,GAAG,GAAG,IAAI;AACxE;AAEO,SAAS,kBACd,KACA,WACA,MACA,GACA,MACsB;AACtB,QAAM,SAAS,KAAK,CAAC;AACrB,QAAM,YAAY,KAAK,MAAM,CAAC;AAC9B,MAAI,cAAc,UAAW,QAAO,yBAAyB,KAAK,QAAQ,WAAW,GAAG,IAAI;AAC5F,MAAI,cAAc,UAAW,QAAO,yBAAyB,KAAK,QAAQ,GAAG,IAAI;AACjF,UAAQ,OAAO,MAAM,4BAA4B,SAAS;AAAA;AAAA,CAA6B;AACvF,UAAQ,WAAW;AACrB;AAEA,SAAS,yBACP,KACA,QACA,MACA,GACA,MACsB;AACtB,QAAM,QAAQ,EAAE,UAAU,SAAY,OAAO,EAAE,KAAK,IAAI;AACxD,MAAI,WAAW,UAAW,QAAO,sBAAsB,KAAK,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI;AAClF,MAAI,WAAW,WAAY,QAAO,uBAAuB,KAAK,EAAE,KAAK,EAAE,KAAM,KAAK,EAAE,KAAM,MAAM,EAAE,MAAM,KAAK,CAAC;AAC9G,MAAI,WAAW,SAAU,QAAO,qBAAqB,KAAK,EAAE,KAAK,EAAE,KAAM,KAAK,EAAE,KAAM,KAAK,CAAC;AAC5F,MAAI,WAAW,WAAY,QAAO,sBAAsB,KAAK,EAAE,KAAK,EAAE,KAAM,MAAM,EAAE,MAAO,KAAK,CAAC;AACjG,MAAI,WAAW,kBAAmB,QAAO,sBAAsB,KAAK,EAAE,KAAK,EAAE,KAAK,OAAO,KAAK,CAAC;AAC/F,MAAI,WAAW,eAAgB,QAAO,0BAA0B,KAAK,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI;AAC3F,MAAI,WAAW,eAAgB,QAAO,0BAA0B,KAAK,EAAE,KAAK,EAAE,KAAK,OAAO,KAAK,CAAC;AAChG,UAAQ,OAAO,MAAM,iCAAiC,MAAM;AAAA,CAAI;AAChE,UAAQ,WAAW;AACrB;AAEA,SAAS,yBACP,KACA,QACA,GACA,MACsB;AACtB,MAAI,WAAW,SAAU,QAAO,qBAAqB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAC9F,MAAI,WAAW,WAAY,QAAO,uBAAuB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAClG,MAAI,WAAW,SAAU,QAAO,qBAAqB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAC9F,MAAI,WAAW,SAAU,QAAO,qBAAqB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAC9F,MAAI,WAAW,SAAU,QAAO,2BAA2B,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AACpG,MAAI,WAAW,UAAW,QAAO,2BAA2B,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AACrG,UAAQ,OAAO,MAAM,iCAAiC,MAAM;AAAA,CAAI;AAChE,UAAQ,WAAW;AACrB;AAEA,SAAS,aAAa,QAAkE,MAAqB;AAC3G,MAAI,MAAM;AACR,YAAQ,OAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAAA,EAC7D,OAAO;AACL,YAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM,MAAM,CAAC,IAAI,IAAI;AAAA,EAClE;AACF;AAMA,SAAS,kBAAkB,aAA6B;AACtD,QAAM,CAAC,QAAQ,QAAQ,IAAI;AAC3B,MAAI,CAAC,OAAQ,WAAU;AAAA,WACd,CAAC,SAAU,WAAU,MAAM;AAAA,MAC/B,WAAU,QAAQ,QAAQ;AACjC;AAEA,SAAS,0BAA0B,QAAkD,SAAwB;AAC3G,MAAI,YAAY;AAChB,MAAI,OAAO,WAAW,OAAO,QAAQ;AACnC,gBAAY,UAAU,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,EAC9E,WAAW,OAAO,SAAS;AACzB,gBAAY;AAAA,EACd;AACA,UAAQ,OAAO;AAAA,IACb,6BAA6B,WAAW,SAAS,SAAS,OAAO,IAAI,SAAS,OAAO,OAAO,SAAS,SAAS,SAAS,OAAO,OAAO,OAAO,KAAK,YAAY,OAAO,QAAQ,KAAK,GAAG,CAAC;AAAA;AAAA,EACvL;AACF;AAEA,eAAe,OAAsB;AACnC,kBAAgB,yBAAyBD,YAAW;AAEpD,QAAM,EAAE,QAAQ,YAAY,IAAI,SAAS,QAAQ,KAAK,MAAM,CAAC,CAAC;AAE9D,MAAI,OAAO,SAAS;AAClB,YAAQ,OAAO,MAAM,GAAGA,YAAW,KAAKC,SAAQ;AAAA,CAAK;AACrD;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,YAAY,WAAW,GAAG;AAC3C,sBAAkB,WAAW;AAC7B;AAAA,EACF;AAEA,QAAM,CAAC,QAAQ,QAAQ,GAAG,IAAI,IAAI;AAClC,QAAM,IAAI;AACV,QAAM,OAAO,EAAE,QAAQ;AAEvB,MAAI,WAAW,SAAU,QAAO,oBAAoB,QAAQ,MAAM,MAAM,EAAE,MAAM,EAAE,KAAK;AACvF,MAAI,WAAW,QAAS,QAAO,mBAAmB,CAAC;AAEnD,QAAM,SAAS,kBAAkB,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,MAAM,SAAS,EAAE,SAAS,WAAW,iBAAiBD,YAAW,IAAI,WAAW,MAAM,CAAC;AAEtJ,MAAI,OAAO,QAAS,2BAA0B,QAAQ,EAAE,OAAO;AAE/D,MAAI,WAAW,WAAY,QAAO,YAAY,QAAQ,EAAE,WAAW,SAAS;AAE5E,QAAM,SAAS,IAAI,cAAc,MAAM;AACvC,QAAM,MAAM,iBAAiB,QAAQ,MAAM;AAE3C,QAAM,iBAA6D;AAAA,IACjE,QAAS,MAAM,oBAAoB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,IAC7D,SAAS,MAAM,qBAAqB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,IAC9D,MAAS,MAAM,kBAAkB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,IAC3D,MAAS,MAAM,kBAAkB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,IAC3D,SAAS,MAAM,qBAAqB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,IAC9D,QAAS,MAAM,oBAAoB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,IAC7D,KAAS,MAAM,iBAAiB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,IAC1D,MAAS,MAAM,kBAAkB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAAA,EAC7D;AACA,QAAM,UAAU,eAAe,MAAM;AACrC,MAAI,QAAS,QAAO,QAAQ;AAC5B,UAAQ,OAAO,MAAM,oBAAoB,MAAM,IAAI,UAAU,EAAE;AAAA,CAAI;AACnE,UAAQ,WAAW;AACrB;AAEA,KAAK,EAAE,MAAM,CAAC,UAAmB;AAC/B,QAAM,UAAU,mBAAmB,KAAK;AACxC,UAAQ,OAAO,MAAM,UAAU,QAAQ,OAAO;AAAA,CAAI;AAClD,MAAI,QAAQ,QAAS,SAAQ,OAAO,MAAM,YAAY,QAAQ,OAAO;AAAA,CAAI;AACzE,MAAI,QAAQ,WAAY,SAAQ,OAAO,MAAM,SAAS,QAAQ,UAAU;AAAA,CAAI;AAC5E,UAAQ,OAAO,MAAM,kCAAkCA,YAAW;AAAA,CAAI;AACtE,UAAQ,WAAW;AACrB,CAAC;","names":["createRequire","endPtr","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","fs","path","os","elapsed","normalize","path","messages","normalizeWrite","response","path","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","parse","os","maskKey","os","fs","path","path","fs","path","os","getData","getData","getData","getData","getData","getData","_require","createRequire","CLI_VERSION","GIT_HASH"]}
|