@masterpeach/market-sdk 0.2.0-beta.20260930.1
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/README.md +109 -0
- package/README.zh-CN.md +155 -0
- package/THIRD_PARTY_NOTICES.md +14 -0
- package/dist/abi/index.cjs +14051 -0
- package/dist/abi/index.cjs.map +1 -0
- package/dist/abi/index.d.cts +10882 -0
- package/dist/abi/index.d.ts +10882 -0
- package/dist/abi/index.js +27 -0
- package/dist/abi/index.js.map +1 -0
- package/dist/chunk-TMU4HSZR.js +231 -0
- package/dist/chunk-TMU4HSZR.js.map +1 -0
- package/dist/chunk-TTVBOGKZ.js +14015 -0
- package/dist/chunk-TTVBOGKZ.js.map +1 -0
- package/dist/core.cjs +271 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +99 -0
- package/dist/core.d.ts +99 -0
- package/dist/core.js +35 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +13327 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +840 -0
- package/dist/index.d.ts +840 -0
- package/dist/index.js +2705 -0
- package/dist/index.js.map +1 -0
- package/docs/earnings.md +71 -0
- package/docs/frontend.md +153 -0
- package/docs/latest-contract.md +38 -0
- package/docs/liquidity.md +87 -0
- package/docs/management.md +73 -0
- package/docs/pool-state.md +30 -0
- package/docs/pools.md +118 -0
- package/docs/positions.md +94 -0
- package/docs/variants.md +24 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/actions/authorizations.ts","../src/errors.ts","../src/math/identifiers.ts","../src/actions/snapshot.ts","../src/deployment.ts","../src/actions/earnings.ts","../src/math/earnings.ts","../src/math/pool-state.ts","../src/actions/positions.ts","../src/actions/pools.ts","../src/actions/fees.ts","../src/actions/pool-state.ts","../src/actions/write/preview.ts","../src/math/liquidity.ts","../src/actions/write/guards.ts","../src/chains.ts","../src/actions/write/transactions.ts","../src/actions/write/management.ts","../src/math/calendar.ts","../src/verify.ts","../src/client.ts","../src/test-pools.ts"],"sourcesContent":["import { type Address, getAddress } from \"viem\";\nimport { marketRampAbi } from \"../abi\";\nimport type { MarketShareAuthorization } from \"../earnings-types\";\nimport { MarketSettlingError } from \"../errors\";\nimport { assertMarketAddress, assertMarketUint } from \"../math/identifiers\";\nimport type { MarketReadContext, MarketReadOptions, MarketSnapshot } from \"../read-types\";\nimport { readMarketSnapshot, requireMarketHook } from \"./snapshot\";\n\nexport function getMarketShareAuthorization(\n context: MarketReadContext,\n params: MarketReadOptions & {\n readonly hook: Address;\n readonly rangeId: bigint;\n readonly owner: Address;\n readonly operator: Address;\n },\n): Promise<MarketSnapshot<MarketShareAuthorization>> {\n assertMarketAddress(params.owner, \"owner\");\n assertMarketAddress(params.operator, \"operator\");\n assertMarketUint(params.rangeId, \"rangeId\");\n const owner = getAddress(params.owner);\n const operator = getAddress(params.operator);\n const rangeId = params.rangeId;\n const hook = requireMarketHook(context, params.hook).address;\n return readMarketSnapshot(context, params, async (scope) => {\n const target = {\n address: hook,\n abi: marketRampAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n if (await scope.publicClient.readContract({ ...target, functionName: \"isSettling\" }))\n throw new MarketSettlingError(hook);\n const [shares, allowance, isShareOperator, isClaimOperator] = await Promise.all([\n scope.publicClient.readContract({\n ...target,\n functionName: \"balanceOf\",\n args: [owner, rangeId],\n }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"allowance\",\n args: [owner, operator, rangeId],\n }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"isOperator\",\n args: [owner, operator],\n }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"isClaimOperator\",\n args: [owner, rangeId, operator],\n }),\n ]);\n return { hook, rangeId, owner, operator, shares, allowance, isShareOperator, isClaimOperator };\n });\n}\n\nexport function getMarketClaimOperator(\n context: MarketReadContext,\n params: Parameters<typeof getMarketShareAuthorization>[1],\n) {\n const { owner, operator, rangeId } = params;\n assertMarketAddress(owner, \"owner\");\n assertMarketAddress(operator, \"operator\");\n assertMarketUint(rangeId, \"rangeId\");\n const hook = requireMarketHook(context, params.hook).address;\n return readMarketSnapshot(context, params, async (scope) => ({\n hook,\n owner,\n operator,\n rangeId,\n approved: await scope.publicClient.readContract({\n address: hook,\n abi: marketRampAbi,\n functionName: \"isClaimOperator\",\n args: [owner, rangeId, operator],\n blockNumber: scope.block.blockNumber,\n }),\n }));\n}\n","export class InvalidMarketConfigError extends Error {\n constructor(\n readonly field: string,\n message: string,\n ) {\n super(message);\n this.name = \"InvalidMarketConfigError\";\n }\n}\n\nexport class MarketDeploymentVerificationError extends Error {\n constructor(\n readonly field: string,\n readonly expected: unknown,\n readonly actual: unknown,\n ) {\n super(`Market deployment mismatch: ${field}.`);\n this.name = \"MarketDeploymentVerificationError\";\n }\n}\n\nexport class MarketReadError extends Error {\n constructor(cause: unknown) {\n super(\"Market RPC read failed. Inspect cause for transport or contract revert details.\", {\n cause,\n });\n this.name = \"MarketReadError\";\n }\n}\n\nexport class MarketFeatureUnavailableError extends Error {\n constructor(readonly feature: string) {\n super(`Market feature is unavailable for this configuration: ${feature}.`);\n this.name = \"MarketFeatureUnavailableError\";\n }\n}\n\nexport class MarketSettlingError extends Error {\n constructor(readonly hook: `0x${string}`) {\n super(\"The Market ledger is settling; a consistent position snapshot is unavailable.\");\n this.name = \"MarketSettlingError\";\n }\n}\n\nexport class MarketTransactionError extends Error {\n constructor(\n readonly stage: \"simulate\" | \"send\" | \"receipt\",\n cause: unknown,\n ) {\n super(\n `Market transaction ${stage} failed. Inspect cause for RPC, signature or contract details.`,\n { cause },\n );\n this.name = \"MarketTransactionError\";\n }\n}\n\nexport class MarketTransactionReplacedError extends Error {\n constructor(\n readonly originalHash: `0x${string}`,\n readonly replacementHash: `0x${string}`,\n readonly reason: string,\n ) {\n super(`Market transaction was ${reason}; inspect the replacement before continuing.`);\n this.name = \"MarketTransactionReplacedError\";\n }\n}\n","import {\n type Address,\n encodeAbiParameters,\n getAddress,\n type Hex,\n isAddress,\n isAddressEqual,\n keccak256,\n zeroAddress,\n} from \"viem\";\nimport { InvalidMarketConfigError } from \"../errors\";\nimport type { MarketPoolKey } from \"../types\";\n\nexport function assertMarketUint(value: bigint, field: string, bits = 256): void {\n if (typeof value !== \"bigint\" || value < 0n || value >= 1n << BigInt(bits)) {\n throw new InvalidMarketConfigError(field, `Expected a uint${bits} bigint.`);\n }\n}\n\nexport function assertMarketPoolId(value: Hex): void {\n if (!/^0x[0-9a-fA-F]{64}$/.test(value)) {\n throw new InvalidMarketConfigError(\"poolId\", \"Expected a 32-byte pool ID.\");\n }\n}\n\nexport function assertMarketAddress(address: Address, field: string, allowNative = false): void {\n if (!isAddress(address) || (!allowNative && isAddressEqual(address, zeroAddress))) {\n throw new InvalidMarketConfigError(field, \"Expected a valid non-zero address.\");\n }\n}\n\n/** Keeps caller direction intact: rejects unsorted currencies rather than silently swapping them. */\nexport function defineMarketPoolKey(key: MarketPoolKey): MarketPoolKey {\n assertMarketAddress(key.currency0, \"currency0\", true);\n assertMarketAddress(key.currency1, \"currency1\");\n assertMarketAddress(key.hooks, \"hooks\");\n if (BigInt(key.currency0) >= BigInt(key.currency1)) {\n throw new InvalidMarketConfigError(\n \"currencies\",\n \"Currencies must be distinct and sorted by address.\",\n );\n }\n if (key.fee !== 0x800000) {\n throw new InvalidMarketConfigError(\n \"fee\",\n \"Peach Market pools require the v4 dynamic fee flag.\",\n );\n }\n if (!Number.isInteger(key.tickSpacing) || key.tickSpacing < 1 || key.tickSpacing > 32767) {\n throw new InvalidMarketConfigError(\"tickSpacing\", \"Expected v4 tick spacing in [1, 32767].\");\n }\n return Object.freeze({\n currency0: getAddress(key.currency0),\n currency1: getAddress(key.currency1),\n fee: key.fee,\n tickSpacing: key.tickSpacing,\n hooks: getAddress(key.hooks),\n });\n}\n\nexport function getMarketPoolId(input: MarketPoolKey): Hex {\n const key = defineMarketPoolKey(input);\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint24\" },\n { type: \"int24\" },\n { type: \"address\" },\n ],\n [key.currency0, key.currency1, key.fee, key.tickSpacing, key.hooks],\n ),\n );\n}\n\nexport function getMarketRangeId(\n poolId: Hex,\n tickLower: number,\n tickUpper: number,\n tickSpacing = 1,\n): bigint {\n assertMarketPoolId(poolId);\n if (!Number.isInteger(tickSpacing) || tickSpacing < 1 || tickSpacing > 32767) {\n throw new InvalidMarketConfigError(\"tickSpacing\", \"Expected v4 tick spacing in [1, 32767].\");\n }\n if (\n !Number.isInteger(tickLower) ||\n !Number.isInteger(tickUpper) ||\n tickLower < -887272 ||\n tickUpper > 887272 ||\n tickLower >= tickUpper ||\n tickLower % tickSpacing !== 0 ||\n tickUpper % tickSpacing !== 0\n ) {\n throw new InvalidMarketConfigError(\n \"ticks\",\n \"Expected ordered, aligned ticks in the v4 tick range.\",\n );\n }\n return BigInt(\n keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"int24\" }, { type: \"int24\" }],\n [poolId, tickLower, tickUpper],\n ),\n ),\n );\n}\n\n/** Buy means quote -> base; sell means base -> quote. Labels never depend on token symbols. */\nexport function getMarketSwapDirection(\n key: MarketPoolKey,\n base: Address,\n quote: Address,\n side: \"buy\" | \"sell\",\n): boolean {\n const normalized = defineMarketPoolKey(key);\n assertMarketAddress(base, \"base\", true);\n assertMarketAddress(quote, \"quote\", true);\n const baseIs0 =\n isAddressEqual(base, normalized.currency0) && isAddressEqual(quote, normalized.currency1);\n const baseIs1 =\n isAddressEqual(base, normalized.currency1) && isAddressEqual(quote, normalized.currency0);\n if ((!baseIs0 && !baseIs1) || (side !== \"buy\" && side !== \"sell\")) {\n throw new InvalidMarketConfigError(\n \"direction\",\n \"Base/quote must match both pool currencies and side must be buy/sell.\",\n );\n }\n return side === \"sell\" ? baseIs0 : baseIs1;\n}\n","import { type Address, isAddressEqual, keccak256 } from \"viem\";\nimport { defineMarketDeployment } from \"../deployment\";\nimport {\n InvalidMarketConfigError,\n MarketDeploymentVerificationError,\n MarketFeatureUnavailableError,\n MarketReadError,\n MarketSettlingError,\n MarketTransactionError,\n} from \"../errors\";\nimport { assertMarketAddress, assertMarketUint } from \"../math/identifiers\";\nimport type {\n MarketBlock,\n MarketReadContext,\n MarketReadOptions,\n MarketSnapshot,\n} from \"../read-types\";\nimport type { MarketContractDeployment, MarketHookDeployment } from \"../types\";\n\nexport interface MarketReadScope extends MarketReadContext {\n readonly block: MarketBlock;\n}\n\nexport async function readMarketSnapshot<T>(\n context: MarketReadContext,\n options: MarketReadOptions,\n read: (scope: MarketReadScope) => Promise<T>,\n): Promise<MarketSnapshot<T>> {\n const deployment = defineMarketDeployment(context.deployment);\n const publicClient = context.publicClient;\n const { blockNumber, blockHash } = options;\n if (blockNumber !== undefined) assertMarketUint(blockNumber, \"blockNumber\");\n if (\n blockHash !== undefined &&\n (blockNumber === undefined || !/^0x[0-9a-fA-F]{64}$/.test(blockHash))\n ) {\n throw new InvalidMarketConfigError(\n \"blockHash\",\n \"A block hash requires a valid explicit block number.\",\n );\n }\n try {\n const chainId = await publicClient.getChainId();\n if (chainId !== deployment.chainId)\n throw new MarketDeploymentVerificationError(\"chainId\", deployment.chainId, chainId);\n const block = await publicClient.getBlock(\n blockNumber === undefined ? { blockTag: \"latest\" } : { blockNumber },\n );\n if (block.number === null || block.hash === null)\n throw new MarketDeploymentVerificationError(\"block\", \"mined block\", block);\n if (blockNumber !== undefined && block.number !== blockNumber)\n throw new MarketDeploymentVerificationError(\"blockNumber\", blockNumber, block.number);\n if (blockHash !== undefined && block.hash.toLowerCase() !== blockHash.toLowerCase())\n throw new MarketDeploymentVerificationError(\"blockHash\", blockHash, block.hash);\n const snapshot: MarketBlock = Object.freeze({\n chainId,\n deploymentId: deployment.deploymentId,\n blockNumber: block.number,\n blockHash: block.hash,\n timestamp: block.timestamp,\n });\n const data = await read({ publicClient, deployment, block: snapshot });\n const finalBlock = await publicClient.getBlock({ blockNumber: block.number });\n if (finalBlock.hash !== block.hash)\n throw new MarketDeploymentVerificationError(\"blockHash\", block.hash, finalBlock.hash);\n return Object.freeze({ block: snapshot, data });\n } catch (error) {\n if (\n error instanceof InvalidMarketConfigError ||\n error instanceof MarketDeploymentVerificationError ||\n error instanceof MarketFeatureUnavailableError ||\n error instanceof MarketSettlingError ||\n error instanceof MarketReadError ||\n error instanceof MarketTransactionError\n )\n throw error;\n throw new MarketReadError(error);\n }\n}\n\nexport function requireMarketHook(\n scope: MarketReadContext,\n address: Address,\n): MarketHookDeployment {\n assertMarketAddress(address, \"hook\");\n const hook = scope.deployment.hooks.find((entry) => isAddressEqual(entry.address, address));\n if (!hook) throw new MarketFeatureUnavailableError(`unsupported Hook ${address}`);\n return hook;\n}\n\n/** Only used at the optional v4 read boundary; ordinary queries don't rerun full deployment verification. */\nexport async function assertMarketCode(\n scope: MarketReadScope,\n contract: MarketContractDeployment,\n): Promise<void> {\n const code = await scope.publicClient.getCode({\n address: contract.address,\n blockNumber: scope.block.blockNumber,\n });\n const actual = code && code !== \"0x\" ? keccak256(code) : null;\n if (actual !== contract.runtimeCodeHash.toLowerCase())\n throw new MarketDeploymentVerificationError(contract.address, contract.runtimeCodeHash, actual);\n}\n","import { getAddress, isAddress, zeroAddress } from \"viem\";\nimport { InvalidMarketConfigError } from \"./errors\";\nimport type {\n MarketContractDeployment,\n MarketDeployment,\n MarketHookCapabilities,\n MarketHookDeployment,\n} from \"./types\";\n\nfunction invalid(field: string, message: string): never {\n throw new InvalidMarketConfigError(field, message);\n}\n\nfunction contract(input: MarketContractDeployment, field: string): MarketContractDeployment {\n if (!isAddress(input.address) || input.address.toLowerCase() === zeroAddress) {\n invalid(`${field}.address`, \"Expected a non-zero EVM address.\");\n }\n if (!/^0x[0-9a-fA-F]{64}$/.test(input.runtimeCodeHash) || /^0x0+$/.test(input.runtimeCodeHash)) {\n invalid(`${field}.runtimeCodeHash`, \"Expected a non-zero 32-byte runtime code hash.\");\n }\n return Object.freeze({\n address: getAddress(input.address),\n runtimeCodeHash: input.runtimeCodeHash,\n });\n}\n\nconst capabilityKeys = [\"liquidity\", \"nativeLiquidity\", \"claimOperator\", \"management\"] as const;\n\nfunction hook(input: MarketHookDeployment, index: number): MarketHookDeployment {\n const field = `hooks.${index}`;\n if (![\"ramp\", \"ramp-eth\", \"rwa-ramp\"].includes(input.kind)) {\n invalid(`${field}.kind`, \"Unsupported Market Hook kind.\");\n }\n if (input.implementation !== \"ramp-v1\") {\n invalid(`${field}.implementation`, \"Unsupported Market implementation.\");\n }\n if ((input.kind === \"rwa-ramp\") !== (input.calendar !== undefined)) {\n invalid(`${field}.calendar`, \"Only RWA Hooks must include a calendar.\");\n }\n for (const key of capabilityKeys) {\n if (![\"disabled\", \"unverified\", \"verified\"].includes(input.capabilities[key])) {\n invalid(`${field}.capabilities.${key}`, \"Explicit capability acceptance status is required.\");\n }\n }\n if (input.kind !== \"ramp-eth\" && input.capabilities.nativeLiquidity !== \"disabled\") {\n invalid(`${field}.capabilities.nativeLiquidity`, \"Native liquidity requires RampETH.\");\n }\n const capabilities: MarketHookCapabilities = Object.freeze({\n liquidity: input.capabilities.liquidity,\n nativeLiquidity: input.capabilities.nativeLiquidity,\n claimOperator: input.capabilities.claimOperator,\n management: input.capabilities.management,\n });\n return Object.freeze({\n ...contract(input, field),\n kind: input.kind,\n implementation: input.implementation,\n claimFeePolicy: contract(input.claimFeePolicy, `${field}.claimFeePolicy`),\n ...(input.calendar ? { calendar: contract(input.calendar, `${field}.calendar`) } : {}),\n capabilities,\n });\n}\n\n/** Validates and copies configuration. Does not claim that the supplied contracts are deployed. */\nexport function defineMarketDeployment(input: MarketDeployment): MarketDeployment {\n if (!Number.isSafeInteger(input.chainId) || input.chainId <= 0) {\n invalid(\"chainId\", \"Expected a positive safe integer.\");\n }\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(input.deploymentId)) {\n invalid(\"deploymentId\", \"Expected a non-empty lowercase deployment identifier.\");\n }\n if (input.hooks.length === 0) invalid(\"hooks\", \"At least one supported Hook is required.\");\n const hooks = input.hooks.map(hook);\n if (new Set(hooks.map((entry) => entry.address)).size !== hooks.length) {\n invalid(\"hooks\", \"Duplicate Hook addresses are not allowed.\");\n }\n let poolStateReader: MarketDeployment[\"poolStateReader\"];\n if (input.poolStateReader?.kind === \"state-view\") {\n poolStateReader = Object.freeze({\n kind: \"state-view\",\n contract: contract(input.poolStateReader.contract, \"poolStateReader.contract\"),\n });\n } else if (input.poolStateReader?.kind === \"extsload\") {\n if (input.poolStateReader.layout !== \"uniswap-v4-v1\") {\n invalid(\"poolStateReader.layout\", \"Unsupported PoolManager storage layout.\");\n }\n poolStateReader = Object.freeze({ kind: \"extsload\", layout: \"uniswap-v4-v1\" });\n } else if (input.poolStateReader !== undefined) {\n invalid(\"poolStateReader.kind\", \"Unsupported pool state reader.\");\n }\n return Object.freeze({\n chainId: input.chainId,\n deploymentId: input.deploymentId,\n poolManager: contract(input.poolManager, \"poolManager\"),\n registry: contract(input.registry, \"registry\"),\n authority: contract(input.authority, \"authority\"),\n ...(input.reader ? { reader: contract(input.reader, \"reader\") } : {}),\n ...(poolStateReader ? { poolStateReader } : {}),\n hooks: Object.freeze(hooks),\n });\n}\n","import { encodeAbiParameters, encodePacked, isAddressEqual, keccak256, toHex } from \"viem\";\nimport { marketClaimFeePolicyAbi, marketRampAbi } from \"../abi\";\nimport { marketExtsloadAbi, marketStateViewAbi } from \"../abi/v4\";\nimport { immutableClone } from \"../core\";\nimport type { MarketFeeLedger } from \"../earnings-types\";\nimport { MarketDeploymentVerificationError, MarketFeatureUnavailableError } from \"../errors\";\nimport { calculateMarketClaimableFees } from \"../math/earnings\";\nimport { marketPoolStorageSlots } from \"../math/pool-state\";\nimport type { MarketPositionParams, MarketReadContext, MarketSnapshot } from \"../read-types\";\nimport { getMarketPosition } from \"./positions\";\nimport { assertMarketCode, readMarketSnapshot, requireMarketHook } from \"./snapshot\";\n\nexport function getMarketFeeSnapshot(\n context: MarketReadContext,\n input: MarketPositionParams,\n): Promise<MarketSnapshot<MarketFeeLedger>> {\n const params = immutableClone(input);\n return readMarketSnapshot(context, params, async (scope) => {\n const position = (await getMarketPosition(context, { ...params, ...scope.block })).data;\n const range = position.range;\n if (range.status !== \"set\")\n throw new MarketFeatureUnavailableError(\"earnings for an unset range\");\n const hook = requireMarketHook(scope, range.hook);\n const reader = scope.deployment.poolStateReader;\n if (!reader)\n throw new MarketFeatureUnavailableError(\"poolStateReader for gross position baseline\");\n for (const contract of [hook, hook.claimFeePolicy, scope.deployment.poolManager])\n await assertMarketCode(scope, contract);\n const target = {\n address: hook.address,\n abi: marketRampAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const policy = {\n address: hook.claimFeePolicy.address,\n abi: marketClaimFeePolicyAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const [\n manager,\n policyAddress,\n ledgerAddress,\n growth,\n claimFeeSyncIndex,\n policyHistoryLength,\n currentClaimFeeBps,\n allTimeMinClaimFeeBps,\n ] = await Promise.all([\n scope.publicClient.readContract({ ...target, functionName: \"poolManager\" }),\n scope.publicClient.readContract({ ...target, functionName: \"claimFeePolicy\" }),\n scope.publicClient.readContract({ ...policy, functionName: \"ledger\" }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"rangeGrowth\",\n args: [range.rangeId],\n }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"claimFeeSyncIndex\",\n args: [range.rangeId],\n }),\n scope.publicClient.readContract({ ...policy, functionName: \"length\", args: [range.poolId] }),\n scope.publicClient.readContract({ ...policy, functionName: \"current\", args: [range.poolId] }),\n scope.publicClient.readContract({ ...policy, functionName: \"minimum\", args: [range.poolId] }),\n ]);\n for (const [name, expected, actual] of [\n [\"manager\", scope.deployment.poolManager.address, manager],\n [\"policy\", hook.claimFeePolicy.address, policyAddress],\n [\"ledger\", hook.address, ledgerAddress],\n ] as const) {\n if (!isAddressEqual(expected, actual))\n throw new MarketDeploymentVerificationError(name, expected, actual);\n }\n // v4 position owner is the Hook; salt is the full rangeId, not the user's address.\n const positionId = keccak256(\n encodePacked(\n [\"address\", \"int24\", \"int24\", \"bytes32\"],\n [hook.address, range.tickLower, range.tickUpper, toHex(range.rangeId, { size: 32 })],\n ),\n );\n let managerState: readonly [bigint, bigint, bigint];\n if (reader.kind === \"state-view\") {\n await assertMarketCode(scope, reader.contract);\n const view = {\n address: reader.contract.address,\n abi: marketStateViewAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const bound = await scope.publicClient.readContract({ ...view, functionName: \"poolManager\" });\n if (!isAddressEqual(bound, manager))\n throw new MarketDeploymentVerificationError(\"stateView.poolManager\", manager, bound);\n managerState = await scope.publicClient.readContract({\n ...view,\n functionName: \"getPositionInfo\",\n args: [range.poolId, positionId],\n });\n } else {\n const poolSlot = marketPoolStorageSlots(range.poolId)[0];\n const base = BigInt(\n keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"uint256\" }],\n [positionId, BigInt.asUintN(256, BigInt(poolSlot) + 6n)],\n ),\n ),\n );\n const slots = [0n, 1n, 2n].map((offset) =>\n toHex(BigInt.asUintN(256, base + offset), { size: 32 }),\n );\n const words = await scope.publicClient.readContract({\n address: manager,\n abi: marketExtsloadAbi,\n functionName: \"extsload\",\n args: [slots],\n blockNumber: scope.block.blockNumber,\n });\n const [liquidity, last0, last1] = words;\n if (\n words.length !== 3 ||\n !liquidity ||\n !last0 ||\n !last1 ||\n words.some((word) => !/^0x[0-9a-fA-F]{64}$/.test(word))\n )\n throw new MarketDeploymentVerificationError(\n \"position storage\",\n \"three 32-byte words\",\n words,\n );\n managerState = [BigInt(liquidity), BigInt(last0), BigInt(last1)];\n }\n if (managerState[0] !== range.state.totalShares)\n throw new MarketDeploymentVerificationError(\n \"managerLiquidity\",\n range.state.totalShares,\n managerState[0],\n );\n return immutableClone({\n position: { ...position, range },\n managerLiquidity: managerState[0],\n lastGrowth0X128: managerState[1],\n lastGrowth1X128: managerState[2],\n growth0X128: growth[0],\n growth1X128: growth[1],\n claimFeeSyncIndex,\n policyHistoryLength,\n currentClaimFeeBps,\n allTimeMinClaimFeeBps,\n });\n });\n}\n\nexport async function estimateMarketClaimableFees(\n context: MarketReadContext,\n params: MarketPositionParams,\n) {\n const snapshot = await getMarketFeeSnapshot(context, params);\n return immutableClone({\n block: snapshot.block,\n data: calculateMarketClaimableFees(snapshot.data),\n });\n}\n","import type { MarketClaimableFees, MarketFeeLedger, MarketTokenEarnings } from \"../earnings-types\";\nimport { InvalidMarketConfigError } from \"../errors\";\nimport { assertMarketUint } from \"./identifiers\";\n\nconst Q128 = 1n << 128n;\n\n/** Only v4 gross growth wraps. Ramp net accumulators and debts use checked arithmetic. */\nexport function calculateMarketClaimableFees(ledger: MarketFeeLedger): MarketClaimableFees {\n const { position } = ledger;\n const { state, effectiveClaimFeeBps } = position.range;\n assertMarketUint(state.totalShares, \"totalShares\", 128);\n assertMarketUint(position.shares, \"shares\", 128);\n assertMarketUint(ledger.managerLiquidity, \"managerLiquidity\", 128);\n if (position.shares > state.totalShares || state.totalShares !== ledger.managerLiquidity)\n throw new InvalidMarketConfigError(\n \"liquidity\",\n \"Hook shares and manager liquidity are inconsistent.\",\n );\n if (\n !Number.isInteger(effectiveClaimFeeBps) ||\n effectiveClaimFeeBps < 0 ||\n effectiveClaimFeeBps > 2000\n )\n throw new InvalidMarketConfigError(\"effectiveClaimFeeBps\", \"Invalid effective fee rate.\");\n function token(\n owed: bigint,\n acc: bigint,\n checkpoint: bigint,\n remainder: bigint,\n live: bigint,\n last: bigint,\n ): MarketTokenEarnings {\n for (const [name, value] of [\n [\"acc\", acc],\n [\"checkpoint\", checkpoint],\n [\"live\", live],\n [\"last\", last],\n ] as const)\n assertMarketUint(value, name);\n assertMarketUint(owed, \"owed\", 128);\n assertMarketUint(remainder, \"remainder\", 128);\n if (checkpoint > acc)\n throw new InvalidMarketConfigError(\n \"checkpoint\",\n \"Net checkpoint exceeds the checked Hook accumulator.\",\n );\n const gross =\n state.totalShares === 0n ? 0n : (BigInt.asUintN(256, live - last) * state.totalShares) / Q128;\n // PoolManager converts accrued fees to int128 before Ramp receives them.\n assertMarketUint(gross, \"pendingRangeGross\", 127);\n const cut = (gross * BigInt(effectiveClaimFeeBps)) / 10000n;\n const nextAcc =\n acc + (state.totalShares === 0n ? 0n : ((gross - cut) * Q128) / state.totalShares);\n assertMarketUint(nextAcc, \"nextAccumulator\");\n const syncedNumerator = position.shares * (acc - checkpoint) + remainder;\n const numerator = position.shares * (nextAcc - checkpoint) + remainder;\n const synchronized = syncedNumerator / Q128;\n const earned = numerator / Q128;\n assertMarketUint(earned, \"earned\", 128);\n assertMarketUint(owed + earned, \"claimable\", 128);\n return {\n settled: owed,\n synchronized,\n pending: earned - synchronized,\n claimable: owed + earned,\n remainderX128: numerator % Q128,\n pendingRangeGross: gross,\n pendingRangeProtocolFee: cut,\n };\n }\n const token0 = token(\n position.settledOwed0,\n state.accFee0X128,\n position.checkpoint0X128,\n position.remainder0X128,\n ledger.growth0X128,\n ledger.lastGrowth0X128,\n );\n const token1 = token(\n position.settledOwed1,\n state.accFee1X128,\n position.checkpoint1X128,\n position.remainder1X128,\n ledger.growth1X128,\n ledger.lastGrowth1X128,\n );\n return {\n ledger,\n token0,\n token1,\n paused: position.range.globalPaused || position.range.poolPaused,\n hasClaimableAmount: token0.claimable > 0n || token1.claimable > 0n,\n };\n}\n","import { encodeAbiParameters, type Hex, keccak256, toHex } from \"viem\";\nimport { InvalidMarketConfigError } from \"../errors\";\nimport { assertMarketPoolId } from \"./identifiers\";\n\n// StateLibrary (v4-core 46c6834698c48bc4a463a86d8420f4eb1d7f3b75): pools slot 6, liquidity offset 3.\nexport function marketPoolStorageSlots(poolId: Hex): readonly [Hex, Hex] {\n assertMarketPoolId(poolId);\n const slot = keccak256(\n encodeAbiParameters([{ type: \"bytes32\" }, { type: \"uint256\" }], [poolId, 6n]),\n );\n return [slot, toHex((BigInt(slot) + 3n) % (1n << 256n), { size: 32 })];\n}\n\nexport function decodeMarketPoolStateWords(words: readonly Hex[]) {\n const [slot0, liquidity] = words;\n if (\n words.length !== 2 ||\n slot0 === undefined ||\n liquidity === undefined ||\n !/^0x[0-9a-fA-F]{64}$/.test(slot0) ||\n !/^0x[0-9a-fA-F]{64}$/.test(liquidity)\n ) {\n throw new InvalidMarketConfigError(\"extsload\", \"Expected exactly two 32-byte storage words.\");\n }\n const raw = BigInt(slot0);\n return {\n sqrtPriceX96: raw & ((1n << 160n) - 1n),\n tick: Number(BigInt.asIntN(24, raw >> 160n)),\n protocolFeePacked: Number((raw >> 184n) & 0xffffffn),\n storedLpFeePips: Number((raw >> 208n) & 0xffffffn),\n activeLiquidity: BigInt(liquidity) & ((1n << 128n) - 1n),\n };\n}\n","import { getAddress, isAddressEqual } from \"viem\";\nimport { marketRampAbi } from \"../abi\";\nimport { MarketDeploymentVerificationError, MarketSettlingError } from \"../errors\";\nimport {\n assertMarketAddress,\n assertMarketUint,\n defineMarketPoolKey,\n getMarketPoolId,\n getMarketRangeId,\n} from \"../math/identifiers\";\nimport type {\n MarketPosition,\n MarketPositionParams,\n MarketRange,\n MarketRangeParams,\n MarketReadContext,\n MarketSnapshot,\n} from \"../read-types\";\nimport { type MarketReadScope, readMarketSnapshot, requireMarketHook } from \"./snapshot\";\n\nasync function readRange(\n scope: MarketReadScope,\n params: Pick<MarketRangeParams, \"hook\" | \"rangeId\">,\n): Promise<MarketRange> {\n const hook = requireMarketHook(scope, params.hook);\n const target = {\n address: hook.address,\n abi: marketRampAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n if (await scope.publicClient.readContract({ ...target, functionName: \"isSettling\" }))\n throw new MarketSettlingError(hook.address);\n const [rawKey, tickLower, tickUpper, set] = await scope.publicClient.readContract({\n ...target,\n functionName: \"rangeKey\",\n args: [params.rangeId],\n });\n if (!set) return { status: \"unset\", hook: hook.address, rangeId: params.rangeId };\n const key = defineMarketPoolKey(rawKey);\n if (!isAddressEqual(key.hooks, hook.address))\n throw new MarketDeploymentVerificationError(\"rangeKey.hooks\", hook.address, key.hooks);\n const poolId = getMarketPoolId(key);\n const expectedId = getMarketRangeId(poolId, tickLower, tickUpper, key.tickSpacing);\n if (expectedId !== params.rangeId)\n throw new MarketDeploymentVerificationError(\"rangeId\", params.rangeId, expectedId);\n const [state, globalPaused, poolPaused, effectiveClaimFeeBps] = await Promise.all([\n scope.publicClient.readContract({\n ...target,\n functionName: \"rangeState\",\n args: [params.rangeId],\n }),\n scope.publicClient.readContract({ ...target, functionName: \"paused\" }),\n scope.publicClient.readContract({ ...target, functionName: \"pausedFor\", args: [poolId] }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"effectiveClaimFee\",\n args: [params.rangeId],\n }),\n ]);\n return {\n status: \"set\",\n hook: hook.address,\n rangeId: params.rangeId,\n key,\n poolId,\n tickLower,\n tickUpper,\n state,\n globalPaused,\n poolPaused,\n effectiveClaimFeeBps,\n };\n}\n\nexport function getMarketRange(\n context: MarketReadContext,\n params: MarketRangeParams,\n): Promise<MarketSnapshot<MarketRange>> {\n const { hook, rangeId } = params;\n assertMarketAddress(hook, \"hook\");\n assertMarketUint(rangeId, \"rangeId\");\n return readMarketSnapshot(context, params, (scope) => readRange(scope, { hook, rangeId }));\n}\n\nexport function getMarketPosition(\n context: MarketReadContext,\n params: MarketPositionParams,\n): Promise<MarketSnapshot<MarketPosition>> {\n const { hook, rangeId } = params;\n assertMarketAddress(hook, \"hook\");\n assertMarketUint(rangeId, \"rangeId\");\n assertMarketAddress(params.owner, \"owner\");\n const owner = getAddress(params.owner);\n return readMarketSnapshot(context, params, async (scope) => {\n const range = await readRange(scope, { hook, rangeId });\n const target = {\n address: range.hook,\n abi: marketRampAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const [shares, position, remainder] = await Promise.all([\n scope.publicClient.readContract({\n ...target,\n functionName: \"balanceOf\",\n args: [owner, rangeId],\n }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"userPosition\",\n args: [rangeId, owner],\n }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"userFeeRemainder\",\n args: [rangeId, owner],\n }),\n ]);\n return {\n range,\n owner,\n shares,\n settledOwed0: position.owed0,\n settledOwed1: position.owed1,\n checkpoint0X128: position.checkpoint0X128,\n checkpoint1X128: position.checkpoint1X128,\n remainder0X128: remainder[0],\n remainder1X128: remainder[1],\n };\n });\n}\n","import { type Hex, isAddressEqual, zeroAddress } from \"viem\";\nimport { marketPoolRegistryAbi } from \"../abi\";\nimport { InvalidMarketConfigError, MarketDeploymentVerificationError } from \"../errors\";\nimport {\n assertMarketPoolId,\n assertMarketUint,\n defineMarketPoolKey,\n getMarketPoolId,\n} from \"../math/identifiers\";\nimport type {\n MarketListPoolsParams,\n MarketPool,\n MarketPoolPage,\n MarketReadContext,\n MarketReadOptions,\n MarketSnapshot,\n} from \"../read-types\";\nimport type { MarketPoolKey } from \"../types\";\nimport { type MarketReadScope, readMarketSnapshot, requireMarketHook } from \"./snapshot\";\n\nfunction normalizePool(\n scope: MarketReadScope,\n raw: { key: MarketPoolKey; id: Hex; active: boolean },\n): MarketPool {\n const key = defineMarketPoolKey(raw.key);\n const expected = getMarketPoolId(key);\n if (expected.toLowerCase() !== raw.id.toLowerCase())\n throw new MarketDeploymentVerificationError(\"poolId\", expected, raw.id);\n const hookKind =\n scope.deployment.hooks.find((entry) => isAddressEqual(entry.address, key.hooks))?.kind ?? null;\n return { key, poolId: raw.id, active: raw.active, hookKind };\n}\n\nexport async function readMarketPoolAt(scope: MarketReadScope, poolId: Hex): Promise<MarketPool> {\n const raw = await scope.publicClient.readContract({\n address: scope.deployment.registry.address,\n abi: marketPoolRegistryAbi,\n functionName: \"poolById\",\n args: [poolId],\n blockNumber: scope.block.blockNumber,\n });\n const pool = normalizePool(scope, raw);\n if (pool.poolId.toLowerCase() !== poolId.toLowerCase())\n throw new MarketDeploymentVerificationError(\"registry.poolId\", poolId, pool.poolId);\n return pool;\n}\n\nexport function requireMarketPoolHook(scope: MarketReadScope, pool: MarketPool) {\n const hook = requireMarketHook(scope, pool.key.hooks);\n if (isAddressEqual(pool.key.currency0, zeroAddress) && hook.kind !== \"ramp-eth\") {\n throw new InvalidMarketConfigError(\"currency0\", \"Native currency requires RampETH.\");\n }\n return hook;\n}\n\nexport function getMarketPool(\n context: MarketReadContext,\n poolId: Hex,\n options: MarketReadOptions = {},\n): Promise<MarketSnapshot<MarketPool>> {\n assertMarketPoolId(poolId);\n return readMarketSnapshot(context, options, (scope) => readMarketPoolAt(scope, poolId));\n}\n\nexport function listMarketPools(\n context: MarketReadContext,\n params: MarketListPoolsParams = {},\n): Promise<MarketSnapshot<MarketPoolPage>> {\n const { offset = 0n, limit = 20, activeOnly = false } = params;\n assertMarketUint(offset, \"offset\");\n if (!Number.isInteger(limit) || limit < 1 || limit > 100)\n throw new InvalidMarketConfigError(\"limit\", \"Page size must be in [1, 100].\");\n return readMarketSnapshot(context, params, async (scope) => {\n const target = {\n address: scope.deployment.registry.address,\n abi: marketPoolRegistryAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const totalCount = await scope.publicClient.readContract({\n ...target,\n functionName: \"poolCount\",\n });\n const end = offset + BigInt(limit) < totalCount ? offset + BigInt(limit) : totalCount;\n const pools: MarketPool[] = [];\n // At most eight concurrent reads; no dependency on a chain's Multicall3 deployment.\n for (let start = offset; start < end; start += 8n) {\n const count = Number(end - start < 8n ? end - start : 8n);\n const batch = await Promise.all(\n Array.from({ length: count }, (_, index) =>\n scope.publicClient.readContract({\n ...target,\n functionName: \"poolAt\",\n args: [start + BigInt(index)],\n }),\n ),\n );\n for (const entry of batch) {\n const pool = normalizePool(scope, entry);\n if (!activeOnly || pool.active) pools.push(pool);\n }\n }\n return { pools, totalCount, nextOffset: end < totalCount ? end : null };\n });\n}\n","import type { Hex } from \"viem\";\nimport { marketRampAbi, marketRampReaderAbi, marketRwaRampAbi } from \"../abi\";\nimport {\n InvalidMarketConfigError,\n MarketDeploymentVerificationError,\n MarketFeatureUnavailableError,\n} from \"../errors\";\nimport { assertMarketPoolId, assertMarketUint } from \"../math/identifiers\";\nimport type {\n MarketCurrentFees,\n MarketFeeBreakdown,\n MarketReadContext,\n MarketReadOptions,\n MarketSession,\n MarketSessionState,\n MarketSnapshot,\n} from \"../read-types\";\nimport { readMarketPoolAt, requireMarketPoolHook } from \"./pools\";\nimport { type MarketReadScope, readMarketSnapshot } from \"./snapshot\";\n\nfunction sessionName(value: number): MarketSession {\n if (value === 0) return \"open\";\n if (value === 1) return \"overnight\";\n if (value === 2) return \"closed\";\n throw new MarketDeploymentVerificationError(\"session\", \"0, 1 or 2\", value);\n}\n\nexport function getMarketCurrentFees(\n context: MarketReadContext,\n poolId: Hex,\n options: MarketReadOptions = {},\n): Promise<MarketSnapshot<MarketCurrentFees>> {\n assertMarketPoolId(poolId);\n return readMarketSnapshot(context, options, async (scope) => {\n const pool = await readMarketPoolAt(scope, poolId);\n const hook = requireMarketPoolHook(scope, pool);\n const target = {\n address: hook.address,\n abi: marketRampAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const [fee0For1Pips, fee1For0Pips, globalPaused, poolPaused] = await Promise.all([\n scope.publicClient.readContract({\n ...target,\n functionName: \"currentFee\",\n args: [poolId, true],\n }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"currentFee\",\n args: [poolId, false],\n }),\n scope.publicClient.readContract({ ...target, functionName: \"paused\" }),\n scope.publicClient.readContract({ ...target, functionName: \"pausedFor\", args: [poolId] }),\n ]);\n return { pool, fee0For1Pips, fee1For0Pips, globalPaused, poolPaused };\n });\n}\n\nasync function readFeeBreakdown(\n scope: MarketReadScope,\n poolId: Hex,\n zeroForOne: boolean,\n timestamp: bigint,\n mode: \"current\" | \"preview\",\n): Promise<MarketFeeBreakdown> {\n const reader = scope.deployment.reader;\n if (!reader) throw new MarketFeatureUnavailableError(\"feeBreakdown requires a Reader\");\n const pool = await readMarketPoolAt(scope, poolId);\n const hook = requireMarketPoolHook(scope, pool);\n const result = await scope.publicClient.readContract({\n address: reader.address,\n abi: marketRampReaderAbi,\n functionName: \"feeBreakdown\",\n args: [poolId, zeroForOne, timestamp],\n blockNumber: scope.block.blockNumber,\n });\n if (result.hasSession !== (hook.kind === \"rwa-ramp\"))\n throw new MarketDeploymentVerificationError(\n \"reader.hasSession\",\n hook.kind === \"rwa-ramp\",\n result.hasSession,\n );\n return {\n pool,\n zeroForOne,\n timestamp,\n mode,\n session: result.hasSession ? sessionName(result.session) : null,\n baseFeePips: result.baseFee,\n directionalPremiumPips: result.directionalPremium,\n cappedAutonomousFeePips: result.cappedAutonomousFee,\n overrideActive: result.overrideActive,\n overrideFeePips: result.overrideFee,\n overrideExpiry: BigInt(result.overrideExpiry),\n overrideMinFeePips: result.overrideMinFee,\n maxFeePips: result.maxFee,\n finalFeePips: result.finalFee,\n };\n}\n\nfunction assertDirection(value: boolean): void {\n if (typeof value !== \"boolean\")\n throw new InvalidMarketConfigError(\"zeroForOne\", \"Expected an explicit direction boolean.\");\n}\n\nexport function getMarketFeeBreakdown(\n context: MarketReadContext,\n poolId: Hex,\n zeroForOne: boolean,\n options: MarketReadOptions = {},\n): Promise<MarketSnapshot<MarketFeeBreakdown>> {\n assertMarketPoolId(poolId);\n assertDirection(zeroForOne);\n return readMarketSnapshot(context, options, (scope) =>\n readFeeBreakdown(scope, poolId, zeroForOne, scope.block.timestamp, \"current\"),\n );\n}\n\n/** Uses the selected block's configuration, not historical configuration at the requested timestamp. */\nexport function previewMarketFeeAt(\n context: MarketReadContext,\n poolId: Hex,\n zeroForOne: boolean,\n timestamp: bigint,\n options: MarketReadOptions = {},\n): Promise<MarketSnapshot<MarketFeeBreakdown>> {\n assertMarketPoolId(poolId);\n assertDirection(zeroForOne);\n assertMarketUint(timestamp, \"timestamp\");\n return readMarketSnapshot(context, options, (scope) =>\n readFeeBreakdown(scope, poolId, zeroForOne, timestamp, \"preview\"),\n );\n}\n\nexport function getMarketSession(\n context: MarketReadContext,\n poolId: Hex,\n options: MarketReadOptions & { readonly timestamp?: bigint } = {},\n): Promise<MarketSnapshot<MarketSessionState>> {\n assertMarketPoolId(poolId);\n const timestamp = options.timestamp;\n if (timestamp !== undefined) assertMarketUint(timestamp, \"timestamp\");\n return readMarketSnapshot(context, options, async (scope) => {\n const pool = await readMarketPoolAt(scope, poolId);\n const hook = requireMarketPoolHook(scope, pool);\n const at = timestamp ?? scope.block.timestamp;\n const session =\n hook.kind === \"rwa-ramp\"\n ? sessionName(\n await scope.publicClient.readContract({\n address: hook.address,\n abi: marketRwaRampAbi,\n functionName: \"sessionAt\",\n args: [poolId, at],\n blockNumber: scope.block.blockNumber,\n }),\n )\n : null;\n return { pool, session, timestamp: at, mode: timestamp === undefined ? \"current\" : \"preview\" };\n });\n}\n","import { type Hex, isAddressEqual } from \"viem\";\nimport { marketExtsloadAbi, marketStateViewAbi } from \"../abi/v4\";\nimport { MarketDeploymentVerificationError, MarketFeatureUnavailableError } from \"../errors\";\nimport { assertMarketPoolId } from \"../math/identifiers\";\nimport { decodeMarketPoolStateWords, marketPoolStorageSlots } from \"../math/pool-state\";\nimport type {\n MarketPoolState,\n MarketReadContext,\n MarketReadOptions,\n MarketSnapshot,\n} from \"../read-types\";\nimport { readMarketPoolAt, requireMarketPoolHook } from \"./pools\";\nimport { assertMarketCode, type MarketReadScope, readMarketSnapshot } from \"./snapshot\";\n\nexport function getMarketPoolState(\n context: MarketReadContext,\n poolId: Hex,\n options: MarketReadOptions = {},\n): Promise<MarketSnapshot<MarketPoolState>> {\n assertMarketPoolId(poolId);\n return readMarketSnapshot(context, options, async (scope) => {\n const pool = await readMarketPoolAt(scope, poolId);\n requireMarketPoolHook(scope, pool);\n return { pool, ...(await readMarketPoolStateAt(scope, poolId)) };\n });\n}\n\n/** Direct manager read also supports exits for pools no longer listed by the registry. */\nexport async function readMarketPoolStateAt(scope: MarketReadScope, poolId: Hex) {\n const reader = scope.deployment.poolStateReader;\n if (!reader) throw new MarketFeatureUnavailableError(\"poolStateReader\");\n await assertMarketCode(scope, scope.deployment.poolManager);\n const blockNumber = scope.block.blockNumber;\n let state: ReturnType<typeof decodeMarketPoolStateWords>;\n if (reader.kind === \"state-view\") {\n await assertMarketCode(scope, reader.contract);\n const target = {\n address: reader.contract.address,\n abi: marketStateViewAbi,\n blockNumber,\n } as const;\n const manager = await scope.publicClient.readContract({\n ...target,\n functionName: \"poolManager\",\n });\n if (!isAddressEqual(manager, scope.deployment.poolManager.address))\n throw new MarketDeploymentVerificationError(\n \"stateView.poolManager\",\n scope.deployment.poolManager.address,\n manager,\n );\n const [slot0, activeLiquidity] = await Promise.all([\n scope.publicClient.readContract({ ...target, functionName: \"getSlot0\", args: [poolId] }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"getLiquidity\",\n args: [poolId],\n }),\n ]);\n state = {\n sqrtPriceX96: slot0[0],\n tick: slot0[1],\n protocolFeePacked: slot0[2],\n storedLpFeePips: slot0[3],\n activeLiquidity,\n };\n } else {\n const words = await scope.publicClient.readContract({\n address: scope.deployment.poolManager.address,\n abi: marketExtsloadAbi,\n functionName: \"extsload\",\n args: [marketPoolStorageSlots(poolId)],\n blockNumber,\n });\n state = decodeMarketPoolStateWords(words);\n }\n if (state.tick < -887272 || state.tick > 887272)\n throw new MarketDeploymentVerificationError(\"pool.tick\", \"v4 tick bounds\", state.tick);\n return { source: reader.kind, initialized: state.sqrtPriceX96 !== 0n, ...state };\n}\n","import { type Address, erc20Abi, isAddressEqual, zeroAddress } from \"viem\";\nimport { immutableClone } from \"../../core\";\nimport { InvalidMarketConfigError } from \"../../errors\";\nimport {\n assertMarketAddress,\n assertMarketUint,\n getMarketPoolId,\n getMarketRangeId,\n} from \"../../math/identifiers\";\nimport { getMarketAmountsForLiquidity } from \"../../math/liquidity\";\nimport type { MarketReadContext, MarketReadOptions, MarketSnapshot } from \"../../read-types\";\nimport type {\n MarketLiquidityParams,\n MarketLiquidityPreview,\n MarketSpendStatus,\n} from \"../../write-types\";\nimport { readMarketPoolStateAt } from \"../pool-state\";\nimport { readMarketSnapshot } from \"../snapshot\";\nimport { expiry, liquidityKey } from \"./guards\";\n\nexport async function previewMarketLiquidity(\n context: MarketReadContext,\n action: \"deposit\" | \"withdraw\",\n input: MarketLiquidityParams,\n): Promise<MarketLiquidityPreview> {\n const params = immutableClone(input);\n const key = liquidityKey(context, params.key);\n const poolId = getMarketPoolId(key);\n const rangeId = getMarketRangeId(poolId, params.tickLower, params.tickUpper, key.tickSpacing);\n assertMarketUint(params.liquidity, \"liquidity\", 128);\n assertMarketUint(params.deadline, \"deadline\");\n if (params.liquidity === 0n)\n throw new InvalidMarketConfigError(\"liquidity\", \"Liquidity must be positive.\");\n if (\n !Number.isInteger(params.slippageBps) ||\n params.slippageBps < 0 ||\n params.slippageBps >= 10000\n )\n throw new InvalidMarketConfigError(\n \"slippageBps\",\n \"Slippage must be an integer from 0 to 9999 bps.\",\n );\n return immutableClone(\n await readMarketSnapshot(context, {}, async (scope) => {\n const lifetime = expiry(scope.block.timestamp, params.validForSeconds);\n if (params.deadline < scope.block.timestamp)\n throw new InvalidMarketConfigError(\"deadline\", \"Deadline has expired.\");\n const state = await readMarketPoolStateAt(scope, poolId);\n const amounts = getMarketAmountsForLiquidity({\n ...params,\n sqrtPriceX96: state.sqrtPriceX96,\n rounding: action === \"deposit\" ? \"up\" : \"down\",\n });\n const limit = (amount: bigint) =>\n action === \"deposit\"\n ? (amount * BigInt(10000 + params.slippageBps) + 9999n) / 10000n\n : (amount * BigInt(10000 - params.slippageBps)) / 10000n;\n const limit0 = limit(amounts.amount0);\n const limit1 = limit(amounts.amount1);\n assertMarketUint(limit0, \"limit0\", 128);\n assertMarketUint(limit1, \"limit1\", 128);\n return {\n ...params,\n key,\n action,\n rangeId,\n sqrtPriceX96: state.sqrtPriceX96,\n ...amounts,\n limit0,\n limit1,\n nativeValue:\n action === \"deposit\" && isAddressEqual(key.currency0, zeroAddress) ? limit0 : 0n,\n estimatedNativeRefund:\n action === \"deposit\" && isAddressEqual(key.currency0, zeroAddress)\n ? limit0 - amounts.amount0\n : 0n,\n expiresAt: params.deadline < lifetime ? params.deadline : lifetime,\n };\n }),\n );\n}\n\nexport function getMarketSpendStatus(\n context: MarketReadContext,\n params: {\n readonly key: MarketLiquidityParams[\"key\"];\n readonly owner: Address;\n readonly amount0: bigint;\n readonly amount1: bigint;\n } & MarketReadOptions,\n): Promise<MarketSnapshot<MarketSpendStatus>> {\n const key = liquidityKey(context, params.key);\n const { owner, amount0, amount1 } = params;\n assertMarketAddress(owner, \"owner\");\n assertMarketUint(amount0, \"amount0\", 128);\n assertMarketUint(amount1, \"amount1\", 128);\n return readMarketSnapshot(context, params, async (scope) => ({\n owner,\n spender: key.hooks,\n tokens: await Promise.all(\n (\n [\n { token: key.currency0, requiredAmount: amount0 },\n { token: key.currency1, requiredAmount: amount1 },\n ] as const\n ).map(async ({ token, requiredAmount }) => {\n if (isAddressEqual(token, zeroAddress)) {\n const balance = await scope.publicClient.getBalance({\n address: owner,\n blockNumber: scope.block.blockNumber,\n });\n return {\n token,\n kind: \"native\" as const,\n balance,\n allowance: null,\n requiredAmount,\n needsApproval: false,\n sufficientBalance: balance >= requiredAmount,\n };\n }\n const target = {\n address: token,\n abi: erc20Abi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const [balance, allowance] = await Promise.all([\n scope.publicClient.readContract({ ...target, functionName: \"balanceOf\", args: [owner] }),\n scope.publicClient.readContract({\n ...target,\n functionName: \"allowance\",\n args: [owner, key.hooks],\n }),\n ]);\n return {\n token,\n kind: \"erc20\" as const,\n balance,\n allowance,\n requiredAmount,\n needsApproval: allowance < requiredAmount,\n sufficientBalance: balance >= requiredAmount,\n };\n }),\n ),\n }));\n}\n","// TickMath constants and rounding follow Uniswap v4 (MIT); see docs/liquidity.md.\nimport { InvalidMarketConfigError } from \"../errors\";\nimport { assertMarketUint } from \"./identifiers\";\n\nconst Q96 = 1n << 96n;\nconst MIN_SQRT = 4295128739n;\nconst MAX_SQRT = 1461446703485210103287273052203988822378723970342n;\nconst FACTORS = [\n 0xfffcb933bd6fad37aa2d162d1a594001n,\n 0xfff97272373d413259a46990580e213an,\n 0xfff2e50f5f656932ef12357cf3c7fdccn,\n 0xffe5caca7e10e4e61c3624eaa0941cd0n,\n 0xffcb9843d60f6159c9db58835c926644n,\n 0xff973b41fa98c081472e6896dfb254c0n,\n 0xff2ea16466c96a3843ec78b326b52861n,\n 0xfe5dee046a99a2a811c461f1969c3053n,\n 0xfcbe86c7900a88aedcffc83b479aa3a4n,\n 0xf987a7253ac413176f2b074cf7815e54n,\n 0xf3392b0822b70005940c7a398e4b70f3n,\n 0xe7159475a2c29b7443b29c7fa6e889d9n,\n 0xd097f3bdfd2022b8845ad8f792aa5825n,\n 0xa9f746462d870fdf8a65dc1f90e061e5n,\n 0x70d869a156d2a1b890bb3df62baf32f7n,\n 0x31be135f97d08fd981231505542fcfa6n,\n 0x9aa508b5b7a84e1c677de54f3e99bc9n,\n 0x5d6af8dedb81196699c329225ee604n,\n 0x2216e584f5fa1ea926041bedfe98n,\n 0x48a170391f7dc42444e8fa2n,\n] as const;\n\nexport function getMarketSqrtPriceAtTick(tick: number): bigint {\n if (!Number.isInteger(tick) || Math.abs(tick) > 887272)\n throw new InvalidMarketConfigError(\"tick\", \"Tick must be an integer in v4 bounds.\");\n const absolute = Math.abs(tick);\n let ratio = 1n << 128n;\n for (let i = 0; i < FACTORS.length; i++) {\n const factor = FACTORS[i];\n if (factor !== undefined && (absolute & (1 << i)) !== 0) ratio = (ratio * factor) >> 128n;\n }\n if (tick > 0) ratio = ((1n << 256n) - 1n) / ratio;\n return (ratio + (1n << 32n) - 1n) >> 32n;\n}\n\nfunction assertPrice(price: bigint): void {\n if (typeof price !== \"bigint\" || price < MIN_SQRT || price >= MAX_SQRT)\n throw new InvalidMarketConfigError(\n \"sqrtPriceX96\",\n \"Price must be initialized and inside v4 bounds.\",\n );\n}\n\nexport function getMarketTickAtSqrtPrice(sqrtPriceX96: bigint): number {\n assertPrice(sqrtPriceX96);\n let lower = -887272;\n let upper = 887272;\n while (lower < upper) {\n const middle = Math.ceil((lower + upper) / 2);\n if (getMarketSqrtPriceAtTick(middle) <= sqrtPriceX96) lower = middle;\n else upper = middle - 1;\n }\n return lower;\n}\n\n/** Exact currency1/currency0 human-unit price; no floating point conversion. */\nexport function getMarketPriceRatio(sqrtPriceX96: bigint, decimals0: number, decimals1: number) {\n assertPrice(sqrtPriceX96);\n for (const decimals of [decimals0, decimals1]) {\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 255)\n throw new InvalidMarketConfigError(\"decimals\", \"Decimals must fit uint8.\");\n }\n return {\n numerator: sqrtPriceX96 ** 2n * 10n ** BigInt(decimals0),\n denominator: (1n << 192n) * 10n ** BigInt(decimals1),\n };\n}\n\nfunction boundaries(sqrtPriceX96: bigint, tickLower: number, tickUpper: number) {\n assertPrice(sqrtPriceX96);\n const lower = getMarketSqrtPriceAtTick(tickLower);\n const upper = getMarketSqrtPriceAtTick(tickUpper);\n if (lower >= upper)\n throw new InvalidMarketConfigError(\"ticks\", \"Lower tick must precede upper tick.\");\n return {\n lower,\n upper,\n current: sqrtPriceX96 < lower ? lower : sqrtPriceX96 > upper ? upper : sqrtPriceX96,\n };\n}\n\n/** Principal only. Round up for deposits, down for withdrawals. */\nexport function getMarketAmountsForLiquidity(params: {\n readonly sqrtPriceX96: bigint;\n readonly tickLower: number;\n readonly tickUpper: number;\n readonly liquidity: bigint;\n readonly rounding: \"up\" | \"down\";\n}) {\n assertMarketUint(params.liquidity, \"liquidity\", 128);\n if (params.rounding !== \"up\" && params.rounding !== \"down\")\n throw new InvalidMarketConfigError(\"rounding\", \"Expected up or down.\");\n const { lower, upper, current } = boundaries(\n params.sqrtPriceX96,\n params.tickLower,\n params.tickUpper,\n );\n const divide = (n: bigint, d: bigint) => (params.rounding === \"up\" ? (n + d - 1n) / d : n / d);\n return {\n amount0: divide(params.liquidity * Q96 * (upper - current), current * upper),\n amount1: divide(params.liquidity * (current - lower), Q96),\n };\n}\n\n/** Same intermediate floor and uint128 casts as v4 LiquidityAmounts. */\nexport function getMarketLiquidityForAmounts(params: {\n readonly sqrtPriceX96: bigint;\n readonly tickLower: number;\n readonly tickUpper: number;\n readonly amount0: bigint;\n readonly amount1: bigint;\n}): bigint {\n assertMarketUint(params.amount0, \"amount0\");\n assertMarketUint(params.amount1, \"amount1\");\n const { lower, upper, current } = boundaries(\n params.sqrtPriceX96,\n params.tickLower,\n params.tickUpper,\n );\n const l0 =\n current === upper\n ? undefined\n : (params.amount0 * ((current * upper) / Q96)) / (upper - current);\n const l1 = current === lower ? undefined : (params.amount1 * Q96) / (current - lower);\n if (l0 !== undefined) assertMarketUint(l0, \"liquidity0\", 128);\n if (l1 !== undefined) assertMarketUint(l1, \"liquidity1\", 128);\n return l0 === undefined ? (l1 ?? 0n) : l1 === undefined || l0 < l1 ? l0 : l1;\n}\n","import { type Address, isAddressEqual, zeroAddress } from \"viem\";\nimport {\n marketClaimFeePolicyAbi,\n marketMarketCalendarAbi,\n marketRampAbi,\n marketRwaRampAbi,\n} from \"../../abi\";\nimport {\n InvalidMarketConfigError,\n MarketDeploymentVerificationError,\n MarketFeatureUnavailableError,\n} from \"../../errors\";\nimport { assertMarketAddress, defineMarketPoolKey } from \"../../math/identifiers\";\nimport type { MarketReadContext } from \"../../read-types\";\nimport type { MarketPoolKey } from \"../../types\";\nimport { assertMarketCode, type MarketReadScope, requireMarketHook } from \"../snapshot\";\n\nexport function liquidityKey(context: MarketReadContext, input: MarketPoolKey): MarketPoolKey {\n const key = defineMarketPoolKey(input);\n const hook = requireMarketHook(context, key.hooks);\n if (isAddressEqual(key.currency0, zeroAddress) && hook.kind !== \"ramp-eth\")\n throw new MarketFeatureUnavailableError(\"This Hook supports ERC-20 only\");\n return key;\n}\n\nexport function expiry(timestamp: bigint, seconds = 60): bigint {\n if (!Number.isInteger(seconds) || seconds < 1 || seconds > 300)\n throw new InvalidMarketConfigError(\"validForSeconds\", \"Lifetime must be 1..300 seconds.\");\n return timestamp + BigInt(seconds);\n}\n\nexport function recipient(context: MarketReadContext, key: MarketPoolKey, to: Address): Address {\n assertMarketAddress(to, \"to\");\n if (\n [key.hooks, context.deployment.poolManager.address, zeroAddress].some((value) =>\n isAddressEqual(value, to),\n )\n )\n throw new InvalidMarketConfigError(\"to\", \"Recipient cannot be zero, the Hook or PoolManager.\");\n return to;\n}\n\nexport function claimFee(value: number): void {\n if (!Number.isInteger(value) || value < 0 || value > 2000)\n throw new InvalidMarketConfigError(\"maxFeeBps\", \"Claim fee tolerance must be 0..2000 bps.\");\n}\n\n/** Verify the selected funds path without requiring optional readers or Registry availability. */\nexport async function assertWriteDeployment(\n scope: MarketReadScope,\n key: MarketPoolKey,\n claimOperator = false,\n management = false,\n): Promise<void> {\n const hook = requireMarketHook(scope, key.hooks);\n if (management && hook.capabilities.management !== \"verified\")\n throw new MarketFeatureUnavailableError(\"verified management capability\");\n if (!management && hook.capabilities.liquidity !== \"verified\")\n throw new MarketFeatureUnavailableError(\"verified liquidity capability\");\n if (\n !management &&\n isAddressEqual(key.currency0, zeroAddress) &&\n hook.capabilities.nativeLiquidity !== \"verified\"\n )\n throw new MarketFeatureUnavailableError(\"verified nativeLiquidity capability\");\n if (claimOperator && hook.capabilities.claimOperator !== \"verified\")\n throw new MarketFeatureUnavailableError(\"verified claimOperator capability\");\n for (const contract of [\n hook,\n scope.deployment.poolManager,\n scope.deployment.authority,\n hook.claimFeePolicy,\n ])\n await assertMarketCode(scope, contract);\n if (hook.kind === \"rwa-ramp\") {\n if (!hook.calendar) throw new MarketFeatureUnavailableError(\"RWA calendar\");\n await assertMarketCode(scope, hook.calendar);\n const [calendar, controller] = await Promise.all([\n scope.publicClient.readContract({\n address: hook.address,\n abi: marketRwaRampAbi,\n functionName: \"marketCalendar\",\n blockNumber: scope.block.blockNumber,\n }),\n scope.publicClient.readContract({\n address: hook.calendar.address,\n abi: marketMarketCalendarAbi,\n functionName: \"controller\",\n blockNumber: scope.block.blockNumber,\n }),\n ]);\n if (\n !isAddressEqual(calendar, hook.calendar.address) ||\n !isAddressEqual(controller, hook.address)\n )\n throw new MarketDeploymentVerificationError(\n \"write.calendar\",\n [hook.calendar.address, hook.address],\n [calendar, controller],\n );\n }\n const target = {\n address: hook.address,\n abi: marketRampAbi,\n blockNumber: scope.block.blockNumber,\n } as const;\n const actual = await Promise.all([\n scope.publicClient.readContract({ ...target, functionName: \"poolManager\" }),\n scope.publicClient.readContract({ ...target, functionName: \"authority\" }),\n scope.publicClient.readContract({ ...target, functionName: \"claimFeePolicy\" }),\n scope.publicClient.readContract({\n address: hook.claimFeePolicy.address,\n abi: marketClaimFeePolicyAbi,\n functionName: \"ledger\",\n blockNumber: scope.block.blockNumber,\n }),\n ]);\n const expected = [\n scope.deployment.poolManager.address,\n scope.deployment.authority.address,\n hook.claimFeePolicy.address,\n hook.address,\n ];\n for (let index = 0; index < expected.length; index++) {\n const want = expected[index];\n const got = actual[index];\n if (!want || !got || !isAddressEqual(want, got))\n throw new MarketDeploymentVerificationError(`write.binding.${index}`, want, got);\n }\n}\n","import { defineMarketDeployment } from \"./deployment\";\nimport { InvalidMarketConfigError } from \"./errors\";\nimport type { MarketChainConfig } from \"./types\";\n\nexport function defineMarketChain(input: MarketChainConfig): MarketChainConfig {\n const deployment = defineMarketDeployment(input.deployment);\n if (input.chainId !== deployment.chainId) {\n throw new InvalidMarketConfigError(\"chainId\", \"Chain and deployment chain IDs must match.\");\n }\n if (!Number.isSafeInteger(input.confirmations) || input.confirmations < 1) {\n throw new InvalidMarketConfigError(\"confirmations\", \"Expected at least one confirmation.\");\n }\n return Object.freeze({ chainId: input.chainId, deployment, confirmations: input.confirmations });\n}\n","import {\n type Address,\n decodeEventLog,\n encodeFunctionData,\n erc20Abi,\n type Hex,\n isAddressEqual,\n type PublicClient,\n type WalletClient,\n zeroAddress,\n} from \"viem\";\nimport {\n marketAccessManagerAbi,\n marketPoolRegistryAbi,\n marketRampAbi,\n marketRampReaderAbi,\n marketRwaRampAbi,\n} from \"../../abi\";\nimport {\n createPreparedTransactionStore,\n immutableClone,\n resolveLiveWalletAccount,\n transactionResultFromReceipt,\n} from \"../../core\";\nimport {\n InvalidMarketConfigError,\n MarketDeploymentVerificationError,\n MarketTransactionError,\n MarketTransactionReplacedError,\n} from \"../../errors\";\nimport type {\n MarketManagementAction,\n MarketManagementContext,\n MarketManagementEvent,\n MarketManagementExecution,\n} from \"../../management-types\";\nimport {\n assertMarketAddress,\n assertMarketUint,\n getMarketPoolId,\n getMarketRangeId,\n} from \"../../math/identifiers\";\nimport type { MarketReadContext } from \"../../read-types\";\nimport type { MarketChainConfig, MarketPoolKey } from \"../../types\";\nimport type {\n MarketApprovalParams,\n MarketClaimParams,\n MarketLiquidityEvent,\n MarketLiquidityParams,\n MarketLiquidityPreview,\n MarketPreparedTransaction,\n MarketShareEvent,\n MarketShareRangeParams,\n MarketShareTransferParams,\n MarketTransactionRequest,\n MarketTransactionResult,\n MarketWriteAction,\n} from \"../../write-types\";\nimport { readMarketSnapshot } from \"../snapshot\";\nimport { assertWriteDeployment, claimFee, expiry, liquidityKey, recipient } from \"./guards\";\nimport { encodeMarketManagement, inspectMarketManagementAt, managementRequest } from \"./management\";\nimport { getMarketSpendStatus, previewMarketLiquidity } from \"./preview\";\n\n/** One registry per client: prepared values cannot cross client or deployment boundaries. */\nexport function createMarketWriteActions(\n publicClient: PublicClient,\n walletClient: WalletClient | undefined,\n chain: MarketChainConfig,\n) {\n const context: MarketReadContext = { publicClient, deployment: chain.deployment };\n const store = createPreparedTransactionStore();\n const previews = new WeakSet<MarketLiquidityPreview>();\n const sent = new Map<Hex, MarketPreparedTransaction>();\n const submitting = new WeakSet<MarketPreparedTransaction>();\n const submitted = new WeakSet<MarketPreparedTransaction>();\n const account = () =>\n resolveLiveWalletAccount(\n walletClient,\n chain.chainId,\n (expected, actual) =>\n new MarketDeploymentVerificationError(\"wallet.chainId\", expected, actual),\n );\n\n async function simulate(request: MarketTransactionRequest, blockNumber?: bigint): Promise<void> {\n try {\n // Exact calldata preflight. No state-changing request is sent by preparation.\n const result = await publicClient.call({ ...request, blockNumber, batch: false });\n // ERC-20 approve implementations may return false without reverting.\n if (\n request.data.startsWith(\"0x095ea7b3\") &&\n result.data &&\n result.data !== \"0x\" &&\n BigInt(result.data) !== 1n\n )\n throw new InvalidMarketConfigError(\"approve\", \"Token returned false for approve.\");\n } catch (cause) {\n throw new MarketTransactionError(\"simulate\", cause);\n }\n }\n\n async function checkNativeBudget(request: MarketTransactionRequest): Promise<void> {\n if (request.gas === undefined || request.maxFeePerGas === undefined) return;\n const balance = await publicClient.getBalance({ address: request.account });\n if (balance < request.value + request.gas * request.maxFeePerGas)\n throw new InvalidMarketConfigError(\n \"nativeBalance\",\n \"Insufficient native balance for prepaid value plus gas budget.\",\n );\n }\n\n async function fresh(\n block: MarketPreparedTransaction[\"context\"][\"block\"],\n expiresAt: bigint,\n ): Promise<void> {\n const [latest, original, chainId] = await Promise.all([\n publicClient.getBlock({ blockTag: \"latest\" }),\n publicClient.getBlock({ blockNumber: block.blockNumber }),\n publicClient.getChainId(),\n ]);\n if (chainId !== chain.chainId)\n throw new MarketDeploymentVerificationError(\"publicClient.chainId\", chain.chainId, chainId);\n if (original.hash !== block.blockHash)\n throw new MarketDeploymentVerificationError(\n \"preview.blockHash\",\n block.blockHash,\n original.hash,\n );\n if (latest.timestamp < block.timestamp || latest.timestamp > expiresAt)\n throw new InvalidMarketConfigError(\n \"expiry\",\n \"Preview or prepared transaction has expired; prepare again.\",\n );\n }\n\n async function preview(action: \"deposit\" | \"withdraw\", params: MarketLiquidityParams) {\n const result = await previewMarketLiquidity(context, action, params);\n previews.add(result);\n return result;\n }\n\n async function prepare(input: {\n action: MarketWriteAction;\n owner?: Address;\n key: MarketPoolKey;\n to: Address;\n data: Hex;\n rangeId: bigint | null;\n validForSeconds?: number;\n preview?: MarketLiquidityPreview;\n target?: Address;\n management?: { action: MarketManagementAction; execution: MarketManagementExecution };\n }): Promise<MarketPreparedTransaction> {\n const key = liquidityKey(context, input.key);\n const live = await account();\n if (input.preview) await fresh(input.preview.block, input.preview.data.expiresAt);\n let managementContext: MarketManagementContext | undefined;\n const snapshot = await readMarketSnapshot(context, {}, async (scope) => {\n if (!input.management)\n await assertWriteDeployment(\n scope,\n key,\n input.action === \"setClaimOperator\" || input.action === \"claimFor\",\n );\n let request: MarketTransactionRequest = {\n account: live.address,\n to: input.target ?? key.hooks,\n data: input.data,\n value: input.action === \"deposit\" ? (input.preview?.data.nativeValue ?? 0n) : 0n,\n chainId: chain.chainId,\n };\n if (input.management) {\n const { action, execution } = input.management;\n const auth = await inspectMarketManagementAt(\n scope,\n action,\n live.address,\n execution.mode === \"schedule\" ? execution.when : 0,\n );\n request = { ...request, ...managementRequest(auth, execution, scope.block.timestamp) };\n managementContext = {\n action,\n execution,\n target: auth.direct.to,\n operationId: auth.operationId,\n };\n }\n if (input.action === \"deposit\" && input.preview) {\n const status = await getMarketSpendStatus(context, {\n key,\n owner: live.address,\n amount0: input.preview.data.limit0,\n amount1: input.preview.data.limit1,\n ...scope.block,\n });\n if (status.data.tokens.some((token) => !token.sufficientBalance || token.needsApproval))\n throw new InvalidMarketConfigError(\n \"spend\",\n \"Insufficient token balance or allowance for deposit maxima.\",\n );\n }\n await simulate(request, scope.block.blockNumber);\n if (isAddressEqual(key.currency0, zeroAddress)) {\n const fees = await publicClient.estimateFeesPerGas({ chain: undefined, type: \"eip1559\" });\n const estimatedGas = await publicClient.estimateGas({ ...request, ...fees });\n request = { ...request, ...fees, gas: (estimatedGas * 125n + 99n) / 100n };\n await checkNativeBudget(request);\n }\n return request;\n });\n const after = await account();\n if (!isAddressEqual(live.address, after.address))\n throw new InvalidMarketConfigError(\"account\", \"Wallet account changed during preparation.\");\n const expiresAt =\n input.preview?.data.expiresAt ?? expiry(snapshot.block.timestamp, input.validForSeconds);\n const preparedContext = immutableClone({\n action: input.action,\n ...(managementContext ? { management: managementContext } : {}),\n key,\n rangeId: input.rangeId,\n block: snapshot.block,\n expiresAt,\n owner: input.owner ?? live.address,\n recipient: input.action === \"deposit\" || input.action === \"approve\" ? live.address : input.to,\n });\n return store.create(snapshot.data, input.preview ?? null, preparedContext);\n }\n\n function requirePreview(value: MarketLiquidityPreview, action: \"deposit\" | \"withdraw\") {\n if (!previews.has(value) || value.data.action !== action)\n throw new InvalidMarketConfigError(\n \"preview\",\n \"Use an unchanged preview from this client for the requested action.\",\n );\n return value.data;\n }\n\n async function prepareWithdraw(\n previewValue: MarketLiquidityPreview,\n to: Address,\n maxFeeBps?: number,\n ) {\n const q = requirePreview(previewValue, \"withdraw\");\n recipient(context, q.key, to);\n if (maxFeeBps !== undefined) claimFee(maxFeeBps);\n const args = [\n q.key,\n q.tickLower,\n q.tickUpper,\n q.liquidity,\n to,\n q.limit0,\n q.limit1,\n q.deadline,\n ] as const;\n return prepare({\n action: maxFeeBps === undefined ? \"withdraw\" : \"withdrawAndClaim\",\n key: q.key,\n to,\n rangeId: q.rangeId,\n preview: previewValue,\n data:\n maxFeeBps === undefined\n ? encodeFunctionData({ abi: marketRampAbi, functionName: \"withdraw\", args })\n : encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"withdrawAndClaim\",\n args: [...args, maxFeeBps],\n }),\n });\n }\n\n async function send(prepared: MarketPreparedTransaction): Promise<Hex> {\n if (!prepared || typeof prepared !== \"object\" || !store.has(prepared))\n throw new InvalidMarketConfigError(\n \"prepared\",\n \"Transaction was not prepared by this client.\",\n );\n if (submitting.has(prepared) || submitted.has(prepared))\n throw new InvalidMarketConfigError(\n \"prepared\",\n \"Transaction is submitting or already submitted; prepare again for another action.\",\n );\n const request = store.getCanonical<MarketTransactionRequest>(prepared);\n if (!request || !walletClient)\n throw new InvalidMarketConfigError(\"wallet\", \"A wallet is required.\");\n submitting.add(prepared);\n try {\n const live = await account();\n if (!isAddressEqual(live.address, request.account))\n throw new InvalidMarketConfigError(\"account\", \"Wallet account changed; prepare again.\");\n await fresh(prepared.context.block, prepared.context.expiresAt);\n await readMarketSnapshot(context, {}, async (scope) => {\n const management = prepared.context.management;\n if (management) {\n const execution = management.execution;\n const auth = await inspectMarketManagementAt(\n scope,\n management.action,\n live.address,\n execution.mode === \"schedule\" ? execution.when : 0,\n );\n const canonical = managementRequest(auth, execution, scope.block.timestamp);\n if (\n !isAddressEqual(canonical.to, request.to) ||\n canonical.data !== request.data ||\n auth.operationId !== management.operationId\n )\n throw new InvalidMarketConfigError(\n \"management\",\n \"Management request changed; prepare again.\",\n );\n } else\n await assertWriteDeployment(\n scope,\n prepared.context.key,\n prepared.context.action === \"setClaimOperator\" ||\n prepared.context.action === \"claimFor\",\n );\n });\n await simulate(request);\n const finalAccount = await account();\n if (!isAddressEqual(finalAccount.address, request.account))\n throw new InvalidMarketConfigError(\"account\", \"Wallet account changed before signing.\");\n await fresh(prepared.context.block, prepared.context.expiresAt);\n await checkNativeBudget(request);\n let hash: Hex;\n try {\n hash = await walletClient.sendTransaction({\n ...request,\n account: finalAccount,\n chain: walletClient.chain ?? null,\n });\n } catch (cause) {\n throw new MarketTransactionError(\"send\", cause);\n }\n sent.set(hash, prepared);\n submitted.add(prepared);\n return hash;\n } finally {\n submitting.delete(prepared);\n }\n }\n\n async function waitForTransaction(\n hash: Hex,\n options: { readonly timeout?: number } = {},\n ): Promise<MarketTransactionResult> {\n const prepared = sent.get(hash);\n if (!prepared)\n throw new InvalidMarketConfigError(\n \"hash\",\n \"Only hashes sent by this client can be reconciled with its prepared action.\",\n );\n if ((await publicClient.getChainId()) !== chain.chainId)\n throw new InvalidMarketConfigError(\"chainId\", \"Receipt client is on a different chain.\");\n try {\n let replacement: MarketTransactionReplacedError | undefined;\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n confirmations: chain.confirmations,\n timeout: options.timeout,\n onReplaced: ({ reason, transaction }) => {\n if (reason !== \"repriced\")\n replacement = new MarketTransactionReplacedError(hash, transaction.hash, reason);\n },\n });\n if (replacement) throw replacement;\n const result = transactionResultFromReceipt(receipt);\n const managementEvents: MarketManagementEvent[] = [];\n const management = prepared.context.management;\n if (receipt.status === \"success\" && management) {\n const eventAbi = [\n ...marketRampAbi,\n ...marketRwaRampAbi,\n ...marketPoolRegistryAbi,\n ...marketRampReaderAbi,\n ...marketAccessManagerAbi,\n ];\n for (const log of receipt.logs) {\n const isAuthority = isAddressEqual(log.address, chain.deployment.authority.address);\n if (!isAuthority && !isAddressEqual(log.address, management.target)) continue;\n try {\n const decoded = decodeEventLog({\n abi: eventAbi,\n data: log.data,\n topics: log.topics,\n strict: true,\n });\n const args = Object.fromEntries(Object.entries(decoded.args ?? {}));\n if (isAuthority && args.operationId !== management.operationId) continue;\n if (!isAuthority && management.execution.mode === \"schedule\") continue;\n managementEvents.push({ address: log.address, eventName: decoded.eventName, args });\n } catch {\n /* Ignore unrelated logs. The canonical receipt remains available. */\n }\n }\n if (management.execution.mode !== \"direct\") {\n const eventName =\n management.execution.mode === \"schedule\" ? \"OperationScheduled\" : \"OperationExecuted\";\n if (\n !managementEvents.some(\n (event) =>\n event.eventName === eventName &&\n isAddressEqual(event.address, chain.deployment.authority.address),\n )\n )\n throw new InvalidMarketConfigError(\n \"receipt.events\",\n \"Missing matching AccessManager operation event.\",\n );\n }\n }\n const events: MarketLiquidityEvent[] = [];\n const shareEvents: MarketShareEvent[] = [];\n if (receipt.status === \"success\")\n for (const log of receipt.logs) {\n if (!isAddressEqual(log.address, prepared.context.key.hooks)) continue;\n try {\n const decoded = decodeEventLog({\n abi: marketRampAbi,\n data: log.data,\n topics: log.topics,\n strict: true,\n });\n const expected = prepared.context;\n if (decoded.eventName === \"Transfer\") {\n const a = decoded.args;\n if (\n (expected.action === \"transferShares\" ||\n expected.action === \"transferSharesFrom\") &&\n a.id === expected.rangeId &&\n isAddressEqual(a.from, expected.owner) &&\n isAddressEqual(a.to, expected.recipient) &&\n isAddressEqual(a.caller, prepared.request.account)\n )\n shareEvents.push({\n eventName: \"Transfer\",\n caller: a.caller,\n from: a.from,\n to: a.to,\n rangeId: a.id,\n amount: a.amount,\n });\n continue;\n }\n if (decoded.eventName === \"Approval\") {\n const a = decoded.args;\n if (\n expected.action === \"approveShares\" &&\n a.id === expected.rangeId &&\n isAddressEqual(a.owner, expected.owner) &&\n isAddressEqual(a.spender, expected.recipient)\n )\n shareEvents.push({\n eventName: \"Approval\",\n owner: a.owner,\n spender: a.spender,\n rangeId: a.id,\n amount: a.amount,\n });\n continue;\n }\n if (decoded.eventName === \"OperatorSet\" || decoded.eventName === \"ClaimOperatorSet\") {\n const a = decoded.args;\n if (\n isAddressEqual(a.owner, expected.owner) &&\n isAddressEqual(a.operator, expected.recipient)\n ) {\n if (decoded.eventName === \"OperatorSet\" && expected.action === \"setShareOperator\")\n shareEvents.push({ eventName: \"OperatorSet\", ...decoded.args });\n if (\n decoded.eventName === \"ClaimOperatorSet\" &&\n expected.action === \"setClaimOperator\" &&\n decoded.args.rangeId === expected.rangeId\n )\n shareEvents.push({ eventName: \"ClaimOperatorSet\", ...decoded.args });\n }\n continue;\n }\n if (\n decoded.eventName !== \"Deposited\" &&\n decoded.eventName !== \"Withdrawn\" &&\n decoded.eventName !== \"FeesClaimed\"\n )\n continue;\n const args = decoded.args;\n const to = \"to\" in args ? args.to : args.owner;\n if (\n !isAddressEqual(args.owner, prepared.context.owner) ||\n args.rangeId !== prepared.context.rangeId ||\n !isAddressEqual(to, prepared.context.recipient)\n )\n continue;\n events.push({\n eventName: decoded.eventName,\n owner: args.owner,\n rangeId: args.rangeId,\n amount0: args.amount0,\n amount1: args.amount1,\n liquidity: \"liquidity\" in args ? args.liquidity : null,\n to,\n });\n } catch {\n /* Other Hook events are not liquidity results. */\n }\n }\n const requiredEvent =\n prepared.context.action === \"deposit\"\n ? \"Deposited\"\n : prepared.context.action === \"withdraw\" || prepared.context.action === \"withdrawAndClaim\"\n ? \"Withdrawn\"\n : null;\n if (\n receipt.status === \"success\" &&\n requiredEvent &&\n !events.some((event) => event.eventName === requiredEvent)\n )\n throw new InvalidMarketConfigError(\n \"receipt.events\",\n \"Successful receipt is missing the matching liquidity event.\",\n );\n if (\n receipt.status === \"success\" &&\n [\n \"transferShares\",\n \"transferSharesFrom\",\n \"approveShares\",\n \"setShareOperator\",\n \"setClaimOperator\",\n ].includes(prepared.context.action) &&\n shareEvents.length === 0\n )\n throw new InvalidMarketConfigError(\n \"receipt.events\",\n \"Successful receipt is missing the matching share/authorization event.\",\n );\n return {\n hash: result.hash,\n status: receipt.status === \"success\" ? \"confirmed\" : \"reverted\",\n receipt,\n events,\n shareEvents,\n managementEvents,\n };\n } catch (cause) {\n if (cause instanceof MarketTransactionReplacedError) throw cause;\n throw new MarketTransactionError(\"receipt\", cause);\n }\n }\n\n function shareRange(params: MarketShareRangeParams) {\n const key = liquidityKey(context, params.key);\n return {\n key,\n rangeId: getMarketRangeId(\n getMarketPoolId(key),\n params.tickLower,\n params.tickUpper,\n key.tickSpacing,\n ),\n };\n }\n function transferShares(input: MarketShareTransferParams & { readonly owner?: Address }) {\n const params = immutableClone(input);\n const { key, rangeId } = shareRange(params);\n recipient(context, key, params.to);\n assertMarketUint(params.amount, \"shares\", 128);\n if (params.amount === 0n)\n throw new InvalidMarketConfigError(\"shares\", \"Share transfer amount must be positive.\");\n if (params.owner) assertMarketAddress(params.owner, \"owner\");\n return prepare({\n action: params.owner ? \"transferSharesFrom\" : \"transferShares\",\n key,\n rangeId,\n owner: params.owner,\n to: params.to,\n validForSeconds: params.validForSeconds,\n data: params.owner\n ? encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"transferFrom\",\n args: [params.owner, params.to, rangeId, params.amount],\n })\n : encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"transfer\",\n args: [params.to, rangeId, params.amount],\n }),\n });\n }\n\n return {\n getManagementAuthorization: (\n input: MarketManagementAction,\n owner: Address,\n options: { readonly when?: number } = {},\n ) => {\n const action = immutableClone(input);\n return readMarketSnapshot(context, {}, (scope) =>\n inspectMarketManagementAt(scope, action, owner, options.when),\n );\n },\n prepareManagement: async (\n input: MarketManagementAction,\n options: {\n readonly execution?: MarketManagementExecution;\n readonly validForSeconds?: number;\n } = {},\n ) => {\n const action = immutableClone(input);\n const execution = immutableClone(options.execution ?? { mode: \"direct\" as const });\n const call = encodeMarketManagement(context, action);\n return prepare({\n action: \"management\",\n key: call.key,\n to: call.to,\n target: call.to,\n data: call.data,\n rangeId: null,\n validForSeconds: options.validForSeconds,\n management: { action, execution },\n });\n },\n previewDeposit: (params: MarketLiquidityParams) => preview(\"deposit\", params),\n previewWithdraw: (params: MarketLiquidityParams) => preview(\"withdraw\", params),\n getSpendStatus: (params: Parameters<typeof getMarketSpendStatus>[1]) =>\n getMarketSpendStatus(context, params),\n prepareApproval: async (input: MarketApprovalParams) => {\n const params = immutableClone(input);\n const key = liquidityKey(context, params.key);\n if (params.currency !== 0 && params.currency !== 1)\n throw new InvalidMarketConfigError(\"currency\", \"Choose currency 0 or 1.\");\n if (params.currency === 0 && isAddressEqual(key.currency0, zeroAddress))\n throw new InvalidMarketConfigError(\n \"currency\",\n \"Native currency does not support approval.\",\n );\n assertMarketUint(params.amount, \"amount\", 128);\n const live = await account();\n return prepare({\n action: \"approve\",\n key,\n to: live.address,\n target: params.currency === 0 ? key.currency0 : key.currency1,\n rangeId: null,\n validForSeconds: params.validForSeconds,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [key.hooks, params.amount],\n }),\n });\n },\n prepareDeposit: async (value: MarketLiquidityPreview) => {\n const q = requirePreview(value, \"deposit\");\n const live = await account();\n return prepare({\n action: \"deposit\",\n key: q.key,\n to: live.address,\n rangeId: q.rangeId,\n preview: value,\n data: encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"deposit\",\n args: [q.key, q.tickLower, q.tickUpper, q.liquidity, q.limit0, q.limit1, q.deadline],\n }),\n });\n },\n prepareWithdraw: (value: MarketLiquidityPreview, to: Address) => prepareWithdraw(value, to),\n prepareWithdrawAndClaim: (value: MarketLiquidityPreview, to: Address, maxFeeBps: number) =>\n prepareWithdraw(value, to, maxFeeBps),\n prepareClaim: (input: MarketClaimParams) => {\n const params = immutableClone(input);\n const key = liquidityKey(context, params.key);\n recipient(context, key, params.to);\n claimFee(params.maxFeeBps);\n const rangeId = getMarketRangeId(\n getMarketPoolId(key),\n params.tickLower,\n params.tickUpper,\n key.tickSpacing,\n );\n return prepare({\n action: \"claim\",\n key,\n to: params.to,\n rangeId,\n validForSeconds: params.validForSeconds,\n data: encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"claimFees\",\n args: [key, params.tickLower, params.tickUpper, params.to, params.maxFeeBps],\n }),\n });\n },\n prepareTransferShares: (params: MarketShareTransferParams) =>\n transferShares({ ...params, owner: undefined }),\n prepareTransferSharesFrom: (\n params: MarketShareTransferParams & { readonly owner: Address },\n ) => {\n assertMarketAddress(params.owner, \"owner\");\n return transferShares(params);\n },\n prepareApproveShares: (\n input: MarketShareRangeParams & { readonly spender: Address; readonly amount: bigint },\n ) => {\n const params = immutableClone(input);\n const { key, rangeId } = shareRange(params);\n assertMarketAddress(params.spender, \"spender\");\n assertMarketUint(params.amount, \"allowance\");\n return prepare({\n action: \"approveShares\",\n key,\n rangeId,\n to: params.spender,\n validForSeconds: params.validForSeconds,\n data: encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"approve\",\n args: [params.spender, rangeId, params.amount],\n }),\n });\n },\n prepareSetShareOperator: (input: {\n readonly key: MarketPoolKey;\n readonly operator: Address;\n readonly approved: boolean;\n readonly validForSeconds?: number;\n }) => {\n const params = immutableClone(input);\n const key = liquidityKey(context, params.key);\n assertMarketAddress(params.operator, \"operator\");\n if (typeof params.approved !== \"boolean\")\n throw new InvalidMarketConfigError(\"approved\", \"Expected a boolean.\");\n return prepare({\n action: \"setShareOperator\",\n key,\n rangeId: null,\n to: params.operator,\n validForSeconds: params.validForSeconds,\n data: encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"setOperator\",\n args: [params.operator, params.approved],\n }),\n });\n },\n prepareSetClaimOperator: (\n input: MarketShareRangeParams & { readonly operator: Address; readonly approved: boolean },\n ) => {\n const params = immutableClone(input);\n const { key, rangeId } = shareRange(params);\n assertMarketAddress(params.operator, \"operator\");\n if (typeof params.approved !== \"boolean\")\n throw new InvalidMarketConfigError(\"approved\", \"Expected a boolean.\");\n return prepare({\n action: \"setClaimOperator\",\n key,\n rangeId,\n to: params.operator,\n validForSeconds: params.validForSeconds,\n data: encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"setClaimOperator\",\n args: [rangeId, params.operator, params.approved],\n }),\n });\n },\n prepareClaimFeesFor: (input: MarketClaimParams & { readonly owner: Address }) => {\n const params = immutableClone(input);\n const { key, rangeId } = shareRange(params);\n assertMarketAddress(params.owner, \"owner\");\n recipient(context, key, params.to);\n claimFee(params.maxFeeBps);\n return prepare({\n action: \"claimFor\",\n key,\n rangeId,\n owner: params.owner,\n to: params.to,\n validForSeconds: params.validForSeconds,\n data: encodeFunctionData({\n abi: marketRampAbi,\n functionName: \"claimFeesFor\",\n args: [\n key,\n params.tickLower,\n params.tickUpper,\n params.owner,\n params.to,\n params.maxFeeBps,\n ],\n }),\n });\n },\n send,\n waitForTransaction,\n };\n}\n","import {\n type Address,\n encodeAbiParameters,\n encodeFunctionData,\n type Hex,\n isAddressEqual,\n keccak256,\n zeroAddress,\n} from \"viem\";\nimport {\n marketAccessManagerAbi,\n marketPoolRegistryAbi,\n marketRampAbi,\n marketRampReaderAbi,\n marketRwaRampAbi,\n} from \"../../abi\";\nimport {\n InvalidMarketConfigError,\n MarketDeploymentVerificationError,\n MarketFeatureUnavailableError,\n} from \"../../errors\";\nimport type {\n MarketManagementAction,\n MarketManagementAuthorization,\n MarketManagementExecution,\n} from \"../../management-types\";\nimport { marketDaysInMonth, packMarketDayOverrides } from \"../../math/calendar\";\nimport { assertMarketAddress, getMarketPoolId } from \"../../math/identifiers\";\nimport type { MarketReadContext } from \"../../read-types\";\nimport { assertMarketCode, type MarketReadScope, requireMarketHook } from \"../snapshot\";\nimport { assertWriteDeployment, claimFee, liquidityKey, recipient } from \"./guards\";\n\nfunction integer(value: number, field: string, min = 0, max = 0xffffff) {\n if (!Number.isSafeInteger(value) || value < min || value > max)\n throw new InvalidMarketConfigError(field, `Expected integer ${min}..${max}.`);\n}\nfunction condition(ok: boolean, field: string) {\n if (!ok)\n throw new InvalidMarketConfigError(\n field,\n `Invalid management parameter combination: ${field}.`,\n );\n}\n\n/** Only known management operations are encodable; never accepts arbitrary target/calldata. */\nexport function encodeMarketManagement(context: MarketReadContext, a: MarketManagementAction) {\n const key = liquidityKey(context, a.key);\n const hook = requireMarketHook(context, key.hooks);\n const id = getMarketPoolId(key);\n const target = hook.address;\n const ramp = marketRampAbi;\n const rwa = marketRwaRampAbi;\n const result = (data: Hex, to = target) => ({ key, to, data, value: 0n as const });\n const requireRwa = () => {\n if (hook.kind !== \"rwa-ramp\") throw new MarketFeatureUnavailableError(\"RWA Hook required\");\n };\n switch (a.kind) {\n case \"pokeFee\":\n integer(a.fee0For1, \"fee0For1\");\n integer(a.fee1For0, \"fee1For0\");\n integer(a.ttl, \"ttl\", 1, 259200);\n condition(a.fee0For1 !== 0 || a.fee1For0 !== 0, \"pokeFee\");\n return result(\n encodeFunctionData({\n abi: ramp,\n functionName: \"pokeFee\",\n args: [id, a.fee0For1, a.fee1For0, a.ttl],\n }),\n );\n case \"clearPoke\":\n return result(encodeFunctionData({ abi: ramp, functionName: \"clearPoke\", args: [id] }));\n case \"setPoolAsymmetry\":\n integer(a.premiumPips, \"premiumPips\");\n condition(typeof a.premiumZeroForOne === \"boolean\", \"direction\");\n return result(\n encodeFunctionData({\n abi: ramp,\n functionName: \"setPoolAsymmetry\",\n args: [key, a.premiumPips, a.premiumZeroForOne],\n }),\n );\n case \"setCryptoPoolConfig\":\n if (hook.kind === \"rwa-ramp\") throw new MarketFeatureUnavailableError(\"Crypto Hook required\");\n integer(a.floorPips, \"floorPips\", 100);\n integer(a.flatPips, \"flatPips\", a.floorPips);\n integer(a.cap, \"cap\", a.flatPips);\n return result(\n encodeFunctionData({\n abi: ramp,\n functionName: \"setPoolConfig\",\n args: [key, a.floorPips, a.flatPips, a.cap],\n }),\n );\n case \"setRwaPoolConfig\": {\n requireRwa();\n integer(a.cap, \"cap\", 100);\n const c = a.config;\n for (const field of [\"openFloor\", \"overnightFloor\", \"closedFloor\"] as const)\n integer(c[field], field, 100, a.cap);\n integer(c.spikeMult, \"spikeMult\", 0, 20);\n integer(c.closedSpike, \"closedSpike\");\n integer(c.descentWindow, \"descentWindow\", 0, 21600);\n integer(c.closeFloor, \"closeFloor\", 0, a.cap);\n integer(c.closeBefore, \"closeBefore\", 0, 21600);\n integer(c.closeAfter, \"closeAfter\", 0, 21600);\n condition(\n c.descentWindow === 0\n ? c.spikeMult === 0 && c.closedSpike === 0\n : c.overnightFloor * c.spikeMult > c.openFloor && c.closedSpike > c.openFloor,\n \"descentWindow\",\n );\n condition(\n c.closeFloor === 0\n ? c.closeBefore === 0 && c.closeAfter === 0\n : c.closeFloor >= c.openFloor && (c.closeBefore !== 0 || c.closeAfter !== 0),\n \"closeFloor\",\n );\n // viem cannot reliably distinguish these overloads from the first tuple argument alone.\n return result(\n encodeFunctionData({\n abi: rwa.filter(\n (item) =>\n item.type !== \"function\" || item.name !== \"setPoolConfig\" || item.inputs.length === 3,\n ),\n functionName: \"setPoolConfig\",\n args: [key, c, a.cap],\n }),\n );\n }\n case \"setSessionHours\":\n requireRwa();\n integer(a.openSec, \"openSec\", 32400, 36000);\n integer(a.closeSec, \"closeSec\", 55800, 59400);\n condition(a.closeSec - a.openSec >= 3600 && a.closeSec - a.openSec <= 43200, \"sessionHours\");\n return result(\n encodeFunctionData({\n abi: rwa,\n functionName: \"setSessionHours\",\n args: [id, a.openSec, a.closeSec],\n }),\n );\n case \"setDayOverrides\": {\n requireRwa();\n const packed = packMarketDayOverrides(a.year, a.month, a.days);\n return result(\n encodeFunctionData({\n abi: rwa,\n functionName: \"setDayOverrides\",\n args: [id, BigInt(a.year * 100 + a.month), packed],\n }),\n );\n }\n case \"setDstMode\":\n requireRwa();\n condition([\"auto\", \"est\", \"edt\"].includes(a.mode), \"mode\");\n return result(\n encodeFunctionData({\n abi: rwa,\n functionName: \"setDstMode\",\n args: [id, a.mode === \"auto\" ? 0 : a.mode === \"est\" ? 1 : 2],\n }),\n );\n case \"setEarlyClose\":\n requireRwa();\n integer(a.day, \"day\", 1, marketDaysInMonth(a.year, a.month));\n integer(a.closeSec, \"closeSec\", 0, 86400);\n return result(\n encodeFunctionData({\n abi: rwa,\n functionName: \"setEarlyClose\",\n args: [id, BigInt(a.year), BigInt(a.month), BigInt(a.day), a.closeSec],\n }),\n );\n case \"setPaused\":\n case \"setPoolPaused\":\n integer(a.duration, \"duration\", 0, 604800);\n return result(\n a.kind === \"setPaused\"\n ? encodeFunctionData({ abi: ramp, functionName: \"setPaused\", args: [BigInt(a.duration)] })\n : encodeFunctionData({\n abi: ramp,\n functionName: \"setPoolPaused\",\n args: [key, BigInt(a.duration)],\n }),\n );\n case \"setClaimFee\":\n claimFee(a.bps);\n assertMarketAddress(a.recipient, \"recipient\", a.bps === 0);\n if (!isAddressEqual(a.recipient, zeroAddress)) recipient(context, key, a.recipient);\n condition(Array.isArray(a.settleFirst), \"settleFirst\");\n for (const currency of a.settleFirst)\n assertMarketAddress(currency, \"settleFirst\", hook.kind === \"ramp-eth\");\n condition(\n new Set(a.settleFirst.map((v) => v.toLowerCase())).size === a.settleFirst.length,\n \"settleFirst\",\n );\n return result(\n encodeFunctionData({\n abi: ramp,\n functionName: \"setClaimFee\",\n args: [key, a.settleFirst, a.bps, a.recipient],\n }),\n );\n case \"setClaimFeeBps\":\n claimFee(a.bps);\n return result(\n encodeFunctionData({ abi: ramp, functionName: \"setClaimFeeBps\", args: [key, a.bps] }),\n );\n case \"sweepClaimFee\":\n assertMarketAddress(a.currency, \"currency\", hook.kind === \"ramp-eth\");\n return result(\n encodeFunctionData({ abi: ramp, functionName: \"sweepClaimFee\", args: [a.currency] }),\n );\n case \"register\":\n return result(\n encodeFunctionData({ abi: marketPoolRegistryAbi, functionName: \"register\", args: [key] }),\n context.deployment.registry.address,\n );\n case \"deregister\":\n case \"reregister\":\n return result(\n encodeFunctionData({ abi: marketPoolRegistryAbi, functionName: a.kind, args: [id] }),\n context.deployment.registry.address,\n );\n case \"setHook\":\n case \"disableHook\": {\n const reader = context.deployment.reader;\n if (!reader) throw new MarketFeatureUnavailableError(\"Reader required\");\n if (a.kind === \"disableHook\")\n return result(\n encodeFunctionData({\n abi: marketRampReaderAbi,\n functionName: \"disableHook\",\n args: [hook.address],\n }),\n reader.address,\n );\n condition(\n /^0x[0-9a-fA-F]{64}$/.test(a.expectedCodeHash) &&\n a.expectedCodeHash.toLowerCase() === hook.runtimeCodeHash.toLowerCase(),\n \"expectedCodeHash\",\n );\n return result(\n encodeFunctionData({\n abi: marketRampReaderAbi,\n functionName: \"setHook\",\n args: [hook.address, hook.kind === \"rwa-ramp\" ? 2 : 1, a.expectedCodeHash],\n }),\n reader.address,\n );\n }\n default:\n throw new InvalidMarketConfigError(\"kind\", \"Unknown management action.\");\n }\n}\n\nexport async function inspectMarketManagementAt(\n scope: MarketReadScope,\n a: MarketManagementAction,\n account: Address,\n when = 0,\n): Promise<MarketManagementAuthorization> {\n assertMarketAddress(account, \"account\");\n integer(when, \"when\", 0, 2 ** 48 - 1);\n const call = encodeMarketManagement(scope, a);\n const hook = requireMarketHook(scope, call.key.hooks);\n if (hook.capabilities.management !== \"verified\")\n throw new MarketFeatureUnavailableError(\"verified management capability\");\n const registryAction = [\n \"register\",\n \"deregister\",\n \"reregister\",\n \"setHook\",\n \"disableHook\",\n ].includes(a.kind);\n const readerAction = a.kind === \"setHook\" || a.kind === \"disableHook\";\n // Disable a broken Hook without querying it: only the Reader and its authority/Registry matter.\n if (a.kind !== \"disableHook\" && a.kind !== \"deregister\" && a.kind !== \"reregister\")\n await assertWriteDeployment(scope, call.key, false, true);\n else await assertMarketCode(scope, scope.deployment.authority);\n const read = { blockNumber: scope.block.blockNumber };\n if (registryAction) {\n await assertMarketCode(scope, scope.deployment.registry);\n const actual = await scope.publicClient.readContract({\n ...read,\n address: scope.deployment.registry.address,\n abi: marketPoolRegistryAbi,\n functionName: \"authority\",\n });\n if (!isAddressEqual(actual, scope.deployment.authority.address))\n throw new MarketDeploymentVerificationError(\n \"registry.authority\",\n scope.deployment.authority.address,\n actual,\n );\n }\n if (readerAction) {\n const reader = scope.deployment.reader;\n if (!reader) throw new MarketFeatureUnavailableError(\"Reader required\");\n await assertMarketCode(scope, reader);\n const [registry, authority] = await Promise.all([\n scope.publicClient.readContract({\n ...read,\n address: reader.address,\n abi: marketRampReaderAbi,\n functionName: \"registry\",\n }),\n scope.publicClient.readContract({\n ...read,\n address: reader.address,\n abi: marketRampReaderAbi,\n functionName: \"authority\",\n }),\n ]);\n if (\n !isAddressEqual(registry, scope.deployment.registry.address) ||\n !isAddressEqual(authority, scope.deployment.authority.address)\n )\n throw new MarketDeploymentVerificationError(\"reader.bindings\", scope.deployment, [\n registry,\n authority,\n ]);\n }\n const hookRead = { ...read, address: hook.address, abi: marketRampAbi } as const;\n if (a.kind === \"setCryptoPoolConfig\" || a.kind === \"setRwaPoolConfig\") {\n const absolute = await scope.publicClient.readContract({\n ...hookRead,\n functionName: \"ABSOLUTE_MAX_FEE\",\n });\n condition(a.cap <= absolute, \"cap\");\n }\n if (a.kind === \"pokeFee\" || a.kind === \"setPoolAsymmetry\") {\n const id = getMarketPoolId(call.key);\n const [floor, cap] = await Promise.all([\n scope.publicClient.readContract({ ...hookRead, functionName: \"pokeFloor\", args: [id] }),\n scope.publicClient.readContract({ ...hookRead, functionName: \"maxFee\", args: [id] }),\n ]);\n if (a.kind === \"pokeFee\")\n condition(\n [a.fee0For1, a.fee1For0].every((fee) => fee === 0 || (fee >= floor && fee <= cap)),\n \"pokeFee.band\",\n );\n else condition(a.premiumPips <= cap - floor, \"premiumPips.band\");\n }\n if (a.kind === \"setEarlyClose\" && a.closeSec !== 0) {\n const id = getMarketPoolId(call.key);\n const [open, close] = await Promise.all([\n scope.publicClient.readContract({\n ...read,\n address: hook.address,\n abi: marketRwaRampAbi,\n functionName: \"openSec\",\n args: [id],\n }),\n scope.publicClient.readContract({\n ...read,\n address: hook.address,\n abi: marketRwaRampAbi,\n functionName: \"closeSec\",\n args: [id],\n }),\n ]);\n condition(a.closeSec <= close && a.closeSec - open >= 10800, \"earlyClose\");\n }\n const target = {\n ...read,\n address: scope.deployment.authority.address,\n abi: marketAccessManagerAbi,\n } as const;\n const [immediate, delay] =\n a.kind === \"sweepClaimFee\"\n ? ([true, 0] as const)\n : await scope.publicClient.readContract({\n ...target,\n functionName: \"canCall\",\n args: [account, call.to, call.data.slice(0, 10) as Hex],\n });\n const operationId = keccak256(\n encodeAbiParameters(\n [{ type: \"address\" }, { type: \"address\" }, { type: \"bytes\" }],\n [account, call.to, call.data],\n ),\n );\n const scheduledAt = await scope.publicClient.readContract({\n ...target,\n functionName: \"getSchedule\",\n args: [operationId],\n });\n return {\n permission: immediate ? \"immediate\" : delay > 0 ? \"delayed\" : \"denied\",\n delay,\n operationId,\n scheduledAt,\n direct: { to: call.to, data: call.data, value: 0n },\n schedule: {\n to: target.address,\n value: 0n,\n data: encodeFunctionData({\n abi: marketAccessManagerAbi,\n functionName: \"schedule\",\n args: [call.to, call.data, when],\n }),\n },\n execute: {\n to: target.address,\n value: 0n,\n data: encodeFunctionData({\n abi: marketAccessManagerAbi,\n functionName: \"execute\",\n args: [call.to, call.data],\n }),\n },\n };\n}\n\nexport function managementRequest(\n auth: MarketManagementAuthorization,\n execution: MarketManagementExecution,\n timestamp: bigint,\n) {\n if (auth.permission === \"denied\")\n throw new InvalidMarketConfigError(\n \"permission\",\n \"Account is not authorized for this management selector.\",\n );\n if (execution.mode === \"direct\") {\n condition(auth.permission === \"immediate\", \"permission.scheduleRequired\");\n return auth.direct;\n }\n if (execution.mode === \"schedule\") {\n condition(auth.permission === \"delayed\" && auth.scheduledAt === 0, \"schedule\");\n const when = execution.when ?? 0;\n condition(when === 0 || BigInt(when) >= timestamp + BigInt(auth.delay), \"when\");\n return auth.schedule;\n }\n if (execution.mode === \"execute\") {\n condition(\n auth.scheduledAt !== 0 && BigInt(auth.scheduledAt) <= timestamp,\n \"schedule.notReadyOrExpired\",\n );\n return auth.execute;\n }\n throw new InvalidMarketConfigError(\"mode\", \"Unknown management execution mode.\");\n}\n","import { InvalidMarketConfigError } from \"../errors\";\nimport type { MarketDayOverride } from \"../management-types\";\n\n/** Gregorian input domain for the SDK calendar helpers: years 1970..9999. */\nexport function marketDaysInMonth(year: number, month: number): number {\n if (\n !Number.isInteger(year) ||\n year < 1970 ||\n year > 9999 ||\n !Number.isInteger(month) ||\n month < 1 ||\n month > 12\n )\n throw new InvalidMarketConfigError(\"date\", \"Expected year 1970..9999 and month 1..12.\");\n if (month === 2) return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28;\n return [4, 6, 9, 11].includes(month) ? 30 : 31;\n}\n/** Replaces the whole month's overrides. Empty days clears the month; at most ten distinct dates. */\nexport function packMarketDayOverrides(\n year: number,\n month: number,\n days: readonly MarketDayOverride[],\n): bigint {\n const maximum = marketDaysInMonth(year, month);\n if (!Array.isArray(days) || days.length > 10)\n throw new InvalidMarketConfigError(\"days\", \"At most ten overrides per month.\");\n const seen = new Set<number>();\n let packed = 0n;\n for (const { day, status } of days) {\n if (\n !Number.isInteger(day) ||\n day < 1 ||\n day > maximum ||\n seen.has(day) ||\n (status !== \"closed\" && status !== \"open\")\n )\n throw new InvalidMarketConfigError(\"days\", \"Invalid or duplicate override date/status.\");\n seen.add(day);\n packed |= (status === \"closed\" ? 1n : 2n) << BigInt((day - 1) * 2);\n }\n return packed;\n}\n","import { isAddressEqual, keccak256, type PublicClient } from \"viem\";\nimport {\n marketClaimFeePolicyAbi,\n marketMarketCalendarAbi,\n marketPoolRegistryAbi,\n marketRampAbi,\n marketRampReaderAbi,\n marketRwaRampAbi,\n marketStateViewAbi,\n} from \"./abi\";\nimport { defineMarketDeployment } from \"./deployment\";\nimport { MarketDeploymentVerificationError, MarketReadError } from \"./errors\";\nimport type { MarketDeployment, MarketDeploymentVerification } from \"./types\";\n\nfunction assertEqual(field: string, expected: unknown, actual: unknown): void {\n if (expected !== actual) throw new MarketDeploymentVerificationError(field, expected, actual);\n}\n\n/** Pins all reads to one block and rejects a reorg before returning a code-and-wiring report. */\nexport async function verifyMarketDeployment(\n publicClient: PublicClient,\n input: MarketDeployment,\n options: { readonly blockNumber?: bigint } = {},\n): Promise<MarketDeploymentVerification> {\n const deployment = defineMarketDeployment(input);\n try {\n assertEqual(\"chainId\", deployment.chainId, await publicClient.getChainId());\n const block = await publicClient.getBlock(\n options.blockNumber === undefined\n ? { blockTag: \"latest\" }\n : { blockNumber: options.blockNumber },\n );\n if (block.number === null || block.hash === null) {\n throw new MarketDeploymentVerificationError(\"block\", \"mined block\", block);\n }\n const blockNumber = block.number;\n const contracts = [\n deployment.poolManager,\n deployment.registry,\n deployment.authority,\n ...(deployment.reader ? [deployment.reader] : []),\n ...(deployment.poolStateReader?.kind === \"state-view\"\n ? [deployment.poolStateReader.contract]\n : []),\n ...deployment.hooks.flatMap((hook) => [\n hook,\n hook.claimFeePolicy,\n ...(hook.calendar ? [hook.calendar] : []),\n ]),\n ];\n // Sequential reads keep requests bounded even for large caller-supplied Hook lists.\n for (const contract of contracts) {\n const code = await publicClient.getCode({ address: contract.address, blockNumber });\n if (!code || code === \"0x\") {\n throw new MarketDeploymentVerificationError(contract.address, \"deployed code\", code);\n }\n assertEqual(contract.address, contract.runtimeCodeHash.toLowerCase(), keccak256(code));\n }\n const assertAddress = (field: string, expected: `0x${string}`, actual: `0x${string}`) => {\n if (!isAddressEqual(expected, actual)) {\n throw new MarketDeploymentVerificationError(field, expected, actual);\n }\n };\n if (deployment.poolStateReader?.kind === \"state-view\") {\n assertAddress(\n \"stateView.poolManager\",\n deployment.poolManager.address,\n await publicClient.readContract({\n address: deployment.poolStateReader.contract.address,\n abi: marketStateViewAbi,\n functionName: \"poolManager\",\n blockNumber,\n }),\n );\n }\n assertAddress(\n \"registry.authority\",\n deployment.authority.address,\n await publicClient.readContract({\n address: deployment.registry.address,\n abi: marketPoolRegistryAbi,\n functionName: \"authority\",\n blockNumber,\n }),\n );\n if (deployment.reader) {\n const reader = {\n address: deployment.reader.address,\n abi: marketRampReaderAbi,\n blockNumber,\n } as const;\n assertAddress(\n \"reader.registry\",\n deployment.registry.address,\n await publicClient.readContract({ ...reader, functionName: \"registry\" }),\n );\n assertAddress(\n \"reader.authority\",\n deployment.authority.address,\n await publicClient.readContract({ ...reader, functionName: \"authority\" }),\n );\n }\n for (const hook of deployment.hooks) {\n const target = { address: hook.address, abi: marketRampAbi, blockNumber } as const;\n assertAddress(\n `${hook.address}.poolManager`,\n deployment.poolManager.address,\n await publicClient.readContract({ ...target, functionName: \"poolManager\" }),\n );\n assertAddress(\n `${hook.address}.authority`,\n deployment.authority.address,\n await publicClient.readContract({ ...target, functionName: \"authority\" }),\n );\n assertAddress(\n `${hook.address}.claimFeePolicy`,\n hook.claimFeePolicy.address,\n await publicClient.readContract({ ...target, functionName: \"claimFeePolicy\" }),\n );\n assertAddress(\n `${hook.address}.policy.ledger`,\n hook.address,\n await publicClient.readContract({\n address: hook.claimFeePolicy.address,\n abi: marketClaimFeePolicyAbi,\n functionName: \"ledger\",\n blockNumber,\n }),\n );\n assertEqual(\n `${hook.address}.MAX_POKE_DISCOUNT_BPS`,\n 5000,\n await publicClient.readContract({ ...target, functionName: \"MAX_POKE_DISCOUNT_BPS\" }),\n );\n if (hook.calendar) {\n assertAddress(\n `${hook.address}.calendar`,\n hook.calendar.address,\n await publicClient.readContract({\n address: hook.address,\n abi: marketRwaRampAbi,\n functionName: \"marketCalendar\",\n blockNumber,\n }),\n );\n assertAddress(\n `${hook.address}.calendar.controller`,\n hook.address,\n await publicClient.readContract({\n address: hook.calendar.address,\n abi: marketMarketCalendarAbi,\n functionName: \"controller\",\n blockNumber,\n }),\n );\n }\n if (deployment.reader) {\n assertEqual(\n `${hook.address}.readerKind`,\n hook.kind === \"rwa-ramp\" ? 2 : 1,\n await publicClient.readContract({\n address: deployment.reader.address,\n abi: marketRampReaderAbi,\n functionName: \"hookKind\",\n args: [hook.address],\n blockNumber,\n }),\n );\n }\n }\n const finalBlock = await publicClient.getBlock({ blockNumber });\n assertEqual(\"blockHash\", block.hash, finalBlock.hash);\n return Object.freeze({\n chainId: deployment.chainId,\n deploymentId: deployment.deploymentId,\n blockNumber,\n blockHash: block.hash,\n scope: \"code-and-wiring\",\n checkedContracts: contracts.length,\n });\n } catch (error) {\n if (error instanceof MarketDeploymentVerificationError) throw error;\n throw new MarketReadError(error);\n }\n}\n","import type { Hex, PublicClient, WalletClient } from \"viem\";\nimport { getMarketClaimOperator, getMarketShareAuthorization } from \"./actions/authorizations\";\nimport { estimateMarketClaimableFees, getMarketFeeSnapshot } from \"./actions/earnings\";\nimport {\n getMarketCurrentFees,\n getMarketFeeBreakdown,\n getMarketSession,\n previewMarketFeeAt,\n} from \"./actions/fees\";\nimport { getMarketPoolState } from \"./actions/pool-state\";\nimport { getMarketPool, listMarketPools } from \"./actions/pools\";\nimport { getMarketPosition, getMarketRange } from \"./actions/positions\";\nimport { createMarketWriteActions } from \"./actions/write/transactions\";\nimport { defineMarketChain } from \"./chains\";\nimport { InvalidMarketConfigError } from \"./errors\";\nimport type {\n MarketListPoolsParams,\n MarketPositionParams,\n MarketRangeParams,\n MarketReadOptions,\n} from \"./read-types\";\nimport type { MarketChainConfig } from \"./types\";\nimport { verifyMarketDeployment } from \"./verify\";\n\nexport interface MarketClientOptions {\n readonly publicClient: PublicClient;\n readonly chain: MarketChainConfig;\n readonly walletClient?: WalletClient;\n}\n\n/** Construction does not issue RPC requests or certify the deployment. Wallet is optional for reads. */\nexport function createMarketClient(options: MarketClientOptions) {\n const chain = defineMarketChain(options.chain);\n const publicClient = options.publicClient;\n if (publicClient.chain && publicClient.chain.id !== chain.chainId) {\n throw new InvalidMarketConfigError(\"publicClient.chain\", \"Public client chain does not match.\");\n }\n const context = { publicClient, deployment: chain.deployment };\n return Object.freeze({\n chain,\n getClaimOperator: (params: Parameters<typeof getMarketClaimOperator>[1]) =>\n getMarketClaimOperator(context, params),\n getShareAuthorization: (params: Parameters<typeof getMarketShareAuthorization>[1]) =>\n getMarketShareAuthorization(context, params),\n getFeeSnapshot: (params: MarketPositionParams) => getMarketFeeSnapshot(context, params),\n estimateClaimableFees: (params: MarketPositionParams) =>\n estimateMarketClaimableFees(context, params),\n ...createMarketWriteActions(publicClient, options.walletClient, chain),\n verifyDeployment: (readOptions?: { readonly blockNumber?: bigint }) =>\n verifyMarketDeployment(publicClient, chain.deployment, readOptions),\n getPool: (poolId: Hex, readOptions?: MarketReadOptions) =>\n getMarketPool(context, poolId, readOptions),\n listPools: (params?: MarketListPoolsParams) => listMarketPools(context, params),\n getCurrentFees: (poolId: Hex, readOptions?: MarketReadOptions) =>\n getMarketCurrentFees(context, poolId, readOptions),\n getFeeBreakdown: (poolId: Hex, zeroForOne: boolean, readOptions?: MarketReadOptions) =>\n getMarketFeeBreakdown(context, poolId, zeroForOne, readOptions),\n previewFeeAt: (\n poolId: Hex,\n zeroForOne: boolean,\n timestamp: bigint,\n readOptions?: MarketReadOptions,\n ) => previewMarketFeeAt(context, poolId, zeroForOne, timestamp, readOptions),\n getSession: (poolId: Hex, readOptions?: MarketReadOptions & { readonly timestamp?: bigint }) =>\n getMarketSession(context, poolId, readOptions),\n getRange: (params: MarketRangeParams) => getMarketRange(context, params),\n getPosition: (params: MarketPositionParams) => getMarketPosition(context, params),\n getPoolState: (poolId: Hex, readOptions?: MarketReadOptions) =>\n getMarketPoolState(context, poolId, readOptions),\n });\n}\n\nexport type MarketClient = ReturnType<typeof createMarketClient>;\n","import type { Address, Hex } from \"viem\";\nimport type { MarketHookKind, MarketPoolKey } from \"./types\";\n\n/** Historical discovery data, not a verified deployment or a write-capability grant. */\nexport interface MarketTestPool {\n readonly chainId: number;\n readonly name: string;\n readonly testAssets: true;\n readonly permissionlessMint: true;\n readonly hookKind: MarketHookKind;\n readonly poolId: Hex;\n readonly key: Readonly<MarketPoolKey>;\n readonly base: { readonly symbol: string; readonly address: Address; readonly decimals: number };\n readonly quote: { readonly symbol: string; readonly address: Address; readonly decimals: number };\n readonly components: {\n readonly poolManager: Address;\n readonly registry: Address;\n readonly reader: Address;\n readonly accessManager: Address;\n };\n readonly source: {\n readonly commit: string;\n readonly path: string;\n readonly blockNumber: number;\n readonly blockHash: Hex;\n };\n}\n\n/** Valueless, openly mintable ERC-20 pools on mainnets; tBNB is not native BNB. */\nexport const marketTestPools = [\n {\n chainId: 5042,\n name: \"tBTC/tUSDC\",\n testAssets: true,\n permissionlessMint: true,\n hookKind: \"ramp\",\n poolId: \"0x1a325fe4671d6584778464cbe5ea68b111c2a72718f128a9427717298e85e2cd\",\n key: {\n currency0: \"0x442fc5b4d43fb7ec18ff8ac0a8fb9fdd2efec0db\",\n currency1: \"0x44e90eb500868af9b0b16406f3ce165c90e1e85e\",\n fee: 8388608,\n tickSpacing: 1,\n hooks: \"0x928f4c9b7f80dcbe95b606867e76336a956fa080\",\n },\n base: {\n symbol: \"tBTC\",\n address: \"0x442fc5b4d43fb7ec18ff8ac0a8fb9fdd2efec0db\",\n decimals: 8,\n },\n quote: {\n symbol: \"tUSDC\",\n address: \"0x44e90eb500868af9b0b16406f3ce165c90e1e85e\",\n decimals: 6,\n },\n components: {\n poolManager: \"0x8366a39cc670b4001a1121b8f6a443a643e40951\",\n registry: \"0x3386feb5016983790ef05410e888a8b7bf5a722d\",\n reader: \"0xbd782f3de07f2c8f27ef3a2cb165f36c5a505e45\",\n accessManager: \"0x005710955b542c11fa2259721840329cddf44914\",\n },\n source: {\n commit: \"cf16bd9376c12ea50de04658b279176d8d56e4f5\",\n path: \"docs/test-pools/arc.json\",\n blockNumber: 23523593,\n blockHash: \"0xea3eb1e8cd308955ad999df48212f3b839e3eec7b55cf7702aba213d548f847d\",\n },\n },\n {\n chainId: 56,\n name: \"tBNB/tUSDT\",\n testAssets: true,\n permissionlessMint: true,\n hookKind: \"ramp\",\n poolId: \"0xb1cf54cb728bb02bb40def7d4f088a7274f35ef05b6257cb518d5f10be438bee\",\n key: {\n currency0: \"0x78e708f1f8fe842abaaeaf23ade31e524e153980\",\n currency1: \"0x8a5218b1b296ced5c88cd55c256fcb58c32f227d\",\n fee: 8388608,\n tickSpacing: 1,\n hooks: \"0xa6a75d930f7a920391c4afffe744069233c4e080\",\n },\n base: {\n symbol: \"tBNB\",\n address: \"0x78e708f1f8fe842abaaeaf23ade31e524e153980\",\n decimals: 18,\n },\n quote: {\n symbol: \"tUSDT\",\n address: \"0x8a5218b1b296ced5c88cd55c256fcb58c32f227d\",\n decimals: 18,\n },\n components: {\n poolManager: \"0x28e2Ea090877bF75740558f6BFB36A5ffeE9e9dF\",\n registry: \"0xe75be888ae3d92be2f962f62f78775228eb3cbc9\",\n reader: \"0x2fd8d887a67bf61166e5aacae375cda0ad72d292\",\n accessManager: \"0x09e9f944a86c5c239eb0dceac85e1f4805d61256\",\n },\n source: {\n commit: \"cf16bd9376c12ea50de04658b279176d8d56e4f5\",\n path: \"docs/test-pools/bsc.json\",\n blockNumber: 124890195,\n blockHash: \"0xba1ae7df7b719fc6d0cf4b49a2278926fc6c62aaf12e2bc49c9788579bba948e\",\n },\n },\n {\n chainId: 56,\n name: \"tQQQ/tUSDT\",\n testAssets: true,\n permissionlessMint: true,\n hookKind: \"rwa-ramp\",\n poolId: \"0x9ccf485776611256dd717db8c53808e370160d8c90668a75c6d456dd07f21423\",\n key: {\n currency0: \"0x51984c455a78c072f9a23453e236bd3729dc3efd\",\n currency1: \"0x8a5218b1b296ced5c88cd55c256fcb58c32f227d\",\n fee: 8388608,\n tickSpacing: 1,\n hooks: \"0x7b144d9583c71a1b20cb26954d2ccd330af46080\",\n },\n base: {\n symbol: \"tQQQ\",\n address: \"0x51984c455a78c072f9a23453e236bd3729dc3efd\",\n decimals: 18,\n },\n quote: {\n symbol: \"tUSDT\",\n address: \"0x8a5218b1b296ced5c88cd55c256fcb58c32f227d\",\n decimals: 18,\n },\n components: {\n poolManager: \"0x28e2Ea090877bF75740558f6BFB36A5ffeE9e9dF\",\n registry: \"0xe75be888ae3d92be2f962f62f78775228eb3cbc9\",\n reader: \"0x2fd8d887a67bf61166e5aacae375cda0ad72d292\",\n accessManager: \"0x09e9f944a86c5c239eb0dceac85e1f4805d61256\",\n },\n source: {\n commit: \"cf16bd9376c12ea50de04658b279176d8d56e4f5\",\n path: \"docs/test-pools/bsc.json\",\n blockNumber: 124890195,\n blockHash: \"0xba1ae7df7b719fc6d0cf4b49a2278926fc6c62aaf12e2bc49c9788579bba948e\",\n },\n },\n] as const satisfies readonly MarketTestPool[];\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAuB,cAAAA,mBAAkB;;;ACAlC,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YACW,OACT,SACA;AACA,UAAM,OAAO;AAHJ;AAIT,SAAK,OAAO;AAAA,EACd;AAAA,EALW;AAMb;AAEO,IAAM,oCAAN,cAAgD,MAAM;AAAA,EAC3D,YACW,OACA,UACA,QACT;AACA,UAAM,+BAA+B,KAAK,GAAG;AAJpC;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EANW;AAAA,EACA;AAAA,EACA;AAKb;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAY,OAAgB;AAC1B,UAAM,mFAAmF;AAAA,MACvF;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gCAAN,cAA4C,MAAM;AAAA,EACvD,YAAqB,SAAiB;AACpC,UAAM,yDAAyD,OAAO,GAAG;AADtD;AAEnB,SAAK,OAAO;AAAA,EACd;AAAA,EAHqB;AAIvB;AAEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAqBC,OAAqB;AACxC,UAAM,+EAA+E;AADlE,gBAAAA;AAEnB,SAAK,OAAO;AAAA,EACd;AAAA,EAHqB;AAIvB;AAEO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAChD,YACW,OACT,OACA;AACA;AAAA,MACE,sBAAsB,KAAK;AAAA,MAC3B,EAAE,MAAM;AAAA,IACV;AANS;AAOT,SAAK,OAAO;AAAA,EACd;AAAA,EARW;AASb;AAEO,IAAM,iCAAN,cAA6C,MAAM;AAAA,EACxD,YACW,cACA,iBACA,QACT;AACA,UAAM,0BAA0B,MAAM,8CAA8C;AAJ3E;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EANW;AAAA,EACA;AAAA,EACA;AAKb;;;AClEA;AAAA,EAEE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIA,SAAS,iBAAiB,OAAe,OAAe,OAAO,KAAW;AAC/E,MAAI,OAAO,UAAU,YAAY,QAAQ,MAAM,SAAS,MAAM,OAAO,IAAI,GAAG;AAC1E,UAAM,IAAI,yBAAyB,OAAO,kBAAkB,IAAI,UAAU;AAAA,EAC5E;AACF;AAEO,SAAS,mBAAmB,OAAkB;AACnD,MAAI,CAAC,sBAAsB,KAAK,KAAK,GAAG;AACtC,UAAM,IAAI,yBAAyB,UAAU,6BAA6B;AAAA,EAC5E;AACF;AAEO,SAAS,oBAAoB,SAAkB,OAAe,cAAc,OAAa;AAC9F,MAAI,CAAC,UAAU,OAAO,KAAM,CAAC,eAAe,eAAe,SAAS,WAAW,GAAI;AACjF,UAAM,IAAI,yBAAyB,OAAO,oCAAoC;AAAA,EAChF;AACF;AAGO,SAAS,oBAAoB,KAAmC;AACrE,sBAAoB,IAAI,WAAW,aAAa,IAAI;AACpD,sBAAoB,IAAI,WAAW,WAAW;AAC9C,sBAAoB,IAAI,OAAO,OAAO;AACtC,MAAI,OAAO,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,GAAG;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,QAAQ,SAAU;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,UAAU,IAAI,WAAW,KAAK,IAAI,cAAc,KAAK,IAAI,cAAc,OAAO;AACxF,UAAM,IAAI,yBAAyB,eAAe,yCAAyC;AAAA,EAC7F;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,WAAW,WAAW,IAAI,SAAS;AAAA,IACnC,WAAW,WAAW,IAAI,SAAS;AAAA,IACnC,KAAK,IAAI;AAAA,IACT,aAAa,IAAI;AAAA,IACjB,OAAO,WAAW,IAAI,KAAK;AAAA,EAC7B,CAAC;AACH;AAEO,SAAS,gBAAgB,OAA2B;AACzD,QAAM,MAAM,oBAAoB,KAAK;AACrC,SAAO;AAAA,IACL;AAAA,MACE;AAAA,QACE,EAAE,MAAM,UAAU;AAAA,QAClB,EAAE,MAAM,UAAU;AAAA,QAClB,EAAE,MAAM,SAAS;AAAA,QACjB,EAAE,MAAM,QAAQ;AAAA,QAChB,EAAE,MAAM,UAAU;AAAA,MACpB;AAAA,MACA,CAAC,IAAI,WAAW,IAAI,WAAW,IAAI,KAAK,IAAI,aAAa,IAAI,KAAK;AAAA,IACpE;AAAA,EACF;AACF;AAEO,SAAS,iBACd,QACA,WACA,WACA,cAAc,GACN;AACR,qBAAmB,MAAM;AACzB,MAAI,CAAC,OAAO,UAAU,WAAW,KAAK,cAAc,KAAK,cAAc,OAAO;AAC5E,UAAM,IAAI,yBAAyB,eAAe,yCAAyC;AAAA,EAC7F;AACA,MACE,CAAC,OAAO,UAAU,SAAS,KAC3B,CAAC,OAAO,UAAU,SAAS,KAC3B,YAAY,WACZ,YAAY,UACZ,aAAa,aACb,YAAY,gBAAgB,KAC5B,YAAY,gBAAgB,GAC5B;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,QACE,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,QAAQ,GAAG,EAAE,MAAM,QAAQ,CAAC;AAAA,QAC1D,CAAC,QAAQ,WAAW,SAAS;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,uBACd,KACA,MACA,OACA,MACS;AACT,QAAM,aAAa,oBAAoB,GAAG;AAC1C,sBAAoB,MAAM,QAAQ,IAAI;AACtC,sBAAoB,OAAO,SAAS,IAAI;AACxC,QAAM,UACJ,eAAe,MAAM,WAAW,SAAS,KAAK,eAAe,OAAO,WAAW,SAAS;AAC1F,QAAM,UACJ,eAAe,MAAM,WAAW,SAAS,KAAK,eAAe,OAAO,WAAW,SAAS;AAC1F,MAAK,CAAC,WAAW,CAAC,WAAa,SAAS,SAAS,SAAS,QAAS;AACjE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,SAAS,SAAS,UAAU;AACrC;;;ACnIA,SAAuB,kBAAAC,iBAAgB,aAAAC,kBAAiB;;;ACAxD,SAAS,cAAAC,aAAY,aAAAC,YAAW,eAAAC,oBAAmB;AASnD,SAAS,QAAQ,OAAe,SAAwB;AACtD,QAAM,IAAI,yBAAyB,OAAO,OAAO;AACnD;AAEA,SAAS,SAAS,OAAiC,OAAyC;AAC1F,MAAI,CAACC,WAAU,MAAM,OAAO,KAAK,MAAM,QAAQ,YAAY,MAAMC,cAAa;AAC5E,YAAQ,GAAG,KAAK,YAAY,kCAAkC;AAAA,EAChE;AACA,MAAI,CAAC,sBAAsB,KAAK,MAAM,eAAe,KAAK,SAAS,KAAK,MAAM,eAAe,GAAG;AAC9F,YAAQ,GAAG,KAAK,oBAAoB,gDAAgD;AAAA,EACtF;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,SAASC,YAAW,MAAM,OAAO;AAAA,IACjC,iBAAiB,MAAM;AAAA,EACzB,CAAC;AACH;AAEA,IAAM,iBAAiB,CAAC,aAAa,mBAAmB,iBAAiB,YAAY;AAErF,SAAS,KAAK,OAA6B,OAAqC;AAC9E,QAAM,QAAQ,SAAS,KAAK;AAC5B,MAAI,CAAC,CAAC,QAAQ,YAAY,UAAU,EAAE,SAAS,MAAM,IAAI,GAAG;AAC1D,YAAQ,GAAG,KAAK,SAAS,+BAA+B;AAAA,EAC1D;AACA,MAAI,MAAM,mBAAmB,WAAW;AACtC,YAAQ,GAAG,KAAK,mBAAmB,oCAAoC;AAAA,EACzE;AACA,MAAK,MAAM,SAAS,gBAAiB,MAAM,aAAa,SAAY;AAClE,YAAQ,GAAG,KAAK,aAAa,yCAAyC;AAAA,EACxE;AACA,aAAW,OAAO,gBAAgB;AAChC,QAAI,CAAC,CAAC,YAAY,cAAc,UAAU,EAAE,SAAS,MAAM,aAAa,GAAG,CAAC,GAAG;AAC7E,cAAQ,GAAG,KAAK,iBAAiB,GAAG,IAAI,oDAAoD;AAAA,IAC9F;AAAA,EACF;AACA,MAAI,MAAM,SAAS,cAAc,MAAM,aAAa,oBAAoB,YAAY;AAClF,YAAQ,GAAG,KAAK,iCAAiC,oCAAoC;AAAA,EACvF;AACA,QAAM,eAAuC,OAAO,OAAO;AAAA,IACzD,WAAW,MAAM,aAAa;AAAA,IAC9B,iBAAiB,MAAM,aAAa;AAAA,IACpC,eAAe,MAAM,aAAa;AAAA,IAClC,YAAY,MAAM,aAAa;AAAA,EACjC,CAAC;AACD,SAAO,OAAO,OAAO;AAAA,IACnB,GAAG,SAAS,OAAO,KAAK;AAAA,IACxB,MAAM,MAAM;AAAA,IACZ,gBAAgB,MAAM;AAAA,IACtB,gBAAgB,SAAS,MAAM,gBAAgB,GAAG,KAAK,iBAAiB;AAAA,IACxE,GAAI,MAAM,WAAW,EAAE,UAAU,SAAS,MAAM,UAAU,GAAG,KAAK,WAAW,EAAE,IAAI,CAAC;AAAA,IACpF;AAAA,EACF,CAAC;AACH;AAGO,SAAS,uBAAuB,OAA2C;AAChF,MAAI,CAAC,OAAO,cAAc,MAAM,OAAO,KAAK,MAAM,WAAW,GAAG;AAC9D,YAAQ,WAAW,mCAAmC;AAAA,EACxD;AACA,MAAI,CAAC,6BAA6B,KAAK,MAAM,YAAY,GAAG;AAC1D,YAAQ,gBAAgB,uDAAuD;AAAA,EACjF;AACA,MAAI,MAAM,MAAM,WAAW,EAAG,SAAQ,SAAS,0CAA0C;AACzF,QAAM,QAAQ,MAAM,MAAM,IAAI,IAAI;AAClC,MAAI,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC,EAAE,SAAS,MAAM,QAAQ;AACtE,YAAQ,SAAS,2CAA2C;AAAA,EAC9D;AACA,MAAI;AACJ,MAAI,MAAM,iBAAiB,SAAS,cAAc;AAChD,sBAAkB,OAAO,OAAO;AAAA,MAC9B,MAAM;AAAA,MACN,UAAU,SAAS,MAAM,gBAAgB,UAAU,0BAA0B;AAAA,IAC/E,CAAC;AAAA,EACH,WAAW,MAAM,iBAAiB,SAAS,YAAY;AACrD,QAAI,MAAM,gBAAgB,WAAW,iBAAiB;AACpD,cAAQ,0BAA0B,yCAAyC;AAAA,IAC7E;AACA,sBAAkB,OAAO,OAAO,EAAE,MAAM,YAAY,QAAQ,gBAAgB,CAAC;AAAA,EAC/E,WAAW,MAAM,oBAAoB,QAAW;AAC9C,YAAQ,wBAAwB,gCAAgC;AAAA,EAClE;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,IACpB,aAAa,SAAS,MAAM,aAAa,aAAa;AAAA,IACtD,UAAU,SAAS,MAAM,UAAU,UAAU;AAAA,IAC7C,WAAW,SAAS,MAAM,WAAW,WAAW;AAAA,IAChD,GAAI,MAAM,SAAS,EAAE,QAAQ,SAAS,MAAM,QAAQ,QAAQ,EAAE,IAAI,CAAC;AAAA,IACnE,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,OAAO,OAAO,OAAO,KAAK;AAAA,EAC5B,CAAC;AACH;;;AD7EA,eAAsB,mBACpB,SACA,SACA,MAC4B;AAC5B,QAAM,aAAa,uBAAuB,QAAQ,UAAU;AAC5D,QAAM,eAAe,QAAQ;AAC7B,QAAM,EAAE,aAAa,UAAU,IAAI;AACnC,MAAI,gBAAgB,OAAW,kBAAiB,aAAa,aAAa;AAC1E,MACE,cAAc,WACb,gBAAgB,UAAa,CAAC,sBAAsB,KAAK,SAAS,IACnE;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,UAAM,UAAU,MAAM,aAAa,WAAW;AAC9C,QAAI,YAAY,WAAW;AACzB,YAAM,IAAI,kCAAkC,WAAW,WAAW,SAAS,OAAO;AACpF,UAAM,QAAQ,MAAM,aAAa;AAAA,MAC/B,gBAAgB,SAAY,EAAE,UAAU,SAAS,IAAI,EAAE,YAAY;AAAA,IACrE;AACA,QAAI,MAAM,WAAW,QAAQ,MAAM,SAAS;AAC1C,YAAM,IAAI,kCAAkC,SAAS,eAAe,KAAK;AAC3E,QAAI,gBAAgB,UAAa,MAAM,WAAW;AAChD,YAAM,IAAI,kCAAkC,eAAe,aAAa,MAAM,MAAM;AACtF,QAAI,cAAc,UAAa,MAAM,KAAK,YAAY,MAAM,UAAU,YAAY;AAChF,YAAM,IAAI,kCAAkC,aAAa,WAAW,MAAM,IAAI;AAChF,UAAM,WAAwB,OAAO,OAAO;AAAA,MAC1C;AAAA,MACA,cAAc,WAAW;AAAA,MACzB,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,IACnB,CAAC;AACD,UAAM,OAAO,MAAM,KAAK,EAAE,cAAc,YAAY,OAAO,SAAS,CAAC;AACrE,UAAM,aAAa,MAAM,aAAa,SAAS,EAAE,aAAa,MAAM,OAAO,CAAC;AAC5E,QAAI,WAAW,SAAS,MAAM;AAC5B,YAAM,IAAI,kCAAkC,aAAa,MAAM,MAAM,WAAW,IAAI;AACtF,WAAO,OAAO,OAAO,EAAE,OAAO,UAAU,KAAK,CAAC;AAAA,EAChD,SAAS,OAAO;AACd,QACE,iBAAiB,4BACjB,iBAAiB,qCACjB,iBAAiB,iCACjB,iBAAiB,uBACjB,iBAAiB,mBACjB,iBAAiB;AAEjB,YAAM;AACR,UAAM,IAAI,gBAAgB,KAAK;AAAA,EACjC;AACF;AAEO,SAAS,kBACd,OACA,SACsB;AACtB,sBAAoB,SAAS,MAAM;AACnC,QAAMC,QAAO,MAAM,WAAW,MAAM,KAAK,CAAC,UAAUC,gBAAe,MAAM,SAAS,OAAO,CAAC;AAC1F,MAAI,CAACD,MAAM,OAAM,IAAI,8BAA8B,oBAAoB,OAAO,EAAE;AAChF,SAAOA;AACT;AAGA,eAAsB,iBACpB,OACAE,WACe;AACf,QAAM,OAAO,MAAM,MAAM,aAAa,QAAQ;AAAA,IAC5C,SAASA,UAAS;AAAA,IAClB,aAAa,MAAM,MAAM;AAAA,EAC3B,CAAC;AACD,QAAM,SAAS,QAAQ,SAAS,OAAOC,WAAU,IAAI,IAAI;AACzD,MAAI,WAAWD,UAAS,gBAAgB,YAAY;AAClD,UAAM,IAAI,kCAAkCA,UAAS,SAASA,UAAS,iBAAiB,MAAM;AAClG;;;AH9FO,SAAS,4BACd,SACA,QAMmD;AACnD,sBAAoB,OAAO,OAAO,OAAO;AACzC,sBAAoB,OAAO,UAAU,UAAU;AAC/C,mBAAiB,OAAO,SAAS,SAAS;AAC1C,QAAM,QAAQE,YAAW,OAAO,KAAK;AACrC,QAAM,WAAWA,YAAW,OAAO,QAAQ;AAC3C,QAAM,UAAU,OAAO;AACvB,QAAMC,QAAO,kBAAkB,SAAS,OAAO,IAAI,EAAE;AACrD,SAAO,mBAAmB,SAAS,QAAQ,OAAO,UAAU;AAC1D,UAAM,SAAS;AAAA,MACb,SAASA;AAAA,MACT,KAAK;AAAA,MACL,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,QAAI,MAAM,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,aAAa,CAAC;AACjF,YAAM,IAAI,oBAAoBA,KAAI;AACpC,UAAM,CAAC,QAAQ,WAAW,iBAAiB,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC9E,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,UAAU,OAAO;AAAA,MACjC,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ;AAAA,MACxB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,SAAS,QAAQ;AAAA,MACjC,CAAC;AAAA,IACH,CAAC;AACD,WAAO,EAAE,MAAAA,OAAM,SAAS,OAAO,UAAU,QAAQ,WAAW,iBAAiB,gBAAgB;AAAA,EAC/F,CAAC;AACH;AAEO,SAAS,uBACd,SACA,QACA;AACA,QAAM,EAAE,OAAO,UAAU,QAAQ,IAAI;AACrC,sBAAoB,OAAO,OAAO;AAClC,sBAAoB,UAAU,UAAU;AACxC,mBAAiB,SAAS,SAAS;AACnC,QAAMA,QAAO,kBAAkB,SAAS,OAAO,IAAI,EAAE;AACrD,SAAO,mBAAmB,SAAS,QAAQ,OAAO,WAAW;AAAA,IAC3D,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,MAAM,MAAM,aAAa,aAAa;AAAA,MAC9C,SAASA;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,OAAO,SAAS,QAAQ;AAAA,MAC/B,aAAa,MAAM,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH,EAAE;AACJ;;;AKhFA,SAAS,uBAAAC,sBAAqB,cAAc,kBAAAC,iBAAgB,aAAAC,YAAW,SAAAC,cAAa;;;ACIpF,IAAM,OAAO,MAAM;AAGZ,SAAS,6BAA6B,QAA8C;AACzF,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,EAAE,OAAO,qBAAqB,IAAI,SAAS;AACjD,mBAAiB,MAAM,aAAa,eAAe,GAAG;AACtD,mBAAiB,SAAS,QAAQ,UAAU,GAAG;AAC/C,mBAAiB,OAAO,kBAAkB,oBAAoB,GAAG;AACjE,MAAI,SAAS,SAAS,MAAM,eAAe,MAAM,gBAAgB,OAAO;AACtE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,MACE,CAAC,OAAO,UAAU,oBAAoB,KACtC,uBAAuB,KACvB,uBAAuB;AAEvB,UAAM,IAAI,yBAAyB,wBAAwB,6BAA6B;AAC1F,WAAS,MACP,MACA,KACA,YACA,WACA,MACA,MACqB;AACrB,eAAW,CAAC,MAAM,KAAK,KAAK;AAAA,MAC1B,CAAC,OAAO,GAAG;AAAA,MACX,CAAC,cAAc,UAAU;AAAA,MACzB,CAAC,QAAQ,IAAI;AAAA,MACb,CAAC,QAAQ,IAAI;AAAA,IACf;AACE,uBAAiB,OAAO,IAAI;AAC9B,qBAAiB,MAAM,QAAQ,GAAG;AAClC,qBAAiB,WAAW,aAAa,GAAG;AAC5C,QAAI,aAAa;AACf,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACF,UAAM,QACJ,MAAM,gBAAgB,KAAK,KAAM,OAAO,QAAQ,KAAK,OAAO,IAAI,IAAI,MAAM,cAAe;AAE3F,qBAAiB,OAAO,qBAAqB,GAAG;AAChD,UAAM,MAAO,QAAQ,OAAO,oBAAoB,IAAK;AACrD,UAAM,UACJ,OAAO,MAAM,gBAAgB,KAAK,MAAO,QAAQ,OAAO,OAAQ,MAAM;AACxE,qBAAiB,SAAS,iBAAiB;AAC3C,UAAM,kBAAkB,SAAS,UAAU,MAAM,cAAc;AAC/D,UAAM,YAAY,SAAS,UAAU,UAAU,cAAc;AAC7D,UAAM,eAAe,kBAAkB;AACvC,UAAM,SAAS,YAAY;AAC3B,qBAAiB,QAAQ,UAAU,GAAG;AACtC,qBAAiB,OAAO,QAAQ,aAAa,GAAG;AAChD,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,eAAe,YAAY;AAAA,MAC3B,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,SAAS,MAAM,gBAAgB,SAAS,MAAM;AAAA,IACtD,oBAAoB,OAAO,YAAY,MAAM,OAAO,YAAY;AAAA,EAClE;AACF;;;AC7FA,SAAS,uBAAAC,sBAA+B,aAAAC,YAAW,aAAa;AAKzD,SAAS,uBAAuB,QAAkC;AACvE,qBAAmB,MAAM;AACzB,QAAM,OAAOC;AAAA,IACXC,qBAAoB,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAAA,EAC9E;AACA,SAAO,CAAC,MAAM,OAAO,OAAO,IAAI,IAAI,OAAO,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;AACvE;AAEO,SAAS,2BAA2B,OAAuB;AAChE,QAAM,CAAC,OAAO,SAAS,IAAI;AAC3B,MACE,MAAM,WAAW,KACjB,UAAU,UACV,cAAc,UACd,CAAC,sBAAsB,KAAK,KAAK,KACjC,CAAC,sBAAsB,KAAK,SAAS,GACrC;AACA,UAAM,IAAI,yBAAyB,YAAY,6CAA6C;AAAA,EAC9F;AACA,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO;AAAA,IACL,cAAc,OAAQ,MAAM,QAAQ;AAAA,IACpC,MAAM,OAAO,OAAO,OAAO,IAAI,OAAO,IAAI,CAAC;AAAA,IAC3C,mBAAmB,OAAQ,OAAO,OAAQ,SAAS;AAAA,IACnD,iBAAiB,OAAQ,OAAO,OAAQ,SAAS;AAAA,IACjD,iBAAiB,OAAO,SAAS,KAAM,MAAM,QAAQ;AAAA,EACvD;AACF;;;AChCA,SAAS,cAAAC,aAAY,kBAAAC,uBAAsB;AAoB3C,eAAe,UACb,OACA,QACsB;AACtB,QAAMC,QAAO,kBAAkB,OAAO,OAAO,IAAI;AACjD,QAAM,SAAS;AAAA,IACb,SAASA,MAAK;AAAA,IACd,KAAK;AAAA,IACL,aAAa,MAAM,MAAM;AAAA,EAC3B;AACA,MAAI,MAAM,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,aAAa,CAAC;AACjF,UAAM,IAAI,oBAAoBA,MAAK,OAAO;AAC5C,QAAM,CAAC,QAAQ,WAAW,WAAW,GAAG,IAAI,MAAM,MAAM,aAAa,aAAa;AAAA,IAChF,GAAG;AAAA,IACH,cAAc;AAAA,IACd,MAAM,CAAC,OAAO,OAAO;AAAA,EACvB,CAAC;AACD,MAAI,CAAC,IAAK,QAAO,EAAE,QAAQ,SAAS,MAAMA,MAAK,SAAS,SAAS,OAAO,QAAQ;AAChF,QAAM,MAAM,oBAAoB,MAAM;AACtC,MAAI,CAACC,gBAAe,IAAI,OAAOD,MAAK,OAAO;AACzC,UAAM,IAAI,kCAAkC,kBAAkBA,MAAK,SAAS,IAAI,KAAK;AACvF,QAAM,SAAS,gBAAgB,GAAG;AAClC,QAAM,aAAa,iBAAiB,QAAQ,WAAW,WAAW,IAAI,WAAW;AACjF,MAAI,eAAe,OAAO;AACxB,UAAM,IAAI,kCAAkC,WAAW,OAAO,SAAS,UAAU;AACnF,QAAM,CAAC,OAAO,cAAc,YAAY,oBAAoB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAChF,MAAM,aAAa,aAAa;AAAA,MAC9B,GAAG;AAAA,MACH,cAAc;AAAA,MACd,MAAM,CAAC,OAAO,OAAO;AAAA,IACvB,CAAC;AAAA,IACD,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,SAAS,CAAC;AAAA,IACrE,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC;AAAA,IACxF,MAAM,aAAa,aAAa;AAAA,MAC9B,GAAG;AAAA,MACH,cAAc;AAAA,MACd,MAAM,CAAC,OAAO,OAAO;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAMA,MAAK;AAAA,IACX,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,eACd,SACA,QACsC;AACtC,QAAM,EAAE,MAAAA,OAAM,QAAQ,IAAI;AAC1B,sBAAoBA,OAAM,MAAM;AAChC,mBAAiB,SAAS,SAAS;AACnC,SAAO,mBAAmB,SAAS,QAAQ,CAAC,UAAU,UAAU,OAAO,EAAE,MAAAA,OAAM,QAAQ,CAAC,CAAC;AAC3F;AAEO,SAAS,kBACd,SACA,QACyC;AACzC,QAAM,EAAE,MAAAA,OAAM,QAAQ,IAAI;AAC1B,sBAAoBA,OAAM,MAAM;AAChC,mBAAiB,SAAS,SAAS;AACnC,sBAAoB,OAAO,OAAO,OAAO;AACzC,QAAM,QAAQE,YAAW,OAAO,KAAK;AACrC,SAAO,mBAAmB,SAAS,QAAQ,OAAO,UAAU;AAC1D,UAAM,QAAQ,MAAM,UAAU,OAAO,EAAE,MAAAF,OAAM,QAAQ,CAAC;AACtD,UAAM,SAAS;AAAA,MACb,SAAS,MAAM;AAAA,MACf,KAAK;AAAA,MACL,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,UAAM,CAAC,QAAQ,UAAU,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,SAAS,KAAK;AAAA,MACvB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,SAAS,KAAK;AAAA,MACvB,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,SAAS;AAAA,MACvB,cAAc,SAAS;AAAA,MACvB,iBAAiB,SAAS;AAAA,MAC1B,iBAAiB,SAAS;AAAA,MAC1B,gBAAgB,UAAU,CAAC;AAAA,MAC3B,gBAAgB,UAAU,CAAC;AAAA,IAC7B;AAAA,EACF,CAAC;AACH;;;AHrHO,SAAS,qBACd,SACA,OAC0C;AAC1C,QAAM,SAAS,eAAe,KAAK;AACnC,SAAO,mBAAmB,SAAS,QAAQ,OAAO,UAAU;AAC1D,UAAM,YAAY,MAAM,kBAAkB,SAAS,EAAE,GAAG,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG;AACnF,UAAM,QAAQ,SAAS;AACvB,QAAI,MAAM,WAAW;AACnB,YAAM,IAAI,8BAA8B,6BAA6B;AACvE,UAAMG,QAAO,kBAAkB,OAAO,MAAM,IAAI;AAChD,UAAM,SAAS,MAAM,WAAW;AAChC,QAAI,CAAC;AACH,YAAM,IAAI,8BAA8B,6CAA6C;AACvF,eAAWC,aAAY,CAACD,OAAMA,MAAK,gBAAgB,MAAM,WAAW,WAAW;AAC7E,YAAM,iBAAiB,OAAOC,SAAQ;AACxC,UAAM,SAAS;AAAA,MACb,SAASD,MAAK;AAAA,MACd,KAAK;AAAA,MACL,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,UAAM,SAAS;AAAA,MACb,SAASA,MAAK,eAAe;AAAA,MAC7B,KAAK;AAAA,MACL,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpB,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,cAAc,CAAC;AAAA,MAC1E,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,iBAAiB,CAAC;AAAA,MAC7E,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,SAAS,CAAC;AAAA,MACrE,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,MAAM,OAAO;AAAA,MACtB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,MAAM,OAAO;AAAA,MACtB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,UAAU,MAAM,CAAC,MAAM,MAAM,EAAE,CAAC;AAAA,MAC3F,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,WAAW,MAAM,CAAC,MAAM,MAAM,EAAE,CAAC;AAAA,MAC5F,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,WAAW,MAAM,CAAC,MAAM,MAAM,EAAE,CAAC;AAAA,IAC9F,CAAC;AACD,eAAW,CAAC,MAAM,UAAU,MAAM,KAAK;AAAA,MACrC,CAAC,WAAW,MAAM,WAAW,YAAY,SAAS,OAAO;AAAA,MACzD,CAAC,UAAUA,MAAK,eAAe,SAAS,aAAa;AAAA,MACrD,CAAC,UAAUA,MAAK,SAAS,aAAa;AAAA,IACxC,GAAY;AACV,UAAI,CAACE,gBAAe,UAAU,MAAM;AAClC,cAAM,IAAI,kCAAkC,MAAM,UAAU,MAAM;AAAA,IACtE;AAEA,UAAM,aAAaC;AAAA,MACjB;AAAA,QACE,CAAC,WAAW,SAAS,SAAS,SAAS;AAAA,QACvC,CAACH,MAAK,SAAS,MAAM,WAAW,MAAM,WAAWI,OAAM,MAAM,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MACrF;AAAA,IACF;AACA,QAAI;AACJ,QAAI,OAAO,SAAS,cAAc;AAChC,YAAM,iBAAiB,OAAO,OAAO,QAAQ;AAC7C,YAAM,OAAO;AAAA,QACX,SAAS,OAAO,SAAS;AAAA,QACzB,KAAK;AAAA,QACL,aAAa,MAAM,MAAM;AAAA,MAC3B;AACA,YAAM,QAAQ,MAAM,MAAM,aAAa,aAAa,EAAE,GAAG,MAAM,cAAc,cAAc,CAAC;AAC5F,UAAI,CAACF,gBAAe,OAAO,OAAO;AAChC,cAAM,IAAI,kCAAkC,yBAAyB,SAAS,KAAK;AACrF,qBAAe,MAAM,MAAM,aAAa,aAAa;AAAA,QACnD,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,MAAM,QAAQ,UAAU;AAAA,MACjC,CAAC;AAAA,IACH,OAAO;AACL,YAAM,WAAW,uBAAuB,MAAM,MAAM,EAAE,CAAC;AACvD,YAAM,OAAO;AAAA,QACXC;AAAA,UACEE;AAAA,YACE,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC;AAAA,YACzC,CAAC,YAAY,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI,EAAE,CAAC;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AACA,YAAM,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE;AAAA,QAAI,CAAC,WAC9BD,OAAM,OAAO,QAAQ,KAAK,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC;AAAA,MACxD;AACA,YAAM,QAAQ,MAAM,MAAM,aAAa,aAAa;AAAA,QAClD,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK;AAAA,QACZ,aAAa,MAAM,MAAM;AAAA,MAC3B,CAAC;AACD,YAAM,CAAC,WAAW,OAAO,KAAK,IAAI;AAClC,UACE,MAAM,WAAW,KACjB,CAAC,aACD,CAAC,SACD,CAAC,SACD,MAAM,KAAK,CAAC,SAAS,CAAC,sBAAsB,KAAK,IAAI,CAAC;AAEtD,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACF,qBAAe,CAAC,OAAO,SAAS,GAAG,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC;AAAA,IACjE;AACA,QAAI,aAAa,CAAC,MAAM,MAAM,MAAM;AAClC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,MAAM,MAAM;AAAA,QACZ,aAAa,CAAC;AAAA,MAChB;AACF,WAAO,eAAe;AAAA,MACpB,UAAU,EAAE,GAAG,UAAU,MAAM;AAAA,MAC/B,kBAAkB,aAAa,CAAC;AAAA,MAChC,iBAAiB,aAAa,CAAC;AAAA,MAC/B,iBAAiB,aAAa,CAAC;AAAA,MAC/B,aAAa,OAAO,CAAC;AAAA,MACrB,aAAa,OAAO,CAAC;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,4BACpB,SACA,QACA;AACA,QAAM,WAAW,MAAM,qBAAqB,SAAS,MAAM;AAC3D,SAAO,eAAe;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,MAAM,6BAA6B,SAAS,IAAI;AAAA,EAClD,CAAC;AACH;;;AIjKA,SAAmB,kBAAAE,iBAAgB,eAAAC,oBAAmB;AAoBtD,SAAS,cACP,OACA,KACY;AACZ,QAAM,MAAM,oBAAoB,IAAI,GAAG;AACvC,QAAM,WAAW,gBAAgB,GAAG;AACpC,MAAI,SAAS,YAAY,MAAM,IAAI,GAAG,YAAY;AAChD,UAAM,IAAI,kCAAkC,UAAU,UAAU,IAAI,EAAE;AACxE,QAAM,WACJ,MAAM,WAAW,MAAM,KAAK,CAAC,UAAUC,gBAAe,MAAM,SAAS,IAAI,KAAK,CAAC,GAAG,QAAQ;AAC5F,SAAO,EAAE,KAAK,QAAQ,IAAI,IAAI,QAAQ,IAAI,QAAQ,SAAS;AAC7D;AAEA,eAAsB,iBAAiB,OAAwB,QAAkC;AAC/F,QAAM,MAAM,MAAM,MAAM,aAAa,aAAa;AAAA,IAChD,SAAS,MAAM,WAAW,SAAS;AAAA,IACnC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM;AAAA,IACb,aAAa,MAAM,MAAM;AAAA,EAC3B,CAAC;AACD,QAAM,OAAO,cAAc,OAAO,GAAG;AACrC,MAAI,KAAK,OAAO,YAAY,MAAM,OAAO,YAAY;AACnD,UAAM,IAAI,kCAAkC,mBAAmB,QAAQ,KAAK,MAAM;AACpF,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAwB,MAAkB;AAC9E,QAAMC,QAAO,kBAAkB,OAAO,KAAK,IAAI,KAAK;AACpD,MAAID,gBAAe,KAAK,IAAI,WAAWE,YAAW,KAAKD,MAAK,SAAS,YAAY;AAC/E,UAAM,IAAI,yBAAyB,aAAa,mCAAmC;AAAA,EACrF;AACA,SAAOA;AACT;AAEO,SAAS,cACd,SACA,QACA,UAA6B,CAAC,GACO;AACrC,qBAAmB,MAAM;AACzB,SAAO,mBAAmB,SAAS,SAAS,CAAC,UAAU,iBAAiB,OAAO,MAAM,CAAC;AACxF;AAEO,SAAS,gBACd,SACA,SAAgC,CAAC,GACQ;AACzC,QAAM,EAAE,SAAS,IAAI,QAAQ,IAAI,aAAa,MAAM,IAAI;AACxD,mBAAiB,QAAQ,QAAQ;AACjC,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ;AACnD,UAAM,IAAI,yBAAyB,SAAS,gCAAgC;AAC9E,SAAO,mBAAmB,SAAS,QAAQ,OAAO,UAAU;AAC1D,UAAM,SAAS;AAAA,MACb,SAAS,MAAM,WAAW,SAAS;AAAA,MACnC,KAAK;AAAA,MACL,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,UAAM,aAAa,MAAM,MAAM,aAAa,aAAa;AAAA,MACvD,GAAG;AAAA,MACH,cAAc;AAAA,IAChB,CAAC;AACD,UAAM,MAAM,SAAS,OAAO,KAAK,IAAI,aAAa,SAAS,OAAO,KAAK,IAAI;AAC3E,UAAM,QAAsB,CAAC;AAE7B,aAAS,QAAQ,QAAQ,QAAQ,KAAK,SAAS,IAAI;AACjD,YAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE;AACxD,YAAM,QAAQ,MAAM,QAAQ;AAAA,QAC1B,MAAM;AAAA,UAAK,EAAE,QAAQ,MAAM;AAAA,UAAG,CAAC,GAAG,UAChC,MAAM,aAAa,aAAa;AAAA,YAC9B,GAAG;AAAA,YACH,cAAc;AAAA,YACd,MAAM,CAAC,QAAQ,OAAO,KAAK,CAAC;AAAA,UAC9B,CAAC;AAAA,QACH;AAAA,MACF;AACA,iBAAW,SAAS,OAAO;AACzB,cAAM,OAAO,cAAc,OAAO,KAAK;AACvC,YAAI,CAAC,cAAc,KAAK,OAAQ,OAAM,KAAK,IAAI;AAAA,MACjD;AAAA,IACF;AACA,WAAO,EAAE,OAAO,YAAY,YAAY,MAAM,aAAa,MAAM,KAAK;AAAA,EACxE,CAAC;AACH;;;ACnFA,SAAS,YAAY,OAA8B;AACjD,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI,kCAAkC,WAAW,aAAa,KAAK;AAC3E;AAEO,SAAS,qBACd,SACA,QACA,UAA6B,CAAC,GACc;AAC5C,qBAAmB,MAAM;AACzB,SAAO,mBAAmB,SAAS,SAAS,OAAO,UAAU;AAC3D,UAAM,OAAO,MAAM,iBAAiB,OAAO,MAAM;AACjD,UAAME,QAAO,sBAAsB,OAAO,IAAI;AAC9C,UAAM,SAAS;AAAA,MACb,SAASA,MAAK;AAAA,MACd,KAAK;AAAA,MACL,aAAa,MAAM,MAAM;AAAA,IAC3B;AACA,UAAM,CAAC,cAAc,cAAc,cAAc,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/E,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,IAAI;AAAA,MACrB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,KAAK;AAAA,MACtB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,SAAS,CAAC;AAAA,MACrE,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC;AAAA,IAC1F,CAAC;AACD,WAAO,EAAE,MAAM,cAAc,cAAc,cAAc,WAAW;AAAA,EACtE,CAAC;AACH;AAEA,eAAe,iBACb,OACA,QACA,YACA,WACA,MAC6B;AAC7B,QAAM,SAAS,MAAM,WAAW;AAChC,MAAI,CAAC,OAAQ,OAAM,IAAI,8BAA8B,gCAAgC;AACrF,QAAM,OAAO,MAAM,iBAAiB,OAAO,MAAM;AACjD,QAAMA,QAAO,sBAAsB,OAAO,IAAI;AAC9C,QAAM,SAAS,MAAM,MAAM,aAAa,aAAa;AAAA,IACnD,SAAS,OAAO;AAAA,IAChB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,QAAQ,YAAY,SAAS;AAAA,IACpC,aAAa,MAAM,MAAM;AAAA,EAC3B,CAAC;AACD,MAAI,OAAO,gBAAgBA,MAAK,SAAS;AACvC,UAAM,IAAI;AAAA,MACR;AAAA,MACAA,MAAK,SAAS;AAAA,MACd,OAAO;AAAA,IACT;AACF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,OAAO,aAAa,YAAY,OAAO,OAAO,IAAI;AAAA,IAC3D,aAAa,OAAO;AAAA,IACpB,wBAAwB,OAAO;AAAA,IAC/B,yBAAyB,OAAO;AAAA,IAChC,gBAAgB,OAAO;AAAA,IACvB,iBAAiB,OAAO;AAAA,IACxB,gBAAgB,OAAO,OAAO,cAAc;AAAA,IAC5C,oBAAoB,OAAO;AAAA,IAC3B,YAAY,OAAO;AAAA,IACnB,cAAc,OAAO;AAAA,EACvB;AACF;AAEA,SAAS,gBAAgB,OAAsB;AAC7C,MAAI,OAAO,UAAU;AACnB,UAAM,IAAI,yBAAyB,cAAc,yCAAyC;AAC9F;AAEO,SAAS,sBACd,SACA,QACA,YACA,UAA6B,CAAC,GACe;AAC7C,qBAAmB,MAAM;AACzB,kBAAgB,UAAU;AAC1B,SAAO;AAAA,IAAmB;AAAA,IAAS;AAAA,IAAS,CAAC,UAC3C,iBAAiB,OAAO,QAAQ,YAAY,MAAM,MAAM,WAAW,SAAS;AAAA,EAC9E;AACF;AAGO,SAAS,mBACd,SACA,QACA,YACA,WACA,UAA6B,CAAC,GACe;AAC7C,qBAAmB,MAAM;AACzB,kBAAgB,UAAU;AAC1B,mBAAiB,WAAW,WAAW;AACvC,SAAO;AAAA,IAAmB;AAAA,IAAS;AAAA,IAAS,CAAC,UAC3C,iBAAiB,OAAO,QAAQ,YAAY,WAAW,SAAS;AAAA,EAClE;AACF;AAEO,SAAS,iBACd,SACA,QACA,UAA+D,CAAC,GACnB;AAC7C,qBAAmB,MAAM;AACzB,QAAM,YAAY,QAAQ;AAC1B,MAAI,cAAc,OAAW,kBAAiB,WAAW,WAAW;AACpE,SAAO,mBAAmB,SAAS,SAAS,OAAO,UAAU;AAC3D,UAAM,OAAO,MAAM,iBAAiB,OAAO,MAAM;AACjD,UAAMA,QAAO,sBAAsB,OAAO,IAAI;AAC9C,UAAM,KAAK,aAAa,MAAM,MAAM;AACpC,UAAM,UACJA,MAAK,SAAS,aACV;AAAA,MACE,MAAM,MAAM,aAAa,aAAa;AAAA,QACpC,SAASA,MAAK;AAAA,QACd,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,EAAE;AAAA,QACjB,aAAa,MAAM,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH,IACA;AACN,WAAO,EAAE,MAAM,SAAS,WAAW,IAAI,MAAM,cAAc,SAAY,YAAY,UAAU;AAAA,EAC/F,CAAC;AACH;;;ACjKA,SAAmB,kBAAAC,uBAAsB;AAclC,SAAS,mBACd,SACA,QACA,UAA6B,CAAC,GACY;AAC1C,qBAAmB,MAAM;AACzB,SAAO,mBAAmB,SAAS,SAAS,OAAO,UAAU;AAC3D,UAAM,OAAO,MAAM,iBAAiB,OAAO,MAAM;AACjD,0BAAsB,OAAO,IAAI;AACjC,WAAO,EAAE,MAAM,GAAI,MAAM,sBAAsB,OAAO,MAAM,EAAG;AAAA,EACjE,CAAC;AACH;AAGA,eAAsB,sBAAsB,OAAwB,QAAa;AAC/E,QAAM,SAAS,MAAM,WAAW;AAChC,MAAI,CAAC,OAAQ,OAAM,IAAI,8BAA8B,iBAAiB;AACtE,QAAM,iBAAiB,OAAO,MAAM,WAAW,WAAW;AAC1D,QAAM,cAAc,MAAM,MAAM;AAChC,MAAI;AACJ,MAAI,OAAO,SAAS,cAAc;AAChC,UAAM,iBAAiB,OAAO,OAAO,QAAQ;AAC7C,UAAM,SAAS;AAAA,MACb,SAAS,OAAO,SAAS;AAAA,MACzB,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,UAAU,MAAM,MAAM,aAAa,aAAa;AAAA,MACpD,GAAG;AAAA,MACH,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,CAACC,gBAAe,SAAS,MAAM,WAAW,YAAY,OAAO;AAC/D,YAAM,IAAI;AAAA,QACR;AAAA,QACA,MAAM,WAAW,YAAY;AAAA,QAC7B;AAAA,MACF;AACF,UAAM,CAAC,OAAO,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACjD,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC;AAAA,MACvF,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,cAAc;AAAA,QACd,MAAM,CAAC,MAAM;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AACD,YAAQ;AAAA,MACN,cAAc,MAAM,CAAC;AAAA,MACrB,MAAM,MAAM,CAAC;AAAA,MACb,mBAAmB,MAAM,CAAC;AAAA,MAC1B,iBAAiB,MAAM,CAAC;AAAA,MACxB;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,MAAM,MAAM,aAAa,aAAa;AAAA,MAClD,SAAS,MAAM,WAAW,YAAY;AAAA,MACtC,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,uBAAuB,MAAM,CAAC;AAAA,MACrC;AAAA,IACF,CAAC;AACD,YAAQ,2BAA2B,KAAK;AAAA,EAC1C;AACA,MAAI,MAAM,OAAO,WAAW,MAAM,OAAO;AACvC,UAAM,IAAI,kCAAkC,aAAa,kBAAkB,MAAM,IAAI;AACvF,SAAO,EAAE,QAAQ,OAAO,MAAM,aAAa,MAAM,iBAAiB,IAAI,GAAG,MAAM;AACjF;;;AC/EA,SAAuB,UAAU,kBAAAC,iBAAgB,eAAAC,oBAAmB;;;ACIpE,IAAM,MAAM,MAAM;AAClB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,yBAAyB,MAAsB;AAC7D,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI;AAC9C,UAAM,IAAI,yBAAyB,QAAQ,uCAAuC;AACpF,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,MAAI,QAAQ,MAAM;AAClB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC;AACxB,QAAI,WAAW,WAAc,WAAY,KAAK,OAAQ,EAAG,SAAS,QAAQ,UAAW;AAAA,EACvF;AACA,MAAI,OAAO,EAAG,WAAU,MAAM,QAAQ,MAAM;AAC5C,SAAQ,SAAS,MAAM,OAAO,MAAO;AACvC;AAEA,SAAS,YAAY,OAAqB;AACxC,MAAI,OAAO,UAAU,YAAY,QAAQ,YAAY,SAAS;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACJ;AAEO,SAAS,yBAAyB,cAA8B;AACrE,cAAY,YAAY;AACxB,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,SAAO,QAAQ,OAAO;AACpB,UAAM,SAAS,KAAK,MAAM,QAAQ,SAAS,CAAC;AAC5C,QAAI,yBAAyB,MAAM,KAAK,aAAc,SAAQ;AAAA,QACzD,SAAQ,SAAS;AAAA,EACxB;AACA,SAAO;AACT;AAGO,SAAS,oBAAoB,cAAsB,WAAmB,WAAmB;AAC9F,cAAY,YAAY;AACxB,aAAW,YAAY,CAAC,WAAW,SAAS,GAAG;AAC7C,QAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,KAAK,WAAW;AAC5D,YAAM,IAAI,yBAAyB,YAAY,0BAA0B;AAAA,EAC7E;AACA,SAAO;AAAA,IACL,WAAW,gBAAgB,KAAK,OAAO,OAAO,SAAS;AAAA,IACvD,cAAc,MAAM,QAAQ,OAAO,OAAO,SAAS;AAAA,EACrD;AACF;AAEA,SAAS,WAAW,cAAsB,WAAmB,WAAmB;AAC9E,cAAY,YAAY;AACxB,QAAM,QAAQ,yBAAyB,SAAS;AAChD,QAAM,QAAQ,yBAAyB,SAAS;AAChD,MAAI,SAAS;AACX,UAAM,IAAI,yBAAyB,SAAS,qCAAqC;AACnF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,eAAe,QAAQ,QAAQ,eAAe,QAAQ,QAAQ;AAAA,EACzE;AACF;AAGO,SAAS,6BAA6B,QAM1C;AACD,mBAAiB,OAAO,WAAW,aAAa,GAAG;AACnD,MAAI,OAAO,aAAa,QAAQ,OAAO,aAAa;AAClD,UAAM,IAAI,yBAAyB,YAAY,sBAAsB;AACvE,QAAM,EAAE,OAAO,OAAO,QAAQ,IAAI;AAAA,IAChC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,QAAM,SAAS,CAAC,GAAW,MAAe,OAAO,aAAa,QAAQ,IAAI,IAAI,MAAM,IAAI,IAAI;AAC5F,SAAO;AAAA,IACL,SAAS,OAAO,OAAO,YAAY,OAAO,QAAQ,UAAU,UAAU,KAAK;AAAA,IAC3E,SAAS,OAAO,OAAO,aAAa,UAAU,QAAQ,GAAG;AAAA,EAC3D;AACF;AAGO,SAAS,6BAA6B,QAMlC;AACT,mBAAiB,OAAO,SAAS,SAAS;AAC1C,mBAAiB,OAAO,SAAS,SAAS;AAC1C,QAAM,EAAE,OAAO,OAAO,QAAQ,IAAI;AAAA,IAChC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,QAAM,KACJ,YAAY,QACR,SACC,OAAO,WAAY,UAAU,QAAS,QAAS,QAAQ;AAC9D,QAAM,KAAK,YAAY,QAAQ,SAAa,OAAO,UAAU,OAAQ,UAAU;AAC/E,MAAI,OAAO,OAAW,kBAAiB,IAAI,cAAc,GAAG;AAC5D,MAAI,OAAO,OAAW,kBAAiB,IAAI,cAAc,GAAG;AAC5D,SAAO,OAAO,SAAa,MAAM,KAAM,OAAO,UAAa,KAAK,KAAK,KAAK;AAC5E;;;ACvIA,SAAuB,kBAAAC,iBAAgB,eAAAC,oBAAmB;AAiBnD,SAAS,aAAa,SAA4B,OAAqC;AAC5F,QAAM,MAAM,oBAAoB,KAAK;AACrC,QAAMC,QAAO,kBAAkB,SAAS,IAAI,KAAK;AACjD,MAAIC,gBAAe,IAAI,WAAWC,YAAW,KAAKF,MAAK,SAAS;AAC9D,UAAM,IAAI,8BAA8B,gCAAgC;AAC1E,SAAO;AACT;AAEO,SAAS,OAAO,WAAmB,UAAU,IAAY;AAC9D,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,KAAK,UAAU;AACzD,UAAM,IAAI,yBAAyB,mBAAmB,kCAAkC;AAC1F,SAAO,YAAY,OAAO,OAAO;AACnC;AAEO,SAAS,UAAU,SAA4B,KAAoB,IAAsB;AAC9F,sBAAoB,IAAI,IAAI;AAC5B,MACE,CAAC,IAAI,OAAO,QAAQ,WAAW,YAAY,SAASE,YAAW,EAAE;AAAA,IAAK,CAAC,UACrED,gBAAe,OAAO,EAAE;AAAA,EAC1B;AAEA,UAAM,IAAI,yBAAyB,MAAM,oDAAoD;AAC/F,SAAO;AACT;AAEO,SAAS,SAAS,OAAqB;AAC5C,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ;AACnD,UAAM,IAAI,yBAAyB,aAAa,0CAA0C;AAC9F;AAGA,eAAsB,sBACpB,OACA,KACA,gBAAgB,OAChB,aAAa,OACE;AACf,QAAMD,QAAO,kBAAkB,OAAO,IAAI,KAAK;AAC/C,MAAI,cAAcA,MAAK,aAAa,eAAe;AACjD,UAAM,IAAI,8BAA8B,gCAAgC;AAC1E,MAAI,CAAC,cAAcA,MAAK,aAAa,cAAc;AACjD,UAAM,IAAI,8BAA8B,+BAA+B;AACzE,MACE,CAAC,cACDC,gBAAe,IAAI,WAAWC,YAAW,KACzCF,MAAK,aAAa,oBAAoB;AAEtC,UAAM,IAAI,8BAA8B,qCAAqC;AAC/E,MAAI,iBAAiBA,MAAK,aAAa,kBAAkB;AACvD,UAAM,IAAI,8BAA8B,mCAAmC;AAC7E,aAAWG,aAAY;AAAA,IACrBH;AAAA,IACA,MAAM,WAAW;AAAA,IACjB,MAAM,WAAW;AAAA,IACjBA,MAAK;AAAA,EACP;AACE,UAAM,iBAAiB,OAAOG,SAAQ;AACxC,MAAIH,MAAK,SAAS,YAAY;AAC5B,QAAI,CAACA,MAAK,SAAU,OAAM,IAAI,8BAA8B,cAAc;AAC1E,UAAM,iBAAiB,OAAOA,MAAK,QAAQ;AAC3C,UAAM,CAAC,UAAU,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/C,MAAM,aAAa,aAAa;AAAA,QAC9B,SAASA,MAAK;AAAA,QACd,KAAK;AAAA,QACL,cAAc;AAAA,QACd,aAAa,MAAM,MAAM;AAAA,MAC3B,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,SAASA,MAAK,SAAS;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,aAAa,MAAM,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AACD,QACE,CAACC,gBAAe,UAAUD,MAAK,SAAS,OAAO,KAC/C,CAACC,gBAAe,YAAYD,MAAK,OAAO;AAExC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,CAACA,MAAK,SAAS,SAASA,MAAK,OAAO;AAAA,QACpC,CAAC,UAAU,UAAU;AAAA,MACvB;AAAA,EACJ;AACA,QAAM,SAAS;AAAA,IACb,SAASA,MAAK;AAAA,IACd,KAAK;AAAA,IACL,aAAa,MAAM,MAAM;AAAA,EAC3B;AACA,QAAM,SAAS,MAAM,QAAQ,IAAI;AAAA,IAC/B,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,cAAc,CAAC;AAAA,IAC1E,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,YAAY,CAAC;AAAA,IACxE,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,iBAAiB,CAAC;AAAA,IAC7E,MAAM,aAAa,aAAa;AAAA,MAC9B,SAASA,MAAK,eAAe;AAAA,MAC7B,KAAK;AAAA,MACL,cAAc;AAAA,MACd,aAAa,MAAM,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH,CAAC;AACD,QAAM,WAAW;AAAA,IACf,MAAM,WAAW,YAAY;AAAA,IAC7B,MAAM,WAAW,UAAU;AAAA,IAC3BA,MAAK,eAAe;AAAA,IACpBA,MAAK;AAAA,EACP;AACA,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,UAAM,OAAO,SAAS,KAAK;AAC3B,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,QAAQ,CAAC,OAAO,CAACC,gBAAe,MAAM,GAAG;AAC5C,YAAM,IAAI,kCAAkC,iBAAiB,KAAK,IAAI,MAAM,GAAG;AAAA,EACnF;AACF;;;AF7GA,eAAsB,uBACpB,SACA,QACA,OACiC;AACjC,QAAM,SAAS,eAAe,KAAK;AACnC,QAAM,MAAM,aAAa,SAAS,OAAO,GAAG;AAC5C,QAAM,SAAS,gBAAgB,GAAG;AAClC,QAAM,UAAU,iBAAiB,QAAQ,OAAO,WAAW,OAAO,WAAW,IAAI,WAAW;AAC5F,mBAAiB,OAAO,WAAW,aAAa,GAAG;AACnD,mBAAiB,OAAO,UAAU,UAAU;AAC5C,MAAI,OAAO,cAAc;AACvB,UAAM,IAAI,yBAAyB,aAAa,6BAA6B;AAC/E,MACE,CAAC,OAAO,UAAU,OAAO,WAAW,KACpC,OAAO,cAAc,KACrB,OAAO,eAAe;AAEtB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,SAAO;AAAA,IACL,MAAM,mBAAmB,SAAS,CAAC,GAAG,OAAO,UAAU;AACrD,YAAM,WAAW,OAAO,MAAM,MAAM,WAAW,OAAO,eAAe;AACrE,UAAI,OAAO,WAAW,MAAM,MAAM;AAChC,cAAM,IAAI,yBAAyB,YAAY,uBAAuB;AACxE,YAAM,QAAQ,MAAM,sBAAsB,OAAO,MAAM;AACvD,YAAM,UAAU,6BAA6B;AAAA,QAC3C,GAAG;AAAA,QACH,cAAc,MAAM;AAAA,QACpB,UAAU,WAAW,YAAY,OAAO;AAAA,MAC1C,CAAC;AACD,YAAM,QAAQ,CAAC,WACb,WAAW,aACN,SAAS,OAAO,MAAQ,OAAO,WAAW,IAAI,SAAS,SACvD,SAAS,OAAO,MAAQ,OAAO,WAAW,IAAK;AACtD,YAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,YAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,uBAAiB,QAAQ,UAAU,GAAG;AACtC,uBAAiB,QAAQ,UAAU,GAAG;AACtC,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,MAAM;AAAA,QACpB,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,aACE,WAAW,aAAaG,gBAAe,IAAI,WAAWC,YAAW,IAAI,SAAS;AAAA,QAChF,uBACE,WAAW,aAAaD,gBAAe,IAAI,WAAWC,YAAW,IAC7D,SAAS,QAAQ,UACjB;AAAA,QACN,WAAW,OAAO,WAAW,WAAW,OAAO,WAAW;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,qBACd,SACA,QAM4C;AAC5C,QAAM,MAAM,aAAa,SAAS,OAAO,GAAG;AAC5C,QAAM,EAAE,OAAO,SAAS,QAAQ,IAAI;AACpC,sBAAoB,OAAO,OAAO;AAClC,mBAAiB,SAAS,WAAW,GAAG;AACxC,mBAAiB,SAAS,WAAW,GAAG;AACxC,SAAO,mBAAmB,SAAS,QAAQ,OAAO,WAAW;AAAA,IAC3D;AAAA,IACA,SAAS,IAAI;AAAA,IACb,QAAQ,MAAM,QAAQ;AAAA,MAElB;AAAA,QACE,EAAE,OAAO,IAAI,WAAW,gBAAgB,QAAQ;AAAA,QAChD,EAAE,OAAO,IAAI,WAAW,gBAAgB,QAAQ;AAAA,MAClD,EACA,IAAI,OAAO,EAAE,OAAO,eAAe,MAAM;AACzC,YAAID,gBAAe,OAAOC,YAAW,GAAG;AACtC,gBAAMC,WAAU,MAAM,MAAM,aAAa,WAAW;AAAA,YAClD,SAAS;AAAA,YACT,aAAa,MAAM,MAAM;AAAA,UAC3B,CAAC;AACD,iBAAO;AAAA,YACL;AAAA,YACA,MAAM;AAAA,YACN,SAAAA;AAAA,YACA,WAAW;AAAA,YACX;AAAA,YACA,eAAe;AAAA,YACf,mBAAmBA,YAAW;AAAA,UAChC;AAAA,QACF;AACA,cAAM,SAAS;AAAA,UACb,SAAS;AAAA,UACT,KAAK;AAAA,UACL,aAAa,MAAM,MAAM;AAAA,QAC3B;AACA,cAAM,CAAC,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC7C,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,UACvF,MAAM,aAAa,aAAa;AAAA,YAC9B,GAAG;AAAA,YACH,cAAc;AAAA,YACd,MAAM,CAAC,OAAO,IAAI,KAAK;AAAA,UACzB,CAAC;AAAA,QACH,CAAC;AACD,eAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe,YAAY;AAAA,UAC3B,mBAAmB,WAAW;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,EAAE;AACJ;;;AG9IO,SAAS,kBAAkB,OAA6C;AAC7E,QAAM,aAAa,uBAAuB,MAAM,UAAU;AAC1D,MAAI,MAAM,YAAY,WAAW,SAAS;AACxC,UAAM,IAAI,yBAAyB,WAAW,4CAA4C;AAAA,EAC5F;AACA,MAAI,CAAC,OAAO,cAAc,MAAM,aAAa,KAAK,MAAM,gBAAgB,GAAG;AACzE,UAAM,IAAI,yBAAyB,iBAAiB,qCAAqC;AAAA,EAC3F;AACA,SAAO,OAAO,OAAO,EAAE,SAAS,MAAM,SAAS,YAAY,eAAe,MAAM,cAAc,CAAC;AACjG;;;ACbA;AAAA,EAEE;AAAA,EACA,sBAAAC;AAAA,EACA,YAAAC;AAAA,EAEA,kBAAAC;AAAA,EAGA,eAAAC;AAAA,OACK;;;ACVP;AAAA,EAEE,uBAAAC;AAAA,EACA;AAAA,EAEA,kBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,OACK;;;ACJA,SAAS,kBAAkB,MAAc,OAAuB;AACrE,MACE,CAAC,OAAO,UAAU,IAAI,KACtB,OAAO,QACP,OAAO,QACP,CAAC,OAAO,UAAU,KAAK,KACvB,QAAQ,KACR,QAAQ;AAER,UAAM,IAAI,yBAAyB,QAAQ,2CAA2C;AACxF,MAAI,UAAU,EAAG,QAAO,OAAO,MAAM,MAAM,OAAO,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK;AACxF,SAAO,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,SAAS,KAAK,IAAI,KAAK;AAC9C;AAEO,SAAS,uBACd,MACA,OACA,MACQ;AACR,QAAM,UAAU,kBAAkB,MAAM,KAAK;AAC7C,MAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS;AACxC,UAAM,IAAI,yBAAyB,QAAQ,kCAAkC;AAC/E,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI,SAAS;AACb,aAAW,EAAE,KAAK,OAAO,KAAK,MAAM;AAClC,QACE,CAAC,OAAO,UAAU,GAAG,KACrB,MAAM,KACN,MAAM,WACN,KAAK,IAAI,GAAG,KACX,WAAW,YAAY,WAAW;AAEnC,YAAM,IAAI,yBAAyB,QAAQ,4CAA4C;AACzF,SAAK,IAAI,GAAG;AACZ,eAAW,WAAW,WAAW,KAAK,OAAO,QAAQ,MAAM,KAAK,CAAC;AAAA,EACnE;AACA,SAAO;AACT;;;ADTA,SAAS,QAAQ,OAAe,OAAe,MAAM,GAAG,MAAM,UAAU;AACtE,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,OAAO,QAAQ;AACzD,UAAM,IAAI,yBAAyB,OAAO,oBAAoB,GAAG,KAAK,GAAG,GAAG;AAChF;AACA,SAAS,UAAU,IAAa,OAAe;AAC7C,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,MACA,6CAA6C,KAAK;AAAA,IACpD;AACJ;AAGO,SAAS,uBAAuB,SAA4B,GAA2B;AAC5F,QAAM,MAAM,aAAa,SAAS,EAAE,GAAG;AACvC,QAAMC,QAAO,kBAAkB,SAAS,IAAI,KAAK;AACjD,QAAM,KAAK,gBAAgB,GAAG;AAC9B,QAAM,SAASA,MAAK;AACpB,QAAM,OAAO;AACb,QAAM,MAAM;AACZ,QAAM,SAAS,CAAC,MAAW,KAAK,YAAY,EAAE,KAAK,IAAI,MAAM,OAAO,GAAY;AAChF,QAAM,aAAa,MAAM;AACvB,QAAIA,MAAK,SAAS,WAAY,OAAM,IAAI,8BAA8B,mBAAmB;AAAA,EAC3F;AACA,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,cAAQ,EAAE,UAAU,UAAU;AAC9B,cAAQ,EAAE,UAAU,UAAU;AAC9B,cAAQ,EAAE,KAAK,OAAO,GAAG,MAAM;AAC/B,gBAAU,EAAE,aAAa,KAAK,EAAE,aAAa,GAAG,SAAS;AACzD,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,aAAO,OAAO,mBAAmB,EAAE,KAAK,MAAM,cAAc,aAAa,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAAA,IACxF,KAAK;AACH,cAAQ,EAAE,aAAa,aAAa;AACpC,gBAAU,OAAO,EAAE,sBAAsB,WAAW,WAAW;AAC/D,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,iBAAiB;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,UAAIA,MAAK,SAAS,WAAY,OAAM,IAAI,8BAA8B,sBAAsB;AAC5F,cAAQ,EAAE,WAAW,aAAa,GAAG;AACrC,cAAQ,EAAE,UAAU,YAAY,EAAE,SAAS;AAC3C,cAAQ,EAAE,KAAK,OAAO,EAAE,QAAQ;AAChC,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,IACF,KAAK,oBAAoB;AACvB,iBAAW;AACX,cAAQ,EAAE,KAAK,OAAO,GAAG;AACzB,YAAM,IAAI,EAAE;AACZ,iBAAW,SAAS,CAAC,aAAa,kBAAkB,aAAa;AAC/D,gBAAQ,EAAE,KAAK,GAAG,OAAO,KAAK,EAAE,GAAG;AACrC,cAAQ,EAAE,WAAW,aAAa,GAAG,EAAE;AACvC,cAAQ,EAAE,aAAa,aAAa;AACpC,cAAQ,EAAE,eAAe,iBAAiB,GAAG,KAAK;AAClD,cAAQ,EAAE,YAAY,cAAc,GAAG,EAAE,GAAG;AAC5C,cAAQ,EAAE,aAAa,eAAe,GAAG,KAAK;AAC9C,cAAQ,EAAE,YAAY,cAAc,GAAG,KAAK;AAC5C;AAAA,QACE,EAAE,kBAAkB,IAChB,EAAE,cAAc,KAAK,EAAE,gBAAgB,IACvC,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE;AAAA,QACtE;AAAA,MACF;AACA;AAAA,QACE,EAAE,eAAe,IACb,EAAE,gBAAgB,KAAK,EAAE,eAAe,IACxC,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,KAAK,EAAE,eAAe;AAAA,QAC5E;AAAA,MACF;AAEA,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK,IAAI;AAAA,YACP,CAAC,SACC,KAAK,SAAS,cAAc,KAAK,SAAS,mBAAmB,KAAK,OAAO,WAAW;AAAA,UACxF;AAAA,UACA,cAAc;AAAA,UACd,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,KAAK;AACH,iBAAW;AACX,cAAQ,EAAE,SAAS,WAAW,OAAO,IAAK;AAC1C,cAAQ,EAAE,UAAU,YAAY,OAAO,KAAK;AAC5C,gBAAU,EAAE,WAAW,EAAE,WAAW,QAAQ,EAAE,WAAW,EAAE,WAAW,OAAO,cAAc;AAC3F,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,KAAK,mBAAmB;AACtB,iBAAW;AACX,YAAM,SAAS,uBAAuB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;AAC7D,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK,GAAG,MAAM;AAAA,QACnD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,KAAK;AACH,iBAAW;AACX,gBAAU,CAAC,QAAQ,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM;AACzD,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,IAAI,EAAE,SAAS,SAAS,IAAI,EAAE,SAAS,QAAQ,IAAI,CAAC;AAAA,QAC7D,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,iBAAW;AACX,cAAQ,EAAE,KAAK,OAAO,GAAG,kBAAkB,EAAE,MAAM,EAAE,KAAK,CAAC;AAC3D,cAAQ,EAAE,UAAU,YAAY,GAAG,KAAK;AACxC,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,IAAI,OAAO,EAAE,IAAI,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ;AAAA,QACvE,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,EAAE,UAAU,YAAY,GAAG,MAAM;AACzC,aAAO;AAAA,QACL,EAAE,SAAS,cACP,mBAAmB,EAAE,KAAK,MAAM,cAAc,aAAa,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,IACvF,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,KAAK,OAAO,EAAE,QAAQ,CAAC;AAAA,QAChC,CAAC;AAAA,MACP;AAAA,IACF,KAAK;AACH,eAAS,EAAE,GAAG;AACd,0BAAoB,EAAE,WAAW,aAAa,EAAE,QAAQ,CAAC;AACzD,UAAI,CAACC,gBAAe,EAAE,WAAWC,YAAW,EAAG,WAAU,SAAS,KAAK,EAAE,SAAS;AAClF,gBAAU,MAAM,QAAQ,EAAE,WAAW,GAAG,aAAa;AACrD,iBAAW,YAAY,EAAE;AACvB,4BAAoB,UAAU,eAAeF,MAAK,SAAS,UAAU;AACvE;AAAA,QACE,IAAI,IAAI,EAAE,YAAY,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY;AAAA,QAC1E;AAAA,MACF;AACA,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF,KAAK;AACH,eAAS,EAAE,GAAG;AACd,aAAO;AAAA,QACL,mBAAmB,EAAE,KAAK,MAAM,cAAc,kBAAkB,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,MACtF;AAAA,IACF,KAAK;AACH,0BAAoB,EAAE,UAAU,YAAYA,MAAK,SAAS,UAAU;AACpE,aAAO;AAAA,QACL,mBAAmB,EAAE,KAAK,MAAM,cAAc,iBAAiB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;AAAA,MACrF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,mBAAmB,EAAE,KAAK,uBAAuB,cAAc,YAAY,MAAM,CAAC,GAAG,EAAE,CAAC;AAAA,QACxF,QAAQ,WAAW,SAAS;AAAA,MAC9B;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,mBAAmB,EAAE,KAAK,uBAAuB,cAAc,EAAE,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC;AAAA,QACnF,QAAQ,WAAW,SAAS;AAAA,MAC9B;AAAA,IACF,KAAK;AAAA,IACL,KAAK,eAAe;AAClB,YAAM,SAAS,QAAQ,WAAW;AAClC,UAAI,CAAC,OAAQ,OAAM,IAAI,8BAA8B,iBAAiB;AACtE,UAAI,EAAE,SAAS;AACb,eAAO;AAAA,UACL,mBAAmB;AAAA,YACjB,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAACA,MAAK,OAAO;AAAA,UACrB,CAAC;AAAA,UACD,OAAO;AAAA,QACT;AACF;AAAA,QACE,sBAAsB,KAAK,EAAE,gBAAgB,KAC3C,EAAE,iBAAiB,YAAY,MAAMA,MAAK,gBAAgB,YAAY;AAAA,QACxE;AAAA,MACF;AACA,aAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAACA,MAAK,SAASA,MAAK,SAAS,aAAa,IAAI,GAAG,EAAE,gBAAgB;AAAA,QAC3E,CAAC;AAAA,QACD,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,yBAAyB,QAAQ,4BAA4B;AAAA,EAC3E;AACF;AAEA,eAAsB,0BACpB,OACA,GACA,SACA,OAAO,GACiC;AACxC,sBAAoB,SAAS,SAAS;AACtC,UAAQ,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC;AACpC,QAAM,OAAO,uBAAuB,OAAO,CAAC;AAC5C,QAAMA,QAAO,kBAAkB,OAAO,KAAK,IAAI,KAAK;AACpD,MAAIA,MAAK,aAAa,eAAe;AACnC,UAAM,IAAI,8BAA8B,gCAAgC;AAC1E,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,EAAE,IAAI;AACjB,QAAM,eAAe,EAAE,SAAS,aAAa,EAAE,SAAS;AAExD,MAAI,EAAE,SAAS,iBAAiB,EAAE,SAAS,gBAAgB,EAAE,SAAS;AACpE,UAAM,sBAAsB,OAAO,KAAK,KAAK,OAAO,IAAI;AAAA,MACrD,OAAM,iBAAiB,OAAO,MAAM,WAAW,SAAS;AAC7D,QAAM,OAAO,EAAE,aAAa,MAAM,MAAM,YAAY;AACpD,MAAI,gBAAgB;AAClB,UAAM,iBAAiB,OAAO,MAAM,WAAW,QAAQ;AACvD,UAAM,SAAS,MAAM,MAAM,aAAa,aAAa;AAAA,MACnD,GAAG;AAAA,MACH,SAAS,MAAM,WAAW,SAAS;AAAA,MACnC,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,CAACC,gBAAe,QAAQ,MAAM,WAAW,UAAU,OAAO;AAC5D,YAAM,IAAI;AAAA,QACR;AAAA,QACA,MAAM,WAAW,UAAU;AAAA,QAC3B;AAAA,MACF;AAAA,EACJ;AACA,MAAI,cAAc;AAChB,UAAM,SAAS,MAAM,WAAW;AAChC,QAAI,CAAC,OAAQ,OAAM,IAAI,8BAA8B,iBAAiB;AACtE,UAAM,iBAAiB,OAAO,MAAM;AACpC,UAAM,CAAC,UAAU,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC9C,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,SAAS,OAAO;AAAA,QAChB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,SAAS,OAAO;AAAA,QAChB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AACD,QACE,CAACA,gBAAe,UAAU,MAAM,WAAW,SAAS,OAAO,KAC3D,CAACA,gBAAe,WAAW,MAAM,WAAW,UAAU,OAAO;AAE7D,YAAM,IAAI,kCAAkC,mBAAmB,MAAM,YAAY;AAAA,QAC/E;AAAA,QACA;AAAA,MACF,CAAC;AAAA,EACL;AACA,QAAM,WAAW,EAAE,GAAG,MAAM,SAASD,MAAK,SAAS,KAAK,cAAc;AACtE,MAAI,EAAE,SAAS,yBAAyB,EAAE,SAAS,oBAAoB;AACrE,UAAM,WAAW,MAAM,MAAM,aAAa,aAAa;AAAA,MACrD,GAAG;AAAA,MACH,cAAc;AAAA,IAChB,CAAC;AACD,cAAU,EAAE,OAAO,UAAU,KAAK;AAAA,EACpC;AACA,MAAI,EAAE,SAAS,aAAa,EAAE,SAAS,oBAAoB;AACzD,UAAM,KAAK,gBAAgB,KAAK,GAAG;AACnC,UAAM,CAAC,OAAO,GAAG,IAAI,MAAM,QAAQ,IAAI;AAAA,MACrC,MAAM,aAAa,aAAa,EAAE,GAAG,UAAU,cAAc,aAAa,MAAM,CAAC,EAAE,EAAE,CAAC;AAAA,MACtF,MAAM,aAAa,aAAa,EAAE,GAAG,UAAU,cAAc,UAAU,MAAM,CAAC,EAAE,EAAE,CAAC;AAAA,IACrF,CAAC;AACD,QAAI,EAAE,SAAS;AACb;AAAA,QACE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,QAAQ,KAAM,OAAO,SAAS,OAAO,GAAI;AAAA,QACjF;AAAA,MACF;AAAA,QACG,WAAU,EAAE,eAAe,MAAM,OAAO,kBAAkB;AAAA,EACjE;AACA,MAAI,EAAE,SAAS,mBAAmB,EAAE,aAAa,GAAG;AAClD,UAAM,KAAK,gBAAgB,KAAK,GAAG;AACnC,UAAM,CAAC,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtC,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,SAASA,MAAK;AAAA,QACd,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,EAAE;AAAA,MACX,CAAC;AAAA,MACD,MAAM,aAAa,aAAa;AAAA,QAC9B,GAAG;AAAA,QACH,SAASA,MAAK;AAAA,QACd,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,EAAE;AAAA,MACX,CAAC;AAAA,IACH,CAAC;AACD,cAAU,EAAE,YAAY,SAAS,EAAE,WAAW,QAAQ,OAAO,YAAY;AAAA,EAC3E;AACA,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,SAAS,MAAM,WAAW,UAAU;AAAA,IACpC,KAAK;AAAA,EACP;AACA,QAAM,CAAC,WAAW,KAAK,IACrB,EAAE,SAAS,kBACN,CAAC,MAAM,CAAC,IACT,MAAM,MAAM,aAAa,aAAa;AAAA,IACpC,GAAG;AAAA,IACH,cAAc;AAAA,IACd,MAAM,CAAC,SAAS,KAAK,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,CAAQ;AAAA,EACxD,CAAC;AACP,QAAM,cAAcG;AAAA,IAClBC;AAAA,MACE,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,QAAQ,CAAC;AAAA,MAC5D,CAAC,SAAS,KAAK,IAAI,KAAK,IAAI;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,cAAc,MAAM,MAAM,aAAa,aAAa;AAAA,IACxD,GAAG;AAAA,IACH,cAAc;AAAA,IACd,MAAM,CAAC,WAAW;AAAA,EACpB,CAAC;AACD,SAAO;AAAA,IACL,YAAY,YAAY,cAAc,QAAQ,IAAI,YAAY;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,OAAO,GAAG;AAAA,IAClD,UAAU;AAAA,MACR,IAAI,OAAO;AAAA,MACX,OAAO;AAAA,MACP,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IACA,SAAS;AAAA,MACP,IAAI,OAAO;AAAA,MACX,OAAO;AAAA,MACP,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK,IAAI,KAAK,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,kBACd,MACA,WACA,WACA;AACA,MAAI,KAAK,eAAe;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,MAAI,UAAU,SAAS,UAAU;AAC/B,cAAU,KAAK,eAAe,aAAa,6BAA6B;AACxE,WAAO,KAAK;AAAA,EACd;AACA,MAAI,UAAU,SAAS,YAAY;AACjC,cAAU,KAAK,eAAe,aAAa,KAAK,gBAAgB,GAAG,UAAU;AAC7E,UAAM,OAAO,UAAU,QAAQ;AAC/B,cAAU,SAAS,KAAK,OAAO,IAAI,KAAK,YAAY,OAAO,KAAK,KAAK,GAAG,MAAM;AAC9E,WAAO,KAAK;AAAA,EACd;AACA,MAAI,UAAU,SAAS,WAAW;AAChC;AAAA,MACE,KAAK,gBAAgB,KAAK,OAAO,KAAK,WAAW,KAAK;AAAA,MACtD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACA,QAAM,IAAI,yBAAyB,QAAQ,oCAAoC;AACjF;;;AD3XO,SAAS,yBACd,cACA,cACA,OACA;AACA,QAAM,UAA6B,EAAE,cAAc,YAAY,MAAM,WAAW;AAChF,QAAM,QAAQ,+BAA+B;AAC7C,QAAM,WAAW,oBAAI,QAAgC;AACrD,QAAM,OAAO,oBAAI,IAAoC;AACrD,QAAM,aAAa,oBAAI,QAAmC;AAC1D,QAAM,YAAY,oBAAI,QAAmC;AACzD,QAAM,UAAU,MACd;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN,CAAC,UAAU,WACT,IAAI,kCAAkC,kBAAkB,UAAU,MAAM;AAAA,EAC5E;AAEF,iBAAe,SAAS,SAAmC,aAAqC;AAC9F,QAAI;AAEF,YAAM,SAAS,MAAM,aAAa,KAAK,EAAE,GAAG,SAAS,aAAa,OAAO,MAAM,CAAC;AAEhF,UACE,QAAQ,KAAK,WAAW,YAAY,KACpC,OAAO,QACP,OAAO,SAAS,QAChB,OAAO,OAAO,IAAI,MAAM;AAExB,cAAM,IAAI,yBAAyB,WAAW,mCAAmC;AAAA,IACrF,SAAS,OAAO;AACd,YAAM,IAAI,uBAAuB,YAAY,KAAK;AAAA,IACpD;AAAA,EACF;AAEA,iBAAe,kBAAkB,SAAkD;AACjF,QAAI,QAAQ,QAAQ,UAAa,QAAQ,iBAAiB,OAAW;AACrE,UAAM,UAAU,MAAM,aAAa,WAAW,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAC1E,QAAI,UAAU,QAAQ,QAAQ,QAAQ,MAAM,QAAQ;AAClD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,EACJ;AAEA,iBAAe,MACb,OACA,WACe;AACf,UAAM,CAAC,QAAQ,UAAU,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpD,aAAa,SAAS,EAAE,UAAU,SAAS,CAAC;AAAA,MAC5C,aAAa,SAAS,EAAE,aAAa,MAAM,YAAY,CAAC;AAAA,MACxD,aAAa,WAAW;AAAA,IAC1B,CAAC;AACD,QAAI,YAAY,MAAM;AACpB,YAAM,IAAI,kCAAkC,wBAAwB,MAAM,SAAS,OAAO;AAC5F,QAAI,SAAS,SAAS,MAAM;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AACF,QAAI,OAAO,YAAY,MAAM,aAAa,OAAO,YAAY;AAC3D,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,EACJ;AAEA,iBAAe,QAAQ,QAAgC,QAA+B;AACpF,UAAM,SAAS,MAAM,uBAAuB,SAAS,QAAQ,MAAM;AACnE,aAAS,IAAI,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,iBAAe,QAAQ,OAWgB;AACrC,UAAM,MAAM,aAAa,SAAS,MAAM,GAAG;AAC3C,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,MAAM,QAAS,OAAM,MAAM,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK,SAAS;AAChF,QAAI;AACJ,UAAM,WAAW,MAAM,mBAAmB,SAAS,CAAC,GAAG,OAAO,UAAU;AACtE,UAAI,CAAC,MAAM;AACT,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,MAAM,WAAW,sBAAsB,MAAM,WAAW;AAAA,QAC1D;AACF,UAAI,UAAoC;AAAA,QACtC,SAAS,KAAK;AAAA,QACd,IAAI,MAAM,UAAU,IAAI;AAAA,QACxB,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM,WAAW,YAAa,MAAM,SAAS,KAAK,eAAe,KAAM;AAAA,QAC9E,SAAS,MAAM;AAAA,MACjB;AACA,UAAI,MAAM,YAAY;AACpB,cAAM,EAAE,QAAQ,UAAU,IAAI,MAAM;AACpC,cAAM,OAAO,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,UAAU,SAAS,aAAa,UAAU,OAAO;AAAA,QACnD;AACA,kBAAU,EAAE,GAAG,SAAS,GAAG,kBAAkB,MAAM,WAAW,MAAM,MAAM,SAAS,EAAE;AACrF,4BAAoB;AAAA,UAClB;AAAA,UACA;AAAA,UACA,QAAQ,KAAK,OAAO;AAAA,UACpB,aAAa,KAAK;AAAA,QACpB;AAAA,MACF;AACA,UAAI,MAAM,WAAW,aAAa,MAAM,SAAS;AAC/C,cAAM,SAAS,MAAM,qBAAqB,SAAS;AAAA,UACjD;AAAA,UACA,OAAO,KAAK;AAAA,UACZ,SAAS,MAAM,QAAQ,KAAK;AAAA,UAC5B,SAAS,MAAM,QAAQ,KAAK;AAAA,UAC5B,GAAG,MAAM;AAAA,QACX,CAAC;AACD,YAAI,OAAO,KAAK,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,qBAAqB,MAAM,aAAa;AACpF,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,MACJ;AACA,YAAM,SAAS,SAAS,MAAM,MAAM,WAAW;AAC/C,UAAIC,iBAAe,IAAI,WAAWC,YAAW,GAAG;AAC9C,cAAM,OAAO,MAAM,aAAa,mBAAmB,EAAE,OAAO,QAAW,MAAM,UAAU,CAAC;AACxF,cAAM,eAAe,MAAM,aAAa,YAAY,EAAE,GAAG,SAAS,GAAG,KAAK,CAAC;AAC3E,kBAAU,EAAE,GAAG,SAAS,GAAG,MAAM,MAAM,eAAe,OAAO,OAAO,KAAK;AACzE,cAAM,kBAAkB,OAAO;AAAA,MACjC;AACA,aAAO;AAAA,IACT,CAAC;AACD,UAAM,QAAQ,MAAM,QAAQ;AAC5B,QAAI,CAACD,iBAAe,KAAK,SAAS,MAAM,OAAO;AAC7C,YAAM,IAAI,yBAAyB,WAAW,4CAA4C;AAC5F,UAAM,YACJ,MAAM,SAAS,KAAK,aAAa,OAAO,SAAS,MAAM,WAAW,MAAM,eAAe;AACzF,UAAM,kBAAkB,eAAe;AAAA,MACrC,QAAQ,MAAM;AAAA,MACd,GAAI,oBAAoB,EAAE,YAAY,kBAAkB,IAAI,CAAC;AAAA,MAC7D;AAAA,MACA,SAAS,MAAM;AAAA,MACf,OAAO,SAAS;AAAA,MAChB;AAAA,MACA,OAAO,MAAM,SAAS,KAAK;AAAA,MAC3B,WAAW,MAAM,WAAW,aAAa,MAAM,WAAW,YAAY,KAAK,UAAU,MAAM;AAAA,IAC7F,CAAC;AACD,WAAO,MAAM,OAAO,SAAS,MAAM,MAAM,WAAW,MAAM,eAAe;AAAA,EAC3E;AAEA,WAAS,eAAe,OAA+B,QAAgC;AACrF,QAAI,CAAC,SAAS,IAAI,KAAK,KAAK,MAAM,KAAK,WAAW;AAChD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACF,WAAO,MAAM;AAAA,EACf;AAEA,iBAAe,gBACb,cACA,IACA,WACA;AACA,UAAM,IAAI,eAAe,cAAc,UAAU;AACjD,cAAU,SAAS,EAAE,KAAK,EAAE;AAC5B,QAAI,cAAc,OAAW,UAAS,SAAS;AAC/C,UAAM,OAAO;AAAA,MACX,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AACA,WAAO,QAAQ;AAAA,MACb,QAAQ,cAAc,SAAY,aAAa;AAAA,MAC/C,KAAK,EAAE;AAAA,MACP;AAAA,MACA,SAAS,EAAE;AAAA,MACX,SAAS;AAAA,MACT,MACE,cAAc,SACVE,oBAAmB,EAAE,KAAK,eAAe,cAAc,YAAY,KAAK,CAAC,IACzEA,oBAAmB;AAAA,QACjB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,GAAG,MAAM,SAAS;AAAA,MAC3B,CAAC;AAAA,IACT,CAAC;AAAA,EACH;AAEA,iBAAe,KAAK,UAAmD;AACrE,QAAI,CAAC,YAAY,OAAO,aAAa,YAAY,CAAC,MAAM,IAAI,QAAQ;AAClE,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACF,QAAI,WAAW,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ;AACpD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACF,UAAM,UAAU,MAAM,aAAuC,QAAQ;AACrE,QAAI,CAAC,WAAW,CAAC;AACf,YAAM,IAAI,yBAAyB,UAAU,uBAAuB;AACtE,eAAW,IAAI,QAAQ;AACvB,QAAI;AACF,YAAM,OAAO,MAAM,QAAQ;AAC3B,UAAI,CAACF,iBAAe,KAAK,SAAS,QAAQ,OAAO;AAC/C,cAAM,IAAI,yBAAyB,WAAW,wCAAwC;AACxF,YAAM,MAAM,SAAS,QAAQ,OAAO,SAAS,QAAQ,SAAS;AAC9D,YAAM,mBAAmB,SAAS,CAAC,GAAG,OAAO,UAAU;AACrD,cAAM,aAAa,SAAS,QAAQ;AACpC,YAAI,YAAY;AACd,gBAAM,YAAY,WAAW;AAC7B,gBAAM,OAAO,MAAM;AAAA,YACjB;AAAA,YACA,WAAW;AAAA,YACX,KAAK;AAAA,YACL,UAAU,SAAS,aAAa,UAAU,OAAO;AAAA,UACnD;AACA,gBAAM,YAAY,kBAAkB,MAAM,WAAW,MAAM,MAAM,SAAS;AAC1E,cACE,CAACA,iBAAe,UAAU,IAAI,QAAQ,EAAE,KACxC,UAAU,SAAS,QAAQ,QAC3B,KAAK,gBAAgB,WAAW;AAEhC,kBAAM,IAAI;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,QACJ;AACE,gBAAM;AAAA,YACJ;AAAA,YACA,SAAS,QAAQ;AAAA,YACjB,SAAS,QAAQ,WAAW,sBAC1B,SAAS,QAAQ,WAAW;AAAA,UAChC;AAAA,MACJ,CAAC;AACD,YAAM,SAAS,OAAO;AACtB,YAAM,eAAe,MAAM,QAAQ;AACnC,UAAI,CAACA,iBAAe,aAAa,SAAS,QAAQ,OAAO;AACvD,cAAM,IAAI,yBAAyB,WAAW,wCAAwC;AACxF,YAAM,MAAM,SAAS,QAAQ,OAAO,SAAS,QAAQ,SAAS;AAC9D,YAAM,kBAAkB,OAAO;AAC/B,UAAI;AACJ,UAAI;AACF,eAAO,MAAM,aAAa,gBAAgB;AAAA,UACxC,GAAG;AAAA,UACH,SAAS;AAAA,UACT,OAAO,aAAa,SAAS;AAAA,QAC/B,CAAC;AAAA,MACH,SAAS,OAAO;AACd,cAAM,IAAI,uBAAuB,QAAQ,KAAK;AAAA,MAChD;AACA,WAAK,IAAI,MAAM,QAAQ;AACvB,gBAAU,IAAI,QAAQ;AACtB,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,OAAO,QAAQ;AAAA,IAC5B;AAAA,EACF;AAEA,iBAAe,mBACb,MACA,UAAyC,CAAC,GACR;AAClC,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACF,QAAK,MAAM,aAAa,WAAW,MAAO,MAAM;AAC9C,YAAM,IAAI,yBAAyB,WAAW,yCAAyC;AACzF,QAAI;AACF,UAAI;AACJ,YAAM,UAAU,MAAM,aAAa,0BAA0B;AAAA,QAC3D;AAAA,QACA,eAAe,MAAM;AAAA,QACrB,SAAS,QAAQ;AAAA,QACjB,YAAY,CAAC,EAAE,QAAQ,YAAY,MAAM;AACvC,cAAI,WAAW;AACb,0BAAc,IAAI,+BAA+B,MAAM,YAAY,MAAM,MAAM;AAAA,QACnF;AAAA,MACF,CAAC;AACD,UAAI,YAAa,OAAM;AACvB,YAAM,SAAS,6BAA6B,OAAO;AACnD,YAAM,mBAA4C,CAAC;AACnD,YAAM,aAAa,SAAS,QAAQ;AACpC,UAAI,QAAQ,WAAW,aAAa,YAAY;AAC9C,cAAM,WAAW;AAAA,UACf,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AACA,mBAAW,OAAO,QAAQ,MAAM;AAC9B,gBAAM,cAAcA,iBAAe,IAAI,SAAS,MAAM,WAAW,UAAU,OAAO;AAClF,cAAI,CAAC,eAAe,CAACA,iBAAe,IAAI,SAAS,WAAW,MAAM,EAAG;AACrE,cAAI;AACF,kBAAM,UAAU,eAAe;AAAA,cAC7B,KAAK;AAAA,cACL,MAAM,IAAI;AAAA,cACV,QAAQ,IAAI;AAAA,cACZ,QAAQ;AAAA,YACV,CAAC;AACD,kBAAM,OAAO,OAAO,YAAY,OAAO,QAAQ,QAAQ,QAAQ,CAAC,CAAC,CAAC;AAClE,gBAAI,eAAe,KAAK,gBAAgB,WAAW,YAAa;AAChE,gBAAI,CAAC,eAAe,WAAW,UAAU,SAAS,WAAY;AAC9D,6BAAiB,KAAK,EAAE,SAAS,IAAI,SAAS,WAAW,QAAQ,WAAW,KAAK,CAAC;AAAA,UACpF,QAAQ;AAAA,UAER;AAAA,QACF;AACA,YAAI,WAAW,UAAU,SAAS,UAAU;AAC1C,gBAAM,YACJ,WAAW,UAAU,SAAS,aAAa,uBAAuB;AACpE,cACE,CAAC,iBAAiB;AAAA,YAChB,CAAC,UACC,MAAM,cAAc,aACpBA,iBAAe,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO;AAAA,UACpE;AAEA,kBAAM,IAAI;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,QACJ;AAAA,MACF;AACA,YAAM,SAAiC,CAAC;AACxC,YAAM,cAAkC,CAAC;AACzC,UAAI,QAAQ,WAAW;AACrB,mBAAW,OAAO,QAAQ,MAAM;AAC9B,cAAI,CAACA,iBAAe,IAAI,SAAS,SAAS,QAAQ,IAAI,KAAK,EAAG;AAC9D,cAAI;AACF,kBAAM,UAAU,eAAe;AAAA,cAC7B,KAAK;AAAA,cACL,MAAM,IAAI;AAAA,cACV,QAAQ,IAAI;AAAA,cACZ,QAAQ;AAAA,YACV,CAAC;AACD,kBAAM,WAAW,SAAS;AAC1B,gBAAI,QAAQ,cAAc,YAAY;AACpC,oBAAM,IAAI,QAAQ;AAClB,mBACG,SAAS,WAAW,oBACnB,SAAS,WAAW,yBACtB,EAAE,OAAO,SAAS,WAClBA,iBAAe,EAAE,MAAM,SAAS,KAAK,KACrCA,iBAAe,EAAE,IAAI,SAAS,SAAS,KACvCA,iBAAe,EAAE,QAAQ,SAAS,QAAQ,OAAO;AAEjD,4BAAY,KAAK;AAAA,kBACf,WAAW;AAAA,kBACX,QAAQ,EAAE;AAAA,kBACV,MAAM,EAAE;AAAA,kBACR,IAAI,EAAE;AAAA,kBACN,SAAS,EAAE;AAAA,kBACX,QAAQ,EAAE;AAAA,gBACZ,CAAC;AACH;AAAA,YACF;AACA,gBAAI,QAAQ,cAAc,YAAY;AACpC,oBAAM,IAAI,QAAQ;AAClB,kBACE,SAAS,WAAW,mBACpB,EAAE,OAAO,SAAS,WAClBA,iBAAe,EAAE,OAAO,SAAS,KAAK,KACtCA,iBAAe,EAAE,SAAS,SAAS,SAAS;AAE5C,4BAAY,KAAK;AAAA,kBACf,WAAW;AAAA,kBACX,OAAO,EAAE;AAAA,kBACT,SAAS,EAAE;AAAA,kBACX,SAAS,EAAE;AAAA,kBACX,QAAQ,EAAE;AAAA,gBACZ,CAAC;AACH;AAAA,YACF;AACA,gBAAI,QAAQ,cAAc,iBAAiB,QAAQ,cAAc,oBAAoB;AACnF,oBAAM,IAAI,QAAQ;AAClB,kBACEA,iBAAe,EAAE,OAAO,SAAS,KAAK,KACtCA,iBAAe,EAAE,UAAU,SAAS,SAAS,GAC7C;AACA,oBAAI,QAAQ,cAAc,iBAAiB,SAAS,WAAW;AAC7D,8BAAY,KAAK,EAAE,WAAW,eAAe,GAAG,QAAQ,KAAK,CAAC;AAChE,oBACE,QAAQ,cAAc,sBACtB,SAAS,WAAW,sBACpB,QAAQ,KAAK,YAAY,SAAS;AAElC,8BAAY,KAAK,EAAE,WAAW,oBAAoB,GAAG,QAAQ,KAAK,CAAC;AAAA,cACvE;AACA;AAAA,YACF;AACA,gBACE,QAAQ,cAAc,eACtB,QAAQ,cAAc,eACtB,QAAQ,cAAc;AAEtB;AACF,kBAAM,OAAO,QAAQ;AACrB,kBAAM,KAAK,QAAQ,OAAO,KAAK,KAAK,KAAK;AACzC,gBACE,CAACA,iBAAe,KAAK,OAAO,SAAS,QAAQ,KAAK,KAClD,KAAK,YAAY,SAAS,QAAQ,WAClC,CAACA,iBAAe,IAAI,SAAS,QAAQ,SAAS;AAE9C;AACF,mBAAO,KAAK;AAAA,cACV,WAAW,QAAQ;AAAA,cACnB,OAAO,KAAK;AAAA,cACZ,SAAS,KAAK;AAAA,cACd,SAAS,KAAK;AAAA,cACd,SAAS,KAAK;AAAA,cACd,WAAW,eAAe,OAAO,KAAK,YAAY;AAAA,cAClD;AAAA,YACF,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AAAA,QACF;AACF,YAAM,gBACJ,SAAS,QAAQ,WAAW,YACxB,cACA,SAAS,QAAQ,WAAW,cAAc,SAAS,QAAQ,WAAW,qBACpE,cACA;AACR,UACE,QAAQ,WAAW,aACnB,iBACA,CAAC,OAAO,KAAK,CAAC,UAAU,MAAM,cAAc,aAAa;AAEzD,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,UACE,QAAQ,WAAW,aACnB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,SAAS,QAAQ,MAAM,KAClC,YAAY,WAAW;AAEvB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,QAAQ,QAAQ,WAAW,YAAY,cAAc;AAAA,QACrD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,+BAAgC,OAAM;AAC3D,YAAM,IAAI,uBAAuB,WAAW,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,WAAS,WAAW,QAAgC;AAClD,UAAM,MAAM,aAAa,SAAS,OAAO,GAAG;AAC5C,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB,GAAG;AAAA,QACnB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,WAAS,eAAe,OAAiE;AACvF,UAAM,SAAS,eAAe,KAAK;AACnC,UAAM,EAAE,KAAK,QAAQ,IAAI,WAAW,MAAM;AAC1C,cAAU,SAAS,KAAK,OAAO,EAAE;AACjC,qBAAiB,OAAO,QAAQ,UAAU,GAAG;AAC7C,QAAI,OAAO,WAAW;AACpB,YAAM,IAAI,yBAAyB,UAAU,yCAAyC;AACxF,QAAI,OAAO,MAAO,qBAAoB,OAAO,OAAO,OAAO;AAC3D,WAAO,QAAQ;AAAA,MACb,QAAQ,OAAO,QAAQ,uBAAuB;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,IAAI,OAAO;AAAA,MACX,iBAAiB,OAAO;AAAA,MACxB,MAAM,OAAO,QACTE,oBAAmB;AAAA,QACjB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO,OAAO,IAAI,SAAS,OAAO,MAAM;AAAA,MACxD,CAAC,IACDA,oBAAmB;AAAA,QACjB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,IAAI,SAAS,OAAO,MAAM;AAAA,MAC1C,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,4BAA4B,CAC1B,OACA,OACA,UAAsC,CAAC,MACpC;AACH,YAAM,SAAS,eAAe,KAAK;AACnC,aAAO;AAAA,QAAmB;AAAA,QAAS,CAAC;AAAA,QAAG,CAAC,UACtC,0BAA0B,OAAO,QAAQ,OAAO,QAAQ,IAAI;AAAA,MAC9D;AAAA,IACF;AAAA,IACA,mBAAmB,OACjB,OACA,UAGI,CAAC,MACF;AACH,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,YAAY,eAAe,QAAQ,aAAa,EAAE,MAAM,SAAkB,CAAC;AACjF,YAAM,OAAO,uBAAuB,SAAS,MAAM;AACnD,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR,KAAK,KAAK;AAAA,QACV,IAAI,KAAK;AAAA,QACT,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK;AAAA,QACX,SAAS;AAAA,QACT,iBAAiB,QAAQ;AAAA,QACzB,YAAY,EAAE,QAAQ,UAAU;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,CAAC,WAAkC,QAAQ,WAAW,MAAM;AAAA,IAC5E,iBAAiB,CAAC,WAAkC,QAAQ,YAAY,MAAM;AAAA,IAC9E,gBAAgB,CAAC,WACf,qBAAqB,SAAS,MAAM;AAAA,IACtC,iBAAiB,OAAO,UAAgC;AACtD,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,MAAM,aAAa,SAAS,OAAO,GAAG;AAC5C,UAAI,OAAO,aAAa,KAAK,OAAO,aAAa;AAC/C,cAAM,IAAI,yBAAyB,YAAY,yBAAyB;AAC1E,UAAI,OAAO,aAAa,KAAKF,iBAAe,IAAI,WAAWC,YAAW;AACpE,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,uBAAiB,OAAO,QAAQ,UAAU,GAAG;AAC7C,YAAM,OAAO,MAAM,QAAQ;AAC3B,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA,IAAI,KAAK;AAAA,QACT,QAAQ,OAAO,aAAa,IAAI,IAAI,YAAY,IAAI;AAAA,QACpD,SAAS;AAAA,QACT,iBAAiB,OAAO;AAAA,QACxB,MAAMC,oBAAmB;AAAA,UACvB,KAAKC;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,IAAI,OAAO,OAAO,MAAM;AAAA,QACjC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,OAAO,UAAkC;AACvD,YAAM,IAAI,eAAe,OAAO,SAAS;AACzC,YAAM,OAAO,MAAM,QAAQ;AAC3B,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR,KAAK,EAAE;AAAA,QACP,IAAI,KAAK;AAAA,QACT,SAAS,EAAE;AAAA,QACX,SAAS;AAAA,QACT,MAAMD,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;AAAA,QACrF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,iBAAiB,CAAC,OAA+B,OAAgB,gBAAgB,OAAO,EAAE;AAAA,IAC1F,yBAAyB,CAAC,OAA+B,IAAa,cACpE,gBAAgB,OAAO,IAAI,SAAS;AAAA,IACtC,cAAc,CAAC,UAA6B;AAC1C,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,MAAM,aAAa,SAAS,OAAO,GAAG;AAC5C,gBAAU,SAAS,KAAK,OAAO,EAAE;AACjC,eAAS,OAAO,SAAS;AACzB,YAAM,UAAU;AAAA,QACd,gBAAgB,GAAG;AAAA,QACnB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AACA,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA,IAAI,OAAO;AAAA,QACX;AAAA,QACA,iBAAiB,OAAO;AAAA,QACxB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,KAAK,OAAO,WAAW,OAAO,WAAW,OAAO,IAAI,OAAO,SAAS;AAAA,QAC7E,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,uBAAuB,CAAC,WACtB,eAAe,EAAE,GAAG,QAAQ,OAAO,OAAU,CAAC;AAAA,IAChD,2BAA2B,CACzB,WACG;AACH,0BAAoB,OAAO,OAAO,OAAO;AACzC,aAAO,eAAe,MAAM;AAAA,IAC9B;AAAA,IACA,sBAAsB,CACpB,UACG;AACH,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,EAAE,KAAK,QAAQ,IAAI,WAAW,MAAM;AAC1C,0BAAoB,OAAO,SAAS,SAAS;AAC7C,uBAAiB,OAAO,QAAQ,WAAW;AAC3C,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,IAAI,OAAO;AAAA,QACX,iBAAiB,OAAO;AAAA,QACxB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,OAAO,SAAS,SAAS,OAAO,MAAM;AAAA,QAC/C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,yBAAyB,CAAC,UAKpB;AACJ,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,MAAM,aAAa,SAAS,OAAO,GAAG;AAC5C,0BAAoB,OAAO,UAAU,UAAU;AAC/C,UAAI,OAAO,OAAO,aAAa;AAC7B,cAAM,IAAI,yBAAyB,YAAY,qBAAqB;AACtE,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA,SAAS;AAAA,QACT,IAAI,OAAO;AAAA,QACX,iBAAiB,OAAO;AAAA,QACxB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ;AAAA,QACzC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,yBAAyB,CACvB,UACG;AACH,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,EAAE,KAAK,QAAQ,IAAI,WAAW,MAAM;AAC1C,0BAAoB,OAAO,UAAU,UAAU;AAC/C,UAAI,OAAO,OAAO,aAAa;AAC7B,cAAM,IAAI,yBAAyB,YAAY,qBAAqB;AACtE,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,IAAI,OAAO;AAAA,QACX,iBAAiB,OAAO;AAAA,QACxB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,SAAS,OAAO,UAAU,OAAO,QAAQ;AAAA,QAClD,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,qBAAqB,CAAC,UAA2D;AAC/E,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,EAAE,KAAK,QAAQ,IAAI,WAAW,MAAM;AAC1C,0BAAoB,OAAO,OAAO,OAAO;AACzC,gBAAU,SAAS,KAAK,OAAO,EAAE;AACjC,eAAS,OAAO,SAAS;AACzB,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,IAAI,OAAO;AAAA,QACX,iBAAiB,OAAO;AAAA,QACxB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM;AAAA,YACJ;AAAA,YACA,OAAO;AAAA,YACP,OAAO;AAAA,YACP,OAAO;AAAA,YACP,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AG/xBA,SAAS,kBAAAE,kBAAgB,aAAAC,kBAAoC;AAc7D,SAAS,YAAY,OAAe,UAAmB,QAAuB;AAC5E,MAAI,aAAa,OAAQ,OAAM,IAAI,kCAAkC,OAAO,UAAU,MAAM;AAC9F;AAGA,eAAsB,uBACpB,cACA,OACA,UAA6C,CAAC,GACP;AACvC,QAAM,aAAa,uBAAuB,KAAK;AAC/C,MAAI;AACF,gBAAY,WAAW,WAAW,SAAS,MAAM,aAAa,WAAW,CAAC;AAC1E,UAAM,QAAQ,MAAM,aAAa;AAAA,MAC/B,QAAQ,gBAAgB,SACpB,EAAE,UAAU,SAAS,IACrB,EAAE,aAAa,QAAQ,YAAY;AAAA,IACzC;AACA,QAAI,MAAM,WAAW,QAAQ,MAAM,SAAS,MAAM;AAChD,YAAM,IAAI,kCAAkC,SAAS,eAAe,KAAK;AAAA,IAC3E;AACA,UAAM,cAAc,MAAM;AAC1B,UAAM,YAAY;AAAA,MAChB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,GAAI,WAAW,SAAS,CAAC,WAAW,MAAM,IAAI,CAAC;AAAA,MAC/C,GAAI,WAAW,iBAAiB,SAAS,eACrC,CAAC,WAAW,gBAAgB,QAAQ,IACpC,CAAC;AAAA,MACL,GAAG,WAAW,MAAM,QAAQ,CAACC,UAAS;AAAA,QACpCA;AAAA,QACAA,MAAK;AAAA,QACL,GAAIA,MAAK,WAAW,CAACA,MAAK,QAAQ,IAAI,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAEA,eAAWC,aAAY,WAAW;AAChC,YAAM,OAAO,MAAM,aAAa,QAAQ,EAAE,SAASA,UAAS,SAAS,YAAY,CAAC;AAClF,UAAI,CAAC,QAAQ,SAAS,MAAM;AAC1B,cAAM,IAAI,kCAAkCA,UAAS,SAAS,iBAAiB,IAAI;AAAA,MACrF;AACA,kBAAYA,UAAS,SAASA,UAAS,gBAAgB,YAAY,GAAGC,WAAU,IAAI,CAAC;AAAA,IACvF;AACA,UAAM,gBAAgB,CAAC,OAAe,UAAyB,WAA0B;AACvF,UAAI,CAACC,iBAAe,UAAU,MAAM,GAAG;AACrC,cAAM,IAAI,kCAAkC,OAAO,UAAU,MAAM;AAAA,MACrE;AAAA,IACF;AACA,QAAI,WAAW,iBAAiB,SAAS,cAAc;AACrD;AAAA,QACE;AAAA,QACA,WAAW,YAAY;AAAA,QACvB,MAAM,aAAa,aAAa;AAAA,UAC9B,SAAS,WAAW,gBAAgB,SAAS;AAAA,UAC7C,KAAK;AAAA,UACL,cAAc;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA;AAAA,MACE;AAAA,MACA,WAAW,UAAU;AAAA,MACrB,MAAM,aAAa,aAAa;AAAA,QAC9B,SAAS,WAAW,SAAS;AAAA,QAC7B,KAAK;AAAA,QACL,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM,SAAS;AAAA,QACb,SAAS,WAAW,OAAO;AAAA,QAC3B,KAAK;AAAA,QACL;AAAA,MACF;AACA;AAAA,QACE;AAAA,QACA,WAAW,SAAS;AAAA,QACpB,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,WAAW,CAAC;AAAA,MACzE;AACA;AAAA,QACE;AAAA,QACA,WAAW,UAAU;AAAA,QACrB,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,YAAY,CAAC;AAAA,MAC1E;AAAA,IACF;AACA,eAAWH,SAAQ,WAAW,OAAO;AACnC,YAAM,SAAS,EAAE,SAASA,MAAK,SAAS,KAAK,eAAe,YAAY;AACxE;AAAA,QACE,GAAGA,MAAK,OAAO;AAAA,QACf,WAAW,YAAY;AAAA,QACvB,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,cAAc,CAAC;AAAA,MAC5E;AACA;AAAA,QACE,GAAGA,MAAK,OAAO;AAAA,QACf,WAAW,UAAU;AAAA,QACrB,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,YAAY,CAAC;AAAA,MAC1E;AACA;AAAA,QACE,GAAGA,MAAK,OAAO;AAAA,QACfA,MAAK,eAAe;AAAA,QACpB,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,iBAAiB,CAAC;AAAA,MAC/E;AACA;AAAA,QACE,GAAGA,MAAK,OAAO;AAAA,QACfA,MAAK;AAAA,QACL,MAAM,aAAa,aAAa;AAAA,UAC9B,SAASA,MAAK,eAAe;AAAA,UAC7B,KAAK;AAAA,UACL,cAAc;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,QACE,GAAGA,MAAK,OAAO;AAAA,QACf;AAAA,QACA,MAAM,aAAa,aAAa,EAAE,GAAG,QAAQ,cAAc,wBAAwB,CAAC;AAAA,MACtF;AACA,UAAIA,MAAK,UAAU;AACjB;AAAA,UACE,GAAGA,MAAK,OAAO;AAAA,UACfA,MAAK,SAAS;AAAA,UACd,MAAM,aAAa,aAAa;AAAA,YAC9B,SAASA,MAAK;AAAA,YACd,KAAK;AAAA,YACL,cAAc;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,UACE,GAAGA,MAAK,OAAO;AAAA,UACfA,MAAK;AAAA,UACL,MAAM,aAAa,aAAa;AAAA,YAC9B,SAASA,MAAK,SAAS;AAAA,YACvB,KAAK;AAAA,YACL,cAAc;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,WAAW,QAAQ;AACrB;AAAA,UACE,GAAGA,MAAK,OAAO;AAAA,UACfA,MAAK,SAAS,aAAa,IAAI;AAAA,UAC/B,MAAM,aAAa,aAAa;AAAA,YAC9B,SAAS,WAAW,OAAO;AAAA,YAC3B,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAACA,MAAK,OAAO;AAAA,YACnB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,MAAM,aAAa,SAAS,EAAE,YAAY,CAAC;AAC9D,gBAAY,aAAa,MAAM,MAAM,WAAW,IAAI;AACpD,WAAO,OAAO,OAAO;AAAA,MACnB,SAAS,WAAW;AAAA,MACpB,cAAc,WAAW;AAAA,MACzB;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,OAAO;AAAA,MACP,kBAAkB,UAAU;AAAA,IAC9B,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,iBAAiB,kCAAmC,OAAM;AAC9D,UAAM,IAAI,gBAAgB,KAAK;AAAA,EACjC;AACF;;;ACzJO,SAAS,mBAAmB,SAA8B;AAC/D,QAAM,QAAQ,kBAAkB,QAAQ,KAAK;AAC7C,QAAM,eAAe,QAAQ;AAC7B,MAAI,aAAa,SAAS,aAAa,MAAM,OAAO,MAAM,SAAS;AACjE,UAAM,IAAI,yBAAyB,sBAAsB,qCAAqC;AAAA,EAChG;AACA,QAAM,UAAU,EAAE,cAAc,YAAY,MAAM,WAAW;AAC7D,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,kBAAkB,CAAC,WACjB,uBAAuB,SAAS,MAAM;AAAA,IACxC,uBAAuB,CAAC,WACtB,4BAA4B,SAAS,MAAM;AAAA,IAC7C,gBAAgB,CAAC,WAAiC,qBAAqB,SAAS,MAAM;AAAA,IACtF,uBAAuB,CAAC,WACtB,4BAA4B,SAAS,MAAM;AAAA,IAC7C,GAAG,yBAAyB,cAAc,QAAQ,cAAc,KAAK;AAAA,IACrE,kBAAkB,CAAC,gBACjB,uBAAuB,cAAc,MAAM,YAAY,WAAW;AAAA,IACpE,SAAS,CAAC,QAAa,gBACrB,cAAc,SAAS,QAAQ,WAAW;AAAA,IAC5C,WAAW,CAAC,WAAmC,gBAAgB,SAAS,MAAM;AAAA,IAC9E,gBAAgB,CAAC,QAAa,gBAC5B,qBAAqB,SAAS,QAAQ,WAAW;AAAA,IACnD,iBAAiB,CAAC,QAAa,YAAqB,gBAClD,sBAAsB,SAAS,QAAQ,YAAY,WAAW;AAAA,IAChE,cAAc,CACZ,QACA,YACA,WACA,gBACG,mBAAmB,SAAS,QAAQ,YAAY,WAAW,WAAW;AAAA,IAC3E,YAAY,CAAC,QAAa,gBACxB,iBAAiB,SAAS,QAAQ,WAAW;AAAA,IAC/C,UAAU,CAAC,WAA8B,eAAe,SAAS,MAAM;AAAA,IACvE,aAAa,CAAC,WAAiC,kBAAkB,SAAS,MAAM;AAAA,IAChF,cAAc,CAAC,QAAa,gBAC1B,mBAAmB,SAAS,QAAQ,WAAW;AAAA,EACnD,CAAC;AACH;;;ACzCO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,KAAK;AAAA,MACH,WAAW;AAAA,MACX,WAAW;AAAA,MACX,KAAK;AAAA,MACL,aAAa;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,KAAK;AAAA,MACH,WAAW;AAAA,MACX,WAAW;AAAA,MACX,KAAK;AAAA,MACL,aAAa;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,KAAK;AAAA,MACH,WAAW;AAAA,MACX,WAAW;AAAA,MACX,KAAK;AAAA,MACL,aAAa;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":["getAddress","hook","isAddressEqual","keccak256","getAddress","isAddress","zeroAddress","isAddress","zeroAddress","getAddress","hook","isAddressEqual","contract","keccak256","getAddress","hook","encodeAbiParameters","isAddressEqual","keccak256","toHex","encodeAbiParameters","keccak256","keccak256","encodeAbiParameters","getAddress","isAddressEqual","hook","isAddressEqual","getAddress","hook","contract","isAddressEqual","keccak256","toHex","encodeAbiParameters","isAddressEqual","zeroAddress","isAddressEqual","hook","zeroAddress","hook","isAddressEqual","isAddressEqual","isAddressEqual","zeroAddress","isAddressEqual","zeroAddress","hook","isAddressEqual","zeroAddress","contract","isAddressEqual","zeroAddress","balance","encodeFunctionData","erc20Abi","isAddressEqual","zeroAddress","encodeAbiParameters","isAddressEqual","keccak256","zeroAddress","hook","isAddressEqual","zeroAddress","keccak256","encodeAbiParameters","isAddressEqual","zeroAddress","encodeFunctionData","erc20Abi","isAddressEqual","keccak256","hook","contract","keccak256","isAddressEqual"]}
|
package/docs/earnings.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# P4 实时收益、份额与代领
|
|
2
|
+
|
|
3
|
+
`estimateClaimableFees({hook,rangeId,owner,...block?})` 返回指定区块的完整净领取金额估算。结果基于该区块的账本和 PoolManager 状态,不保证未来交易执行时金额不变。暂停期间仍可估值,`paused` 会标记此时不能领取。
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
const market = createMarketClient({ publicClient, walletClient, chain });
|
|
7
|
+
const earnings = await market.estimateClaimableFees({ hook, rangeId, owner });
|
|
8
|
+
const auth = await market.getShareAuthorization({
|
|
9
|
+
hook, rangeId, owner, operator, ...earnings.block,
|
|
10
|
+
});
|
|
11
|
+
// token0 / token1 的数值都是各自 token 原始单位。
|
|
12
|
+
console.log(earnings.data.token0.claimable, earnings.data.token1.claimable);
|
|
13
|
+
// 展示 prepareClaim 的 request,确认后再 send 和 waitForTransaction。
|
|
14
|
+
const prepared = await market.prepareClaim({ key, tickLower, tickUpper, to: owner, maxFeeBps });
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`getFeeSnapshot` 返回可审查的完整输入;`calculateMarketClaimableFees(ledger)` 是同一套纯 bigint 算法。在线估算要求已审核的 Hook / ClaimFeePolicy / PoolManager 身份,以及显式 StateView 或 `uniswap-v4-v1` extsload 布局;缺少读取通道、区间 unset、settling、重组、份额与实际仓位流动性不符时均拒绝估算,不回退成零值。
|
|
18
|
+
|
|
19
|
+
## 估算模型
|
|
20
|
+
|
|
21
|
+
快照包含用户份额、已结算 owed、net checkpoint、Q128 remainder,区间 net accumulator、totalShares、collectionSeq、resetSeq,以及 PoolManager 仓位的 liquidity / last gross growth、Hook 返回的当前 gross growth。所有读取、代码身份与绑定检查固定到同一 blockNumber / blockHash。
|
|
22
|
+
|
|
23
|
+
PoolManager 仓位 owner 是 Hook,salt 为 bytes32(rangeId);positionId 使用 address / int24 / int24 / bytes32 的 packed 编码,不是 rangeId 的标准 ABI 编码。extsload 读取 pool mapping slot 6 下 positions offset 6 的三个槽位。StateView 使用 `getPositionInfo(poolId,positionId)`,核对其 PoolManager 绑定。
|
|
24
|
+
|
|
25
|
+
每个 token 依次计算:
|
|
26
|
+
|
|
27
|
+
1. `gross = floor(uint256(currentGrowth - lastGrowth) * totalShares / Q128)`。只有这一步的 v4 gross growth 做 uint256 模减法。
|
|
28
|
+
2. 使用 Hook 的 `effectiveClaimFee(rangeId)`,`cut = floor(gross * effectiveBps / 10000)`。直接采用链上历史策略,不用当前配置费率替代;合约会执行最多 32 条历史遍历及 all-time minimum 回退。快照同时提供 syncIndex、historyLength、currentBps、minimumBps 供核查。
|
|
29
|
+
3. `nextNetAccumulator = accumulator + floor((gross - cut) * Q128 / totalShares)`。totalShares=0 时不收集新收益,保留历史 owed 与用户 remainder。
|
|
30
|
+
4. `earned = floor((shares * (nextNetAccumulator - checkpoint) + remainder) / Q128)`;`claimable = owed + earned`,保留新的 Q128 余数。
|
|
31
|
+
|
|
32
|
+
返回的 token0 / token1 分别包含:
|
|
33
|
+
|
|
34
|
+
| 字段 | 含义 |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| settled | 已计入该用户 owed 的净额 |
|
|
37
|
+
| synchronized | Hook 已同步、用户尚未 checkpoint 的净收益,包含已有余数进位 |
|
|
38
|
+
| pending | 本次收集 PoolManager 收益后,该用户新增的整数原始单位 |
|
|
39
|
+
| claimable | settled + synchronized + pending |
|
|
40
|
+
| remainderX128 | 假设本次领取后保留的用户小数余数 |
|
|
41
|
+
| pendingRangeGross | 整个区间尚未收集的毛手续费,不能直接当作用户收益 |
|
|
42
|
+
| pendingRangeProtocolFee | 整个区间本次收集时扣除的分账金额 |
|
|
43
|
+
|
|
44
|
+
Hook 的净累加器、checkpoint 减法和 owed 加法按 Solidity checked arithmetic 校验;不对这些字段套用模运算。v4 毛费用转换到 int128、用户 owed 的 uint128 和累加器 uint256 边界同样检查。异常会拒绝结果,避免返回合约无法执行的“可领取金额”。
|
|
45
|
+
|
|
46
|
+
不缓存跨区块的 growth 基线。每次读取 PoolManager 真实仓位的 lastGrowth,因此清仓 / 重建时不会把旧 gross growth 混入新生命周期;resetSeq 保留在输出,方便上层使自己的缓存失效。零份额仍可有历史 owed,余数在领取、转移和清仓后继续归原持有人。
|
|
47
|
+
|
|
48
|
+
## 份额授权与代领授权
|
|
49
|
+
|
|
50
|
+
| 接口 | 作用域 |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| getShareAuthorization({hook,rangeId,owner,operator,...block?}) | 一次固定区块读取 shares、份额 allowance、全局份额 operator、独立区间 claim operator |
|
|
53
|
+
| getClaimOperator({hook,rangeId,owner,operator,...block?}) | 只读该区间的代领授权 |
|
|
54
|
+
| prepareApproveShares({key,tickLower,tickUpper,spender,amount}) | ERC-6909 单区间 allowance,完整替换额度;0 撤销,uint256 最大值按合约代表无限授权 |
|
|
55
|
+
| prepareSetShareOperator({key,operator,approved}) | 该 Hook 下所有区间的份额转移授权;不局限于传入 key 对应的池 |
|
|
56
|
+
| prepareTransferShares({key,tickLower,tickUpper,to,amount}) | 转移当前账户持有的份额 |
|
|
57
|
+
| prepareTransferSharesFrom({key,tickLower,tickUpper,owner,to,amount}) | 使用 owner 的份额 allowance / 全局份额 operator 执行转移 |
|
|
58
|
+
| prepareSetClaimOperator({key,tickLower,tickUpper,operator,approved}) | 单区间的手续费代领授权,false 撤销 |
|
|
59
|
+
| prepareClaimFeesFor({key,tickLower,tickUpper,owner,to,maxFeeBps}) | 为 owner 领取,份额授权不能替代本授权 |
|
|
60
|
+
|
|
61
|
+
所有 prepare 都复用 P3 的不可变请求、账户 / 链检查、模拟、显式 send 和 receipt 流程。份额路径要求 `liquidity: "verified"`;代领授权和代领交易还要求独立的 `claimOperator: "verified"`。配置能力不会被查询自动提升。原生币路径与跨变体资金验收仍在 P5。
|
|
62
|
+
|
|
63
|
+
份额转移会先同步区间并 checkpoint 双方:旧收益不会随份额转给新持有人。暂停时转移和领取失败,撤销 operator 授权仍可执行。代领 operator 可自行指定收款人和费率上限,UI 应明确展示此权限;它会跨份额转移、清仓和重建持续存在,撤仓不会自动撤销。
|
|
64
|
+
|
|
65
|
+
`waitForTransaction` 的 `events` 保留 Deposited / Withdrawn / FeesClaimed,新增 `shareEvents` 返回 Transfer / Approval / OperatorSet / ClaimOperatorSet。代领与 transferFrom 分开记录 signer 和 beneficiary/owner,按目标 Hook、owner、区间、接收方核对事件,避免把 operator 当作手续费所有者。
|
|
66
|
+
|
|
67
|
+
## 验收证据与边界
|
|
68
|
+
|
|
69
|
+
真实本地 Ramp / v4 EVM 测试完成多用户、份额转移前后、超过 32 条政策历史、历史低费率、小额手续费、Q128 余数、零份额 owed、清仓重建、代领授权与撤销、暂停撤销、StateView / extsload 对照。每次估算后在不插入其他状态变化的情况下领取,整数原始单位与实际余额 / FeesClaimed 事件 **差异为 0**,预测余数与链上 userFeeRemainder 也完全相等。
|
|
70
|
+
|
|
71
|
+
这是同状态账本算法的差分验收,不是未来领取金额保证;其他交易、费率历史或仓位操作会改变后续结果。用户给定的纯函数输入也不等同于已审核的链上快照。Arc 主网仍待可用 RPC 与部署身份核验,RampETH / RwaRamp 资金矩阵尚未在此阶段验收。
|