@ably/ai-transport 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +54 -47
  2. package/dist/ably-ai-transport.js +1006 -539
  3. package/dist/ably-ai-transport.js.map +1 -1
  4. package/dist/ably-ai-transport.umd.cjs +1 -1
  5. package/dist/ably-ai-transport.umd.cjs.map +1 -1
  6. package/dist/constants.d.ts +4 -0
  7. package/dist/core/codec/types.d.ts +19 -2
  8. package/dist/core/transport/decode-history.d.ts +8 -6
  9. package/dist/core/transport/headers.d.ts +4 -2
  10. package/dist/core/transport/index.d.ts +4 -1
  11. package/dist/core/transport/pipe-stream.d.ts +3 -2
  12. package/dist/core/transport/stream-router.d.ts +11 -1
  13. package/dist/core/transport/tree.d.ts +171 -0
  14. package/dist/core/transport/turn-manager.d.ts +4 -1
  15. package/dist/core/transport/types.d.ts +270 -119
  16. package/dist/core/transport/view.d.ts +166 -0
  17. package/dist/errors.d.ts +19 -2
  18. package/dist/index.d.ts +3 -1
  19. package/dist/react/ably-ai-transport-react.js +1019 -486
  20. package/dist/react/ably-ai-transport-react.js.map +1 -1
  21. package/dist/react/ably-ai-transport-react.umd.cjs +1 -1
  22. package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -1
  23. package/dist/react/contexts/transport-context.d.ts +31 -0
  24. package/dist/react/contexts/transport-provider.d.ts +49 -0
  25. package/dist/react/create-transport-hooks.d.ts +124 -0
  26. package/dist/react/index.d.ts +14 -8
  27. package/dist/react/use-ably-messages.d.ts +14 -8
  28. package/dist/react/use-active-turns.d.ts +7 -3
  29. package/dist/react/use-client-transport.d.ts +78 -5
  30. package/dist/react/use-create-view.d.ts +22 -0
  31. package/dist/react/use-tree.d.ts +20 -0
  32. package/dist/react/use-view.d.ts +79 -0
  33. package/dist/vercel/ably-ai-transport-vercel.js +1478 -842
  34. package/dist/vercel/ably-ai-transport-vercel.js.map +1 -1
  35. package/dist/vercel/ably-ai-transport-vercel.umd.cjs +1 -1
  36. package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -1
  37. package/dist/vercel/codec/tool-transitions.d.ts +50 -0
  38. package/dist/vercel/index.d.ts +3 -0
  39. package/dist/vercel/react/ably-ai-transport-vercel-react.js +9099 -852
  40. package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -1
  41. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +45 -1
  42. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -1
  43. package/dist/vercel/react/contexts/chat-transport-context.d.ts +32 -0
  44. package/dist/vercel/react/contexts/chat-transport-provider.d.ts +84 -0
  45. package/dist/vercel/react/index.d.ts +5 -0
  46. package/dist/vercel/react/use-chat-transport.d.ts +61 -20
  47. package/dist/vercel/react/use-message-sync.d.ts +41 -9
  48. package/dist/vercel/react/use-staged-add-tool-approval-response.d.ts +30 -0
  49. package/dist/vercel/tool-approvals.d.ts +124 -0
  50. package/dist/vercel/tool-events.d.ts +26 -0
  51. package/dist/vercel/transport/chat-transport.d.ts +33 -11
  52. package/dist/vercel/transport/index.d.ts +5 -2
  53. package/package.json +23 -17
  54. package/src/constants.ts +6 -0
  55. package/src/core/codec/encoder.ts +10 -1
  56. package/src/core/codec/types.ts +19 -3
  57. package/src/core/transport/client-transport.ts +382 -364
  58. package/src/core/transport/decode-history.ts +229 -81
  59. package/src/core/transport/headers.ts +6 -2
  60. package/src/core/transport/index.ts +13 -5
  61. package/src/core/transport/pipe-stream.ts +8 -5
  62. package/src/core/transport/server-transport.ts +212 -58
  63. package/src/core/transport/stream-router.ts +21 -3
  64. package/src/core/transport/{conversation-tree.ts → tree.ts} +192 -77
  65. package/src/core/transport/turn-manager.ts +28 -10
  66. package/src/core/transport/types.ts +318 -139
  67. package/src/core/transport/view.ts +840 -0
  68. package/src/errors.ts +21 -1
  69. package/src/index.ts +10 -5
  70. package/src/react/contexts/transport-context.ts +37 -0
  71. package/src/react/contexts/transport-provider.tsx +164 -0
  72. package/src/react/create-transport-hooks.ts +144 -0
  73. package/src/react/index.ts +15 -8
  74. package/src/react/use-ably-messages.ts +34 -16
  75. package/src/react/use-active-turns.ts +28 -17
  76. package/src/react/use-client-transport.ts +184 -24
  77. package/src/react/use-create-view.ts +68 -0
  78. package/src/react/use-tree.ts +53 -0
  79. package/src/react/use-view.ts +233 -0
  80. package/src/react/vite.config.ts +4 -1
  81. package/src/vercel/codec/accumulator.ts +64 -79
  82. package/src/vercel/codec/decoder.ts +11 -8
  83. package/src/vercel/codec/encoder.ts +68 -54
  84. package/src/vercel/codec/index.ts +0 -2
  85. package/src/vercel/codec/tool-transitions.ts +122 -0
  86. package/src/vercel/index.ts +17 -0
  87. package/src/vercel/react/contexts/chat-transport-context.ts +40 -0
  88. package/src/vercel/react/contexts/chat-transport-provider.tsx +122 -0
  89. package/src/vercel/react/index.ts +14 -0
  90. package/src/vercel/react/use-chat-transport.ts +164 -42
  91. package/src/vercel/react/use-message-sync.ts +77 -19
  92. package/src/vercel/react/use-staged-add-tool-approval-response.ts +87 -0
  93. package/src/vercel/react/vite.config.ts +4 -2
  94. package/src/vercel/tool-approvals.ts +380 -0
  95. package/src/vercel/tool-events.ts +53 -0
  96. package/src/vercel/transport/chat-transport.ts +225 -79
  97. package/src/vercel/transport/index.ts +14 -3
  98. package/dist/core/transport/conversation-tree.d.ts +0 -9
  99. package/dist/react/use-conversation-tree.d.ts +0 -20
  100. package/dist/react/use-edit.d.ts +0 -7
  101. package/dist/react/use-history.d.ts +0 -19
  102. package/dist/react/use-messages.d.ts +0 -7
  103. package/dist/react/use-regenerate.d.ts +0 -7
  104. package/dist/react/use-send.d.ts +0 -7
  105. package/src/react/use-conversation-tree.ts +0 -71
  106. package/src/react/use-edit.ts +0 -24
  107. package/src/react/use-history.ts +0 -111
  108. package/src/react/use-messages.ts +0 -32
  109. package/src/react/use-regenerate.ts +0 -24
  110. package/src/react/use-send.ts +0 -25
@@ -1 +1 @@
1
- {"version":3,"file":"ably-ai-transport-vercel-react.js","names":[],"sources":["../../../src/errors.ts","../../../src/vercel/transport/chat-transport.ts","../../../src/constants.ts","../../../src/event-emitter.ts","../../../src/logger.ts","../../../src/utils.ts","../../../src/core/transport/conversation-tree.ts","../../../src/core/transport/decode-history.ts","../../../src/core/transport/headers.ts","../../../src/core/transport/stream-router.ts","../../../src/core/transport/client-transport.ts","../../../src/vercel/codec/accumulator.ts","../../../src/core/codec/decoder.ts","../../../src/core/codec/lifecycle-tracker.ts","../../../src/vercel/codec/decoder.ts","../../../src/core/codec/encoder.ts","../../../src/vercel/codec/encoder.ts","../../../src/vercel/codec/index.ts","../../../src/vercel/transport/index.ts","../../../src/vercel/react/use-chat-transport.ts","../../../src/vercel/react/use-message-sync.ts"],"sourcesContent":["import * as Ably from 'ably';\n\n/**\n * Error codes for the AI Transport SDK.\n */\nexport enum ErrorCode {\n /**\n * The request was invalid.\n */\n BadRequest = 40000,\n\n /**\n * Invalid argument provided.\n */\n InvalidArgument = 40003,\n\n // 104000 - 104999 are reserved for AI Transport SDK errors\n\n /**\n * Encoder recovery failed after flush — one or more updateMessage calls\n * could not recover a failed append pipeline.\n */\n EncoderRecoveryFailed = 104000,\n\n /**\n * A transport-level channel subscription callback threw unexpectedly.\n */\n TransportSubscriptionError = 104001,\n\n /**\n * Cancel listener or onCancel hook threw while processing a cancel message.\n */\n CancelListenerError = 104002,\n\n /**\n * A turn lifecycle event (turn-start or turn-end) failed to publish.\n */\n TurnLifecycleError = 104003,\n\n /**\n * An operation was attempted on a transport that has already been closed.\n */\n TransportClosed = 104004,\n\n /**\n * The HTTP POST to the server endpoint failed (network error or non-2xx response).\n */\n TransportSendFailed = 104005,\n}\n\n/**\n * Returns true if the {@link Ably.ErrorInfo} code matches the provided ErrorCode value.\n * @param errorInfo The error info to check.\n * @param error The error code to compare against.\n * @returns true if the error code matches, false otherwise.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\nexport const errorInfoIs = (errorInfo: Ably.ErrorInfo, error: ErrorCode): boolean => errorInfo.code === error;\n","/**\n * Vercel chat transport: wraps a core ClientTransport to satisfy the\n * ChatTransport interface that useChat expects.\n *\n * This is a thin adapter — the real logic lives in the core transport.\n * The chat transport maps Vercel's sendMessages/reconnectToStream contract\n * to the core transport's send/cancel methods.\n *\n * useChat manages message state before calling sendMessages:\n * - submit-message: appends the new user message, passes the full array\n * - regenerate-message: truncates after the target, passes the truncated array\n *\n * The adapter uses `trigger` to determine the history/messages split:\n * - submit-message: last message is new (publish to channel), rest is history\n * - regenerate-message: no new messages, entire array is history\n */\n\nimport * as Ably from 'ably';\nimport type * as AI from 'ai';\n\nimport type { ClientTransport, CloseOptions, SendOptions } from '../../core/transport/types.js';\nimport { ErrorCode } from '../../errors.js';\n\n// ---------------------------------------------------------------------------\n// ChatTransport options\n// ---------------------------------------------------------------------------\n\n/**\n * Context passed to {@link ChatTransportOptions.prepareSendMessagesRequest} for\n * customizing the HTTP POST body and headers.\n */\nexport interface SendMessagesRequestContext {\n /** Chat session ID (from useChat's id). */\n id?: string;\n /** What triggered the request: user sent a message, or requested regeneration. */\n trigger: 'submit-message' | 'regenerate-message';\n /**\n * The message ID for regeneration requests. Identifies which assistant\n * message to regenerate. Undefined for submit-message.\n */\n messageId?: string;\n /** Previous messages in the conversation (context for the LLM). */\n history: AI.UIMessage[];\n /** The new message(s) being sent (to publish to the channel). Empty for regeneration. */\n messages: AI.UIMessage[];\n /** The msg-id of the message being forked (regenerated or edited). */\n forkOf?: string;\n /** The msg-id of the predecessor in the conversation thread. */\n parent?: string | null;\n}\n\n/** Options for customizing the ChatTransport behavior. */\nexport interface ChatTransportOptions {\n /**\n * Customize the POST body before sending. Called by sendMessages()\n * with the conversation context. Return the body and headers for\n * the HTTP POST.\n *\n * Default: sends all previous messages as `history` in the body.\n * @param context - The conversation context for the current request.\n * @returns The body and headers to use for the HTTP POST.\n */\n prepareSendMessagesRequest?: (context: SendMessagesRequestContext) => {\n body?: Record<string, unknown>;\n headers?: Record<string, string>;\n };\n}\n\n// ---------------------------------------------------------------------------\n// ChatTransport interface\n// ---------------------------------------------------------------------------\n\n/**\n * Additional options passed through from useChat alongside the core\n * sendMessages/reconnectToStream parameters.\n *\n * Mirrors the AI SDK's internal ChatRequestOptions type, which is not\n * exported from the `ai` package.\n */\ninterface ChatRequestOptions {\n /** Additional headers for the request. */\n headers?: Record<string, string> | Headers;\n /** Additional JSON body properties for the request. */\n body?: object;\n /** Custom metadata to attach to the request. */\n metadata?: unknown;\n}\n\n/**\n * Transport interface for Vercel AI SDK's useChat hook.\n *\n * Structurally compatible with the AI SDK's internal `ChatTransport<UIMessage>`\n * interface. Extended with `close()` for releasing the underlying Ably transport\n * resources.\n */\nexport interface ChatTransport {\n /** Send messages and return a streaming response of UIMessageChunk events. */\n sendMessages: (\n options: {\n /** The type of message submission — new message or regeneration. */\n trigger: 'submit-message' | 'regenerate-message';\n /** Unique identifier for the chat session. */\n chatId: string;\n /** ID of the message to regenerate, or undefined for new messages. */\n messageId: string | undefined;\n /** Array of UI messages representing the conversation history. */\n messages: AI.UIMessage[];\n /** Signal to abort the request if needed. */\n abortSignal: AbortSignal | undefined;\n } & ChatRequestOptions,\n ) => Promise<ReadableStream<AI.UIMessageChunk>>;\n\n /**\n * Reconnect to an existing streaming response. Returns null if no active\n * stream exists for the specified chat session.\n */\n reconnectToStream: (\n options: {\n /** Unique identifier for the chat session to reconnect to. */\n chatId: string;\n } & ChatRequestOptions,\n ) => Promise<ReadableStream<AI.UIMessageChunk> | null>;\n\n /** Close the underlying transport, releasing all resources. */\n close(options?: CloseOptions): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel ChatTransport from a core ClientTransport.\n *\n * Maps Vercel's useChat contract to the core transport's methods:\n * - trigger 'submit-message' → transport.send(lastMessage) with history in body\n * - trigger 'regenerate-message' → transport.send([]) with all messages as history\n * - abortSignal → transport.cancel({ all: true })\n * - reconnectToStream → null (observer mode handles in-progress streams)\n * @param transport - The core client transport to wrap.\n * @param chatOptions - Optional hooks for customizing request construction.\n * @returns A {@link ChatTransport} compatible with Vercel's useChat hook.\n */\nexport const createChatTransport = (\n transport: ClientTransport<AI.UIMessageChunk, AI.UIMessage>,\n chatOptions?: ChatTransportOptions,\n): ChatTransport => ({\n sendMessages: async (opts) => {\n const { messages, abortSignal, trigger, messageId } = opts;\n\n // Determine the history/messages split based on trigger.\n // - submit-message: useChat appended the new user message → last is new\n // - regenerate-message: useChat truncated the array → no new messages\n let newMessages: AI.UIMessage[];\n let history: AI.UIMessage[];\n\n if (trigger === 'regenerate-message') {\n newMessages = [];\n history = messages;\n } else {\n if (messages.length === 0) {\n throw new Ably.ErrorInfo(\n 'unable to send messages; messages array is empty for submit-message trigger',\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n // CAST: length check above guarantees at least one element; .at(-1) cannot be undefined.\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style -- prefer `as` over `!` per TYPES.md\n newMessages = [messages.at(-1) as AI.UIMessage];\n history = messages.slice(0, -1);\n }\n\n // Compute fork metadata from the conversation tree.\n // For regeneration: forkOf = messageId (the assistant message being regenerated),\n // parent = the parent of that message in the tree.\n let forkOf: string | undefined;\n let parent: string | null | undefined;\n\n if (trigger === 'regenerate-message' && messageId) {\n forkOf = messageId;\n // Look up the parent of the message being regenerated.\n // messageId comes from useChat (UIMessage.id), so use getNodeByKey\n // which resolves via the codec key secondary index.\n const node = transport.getTree().getNodeByKey(messageId);\n if (node) {\n // Use the tree node's msgId (x-ably-msg-id) as forkOf — this is\n // what the server stamps on the wire, not the UIMessage.id.\n forkOf = node.msgId;\n parent = node.parentId;\n }\n }\n\n let sendBody: Record<string, unknown>;\n let sendHeaders: Record<string, string> | undefined;\n\n if (chatOptions?.prepareSendMessagesRequest) {\n const prepared = chatOptions.prepareSendMessagesRequest({\n id: opts.chatId,\n trigger,\n messageId,\n history,\n messages: newMessages,\n forkOf,\n parent,\n });\n sendBody = prepared.body ?? {};\n sendHeaders = prepared.headers;\n } else {\n const historyWithHeaders = history.map((m) => ({\n message: m,\n headers: transport.getMessageHeaders(m),\n }));\n sendBody = {\n history: historyWithHeaders,\n id: opts.chatId,\n trigger,\n ...(messageId !== undefined && { messageId }),\n ...(forkOf !== undefined && { forkOf }),\n ...(parent !== undefined && { parent }),\n };\n sendHeaders = undefined;\n }\n\n const sendOpts: SendOptions = { body: sendBody, headers: sendHeaders };\n if (forkOf !== undefined) sendOpts.forkOf = forkOf;\n if (parent !== undefined) sendOpts.parent = parent;\n\n const turn = await transport.send(newMessages, sendOpts);\n\n // Wire abort signal to cancel all turns on the channel.\n // In multi-user scenarios, any client can stop any stream — cancelling\n // by specific turnId would only work for the sender.\n if (abortSignal) {\n abortSignal.addEventListener('abort', () => void transport.cancel({ all: true }), {\n once: true,\n });\n }\n\n // Return an empty stream that closes when the turn ends.\n // useChat consumes the returned stream to accumulate the assistant message,\n // but useMessageSync already pushes the transport's authoritative message\n // state into useChat via setMessages. Returning the real event stream would\n // cause useChat to accumulate a duplicate assistant message. Instead, we\n // return a stream that produces no chunks and closes when the turn's stream\n // finishes, so useChat knows when streaming is done without duplicating state.\n const { readable, writable } = new TransformStream<AI.UIMessageChunk>();\n const writer = writable.getWriter();\n // Fire-and-forget: we only care about the close/abort signal, not the piped data.\n // Errors on the turn stream are surfaced via transport.on('error'), not here.\n /* eslint-disable @typescript-eslint/no-empty-function -- swallow: writer.close() rejection after stream teardown is unrecoverable */\n turn.stream\n .pipeTo(\n new WritableStream({\n close: () => {\n writer.close().catch(() => {});\n },\n abort: () => {\n writer.close().catch(() => {});\n },\n }),\n )\n .catch(() => {\n writer.close().catch(() => {});\n });\n /* eslint-enable @typescript-eslint/no-empty-function */\n return readable;\n },\n\n // Observer mode handles in-progress streams automatically.\n // The transport subscribes before attach — on the next server append,\n // observer accumulation emits lifecycle events that useMessageSync\n // upserts into React state.\n // eslint-disable-next-line unicorn/no-null, @typescript-eslint/promise-function-async -- null is required by the AI SDK ChatTransport contract; no await needed\n reconnectToStream: () => Promise.resolve(null),\n\n close: async (options?: CloseOptions) => transport.close(options),\n});\n","/**\n * Shared constants used by both codec and transport layers.\n *\n * Header constants define the `x-ably-*` wire protocol. Message and event\n * name constants define the transport lifecycle signals on the channel.\n *\n * These live at the top level (not in codec/ or transport/) because both\n * layers need them — the codec core reads/writes stream and status headers,\n * while the transport layer reads/writes turn, cancel, and role headers.\n */\n\n// ---------------------------------------------------------------------------\n// Stream headers (used by codec encoder/decoder core)\n// ---------------------------------------------------------------------------\n\n/** Header: whether this Ably message uses streaming (message appends) or is discrete. Always \"true\" or \"false\". */\nexport const HEADER_STREAM = 'x-ably-stream';\n\n/** Header: lifecycle status of a streamed message. Only set when x-ably-stream is \"true\". */\nexport const HEADER_STATUS = 'x-ably-status';\n\n/** Header: stream identity. Set by the encoder on every streamed message; read by the decoder to correlate streams. */\nexport const HEADER_STREAM_ID = 'x-ably-stream-id';\n\n// ---------------------------------------------------------------------------\n// Identity headers (used by transport for turn correlation)\n// ---------------------------------------------------------------------------\n\n/** Header: turn correlation ID. Set on every message in a turn. */\nexport const HEADER_TURN_ID = 'x-ably-turn-id';\n\n/** Header: message identity. Assigned per message (user or assistant). Used for optimistic reconciliation on the client. */\nexport const HEADER_MSG_ID = 'x-ably-msg-id';\n\n/** Header: clientId of the user who initiated the turn. Set by the server on stream messages. */\nexport const HEADER_TURN_CLIENT_ID = 'x-ably-turn-client-id';\n\n/** Header: message role (e.g. \"user\", \"assistant\"). */\nexport const HEADER_ROLE = 'x-ably-role';\n\n// ---------------------------------------------------------------------------\n// Cancel headers\n// ---------------------------------------------------------------------------\n\n/** Header: cancel a specific turn by ID. */\nexport const HEADER_CANCEL_TURN_ID = 'x-ably-cancel-turn-id';\n\n/** Header: cancel all turns belonging to the sender's clientId. */\nexport const HEADER_CANCEL_OWN = 'x-ably-cancel-own';\n\n/** Header: cancel all turns on the channel. */\nexport const HEADER_CANCEL_ALL = 'x-ably-cancel-all';\n\n/** Header: cancel all turns belonging to a specific clientId. */\nexport const HEADER_CANCEL_CLIENT_ID = 'x-ably-cancel-client-id';\n\n// ---------------------------------------------------------------------------\n// Fork / branching headers\n// ---------------------------------------------------------------------------\n\n/** Header: the msg-id of the immediately preceding message in this branch. */\nexport const HEADER_PARENT = 'x-ably-parent';\n\n/** Header: the msg-id of the message this one replaces (creates a fork). */\nexport const HEADER_FORK_OF = 'x-ably-fork-of';\n\n// ---------------------------------------------------------------------------\n// Turn lifecycle headers\n// ---------------------------------------------------------------------------\n\n/** Header: reason a turn ended (on x-ably-turn-end messages). */\nexport const HEADER_TURN_REASON = 'x-ably-turn-reason';\n\n// ---------------------------------------------------------------------------\n// Message / event names\n// ---------------------------------------------------------------------------\n\n/** Message name: client->server cancel signal. */\nexport const EVENT_CANCEL = 'x-ably-cancel';\n\n/** Message name: server publishes this to signal a turn has started. */\nexport const EVENT_TURN_START = 'x-ably-turn-start';\n\n/** Message name: server publishes this to signal a turn has ended. */\nexport const EVENT_TURN_END = 'x-ably-turn-end';\n\n/** Message name: transport-level abort signal (stream cancelled). */\nexport const EVENT_ABORT = 'x-ably-abort';\n\n/** Message name: transport-level error signal. */\nexport const EVENT_ERROR = 'x-ably-error';\n\n// ---------------------------------------------------------------------------\n// Domain header prefix (used by codec implementations)\n// ---------------------------------------------------------------------------\n\n/** Prefix for domain-specific headers. Distinguishes codec-layer headers from transport `x-ably-*` headers. */\nexport const DOMAIN_HEADER_PREFIX = 'x-domain-';\n","/**\n * Type-safe EventEmitter wrapping Ably's internal EventEmitter.\n *\n * Takes a single `EventsMap` type parameter — an interface mapping event names\n * to payload types — rather than Ably's three type parameters. Adapted from\n * the ably-chat-js SDK.\n *\n * ```ts\n * interface MyEvents {\n * reaction: { emoji: string };\n * status: { online: boolean };\n * }\n *\n * const emitter = new EventEmitter<MyEvents>(logger);\n * emitter.on('reaction', (event) => console.log(event.emoji));\n * emitter.emit('reaction', { emoji: '👍' });\n * ```\n */\n\nimport * as Ably from 'ably';\n\nimport type { Logger } from './logger.js';\n\n/** Callback receiving a union of all possible event payloads. */\ntype Callback<EventsMap> = (arg: EventsMap[keyof EventsMap]) => void;\n\n/** Callback receiving the payload for a single event type. */\ntype CallbackSingle<K> = (arg: K) => void;\n\n/**\n * Type-safe interface for the Ably EventEmitter, parameterized by an EventsMap\n * that maps event names to their payload types.\n */\ninterface InterfaceEventEmitter<EventsMap> extends Ably.EventEmitter<Callback<EventsMap>, void, keyof EventsMap> {\n /** Emit an event with a type-safe payload. Payload is optional for `undefined`-typed events. */\n emit<K extends keyof EventsMap>(\n event: K,\n ...args: EventsMap[K] extends undefined ? [EventsMap[K]?] : [EventsMap[K]]\n ): void;\n\n /** Subscribe to a single event with a typed callback. */\n on<K extends keyof EventsMap>(event: K, callback: CallbackSingle<EventsMap[K]>): void;\n /** Subscribe to two events with a union-typed callback. */\n on<K1 extends keyof EventsMap, K2 extends keyof EventsMap>(\n events: [K1, K2],\n callback: CallbackSingle<EventsMap[K1] | EventsMap[K2]>,\n ): void;\n /** Subscribe to three events with a union-typed callback. */\n on<K1 extends keyof EventsMap, K2 extends keyof EventsMap, K3 extends keyof EventsMap>(\n events: [K1, K2, K3],\n callback: CallbackSingle<EventsMap[K1] | EventsMap[K2] | EventsMap[K3]>,\n ): void;\n /** Subscribe to an array of events. */\n on(events: (keyof EventsMap)[], callback: Callback<EventsMap>): void;\n /** Subscribe to all events. */\n on(callback: Callback<EventsMap>): void;\n\n /** Unsubscribe a callback from a specific event. */\n off<K extends keyof EventsMap>(event: K, listener: CallbackSingle<EventsMap[K]>): void;\n /** Unsubscribe a callback from all events, or remove all listeners if no callback provided. */\n off(listener?: Callback<EventsMap>): void;\n}\n\n/**\n * Bridge from our {@link Logger} to the Ably EventEmitter's internal logger\n * contract. Ably's EventEmitter calls `logger.logAction(level, action, message)`\n * when a listener throws — we route that to our Logger's `error` method.\n * @param logger - The application logger to delegate to.\n * @returns An object satisfying the Ably EventEmitter's logger interface.\n */\nconst toAblyLogger = (logger: Logger): unknown => ({\n logAction: (_level: number, action: string, message?: string) => {\n logger.error(action, { detail: message });\n },\n shouldLog: () => true,\n});\n\n// CAST: Access Ably's internal EventEmitter constructor. Not publicly exported\n// but available to other Ably SDKs. The logger parameter ensures listener\n// exceptions are caught and logged rather than crashing.\nconst InternalEventEmitter: new <EventsMap>(logger: unknown) => InterfaceEventEmitter<EventsMap> = (\n Ably.Realtime as unknown as { EventEmitter: new <EventsMap>(logger: unknown) => InterfaceEventEmitter<EventsMap> }\n).EventEmitter;\n\n/**\n * Type-safe EventEmitter based on Ably's internal EventEmitter.\n *\n * Provides the same semantics as {@link Ably.EventEmitter} (error isolation\n * between listeners, synchronous dispatch) but with a single `EventsMap` type\n * parameter for ergonomic type safety.\n *\n * Requires a {@link Logger} so that listener exceptions are routed through\n * the application's logging infrastructure rather than silently swallowed.\n */\nexport class EventEmitter<EventsMap> extends InternalEventEmitter<EventsMap> {\n /**\n * Create a new EventEmitter.\n * @param logger - Application logger. Listener exceptions are logged at error level.\n */\n constructor(logger: Logger) {\n super(toAblyLogger(logger));\n }\n}\n","import * as Ably from 'ably';\n\nimport { ErrorCode } from './errors.js';\n\n/**\n * Structured logger with leveled output and hierarchical context.\n * Implementations filter messages by level and delegate to a {@link LogHandler}.\n */\nexport interface Logger {\n /**\n * Log a message at the trace level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n trace(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the debug level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n debug(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the info level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n info(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the warn level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n warn(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the error level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n error(message: string, context?: LogContext): void;\n\n /**\n * Creates a new logger with a context that will be merged with any context provided to individual log calls.\n * The context will be overridden by any matching keys in the individual log call's context.\n * @param context The context to use for all log calls.\n * @returns A new logger instance with the context.\n */\n withContext(context: LogContext): Logger;\n}\n\n/**\n * Represents the different levels of logging that can be used.\n */\nexport enum LogLevel {\n /**\n * Something routine and expected has occurred. This level will provide logs for the vast majority of operations\n * and function calls.\n */\n Trace = 'trace',\n\n /**\n * Development information, messages that are useful when trying to debug library behavior,\n * but superfluous to normal operation.\n */\n Debug = 'debug',\n\n /**\n * Informational messages. Operationally significant to the library but not out of the ordinary.\n */\n Info = 'info',\n\n /**\n * Anything that is not immediately an error, but could cause unexpected behavior in the future. For example,\n * passing an invalid value to an option. Indicates that some action should be taken to prevent future errors.\n */\n Warn = 'warn',\n\n /**\n * A given operation has failed and cannot be automatically recovered. The error may threaten the continuity\n * of operation.\n */\n Error = 'error',\n\n /**\n * No logging will be performed.\n */\n Silent = 'silent',\n}\n\n/**\n * Represents the context of a log message.\n * It is an object of key-value pairs that can be used to provide additional context to a log message.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type LogContext = Record<string, any>;\n\n/**\n * A function that can be used to handle log messages.\n * @param message The message to log.\n * @param level The log level of the message.\n * @param context The context of the log message as key-value pairs.\n */\nexport type LogHandler = (message: string, level: LogLevel, context?: LogContext) => void;\n\n/**\n * A simple console logger that logs messages to the console.\n * @param message The message to log.\n * @param level The log level of the message.\n * @param context - The context of the log message as key-value pairs.\n */\nexport const consoleLogger = (message: string, level: LogLevel, context?: LogContext) => {\n const contextString = context ? `, context: ${JSON.stringify(context)}` : '';\n const formattedMessage = `[${new Date().toISOString()}] ${level.valueOf().toUpperCase()} ably-ai-transport: ${message}${contextString}`;\n\n switch (level) {\n case LogLevel.Trace:\n case LogLevel.Debug: {\n console.log(formattedMessage);\n break;\n }\n case LogLevel.Info: {\n console.info(formattedMessage);\n break;\n }\n case LogLevel.Warn: {\n console.warn(formattedMessage);\n break;\n }\n case LogLevel.Error: {\n console.error(formattedMessage);\n break;\n }\n case LogLevel.Silent: {\n break;\n }\n }\n};\n\n/**\n * Options for creating a logger.\n */\nexport interface LoggerOptions {\n logHandler?: LogHandler;\n logLevel: LogLevel;\n}\n\nexport const makeLogger = (options: LoggerOptions): Logger => {\n const logHandler = options.logHandler ?? consoleLogger;\n\n return new DefaultLogger(logHandler, options.logLevel);\n};\n\n/**\n * A convenient list of log levels as numbers that can be used for easier comparison.\n */\nenum LogLevelNumber {\n Trace = 0,\n Debug = 1,\n Info = 2,\n Warn = 3,\n Error = 4,\n Silent = 5,\n}\n\n/**\n * A mapping of log levels to their numeric equivalents.\n */\nconst logLevelNumberMap = new Map<LogLevel, LogLevelNumber>([\n [LogLevel.Trace, LogLevelNumber.Trace],\n [LogLevel.Debug, LogLevelNumber.Debug],\n [LogLevel.Info, LogLevelNumber.Info],\n [LogLevel.Warn, LogLevelNumber.Warn],\n [LogLevel.Error, LogLevelNumber.Error],\n [LogLevel.Silent, LogLevelNumber.Silent],\n]);\n\n/**\n * A default logger implementation.\n */\nclass DefaultLogger implements Logger {\n private readonly _handler: LogHandler;\n private readonly _levelNumber: LogLevelNumber;\n private readonly _context?: LogContext;\n\n constructor(handler: LogHandler, level: LogLevel, context?: LogContext) {\n this._handler = handler;\n this._context = context;\n\n const levelNumber = logLevelNumberMap.get(level);\n if (levelNumber === undefined) {\n throw new Ably.ErrorInfo(`unable to create logger; invalid log level: ${level}`, ErrorCode.InvalidArgument, 400);\n }\n\n this._levelNumber = levelNumber;\n }\n\n trace(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Trace, LogLevelNumber.Trace, context);\n }\n\n debug(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Debug, LogLevelNumber.Debug, context);\n }\n\n info(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Info, LogLevelNumber.Info, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Warn, LogLevelNumber.Warn, context);\n }\n\n error(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Error, LogLevelNumber.Error, context);\n }\n\n withContext(context: LogContext): Logger {\n // Get the original log level by finding the key in logLevelNumberMap that matches this._levelNumber\n const originalLevel =\n [...logLevelNumberMap.entries()].find(([, value]) => value === this._levelNumber)?.[0] ?? LogLevel.Error;\n\n return new DefaultLogger(this._handler, originalLevel, this._mergeContext(context));\n }\n\n private _write(message: string, level: LogLevel, levelNumber: LogLevelNumber, context?: LogContext): void {\n if (levelNumber >= this._levelNumber) {\n this._handler(message, level, this._mergeContext(context));\n }\n }\n\n private _mergeContext(context?: LogContext): LogContext | undefined {\n if (!this._context) {\n return context ?? undefined;\n }\n\n return context ? { ...this._context, ...context } : this._context;\n }\n}\n","/**\n * Shared utilities for working with Ably messages.\n *\n * These are general-purpose helpers used by both the codec and transport\n * layers. They live at the top level to avoid either layer depending on\n * the other.\n */\n\nimport type * as Ably from 'ably';\n\nimport { DOMAIN_HEADER_PREFIX } from './constants.js';\n\n/**\n * Extract extras.headers from an Ably InboundMessage.\n * @param message - The Ably message to extract headers from.\n * @returns The headers record, or an empty object if absent.\n */\nexport const getHeaders = (message: Ably.InboundMessage): Record<string, string> => {\n // CAST: Ably SDK types `extras` as `any`; runtime checks below guard access.\n const extras = message.extras as unknown;\n if (!extras || typeof extras !== 'object') return {};\n const headers = (extras as { headers?: unknown }).headers;\n if (!headers || typeof headers !== 'object') return {};\n // CAST: Ably wire protocol guarantees headers is Record<string, string>\n // when present, verified by the runtime guards above.\n return headers as Record<string, string>;\n};\n\n/**\n * Parse a JSON string, returning undefined on failure.\n * @param value - The JSON string to parse.\n * @returns The parsed value, or undefined if parsing fails.\n */\nexport const parseJson = (value: string | undefined): unknown => {\n if (value === undefined) return undefined;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Set a header value if defined, skipping undefined and null. Strings are set directly,\n * booleans and numbers are stringified, objects are JSON-serialized.\n * @param headers - The headers object to mutate.\n * @param key - The header key.\n * @param value - The value to set.\n */\nexport const setIfPresent = (headers: Record<string, string>, key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n headers[key] = String(value);\n } else if (typeof value === 'object') {\n headers[key] = JSON.stringify(value);\n }\n};\n\n/**\n * Set multiple headers at once, skipping entries whose values are undefined or null.\n * Each value is converted using the same rules as {@link setIfPresent}.\n * @param headers - The headers object to mutate.\n * @param entries - Key-value pairs to set.\n */\nexport const setHeadersIfPresent = (headers: Record<string, string>, entries: Record<string, unknown>): void => {\n for (const [key, value] of Object.entries(entries)) {\n setIfPresent(headers, key, value);\n }\n};\n\n/**\n * Merge two header records into a new object. Later values override earlier ones.\n * Undefined inputs are treated as empty.\n * @param base - Base headers (lower priority).\n * @param overrides - Override headers (higher priority).\n * @returns A new merged headers object.\n */\nexport const mergeHeaders = (\n base: Record<string, string> | undefined,\n overrides: Record<string, string> | undefined,\n): Record<string, string> => ({\n ...base,\n ...overrides,\n});\n\n/**\n * Parse a boolean header (\"true\"/\"false\"), returning undefined if absent.\n * @param value - The header string to parse.\n * @returns True if \"true\", false for any other string, or undefined if absent.\n */\nexport const parseBool = (value: string | undefined): boolean | undefined => {\n if (value === undefined) return undefined;\n return value === 'true';\n};\n\n/**\n * Build a domain headers record from key-value pairs. Each key is automatically\n * prefixed with {@link DOMAIN_HEADER_PREFIX}. Values that are undefined or null\n * are skipped; strings are set directly; booleans, numbers, and objects are\n * converted using the same rules as {@link setIfPresent}.\n * @param entries - Unprefixed key-value pairs (e.g. `{ toolCallId: 'tc-1' }` becomes `{ 'x-domain-toolCallId': 'tc-1' }`).\n * @returns A new headers record with prefixed keys.\n */\nexport const domainHeaders = (entries: Record<string, unknown>): Record<string, string> => {\n const h: Record<string, string> = {};\n for (const [key, value] of Object.entries(entries)) {\n setIfPresent(h, DOMAIN_HEADER_PREFIX + key, value);\n }\n return h;\n};\n\n/**\n * Read a domain header value from a headers record.\n * @param headers - The headers record to read from.\n * @param key - The unprefixed domain key (e.g. `'toolCallId'` reads `'x-domain-toolCallId'`).\n * @returns The header value, or undefined if absent.\n */\nexport const getDomainHeader = (headers: Record<string, string>, key: string): string | undefined =>\n headers[DOMAIN_HEADER_PREFIX + key];\n\n/**\n * Mapped type that converts properties whose type includes `undefined`\n * into optional properties with `undefined` excluded from the value.\n * Properties typed as `unknown` are kept required (since `undefined extends unknown`\n * is always true, but `unknown` fields are intentionally broad, not optional).\n */\nexport type Stripped<T> = {\n [K in keyof T as undefined extends T[K] ? (unknown extends T[K] ? K : never) : K]: T[K];\n} & {\n [K in keyof T as undefined extends T[K] ? (unknown extends T[K] ? never : K) : never]?: Exclude<T[K], undefined>;\n};\n\n/**\n * Remove all keys whose value is `undefined` from a shallow object.\n * Returns a new object — the input is not mutated. Useful for building\n * chunk literals with optional fields without conditional spread noise.\n *\n * The return type converts `{ foo: T | undefined }` to `{ foo?: T }`,\n * matching the optional-field pattern used by the AI SDK chunk types.\n * @param obj - The object to strip undefined values from.\n * @returns A shallow copy with undefined-valued keys removed.\n */\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Stripped<T> => {\n const result = {} as Record<string, unknown>;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n // CAST: The runtime strip guarantees the Stripped<T> contract —\n // required keys are always present, optional keys are absent when undefined.\n return result as Stripped<T>;\n};\n\n// ---------------------------------------------------------------------------\n// DomainHeaderReader — typed accessors for domain headers\n// ---------------------------------------------------------------------------\n\n/**\n * Typed accessor wrapper around a headers record for reading domain headers.\n * Reduces repetitive `getDomainHeader` + `parseBool` / `parseJson` chains.\n */\nexport interface DomainHeaderReader {\n /** Read a domain header as a string, or undefined if absent. */\n str(key: string): string | undefined;\n /** Read a domain header as a string, falling back to a default if absent. */\n strOr(key: string, fallback: string): string;\n /** Read a domain header as a boolean (\"true\"/\"false\"), or undefined if absent. */\n bool(key: string): boolean | undefined;\n /** Read a domain header as parsed JSON, or undefined if absent or invalid. */\n json(key: string): unknown;\n}\n\n/**\n * Create a {@link DomainHeaderReader} over a headers record.\n * @param headers - The raw headers record to read domain headers from.\n * @returns A typed accessor for domain header values.\n */\nexport const headerReader = (headers: Record<string, string>): DomainHeaderReader => ({\n str: (key: string) => getDomainHeader(headers, key),\n strOr: (key: string, fallback: string) => getDomainHeader(headers, key) ?? fallback,\n bool: (key: string) => parseBool(getDomainHeader(headers, key)),\n json: (key: string) => parseJson(getDomainHeader(headers, key)),\n});\n\n// ---------------------------------------------------------------------------\n// DomainHeaderWriter — typed builder for domain headers\n// ---------------------------------------------------------------------------\n\n/**\n * Fluent builder for constructing domain header records with typed setters.\n * Mirrors {@link DomainHeaderReader} with the same method names for symmetry.\n * Undefined values are silently skipped on all setters.\n */\nexport interface DomainHeaderWriter {\n /** Set a string domain header. Skips if value is undefined. */\n str(key: string, value: string | undefined): DomainHeaderWriter;\n /** Set a boolean domain header (serialized as \"true\"/\"false\"). Skips if value is undefined. */\n bool(key: string, value: boolean | undefined): DomainHeaderWriter;\n /** Set a JSON-serialized domain header. Skips if value is undefined or null. */\n json(key: string, value: unknown): DomainHeaderWriter;\n /** Return the accumulated headers record. */\n build(): Record<string, string>;\n}\n\n/**\n * Create a {@link DomainHeaderWriter} for building a domain headers record.\n * @returns A fluent builder that prefixes each key with the domain header prefix.\n */\nexport const headerWriter = (): DomainHeaderWriter => {\n const h: Record<string, string> = {};\n const writer: DomainHeaderWriter = {\n str: (key: string, value: string | undefined) => {\n if (value !== undefined) h[DOMAIN_HEADER_PREFIX + key] = value;\n return writer;\n },\n bool: (key: string, value: boolean | undefined) => {\n if (value !== undefined) h[DOMAIN_HEADER_PREFIX + key] = String(value);\n return writer;\n },\n json: (key: string, value: unknown) => {\n if (value !== undefined && value !== null) h[DOMAIN_HEADER_PREFIX + key] = JSON.stringify(value);\n return writer;\n },\n build: () => h,\n };\n return writer;\n};\n","/**\n * ConversationTree — materializes a branching conversation from a flat\n * oplog of Ably messages using serial-first ordering.\n *\n * Serial order (the total order assigned by Ably) is the primary mechanism\n * for linear message sequences. `x-ably-parent` and `x-ably-fork-of` headers\n * are only structurally meaningful at branch points — where the user is\n * interacting with a visible message and the client always has it loaded.\n *\n * `upsert()` is the sole mutation method. Messages can arrive in any order\n * (live subscription, history pages, seed data) and the tree produces the\n * correct `flatten()` output once all messages are present.\n *\n * The tree owns conversation state. `flatten()` returns the linear message\n * list for the currently selected branches — this is what the transport's\n * `getMessages()` delegates to.\n */\n\nimport { HEADER_FORK_OF, HEADER_PARENT } from '../../constants.js';\nimport type { Logger } from '../../logger.js';\nimport type { ConversationNode, ConversationTree } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Internal node type\n// ---------------------------------------------------------------------------\n\ninterface InternalNode<TMessage> {\n node: ConversationNode<TMessage>;\n /** Insertion sequence — tiebreaker for null-serial messages. */\n insertSeq: number;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CT13\nclass DefaultConversationTree<TMessage> implements ConversationTree<TMessage> {\n /** All nodes indexed by msgId (x-ably-msg-id). */\n private readonly _nodeIndex = new Map<string, InternalNode<TMessage>>();\n\n /** Secondary index: codec message key to msgId. Bridges UIMessage.id to x-ably-msg-id. */\n private readonly _codecKeyIndex = new Map<string, string>();\n\n /**\n * All nodes sorted by serial (lexicographic). Null-serial messages\n * (optimistic inserts, seed data) sort after all serial-bearing messages,\n * ordered among themselves by insertion sequence.\n */\n private readonly _sortedList: InternalNode<TMessage>[] = [];\n\n /**\n * Parent index: parentId to set of child msgIds.\n * Nodes with no parent are indexed under the key `null`.\n */\n private readonly _parentIndex = new Map<string | undefined, Set<string>>();\n\n /**\n * Selected sibling index at each fork point, keyed by the msgId of\n * the first sibling in the group (the fork target). Default: last.\n */\n private readonly _selections = new Map<string, number>();\n\n private readonly _getKey: (message: TMessage) => string;\n private readonly _logger: Logger;\n\n /** Monotonically increasing counter for insertion sequence. */\n private _seqCounter = 0;\n\n constructor(getKey: (message: TMessage) => string, logger: Logger) {\n this._getKey = getKey;\n this._logger = logger;\n }\n\n // -------------------------------------------------------------------------\n // Sorted list maintenance\n // -------------------------------------------------------------------------\n\n /**\n * Compare two nodes for sorted list ordering.\n * Serial-bearing nodes sort by serial (lexicographic).\n * Null-serial nodes sort after all serial-bearing nodes.\n * Among null-serial nodes, sort by insertion sequence.\n * @param a - First node to compare.\n * @param b - Second node to compare.\n * @returns Negative if a sorts before b, positive if after, zero if equal.\n */\n // Spec: AIT-CT13a\n private _compareNodes(a: InternalNode<TMessage>, b: InternalNode<TMessage>): number {\n const sa = a.node.serial;\n const sb = b.node.serial;\n if (sa === undefined && sb === undefined) return a.insertSeq - b.insertSeq;\n if (sa === undefined) return 1; // a sorts after serial-bearing b\n if (sb === undefined) return -1; // b sorts after serial-bearing a\n if (sa < sb) return -1;\n if (sa > sb) return 1;\n return a.insertSeq - b.insertSeq; // same serial: preserve insertion order\n }\n\n /**\n * Insert a node into sortedList at the correct position via binary search.\n * @param internal - The node to insert.\n */\n private _insertSorted(internal: InternalNode<TMessage>): void {\n const serial = internal.node.serial;\n\n // Fast path: null-serial always appends to end (among other null-serials)\n if (serial === undefined) {\n this._sortedList.push(internal);\n return;\n }\n\n // Binary search for insertion point among serial-bearing nodes.\n let lo = 0;\n let hi = this._sortedList.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const midNode = this._sortedList[mid];\n if (!midNode) break; // unreachable: mid is always in bounds\n if (this._compareNodes(midNode, internal) <= 0) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n this._sortedList.splice(lo, 0, internal);\n }\n\n /**\n * Remove a node from sortedList.\n * @param internal - The node to remove.\n */\n private _removeSorted(internal: InternalNode<TMessage>): void {\n const idx = this._sortedList.indexOf(internal);\n if (idx !== -1) this._sortedList.splice(idx, 1);\n }\n\n // -------------------------------------------------------------------------\n // Parent index maintenance\n // -------------------------------------------------------------------------\n\n private _addToParentIndex(parentId: string | undefined, msgId: string): void {\n let set = this._parentIndex.get(parentId);\n if (!set) {\n set = new Set();\n this._parentIndex.set(parentId, set);\n }\n set.add(msgId);\n }\n\n private _removeFromParentIndex(parentId: string | undefined, msgId: string): void {\n const set = this._parentIndex.get(parentId);\n if (set) {\n set.delete(msgId);\n if (set.size === 0) this._parentIndex.delete(parentId);\n }\n }\n\n // -------------------------------------------------------------------------\n // Sibling grouping\n // -------------------------------------------------------------------------\n\n /**\n * Get the sibling group that `msgId` belongs to.\n *\n * A sibling group is: the original message + all messages whose `forkOf`\n * points to the original (or transitively to a sibling). We find the\n * group root by following `forkOf` chains to the earliest ancestor that\n * has no `forkOf` (or whose `forkOf` target doesn't share the same parent).\n * @param msgId - The msg-id to look up the sibling group for.\n * @returns The ordered list of sibling nodes.\n */\n // Spec: AIT-CT13b\n private _getSiblingGroup(msgId: string): ConversationNode<TMessage>[] {\n const entry = this._nodeIndex.get(msgId);\n if (!entry) return [];\n\n // Find the \"original\" — the message at the root of the fork chain\n // that shares the same parentId. Guard against cycles in forkOf chains.\n let original = entry.node;\n const visitedGroup = new Set<string>([original.msgId]);\n while (original.forkOf) {\n if (visitedGroup.has(original.forkOf)) break; // cycle guard\n const forkTarget = this._nodeIndex.get(original.forkOf);\n if (!forkTarget || forkTarget.node.parentId !== original.parentId) break;\n original = forkTarget.node;\n visitedGroup.add(original.msgId);\n }\n\n // Collect all siblings: nodes with the same parentId that either\n // ARE the original, or have a forkOf chain leading to the original.\n const parentId = original.parentId;\n const originalId = original.msgId;\n const siblings: InternalNode<TMessage>[] = [];\n\n const candidateIds = this._parentIndex.get(parentId);\n if (candidateIds) {\n for (const childId of candidateIds) {\n const childEntry = this._nodeIndex.get(childId);\n if (childEntry && this._isSiblingOf(childEntry.node, originalId)) {\n siblings.push(childEntry);\n }\n }\n }\n\n // Sort by Ably serial (lexicographic). Messages without a serial\n // (optimistic inserts before server relay) sort after all serial-bearing\n // siblings — they represent the user's most recent action.\n siblings.sort((a, b) => this._compareNodes(a, b));\n return siblings.map((s) => s.node);\n }\n\n /**\n * Check if `node` belongs to the sibling group rooted at `originalId`.\n * A node is a sibling if it IS the original or its forkOf chain leads\n * to the original (with the same parentId).\n * @param node - The node to check.\n * @param originalId - The group root to match against.\n * @returns True if the node belongs to the sibling group.\n */\n private _isSiblingOf(node: ConversationNode<TMessage>, originalId: string): boolean {\n if (node.msgId === originalId) return true;\n let current = node;\n const visited = new Set<string>([current.msgId]);\n while (current.forkOf) {\n if (current.forkOf === originalId) return true;\n if (visited.has(current.forkOf)) break; // cycle guard\n const target = this._nodeIndex.get(current.forkOf);\n if (!target) break;\n current = target.node;\n visited.add(current.msgId);\n }\n return false;\n }\n\n /**\n * Get the \"group root\" msgId for a sibling group — the original message\n * that all forks trace back to.\n * @param msgId - Any msg-id in the sibling group.\n * @returns The msg-id of the group root.\n */\n private _getGroupRoot(msgId: string): string {\n const entry = this._nodeIndex.get(msgId);\n if (!entry) return msgId;\n\n let current = entry.node;\n const visited = new Set<string>([current.msgId]);\n while (current.forkOf) {\n if (visited.has(current.forkOf)) break; // cycle guard\n const forkTarget = this._nodeIndex.get(current.forkOf);\n if (!forkTarget || forkTarget.node.parentId !== current.parentId) break;\n current = forkTarget.node;\n visited.add(current.msgId);\n }\n return current.msgId;\n }\n\n // -------------------------------------------------------------------------\n // Public query methods\n // -------------------------------------------------------------------------\n\n flatten(): TMessage[] {\n const result: TMessage[] = [];\n const currentPath = new Set<string>();\n // Track which sibling groups we've already resolved to avoid\n // re-resolving for every member of the group.\n const resolvedGroups = new Map<string, string>(); // groupRootId → selected msgId\n\n for (const internal of this._sortedList) {\n const node = internal.node;\n const { msgId, parentId } = node;\n\n // Step 1: Check parent reachability.\n if (parentId !== undefined && !currentPath.has(parentId)) {\n continue;\n }\n\n // Step 2: Check sibling selection.\n const group = this._getSiblingGroup(msgId);\n if (group.length > 1) {\n const groupRootId = this._getGroupRoot(msgId);\n let selectedId = resolvedGroups.get(groupRootId);\n if (selectedId === undefined) {\n const selectedIdx = this._selections.get(groupRootId) ?? group.length - 1;\n const clamped = Math.max(0, Math.min(selectedIdx, group.length - 1));\n const selected = group[clamped];\n if (!selected) break; // unreachable: clamped is always in bounds\n selectedId = selected.msgId;\n resolvedGroups.set(groupRootId, selectedId);\n }\n if (msgId !== selectedId) {\n continue;\n }\n }\n\n currentPath.add(msgId);\n result.push(node.message);\n }\n\n return result;\n }\n\n getSiblings(msgId: string): TMessage[] {\n return this._getSiblingGroup(msgId).map((n) => n.message);\n }\n\n hasSiblings(msgId: string): boolean {\n return this._getSiblingGroup(msgId).length > 1;\n }\n\n getSelectedIndex(msgId: string): number {\n const group = this._getSiblingGroup(msgId);\n if (group.length <= 1) return 0;\n const groupRootId = this._getGroupRoot(msgId);\n const stored = this._selections.get(groupRootId);\n if (stored !== undefined) return Math.max(0, Math.min(stored, group.length - 1));\n return group.length - 1; // default: latest\n }\n\n // Spec: AIT-CT13c\n select(msgId: string, index: number): void {\n this._logger.debug('ConversationTree.select();', { msgId, index });\n const group = this._getSiblingGroup(msgId);\n if (group.length <= 1) return;\n const groupRootId = this._getGroupRoot(msgId);\n this._selections.set(groupRootId, Math.max(0, Math.min(index, group.length - 1)));\n }\n\n getNode(msgId: string): ConversationNode<TMessage> | undefined {\n return this._nodeIndex.get(msgId)?.node;\n }\n\n getNodeByKey(key: string): ConversationNode<TMessage> | undefined {\n const msgId = this._codecKeyIndex.get(key);\n if (!msgId) return undefined;\n return this._nodeIndex.get(msgId)?.node;\n }\n\n getHeaders(msgId: string): Record<string, string> | undefined {\n return this._nodeIndex.get(msgId)?.node.headers;\n }\n\n // -------------------------------------------------------------------------\n // Mutation\n // -------------------------------------------------------------------------\n\n upsert(msgId: string, message: TMessage, headers: Record<string, string>, serial?: string): void {\n const parentId = headers[HEADER_PARENT] ?? undefined;\n const forkOf = headers[HEADER_FORK_OF] ?? undefined;\n\n // Maintain codec key → msgId secondary index\n this._codecKeyIndex.set(this._getKey(message), msgId);\n\n const existing = this._nodeIndex.get(msgId);\n if (existing) {\n // Update in place — message content may have changed (e.g. streaming).\n // Only update headers if the new headers are non-empty (prevents\n // streaming updates from erasing canonical headers).\n existing.node.message = message;\n if (Object.keys(headers).length > 0) {\n existing.node.headers = { ...headers };\n }\n // Spec: AIT-CT13d\n // Promote serial: optimistic (null) → server-assigned on relay.\n if (serial && !existing.node.serial) {\n this._logger.debug('ConversationTree.upsert(); promoting serial', { msgId, serial });\n existing.node.serial = serial;\n // Re-sort: remove from current position, re-insert at correct position.\n this._removeSorted(existing);\n this._insertSorted(existing);\n }\n return;\n }\n\n this._logger.trace('ConversationTree.upsert(); inserting new node', { msgId, parentId, forkOf });\n\n const node: ConversationNode<TMessage> = {\n message,\n msgId,\n parentId,\n forkOf,\n headers: { ...headers },\n serial,\n };\n\n const internal: InternalNode<TMessage> = { node, insertSeq: this._seqCounter++ };\n this._nodeIndex.set(msgId, internal);\n this._addToParentIndex(parentId, msgId);\n this._insertSorted(internal);\n }\n\n delete(msgId: string): void {\n const entry = this._nodeIndex.get(msgId);\n if (!entry) return;\n\n this._logger.debug('ConversationTree.delete();', { msgId });\n\n const { node } = entry;\n\n // Clean up secondary index\n const codecKey = this._getKey(node.message);\n if (this._codecKeyIndex.get(codecKey) === msgId) {\n this._codecKeyIndex.delete(codecKey);\n }\n\n // Remove from parent index\n this._removeFromParentIndex(node.parentId, msgId);\n\n // Remove from sorted list\n this._removeSorted(entry);\n\n // Remove from primary index\n this._nodeIndex.delete(msgId);\n this._selections.delete(msgId);\n\n // Children are NOT deleted — they become unreachable in flatten()\n // because their parent is no longer on the active path.\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a ConversationTree that materializes branching history from a flat oplog.\n * @param getKey - Codec function that returns a stable key for a domain message.\n * @param logger - Logger for diagnostic output.\n * @returns A new {@link ConversationTree} instance.\n */\nexport const createConversationTree = <TMessage>(\n getKey: (message: TMessage) => string,\n logger: Logger,\n): ConversationTree<TMessage> => new DefaultConversationTree(getKey, logger);\n","/**\n * decodeHistory — load conversation history from an Ably channel and\n * return decoded messages as a PaginatedMessages result.\n *\n * Uses a fresh decoder (not shared with the live subscription) to avoid\n * state conflicts. Per-turn accumulators handle interleaved turns correctly.\n *\n * The `limit` option controls the number of **messages** returned,\n * not the number of Ably wire messages fetched. The implementation pages\n * back through Ably history until `limit` complete messages have\n * been assembled. Partial turns (incomplete at the page boundary) are\n * buffered internally and completed when `next()` fetches more pages.\n *\n * Only completed messages appear in `items`. A message is complete when\n * its terminal event (finish/abort/error) has been received.\n *\n * Because Ably history returns newest-first while the decoder requires\n * chronological order, all collected Ably messages are re-decoded from\n * oldest to newest after each page fetch. This handles turns that span\n * page boundaries correctly.\n */\n\nimport type * as Ably from 'ably';\n\nimport { HEADER_MSG_ID, HEADER_TURN_ID } from '../../constants.js';\nimport type { Logger } from '../../logger.js';\nimport { getHeaders } from '../../utils.js';\nimport type { Codec, DecoderOutput, MessageAccumulator } from '../codec/types.js';\nimport type { LoadHistoryOptions, PaginatedMessages } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Shared state across pages within one history traversal\n// ---------------------------------------------------------------------------\n\ninterface HistoryState<TEvent, TMessage> {\n codec: Codec<TEvent, TMessage>;\n /** All raw Ably messages collected so far, in newest-first order (as received from Ably). */\n rawMessages: Ably.InboundMessage[];\n /** How many completed messages have been returned to the consumer so far. */\n returnedCount: number;\n /** How many raw Ably messages have been returned to the consumer so far. */\n returnedRawCount: number;\n /** The last Ably page cursor for continued pagination. */\n lastAblyPage: Ably.PaginatedResult<Ably.InboundMessage> | undefined;\n /** Key function for domain messages (codec.getMessageKey). */\n getMessageKey: (message: TMessage) => string;\n logger: Logger;\n}\n\n/** A completed message paired with its canonical wire headers and serial. */\ninterface DecodedItem<TMessage> {\n message: TMessage;\n headers: Record<string, string>;\n /** Ably serial from the first Ably message for this domain message. */\n serial: string;\n}\n\n// ---------------------------------------------------------------------------\n// Decode all collected messages from scratch (chronological order)\n// ---------------------------------------------------------------------------\n\n/**\n * Re-decode all collected raw messages into completed domain messages.\n * @param state - The shared history traversal state.\n * @returns Completed messages in newest-first order.\n */\nconst decodeAll = <TEvent, TMessage>(state: HistoryState<TEvent, TMessage>): DecodedItem<TMessage>[] => {\n // Reverse to chronological (oldest first)\n const chronological = [...state.rawMessages].toReversed();\n\n // Fresh decoder and per-turn accumulators for each full re-decode.\n const decoder = state.codec.createDecoder();\n const turns = new Map<\n string,\n {\n accumulator: MessageAccumulator<TEvent, TMessage>;\n firstSeen: number;\n /** Headers from the first Ably message per x-ably-msg-id within this turn. */\n msgHeaders: Map<string, Record<string, string>>;\n /** Ably serial from the first Ably message per x-ably-msg-id within this turn. */\n msgSerials: Map<string, string>;\n }\n >();\n const defaultAccumulator = state.codec.createAccumulator();\n let orderCounter = 0;\n\n // Headers for discrete messages (writeMessages output), keyed by codec message key.\n const discreteHeaders = new Map<string, Record<string, string>>();\n // Serials for discrete messages, keyed by codec message key.\n const discreteSerials = new Map<string, string>();\n\n for (const msg of chronological) {\n const outputs: DecoderOutput<TEvent, TMessage>[] = decoder.decode(msg);\n const headers = getHeaders(msg);\n const turnId = headers[HEADER_TURN_ID];\n const msgId = headers[HEADER_MSG_ID];\n const serial = msg.serial;\n\n if (turnId) {\n let turn = turns.get(turnId);\n if (!turn) {\n turn = {\n accumulator: state.codec.createAccumulator(),\n firstSeen: orderCounter++,\n msgHeaders: new Map(),\n msgSerials: new Map(),\n };\n turns.set(turnId, turn);\n }\n // Capture headers per msg-id within this turn. Update on later\n // messages too (e.g. closing append overrides status from\n // \"streaming\" to \"finished\"/\"aborted\"). Only merge when the\n // incoming message has non-empty headers.\n if (msgId) {\n const existing = turn.msgHeaders.get(msgId);\n if (!existing) {\n turn.msgHeaders.set(msgId, { ...headers });\n if (serial) turn.msgSerials.set(msgId, serial);\n } else if (Object.keys(headers).length > 0) {\n Object.assign(existing, headers);\n }\n }\n turn.accumulator.processOutputs(outputs);\n } else {\n defaultAccumulator.processOutputs(outputs);\n }\n\n // Capture headers and serial for discrete messages by codec key.\n for (const output of outputs) {\n if (output.kind === 'message') {\n const key = state.getMessageKey(output.message);\n const existingDiscrete = discreteHeaders.get(key);\n if (!existingDiscrete) {\n discreteHeaders.set(key, { ...headers });\n if (serial) discreteSerials.set(key, serial);\n } else if (Object.keys(headers).length > 0) {\n Object.assign(existingDiscrete, headers);\n }\n }\n }\n }\n\n // Collect completed messages in chronological order (oldest first) by turn.\n const completed: DecodedItem<TMessage>[] = [];\n\n for (const msg of defaultAccumulator.completedMessages) {\n const key = state.getMessageKey(msg);\n completed.push({\n message: msg,\n headers: discreteHeaders.get(key) ?? {},\n serial: discreteSerials.get(key) ?? '',\n });\n }\n\n const sorted = [...turns.values()].toSorted((a, b) => a.firstSeen - b.firstSeen);\n for (const turn of sorted) {\n // Assign headers and serials to each completed message in this turn.\n // Discrete messages were already captured by codec key. Accumulated\n // messages need to be matched to the turn's per-msg-id headers.\n const claimedMsgIds = new Set<string>();\n\n // First pass: resolve discrete messages and mark their msg-ids as claimed\n const turnKeyHeaders = new Map<string, Record<string, string>>();\n const turnKeySerials = new Map<string, string>();\n for (const msg of turn.accumulator.completedMessages) {\n const key = state.getMessageKey(msg);\n const discrete = discreteHeaders.get(key);\n if (discrete) {\n turnKeyHeaders.set(key, discrete);\n const dSerial = discreteSerials.get(key);\n if (dSerial) turnKeySerials.set(key, dSerial);\n const mid = discrete[HEADER_MSG_ID];\n if (mid) claimedMsgIds.add(mid);\n }\n }\n\n // Second pass: assign unclaimed msg-id entries to remaining messages\n const unclaimedEntries = [...turn.msgHeaders.entries()].filter(([mid]) => !claimedMsgIds.has(mid));\n let unclaimedIdx = 0;\n\n for (const msg of turn.accumulator.completedMessages) {\n const key = state.getMessageKey(msg);\n const unclaimed = unclaimedEntries[unclaimedIdx];\n if (!turnKeyHeaders.has(key) && unclaimed) {\n const [mid, hdrs] = unclaimed;\n turnKeyHeaders.set(key, hdrs);\n const mSerial = turn.msgSerials.get(mid);\n if (mSerial) turnKeySerials.set(key, mSerial);\n unclaimedIdx++;\n }\n }\n\n for (const msg of turn.accumulator.completedMessages) {\n const key = state.getMessageKey(msg);\n completed.push({\n message: msg,\n headers: turnKeyHeaders.get(key) ?? {},\n serial: turnKeySerials.get(key) ?? '',\n });\n }\n }\n\n // Reverse to newest-first. The consumer slices from the front for the\n // most recent page, and progressively deeper for older pages.\n return completed.toReversed();\n};\n\n// ---------------------------------------------------------------------------\n// Fetch Ably pages until we have enough completed messages\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch Ably history pages until we have enough completed messages.\n * @param state - The shared history traversal state.\n * @param ablyPage - The current Ably paginated result to start from.\n * @param limit - Target number of completed messages beyond what has already been returned.\n */\nconst fetchUntilLimit = async <TEvent, TMessage>(\n state: HistoryState<TEvent, TMessage>,\n ablyPage: Ably.PaginatedResult<Ably.InboundMessage>,\n limit: number,\n): Promise<void> => {\n state.rawMessages.push(...ablyPage.items);\n state.lastAblyPage = ablyPage;\n\n let decodedCount = decodeAll(state).length;\n while (decodedCount < state.returnedCount + limit && ablyPage.hasNext()) {\n state.logger.debug('decodeHistory.fetchUntilLimit(); fetching next page', {\n collected: state.rawMessages.length,\n decoded: decodedCount,\n });\n const nextPage = await ablyPage.next();\n if (!nextPage) break;\n ablyPage = nextPage;\n state.rawMessages.push(...nextPage.items);\n state.lastAblyPage = nextPage;\n decodedCount = decodeAll(state).length;\n }\n};\n\n// ---------------------------------------------------------------------------\n// Build PaginatedMessages result from current state\n// ---------------------------------------------------------------------------\n\n/**\n * Build a PaginatedMessages page from the current decode state.\n * @param state - The shared history traversal state.\n * @param limit - Max messages per page.\n * @returns A page of decoded messages with a `next()` cursor.\n */\nconst buildResult = <TEvent, TMessage>(\n state: HistoryState<TEvent, TMessage>,\n limit: number,\n): PaginatedMessages<TMessage> => {\n // allCompleted is newest-first. Slice from returnedCount for this page,\n // then reverse to chronological for display.\n const allCompleted = decodeAll(state);\n\n const pageSlice = allCompleted.slice(state.returnedCount, state.returnedCount + limit);\n const chronSlice = [...pageSlice].toReversed();\n state.returnedCount += pageSlice.length;\n\n const moreCompleted = allCompleted.length > state.returnedCount;\n const moreAblyPages = state.lastAblyPage?.hasNext() ?? false;\n\n // Raw Ably messages for this page in chronological order.\n const newRawCount = state.rawMessages.length - state.returnedRawCount;\n const rawSlice = newRawCount > 0 ? state.rawMessages.slice(state.returnedRawCount).toReversed() : [];\n state.returnedRawCount = state.rawMessages.length;\n\n return {\n items: chronSlice.map((d) => d.message),\n itemHeaders: chronSlice.map((d) => d.headers),\n itemSerials: chronSlice.map((d) => d.serial),\n rawMessages: rawSlice,\n hasNext: () => moreCompleted || moreAblyPages,\n next: async () => {\n if (moreCompleted) {\n return buildResult(state, limit);\n }\n if (!moreAblyPages || !state.lastAblyPage) return;\n const nextAbly = await state.lastAblyPage.next();\n if (!nextAbly) return;\n await fetchUntilLimit(state, nextAbly, limit);\n return buildResult(state, limit);\n },\n };\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Load conversation history from a channel and return decoded messages.\n *\n * Attaches the channel if not already attached, then calls\n * `channel.history({ untilAttach: true })` to guarantee no gap between\n * historical and live messages. The attach is idempotent.\n *\n * The `limit` option controls the number of complete messages\n * returned per page, not the number of Ably wire messages fetched.\n * @param channel - The Ably channel to load history from.\n * @param codec - The codec for decoding wire messages into domain messages.\n * @param options - Pagination options.\n * @param logger - Logger for diagnostic output.\n * @returns The first page of decoded history messages.\n */\n// Spec: AIT-CT11, AIT-CT11b\nexport const decodeHistory = async <TEvent, TMessage>(\n channel: Ably.RealtimeChannel,\n codec: Codec<TEvent, TMessage>,\n options: LoadHistoryOptions | undefined,\n logger: Logger,\n): Promise<PaginatedMessages<TMessage>> => {\n const limit = options?.limit ?? 100;\n const state: HistoryState<TEvent, TMessage> = {\n codec,\n rawMessages: [],\n returnedCount: 0,\n returnedRawCount: 0,\n lastAblyPage: undefined,\n getMessageKey: codec.getMessageKey.bind(codec),\n logger,\n };\n\n logger.trace('decodeHistory();', { limit });\n\n // Request more Ably messages than the domain limit to account for\n // the many-to-one ratio (multiple wire messages per message).\n const wireLimit = limit * 10;\n\n await channel.attach();\n const ablyPage = await channel.history({ untilAttach: true, limit: wireLimit });\n await fetchUntilLimit(state, ablyPage, limit);\n return buildResult(state, limit);\n};\n","/**\n * Transport header builder.\n *\n * Single source of truth for which `x-ably-*` headers every transport\n * message carries. Used by the server transport (addMessages, streamResponse)\n * and will be used by the client transport (optimistic message stamping).\n */\n\nimport {\n HEADER_FORK_OF,\n HEADER_MSG_ID,\n HEADER_PARENT,\n HEADER_ROLE,\n HEADER_TURN_CLIENT_ID,\n HEADER_TURN_ID,\n} from '../../constants.js';\n\n/**\n * Build the standard transport header set for a message.\n * @param opts - The header values to include.\n * @param opts.role - Message role (e.g. \"user\", \"assistant\").\n * @param opts.turnId - Turn correlation ID.\n * @param opts.msgId - Message identity.\n * @param opts.turnClientId - ClientId of the turn initiator.\n * @param opts.parent - Preceding message's msg-id (for branching). Null means root.\n * @param opts.forkOf - Forked message's msg-id (for edit/regen).\n * @returns A headers record with the `x-ably-*` transport headers set.\n */\nexport const buildTransportHeaders = (opts: {\n role: string;\n turnId: string;\n msgId: string;\n turnClientId?: string;\n parent?: string | null;\n forkOf?: string;\n}): Record<string, string> => {\n const h: Record<string, string> = {\n [HEADER_ROLE]: opts.role,\n [HEADER_TURN_ID]: opts.turnId,\n [HEADER_MSG_ID]: opts.msgId,\n };\n if (opts.turnClientId !== undefined) h[HEADER_TURN_CLIENT_ID] = opts.turnClientId;\n if (opts.parent) h[HEADER_PARENT] = opts.parent;\n if (opts.forkOf) h[HEADER_FORK_OF] = opts.forkOf;\n return h;\n};\n","/**\n * Client-side stream routing.\n *\n * Maintains a map of turnId to ReadableStreamController. Routes decoded events\n * to the correct stream. Closes streams on terminal events or explicit close.\n */\n\nimport * as Ably from 'ably';\n\nimport { ErrorCode } from '../../errors.js';\nimport type { Logger } from '../../logger.js';\nimport type { TurnEntry } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Interface\n// ---------------------------------------------------------------------------\n\n/** Routes decoded events to the correct turn's ReadableStream. */\nexport interface StreamRouter<TEvent> {\n /** Register a new stream for a turnId. Returns the ReadableStream the consumer reads from. */\n createStream(turnId: string): ReadableStream<TEvent>;\n /** Close the stream for a turnId. Returns true if a stream was closed. */\n closeStream(turnId: string): boolean;\n /** Enqueue an event to the correct stream. Returns true if routed successfully. */\n route(turnId: string, event: TEvent): boolean;\n /** Whether a specific turnId has an active stream. */\n has(turnId: string): boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CT14\nclass DefaultStreamRouter<TEvent> implements StreamRouter<TEvent> {\n private readonly _turns = new Map<string, TurnEntry<TEvent>>();\n private readonly _isTerminal: (event: TEvent) => boolean;\n private readonly _logger: Logger;\n\n constructor(isTerminal: (event: TEvent) => boolean, logger: Logger) {\n this._isTerminal = isTerminal;\n this._logger = logger;\n }\n\n createStream(turnId: string): ReadableStream<TEvent> {\n this._logger.trace('StreamRouter.createStream();', { turnId });\n\n // Build stream+controller together. ReadableStream's start() runs synchronously\n // per spec, so the controller is captured before the constructor returns.\n const entry: { controller?: ReadableStreamDefaultController<TEvent> } = {};\n const stream = new ReadableStream<TEvent>({\n start(controller) {\n entry.controller = controller;\n },\n });\n if (!entry.controller) {\n throw new Ably.ErrorInfo(\n 'unable to create stream; ReadableStream start() was not called synchronously',\n ErrorCode.TransportSubscriptionError,\n 500,\n );\n }\n this._turns.set(turnId, { controller: entry.controller, turnId });\n return stream;\n }\n\n // Spec: AIT-CT14b\n closeStream(turnId: string): boolean {\n const turn = this._turns.get(turnId);\n if (!turn) return false;\n\n this._logger.debug('StreamRouter.closeStream(); closing stream', { turnId });\n try {\n turn.controller.close();\n } catch {\n /* already closed */\n }\n this._turns.delete(turnId);\n return true;\n }\n\n // Spec: AIT-CT14a\n route(turnId: string, event: TEvent): boolean {\n const turn = this._turns.get(turnId);\n if (!turn) return false;\n\n try {\n turn.controller.enqueue(event);\n } catch {\n this._turns.delete(turnId);\n return false;\n }\n\n if (this._isTerminal(event)) {\n this.closeStream(turnId);\n }\n return true;\n }\n\n has(turnId: string): boolean {\n return this._turns.has(turnId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a StreamRouter that routes decoded events to per-turn ReadableStreams.\n * @param isTerminal - Predicate that returns true for events that close the stream.\n * @param logger - Logger for diagnostic output.\n * @returns A new {@link StreamRouter} instance.\n */\nexport const createStreamRouter = <TEvent>(\n isTerminal: (event: TEvent) => boolean,\n logger: Logger,\n): StreamRouter<TEvent> => new DefaultStreamRouter(isTerminal, logger);\n","/**\n * Core client-side transport, parameterized by codec.\n *\n * Composes StreamRouter and ConversationTree to handle the full client-side\n * lifecycle. Subscribes to the Ably channel on construction. The same\n * subscription, decoder, and channel are reused across turns.\n *\n * The client never publishes user messages directly. Instead, it sends them\n * to the server via HTTP POST. The server publishes user messages and turn\n * lifecycle events (turn-start, turn-end) on behalf of the client.\n */\n\nimport * as Ably from 'ably';\n\nimport {\n EVENT_CANCEL,\n EVENT_TURN_END,\n EVENT_TURN_START,\n HEADER_CANCEL_ALL,\n HEADER_CANCEL_CLIENT_ID,\n HEADER_CANCEL_OWN,\n HEADER_CANCEL_TURN_ID,\n HEADER_MSG_ID,\n HEADER_PARENT,\n HEADER_ROLE,\n HEADER_TURN_CLIENT_ID,\n HEADER_TURN_ID,\n HEADER_TURN_REASON,\n} from '../../constants.js';\nimport { ErrorCode } from '../../errors.js';\nimport { EventEmitter } from '../../event-emitter.js';\nimport type { Logger } from '../../logger.js';\nimport { LogLevel, makeLogger } from '../../logger.js';\nimport { getHeaders } from '../../utils.js';\nimport type { DecoderOutput, MessageAccumulator, StreamDecoder } from '../codec/types.js';\nimport { createConversationTree } from './conversation-tree.js';\nimport { decodeHistory } from './decode-history.js';\nimport { buildTransportHeaders } from './headers.js';\nimport type { StreamRouter } from './stream-router.js';\nimport { createStreamRouter } from './stream-router.js';\nimport type {\n ActiveTurn,\n CancelFilter,\n ClientTransport,\n ClientTransportOptions,\n CloseOptions,\n ConversationTree,\n LoadHistoryOptions,\n MessageWithHeaders,\n PaginatedMessages,\n SendOptions,\n TurnEndReason,\n TurnLifecycleEvent,\n} from './types.js';\n\n/**\n * Returned from `on()` when the transport is already closed — the subscription\n * is silently ignored since no further events will fire.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-function -- intentional no-op\nconst noopUnsubscribe = (): void => {};\n\n// ---------------------------------------------------------------------------\n// Event map for the transport's typed EventEmitter\n// ---------------------------------------------------------------------------\n\ninterface ClientTransportEventsMap {\n message: undefined;\n turn: TurnLifecycleEvent;\n error: Ably.ErrorInfo;\n 'ably-message': undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Per-turn observer state — consolidated to avoid parallel-map bookkeeping\n// ---------------------------------------------------------------------------\n\ninterface TurnObserverState<TEvent, TMessage> {\n headers: Record<string, string>;\n serial: string | undefined;\n accumulator: MessageAccumulator<TEvent, TMessage>;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CT1\nclass DefaultClientTransport<TEvent, TMessage> implements ClientTransport<TEvent, TMessage> {\n private readonly _channel: Ably.RealtimeChannel;\n private readonly _codec: ClientTransportOptions<TEvent, TMessage>['codec'];\n private readonly _clientId: string | undefined;\n private readonly _api: string;\n private readonly _credentials: RequestCredentials | undefined;\n private readonly _headersFn: (() => Record<string, string>) | undefined;\n private readonly _bodyFn: (() => Record<string, unknown>) | undefined;\n private readonly _fetchFn: typeof globalThis.fetch;\n private readonly _logger: Logger;\n\n // Typed event emitter for all transport events\n private readonly _emitter: EventEmitter<ClientTransportEventsMap>;\n\n // Relay detection — tracks msg-ids of optimistic inserts for reconciliation\n private readonly _ownMsgIds = new Set<string>();\n private readonly _ownTurnIds = new Set<string>();\n\n // Track clientId per turn for getActiveTurnIds()\n private readonly _turnClientIds = new Map<string, string>();\n // Track msgIds per turn for cleanup on turn-end\n private readonly _turnMsgIds = new Map<string, Set<string>>();\n\n // Per-turn observer state: headers, serial, and accumulator in one map.\n // A single .delete(turnId) cleans up all three.\n private readonly _turnObservers = new Map<string, TurnObserverState<TEvent, TMessage>>();\n\n // Raw Ably message log\n private readonly _ablyMessages: Ably.InboundMessage[] = [];\n\n // History pagination: withheld messages hidden from getMessages()\n private readonly _withheldKeys = new Set<string>();\n\n // Sub-components\n private readonly _tree: ConversationTree<TMessage>;\n private readonly _router: StreamRouter<TEvent>;\n private readonly _decoder: StreamDecoder<TEvent, TMessage>;\n\n // Channel subscription — subscribe() returns a Promise that resolves when the channel attaches\n private readonly _attachPromise: Promise<unknown>;\n private readonly _onMessage: (msg: Ably.InboundMessage) => void;\n\n private _closed = false;\n\n constructor(options: ClientTransportOptions<TEvent, TMessage>) {\n this._channel = options.channel;\n this._codec = options.codec;\n this._clientId = options.clientId;\n this._api = options.api ?? '/api/chat';\n this._credentials = options.credentials;\n this._headersFn =\n typeof options.headers === 'function'\n ? options.headers\n : options.headers\n ? () => options.headers as Record<string, string>\n : undefined;\n this._bodyFn =\n typeof options.body === 'function'\n ? options.body\n : options.body\n ? () => options.body as Record<string, unknown>\n : undefined;\n this._fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this._logger = (options.logger ?? makeLogger({ logLevel: LogLevel.Silent })).withContext({\n component: 'ClientTransport',\n });\n\n this._emitter = new EventEmitter<ClientTransportEventsMap>(this._logger);\n\n // Compose sub-components\n this._tree = createConversationTree<TMessage>(this._codec.getMessageKey.bind(this._codec), this._logger);\n this._router = createStreamRouter<TEvent>(this._codec.isTerminal.bind(this._codec), this._logger);\n this._decoder = this._codec.createDecoder();\n\n // Seed tree with initial messages\n if (options.messages) {\n let prevMsgId: string | undefined;\n for (const msg of options.messages) {\n const msgId = this._codec.getMessageKey(msg);\n const seedHeaders: Record<string, string> = {};\n if (prevMsgId) seedHeaders[HEADER_PARENT] = prevMsgId;\n this._tree.upsert(msgId, msg, seedHeaders);\n prevMsgId = msgId;\n }\n this._emitter.emit('message');\n }\n\n // Spec: AIT-CT2\n // Subscribe before attach (RTL7g)\n this._onMessage = (ablyMessage: Ably.InboundMessage) => {\n this._handleMessage(ablyMessage);\n };\n this._attachPromise = this._channel.subscribe(this._onMessage);\n }\n\n // ---------------------------------------------------------------------------\n // Message subscription handler\n // ---------------------------------------------------------------------------\n\n private _handleMessage(ablyMessage: Ably.InboundMessage): void {\n if (this._closed) return;\n\n this._ablyMessages.push(ablyMessage);\n this._emitter.emit('ably-message');\n\n try {\n // Spec: AIT-CT16a\n // --- Turn lifecycle events from the server ---\n if (ablyMessage.name === EVENT_TURN_START) {\n const headers = getHeaders(ablyMessage);\n const turnId = headers[HEADER_TURN_ID];\n const turnCid = headers[HEADER_TURN_CLIENT_ID] ?? '';\n if (turnId) {\n this._turnClientIds.set(turnId, turnCid);\n this._emitter.emit('turn', { type: EVENT_TURN_START, turnId, clientId: turnCid });\n }\n return;\n }\n\n if (ablyMessage.name === EVENT_TURN_END) {\n const headers = getHeaders(ablyMessage);\n const turnId = headers[HEADER_TURN_ID];\n const turnCid = headers[HEADER_TURN_CLIENT_ID] ?? '';\n // CAST: server always writes a valid TurnEndReason; default to 'complete' for robustness\n const reason = (headers[HEADER_TURN_REASON] ?? 'complete') as TurnEndReason;\n if (turnId) {\n this._router.closeStream(turnId);\n this._turnObservers.delete(turnId);\n this._turnClientIds.delete(turnId);\n // Clean up per-turn relay-detection state\n const msgIds = this._turnMsgIds.get(turnId);\n if (msgIds) {\n for (const mid of msgIds) this._ownMsgIds.delete(mid);\n this._turnMsgIds.delete(turnId);\n }\n this._ownTurnIds.delete(turnId);\n this._emitter.emit('turn', { type: EVENT_TURN_END, turnId, clientId: turnCid, reason });\n }\n return;\n }\n\n // --- Codec-decoded messages ---\n const outputs = this._decoder.decode(ablyMessage);\n const headers = getHeaders(ablyMessage);\n const serial = ablyMessage.serial;\n\n // Always update observer headers, even when the decoder produces no outputs.\n // This ensures header transitions (e.g. x-ably-status: streaming → aborted)\n // are captured for events that the decoder suppresses (AIT-CD8: aborted\n // stream appends emit no events but still carry the updated status header).\n const turnId = headers[HEADER_TURN_ID];\n if (turnId) {\n this._updateTurnObserverHeaders(turnId, headers, serial);\n }\n\n for (const output of outputs) {\n if (output.kind === 'message') {\n this._handleMessageOutput(output.message, headers, serial, ablyMessage.action);\n } else {\n this._handleEventOutput(output, headers);\n }\n }\n } catch (error) {\n const cause = error instanceof Ably.ErrorInfo ? error : undefined;\n this._emitter.emit(\n 'error',\n new Ably.ErrorInfo(\n `unable to process channel message; ${error instanceof Error ? error.message : String(error)}`,\n ErrorCode.TransportSubscriptionError,\n 500,\n cause,\n ),\n );\n }\n }\n\n /**\n * Handle a decoded domain message (user message create or relayed own message).\n * @param message - The decoded domain message.\n * @param headers - Ably headers from the wire message.\n * @param serial - Ably serial for tree ordering.\n * @param action - Ably message action (e.g. 'message.create').\n */\n private _handleMessageOutput(\n message: TMessage,\n headers: Record<string, string>,\n serial: string | undefined,\n action: string | undefined,\n ): void {\n // Spec: AIT-CT15\n const msgId = headers[HEADER_MSG_ID];\n if (msgId && this._ownMsgIds.has(msgId)) {\n // Relayed own message — reconcile optimistic entry with server-assigned fields\n this._upsertAndNotify(message, headers, serial);\n return;\n }\n\n if (action === 'message.create') {\n this._upsertAndNotify(message, headers, serial);\n }\n }\n\n /**\n * Handle a decoded streaming event: route to own-turn stream or accumulate for observer.\n * @param output - The decoded event output from the codec.\n * @param headers - Ably headers from the wire message.\n */\n private _handleEventOutput(output: DecoderOutput<TEvent, TMessage>, headers: Record<string, string>): void {\n if (output.kind !== 'event') return;\n const event = output.event;\n const turnId = headers[HEADER_TURN_ID];\n if (!turnId) return;\n\n // Observer headers are already updated in _handleMessage (before outputs\n // are iterated) so that header transitions are captured even when the\n // decoder produces no outputs (e.g. aborted stream appends per AIT-CD8).\n\n // Active own turn — route to the ReadableStream\n if (this._router.route(turnId, event)) {\n this._accumulateAndEmit(turnId, output);\n if (this._codec.isTerminal(event)) this._turnObservers.delete(turnId);\n return;\n }\n\n // Completed own turn — late arrival, skip\n if (this._ownTurnIds.has(turnId) && !this._turnObservers.has(turnId)) return;\n\n // Spec: AIT-CT16\n // Observer turn — accumulate and emit\n this._accumulateAndEmit(turnId, output);\n if (this._codec.isTerminal(event)) this._turnObservers.delete(turnId);\n }\n\n // ---------------------------------------------------------------------------\n // Tree mutation + notification helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Upsert a message into the tree and notify subscribers.\n * @param message - The domain message to insert or update.\n * @param headers - Ably headers for the message.\n * @param serial - Ably serial for tree ordering.\n */\n private _upsertAndNotify(message: TMessage, headers: Record<string, string>, serial?: string): void {\n const key = this._codec.getMessageKey(message);\n const msgId = headers[HEADER_MSG_ID] ?? key;\n this._tree.upsert(msgId, message, headers, serial);\n this._emitter.emit('message');\n }\n\n // ---------------------------------------------------------------------------\n // Observer accumulation\n // ---------------------------------------------------------------------------\n\n /**\n * Ensure a TurnObserverState exists for turnId, updating headers and serial as new events arrive.\n * @param turnId - The turn to track.\n * @param headers - Headers from the current event.\n * @param serial - Ably serial from the current event.\n */\n private _updateTurnObserverHeaders(\n turnId: string,\n headers: Record<string, string>,\n serial: string | undefined,\n ): void {\n const existing = this._turnObservers.get(turnId);\n if (existing) {\n if (Object.keys(headers).length > 0) {\n Object.assign(existing.headers, headers);\n }\n // Always advance the serial so the tree node sorts after all\n // earlier messages in the turn (e.g. user-message relays that\n // arrive before the assistant response).\n if (serial !== undefined) {\n existing.serial = serial;\n }\n } else {\n this._turnObservers.set(turnId, {\n headers: { ...headers },\n serial,\n accumulator: this._codec.createAccumulator(),\n });\n }\n }\n\n /**\n * Process a streaming event through the turn's accumulator and emit the latest message.\n * @param turnId - The turn this event belongs to.\n * @param output - The decoded event output to accumulate.\n */\n private _accumulateAndEmit(turnId: string, output: DecoderOutput<TEvent, TMessage>): void {\n const observer = this._turnObservers.get(turnId);\n if (!observer) return;\n\n observer.accumulator.processOutputs([output]);\n\n const messages = observer.accumulator.messages;\n if (messages.length === 0) return;\n\n let message: TMessage | undefined;\n try {\n message = structuredClone(messages.at(-1));\n } catch {\n // CAST: structuredClone can fail if the message contains non-cloneable\n // values (e.g. functions). Fall back to the reference — the tree upsert\n // below copies headers independently, so shared message state is the\n // only risk. Accumulator messages are replaced on each event, so\n // mutation between events is not a practical concern.\n message = messages.at(-1);\n }\n\n if (message) {\n this._tree.upsert(\n observer.headers[HEADER_MSG_ID] ?? this._codec.getMessageKey(message),\n message,\n { ...observer.headers },\n observer.serial,\n );\n this._emitter.emit('message');\n }\n }\n\n // ---------------------------------------------------------------------------\n // Cancel helpers\n // ---------------------------------------------------------------------------\n\n private async _publishCancel(filter: CancelFilter): Promise<void> {\n this._logger.trace('ClientTransport._publishCancel();', { filter });\n\n const headers: Record<string, string> = {};\n if (filter.turnId) {\n headers[HEADER_CANCEL_TURN_ID] = filter.turnId;\n } else if (filter.own) {\n headers[HEADER_CANCEL_OWN] = 'true';\n } else if (filter.clientId) {\n headers[HEADER_CANCEL_CLIENT_ID] = filter.clientId;\n } else if (filter.all) {\n headers[HEADER_CANCEL_ALL] = 'true';\n }\n\n await this._channel.publish({\n name: EVENT_CANCEL,\n extras: { headers },\n });\n }\n\n private _closeMatchingTurnStreams(filter: CancelFilter): void {\n // Only close the router streams here — do NOT clear _turnObservers.\n // The observer must remain alive so that late server events (e.g. abort,\n // x-ably-status: aborted) arriving before turn-end are still accumulated\n // into the message store. The turn-end handler cleans up observers.\n if (filter.all) {\n for (const turnId of this._ownTurnIds) {\n this._router.closeStream(turnId);\n }\n } else if (filter.own) {\n for (const tid of this._ownTurnIds) {\n this._router.closeStream(tid);\n }\n } else if (filter.clientId) {\n for (const [tid, cid] of this._turnClientIds) {\n if (cid === filter.clientId) {\n this._router.closeStream(tid);\n }\n }\n } else if (filter.turnId) {\n this._router.closeStream(filter.turnId);\n }\n }\n\n private _getMatchingTurnIds(filter: CancelFilter): Set<string> {\n const matched = new Set<string>();\n if (filter.all) {\n for (const turnId of this._turnClientIds.keys()) matched.add(turnId);\n } else if (filter.own) {\n for (const [turnId, cid] of this._turnClientIds) {\n if (cid === this._clientId) matched.add(turnId);\n }\n } else if (filter.clientId) {\n for (const [turnId, cid] of this._turnClientIds) {\n if (cid === filter.clientId) matched.add(turnId);\n }\n } else if (filter.turnId && this._turnClientIds.has(filter.turnId)) {\n matched.add(filter.turnId);\n }\n return matched;\n }\n\n // ---------------------------------------------------------------------------\n // Input message helpers\n // ---------------------------------------------------------------------------\n\n private _getMessagesWithHeaders(): MessageWithHeaders<TMessage>[] {\n return this._tree.flatten().map((m) => ({\n message: m,\n headers: this.getMessageHeaders(m),\n }));\n }\n\n /**\n * Compute truncated history: everything before the target message.\n * Used by regenerate so the LLM doesn't see the response being replaced.\n * @param messageId - The msg-id to truncate history before.\n * @returns Input messages preceding the target.\n */\n private _getHistoryBefore(messageId: string): MessageWithHeaders<TMessage>[] {\n const all = this._getMessagesWithHeaders();\n const idx = all.findIndex((inp) => inp.headers?.[HEADER_MSG_ID] === messageId);\n return idx === -1 ? all : all.slice(0, idx);\n }\n\n // ---------------------------------------------------------------------------\n // History pagination helpers\n // ---------------------------------------------------------------------------\n\n private _processHistoryPage(page: PaginatedMessages<TMessage>): void {\n for (const [i, message] of page.items.entries()) {\n const headers = page.itemHeaders?.[i] ?? {};\n const serial = page.itemSerials?.[i];\n const key = this._codec.getMessageKey(message);\n const msgId = headers[HEADER_MSG_ID] ?? key;\n this._tree.upsert(msgId, message, headers, serial);\n }\n this._emitter.emit('message');\n\n // Prepend raw Ably messages (older messages go at the beginning)\n if (page.rawMessages && page.rawMessages.length > 0) {\n this._ablyMessages.unshift(...page.rawMessages);\n this._emitter.emit('ably-message');\n }\n }\n\n private async _loadUntilVisible(\n firstPage: PaginatedMessages<TMessage>,\n target: number,\n beforeKeys: Set<string>,\n ): Promise<{ newVisible: TMessage[]; lastPage: PaginatedMessages<TMessage> }> {\n this._processHistoryPage(firstPage);\n let page = firstPage;\n\n const newVisibleCount = (): number => {\n let count = 0;\n for (const m of this._tree.flatten()) {\n if (!beforeKeys.has(this._codec.getMessageKey(m))) count++;\n }\n return count;\n };\n\n while (newVisibleCount() < target && page.hasNext()) {\n const nextPage = await page.next();\n if (!nextPage) break;\n this._processHistoryPage(nextPage);\n page = nextPage;\n }\n\n const newVisible = this._tree.flatten().filter((m) => !beforeKeys.has(this._codec.getMessageKey(m)));\n return { newVisible, lastPage: page };\n }\n\n private _releaseWithheld(messages: TMessage[]): void {\n for (const m of messages) {\n this._withheldKeys.delete(this._codec.getMessageKey(m));\n }\n if (messages.length > 0) {\n this._emitter.emit('message');\n }\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n // Spec: AIT-CT3, AIT-CT4\n async send(input: TMessage | TMessage[], sendOptions?: SendOptions): Promise<ActiveTurn<TEvent>> {\n if (this._closed) {\n throw new Ably.ErrorInfo('unable to send; transport is closed', ErrorCode.TransportClosed, 400);\n }\n await this._attachPromise;\n // CAST: re-check after await — close() may have been called while waiting for attach.\n // TypeScript's control flow narrows _closed to false after the first check, but the\n // await yields and close() can mutate _closed concurrently.\n if (this._closed as boolean) {\n throw new Ably.ErrorInfo('unable to send; transport is closed', ErrorCode.TransportClosed, 400);\n }\n\n this._logger.trace('ClientTransport.send();');\n\n const msgs = Array.isArray(input) ? input : [input];\n const turnId = crypto.randomUUID();\n this._ownTurnIds.add(turnId);\n\n const msgIds = new Set<string>();\n const postMessages: { message: TMessage; headers: Record<string, string> }[] = [];\n\n // Capture history BEFORE optimistic inserts. The optimistic messages are\n // sent in the `messages` field — including them in `history` too would\n // cause the server to see them twice.\n const preInsertHistory = this._getMessagesWithHeaders();\n\n // Spec: AIT-CT3d\n // Auto-compute parent from the current thread if not explicitly provided\n let autoParent: string | undefined;\n if (sendOptions?.parent === undefined && !sendOptions?.forkOf) {\n const flat = this._tree.flatten();\n if (flat.length > 0) {\n const lastMsg = flat.at(-1);\n if (lastMsg) {\n const lastKey = this._codec.getMessageKey(lastMsg);\n const lastNode = this._tree.getNodeByKey(lastKey);\n autoParent = lastNode?.msgId ?? lastKey;\n }\n }\n }\n\n // Capture the first parent for the POST body before the loop advances it.\n const postParent = sendOptions?.parent === undefined ? autoParent : sendOptions.parent;\n\n for (const message of msgs) {\n const msgId = crypto.randomUUID();\n this._ownMsgIds.add(msgId);\n msgIds.add(msgId);\n\n const resolvedParent = sendOptions?.parent === undefined ? autoParent : (sendOptions.parent ?? undefined);\n\n const optimisticHeaders = buildTransportHeaders({\n role: 'user',\n turnId,\n msgId,\n turnClientId: this._clientId,\n parent: resolvedParent,\n forkOf: sendOptions?.forkOf,\n });\n // Spec: AIT-CT3c\n // Optimistically insert each user message into the tree\n this._upsertAndNotify(message, optimisticHeaders);\n\n // Include per-message parent so the server chains messages correctly.\n const postHeaders: Record<string, string> = { [HEADER_MSG_ID]: msgId, [HEADER_ROLE]: 'user' };\n if (resolvedParent) postHeaders[HEADER_PARENT] = resolvedParent;\n postMessages.push({ message, headers: postHeaders });\n\n // Spec: AIT-CT3e\n // Chain: each subsequent message in the batch parents off the previous\n // one, forming a linear conversation thread rather than siblings.\n if (sendOptions?.parent === undefined && !sendOptions?.forkOf) {\n autoParent = msgId;\n }\n }\n\n this._turnMsgIds.set(turnId, msgIds);\n\n // Create ReadableStream via router\n const stream = this._router.createStream(turnId);\n\n // Resolve headers and body\n const resolvedHeaders = this._headersFn?.() ?? {};\n const resolvedBody = this._bodyFn?.() ?? {};\n\n const postBody: Record<string, unknown> = {\n ...resolvedBody,\n history: preInsertHistory,\n ...sendOptions?.body,\n turnId,\n clientId: this._clientId,\n messages: postMessages,\n ...(sendOptions?.forkOf !== undefined && { forkOf: sendOptions.forkOf }),\n ...(postParent !== undefined && { parent: postParent }),\n };\n\n const postHeaders: Record<string, string> = {\n ...resolvedHeaders,\n ...sendOptions?.headers,\n };\n\n // Spec: AIT-CT3a, AIT-CT3b\n // Fire-and-forget: POST must not block the stream return to the caller.\n // .catch() is intentional — async/await would delay stream availability.\n this._fetchFn(this._api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...postHeaders,\n },\n body: JSON.stringify(postBody),\n ...(this._credentials ? { credentials: this._credentials } : {}),\n })\n .then((response) => {\n if (!response.ok) {\n this._emitter.emit(\n 'error',\n new Ably.ErrorInfo(\n `unable to send; HTTP POST to ${this._api} returned ${String(response.status)} ${response.statusText}`,\n ErrorCode.TransportSendFailed,\n response.status,\n ),\n );\n this._router.closeStream(turnId);\n }\n })\n .catch((error: unknown) => {\n const cause = error instanceof Ably.ErrorInfo ? error : undefined;\n this._emitter.emit(\n 'error',\n new Ably.ErrorInfo(\n `unable to send; HTTP POST to ${this._api} failed: ${error instanceof Error ? error.message : String(error)}`,\n ErrorCode.TransportSendFailed,\n 500,\n cause,\n ),\n );\n this._router.closeStream(turnId);\n });\n\n return {\n stream,\n turnId,\n cancel: async () => this.cancel({ turnId }),\n };\n }\n\n // Spec: AIT-CT5\n async regenerate(messageId: string, sendOptions?: SendOptions): Promise<ActiveTurn<TEvent>> {\n this._logger.trace('ClientTransport.regenerate();', { messageId });\n\n const node = this._tree.getNode(messageId);\n const parentId = node?.parentId;\n\n return this.send([], {\n ...sendOptions,\n body: {\n history: this._getHistoryBefore(messageId),\n ...sendOptions?.body,\n },\n forkOf: messageId,\n parent: parentId,\n });\n }\n\n // Spec: AIT-CT6\n async edit(\n messageId: string,\n newMessages: TMessage | TMessage[],\n sendOptions?: SendOptions,\n ): Promise<ActiveTurn<TEvent>> {\n this._logger.trace('ClientTransport.edit();', { messageId });\n\n const node = this._tree.getNode(messageId);\n const parentId = node?.parentId;\n\n return this.send(newMessages, {\n ...sendOptions,\n body: {\n history: this._getHistoryBefore(messageId),\n ...sendOptions?.body,\n },\n forkOf: messageId,\n parent: parentId,\n });\n }\n\n // Spec: AIT-CT7, AIT-CT7a\n async cancel(filter?: CancelFilter): Promise<void> {\n if (this._closed) return;\n const resolved = filter ?? { own: true };\n this._logger.debug('ClientTransport.cancel();', { filter: resolved });\n await this._publishCancel(resolved);\n this._closeMatchingTurnStreams(resolved);\n }\n\n // Spec: AIT-CT18\n async waitForTurn(filter?: CancelFilter): Promise<void> {\n if (this._closed) return;\n const resolved = filter ?? { own: true };\n const remaining = this._getMatchingTurnIds(resolved);\n if (remaining.size === 0) return;\n\n this._logger.debug('ClientTransport.waitForTurn();', { turnIds: [...remaining] });\n\n return new Promise<void>((resolve) => {\n const handler = (event: TurnLifecycleEvent): void => {\n if (event.type !== EVENT_TURN_END) return;\n remaining.delete(event.turnId);\n if (remaining.size === 0) {\n this._emitter.off('turn', handler);\n resolve();\n }\n };\n this._emitter.on('turn', handler);\n });\n }\n\n // Spec: AIT-CT8, AIT-CT8a, AIT-CT8b, AIT-CT8c, AIT-CT8d\n on(event: 'message' | 'ably-message', handler: () => void): () => void;\n on(event: 'turn', handler: (event: TurnLifecycleEvent) => void): () => void;\n on(event: 'error', handler: (error: Ably.ErrorInfo) => void): () => void;\n on(\n eventName: 'message' | 'turn' | 'error' | 'ably-message',\n handler: (() => void) | ((event: TurnLifecycleEvent) => void) | ((error: Ably.ErrorInfo) => void),\n ): () => void {\n if (this._closed) return noopUnsubscribe;\n // CAST: the overload signatures enforce correct handler types per event name.\n // The implementation must cast to satisfy the EventEmitter's generic callback type.\n const cb = handler as (arg: ClientTransportEventsMap[keyof ClientTransportEventsMap]) => void;\n this._emitter.on(eventName, cb);\n return () => {\n this._emitter.off(eventName, cb);\n };\n }\n\n // Spec: AIT-CT10\n getTree(): ConversationTree<TMessage> {\n return this._tree;\n }\n\n // Spec: AIT-CT17\n getActiveTurnIds(): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n for (const [turnId, cid] of this._turnClientIds) {\n let set = result.get(cid);\n if (!set) {\n set = new Set();\n result.set(cid, set);\n }\n set.add(turnId);\n }\n return result;\n }\n\n getMessageHeaders(message: TMessage): Record<string, string> | undefined {\n const key = this._codec.getMessageKey(message);\n return this._tree.getNodeByKey(key)?.headers;\n }\n\n // Spec: AIT-CT9\n getMessages(): TMessage[] {\n if (this._withheldKeys.size === 0) return this._tree.flatten();\n return this._tree.flatten().filter((m) => !this._withheldKeys.has(this._codec.getMessageKey(m)));\n }\n\n getMessagesWithHeaders(): MessageWithHeaders<TMessage>[] {\n return this._getMessagesWithHeaders();\n }\n\n getAblyMessages(): Ably.InboundMessage[] {\n return [...this._ablyMessages];\n }\n\n // Spec: AIT-CT11, AIT-CT11a, AIT-CT11b, AIT-CT11c\n async history(opts?: LoadHistoryOptions): Promise<PaginatedMessages<TMessage>> {\n if (this._closed) {\n throw new Ably.ErrorInfo('unable to load history; transport is closed', ErrorCode.TransportClosed, 400);\n }\n this._logger.trace('ClientTransport.history();', { limit: opts?.limit });\n const limit = opts?.limit ?? 100;\n\n // Snapshot before loading — everything already in the tree stays visible\n const beforeKeys = new Set(this._tree.flatten().map((m) => this._codec.getMessageKey(m)));\n\n let lastPage = await decodeHistory(this._channel, this._codec, opts, this._logger);\n\n const initial = await this._loadUntilVisible(lastPage, limit, beforeKeys);\n lastPage = initial.lastPage;\n\n // newVisible is chronological (oldest-first from flatten).\n // For \"load older\" pagination: release the NEWEST `limit` now,\n // withhold the older ones for subsequent next() calls.\n const newVisible = initial.newVisible;\n\n // Withhold ALL new visible messages first, then release the newest batch\n for (const m of newVisible) {\n this._withheldKeys.add(this._codec.getMessageKey(m));\n }\n\n const released = newVisible.slice(-limit);\n // Mutable buffer of older messages, drained newest-first by successive next() calls\n const withheldBuffer = newVisible.slice(0, -limit);\n this._releaseWithheld(released);\n\n const buildPage = (items: TMessage[]): PaginatedMessages<TMessage> => ({\n items,\n hasNext: () => withheldBuffer.length > 0 || lastPage.hasNext(),\n next: async () => {\n // Drain withheld buffer first (older messages, released newest-first)\n if (withheldBuffer.length > 0) {\n // Remove and return the newest `limit` items from the buffer\n const batch = withheldBuffer.splice(-limit, limit);\n this._releaseWithheld(batch);\n return buildPage(batch);\n }\n\n // Buffer exhausted — load more pages from decodeHistory\n if (!lastPage.hasNext()) return;\n\n const nextInternal = await lastPage.next();\n if (!nextInternal) return;\n\n // Everything currently in the tree is \"already known\"\n const alreadyKnown = new Set(beforeKeys);\n for (const m of this._tree.flatten()) {\n alreadyKnown.add(this._codec.getMessageKey(m));\n }\n\n const loaded = await this._loadUntilVisible(nextInternal, limit, alreadyKnown);\n lastPage = loaded.lastPage;\n\n const moreVisible = loaded.newVisible;\n for (const m of moreVisible) {\n this._withheldKeys.add(this._codec.getMessageKey(m));\n }\n // Remove and return the newest `limit` items; rest stays in buffer\n const moreBatch = moreVisible.splice(-limit, limit);\n withheldBuffer.push(...moreVisible);\n this._releaseWithheld(moreBatch);\n\n if (moreBatch.length === 0) return;\n return buildPage(moreBatch);\n },\n });\n\n return buildPage(released);\n }\n\n // Spec: AIT-CT12, AIT-CT12a, AIT-CT12b\n async close(options?: CloseOptions): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n this._logger.info('ClientTransport.close();');\n\n // Best-effort cancel publish before tearing down local state\n if (options?.cancel) {\n try {\n await this._publishCancel(options.cancel);\n } catch {\n // Swallow: cancel is best-effort during teardown\n }\n this._closeMatchingTurnStreams(options.cancel);\n }\n\n this._channel.unsubscribe(this._onMessage);\n\n // Close any remaining active streams\n for (const turnId of this._ownTurnIds) {\n this._router.closeStream(turnId);\n }\n\n this._turnObservers.clear();\n this._emitter.off();\n this._ownTurnIds.clear();\n this._ownMsgIds.clear();\n this._turnMsgIds.clear();\n this._turnClientIds.clear();\n this._withheldKeys.clear();\n this._ablyMessages.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a client-side transport that manages conversation state over an Ably channel.\n *\n * Subscribes to the channel immediately (before attach per RTL7g). The caller should\n * ensure the channel is attached or will be attached shortly after creation.\n * @param options - Configuration for the client transport.\n * @returns A new {@link ClientTransport} instance.\n */\nexport const createClientTransport = <TEvent, TMessage>(\n options: ClientTransportOptions<TEvent, TMessage>,\n): ClientTransport<TEvent, TMessage> => new DefaultClientTransport(options);\n","/**\n * Vercel AI SDK Message Accumulator\n *\n * Builds and maintains a UIMessage[] list from decoder outputs.\n * Implements MessageAccumulator<UIMessageChunk, UIMessage>.\n *\n * The accumulator consumes DecoderOutput[] from the decoder and groups\n * streaming events into UIMessage objects using lifecycle boundaries\n * (start/finish). Complete messages (from writeMessages) are inserted\n * directly.\n *\n * Multiple messages can be in-progress concurrently — each is identified\n * by the `messageId` field on DecoderOutput (read from x-ably-msg-id).\n */\n\nimport type * as AI from 'ai';\n\nimport type { DecoderOutput, MessageAccumulator } from '../../core/codec/types.js';\nimport { stripUndefined } from '../../utils.js';\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Status of a streamed message (text, reasoning, or tool-input). */\ntype StreamStatus = 'streaming' | 'finished' | 'aborted';\n\n/**\n * Tracks an in-progress tool part's position and accumulated streaming input.\n * Text and reasoning parts don't need this — we write directly to the part.\n * Tool parts need the extra `inputText` buffer because deltas arrive as raw\n * JSON fragments that must be accumulated before parsing.\n */\ninterface ToolPartTracker {\n /** Index in the message's parts array. */\n partIndex: number;\n /** Accumulated streaming input text (for JSON parsing on completion). */\n inputText: string;\n}\n\n/** Fields shared by all DynamicToolUIPart state variants. */\ninterface ToolBaseFields {\n type: 'dynamic-tool';\n toolName: string;\n toolCallId: string;\n title?: string;\n providerExecuted?: boolean;\n}\n\n/** Bundled per-message state for an in-progress message. */\ninterface ActiveMessageState {\n message: AI.UIMessage;\n textStreams: DeltaStreamTracker;\n reasoningStreams: DeltaStreamTracker;\n toolTrackers: Record<string, ToolPartTracker>;\n streamStatus: Map<string, StreamStatus>;\n}\n\n// ---------------------------------------------------------------------------\n// Tool base helper\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the state-independent base fields for a DynamicToolUIPart.\n * Works with both chunks (tool-input-start, etc.) and existing parts.\n * @param source - Any object containing the required tool identity fields.\n * @param source.toolCallId - The tool call identifier.\n * @param source.toolName - The tool name.\n * @param source.title - Optional display title.\n * @param source.providerExecuted - Whether the provider executed the tool.\n * @returns Base fields shared across all DynamicToolUIPart state variants.\n */\nconst toolBase = (source: {\n toolCallId: string;\n toolName: string;\n title?: string;\n providerExecuted?: boolean;\n}): ToolBaseFields =>\n stripUndefined({\n type: 'dynamic-tool' as const,\n toolCallId: source.toolCallId,\n toolName: source.toolName,\n title: source.title,\n providerExecuted: source.providerExecuted,\n });\n\n// ---------------------------------------------------------------------------\n// DeltaStreamTracker — manages text or reasoning stream accumulation\n// ---------------------------------------------------------------------------\n\n/**\n * Tracks in-progress text or reasoning streams within a single message.\n * Owns the mapping from stream ID to part index, enforcing the pairing\n * of part type and index map by construction.\n */\nclass DeltaStreamTracker {\n private readonly _partType: 'text' | 'reasoning';\n private _activeIndex = new Map<string, number>();\n\n constructor(partType: 'text' | 'reasoning') {\n this._partType = partType;\n }\n\n start(id: string, msg: AI.UIMessage, streamStatus: Map<string, StreamStatus>): void {\n this._activeIndex.set(id, msg.parts.length);\n msg.parts.push({ type: this._partType, text: '' });\n streamStatus.set(id, 'streaming');\n }\n\n delta(id: string, msg: AI.UIMessage, text: string): void {\n const idx = this._activeIndex.get(id);\n if (idx === undefined) return;\n const part = msg.parts[idx];\n if (part?.type === this._partType) {\n part.text += text;\n }\n }\n\n end(id: string, streamStatus: Map<string, StreamStatus>): void {\n streamStatus.set(id, 'finished');\n this._activeIndex.delete(id);\n }\n\n reset(): void {\n this._activeIndex = new Map();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\nclass DefaultUIMessageAccumulator implements MessageAccumulator<AI.UIMessageChunk, AI.UIMessage> {\n private readonly _messageList: AI.UIMessage[] = [];\n private readonly _activeMessages = new Map<string, ActiveMessageState>();\n\n get messages(): AI.UIMessage[] {\n return this._messageList;\n }\n\n get completedMessages(): AI.UIMessage[] {\n const activeSet = new Set<AI.UIMessage>();\n for (const state of this._activeMessages.values()) {\n activeSet.add(state.message);\n }\n return this._messageList.filter((msg) => !activeSet.has(msg));\n }\n\n get hasActiveStream(): boolean {\n for (const state of this._activeMessages.values()) {\n for (const status of state.streamStatus.values()) {\n if (status === 'streaming') return true;\n }\n }\n return false;\n }\n\n processOutputs(outputs: DecoderOutput<AI.UIMessageChunk, AI.UIMessage>[]): void {\n for (const output of outputs) {\n if (output.kind === 'message') {\n this._messageList.push(output.message);\n } else if (output.messageId !== undefined) {\n this._processEvent(output.event, output.messageId);\n }\n }\n }\n\n updateMessage(message: AI.UIMessage): void {\n const idx = this._messageList.findIndex((m) => m.id === message.id);\n if (idx !== -1) {\n this._messageList[idx] = message;\n }\n }\n\n // -------------------------------------------------------------------------\n // Shared helpers\n // -------------------------------------------------------------------------\n\n private _ensureActiveMessage(messageId: string): ActiveMessageState {\n const existing = this._activeMessages.get(messageId);\n if (existing) return existing;\n\n const state: ActiveMessageState = {\n message: { id: messageId, role: 'assistant', parts: [] },\n textStreams: new DeltaStreamTracker('text'),\n reasoningStreams: new DeltaStreamTracker('reasoning'),\n toolTrackers: {},\n streamStatus: new Map(),\n };\n this._activeMessages.set(messageId, state);\n this._messageList.push(state.message);\n return state;\n }\n\n /**\n * Look up a tracked tool part by toolCallId within a message state.\n * @param toolCallId - The tool call identifier to look up.\n * @param state - The active message state to search in.\n * @returns The tracker and current part, or undefined if not found.\n */\n private _getToolPart(\n toolCallId: string,\n state: ActiveMessageState,\n ): { tracker: ToolPartTracker; part: AI.DynamicToolUIPart } | undefined {\n const tracker = state.toolTrackers[toolCallId];\n if (!tracker) return undefined;\n\n const existing = state.message.parts[tracker.partIndex];\n if (existing?.type !== 'dynamic-tool') return undefined;\n\n return { tracker, part: existing };\n }\n\n // -------------------------------------------------------------------------\n // Event dispatch\n // -------------------------------------------------------------------------\n\n private _processEvent(chunk: AI.UIMessageChunk, messageId: string): void {\n switch (chunk.type) {\n case 'start':\n case 'start-step':\n case 'finish-step':\n case 'finish':\n case 'abort':\n case 'error':\n case 'message-metadata': {\n this._processLifecycle(chunk, messageId);\n break;\n }\n\n case 'text-start':\n case 'text-delta':\n case 'text-end':\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end': {\n this._processTextOrReasoning(chunk, messageId);\n break;\n }\n\n case 'tool-input-start':\n case 'tool-input-delta':\n case 'tool-input-available':\n case 'tool-input-error': {\n this._processToolInput(chunk, messageId);\n break;\n }\n\n case 'tool-output-available':\n case 'tool-output-error':\n case 'tool-output-denied':\n case 'tool-approval-request': {\n this._processToolOutput(chunk, messageId);\n break;\n }\n\n case 'file':\n case 'source-url':\n case 'source-document': {\n this._processContentPart(chunk, messageId);\n break;\n }\n\n default: {\n if (chunk.type.startsWith('data-')) {\n if (chunk.transient) break;\n\n const state = this._ensureActiveMessage(messageId);\n\n // CAST: chunk.type is `data-${string}` which satisfies DataUIPart,\n // but TypeScript cannot verify the template literal matches a\n // specific UIMessagePart variant at the type level.\n const dataPart = stripUndefined({\n type: chunk.type,\n id: chunk.id,\n data: chunk.data,\n }) as AI.UIMessage['parts'][number];\n\n if (chunk.id !== undefined) {\n const idx = state.message.parts.findIndex((p) => p.type === chunk.type && 'id' in p && p.id === chunk.id);\n if (idx !== -1) {\n state.message.parts[idx] = dataPart;\n break;\n }\n }\n\n state.message.parts.push(dataPart);\n }\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle events\n // -------------------------------------------------------------------------\n\n private _processLifecycle(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'start' | 'start-step' | 'finish-step' | 'finish' | 'abort' | 'error' | 'message-metadata' }\n >,\n messageId: string,\n ): void {\n switch (chunk.type) {\n case 'start': {\n const state = this._ensureActiveMessage(messageId);\n if (chunk.messageId) state.message.id = chunk.messageId;\n if (chunk.messageMetadata !== undefined) {\n state.message.metadata = chunk.messageMetadata;\n }\n break;\n }\n\n case 'start-step': {\n const state = this._ensureActiveMessage(messageId);\n state.message.parts.push({ type: 'step-start' });\n break;\n }\n\n case 'finish-step': {\n const state = this._activeMessages.get(messageId);\n if (state) {\n state.textStreams.reset();\n state.reasoningStreams.reset();\n }\n break;\n }\n\n case 'finish': {\n const state = this._activeMessages.get(messageId);\n if (state && chunk.messageMetadata !== undefined) {\n state.message.metadata = chunk.messageMetadata;\n }\n this._activeMessages.delete(messageId);\n break;\n }\n\n case 'abort': {\n const state = this._activeMessages.get(messageId);\n if (state) {\n for (const [id, status] of state.streamStatus) {\n if (status === 'streaming') {\n state.streamStatus.set(id, 'aborted');\n }\n }\n }\n this._activeMessages.delete(messageId);\n break;\n }\n\n case 'error': {\n break;\n }\n\n case 'message-metadata': {\n const state = this._activeMessages.get(messageId);\n if (state && chunk.messageMetadata !== undefined) {\n state.message.metadata = chunk.messageMetadata;\n }\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Text and reasoning streaming\n // -------------------------------------------------------------------------\n\n private _processTextOrReasoning(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'text-start' | 'text-delta' | 'text-end' | 'reasoning-start' | 'reasoning-delta' | 'reasoning-end' }\n >,\n messageId: string,\n ): void {\n const state = this._ensureActiveMessage(messageId);\n\n switch (chunk.type) {\n case 'text-start': {\n state.textStreams.start(chunk.id, state.message, state.streamStatus);\n break;\n }\n case 'text-delta': {\n state.textStreams.delta(chunk.id, state.message, chunk.delta);\n break;\n }\n case 'text-end': {\n state.textStreams.end(chunk.id, state.streamStatus);\n break;\n }\n case 'reasoning-start': {\n state.reasoningStreams.start(chunk.id, state.message, state.streamStatus);\n break;\n }\n case 'reasoning-delta': {\n state.reasoningStreams.delta(chunk.id, state.message, chunk.delta);\n break;\n }\n case 'reasoning-end': {\n state.reasoningStreams.end(chunk.id, state.streamStatus);\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Tool input streaming\n // -------------------------------------------------------------------------\n\n private _processToolInput(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'tool-input-start' | 'tool-input-delta' | 'tool-input-available' | 'tool-input-error' }\n >,\n messageId: string,\n ): void {\n switch (chunk.type) {\n case 'tool-input-start': {\n const state = this._ensureActiveMessage(messageId);\n const partIndex = state.message.parts.length;\n state.message.parts.push({ ...toolBase(chunk), state: 'input-streaming', input: undefined });\n state.toolTrackers[chunk.toolCallId] = { partIndex, inputText: '' };\n state.streamStatus.set(chunk.toolCallId, 'streaming');\n break;\n }\n\n case 'tool-input-delta': {\n const state = this._ensureActiveMessage(messageId);\n const tracker = state.toolTrackers[chunk.toolCallId];\n if (!tracker) break;\n tracker.inputText += chunk.inputTextDelta;\n\n let parsedInput: unknown;\n try {\n // CAST: JSON.parse returns any; unknown is the safe trust-boundary type.\n parsedInput = JSON.parse(tracker.inputText) as unknown;\n } catch {\n parsedInput = undefined;\n }\n\n const found = this._getToolPart(chunk.toolCallId, state);\n if (!found) break;\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'input-streaming',\n input: parsedInput,\n };\n break;\n }\n\n case 'tool-input-available': {\n const state = this._ensureActiveMessage(messageId);\n const found = this._getToolPart(chunk.toolCallId, state);\n if (!found) break;\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'input-available',\n input: chunk.input,\n };\n state.streamStatus.set(chunk.toolCallId, 'finished');\n break;\n }\n\n case 'tool-input-error': {\n const state = this._ensureActiveMessage(messageId);\n const found = this._getToolPart(chunk.toolCallId, state);\n if (found) {\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'output-error',\n input: chunk.input,\n errorText: chunk.errorText,\n };\n } else {\n const partIndex = state.message.parts.length;\n state.message.parts.push({\n ...toolBase(chunk),\n state: 'output-error',\n input: chunk.input,\n errorText: chunk.errorText,\n });\n state.toolTrackers[chunk.toolCallId] = { partIndex, inputText: '' };\n }\n state.streamStatus.set(chunk.toolCallId, 'finished');\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Tool output transitions\n // -------------------------------------------------------------------------\n\n private _processToolOutput(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'tool-output-available' | 'tool-output-error' | 'tool-output-denied' | 'tool-approval-request' }\n >,\n messageId: string,\n ): void {\n const state = this._ensureActiveMessage(messageId);\n const found = this._getToolPart(chunk.toolCallId, state);\n if (!found) return;\n\n switch (chunk.type) {\n case 'tool-output-available': {\n state.message.parts[found.tracker.partIndex] = stripUndefined({\n ...toolBase(found.part),\n state: 'output-available' as const,\n input: found.part.input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n });\n break;\n }\n\n case 'tool-output-error': {\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'output-error',\n input: found.part.input,\n errorText: chunk.errorText,\n };\n break;\n }\n\n case 'tool-output-denied': {\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'output-denied',\n input: found.part.input,\n approval: { id: '', approved: false },\n };\n break;\n }\n\n case 'tool-approval-request': {\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'approval-requested',\n input: found.part.input,\n approval: { id: chunk.approvalId },\n };\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Content parts\n // -------------------------------------------------------------------------\n\n private _processContentPart(\n chunk: Extract<AI.UIMessageChunk, { type: 'file' | 'source-url' | 'source-document' }>,\n messageId: string,\n ): void {\n const state = this._ensureActiveMessage(messageId);\n\n switch (chunk.type) {\n case 'file': {\n state.message.parts.push({ type: 'file', mediaType: chunk.mediaType, url: chunk.url });\n break;\n }\n\n case 'source-url': {\n state.message.parts.push(\n stripUndefined({\n type: 'source-url' as const,\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n }),\n );\n break;\n }\n\n case 'source-document': {\n state.message.parts.push(\n stripUndefined({\n type: 'source-document' as const,\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n }),\n );\n break;\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel AI SDK accumulator that builds UIMessage[] from decoder outputs.\n * @returns A {@link MessageAccumulator} for UIMessageChunk/UIMessage.\n */\nexport const createAccumulator = (): MessageAccumulator<AI.UIMessageChunk, AI.UIMessage> =>\n new DefaultUIMessageAccumulator();\n","/**\n * Decoder core — action dispatch and serial tracking machinery.\n *\n * Handles the Ably message action patterns (create, append, update, delete)\n * and delegates to domain-specific hooks for event building and discrete\n * event decoding.\n *\n * Domain decoders call `createDecoderCore(hooks, options)` and provide hooks\n * for stream classification, event building, and discrete decoding.\n */\n\nimport type * as Ably from 'ably';\n\nimport { HEADER_MSG_ID, HEADER_STATUS, HEADER_STREAM, HEADER_STREAM_ID } from '../../constants.js';\nimport type { Logger } from '../../logger.js';\nimport { getHeaders } from '../../utils.js';\nimport type { DecoderOutput, MessagePayload, StreamTrackerState } from './types.js';\n\n/**\n * Wrap a domain event as a single-element decoder output array.\n * @param event - The domain event to wrap.\n * @returns A single-element array containing the event as a decoder output.\n */\nexport const eventOutput = <TEvent, TMessage>(event: TEvent): DecoderOutput<TEvent, TMessage>[] => [\n { kind: 'event', event },\n];\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/** Options for creating a decoder core. */\nexport interface DecoderCoreOptions {\n /** Called when a tracked stream is replaced (non-prefix update). Receives the tracker with updated state. */\n onStreamUpdate?: (tracker: StreamTrackerState) => void;\n /** Called when a message is deleted. Receives the serial and tracker (if one exists). */\n onStreamDelete?: (serial: string, tracker: StreamTrackerState | undefined) => void;\n /** Logger instance for diagnostic output. */\n logger?: Logger;\n}\n\n// ---------------------------------------------------------------------------\n// Domain hooks\n// ---------------------------------------------------------------------------\n\n/** Hooks that a domain codec provides to the decoder core for stream classification and event building. */\nexport interface DecoderCoreHooks<TEvent, TMessage> {\n /**\n * Build domain events emitted when a new stream starts. May return multiple\n * events (e.g. a start event and a start-step event).\n */\n buildStartEvents(tracker: StreamTrackerState): DecoderOutput<TEvent, TMessage>[];\n\n /** Build domain events for a text delta received on a stream. */\n buildDeltaEvents(tracker: StreamTrackerState, delta: string): DecoderOutput<TEvent, TMessage>[];\n\n /**\n * Build domain events emitted when a stream finishes (x-ably-status:finished).\n * Not called for aborted streams. The closing headers may differ from\n * tracker.headers if the closing append carried updated headers.\n */\n buildEndEvents(\n tracker: StreamTrackerState,\n closingHeaders: Record<string, string>,\n ): DecoderOutput<TEvent, TMessage>[];\n\n /**\n * Decode a discrete message (message.create where x-ably-stream is \"false\",\n * or a non-streamable first-contact update). Handles user messages, lifecycle\n * events, tool lifecycle, data-*, etc.\n */\n decodeDiscrete(input: MessagePayload): DecoderOutput<TEvent, TMessage>[];\n}\n\n// ---------------------------------------------------------------------------\n// Interface\n// ---------------------------------------------------------------------------\n\n/** The decoder core returned by {@link createDecoderCore}. */\nexport interface DecoderCore<TEvent, TMessage> {\n /** Decode a single Ably message into zero or more domain outputs. */\n decode(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[];\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CD7\nclass DefaultDecoderCore<TEvent, TMessage> implements DecoderCore<TEvent, TMessage> {\n private readonly _hooks: DecoderCoreHooks<TEvent, TMessage>;\n private readonly _logger: Logger | undefined;\n private readonly _onStreamUpdate: ((tracker: StreamTrackerState) => void) | undefined;\n private readonly _onStreamDelete: ((serial: string, tracker: StreamTrackerState | undefined) => void) | undefined;\n private readonly _serialState = new Map<string, StreamTrackerState>();\n\n constructor(hooks: DecoderCoreHooks<TEvent, TMessage>, options: DecoderCoreOptions = {}) {\n this._hooks = hooks;\n this._onStreamUpdate = options.onStreamUpdate;\n this._onStreamDelete = options.onStreamDelete;\n this._logger = options.logger?.withContext({ component: 'DecoderCore' });\n }\n\n decode(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const action = message.action;\n\n this._logger?.trace('DefaultDecoderCore.decode();', { action, serial: message.serial, name: message.name });\n\n let outputs: DecoderOutput<TEvent, TMessage>[];\n\n switch (action) {\n // Spec: AIT-CD7a\n case 'message.create': {\n const payload = this._toPayload(message);\n\n outputs =\n payload.headers?.[HEADER_STREAM] === 'true'\n ? this._decodeStreamedCreate(payload, message.serial)\n : this._hooks.decodeDiscrete(payload);\n break;\n }\n\n case 'message.append': {\n outputs = this._decodeAppend(message);\n break;\n }\n\n case 'message.update': {\n outputs = this._decodeUpdate(message);\n break;\n }\n\n case 'message.delete': {\n outputs = this._decodeDelete(message);\n break;\n }\n\n default: {\n return [];\n }\n }\n\n // Tag all event outputs with the message ID from x-ably-msg-id for accumulator correlation.\n const messageId = getHeaders(message)[HEADER_MSG_ID];\n if (messageId) {\n for (const output of outputs) {\n if (output.kind === 'event') {\n output.messageId = messageId;\n }\n }\n }\n\n return outputs;\n }\n\n // -------------------------------------------------------------------------\n // Private: extract MessagePayload\n // -------------------------------------------------------------------------\n\n private _toPayload(message: Ably.InboundMessage): MessagePayload {\n return {\n name: message.name ?? '',\n // CAST: Ably SDK types `data` as `any`; cast to unknown is the safe boundary type.\n data: message.data as unknown,\n headers: getHeaders(message),\n };\n }\n\n /**\n * Extract string data from an Ably message, for stream accumulation paths.\n * @param message - The Ably message to extract string data from.\n * @returns The string data, or empty string if data is not a string.\n */\n private _stringData(message: Ably.InboundMessage): string {\n return typeof message.data === 'string' ? message.data : '';\n }\n\n // -------------------------------------------------------------------------\n // Private: safe callback invocation\n // -------------------------------------------------------------------------\n\n private _invokeOnStreamUpdate(tracker: StreamTrackerState): void {\n if (!this._onStreamUpdate) return;\n try {\n this._onStreamUpdate(tracker);\n } catch (error) {\n this._logger?.error('DefaultDecoderCore._invokeOnStreamUpdate(); callback threw', { error });\n }\n }\n\n private _invokeOnStreamDelete(serial: string, tracker: StreamTrackerState | undefined): void {\n if (!this._onStreamDelete) return;\n try {\n this._onStreamDelete(serial, tracker);\n } catch (error) {\n this._logger?.error('DefaultDecoderCore._invokeOnStreamDelete(); callback threw', { error });\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: streamed message create\n // -------------------------------------------------------------------------\n\n private _decodeStreamedCreate(\n payload: MessagePayload,\n serial: string | undefined,\n ): DecoderOutput<TEvent, TMessage>[] {\n if (!serial) return [];\n\n const streamId = payload.headers?.[HEADER_STREAM_ID] ?? '';\n const h = payload.headers ?? {};\n\n const tracker: StreamTrackerState = {\n name: payload.name,\n streamId,\n accumulated: '',\n headers: { ...h },\n closed: false,\n };\n this._serialState.set(serial, tracker);\n\n this._logger?.debug('DefaultDecoderCore._decodeStreamedCreate(); new stream', {\n name: payload.name,\n streamId,\n serial,\n });\n\n return this._hooks.buildStartEvents(tracker);\n }\n\n // -------------------------------------------------------------------------\n // Private: append handling\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD8\n private _decodeAppend(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const serial = message.serial;\n if (!serial) return [];\n\n const tracker = this._serialState.get(serial);\n if (!tracker) {\n // Unknown serial on append — treat as first-contact update\n return this._decodeUpdate(message);\n }\n\n const h = getHeaders(message);\n const delta = typeof message.data === 'string' ? message.data : '';\n const status = h[HEADER_STATUS];\n const outputs: DecoderOutput<TEvent, TMessage>[] = [];\n\n if (delta.length > 0) {\n tracker.accumulated += delta;\n outputs.push(...this._hooks.buildDeltaEvents(tracker, delta));\n }\n\n if (status === 'finished' && !tracker.closed) {\n tracker.closed = true;\n outputs.push(...this._hooks.buildEndEvents(tracker, h));\n this._logger?.debug('DefaultDecoderCore._decodeAppend(); stream finished', { streamId: tracker.streamId });\n } else if (status === 'aborted' && !tracker.closed) {\n tracker.closed = true;\n this._logger?.debug('DefaultDecoderCore._decodeAppend(); stream aborted', { streamId: tracker.streamId });\n }\n\n return outputs;\n }\n\n // -------------------------------------------------------------------------\n // Private: update handling (first-contact, prefix-match, replacement)\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD9\n private _decodeUpdate(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const serial = message.serial;\n if (!serial) return [];\n\n const payload = this._toPayload(message);\n const h = payload.headers ?? {};\n const isStreamed = h[HEADER_STREAM] === 'true';\n const status = h[HEADER_STATUS];\n\n const tracker = this._serialState.get(serial);\n\n if (!tracker) {\n return this._decodeFirstContact(payload, isStreamed, status, serial);\n }\n\n // Updates to tracked streams use string data for prefix-match accumulation\n const data = this._stringData(message);\n\n // --- Tracker exists: prefix-match or replacement ---\n if (data.startsWith(tracker.accumulated)) {\n const delta = data.slice(tracker.accumulated.length);\n const outputs: DecoderOutput<TEvent, TMessage>[] = [];\n\n if (delta.length > 0) {\n tracker.accumulated = data;\n outputs.push(...this._hooks.buildDeltaEvents(tracker, delta));\n }\n\n if (status === 'finished' && !tracker.closed) {\n tracker.closed = true;\n outputs.push(...this._hooks.buildEndEvents(tracker, h));\n } else if (status === 'aborted' && !tracker.closed) {\n tracker.closed = true;\n }\n\n return outputs;\n }\n\n // --- Replacement (NOT a prefix match) ---\n tracker.accumulated = data;\n tracker.headers = { ...h };\n\n this._invokeOnStreamUpdate(tracker);\n\n return [];\n }\n\n private _decodeFirstContact(\n payload: MessagePayload,\n isStreamed: boolean,\n status: string | undefined,\n serial: string,\n ): DecoderOutput<TEvent, TMessage>[] {\n // Non-streamed messages are discrete\n if (!isStreamed) {\n return this._hooks.decodeDiscrete(payload);\n }\n\n const streamId = payload.headers?.[HEADER_STREAM_ID] ?? '';\n const h = payload.headers ?? {};\n const data = typeof payload.data === 'string' ? payload.data : '';\n\n this._logger?.debug('DefaultDecoderCore._decodeFirstContact(); first-contact stream', {\n name: payload.name,\n streamId,\n serial,\n });\n\n // Create tracker\n const newTracker: StreamTrackerState = {\n name: payload.name,\n streamId,\n accumulated: data,\n headers: { ...h },\n closed: status === 'finished' || status === 'aborted',\n };\n this._serialState.set(serial, newTracker);\n\n // Emit start + delta (if any) + end (if finished)\n const outputs = this._hooks.buildStartEvents(newTracker);\n\n if (data.length > 0) {\n outputs.push(...this._hooks.buildDeltaEvents(newTracker, data));\n }\n\n if (status === 'finished') {\n outputs.push(...this._hooks.buildEndEvents(newTracker, h));\n }\n\n return outputs;\n }\n\n // -------------------------------------------------------------------------\n // Private: delete handling\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD10\n private _decodeDelete(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const serial = message.serial;\n if (!serial) return [];\n\n const tracker = this._serialState.get(serial);\n\n this._invokeOnStreamDelete(serial, tracker);\n\n if (tracker) {\n tracker.accumulated = '';\n tracker.closed = true;\n }\n\n this._logger?.debug('DefaultDecoderCore._decodeDelete();', { serial });\n\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a decoder core with the given domain hooks.\n * @param hooks - Domain-specific hooks for stream classification, event building, and discrete decoding.\n * @param options - Decoder configuration (callbacks, logger).\n * @returns A new {@link DecoderCore} instance.\n */\nexport const createDecoderCore = <TEvent, TMessage>(\n hooks: DecoderCoreHooks<TEvent, TMessage>,\n options: DecoderCoreOptions = {},\n): DecoderCore<TEvent, TMessage> => new DefaultDecoderCore(hooks, options);\n","/**\n * Generic lifecycle tracker for codec decoders.\n *\n * Manages per-scope (typically per-turn) tracking of lifecycle phases that\n * must be emitted before content events. When a phase has not been emitted\n * (e.g. mid-stream join), the tracker synthesizes the missing events using\n * codec-provided build functions.\n *\n * Codecs configure the tracker with an ordered list of phases, then compose\n * it into their decoder hooks. The tracker is independent of any specific\n * codec or event type.\n */\n\n// ---------------------------------------------------------------------------\n// Phase configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Configuration for a single lifecycle phase that may need to be\n * synthesized when missing from the wire stream.\n */\nexport interface PhaseConfig<TEvent> {\n /** Unique key identifying this phase (e.g. \"start\", \"start-step\"). */\n key: string;\n /**\n * Build the synthetic event(s) for this phase. Called with a context\n * record that codecs populate at the call site — the tracker passes\n * it through without interpreting it.\n * @param context - Key-value pairs from the call site (e.g. headers).\n * @returns One or more synthetic events to emit for this phase.\n */\n build(context: Record<string, string | undefined>): TEvent[];\n}\n\n// ---------------------------------------------------------------------------\n// Tracker interface\n// ---------------------------------------------------------------------------\n\n/**\n * Per-scope lifecycle tracker that ensures required phases are emitted\n * before content events, synthesizing missing ones for mid-stream joins.\n *\n * Scoped by an arbitrary string key (typically a turn ID). Each scope\n * tracks independently which phases have been emitted.\n */\nexport interface LifecycleTracker<TEvent> {\n /**\n * Ensure all configured phases have been emitted for the given scope.\n * Returns synthetic events for any phases not yet marked as emitted,\n * then marks them. Returns an empty array if all phases are current.\n * @param scopeId - The scope to check (e.g. turn ID).\n * @param context - Key-value pairs passed through to phase build functions.\n * @returns Synthetic events for missing phases, in configuration order.\n */\n ensurePhases(scopeId: string, context: Record<string, string | undefined>): TEvent[];\n\n /**\n * Mark a phase as emitted from the wire (not synthetic). Call this\n * when the real event arrives so the tracker does not re-synthesize it.\n * @param scopeId - The scope (e.g. turn ID).\n * @param phaseKey - The phase key to mark.\n */\n markEmitted(scopeId: string, phaseKey: string): void;\n\n /**\n * Reset a phase so it will be re-synthesized on the next\n * {@link ensurePhases} call. Used for repeating phases (e.g. \"start-step\"\n * resets after \"finish-step\").\n * @param scopeId - The scope (e.g. turn ID).\n * @param phaseKey - The phase key to reset.\n */\n resetPhase(scopeId: string, phaseKey: string): void;\n\n /**\n * Remove all tracking state for a scope. Call on turn completion\n * (finish, abort) to free memory.\n * @param scopeId - The scope to clear.\n */\n clearScope(scopeId: string): void;\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CD13\nclass DefaultLifecycleTracker<TEvent> implements LifecycleTracker<TEvent> {\n private readonly _phases: PhaseConfig<TEvent>[];\n private readonly _emitted = new Map<string, Set<string>>();\n\n constructor(phases: PhaseConfig<TEvent>[]) {\n this._phases = phases;\n }\n\n ensurePhases(scopeId: string, context: Record<string, string | undefined>): TEvent[] {\n const emitted = this._getOrCreate(scopeId);\n const events: TEvent[] = [];\n for (const phase of this._phases) {\n if (!emitted.has(phase.key)) {\n emitted.add(phase.key);\n events.push(...phase.build(context));\n }\n }\n return events;\n }\n\n markEmitted(scopeId: string, phaseKey: string): void {\n this._getOrCreate(scopeId).add(phaseKey);\n }\n\n resetPhase(scopeId: string, phaseKey: string): void {\n this._emitted.get(scopeId)?.delete(phaseKey);\n }\n\n clearScope(scopeId: string): void {\n this._emitted.delete(scopeId);\n }\n\n private _getOrCreate(scopeId: string): Set<string> {\n let set = this._emitted.get(scopeId);\n if (!set) {\n set = new Set();\n this._emitted.set(scopeId, set);\n }\n return set;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a lifecycle tracker configured with the given phases.\n * Phases are checked and synthesized in array order.\n * @param phases - Ordered phase configurations.\n * @returns A new {@link LifecycleTracker} instance.\n */\nexport const createLifecycleTracker = <TEvent>(phases: PhaseConfig<TEvent>[]): LifecycleTracker<TEvent> =>\n new DefaultLifecycleTracker(phases);\n","/**\n * Vercel AI SDK Decoder\n *\n * Maps Ably inbound messages to DecoderOutput<UIMessageChunk, UIMessage>[].\n *\n * Delegates action dispatch and serial tracking to the decoder core.\n * This file contains only the Vercel-specific event building, discrete\n * event decoding, and synthetic event emission.\n *\n * Domain-specific headers use the `x-domain-` prefix. Transport-level\n * headers use the `x-ably-` prefix.\n */\n\nimport type * as Ably from 'ably';\nimport type * as AI from 'ai';\n\nimport { HEADER_ROLE, HEADER_TURN_ID } from '../../constants.js';\nimport type { DecoderCore, DecoderCoreHooks, DecoderCoreOptions } from '../../core/codec/decoder.js';\nimport { createDecoderCore, eventOutput } from '../../core/codec/decoder.js';\nimport type { LifecycleTracker } from '../../core/codec/lifecycle-tracker.js';\nimport { createLifecycleTracker } from '../../core/codec/lifecycle-tracker.js';\nimport type { DecoderOutput, MessagePayload, StreamDecoder, StreamTrackerState } from '../../core/codec/types.js';\nimport { type DomainHeaderReader, headerReader as rawHeaderReader, stripUndefined } from '../../utils.js';\n\n// ---------------------------------------------------------------------------\n// Vercel-specific header reader (casts providerMetadata to AI.ProviderMetadata)\n// ---------------------------------------------------------------------------\n\ninterface VercelHeaderReader extends DomainHeaderReader {\n /** Read the `providerMetadata` domain header, cast to the AI SDK type. */\n providerMetadata(): AI.ProviderMetadata | undefined;\n}\n\n/**\n * Create a header reader that adds Vercel-specific `providerMetadata` typing.\n * @param headers - The raw headers record to read domain headers from.\n * @returns A typed accessor with Vercel-specific providerMetadata typing.\n */\nconst headerReader = (headers: Record<string, string>): VercelHeaderReader => {\n const base = rawHeaderReader(headers);\n return {\n ...base,\n // CAST: Trust boundary — the encoder serialized a valid ProviderMetadata value.\n providerMetadata: () => base.json('providerMetadata') as AI.ProviderMetadata | undefined,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Wire format types (trust boundaries for JSON-parsed data)\n// ---------------------------------------------------------------------------\n\n/** Wire format for tool-input-error data payload. */\ninterface ToolInputErrorWireData {\n errorText?: string;\n input?: unknown;\n}\n\n/** Wire format for tool-output-available data payload. */\ninterface ToolOutputAvailableWireData {\n output?: unknown;\n}\n\n/** Wire format for tool-output-error data payload. */\ninterface ToolOutputErrorWireData {\n errorText?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Shared output type alias\n// ---------------------------------------------------------------------------\n\ntype Out = DecoderOutput<AI.UIMessageChunk, AI.UIMessage>;\n\n/**\n * Bind eventOutput to the Vercel domain types.\n * @param chunk - The UIMessageChunk to wrap.\n * @returns A single-element decoder output array.\n */\nconst event = (chunk: AI.UIMessageChunk): Out[] => eventOutput<AI.UIMessageChunk, AI.UIMessage>(chunk);\n\n// ---------------------------------------------------------------------------\n// JSON boundary helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a finish reason string against the FinishReason union.\n * @param value - The finish reason string from the wire, or undefined.\n * @param fallback - Default finish reason if the value is not recognized.\n * @returns The validated FinishReason.\n */\nconst parseFinishReason = (value: string | undefined, fallback: AI.FinishReason): AI.FinishReason => {\n if (\n value === 'stop' ||\n value === 'length' ||\n value === 'content-filter' ||\n value === 'tool-calls' ||\n value === 'error' ||\n value === 'other'\n ) {\n return value;\n }\n return fallback;\n};\n\n/**\n * Type predicate for data-* message names.\n * @param name - The message name to check.\n * @returns True if the name starts with \"data-\".\n */\nconst isDataEventName = (name: string): name is `data-${string}` => name.startsWith('data-');\n\n/**\n * Parse a string as JSON, returning the raw string if parsing fails\n * or undefined if empty.\n * @param value - The string to attempt JSON parsing on.\n * @returns The parsed value, the raw string on parse failure, or undefined if empty.\n */\nconst parseJsonOrString = (value: string): unknown => {\n if (!value) return undefined;\n try {\n // CAST: JSON.parse returns any; unknown is the safe trust-boundary type.\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n};\n\n// ---------------------------------------------------------------------------\n// Streamed message event builders\n// ---------------------------------------------------------------------------\n\nconst buildStartChunk = (tracker: StreamTrackerState): AI.UIMessageChunk => {\n const r = headerReader(tracker.headers);\n switch (tracker.name) {\n case 'text': {\n return stripUndefined({\n type: 'text-start' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'reasoning': {\n return stripUndefined({\n type: 'reasoning-start' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'tool-input': {\n return stripUndefined({\n type: 'tool-input-start' as const,\n toolCallId: tracker.streamId,\n toolName: r.strOr('toolName', ''),\n dynamic: r.bool('dynamic'),\n title: r.str('title'),\n providerExecuted: r.bool('providerExecuted'),\n providerMetadata: r.providerMetadata(),\n });\n }\n default: {\n return { type: 'text-start', id: tracker.streamId };\n }\n }\n};\n\nconst buildDeltaChunk = (tracker: StreamTrackerState, delta: string): AI.UIMessageChunk => {\n switch (tracker.name) {\n case 'text': {\n return { type: 'text-delta', id: tracker.streamId, delta };\n }\n case 'reasoning': {\n return { type: 'reasoning-delta', id: tracker.streamId, delta };\n }\n case 'tool-input': {\n return { type: 'tool-input-delta', toolCallId: tracker.streamId, inputTextDelta: delta };\n }\n default: {\n return { type: 'text-delta', id: tracker.streamId, delta };\n }\n }\n};\n\nconst buildEndChunk = (tracker: StreamTrackerState, closingHeaders: Record<string, string>): AI.UIMessageChunk => {\n const r = headerReader(closingHeaders);\n switch (tracker.name) {\n case 'text': {\n return stripUndefined({\n type: 'text-end' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'reasoning': {\n return stripUndefined({\n type: 'reasoning-end' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'tool-input': {\n return stripUndefined({\n type: 'tool-input-available' as const,\n toolCallId: tracker.streamId,\n toolName: r.strOr('toolName', headerReader(tracker.headers).strOr('toolName', '')),\n input: parseJsonOrString(tracker.accumulated),\n providerMetadata: r.providerMetadata(),\n });\n }\n default: {\n return { type: 'text-end', id: tracker.streamId };\n }\n }\n};\n\n// ---------------------------------------------------------------------------\n// Lifecycle tracker configuration (synthetic event phases)\n// ---------------------------------------------------------------------------\n\nconst createVercelLifecycleTracker = (): LifecycleTracker<AI.UIMessageChunk> =>\n createLifecycleTracker<AI.UIMessageChunk>([\n {\n key: 'start',\n build: (ctx) => [stripUndefined({ type: 'start' as const, messageId: ctx.messageId })],\n },\n {\n key: 'start-step',\n build: () => [{ type: 'start-step' as const }],\n },\n ]);\n\n/**\n * Run the lifecycle tracker and wrap results as DecoderOutput events.\n * @param lifecycle - The lifecycle tracker instance.\n * @param turnId - The turn scope ID.\n * @param context - Context passed through to phase build functions.\n * @returns Decoder outputs for any synthesized lifecycle events.\n */\nconst ensurePhases = (\n lifecycle: LifecycleTracker<AI.UIMessageChunk>,\n turnId: string,\n context: Record<string, string | undefined>,\n): Out[] => lifecycle.ensurePhases(turnId, context).map((e) => ({ kind: 'event', event: e }));\n\n// ---------------------------------------------------------------------------\n// Discrete event decoders (one function per event type)\n// ---------------------------------------------------------------------------\n\nconst decodeStart = (r: VercelHeaderReader, turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.markEmitted(turnId, 'start');\n return event(\n stripUndefined({\n type: 'start' as const,\n messageId: r.str('messageId'),\n messageMetadata: r.json('messageMetadata'),\n }),\n );\n};\n\nconst decodeStartStep = (turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.markEmitted(turnId, 'start-step');\n return event({ type: 'start-step' });\n};\n\nconst decodeFinishStep = (turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.resetPhase(turnId, 'start-step');\n return event({ type: 'finish-step' });\n};\n\nconst decodeFinish = (r: VercelHeaderReader, turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.clearScope(turnId);\n return event(\n stripUndefined({\n type: 'finish' as const,\n finishReason: parseFinishReason(r.str('finishReason'), 'stop'),\n messageMetadata: r.json('messageMetadata'),\n }),\n );\n};\n\nconst decodeError = (data: unknown): Out[] => {\n const errorText = typeof data === 'string' ? data : '';\n return event({ type: 'error', errorText });\n};\n\nconst decodeAbort = (data: unknown, turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.clearScope(turnId);\n const reason = typeof data === 'string' && data ? data : undefined;\n return event(stripUndefined({ type: 'abort' as const, reason }));\n};\n\nconst decodeMessageMetadata = (r: VercelHeaderReader): Out[] =>\n event({ type: 'message-metadata', messageMetadata: r.json('messageMetadata') });\n\nconst decodeFile = (r: VercelHeaderReader, data: unknown): Out[] =>\n event(\n stripUndefined({\n type: 'file' as const,\n url: typeof data === 'string' ? data : '',\n mediaType: r.strOr('mediaType', ''),\n providerMetadata: r.providerMetadata(),\n }),\n );\n\nconst decodeSourceUrl = (r: VercelHeaderReader, data: unknown): Out[] =>\n event(\n stripUndefined({\n type: 'source-url' as const,\n sourceId: r.strOr('sourceId', ''),\n url: typeof data === 'string' ? data : '',\n title: r.str('title'),\n providerMetadata: r.providerMetadata(),\n }),\n );\n\nconst decodeSourceDocument = (r: VercelHeaderReader): Out[] =>\n event(\n stripUndefined({\n type: 'source-document' as const,\n sourceId: r.strOr('sourceId', ''),\n mediaType: r.strOr('mediaType', ''),\n title: r.strOr('title', ''),\n filename: r.str('filename'),\n providerMetadata: r.providerMetadata(),\n }),\n );\n\nconst decodeToolInputError = (r: VercelHeaderReader, data: unknown): Out[] => {\n // CAST: Trust boundary — encoder produced the expected object shape.\n const parsed = data as ToolInputErrorWireData | undefined;\n return event(\n stripUndefined({\n type: 'tool-input-error' as const,\n toolCallId: r.strOr('toolCallId', ''),\n toolName: r.strOr('toolName', ''),\n errorText: parsed?.errorText ?? '',\n input: parsed?.input,\n dynamic: r.bool('dynamic'),\n title: r.str('title'),\n providerExecuted: r.bool('providerExecuted'),\n providerMetadata: r.providerMetadata(),\n }),\n );\n};\n\nconst decodeToolOutputAvailable = (r: VercelHeaderReader, data: unknown): Out[] => {\n // CAST: Trust boundary — encoder produced the expected object shape.\n const parsed = data as ToolOutputAvailableWireData | undefined;\n return event(\n stripUndefined({\n type: 'tool-output-available' as const,\n toolCallId: r.strOr('toolCallId', ''),\n output: parsed?.output,\n dynamic: r.bool('dynamic'),\n providerExecuted: r.bool('providerExecuted'),\n preliminary: r.bool('preliminary'),\n }),\n );\n};\n\nconst decodeToolOutputError = (r: VercelHeaderReader, data: unknown): Out[] => {\n // CAST: Trust boundary — encoder produced the expected object shape.\n const parsed = data as ToolOutputErrorWireData | undefined;\n return event(\n stripUndefined({\n type: 'tool-output-error' as const,\n toolCallId: r.strOr('toolCallId', ''),\n errorText: parsed?.errorText ?? '',\n dynamic: r.bool('dynamic'),\n providerExecuted: r.bool('providerExecuted'),\n }),\n );\n};\n\nconst decodeToolApprovalRequest = (r: VercelHeaderReader): Out[] =>\n event({\n type: 'tool-approval-request',\n toolCallId: r.strOr('toolCallId', ''),\n approvalId: r.strOr('approvalId', ''),\n });\n\nconst decodeToolOutputDenied = (r: VercelHeaderReader): Out[] =>\n event({ type: 'tool-output-denied', toolCallId: r.strOr('toolCallId', '') });\n\nconst decodeDataEvent = (name: `data-${string}`, r: VercelHeaderReader, data: unknown): Out[] =>\n event(\n stripUndefined({\n type: name,\n data,\n id: r.str('id'),\n transient: r.bool('transient'),\n }),\n );\n\n// ---------------------------------------------------------------------------\n// Non-streaming tool-input helper\n// ---------------------------------------------------------------------------\n\nconst decodeNonStreamingToolInput = (\n r: VercelHeaderReader,\n data: unknown,\n turnId: string,\n lifecycle: LifecycleTracker<AI.UIMessageChunk>,\n): Out[] => {\n const outputs = ensurePhases(lifecycle, turnId, { messageId: r.str('messageId') });\n\n outputs.push(\n {\n kind: 'event',\n event: stripUndefined({\n type: 'tool-input-start' as const,\n toolCallId: r.strOr('toolCallId', ''),\n toolName: r.strOr('toolName', ''),\n dynamic: r.bool('dynamic'),\n title: r.str('title'),\n providerExecuted: r.bool('providerExecuted'),\n providerMetadata: r.providerMetadata(),\n }),\n },\n {\n kind: 'event',\n event: stripUndefined({\n type: 'tool-input-available' as const,\n toolCallId: r.strOr('toolCallId', ''),\n toolName: r.strOr('toolName', ''),\n input: data,\n providerMetadata: r.providerMetadata(),\n }),\n },\n );\n\n return outputs;\n};\n\n// ---------------------------------------------------------------------------\n// Discrete event dispatch\n// ---------------------------------------------------------------------------\n\n/**\n * Reconstruct a UIMessage from a discrete message part published by writeMessages.\n * The encoder splits each UIMessage into per-part Ably messages with a shared\n * x-domain-messageId. This function rebuilds a single-part UIMessage from one\n * such Ably message. The transport's tree upsert merges parts that share the\n * same x-ably-msg-id, so multi-part messages accumulate correctly over\n * successive decoder calls.\n * @param input - The discrete message payload to decode.\n * @returns A single-element array with the reconstructed UIMessage, or empty if unrecognized.\n */\nconst decodeDiscreteMessage = (input: MessagePayload): Out[] => {\n const h = input.headers ?? {};\n const r = headerReader(h);\n const role = (h[HEADER_ROLE] ?? 'user') as AI.UIMessage['role'];\n const messageId = r.str('messageId') ?? '';\n\n let part: AI.UIMessage['parts'][number] | undefined;\n\n switch (input.name) {\n case 'text': {\n part = { type: 'text', text: typeof input.data === 'string' ? input.data : '' };\n break;\n }\n case 'file': {\n part = {\n type: 'file',\n mediaType: r.strOr('mediaType', ''),\n url: typeof input.data === 'string' ? input.data : '',\n };\n break;\n }\n default: {\n if (isDataEventName(input.name)) {\n // CAST: data-* part type matches the DataUIPart shape.\n part = stripUndefined({ type: input.name, id: r.str('id'), data: input.data }) as AI.UIMessage['parts'][number];\n }\n break;\n }\n }\n\n if (!part) return [];\n\n const message: AI.UIMessage = { id: messageId, role, parts: [part] };\n return [{ kind: 'message', message }];\n};\n\n/**\n * Whether a message name represents a discrete message part (written by writeMessages)\n * rather than a streaming lifecycle event. Discrete message parts carry x-ably-role\n * and encode a single UIMessage part each.\n * @param name - The Ably message name to check.\n * @param headers - The Ably message headers to inspect for role presence.\n * @returns True if this is a discrete message part, false if it's a lifecycle event.\n */\nconst isDiscreteMessagePart = (name: string, headers: Record<string, string>): boolean =>\n (name === 'text' || name === 'file' || isDataEventName(name)) && HEADER_ROLE in headers;\n\nconst decodeDiscretePayload = (input: MessagePayload, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n const h = input.headers ?? {};\n const r = headerReader(h);\n const turnId = h[HEADER_TURN_ID] ?? '';\n\n // Discrete message parts from writeMessages (user messages, history entries).\n // Distinguished from lifecycle events by the presence of x-ably-role.\n if (isDiscreteMessagePart(input.name, h)) {\n return decodeDiscreteMessage(input);\n }\n\n if (input.name === 'tool-input') {\n return decodeNonStreamingToolInput(r, input.data, turnId, lifecycle);\n }\n\n switch (input.name) {\n case 'start': {\n return decodeStart(r, turnId, lifecycle);\n }\n case 'start-step': {\n return decodeStartStep(turnId, lifecycle);\n }\n case 'finish-step': {\n return decodeFinishStep(turnId, lifecycle);\n }\n case 'finish': {\n return decodeFinish(r, turnId, lifecycle);\n }\n case 'error': {\n return decodeError(input.data);\n }\n case 'abort': {\n return decodeAbort(input.data, turnId, lifecycle);\n }\n case 'message-metadata': {\n return decodeMessageMetadata(r);\n }\n case 'file': {\n return decodeFile(r, input.data);\n }\n case 'source-url': {\n return decodeSourceUrl(r, input.data);\n }\n case 'source-document': {\n return decodeSourceDocument(r);\n }\n case 'tool-input-error': {\n return decodeToolInputError(r, input.data);\n }\n case 'tool-output-available': {\n return decodeToolOutputAvailable(r, input.data);\n }\n case 'tool-output-error': {\n return decodeToolOutputError(r, input.data);\n }\n case 'tool-approval-request': {\n return decodeToolApprovalRequest(r);\n }\n case 'tool-output-denied': {\n return decodeToolOutputDenied(r);\n }\n default: {\n return isDataEventName(input.name) ? decodeDataEvent(input.name, r, input.data) : [];\n }\n }\n};\n\n// ---------------------------------------------------------------------------\n// Decoder core hooks\n// ---------------------------------------------------------------------------\n\nconst createHooks = (\n lifecycle: LifecycleTracker<AI.UIMessageChunk>,\n): DecoderCoreHooks<AI.UIMessageChunk, AI.UIMessage> => ({\n buildStartEvents: (tracker: StreamTrackerState): Out[] => {\n const turnId = tracker.headers[HEADER_TURN_ID] ?? '';\n const messageId = headerReader(tracker.headers).str('messageId');\n const outputs = ensurePhases(lifecycle, turnId, { messageId });\n outputs.push({ kind: 'event', event: buildStartChunk(tracker) });\n return outputs;\n },\n\n buildDeltaEvents: (tracker: StreamTrackerState, delta: string): Out[] => event(buildDeltaChunk(tracker, delta)),\n\n buildEndEvents: (tracker: StreamTrackerState, closingHeaders: Record<string, string>): Out[] =>\n event(buildEndChunk(tracker, closingHeaders)),\n\n decodeDiscrete: (payload: MessagePayload): Out[] => decodeDiscretePayload(payload, lifecycle),\n});\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\nclass DefaultUIMessageDecoder implements StreamDecoder<AI.UIMessageChunk, AI.UIMessage> {\n private readonly _core: DecoderCore<AI.UIMessageChunk, AI.UIMessage>;\n\n constructor(options: DecoderCoreOptions = {}) {\n this._core = createDecoderCore<AI.UIMessageChunk, AI.UIMessage>(\n createHooks(createVercelLifecycleTracker()),\n options,\n );\n }\n\n decode(message: Ably.InboundMessage): Out[] {\n return this._core.decode(message);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel AI SDK decoder that maps Ably messages to UIMessageChunk\n * events and UIMessage objects via the decoder core.\n * @param options - Decoder configuration (callbacks, logger).\n * @returns A {@link StreamDecoder} for UIMessageChunk/UIMessage.\n */\nexport const createDecoder = (options: DecoderCoreOptions = {}): StreamDecoder<AI.UIMessageChunk, AI.UIMessage> =>\n new DefaultUIMessageDecoder(options);\n","/**\n * Encoder core — message append lifecycle machinery.\n *\n * Provides Ably primitives (publish, append, close, abort, flush) that\n * domain-specific encoders wire their event types to.\n *\n * Domain encoders call `createEncoderCore(writer, options)` and use the\n * returned core to map domain events to Ably operations without\n * reimplementing the message append lifecycle.\n */\n\nimport * as Ably from 'ably';\n\nimport { HEADER_MSG_ID, HEADER_STATUS, HEADER_STREAM, HEADER_STREAM_ID } from '../../constants.js';\nimport { ErrorCode } from '../../errors.js';\nimport type { Logger } from '../../logger.js';\nimport { mergeHeaders } from '../../utils.js';\nimport type { ChannelWriter, EncoderOptions, Extras, MessagePayload, StreamPayload, WriteOptions } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/** Options for creating an encoder core. Extends {@link EncoderOptions} with a logger. */\nexport interface EncoderCoreOptions extends EncoderOptions {\n /** Logger instance for diagnostic output. */\n logger?: Logger;\n}\n\n// ---------------------------------------------------------------------------\n// Stream tracker (internal)\n// ---------------------------------------------------------------------------\n\ninterface StreamState {\n serial: string;\n name: string;\n streamId: string;\n accumulated: string;\n persistentHeaders: Record<string, string>;\n aborted: boolean;\n}\n\ninterface PendingAppend {\n promise: Promise<Ably.UpdateDeleteResult>;\n streamId: string;\n}\n\n// ---------------------------------------------------------------------------\n// Encoder core interface\n// ---------------------------------------------------------------------------\n\n/** The core encoder primitives that domain codec encoders delegate to. */\nexport interface EncoderCore {\n /** Publish a single discrete (non-streaming) message described by a payload. */\n publishDiscrete(payload: MessagePayload, opts?: WriteOptions): Promise<Ably.PublishResult>;\n\n /** Publish multiple discrete messages atomically in a single channel publish. */\n publishDiscreteBatch(payloads: MessagePayload[], opts?: WriteOptions): Promise<Ably.PublishResult>;\n\n /** Start a streamed message with x-ably-status:streaming. */\n startStream(streamId: string, payload: StreamPayload, opts?: WriteOptions): Promise<void>;\n\n /**\n * Append data to an in-flight streamed message. Fire-and-forget: errors are\n * collected internally and surfaced by {@link closeStream} or {@link close}.\n */\n appendStream(streamId: string, data: string): void;\n\n /**\n * Close a streamed message with x-ably-status:finished. Flushes all pending\n * appends for recovery before returning. Repeats persistent and payload headers.\n */\n closeStream(streamId: string, payload: StreamPayload): Promise<void>;\n\n /**\n * Abort a single in-progress stream (x-ably-status:aborted) and flush all\n * pending appends for recovery before returning.\n */\n abortStream(streamId: string, opts?: WriteOptions): Promise<void>;\n\n /**\n * Abort all in-progress streams (x-ably-status:aborted) and flush all\n * pending appends for recovery before returning.\n */\n abortAllStreams(opts?: WriteOptions): Promise<void>;\n\n /** Flush + clear trackers. Idempotent. */\n close(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CD1\nclass DefaultEncoderCore implements EncoderCore {\n private readonly _writer: ChannelWriter;\n private readonly _defaultClientId: string | undefined;\n private readonly _defaultExtras: Extras | undefined;\n private readonly _onMessageHook: (message: Ably.Message) => void;\n private readonly _logger: Logger | undefined;\n private readonly _trackers = new Map<string, StreamState>();\n private _pending: PendingAppend[] = [];\n private _flushPromise: Promise<void> | undefined;\n private _closed = false;\n\n constructor(writer: ChannelWriter, options: EncoderCoreOptions = {}) {\n this._writer = writer;\n this._defaultClientId = options.clientId;\n this._defaultExtras = options.extras;\n this._onMessageHook =\n options.onMessage ??\n (() => {\n /* noop */\n });\n this._logger = options.logger?.withContext({ component: 'EncoderCore' });\n }\n\n // Spec: AIT-CD11\n async publishDiscrete(payload: MessagePayload, opts?: WriteOptions): Promise<Ably.PublishResult> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.publishDiscrete();', { name: payload.name });\n const msg = this._buildDiscreteMessage(payload, opts);\n return this._writer.publish(msg);\n }\n\n // Spec: AIT-CD11a\n async publishDiscreteBatch(payloads: MessagePayload[], opts?: WriteOptions): Promise<Ably.PublishResult> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.publishDiscreteBatch();', { count: payloads.length });\n const msgs = payloads.map((p) => this._buildDiscreteMessage(p, opts));\n return this._writer.publish(msgs);\n }\n\n // Spec: AIT-CD2\n async startStream(streamId: string, payload: StreamPayload, opts?: WriteOptions): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.startStream();', { name: payload.name, streamId });\n\n const allHeaders = this._buildHeaders(payload.headers ?? {}, opts);\n allHeaders[HEADER_STREAM] = 'true';\n allHeaders[HEADER_STATUS] = 'streaming';\n allHeaders[HEADER_STREAM_ID] = streamId;\n\n const clientId = this._resolveClientId(opts);\n const msg: Ably.Message = {\n name: payload.name,\n data: payload.data,\n extras: { headers: allHeaders },\n ...(clientId ? { clientId } : {}),\n };\n\n this._invokeOnMessage(msg);\n const result = await this._writer.publish(msg);\n const serial = result.serials[0];\n\n if (!serial) {\n throw new Ably.ErrorInfo(\n `unable to start stream; no serial returned for stream '${payload.name}' (streamId: ${streamId})`,\n ErrorCode.BadRequest,\n 400,\n );\n }\n\n this._trackers.set(streamId, {\n serial,\n name: payload.name,\n streamId,\n accumulated: payload.data,\n persistentHeaders: allHeaders,\n aborted: false,\n });\n\n this._logger?.debug('DefaultEncoderCore.startStream(); stream started', {\n name: payload.name,\n streamId,\n serial,\n });\n }\n\n // Spec: AIT-CD3\n appendStream(streamId: string, data: string): void {\n this._assertNotClosed();\n const tracker = this._trackers.get(streamId);\n if (!tracker) {\n throw new Ably.ErrorInfo(\n `unable to append to stream; no active stream for streamId '${streamId}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n\n tracker.accumulated += data;\n\n const appendMsg: Ably.Message = {\n serial: tracker.serial,\n data,\n extras: { headers: { ...tracker.persistentHeaders } },\n };\n\n this._invokeOnMessage(appendMsg);\n const p = this._writer.appendMessage(appendMsg);\n this._pending.push({ promise: p, streamId });\n }\n\n // Spec: AIT-CD4, AIT-CD4a\n async closeStream(streamId: string, payload: StreamPayload): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.closeStream();', { streamId });\n\n const tracker = this._trackers.get(streamId);\n if (!tracker) {\n throw new Ably.ErrorInfo(\n `unable to close stream; no active stream for streamId '${streamId}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n\n // Accumulate closing data so recovery has the full content\n tracker.accumulated += payload.data;\n\n const allHeaders = this._buildClosingHeaders(tracker, payload.headers ?? {});\n allHeaders[HEADER_STATUS] = 'finished';\n\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: payload.data,\n extras: { headers: allHeaders },\n };\n\n this._invokeOnMessage(msg);\n const p = this._writer.appendMessage(msg);\n this._pending.push({ promise: p, streamId });\n\n await this._flushPending();\n\n this._logger?.debug('DefaultEncoderCore.closeStream(); stream closed', { streamId });\n }\n\n // Spec: AIT-CD5, AIT-CD5b\n async abortStream(streamId: string, opts?: WriteOptions): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.abortStream();', { streamId });\n\n const tracker = this._trackers.get(streamId);\n if (!tracker) {\n throw new Ably.ErrorInfo(\n `unable to abort stream; no active stream for streamId '${streamId}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n\n tracker.aborted = true;\n\n const allHeaders = this._buildClosingHeaders(tracker, {}, opts);\n allHeaders[HEADER_STATUS] = 'aborted';\n\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: '',\n extras: { headers: allHeaders },\n };\n\n this._invokeOnMessage(msg);\n const p = this._writer.appendMessage(msg);\n this._pending.push({ promise: p, streamId });\n\n await this._flushPending();\n\n this._logger?.debug('DefaultEncoderCore.abortStream(); stream aborted', { streamId });\n }\n\n // Spec: AIT-CD5a\n async abortAllStreams(opts?: WriteOptions): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.abortAllStreams();', { streamCount: this._trackers.size });\n\n for (const tracker of this._trackers.values()) {\n tracker.aborted = true;\n\n const allHeaders = this._buildClosingHeaders(tracker, {}, opts);\n allHeaders[HEADER_STATUS] = 'aborted';\n\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: '',\n extras: { headers: allHeaders },\n };\n\n this._invokeOnMessage(msg);\n const p = this._writer.appendMessage(msg);\n this._pending.push({ promise: p, streamId: tracker.streamId });\n }\n\n await this._flushPending();\n }\n\n // Spec: AIT-CD6\n private async _flushPending(): Promise<void> {\n // Re-entrancy guard: if a flush is already in progress, await it instead of starting a new one.\n if (this._flushPromise) {\n return this._flushPromise;\n }\n\n const snapshot = this._pending;\n this._pending = [];\n\n if (snapshot.length === 0) return;\n\n this._logger?.trace('DefaultEncoderCore._flushPending();', { count: snapshot.length });\n\n this._flushPromise = this._doFlush(snapshot);\n try {\n await this._flushPromise;\n } finally {\n this._flushPromise = undefined;\n }\n }\n\n private async _doFlush(snapshot: PendingAppend[]): Promise<void> {\n const results = await Promise.allSettled(snapshot.map(async (p) => p.promise));\n const failures = new Set<string>();\n\n for (const [i, result] of results.entries()) {\n const entry = snapshot[i];\n if (entry && result.status === 'rejected') {\n failures.add(entry.streamId);\n }\n }\n\n if (failures.size === 0) {\n this._logger?.debug('DefaultEncoderCore._flushPending(); all appends succeeded');\n return;\n }\n\n this._logger?.warn('DefaultEncoderCore._flushPending(); recovering failed appends', {\n failedStreams: [...failures],\n });\n\n const recoveryErrors: { streamId: string; error: unknown }[] = [];\n\n for (const streamId of failures) {\n const tracker = this._trackers.get(streamId);\n if (!tracker) continue;\n\n const recoveryStatus = tracker.aborted ? 'aborted' : 'finished';\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: tracker.accumulated,\n extras: { headers: { ...tracker.persistentHeaders, [HEADER_STATUS]: recoveryStatus } },\n };\n\n try {\n await this._writer.updateMessage(msg);\n } catch (error) {\n recoveryErrors.push({ streamId, error });\n }\n }\n\n if (recoveryErrors.length > 0) {\n const ids = recoveryErrors.map((e) => e.streamId).join(', ');\n this._logger?.error('DefaultEncoderCore._flushPending(); recovery failed', { failedStreams: ids });\n throw new Ably.ErrorInfo(\n `unable to flush pending appends; recovery failed for stream(s): ${ids}`,\n ErrorCode.EncoderRecoveryFailed,\n 500,\n );\n }\n }\n\n // Spec: AIT-CD12\n async close(): Promise<void> {\n if (this._closed) return;\n this._logger?.trace('DefaultEncoderCore.close();');\n this._closed = true;\n try {\n await this._flushPending();\n } finally {\n this._trackers.clear();\n }\n this._logger?.debug('DefaultEncoderCore.close(); encoder closed');\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD14\n private _invokeOnMessage(msg: Ably.Message): void {\n try {\n this._onMessageHook(msg);\n } catch (error) {\n this._logger?.error('DefaultEncoderCore._invokeOnMessage(); hook threw', { error });\n }\n }\n\n private _assertNotClosed(): void {\n if (this._closed) {\n throw new Ably.ErrorInfo('unable to write to encoder; encoder has been closed', ErrorCode.InvalidArgument, 400);\n }\n }\n\n private _resolveClientId(opts?: WriteOptions): string | undefined {\n return opts?.clientId ?? this._defaultClientId;\n }\n\n private _buildHeaders(codecHeaders: Record<string, string>, opts?: WriteOptions): Record<string, string> {\n const callerHeaders = mergeHeaders(this._defaultExtras?.headers, opts?.extras?.headers);\n const merged = { ...callerHeaders, ...codecHeaders };\n if (opts?.messageId !== undefined) {\n merged[HEADER_MSG_ID] = opts.messageId;\n }\n return merged;\n }\n\n private _buildDiscreteMessage(payload: MessagePayload, opts?: WriteOptions): Ably.Message {\n const headers = this._buildHeaders(payload.headers ?? {}, opts);\n headers[HEADER_STREAM] = 'false';\n const clientId = this._resolveClientId(opts);\n\n const msg: Ably.Message = {\n name: payload.name,\n data: payload.data,\n extras: {\n headers,\n ...(payload.ephemeral ? { ephemeral: true } : {}),\n },\n ...(clientId ? { clientId } : {}),\n };\n\n this._invokeOnMessage(msg);\n return msg;\n }\n\n /**\n * Build headers for a closing append. Closing appends must repeat ALL\n * persistent headers (Ably replaces the entire extras object on append).\n * Then layer caller and codec overrides.\n * @param tracker - The stream tracker with persistent headers.\n * @param codecHeaders - Codec-layer headers to merge.\n * @param opts - Optional per-write overrides.\n * @returns Merged headers for the closing append.\n */\n private _buildClosingHeaders(\n tracker: StreamState,\n codecHeaders: Record<string, string>,\n opts?: WriteOptions,\n ): Record<string, string> {\n const h = { ...tracker.persistentHeaders };\n const callerHeaders = mergeHeaders(this._defaultExtras?.headers, opts?.extras?.headers);\n Object.assign(h, callerHeaders);\n Object.assign(h, codecHeaders);\n return h;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create an encoder core bound to the given channel writer.\n * @param writer - The channel writer to publish messages through.\n * @param options - Encoder configuration (clientId, extras, hooks, logger).\n * @returns A new {@link EncoderCore} instance.\n */\nexport const createEncoderCore = (writer: ChannelWriter, options: EncoderCoreOptions = {}): EncoderCore =>\n new DefaultEncoderCore(writer, options);\n","/**\n * Vercel AI SDK Encoder\n *\n * Maps UIMessageChunk events and complete UIMessage objects to Ably channel\n * operations (publish, appendMessage, updateMessage).\n *\n * Delegates the message append lifecycle (publish, append, close, abort,\n * flush/recover) to the encoder core. This file contains only the\n * Vercel-specific event-to-operation mapping.\n *\n * Domain-specific headers use the `x-domain-` prefix to distinguish them\n * from transport-level `x-ably-` headers.\n *\n * ## Core operations and domain headers\n *\n * Each UIMessageChunk maps to exactly one encoder core operation. Domain\n * headers are passed to every operation that accepts them — the core handles\n * merging, persistence, and deduplication:\n *\n * - **`startStream`**: Opens a message stream. Domain headers become\n * \"persistent headers\" — the core repeats them on every subsequent append.\n * - **`appendStream`**: Appends a text delta. Data only, no headers parameter.\n * The core automatically carries persistent headers from start.\n * - **`closeStream`**: Closes the stream. Pass all domain headers from the\n * chunk — the core merges them on top of persistent headers, so changed\n * values (e.g. updated providerMetadata) are picked up and unchanged\n * values are harmlessly deduplicated.\n * - **`publishDiscrete`**: Publishes a standalone message. All domain headers\n * for the chunk are passed directly.\n */\n\nimport * as Ably from 'ably';\nimport type * as AI from 'ai';\nimport { isDataUIPart } from 'ai';\n\nimport { HEADER_STATUS } from '../../constants.js';\nimport type { EncoderCore, EncoderCoreOptions } from '../../core/codec/encoder.js';\nimport { createEncoderCore } from '../../core/codec/encoder.js';\nimport type { ChannelWriter, MessagePayload, StreamEncoder, WriteOptions } from '../../core/codec/types.js';\nimport { ErrorCode, errorInfoIs } from '../../errors.js';\nimport { headerWriter } from '../../utils.js';\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\nclass DefaultUIMessageEncoder implements StreamEncoder<AI.UIMessageChunk, AI.UIMessage> {\n private readonly _core: EncoderCore;\n private _aborted = false;\n\n constructor(writer: ChannelWriter, options: EncoderCoreOptions = {}) {\n this._core = createEncoderCore(writer, options);\n }\n\n async appendEvent(chunk: AI.UIMessageChunk, perWrite?: WriteOptions): Promise<void> {\n switch (chunk.type) {\n // -- Stream start: open a message stream with persistent headers -------\n\n case 'text-start': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.startStream(chunk.id, { name: 'text', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'reasoning-start': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.startStream(chunk.id, { name: 'reasoning', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'tool-input-start': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .bool('dynamic', chunk.dynamic)\n .str('title', chunk.title)\n .bool('providerExecuted', chunk.providerExecuted)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.startStream(chunk.toolCallId, { name: 'tool-input', data: '', headers: h }, perWrite);\n break;\n }\n\n // -- Stream append: data only, core carries persistent headers --------\n\n case 'text-delta': {\n this._core.appendStream(chunk.id, chunk.delta);\n break;\n }\n\n case 'reasoning-delta': {\n this._core.appendStream(chunk.id, chunk.delta);\n break;\n }\n\n case 'tool-input-delta': {\n this._core.appendStream(chunk.toolCallId, chunk.inputTextDelta);\n break;\n }\n\n // -- Stream close: pass all chunk headers, core merges with persistent\n\n case 'text-end': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.closeStream(chunk.id, { name: 'text', data: '', headers: h });\n break;\n }\n\n case 'reasoning-end': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.closeStream(chunk.id, { name: 'reasoning', data: '', headers: h });\n break;\n }\n\n case 'tool-input-available': {\n // If a stream tracker exists, this tool call was streamed — close it.\n // Otherwise it's a non-streaming tool call — publish discrete.\n try {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.closeStream(chunk.toolCallId, { name: 'tool-input', data: '', headers: h });\n } catch (error: unknown) {\n // Only fall through to discrete for \"no active stream\" — rethrow real failures\n if (!(error instanceof Ably.ErrorInfo && errorInfoIs(error, ErrorCode.InvalidArgument))) {\n throw error;\n }\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .bool('dynamic', chunk.dynamic)\n .str('title', chunk.title)\n .bool('providerExecuted', chunk.providerExecuted)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'tool-input', data: chunk.input, headers: h });\n }\n break;\n }\n\n // -- Discrete: lifecycle events ---------------------------------------\n\n case 'start': {\n const h = headerWriter()\n .str('messageId', chunk.messageId)\n .json('messageMetadata', chunk.messageMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'start', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'start-step': {\n await this._core.publishDiscrete({ name: 'start-step', data: '' }, perWrite);\n break;\n }\n\n case 'finish-step': {\n await this._core.publishDiscrete({ name: 'finish-step', data: '' }, perWrite);\n break;\n }\n\n case 'finish': {\n const h = headerWriter()\n .str('finishReason', chunk.finishReason)\n .json('messageMetadata', chunk.messageMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'finish', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'error': {\n await this._core.publishDiscrete({ name: 'error', data: chunk.errorText }, perWrite);\n break;\n }\n\n case 'abort': {\n this._aborted = true;\n await this._core.abortAllStreams(perWrite);\n await this._core.publishDiscrete(\n { name: 'abort', data: chunk.reason ?? '', headers: { [HEADER_STATUS]: 'aborted' } },\n perWrite,\n );\n break;\n }\n\n // -- Discrete: tool lifecycle events ----------------------------------\n\n case 'tool-input-error': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .bool('dynamic', chunk.dynamic)\n .str('title', chunk.title)\n .bool('providerExecuted', chunk.providerExecuted)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({\n name: 'tool-input-error',\n data: { errorText: chunk.errorText, input: chunk.input },\n headers: h,\n });\n break;\n }\n\n case 'tool-output-available': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .bool('dynamic', chunk.dynamic)\n .bool('providerExecuted', chunk.providerExecuted)\n .bool('preliminary', chunk.preliminary)\n .build();\n await this._core.publishDiscrete({\n name: 'tool-output-available',\n data: { output: chunk.output },\n headers: h,\n });\n break;\n }\n\n case 'tool-output-error': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .bool('dynamic', chunk.dynamic)\n .bool('providerExecuted', chunk.providerExecuted)\n .build();\n await this._core.publishDiscrete({\n name: 'tool-output-error',\n data: { errorText: chunk.errorText },\n headers: h,\n });\n break;\n }\n\n case 'tool-approval-request': {\n const h = headerWriter().str('toolCallId', chunk.toolCallId).str('approvalId', chunk.approvalId).build();\n await this._core.publishDiscrete({ name: 'tool-approval-request', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'tool-output-denied': {\n const h = headerWriter().str('toolCallId', chunk.toolCallId).build();\n await this._core.publishDiscrete({ name: 'tool-output-denied', data: '', headers: h }, perWrite);\n break;\n }\n\n // -- Discrete: content parts ------------------------------------------\n\n case 'file': {\n const h = headerWriter()\n .str('mediaType', chunk.mediaType)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'file', data: chunk.url, headers: h }, perWrite);\n break;\n }\n\n case 'source-url': {\n const h = headerWriter()\n .str('sourceId', chunk.sourceId)\n .str('title', chunk.title)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'source-url', data: chunk.url, headers: h }, perWrite);\n break;\n }\n\n case 'source-document': {\n const h = headerWriter()\n .str('sourceId', chunk.sourceId)\n .str('mediaType', chunk.mediaType)\n .str('title', chunk.title)\n .str('filename', chunk.filename)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'source-document', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'message-metadata': {\n const h = headerWriter().json('messageMetadata', chunk.messageMetadata).build();\n await this._core.publishDiscrete({ name: 'message-metadata', data: '', headers: h }, perWrite);\n break;\n }\n\n // -- Discrete: data-* custom chunks -----------------------------------\n\n default: {\n if (chunk.type.startsWith('data-')) {\n const h = headerWriter().str('id', chunk.id).bool('transient', chunk.transient).build();\n const ephemeral = chunk.transient === true;\n await this._core.publishDiscrete({ name: chunk.type, data: chunk.data, headers: h, ephemeral }, perWrite);\n }\n break;\n }\n }\n }\n\n async writeEvent(chunk: AI.UIMessageChunk, perWrite?: WriteOptions): Promise<Ably.PublishResult> {\n if (!chunk.type.startsWith('data-')) {\n throw new Ably.ErrorInfo(\n `unable to write event; only data-* chunk types are supported, got '${chunk.type}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n const h = headerWriter()\n .str('id', 'id' in chunk ? chunk.id : undefined)\n .bool('transient', 'transient' in chunk ? chunk.transient : undefined)\n .build();\n const ephemeral = 'transient' in chunk && chunk.transient === true;\n return this._core.publishDiscrete(\n { name: chunk.type, data: 'data' in chunk ? chunk.data : undefined, headers: h, ephemeral },\n perWrite,\n );\n }\n\n async writeMessages(messages: AI.UIMessage[], perWrite?: WriteOptions): Promise<Ably.PublishResult> {\n const payloads = messages.flatMap((msg) => encodeMessagePayloads(msg));\n return this._core.publishDiscreteBatch(payloads, perWrite);\n }\n\n async abort(reason?: string): Promise<void> {\n if (this._aborted) return;\n this._aborted = true;\n await this._core.abortAllStreams();\n await this._core.publishDiscrete({\n name: 'abort',\n data: reason ?? '',\n headers: { [HEADER_STATUS]: 'aborted' },\n });\n }\n\n async close(): Promise<void> {\n await this._core.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message payload encoding (stateless helper)\n// ---------------------------------------------------------------------------\n\nconst encodeMessagePayloads = (message: AI.UIMessage): MessagePayload[] => {\n const messageId = message.id;\n const payloads: MessagePayload[] = [];\n\n for (const part of message.parts) {\n switch (part.type) {\n case 'text': {\n payloads.push({ name: 'text', data: part.text, headers: headerWriter().str('messageId', messageId).build() });\n break;\n }\n case 'file': {\n payloads.push({\n name: 'file',\n data: part.url,\n headers: headerWriter().str('messageId', messageId).str('mediaType', part.mediaType).build(),\n });\n break;\n }\n default: {\n if (isDataUIPart(part)) {\n payloads.push({\n name: part.type,\n data: part.data,\n headers: headerWriter().str('messageId', messageId).str('id', part.id).build(),\n });\n }\n break;\n }\n }\n }\n\n if (payloads.length === 0) {\n payloads.push({ name: 'text', data: '', headers: headerWriter().str('messageId', messageId).build() });\n }\n\n return payloads;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel AI SDK encoder that maps UIMessageChunk events to Ably\n * channel operations via the encoder core.\n * @param writer - The channel writer to publish messages through.\n * @param options - Encoder configuration (clientId, extras, hooks, logger).\n * @returns A {@link StreamEncoder} for UIMessageChunk/UIMessage.\n */\nexport const createEncoder = (\n writer: ChannelWriter,\n options: EncoderCoreOptions = {},\n): StreamEncoder<AI.UIMessageChunk, AI.UIMessage> => new DefaultUIMessageEncoder(writer, options);\n","/**\n * Vercel AI SDK codec — maps UIMessageChunk events and UIMessage objects\n * to/from native Ably message primitives (publish, append, update, delete).\n *\n * ```ts\n * import { UIMessageCodec } from '@ably/ai-transport/vercel';\n *\n * const encoder = UIMessageCodec.createEncoder(writer, options);\n * const decoder = UIMessageCodec.createDecoder();\n * const accumulator = UIMessageCodec.createAccumulator();\n * ```\n */\n\nimport type * as AI from 'ai';\n\nimport type { Codec } from '../../core/codec/types.js';\nimport { createAccumulator } from './accumulator.js';\nimport { createDecoder } from './decoder.js';\nimport { createEncoder } from './encoder.js';\n\n/**\n * Vercel AI SDK codec implementing `Codec<UIMessageChunk, UIMessage>`.\n *\n * Provides factory methods for creating encoders, decoders, and accumulators\n * that map between Vercel's UIMessageChunk/UIMessage types and Ably's native\n * message primitives.\n */\nexport const UIMessageCodec: Codec<AI.UIMessageChunk, AI.UIMessage> = {\n createEncoder,\n createDecoder,\n createAccumulator,\n\n getMessageKey: (message: AI.UIMessage): string => message.id,\n\n isTerminal: (event: AI.UIMessageChunk): boolean =>\n event.type === 'finish' || event.type === 'error' || event.type === 'abort',\n};\n","/**\n * Vercel AI SDK transport wrappers that pre-bind the UIMessageCodec.\n *\n * These are convenience factories so consumers don't need to pass the codec\n * explicitly when using the Vercel AI SDK integration.\n *\n * ```ts\n * import { createClientTransport } from '@ably/ai-transport/vercel';\n *\n * const transport = createClientTransport({ channel });\n * ```\n */\n\n// Chat transport adapter\nexport type { ChatTransport, ChatTransportOptions, SendMessagesRequestContext } from './chat-transport.js';\nexport { createChatTransport } from './chat-transport.js';\n\nimport type * as AI from 'ai';\n\nimport { createClientTransport as createCoreClientTransport } from '../../core/transport/client-transport.js';\nimport { createServerTransport as createCoreServerTransport } from '../../core/transport/server-transport.js';\nimport type {\n ClientTransport,\n ClientTransportOptions,\n ServerTransport,\n ServerTransportOptions,\n} from '../../core/transport/types.js';\nimport { UIMessageCodec } from '../codec/index.js';\n\n/** Options for creating a Vercel client transport. Same as core options but without the codec field. */\nexport type VercelClientTransportOptions = Omit<ClientTransportOptions<AI.UIMessageChunk, AI.UIMessage>, 'codec'>;\n\n/** Options for creating a Vercel server transport. Same as core options but without the codec field. */\nexport type VercelServerTransportOptions = Omit<ServerTransportOptions<AI.UIMessageChunk, AI.UIMessage>, 'codec'>;\n\n/**\n * Create a client-side transport pre-configured with the Vercel AI SDK codec.\n *\n * Equivalent to calling the core `createClientTransport` with `codec: UIMessageCodec`.\n * @param options - Configuration for the client transport (codec is provided automatically).\n * @returns A new {@link ClientTransport} for Vercel AI SDK UIMessage/UIMessageChunk types.\n */\nexport const createClientTransport = (\n options: VercelClientTransportOptions,\n): ClientTransport<AI.UIMessageChunk, AI.UIMessage> => createCoreClientTransport({ ...options, codec: UIMessageCodec });\n\n/**\n * Create a server-side transport pre-configured with the Vercel AI SDK codec.\n *\n * Equivalent to calling the core `createServerTransport` with `codec: UIMessageCodec`.\n * @param options - Configuration for the server transport (codec is provided automatically).\n * @returns A new {@link ServerTransport} for Vercel AI SDK UIMessage/UIMessageChunk types.\n */\nexport const createServerTransport = (\n options: VercelServerTransportOptions,\n): ServerTransport<AI.UIMessageChunk, AI.UIMessage> => createCoreServerTransport({ ...options, codec: UIMessageCodec });\n","/**\n * useChatTransport: wraps a core ClientTransport into the ChatTransport\n * shape that Vercel's useChat expects.\n *\n * Accepts either an existing ClientTransport or options to create one:\n * - From an existing ClientTransport — wraps it directly\n * - From options — creates a ClientTransport with UIMessageCodec and wraps it\n *\n * Both forms accept an optional second argument for ChatTransportOptions\n * (e.g. prepareSendMessagesRequest for the persistence pattern).\n *\n * The hook does NOT auto-close the transport on unmount. Channel lifecycle is\n * managed by the Ably provider (useChannel). Auto-closing would break React\n * Strict Mode. Call chatTransport.close() explicitly if needed.\n */\n\nimport type * as AI from 'ai';\nimport { useRef } from 'react';\n\nimport type { ClientTransport } from '../../core/transport/types.js';\nimport type { ChatTransport, ChatTransportOptions } from '../transport/chat-transport.js';\nimport { createChatTransport } from '../transport/chat-transport.js';\nimport type { VercelClientTransportOptions } from '../transport/index.js';\nimport { createClientTransport as createCoreClientTransport } from '../transport/index.js';\n\n/**\n * Type guard: distinguish an existing ClientTransport from options.\n * @param x - Either a transport instance or options object.\n * @returns True if the argument is a ClientTransport instance.\n */\nconst isClientTransport = (\n x: ClientTransport<AI.UIMessageChunk, AI.UIMessage> | VercelClientTransportOptions,\n): x is ClientTransport<AI.UIMessageChunk, AI.UIMessage> => 'send' in x && typeof x.send === 'function';\n\n/**\n * Create and memoize a {@link ChatTransport} for Vercel's useChat hook.\n *\n * Pass an existing `ClientTransport` to wrap it, or pass\n * `VercelClientTransportOptions` to create one internally with UIMessageCodec.\n * @param transportOrOptions - An existing ClientTransport, or options to create one.\n * @param chatOptions - Optional hooks for customizing request construction.\n * @returns A {@link ChatTransport} compatible with Vercel's useChat hook.\n */\nexport const useChatTransport = (\n transportOrOptions: ClientTransport<AI.UIMessageChunk, AI.UIMessage> | VercelClientTransportOptions,\n chatOptions?: ChatTransportOptions,\n): ChatTransport => {\n const chatTransportRef = useRef<ChatTransport | null>(null);\n\n if (chatTransportRef.current === null) {\n if (isClientTransport(transportOrOptions)) {\n chatTransportRef.current = createChatTransport(transportOrOptions, chatOptions);\n } else {\n const transport = createCoreClientTransport(transportOrOptions);\n chatTransportRef.current = createChatTransport(transport, chatOptions);\n }\n }\n\n return chatTransportRef.current;\n};\n","/**\n * useMessageSync: wires transport message lifecycle events into useChat's setMessages.\n *\n * Subscribes to the transport's 'message' event and replaces messages state\n * with the transport's authoritative message list. Events fire immediately\n * on every store update (including during active streaming), so this hook\n * keeps React state in sync in real time.\n *\n * Returns the unsubscribe function in the useEffect cleanup so handlers\n * are removed on unmount or when dependencies change.\n */\n\nimport type * as AI from 'ai';\nimport { useEffect } from 'react';\n\nimport type { ClientTransport } from '../../core/transport/types.js';\n\n/**\n * Wire transport message updates into useChat's `setMessages` updater.\n * @param transport - The client transport to observe, or null/undefined if not yet available.\n * @param setMessages - The `setMessages` updater function from useChat.\n */\nexport const useMessageSync = (\n transport: ClientTransport<unknown, AI.UIMessage> | null | undefined,\n setMessages: (updater: (prev: AI.UIMessage[]) => AI.UIMessage[]) => void,\n): void => {\n useEffect(() => {\n if (!transport) return;\n const unsubscribe = transport.on('message', () => {\n setMessages(() => transport.getMessages());\n });\n return unsubscribe;\n }, [transport, setMessages]);\n};\n"],"mappings":";;;;AAKA,IAAY,IAAL,yBAAA,GAAA;QAIL,EAAA,EAAA,aAAA,OAAA,cAKA,EAAA,EAAA,kBAAA,SAAA,mBAQA,EAAA,EAAA,wBAAA,SAAA,yBAKA,EAAA,EAAA,6BAAA,UAAA,8BAKA,EAAA,EAAA,sBAAA,UAAA,uBAKA,EAAA,EAAA,qBAAA,UAAA,sBAKA,EAAA,EAAA,kBAAA,UAAA,mBAKA,EAAA,EAAA,sBAAA,UAAA;KACD,EASY,KAAe,GAA2B,MAA8B,EAAU,SAAS,GCsF3F,KACX,GACA,OACmB;CACnB,cAAc,OAAO,MAAS;EAC5B,IAAM,EAAE,aAAU,gBAAa,YAAS,iBAAc,GAKlD,GACA;AAEJ,MAAI,MAAY,qBAEd,CADA,IAAc,EAAE,EAChB,IAAU;OACL;AACL,OAAI,EAAS,WAAW,EACtB,OAAM,IAAI,EAAK,UACb,+EACA,EAAU,iBACV,IACD;AAKH,GADA,IAAc,CAAC,EAAS,GAAG,GAAG,CAAiB,EAC/C,IAAU,EAAS,MAAM,GAAG,GAAG;;EAMjC,IAAI,GACA;AAEJ,MAAI,MAAY,wBAAwB,GAAW;AACjD,OAAS;GAIT,IAAM,IAAO,EAAU,SAAS,CAAC,aAAa,EAAU;AACxD,GAAI,MAGF,IAAS,EAAK,OACd,IAAS,EAAK;;EAIlB,IAAI,GACA;AAEJ,MAAI,GAAa,4BAA4B;GAC3C,IAAM,IAAW,EAAY,2BAA2B;IACtD,IAAI,EAAK;IACT;IACA;IACA;IACA,UAAU;IACV;IACA;IACD,CAAC;AAEF,GADA,IAAW,EAAS,QAAQ,EAAE,EAC9B,IAAc,EAAS;QAcvB,CARA,IAAW;GACT,SALyB,EAAQ,KAAK,OAAO;IAC7C,SAAS;IACT,SAAS,EAAU,kBAAkB,EAAE;IACxC,EAAE;GAGD,IAAI,EAAK;GACT;GACA,GAAI,MAAc,KAAA,KAAa,EAAE,cAAW;GAC5C,GAAI,MAAW,KAAA,KAAa,EAAE,WAAQ;GACtC,GAAI,MAAW,KAAA,KAAa,EAAE,WAAQ;GACvC,EACD,IAAc,KAAA;EAGhB,IAAM,IAAwB;GAAE,MAAM;GAAU,SAAS;GAAa;AAEtE,EADI,MAAW,KAAA,MAAW,EAAS,SAAS,IACxC,MAAW,KAAA,MAAW,EAAS,SAAS;EAE5C,IAAM,IAAO,MAAM,EAAU,KAAK,GAAa,EAAS;AAKxD,EAAI,KACF,EAAY,iBAAiB,eAAe,KAAK,EAAU,OAAO,EAAE,KAAK,IAAM,CAAC,EAAE,EAChF,MAAM,IACP,CAAC;EAUJ,IAAM,EAAE,aAAU,gBAAa,IAAI,iBAAoC,EACjE,IAAS,EAAS,WAAW;AAmBnC,SAfA,EAAK,OACF,OACC,IAAI,eAAe;GACjB,aAAa;AACX,MAAO,OAAO,CAAC,YAAY,GAAG;;GAEhC,aAAa;AACX,MAAO,OAAO,CAAC,YAAY,GAAG;;GAEjC,CAAC,CACH,CACA,YAAY;AACX,KAAO,OAAO,CAAC,YAAY,GAAG;IAC9B,EAEG;;CAQT,yBAAyB,QAAQ,QAAQ,KAAK;CAE9C,OAAO,OAAO,MAA2B,EAAU,MAAM,EAAQ;CAClE,GCrQY,IAAgB,iBAGhB,IAAgB,iBAGhB,IAAmB,oBAOnB,IAAiB,kBAGjB,IAAgB,iBAGhB,IAAwB,yBAGxB,IAAc,eAOd,IAAwB,yBAGxB,IAAoB,qBAGpB,IAAoB,qBAGpB,IAA0B,2BAO1B,IAAgB,iBAGhB,IAAiB,kBAcjB,IAAe,iBAGf,KAAmB,qBAGnB,IAAiB,mBAajB,IAAuB,aC3B9B,KAAgB,OAA6B;CACjD,YAAY,GAAgB,GAAgB,MAAqB;AAC/D,IAAO,MAAM,GAAQ,EAAE,QAAQ,GAAS,CAAC;;CAE3C,iBAAiB;CAClB,GAKK,KACJ,EAAK,SACL,cAYW,KAAb,cAA6C,GAAgC;CAK3E,YAAY,GAAgB;AAC1B,QAAM,EAAa,EAAO,CAAC;;GC5CnB,IAAL,yBAAA,GAAA;QAKL,EAAA,QAAA,SAMA,EAAA,QAAA,SAKA,EAAA,OAAA,QAMA,EAAA,OAAA,QAMA,EAAA,QAAA,SAKA,EAAA,SAAA;KACD,EAuBY,KAAiB,GAAiB,GAAiB,MAAyB;CACvF,IAAM,IAAgB,IAAU,cAAc,KAAK,UAAU,EAAQ,KAAK,IACpE,IAAmB,qBAAI,IAAI,MAAM,EAAC,aAAa,CAAC,IAAI,EAAM,SAAS,CAAC,aAAa,CAAC,sBAAsB,IAAU;AAExH,SAAQ,GAAR;EACE,KAAK,EAAS;EACd,KAAK,EAAS;AACZ,WAAQ,IAAI,EAAiB;AAC7B;EAEF,KAAK,EAAS;AACZ,WAAQ,KAAK,EAAiB;AAC9B;EAEF,KAAK,EAAS;AACZ,WAAQ,KAAK,EAAiB;AAC9B;EAEF,KAAK,EAAS;AACZ,WAAQ,MAAM,EAAiB;AAC/B;EAEF,KAAK,EAAS,OACZ;;GAaO,KAAc,MAGlB,IAAI,EAFQ,EAAQ,cAAc,GAEJ,EAAQ,SAAS,EAMnD,IAAL,yBAAA,GAAA;QACE,EAAA,EAAA,QAAA,KAAA,SACA,EAAA,EAAA,QAAA,KAAA,SACA,EAAA,EAAA,OAAA,KAAA,QACA,EAAA,EAAA,OAAA,KAAA,QACA,EAAA,EAAA,QAAA,KAAA,SACA,EAAA,EAAA,SAAA,KAAA;EANG,KAAA,EAAA,CAOJ,EAKK,IAAoB,IAAI,IAA8B;CAC1D,CAAC,EAAS,OAAO,EAAe,MAAM;CACtC,CAAC,EAAS,OAAO,EAAe,MAAM;CACtC,CAAC,EAAS,MAAM,EAAe,KAAK;CACpC,CAAC,EAAS,MAAM,EAAe,KAAK;CACpC,CAAC,EAAS,OAAO,EAAe,MAAM;CACtC,CAAC,EAAS,QAAQ,EAAe,OAAO;CACzC,CAAC,EAKI,IAAN,MAAM,EAAgC;CAKpC,YAAY,GAAqB,GAAiB,GAAsB;AAEtE,EADA,KAAK,WAAW,GAChB,KAAK,WAAW;EAEhB,IAAM,IAAc,EAAkB,IAAI,EAAM;AAChD,MAAI,MAAgB,KAAA,EAClB,OAAM,IAAI,EAAK,UAAU,+CAA+C,KAAS,EAAU,iBAAiB,IAAI;AAGlH,OAAK,eAAe;;CAGtB,MAAM,GAAiB,GAA4B;AACjD,OAAK,OAAO,GAAS,EAAS,OAAO,EAAe,OAAO,EAAQ;;CAGrE,MAAM,GAAiB,GAA4B;AACjD,OAAK,OAAO,GAAS,EAAS,OAAO,EAAe,OAAO,EAAQ;;CAGrE,KAAK,GAAiB,GAA4B;AAChD,OAAK,OAAO,GAAS,EAAS,MAAM,EAAe,MAAM,EAAQ;;CAGnE,KAAK,GAAiB,GAA4B;AAChD,OAAK,OAAO,GAAS,EAAS,MAAM,EAAe,MAAM,EAAQ;;CAGnE,MAAM,GAAiB,GAA4B;AACjD,OAAK,OAAO,GAAS,EAAS,OAAO,EAAe,OAAO,EAAQ;;CAGrE,YAAY,GAA6B;EAEvC,IAAM,IACJ,CAAC,GAAG,EAAkB,SAAS,CAAC,CAAC,MAAM,GAAG,OAAW,MAAU,KAAK,aAAa,GAAG,MAAM,EAAS;AAErG,SAAO,IAAI,EAAc,KAAK,UAAU,GAAe,KAAK,cAAc,EAAQ,CAAC;;CAGrF,OAAe,GAAiB,GAAiB,GAA6B,GAA4B;AACxG,EAAI,KAAe,KAAK,gBACtB,KAAK,SAAS,GAAS,GAAO,KAAK,cAAc,EAAQ,CAAC;;CAI9D,cAAsB,GAA8C;AAKlE,SAJK,KAAK,WAIH,IAAU;GAAE,GAAG,KAAK;GAAU,GAAG;GAAS,GAAG,KAAK,WAHhD,KAAW,KAAA;;GC1NX,KAAc,MAAyD;CAElF,IAAM,IAAS,EAAQ;AACvB,KAAI,CAAC,KAAU,OAAO,KAAW,SAAU,QAAO,EAAE;CACpD,IAAM,IAAW,EAAiC;AAIlD,QAHI,CAAC,KAAW,OAAO,KAAY,WAAiB,EAAE,GAG/C;GAQI,MAAa,MAAuC;AAC3D,WAAU,KAAA,EACd,KAAI;AACF,SAAO,KAAK,MAAM,EAAM;SAClB;AACN;;GAyCS,KACX,GACA,OAC4B;CAC5B,GAAG;CACH,GAAG;CACJ,GAOY,MAAa,MAAmD;AACvE,WAAU,KAAA,EACd,QAAO,MAAU;GAyBN,KAAmB,GAAiC,MAC/D,EAAQ,IAAuB,IAwBpB,KAAqD,MAAwB;CACxF,IAAM,IAAS,EAAE;AACjB,MAAK,IAAM,KAAO,EAChB,CAAI,OAAO,UAAU,eAAe,KAAK,GAAK,EAAI,IAAI,EAAI,OAAS,KAAA,MACjE,EAAO,KAAO,EAAI;AAKtB,QAAO;GA2BI,MAAgB,OAAyD;CACpF,MAAM,MAAgB,EAAgB,GAAS,EAAI;CACnD,QAAQ,GAAa,MAAqB,EAAgB,GAAS,EAAI,IAAI;CAC3E,OAAO,MAAgB,GAAU,EAAgB,GAAS,EAAI,CAAC;CAC/D,OAAO,MAAgB,GAAU,EAAgB,GAAS,EAAI,CAAC;CAChE,GA0BY,UAAyC;CACpD,IAAM,IAA4B,EAAE,EAC9B,IAA6B;EACjC,MAAM,GAAa,OACb,MAAU,KAAA,MAAW,EAAE,IAAuB,KAAO,IAClD;EAET,OAAO,GAAa,OACd,MAAU,KAAA,MAAW,EAAE,IAAuB,KAAO,OAAO,EAAM,GAC/D;EAET,OAAO,GAAa,OACd,KAAiC,SAAM,EAAE,IAAuB,KAAO,KAAK,UAAU,EAAM,GACzF;EAET,aAAa;EACd;AACD,QAAO;GC/LH,IAAN,MAA8E;CAgC5E,YAAY,GAAuC,GAAgB;AAEjE,oCAhC4B,IAAI,KAAqC,wCAGrC,IAAI,KAAqB,qBAOF,EAAE,sCAM3B,IAAI,KAAsC,qCAM3C,IAAI,KAAqB,qBAMlC,GAGpB,KAAK,UAAU,GACf,KAAK,UAAU;;CAiBjB,cAAsB,GAA2B,GAAmC;EAClF,IAAM,IAAK,EAAE,KAAK,QACZ,IAAK,EAAE,KAAK;AAMlB,SALI,MAAO,KAAA,KAAa,MAAO,KAAA,IAAkB,EAAE,YAAY,EAAE,YAC7D,MAAO,KAAA,IAAkB,IACzB,MAAO,KAAA,KACP,IAAK,IAAW,KAChB,IAAK,IAAW,IACb,EAAE,YAAY,EAAE;;CAOzB,cAAsB,GAAwC;AAI5D,MAHe,EAAS,KAAK,WAGd,KAAA,GAAW;AACxB,QAAK,YAAY,KAAK,EAAS;AAC/B;;EAIF,IAAI,IAAK,GACL,IAAK,KAAK,YAAY;AAC1B,SAAO,IAAK,IAAI;GACd,IAAM,IAAO,IAAK,MAAQ,GACpB,IAAU,KAAK,YAAY;AACjC,OAAI,CAAC,EAAS;AACd,GAAI,KAAK,cAAc,GAAS,EAAS,IAAI,IAC3C,IAAK,IAAM,IAEX,IAAK;;AAGT,OAAK,YAAY,OAAO,GAAI,GAAG,EAAS;;CAO1C,cAAsB,GAAwC;EAC5D,IAAM,IAAM,KAAK,YAAY,QAAQ,EAAS;AAC9C,EAAI,MAAQ,MAAI,KAAK,YAAY,OAAO,GAAK,EAAE;;CAOjD,kBAA0B,GAA8B,GAAqB;EAC3E,IAAI,IAAM,KAAK,aAAa,IAAI,EAAS;AAKzC,EAJK,MACH,oBAAM,IAAI,KAAK,EACf,KAAK,aAAa,IAAI,GAAU,EAAI,GAEtC,EAAI,IAAI,EAAM;;CAGhB,uBAA+B,GAA8B,GAAqB;EAChF,IAAM,IAAM,KAAK,aAAa,IAAI,EAAS;AAC3C,EAAI,MACF,EAAI,OAAO,EAAM,EACb,EAAI,SAAS,KAAG,KAAK,aAAa,OAAO,EAAS;;CAmB1D,iBAAyB,GAA6C;EACpE,IAAM,IAAQ,KAAK,WAAW,IAAI,EAAM;AACxC,MAAI,CAAC,EAAO,QAAO,EAAE;EAIrB,IAAI,IAAW,EAAM,MACf,IAAe,IAAI,IAAY,CAAC,EAAS,MAAM,CAAC;AACtD,SAAO,EAAS,UACV,GAAa,IAAI,EAAS,OAAO,GADf;GAEtB,IAAM,IAAa,KAAK,WAAW,IAAI,EAAS,OAAO;AACvD,OAAI,CAAC,KAAc,EAAW,KAAK,aAAa,EAAS,SAAU;AAEnE,GADA,IAAW,EAAW,MACtB,EAAa,IAAI,EAAS,MAAM;;EAKlC,IAAM,IAAW,EAAS,UACpB,IAAa,EAAS,OACtB,IAAqC,EAAE,EAEvC,IAAe,KAAK,aAAa,IAAI,EAAS;AACpD,MAAI,EACF,MAAK,IAAM,KAAW,GAAc;GAClC,IAAM,IAAa,KAAK,WAAW,IAAI,EAAQ;AAC/C,GAAI,KAAc,KAAK,aAAa,EAAW,MAAM,EAAW,IAC9D,EAAS,KAAK,EAAW;;AAS/B,SADA,EAAS,MAAM,GAAG,MAAM,KAAK,cAAc,GAAG,EAAE,CAAC,EAC1C,EAAS,KAAK,MAAM,EAAE,KAAK;;CAWpC,aAAqB,GAAkC,GAA6B;AAClF,MAAI,EAAK,UAAU,EAAY,QAAO;EACtC,IAAI,IAAU,GACR,IAAU,IAAI,IAAY,CAAC,EAAQ,MAAM,CAAC;AAChD,SAAO,EAAQ,SAAQ;AACrB,OAAI,EAAQ,WAAW,EAAY,QAAO;AAC1C,OAAI,EAAQ,IAAI,EAAQ,OAAO,CAAE;GACjC,IAAM,IAAS,KAAK,WAAW,IAAI,EAAQ,OAAO;AAClD,OAAI,CAAC,EAAQ;AAEb,GADA,IAAU,EAAO,MACjB,EAAQ,IAAI,EAAQ,MAAM;;AAE5B,SAAO;;CAST,cAAsB,GAAuB;EAC3C,IAAM,IAAQ,KAAK,WAAW,IAAI,EAAM;AACxC,MAAI,CAAC,EAAO,QAAO;EAEnB,IAAI,IAAU,EAAM,MACd,IAAU,IAAI,IAAY,CAAC,EAAQ,MAAM,CAAC;AAChD,SAAO,EAAQ,UACT,GAAQ,IAAI,EAAQ,OAAO,GADV;GAErB,IAAM,IAAa,KAAK,WAAW,IAAI,EAAQ,OAAO;AACtD,OAAI,CAAC,KAAc,EAAW,KAAK,aAAa,EAAQ,SAAU;AAElE,GADA,IAAU,EAAW,MACrB,EAAQ,IAAI,EAAQ,MAAM;;AAE5B,SAAO,EAAQ;;CAOjB,UAAsB;EACpB,IAAM,IAAqB,EAAE,EACvB,oBAAc,IAAI,KAAa,EAG/B,oBAAiB,IAAI,KAAqB;AAEhD,OAAK,IAAM,KAAY,KAAK,aAAa;GACvC,IAAM,IAAO,EAAS,MAChB,EAAE,UAAO,gBAAa;AAG5B,OAAI,MAAa,KAAA,KAAa,CAAC,EAAY,IAAI,EAAS,CACtD;GAIF,IAAM,IAAQ,KAAK,iBAAiB,EAAM;AAC1C,OAAI,EAAM,SAAS,GAAG;IACpB,IAAM,IAAc,KAAK,cAAc,EAAM,EACzC,IAAa,EAAe,IAAI,EAAY;AAChD,QAAI,MAAe,KAAA,GAAW;KAC5B,IAAM,IAAc,KAAK,YAAY,IAAI,EAAY,IAAI,EAAM,SAAS,GAElE,IAAW,EADD,KAAK,IAAI,GAAG,KAAK,IAAI,GAAa,EAAM,SAAS,EAAE,CAAC;AAEpE,SAAI,CAAC,EAAU;AAEf,KADA,IAAa,EAAS,OACtB,EAAe,IAAI,GAAa,EAAW;;AAE7C,QAAI,MAAU,EACZ;;AAKJ,GADA,EAAY,IAAI,EAAM,EACtB,EAAO,KAAK,EAAK,QAAQ;;AAG3B,SAAO;;CAGT,YAAY,GAA2B;AACrC,SAAO,KAAK,iBAAiB,EAAM,CAAC,KAAK,MAAM,EAAE,QAAQ;;CAG3D,YAAY,GAAwB;AAClC,SAAO,KAAK,iBAAiB,EAAM,CAAC,SAAS;;CAG/C,iBAAiB,GAAuB;EACtC,IAAM,IAAQ,KAAK,iBAAiB,EAAM;AAC1C,MAAI,EAAM,UAAU,EAAG,QAAO;EAC9B,IAAM,IAAc,KAAK,cAAc,EAAM,EACvC,IAAS,KAAK,YAAY,IAAI,EAAY;AAEhD,SADI,MAAW,KAAA,IACR,EAAM,SAAS,IADW,KAAK,IAAI,GAAG,KAAK,IAAI,GAAQ,EAAM,SAAS,EAAE,CAAC;;CAKlF,OAAO,GAAe,GAAqB;AACzC,OAAK,QAAQ,MAAM,8BAA8B;GAAE;GAAO;GAAO,CAAC;EAClE,IAAM,IAAQ,KAAK,iBAAiB,EAAM;AAC1C,MAAI,EAAM,UAAU,EAAG;EACvB,IAAM,IAAc,KAAK,cAAc,EAAM;AAC7C,OAAK,YAAY,IAAI,GAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAO,EAAM,SAAS,EAAE,CAAC,CAAC;;CAGnF,QAAQ,GAAuD;AAC7D,SAAO,KAAK,WAAW,IAAI,EAAM,EAAE;;CAGrC,aAAa,GAAqD;EAChE,IAAM,IAAQ,KAAK,eAAe,IAAI,EAAI;AACrC,QACL,QAAO,KAAK,WAAW,IAAI,EAAM,EAAE;;CAGrC,WAAW,GAAmD;AAC5D,SAAO,KAAK,WAAW,IAAI,EAAM,EAAE,KAAK;;CAO1C,OAAO,GAAe,GAAmB,GAAiC,GAAuB;EAC/F,IAAM,IAAW,EAAA,oBAA0B,KAAA,GACrC,IAAS,EAAA,qBAA2B,KAAA;AAG1C,OAAK,eAAe,IAAI,KAAK,QAAQ,EAAQ,EAAE,EAAM;EAErD,IAAM,IAAW,KAAK,WAAW,IAAI,EAAM;AAC3C,MAAI,GAAU;AAUZ,GANA,EAAS,KAAK,UAAU,GACpB,OAAO,KAAK,EAAQ,CAAC,SAAS,MAChC,EAAS,KAAK,UAAU,EAAE,GAAG,GAAS,GAIpC,KAAU,CAAC,EAAS,KAAK,WAC3B,KAAK,QAAQ,MAAM,+CAA+C;IAAE;IAAO;IAAQ,CAAC,EACpF,EAAS,KAAK,SAAS,GAEvB,KAAK,cAAc,EAAS,EAC5B,KAAK,cAAc,EAAS;AAE9B;;AAGF,OAAK,QAAQ,MAAM,iDAAiD;GAAE;GAAO;GAAU;GAAQ,CAAC;EAWhG,IAAM,IAAmC;GAAE,MATF;IACvC;IACA;IACA;IACA;IACA,SAAS,EAAE,GAAG,GAAS;IACvB;IACD;GAEgD,WAAW,KAAK;GAAe;AAGhF,EAFA,KAAK,WAAW,IAAI,GAAO,EAAS,EACpC,KAAK,kBAAkB,GAAU,EAAM,EACvC,KAAK,cAAc,EAAS;;CAG9B,OAAO,GAAqB;EAC1B,IAAM,IAAQ,KAAK,WAAW,IAAI,EAAM;AACxC,MAAI,CAAC,EAAO;AAEZ,OAAK,QAAQ,MAAM,8BAA8B,EAAE,UAAO,CAAC;EAE3D,IAAM,EAAE,YAAS,GAGX,IAAW,KAAK,QAAQ,EAAK,QAAQ;AAa3C,EAZI,KAAK,eAAe,IAAI,EAAS,KAAK,KACxC,KAAK,eAAe,OAAO,EAAS,EAItC,KAAK,uBAAuB,EAAK,UAAU,EAAM,EAGjD,KAAK,cAAc,EAAM,EAGzB,KAAK,WAAW,OAAO,EAAM,EAC7B,KAAK,YAAY,OAAO,EAAM;;GAiBrB,KACX,GACA,MAC+B,IAAI,EAAwB,GAAQ,EAAO,EC/WtE,KAA+B,MAAmE;CAEtG,IAAM,IAAgB,CAAC,GAAG,EAAM,YAAY,CAAC,YAAY,EAGnD,IAAU,EAAM,MAAM,eAAe,EACrC,oBAAQ,IAAI,KAUf,EACG,IAAqB,EAAM,MAAM,mBAAmB,EACtD,IAAe,GAGb,oBAAkB,IAAI,KAAqC,EAE3D,oBAAkB,IAAI,KAAqB;AAEjD,MAAK,IAAM,KAAO,GAAe;EAC/B,IAAM,IAA6C,EAAQ,OAAO,EAAI,EAChE,IAAU,EAAW,EAAI,EACzB,IAAS,EAAQ,IACjB,IAAQ,EAAQ,IAChB,IAAS,EAAI;AAEnB,MAAI,GAAQ;GACV,IAAI,IAAO,EAAM,IAAI,EAAO;AAc5B,OAbK,MACH,IAAO;IACL,aAAa,EAAM,MAAM,mBAAmB;IAC5C,WAAW;IACX,4BAAY,IAAI,KAAK;IACrB,4BAAY,IAAI,KAAK;IACtB,EACD,EAAM,IAAI,GAAQ,EAAK,GAMrB,GAAO;IACT,IAAM,IAAW,EAAK,WAAW,IAAI,EAAM;AAC3C,IAAK,IAGM,OAAO,KAAK,EAAQ,CAAC,SAAS,KACvC,OAAO,OAAO,GAAU,EAAQ,IAHhC,EAAK,WAAW,IAAI,GAAO,EAAE,GAAG,GAAS,CAAC,EACtC,KAAQ,EAAK,WAAW,IAAI,GAAO,EAAO;;AAKlD,KAAK,YAAY,eAAe,EAAQ;QAExC,GAAmB,eAAe,EAAQ;AAI5C,OAAK,IAAM,KAAU,EACnB,KAAI,EAAO,SAAS,WAAW;GAC7B,IAAM,IAAM,EAAM,cAAc,EAAO,QAAQ,EACzC,IAAmB,EAAgB,IAAI,EAAI;AACjD,GAAK,IAGM,OAAO,KAAK,EAAQ,CAAC,SAAS,KACvC,OAAO,OAAO,GAAkB,EAAQ,IAHxC,EAAgB,IAAI,GAAK,EAAE,GAAG,GAAS,CAAC,EACpC,KAAQ,EAAgB,IAAI,GAAK,EAAO;;;CASpD,IAAM,IAAqC,EAAE;AAE7C,MAAK,IAAM,KAAO,EAAmB,mBAAmB;EACtD,IAAM,IAAM,EAAM,cAAc,EAAI;AACpC,IAAU,KAAK;GACb,SAAS;GACT,SAAS,EAAgB,IAAI,EAAI,IAAI,EAAE;GACvC,QAAQ,EAAgB,IAAI,EAAI,IAAI;GACrC,CAAC;;CAGJ,IAAM,IAAS,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,UAAU,GAAG,MAAM,EAAE,YAAY,EAAE,UAAU;AAChF,MAAK,IAAM,KAAQ,GAAQ;EAIzB,IAAM,oBAAgB,IAAI,KAAa,EAGjC,oBAAiB,IAAI,KAAqC,EAC1D,oBAAiB,IAAI,KAAqB;AAChD,OAAK,IAAM,KAAO,EAAK,YAAY,mBAAmB;GACpD,IAAM,IAAM,EAAM,cAAc,EAAI,EAC9B,IAAW,EAAgB,IAAI,EAAI;AACzC,OAAI,GAAU;AACZ,MAAe,IAAI,GAAK,EAAS;IACjC,IAAM,IAAU,EAAgB,IAAI,EAAI;AACxC,IAAI,KAAS,EAAe,IAAI,GAAK,EAAQ;IAC7C,IAAM,IAAM,EAAS;AACrB,IAAI,KAAK,EAAc,IAAI,EAAI;;;EAKnC,IAAM,IAAmB,CAAC,GAAG,EAAK,WAAW,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAS,CAAC,EAAc,IAAI,EAAI,CAAC,EAC9F,IAAe;AAEnB,OAAK,IAAM,KAAO,EAAK,YAAY,mBAAmB;GACpD,IAAM,IAAM,EAAM,cAAc,EAAI,EAC9B,IAAY,EAAiB;AACnC,OAAI,CAAC,EAAe,IAAI,EAAI,IAAI,GAAW;IACzC,IAAM,CAAC,GAAK,KAAQ;AACpB,MAAe,IAAI,GAAK,EAAK;IAC7B,IAAM,IAAU,EAAK,WAAW,IAAI,EAAI;AAExC,IADI,KAAS,EAAe,IAAI,GAAK,EAAQ,EAC7C;;;AAIJ,OAAK,IAAM,KAAO,EAAK,YAAY,mBAAmB;GACpD,IAAM,IAAM,EAAM,cAAc,EAAI;AACpC,KAAU,KAAK;IACb,SAAS;IACT,SAAS,EAAe,IAAI,EAAI,IAAI,EAAE;IACtC,QAAQ,EAAe,IAAI,EAAI,IAAI;IACpC,CAAC;;;AAMN,QAAO,EAAU,YAAY;GAazB,IAAkB,OACtB,GACA,GACA,MACkB;AAElB,CADA,EAAM,YAAY,KAAK,GAAG,EAAS,MAAM,EACzC,EAAM,eAAe;CAErB,IAAI,IAAe,EAAU,EAAM,CAAC;AACpC,QAAO,IAAe,EAAM,gBAAgB,KAAS,EAAS,SAAS,GAAE;AACvE,IAAM,OAAO,MAAM,uDAAuD;GACxE,WAAW,EAAM,YAAY;GAC7B,SAAS;GACV,CAAC;EACF,IAAM,IAAW,MAAM,EAAS,MAAM;AACtC,MAAI,CAAC,EAAU;AAIf,EAHA,IAAW,GACX,EAAM,YAAY,KAAK,GAAG,EAAS,MAAM,EACzC,EAAM,eAAe,GACrB,IAAe,EAAU,EAAM,CAAC;;GAc9B,KACJ,GACA,MACgC;CAGhC,IAAM,IAAe,EAAU,EAAM,EAE/B,IAAY,EAAa,MAAM,EAAM,eAAe,EAAM,gBAAgB,EAAM,EAChF,IAAa,CAAC,GAAG,EAAU,CAAC,YAAY;AAC9C,GAAM,iBAAiB,EAAU;CAEjC,IAAM,IAAgB,EAAa,SAAS,EAAM,eAC5C,IAAgB,EAAM,cAAc,SAAS,IAAI,IAIjD,IADc,EAAM,YAAY,SAAS,EAAM,mBACtB,IAAI,EAAM,YAAY,MAAM,EAAM,iBAAiB,CAAC,YAAY,GAAG,EAAE;AAGpG,QAFA,EAAM,mBAAmB,EAAM,YAAY,QAEpC;EACL,OAAO,EAAW,KAAK,MAAM,EAAE,QAAQ;EACvC,aAAa,EAAW,KAAK,MAAM,EAAE,QAAQ;EAC7C,aAAa,EAAW,KAAK,MAAM,EAAE,OAAO;EAC5C,aAAa;EACb,eAAe,KAAiB;EAChC,MAAM,YAAY;AAChB,OAAI,EACF,QAAO,EAAY,GAAO,EAAM;AAElC,OAAI,CAAC,KAAiB,CAAC,EAAM,aAAc;GAC3C,IAAM,IAAW,MAAM,EAAM,aAAa,MAAM;AAC3C,SAEL,QADA,MAAM,EAAgB,GAAO,GAAU,EAAM,EACtC,EAAY,GAAO,EAAM;;EAEnC;GAuBU,IAAgB,OAC3B,GACA,GACA,GACA,MACyC;CACzC,IAAM,IAAQ,GAAS,SAAS,KAC1B,IAAwC;EAC5C;EACA,aAAa,EAAE;EACf,eAAe;EACf,kBAAkB;EAClB,cAAc,KAAA;EACd,eAAe,EAAM,cAAc,KAAK,EAAM;EAC9C;EACD;AAED,GAAO,MAAM,oBAAoB,EAAE,UAAO,CAAC;CAI3C,IAAM,IAAY,IAAQ;AAK1B,QAHA,MAAM,EAAQ,QAAQ,EAEtB,MAAM,EAAgB,GADL,MAAM,EAAQ,QAAQ;EAAE,aAAa;EAAM,OAAO;EAAW,CAAC,EACxC,EAAM,EACtC,EAAY,GAAO,EAAM;GCnTrB,KAAyB,MAOR;CAC5B,IAAM,IAA4B;GAC/B,IAAc,EAAK;GACnB,IAAiB,EAAK;GACtB,IAAgB,EAAK;EACvB;AAID,QAHI,EAAK,iBAAiB,KAAA,MAAW,EAAE,KAAyB,EAAK,eACjE,EAAK,WAAQ,EAAE,KAAiB,EAAK,SACrC,EAAK,WAAQ,EAAE,KAAkB,EAAK,SACnC;GCVH,IAAN,MAAkE;CAKhE,YAAY,GAAwC,GAAgB;AAElE,gCANwB,IAAI,KAAgC,EAK5D,KAAK,cAAc,GACnB,KAAK,UAAU;;CAGjB,aAAa,GAAwC;AACnD,OAAK,QAAQ,MAAM,gCAAgC,EAAE,WAAQ,CAAC;EAI9D,IAAM,IAAkE,EAAE,EACpE,IAAS,IAAI,eAAuB,EACxC,MAAM,GAAY;AAChB,KAAM,aAAa;KAEtB,CAAC;AACF,MAAI,CAAC,EAAM,WACT,OAAM,IAAI,EAAK,UACb,gFACA,EAAU,4BACV,IACD;AAGH,SADA,KAAK,OAAO,IAAI,GAAQ;GAAE,YAAY,EAAM;GAAY;GAAQ,CAAC,EAC1D;;CAIT,YAAY,GAAyB;EACnC,IAAM,IAAO,KAAK,OAAO,IAAI,EAAO;AACpC,MAAI,CAAC,EAAM,QAAO;AAElB,OAAK,QAAQ,MAAM,8CAA8C,EAAE,WAAQ,CAAC;AAC5E,MAAI;AACF,KAAK,WAAW,OAAO;UACjB;AAIR,SADA,KAAK,OAAO,OAAO,EAAO,EACnB;;CAIT,MAAM,GAAgB,GAAwB;EAC5C,IAAM,IAAO,KAAK,OAAO,IAAI,EAAO;AACpC,MAAI,CAAC,EAAM,QAAO;AAElB,MAAI;AACF,KAAK,WAAW,QAAQ,EAAM;UACxB;AAEN,UADA,KAAK,OAAO,OAAO,EAAO,EACnB;;AAMT,SAHI,KAAK,YAAY,EAAM,IACzB,KAAK,YAAY,EAAO,EAEnB;;CAGT,IAAI,GAAyB;AAC3B,SAAO,KAAK,OAAO,IAAI,EAAO;;GAcrB,KACX,GACA,MACyB,IAAI,EAAoB,GAAY,EAAO,ECzDhE,UAA8B,IA4B9B,IAAN,MAA4F;CA4C1F,YAAY,GAAmD;AA+B7D,wCA5D4B,IAAI,KAAa,qCAChB,IAAI,KAAa,wCAGd,IAAI,KAAqB,qCAE5B,IAAI,KAA0B,wCAI3B,IAAI,KAAkD,uBAGhC,EAAE,uCAGzB,IAAI,KAAa,iBAWhC,IAGhB,KAAK,WAAW,EAAQ,SACxB,KAAK,SAAS,EAAQ,OACtB,KAAK,YAAY,EAAQ,UACzB,KAAK,OAAO,EAAQ,OAAO,aAC3B,KAAK,eAAe,EAAQ,aAC5B,KAAK,aACH,OAAO,EAAQ,WAAY,aACvB,EAAQ,UACR,EAAQ,gBACA,EAAQ,UACd,KAAA,GACR,KAAK,UACH,OAAO,EAAQ,QAAS,aACpB,EAAQ,OACR,EAAQ,aACA,EAAQ,OACd,KAAA,GACR,KAAK,WAAW,EAAQ,SAAS,WAAW,MAAM,KAAK,WAAW,EAClE,KAAK,WAAW,EAAQ,UAAU,EAAW,EAAE,UAAU,EAAS,QAAQ,CAAC,EAAE,YAAY,EACvF,WAAW,mBACZ,CAAC,EAEF,KAAK,WAAW,IAAI,GAAuC,KAAK,QAAQ,EAGxE,KAAK,QAAQ,EAAiC,KAAK,OAAO,cAAc,KAAK,KAAK,OAAO,EAAE,KAAK,QAAQ,EACxG,KAAK,UAAU,EAA2B,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,EAAE,KAAK,QAAQ,EACjG,KAAK,WAAW,KAAK,OAAO,eAAe,EAGvC,EAAQ,UAAU;GACpB,IAAI;AACJ,QAAK,IAAM,KAAO,EAAQ,UAAU;IAClC,IAAM,IAAQ,KAAK,OAAO,cAAc,EAAI,EACtC,IAAsC,EAAE;AAG9C,IAFI,MAAW,EAAY,KAAiB,IAC5C,KAAK,MAAM,OAAO,GAAO,GAAK,EAAY,EAC1C,IAAY;;AAEd,QAAK,SAAS,KAAK,UAAU;;AAQ/B,EAHA,KAAK,cAAc,MAAqC;AACtD,QAAK,eAAe,EAAY;KAElC,KAAK,iBAAiB,KAAK,SAAS,UAAU,KAAK,WAAW;;CAOhE,eAAuB,GAAwC;AACzD,YAAK,SAGT;GADA,KAAK,cAAc,KAAK,EAAY,EACpC,KAAK,SAAS,KAAK,eAAe;AAElC,OAAI;AAGF,QAAI,EAAY,SAAA,qBAA2B;KACzC,IAAM,IAAU,EAAW,EAAY,EACjC,IAAS,EAAQ,IACjB,IAAU,EAAA,4BAAkC;AAClD,KAAI,MACF,KAAK,eAAe,IAAI,GAAQ,EAAQ,EACxC,KAAK,SAAS,KAAK,QAAQ;MAAE,MAAM;MAAkB;MAAQ,UAAU;MAAS,CAAC;AAEnF;;AAGF,QAAI,EAAY,SAAA,mBAAyB;KACvC,IAAM,IAAU,EAAW,EAAY,EACjC,IAAS,EAAQ,IACjB,IAAU,EAAA,4BAAkC,IAE5C,IAAU,EAAA,yBAA+B;AAC/C,SAAI,GAAQ;AAGV,MAFA,KAAK,QAAQ,YAAY,EAAO,EAChC,KAAK,eAAe,OAAO,EAAO,EAClC,KAAK,eAAe,OAAO,EAAO;MAElC,IAAM,IAAS,KAAK,YAAY,IAAI,EAAO;AAC3C,UAAI,GAAQ;AACV,YAAK,IAAM,KAAO,EAAQ,MAAK,WAAW,OAAO,EAAI;AACrD,YAAK,YAAY,OAAO,EAAO;;AAGjC,MADA,KAAK,YAAY,OAAO,EAAO,EAC/B,KAAK,SAAS,KAAK,QAAQ;OAAE,MAAM;OAAgB;OAAQ,UAAU;OAAS;OAAQ,CAAC;;AAEzF;;IAIF,IAAM,IAAU,KAAK,SAAS,OAAO,EAAY,EAC3C,IAAU,EAAW,EAAY,EACjC,IAAS,EAAY,QAMrB,IAAS,EAAQ;AACvB,IAAI,KACF,KAAK,2BAA2B,GAAQ,GAAS,EAAO;AAG1D,SAAK,IAAM,KAAU,EACnB,CAAI,EAAO,SAAS,YAClB,KAAK,qBAAqB,EAAO,SAAS,GAAS,GAAQ,EAAY,OAAO,GAE9E,KAAK,mBAAmB,GAAQ,EAAQ;YAGrC,GAAO;IACd,IAAM,IAAQ,aAAiB,EAAK,YAAY,IAAQ,KAAA;AACxD,SAAK,SAAS,KACZ,SACA,IAAI,EAAK,UACP,sCAAsC,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM,IAC5F,EAAU,4BACV,KACA,EACD,CACF;;;;CAWL,qBACE,GACA,GACA,GACA,GACM;EAEN,IAAM,IAAQ,EAAQ;AACtB,MAAI,KAAS,KAAK,WAAW,IAAI,EAAM,EAAE;AAEvC,QAAK,iBAAiB,GAAS,GAAS,EAAO;AAC/C;;AAGF,EAAI,MAAW,oBACb,KAAK,iBAAiB,GAAS,GAAS,EAAO;;CASnD,mBAA2B,GAAyC,GAAuC;AACzG,MAAI,EAAO,SAAS,QAAS;EAC7B,IAAM,IAAQ,EAAO,OACf,IAAS,EAAQ;AAClB,SAOL;OAAI,KAAK,QAAQ,MAAM,GAAQ,EAAM,EAAE;AAErC,IADA,KAAK,mBAAmB,GAAQ,EAAO,EACnC,KAAK,OAAO,WAAW,EAAM,IAAE,KAAK,eAAe,OAAO,EAAO;AACrE;;AAIE,QAAK,YAAY,IAAI,EAAO,IAAI,CAAC,KAAK,eAAe,IAAI,EAAO,KAIpE,KAAK,mBAAmB,GAAQ,EAAO,EACnC,KAAK,OAAO,WAAW,EAAM,IAAE,KAAK,eAAe,OAAO,EAAO;;;CAavE,iBAAyB,GAAmB,GAAiC,GAAuB;EAClG,IAAM,IAAM,KAAK,OAAO,cAAc,EAAQ,EACxC,IAAQ,EAAA,oBAA0B;AAExC,EADA,KAAK,MAAM,OAAO,GAAO,GAAS,GAAS,EAAO,EAClD,KAAK,SAAS,KAAK,UAAU;;CAa/B,2BACE,GACA,GACA,GACM;EACN,IAAM,IAAW,KAAK,eAAe,IAAI,EAAO;AAChD,EAAI,KACE,OAAO,KAAK,EAAQ,CAAC,SAAS,KAChC,OAAO,OAAO,EAAS,SAAS,EAAQ,EAKtC,MAAW,KAAA,MACb,EAAS,SAAS,MAGpB,KAAK,eAAe,IAAI,GAAQ;GAC9B,SAAS,EAAE,GAAG,GAAS;GACvB;GACA,aAAa,KAAK,OAAO,mBAAmB;GAC7C,CAAC;;CASN,mBAA2B,GAAgB,GAA+C;EACxF,IAAM,IAAW,KAAK,eAAe,IAAI,EAAO;AAChD,MAAI,CAAC,EAAU;AAEf,IAAS,YAAY,eAAe,CAAC,EAAO,CAAC;EAE7C,IAAM,IAAW,EAAS,YAAY;AACtC,MAAI,EAAS,WAAW,EAAG;EAE3B,IAAI;AACJ,MAAI;AACF,OAAU,gBAAgB,EAAS,GAAG,GAAG,CAAC;UACpC;AAMN,OAAU,EAAS,GAAG,GAAG;;AAG3B,EAAI,MACF,KAAK,MAAM,OACT,EAAS,QAAA,oBAA0B,KAAK,OAAO,cAAc,EAAQ,EACrE,GACA,EAAE,GAAG,EAAS,SAAS,EACvB,EAAS,OACV,EACD,KAAK,SAAS,KAAK,UAAU;;CAQjC,MAAc,eAAe,GAAqC;AAChE,OAAK,QAAQ,MAAM,qCAAqC,EAAE,WAAQ,CAAC;EAEnE,IAAM,IAAkC,EAAE;AAW1C,EAVI,EAAO,SACT,EAAQ,KAAyB,EAAO,SAC/B,EAAO,MAChB,EAAQ,KAAqB,SACpB,EAAO,WAChB,EAAQ,KAA2B,EAAO,WACjC,EAAO,QAChB,EAAQ,KAAqB,SAG/B,MAAM,KAAK,SAAS,QAAQ;GAC1B,MAAM;GACN,QAAQ,EAAE,YAAS;GACpB,CAAC;;CAGJ,0BAAkC,GAA4B;AAK5D,MAAI,EAAO,IACT,MAAK,IAAM,KAAU,KAAK,YACxB,MAAK,QAAQ,YAAY,EAAO;WAEzB,EAAO,IAChB,MAAK,IAAM,KAAO,KAAK,YACrB,MAAK,QAAQ,YAAY,EAAI;WAEtB,EAAO,eACX,IAAM,CAAC,GAAK,MAAQ,KAAK,eAC5B,CAAI,MAAQ,EAAO,YACjB,KAAK,QAAQ,YAAY,EAAI;OAGxB,EAAO,UAChB,KAAK,QAAQ,YAAY,EAAO,OAAO;;CAI3C,oBAA4B,GAAmC;EAC7D,IAAM,oBAAU,IAAI,KAAa;AACjC,MAAI,EAAO,IACT,MAAK,IAAM,KAAU,KAAK,eAAe,MAAM,CAAE,GAAQ,IAAI,EAAO;WAC3D,EAAO,UACX,IAAM,CAAC,GAAQ,MAAQ,KAAK,eAC/B,CAAI,MAAQ,KAAK,aAAW,EAAQ,IAAI,EAAO;WAExC,EAAO,eACX,IAAM,CAAC,GAAQ,MAAQ,KAAK,eAC/B,CAAI,MAAQ,EAAO,YAAU,EAAQ,IAAI,EAAO;OAEzC,EAAO,UAAU,KAAK,eAAe,IAAI,EAAO,OAAO,IAChE,EAAQ,IAAI,EAAO,OAAO;AAE5B,SAAO;;CAOT,0BAAkE;AAChE,SAAO,KAAK,MAAM,SAAS,CAAC,KAAK,OAAO;GACtC,SAAS;GACT,SAAS,KAAK,kBAAkB,EAAE;GACnC,EAAE;;CASL,kBAA0B,GAAmD;EAC3E,IAAM,IAAM,KAAK,yBAAyB,EACpC,IAAM,EAAI,WAAW,MAAQ,EAAI,UAAU,OAAmB,EAAU;AAC9E,SAAO,MAAQ,KAAK,IAAM,EAAI,MAAM,GAAG,EAAI;;CAO7C,oBAA4B,GAAyC;AACnE,OAAK,IAAM,CAAC,GAAG,MAAY,EAAK,MAAM,SAAS,EAAE;GAC/C,IAAM,IAAU,EAAK,cAAc,MAAM,EAAE,EACrC,IAAS,EAAK,cAAc,IAC5B,IAAM,KAAK,OAAO,cAAc,EAAQ,EACxC,IAAQ,EAAA,oBAA0B;AACxC,QAAK,MAAM,OAAO,GAAO,GAAS,GAAS,EAAO;;AAKpD,EAHA,KAAK,SAAS,KAAK,UAAU,EAGzB,EAAK,eAAe,EAAK,YAAY,SAAS,MAChD,KAAK,cAAc,QAAQ,GAAG,EAAK,YAAY,EAC/C,KAAK,SAAS,KAAK,eAAe;;CAItC,MAAc,kBACZ,GACA,GACA,GAC4E;AAC5E,OAAK,oBAAoB,EAAU;EACnC,IAAI,IAAO,GAEL,UAAgC;GACpC,IAAI,IAAQ;AACZ,QAAK,IAAM,KAAK,KAAK,MAAM,SAAS,CAClC,CAAK,EAAW,IAAI,KAAK,OAAO,cAAc,EAAE,CAAC,IAAE;AAErD,UAAO;;AAGT,SAAO,GAAiB,GAAG,KAAU,EAAK,SAAS,GAAE;GACnD,IAAM,IAAW,MAAM,EAAK,MAAM;AAClC,OAAI,CAAC,EAAU;AAEf,GADA,KAAK,oBAAoB,EAAS,EAClC,IAAO;;AAIT,SAAO;GAAE,YADU,KAAK,MAAM,SAAS,CAAC,QAAQ,MAAM,CAAC,EAAW,IAAI,KAAK,OAAO,cAAc,EAAE,CAAC,CAAC;GAC/E,UAAU;GAAM;;CAGvC,iBAAyB,GAA4B;AACnD,OAAK,IAAM,KAAK,EACd,MAAK,cAAc,OAAO,KAAK,OAAO,cAAc,EAAE,CAAC;AAEzD,EAAI,EAAS,SAAS,KACpB,KAAK,SAAS,KAAK,UAAU;;CASjC,MAAM,KAAK,GAA8B,GAAwD;AAQ/F,MAPI,KAAK,YAGT,MAAM,KAAK,gBAIP,KAAK,SACP,OAAM,IAAI,EAAK,UAAU,uCAAuC,EAAU,iBAAiB,IAAI;AAGjG,OAAK,QAAQ,MAAM,0BAA0B;EAE7C,IAAM,IAAO,MAAM,QAAQ,EAAM,GAAG,IAAQ,CAAC,EAAM,EAC7C,IAAS,OAAO,YAAY;AAClC,OAAK,YAAY,IAAI,EAAO;EAE5B,IAAM,oBAAS,IAAI,KAAa,EAC1B,IAAyE,EAAE,EAK3E,IAAmB,KAAK,yBAAyB,EAInD;AACJ,MAAI,GAAa,WAAW,KAAA,KAAa,CAAC,GAAa,QAAQ;GAC7D,IAAM,IAAO,KAAK,MAAM,SAAS;AACjC,OAAI,EAAK,SAAS,GAAG;IACnB,IAAM,IAAU,EAAK,GAAG,GAAG;AAC3B,QAAI,GAAS;KACX,IAAM,IAAU,KAAK,OAAO,cAAc,EAAQ;AAElD,SADiB,KAAK,MAAM,aAAa,EAAQ,EAC1B,SAAS;;;;EAMtC,IAAM,IAAa,GAAa,WAAW,KAAA,IAAY,IAAa,EAAY;AAEhF,OAAK,IAAM,KAAW,GAAM;GAC1B,IAAM,IAAQ,OAAO,YAAY;AAEjC,GADA,KAAK,WAAW,IAAI,EAAM,EAC1B,EAAO,IAAI,EAAM;GAEjB,IAAM,IAAiB,GAAa,WAAW,KAAA,IAAY,IAAc,EAAY,UAAU,KAAA,GAEzF,IAAoB,EAAsB;IAC9C,MAAM;IACN;IACA;IACA,cAAc,KAAK;IACnB,QAAQ;IACR,QAAQ,GAAa;IACtB,CAAC;AAGF,QAAK,iBAAiB,GAAS,EAAkB;GAGjD,IAAM,IAAsC;KAAG,IAAgB;KAAQ,IAAc;IAAQ;AAO7F,GANI,MAAgB,EAAY,KAAiB,IACjD,EAAa,KAAK;IAAE;IAAS,SAAS;IAAa,CAAC,EAKhD,GAAa,WAAW,KAAA,KAAa,CAAC,GAAa,WACrD,IAAa;;AAIjB,OAAK,YAAY,IAAI,GAAQ,EAAO;EAGpC,IAAM,IAAS,KAAK,QAAQ,aAAa,EAAO,EAG1C,IAAkB,KAAK,cAAc,IAAI,EAAE,EAG3C,IAAoC;GACxC,GAHmB,KAAK,WAAW,IAAI,EAAE;GAIzC,SAAS;GACT,GAAG,GAAa;GAChB;GACA,UAAU,KAAK;GACf,UAAU;GACV,GAAI,GAAa,WAAW,KAAA,KAAa,EAAE,QAAQ,EAAY,QAAQ;GACvE,GAAI,MAAe,KAAA,KAAa,EAAE,QAAQ,GAAY;GACvD,EAEK,IAAsC;GAC1C,GAAG;GACH,GAAG,GAAa;GACjB;AAyCD,SApCA,KAAK,SAAS,KAAK,MAAM;GACvB,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAG;IACJ;GACD,MAAM,KAAK,UAAU,EAAS;GAC9B,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,cAAc,GAAG,EAAE;GAChE,CAAC,CACC,MAAM,MAAa;AAClB,GAAK,EAAS,OACZ,KAAK,SAAS,KACZ,SACA,IAAI,EAAK,UACP,gCAAgC,KAAK,KAAK,YAAY,OAAO,EAAS,OAAO,CAAC,GAAG,EAAS,cAC1F,EAAU,qBACV,EAAS,OACV,CACF,EACD,KAAK,QAAQ,YAAY,EAAO;IAElC,CACD,OAAO,MAAmB;GACzB,IAAM,IAAQ,aAAiB,EAAK,YAAY,IAAQ,KAAA;AAUxD,GATA,KAAK,SAAS,KACZ,SACA,IAAI,EAAK,UACP,gCAAgC,KAAK,KAAK,WAAW,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM,IAC3G,EAAU,qBACV,KACA,EACD,CACF,EACD,KAAK,QAAQ,YAAY,EAAO;IAChC,EAEG;GACL;GACA;GACA,QAAQ,YAAY,KAAK,OAAO,EAAE,WAAQ,CAAC;GAC5C;;CAIH,MAAM,WAAW,GAAmB,GAAwD;AAC1F,OAAK,QAAQ,MAAM,iCAAiC,EAAE,cAAW,CAAC;EAGlE,IAAM,IADO,KAAK,MAAM,QAAQ,EAAU,EACnB;AAEvB,SAAO,KAAK,KAAK,EAAE,EAAE;GACnB,GAAG;GACH,MAAM;IACJ,SAAS,KAAK,kBAAkB,EAAU;IAC1C,GAAG,GAAa;IACjB;GACD,QAAQ;GACR,QAAQ;GACT,CAAC;;CAIJ,MAAM,KACJ,GACA,GACA,GAC6B;AAC7B,OAAK,QAAQ,MAAM,2BAA2B,EAAE,cAAW,CAAC;EAG5D,IAAM,IADO,KAAK,MAAM,QAAQ,EAAU,EACnB;AAEvB,SAAO,KAAK,KAAK,GAAa;GAC5B,GAAG;GACH,MAAM;IACJ,SAAS,KAAK,kBAAkB,EAAU;IAC1C,GAAG,GAAa;IACjB;GACD,QAAQ;GACR,QAAQ;GACT,CAAC;;CAIJ,MAAM,OAAO,GAAsC;AACjD,MAAI,KAAK,QAAS;EAClB,IAAM,IAAW,KAAU,EAAE,KAAK,IAAM;AAGxC,EAFA,KAAK,QAAQ,MAAM,6BAA6B,EAAE,QAAQ,GAAU,CAAC,EACrE,MAAM,KAAK,eAAe,EAAS,EACnC,KAAK,0BAA0B,EAAS;;CAI1C,MAAM,YAAY,GAAsC;AACtD,MAAI,KAAK,QAAS;EAClB,IAAM,IAAW,KAAU,EAAE,KAAK,IAAM,EAClC,IAAY,KAAK,oBAAoB,EAAS;AAChD,QAAU,SAAS,EAIvB,QAFA,KAAK,QAAQ,MAAM,kCAAkC,EAAE,SAAS,CAAC,GAAG,EAAU,EAAE,CAAC,EAE1E,IAAI,SAAe,MAAY;GACpC,IAAM,KAAW,MAAoC;AAC/C,MAAM,SAAA,sBACV,EAAU,OAAO,EAAM,OAAO,EAC1B,EAAU,SAAS,MACrB,KAAK,SAAS,IAAI,QAAQ,EAAQ,EAClC,GAAS;;AAGb,QAAK,SAAS,GAAG,QAAQ,EAAQ;IACjC;;CAOJ,GACE,GACA,GACY;AACZ,MAAI,KAAK,QAAS,QAAO;EAGzB,IAAM,IAAK;AAEX,SADA,KAAK,SAAS,GAAG,GAAW,EAAG,QAClB;AACX,QAAK,SAAS,IAAI,GAAW,EAAG;;;CAKpC,UAAsC;AACpC,SAAO,KAAK;;CAId,mBAA6C;EAC3C,IAAM,oBAAS,IAAI,KAA0B;AAC7C,OAAK,IAAM,CAAC,GAAQ,MAAQ,KAAK,gBAAgB;GAC/C,IAAI,IAAM,EAAO,IAAI,EAAI;AAKzB,GAJK,MACH,oBAAM,IAAI,KAAK,EACf,EAAO,IAAI,GAAK,EAAI,GAEtB,EAAI,IAAI,EAAO;;AAEjB,SAAO;;CAGT,kBAAkB,GAAuD;EACvE,IAAM,IAAM,KAAK,OAAO,cAAc,EAAQ;AAC9C,SAAO,KAAK,MAAM,aAAa,EAAI,EAAE;;CAIvC,cAA0B;AAExB,SADI,KAAK,cAAc,SAAS,IAAU,KAAK,MAAM,SAAS,GACvD,KAAK,MAAM,SAAS,CAAC,QAAQ,MAAM,CAAC,KAAK,cAAc,IAAI,KAAK,OAAO,cAAc,EAAE,CAAC,CAAC;;CAGlG,yBAAyD;AACvD,SAAO,KAAK,yBAAyB;;CAGvC,kBAAyC;AACvC,SAAO,CAAC,GAAG,KAAK,cAAc;;CAIhC,MAAM,QAAQ,GAAiE;AAC7E,MAAI,KAAK,QACP,OAAM,IAAI,EAAK,UAAU,+CAA+C,EAAU,iBAAiB,IAAI;AAEzG,OAAK,QAAQ,MAAM,8BAA8B,EAAE,OAAO,GAAM,OAAO,CAAC;EACxE,IAAM,IAAQ,GAAM,SAAS,KAGvB,IAAa,IAAI,IAAI,KAAK,MAAM,SAAS,CAAC,KAAK,MAAM,KAAK,OAAO,cAAc,EAAE,CAAC,CAAC,EAErF,IAAW,MAAM,EAAc,KAAK,UAAU,KAAK,QAAQ,GAAM,KAAK,QAAQ,EAE5E,IAAU,MAAM,KAAK,kBAAkB,GAAU,GAAO,EAAW;AACzE,MAAW,EAAQ;EAKnB,IAAM,IAAa,EAAQ;AAG3B,OAAK,IAAM,KAAK,EACd,MAAK,cAAc,IAAI,KAAK,OAAO,cAAc,EAAE,CAAC;EAGtD,IAAM,IAAW,EAAW,MAAM,CAAC,EAAM,EAEnC,IAAiB,EAAW,MAAM,GAAG,CAAC,EAAM;AAClD,OAAK,iBAAiB,EAAS;EAE/B,IAAM,KAAa,OAAoD;GACrE;GACA,eAAe,EAAe,SAAS,KAAK,EAAS,SAAS;GAC9D,MAAM,YAAY;AAEhB,QAAI,EAAe,SAAS,GAAG;KAE7B,IAAM,IAAQ,EAAe,OAAO,CAAC,GAAO,EAAM;AAElD,YADA,KAAK,iBAAiB,EAAM,EACrB,EAAU,EAAM;;AAIzB,QAAI,CAAC,EAAS,SAAS,CAAE;IAEzB,IAAM,IAAe,MAAM,EAAS,MAAM;AAC1C,QAAI,CAAC,EAAc;IAGnB,IAAM,IAAe,IAAI,IAAI,EAAW;AACxC,SAAK,IAAM,KAAK,KAAK,MAAM,SAAS,CAClC,GAAa,IAAI,KAAK,OAAO,cAAc,EAAE,CAAC;IAGhD,IAAM,IAAS,MAAM,KAAK,kBAAkB,GAAc,GAAO,EAAa;AAC9E,QAAW,EAAO;IAElB,IAAM,IAAc,EAAO;AAC3B,SAAK,IAAM,KAAK,EACd,MAAK,cAAc,IAAI,KAAK,OAAO,cAAc,EAAE,CAAC;IAGtD,IAAM,IAAY,EAAY,OAAO,CAAC,GAAO,EAAM;AACnD,UAAe,KAAK,GAAG,EAAY,EACnC,KAAK,iBAAiB,EAAU,EAE5B,EAAU,WAAW,EACzB,QAAO,EAAU,EAAU;;GAE9B;AAED,SAAO,EAAU,EAAS;;CAI5B,MAAM,MAAM,GAAuC;AAC7C,YAAK,SAKT;OAJA,KAAK,UAAU,IACf,KAAK,QAAQ,KAAK,2BAA2B,EAGzC,GAAS,QAAQ;AACnB,QAAI;AACF,WAAM,KAAK,eAAe,EAAQ,OAAO;YACnC;AAGR,SAAK,0BAA0B,EAAQ,OAAO;;AAGhD,QAAK,SAAS,YAAY,KAAK,WAAW;AAG1C,QAAK,IAAM,KAAU,KAAK,YACxB,MAAK,QAAQ,YAAY,EAAO;AAUlC,GAPA,KAAK,eAAe,OAAO,EAC3B,KAAK,SAAS,KAAK,EACnB,KAAK,YAAY,OAAO,EACxB,KAAK,WAAW,OAAO,EACvB,KAAK,YAAY,OAAO,EACxB,KAAK,eAAe,OAAO,EAC3B,KAAK,cAAc,OAAO,EAC1B,KAAK,cAAc,SAAS;;;GAgBnB,KACX,MACsC,IAAI,EAAuB,EAAQ,ECt3BrE,KAAY,MAMhB,EAAe;CACb,MAAM;CACN,YAAY,EAAO;CACnB,UAAU,EAAO;CACjB,OAAO,EAAO;CACd,kBAAkB,EAAO;CAC1B,CAAC,EAWE,IAAN,MAAyB;CAIvB,YAAY,GAAgC;AAC1C,sCAHqB,IAAI,KAAqB,EAG9C,KAAK,YAAY;;CAGnB,MAAM,GAAY,GAAmB,GAA+C;AAGlF,EAFA,KAAK,aAAa,IAAI,GAAI,EAAI,MAAM,OAAO,EAC3C,EAAI,MAAM,KAAK;GAAE,MAAM,KAAK;GAAW,MAAM;GAAI,CAAC,EAClD,EAAa,IAAI,GAAI,YAAY;;CAGnC,MAAM,GAAY,GAAmB,GAAoB;EACvD,IAAM,IAAM,KAAK,aAAa,IAAI,EAAG;AACrC,MAAI,MAAQ,KAAA,EAAW;EACvB,IAAM,IAAO,EAAI,MAAM;AACvB,EAAI,GAAM,SAAS,KAAK,cACtB,EAAK,QAAQ;;CAIjB,IAAI,GAAY,GAA+C;AAE7D,EADA,EAAa,IAAI,GAAI,WAAW,EAChC,KAAK,aAAa,OAAO,EAAG;;CAG9B,QAAc;AACZ,OAAK,+BAAe,IAAI,KAAK;;GAQ3B,KAAN,MAAiG;;sBAC/C,EAAE,yCACf,IAAI,KAAiC;;CAExE,IAAI,WAA2B;AAC7B,SAAO,KAAK;;CAGd,IAAI,oBAAoC;EACtC,IAAM,oBAAY,IAAI,KAAmB;AACzC,OAAK,IAAM,KAAS,KAAK,gBAAgB,QAAQ,CAC/C,GAAU,IAAI,EAAM,QAAQ;AAE9B,SAAO,KAAK,aAAa,QAAQ,MAAQ,CAAC,EAAU,IAAI,EAAI,CAAC;;CAG/D,IAAI,kBAA2B;AAC7B,OAAK,IAAM,KAAS,KAAK,gBAAgB,QAAQ,CAC/C,MAAK,IAAM,KAAU,EAAM,aAAa,QAAQ,CAC9C,KAAI,MAAW,YAAa,QAAO;AAGvC,SAAO;;CAGT,eAAe,GAAiE;AAC9E,OAAK,IAAM,KAAU,EACnB,CAAI,EAAO,SAAS,YAClB,KAAK,aAAa,KAAK,EAAO,QAAQ,GAC7B,EAAO,cAAc,KAAA,KAC9B,KAAK,cAAc,EAAO,OAAO,EAAO,UAAU;;CAKxD,cAAc,GAA6B;EACzC,IAAM,IAAM,KAAK,aAAa,WAAW,MAAM,EAAE,OAAO,EAAQ,GAAG;AACnE,EAAI,MAAQ,OACV,KAAK,aAAa,KAAO;;CAQ7B,qBAA6B,GAAuC;EAClE,IAAM,IAAW,KAAK,gBAAgB,IAAI,EAAU;AACpD,MAAI,EAAU,QAAO;EAErB,IAAM,IAA4B;GAChC,SAAS;IAAE,IAAI;IAAW,MAAM;IAAa,OAAO,EAAE;IAAE;GACxD,aAAa,IAAI,EAAmB,OAAO;GAC3C,kBAAkB,IAAI,EAAmB,YAAY;GACrD,cAAc,EAAE;GAChB,8BAAc,IAAI,KAAK;GACxB;AAGD,SAFA,KAAK,gBAAgB,IAAI,GAAW,EAAM,EAC1C,KAAK,aAAa,KAAK,EAAM,QAAQ,EAC9B;;CAST,aACE,GACA,GACsE;EACtE,IAAM,IAAU,EAAM,aAAa;AACnC,MAAI,CAAC,EAAS;EAEd,IAAM,IAAW,EAAM,QAAQ,MAAM,EAAQ;AACzC,SAAU,SAAS,eAEvB,QAAO;GAAE;GAAS,MAAM;GAAU;;CAOpC,cAAsB,GAA0B,GAAyB;AACvE,UAAQ,EAAM,MAAd;GACE,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,kBAAkB,GAAO,EAAU;AACxC;GAGF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,wBAAwB,GAAO,EAAU;AAC9C;GAGF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,kBAAkB,GAAO,EAAU;AACxC;GAGF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,mBAAmB,GAAO,EAAU;AACzC;GAGF,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,oBAAoB,GAAO,EAAU;AAC1C;GAGF;AACE,QAAI,EAAM,KAAK,WAAW,QAAQ,EAAE;AAClC,SAAI,EAAM,UAAW;KAErB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAK5C,IAAW,EAAe;MAC9B,MAAM,EAAM;MACZ,IAAI,EAAM;MACV,MAAM,EAAM;MACb,CAAC;AAEF,SAAI,EAAM,OAAO,KAAA,GAAW;MAC1B,IAAM,IAAM,EAAM,QAAQ,MAAM,WAAW,MAAM,EAAE,SAAS,EAAM,QAAQ,QAAQ,KAAK,EAAE,OAAO,EAAM,GAAG;AACzG,UAAI,MAAQ,IAAI;AACd,SAAM,QAAQ,MAAM,KAAO;AAC3B;;;AAIJ,OAAM,QAAQ,MAAM,KAAK,EAAS;;AAEpC;;;CASN,kBACE,GAIA,GACM;AACN,UAAQ,EAAM,MAAd;GACE,KAAK,SAAS;IACZ,IAAM,IAAQ,KAAK,qBAAqB,EAAU;AAElD,IADI,EAAM,cAAW,EAAM,QAAQ,KAAK,EAAM,YAC1C,EAAM,oBAAoB,KAAA,MAC5B,EAAM,QAAQ,WAAW,EAAM;AAEjC;;GAGF,KAAK;AACW,SAAK,qBAAqB,EAAU,CAC5C,QAAQ,MAAM,KAAK,EAAE,MAAM,cAAc,CAAC;AAChD;GAGF,KAAK,eAAe;IAClB,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AACjD,IAAI,MACF,EAAM,YAAY,OAAO,EACzB,EAAM,iBAAiB,OAAO;AAEhC;;GAGF,KAAK,UAAU;IACb,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AAIjD,IAHI,KAAS,EAAM,oBAAoB,KAAA,MACrC,EAAM,QAAQ,WAAW,EAAM,kBAEjC,KAAK,gBAAgB,OAAO,EAAU;AACtC;;GAGF,KAAK,SAAS;IACZ,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AACjD,QAAI,QACG,IAAM,CAAC,GAAI,MAAW,EAAM,aAC/B,CAAI,MAAW,eACb,EAAM,aAAa,IAAI,GAAI,UAAU;AAI3C,SAAK,gBAAgB,OAAO,EAAU;AACtC;;GAGF,KAAK,QACH;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AACjD,IAAI,KAAS,EAAM,oBAAoB,KAAA,MACrC,EAAM,QAAQ,WAAW,EAAM;AAEjC;;;;CASN,wBACE,GAIA,GACM;EACN,IAAM,IAAQ,KAAK,qBAAqB,EAAU;AAElD,UAAQ,EAAM,MAAd;GACE,KAAK;AACH,MAAM,YAAY,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,aAAa;AACpE;GAEF,KAAK;AACH,MAAM,YAAY,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,MAAM;AAC7D;GAEF,KAAK;AACH,MAAM,YAAY,IAAI,EAAM,IAAI,EAAM,aAAa;AACnD;GAEF,KAAK;AACH,MAAM,iBAAiB,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,aAAa;AACzE;GAEF,KAAK;AACH,MAAM,iBAAiB,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,MAAM;AAClE;GAEF,KAAK;AACH,MAAM,iBAAiB,IAAI,EAAM,IAAI,EAAM,aAAa;AACxD;;;CASN,kBACE,GAIA,GACM;AACN,UAAQ,EAAM,MAAd;GACE,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAY,EAAM,QAAQ,MAAM;AAGtC,IAFA,EAAM,QAAQ,MAAM,KAAK;KAAE,GAAG,EAAS,EAAM;KAAE,OAAO;KAAmB,OAAO,KAAA;KAAW,CAAC,EAC5F,EAAM,aAAa,EAAM,cAAc;KAAE;KAAW,WAAW;KAAI,EACnE,EAAM,aAAa,IAAI,EAAM,YAAY,YAAY;AACrD;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAU,EAAM,aAAa,EAAM;AACzC,QAAI,CAAC,EAAS;AACd,MAAQ,aAAa,EAAM;IAE3B,IAAI;AACJ,QAAI;AAEF,SAAc,KAAK,MAAM,EAAQ,UAAU;YACrC;AACN,SAAc,KAAA;;IAGhB,IAAM,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACxD,QAAI,CAAC,EAAO;AACZ,MAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,EAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO;KACR;AACD;;GAGF,KAAK,wBAAwB;IAC3B,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACxD,QAAI,CAAC,EAAO;AAMZ,IALA,EAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,EAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM;KACd,EACD,EAAM,aAAa,IAAI,EAAM,YAAY,WAAW;AACpD;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACxD,QAAI,EACF,GAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,EAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM;KACb,WAAW,EAAM;KAClB;SACI;KACL,IAAM,IAAY,EAAM,QAAQ,MAAM;AAOtC,KANA,EAAM,QAAQ,MAAM,KAAK;MACvB,GAAG,EAAS,EAAM;MAClB,OAAO;MACP,OAAO,EAAM;MACb,WAAW,EAAM;MAClB,CAAC,EACF,EAAM,aAAa,EAAM,cAAc;MAAE;MAAW,WAAW;MAAI;;AAErE,MAAM,aAAa,IAAI,EAAM,YAAY,WAAW;AACpD;;;;CASN,mBACE,GAIA,GACM;EACN,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACnD,QAEL,SAAQ,EAAM,MAAd;GACE,KAAK;AACH,MAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa,EAAe;KAC5D,GAAG,EAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM,KAAK;KAClB,QAAQ,EAAM;KACd,aAAa,EAAM;KACpB,CAAC;AACF;GAGF,KAAK;AACH,MAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,EAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM,KAAK;KAClB,WAAW,EAAM;KAClB;AACD;GAGF,KAAK;AACH,MAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,EAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM,KAAK;KAClB,UAAU;MAAE,IAAI;MAAI,UAAU;MAAO;KACtC;AACD;GAGF,KAAK;AACH,MAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,EAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM,KAAK;KAClB,UAAU,EAAE,IAAI,EAAM,YAAY;KACnC;AACD;;;CASN,oBACE,GACA,GACM;EACN,IAAM,IAAQ,KAAK,qBAAqB,EAAU;AAElD,UAAQ,EAAM,MAAd;GACE,KAAK;AACH,MAAM,QAAQ,MAAM,KAAK;KAAE,MAAM;KAAQ,WAAW,EAAM;KAAW,KAAK,EAAM;KAAK,CAAC;AACtF;GAGF,KAAK;AACH,MAAM,QAAQ,MAAM,KAClB,EAAe;KACb,MAAM;KACN,UAAU,EAAM;KAChB,KAAK,EAAM;KACX,OAAO,EAAM;KACd,CAAC,CACH;AACD;GAGF,KAAK;AACH,MAAM,QAAQ,MAAM,KAClB,EAAe;KACb,MAAM;KACN,UAAU,EAAM;KAChB,WAAW,EAAM;KACjB,OAAO,EAAM;KACb,UAAU,EAAM;KACjB,CAAC,CACH;AACD;;;GAcK,WACX,IAAI,IAA6B,ECnkBtB,MAAiC,MAAqD,CACjG;CAAE,MAAM;CAAS;CAAO,CACzB,EAgEK,KAAN,MAAoF;CAOlF,YAAY,GAA2C,IAA8B,EAAE,EAAE;AAIvF,sCAN8B,IAAI,KAAiC,EAGnE,KAAK,SAAS,GACd,KAAK,kBAAkB,EAAQ,gBAC/B,KAAK,kBAAkB,EAAQ,gBAC/B,KAAK,UAAU,EAAQ,QAAQ,YAAY,EAAE,WAAW,eAAe,CAAC;;CAG1E,OAAO,GAAiE;EACtE,IAAM,IAAS,EAAQ;AAEvB,OAAK,SAAS,MAAM,gCAAgC;GAAE;GAAQ,QAAQ,EAAQ;GAAQ,MAAM,EAAQ;GAAM,CAAC;EAE3G,IAAI;AAEJ,UAAQ,GAAR;GAEE,KAAK,kBAAkB;IACrB,IAAM,IAAU,KAAK,WAAW,EAAQ;AAExC,QACE,EAAQ,UAAA,qBAA6B,SACjC,KAAK,sBAAsB,GAAS,EAAQ,OAAO,GACnD,KAAK,OAAO,eAAe,EAAQ;AACzC;;GAGF,KAAK;AACH,QAAU,KAAK,cAAc,EAAQ;AACrC;GAGF,KAAK;AACH,QAAU,KAAK,cAAc,EAAQ;AACrC;GAGF,KAAK;AACH,QAAU,KAAK,cAAc,EAAQ;AACrC;GAGF,QACE,QAAO,EAAE;;EAKb,IAAM,IAAY,EAAW,EAAQ,CAAC;AACtC,MAAI,QACG,IAAM,KAAU,EACnB,CAAI,EAAO,SAAS,YAClB,EAAO,YAAY;AAKzB,SAAO;;CAOT,WAAmB,GAA8C;AAC/D,SAAO;GACL,MAAM,EAAQ,QAAQ;GAEtB,MAAM,EAAQ;GACd,SAAS,EAAW,EAAQ;GAC7B;;CAQH,YAAoB,GAAsC;AACxD,SAAO,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO;;CAO3D,sBAA8B,GAAmC;AAC1D,WAAK,gBACV,KAAI;AACF,QAAK,gBAAgB,EAAQ;WACtB,GAAO;AACd,QAAK,SAAS,MAAM,8DAA8D,EAAE,UAAO,CAAC;;;CAIhG,sBAA8B,GAAgB,GAA+C;AACtF,WAAK,gBACV,KAAI;AACF,QAAK,gBAAgB,GAAQ,EAAQ;WAC9B,GAAO;AACd,QAAK,SAAS,MAAM,8DAA8D,EAAE,UAAO,CAAC;;;CAQhG,sBACE,GACA,GACmC;AACnC,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAW,EAAQ,UAAA,uBAA+B,IAClD,IAAI,EAAQ,WAAW,EAAE,EAEzB,IAA8B;GAClC,MAAM,EAAQ;GACd;GACA,aAAa;GACb,SAAS,EAAE,GAAG,GAAG;GACjB,QAAQ;GACT;AASD,SARA,KAAK,aAAa,IAAI,GAAQ,EAAQ,EAEtC,KAAK,SAAS,MAAM,0DAA0D;GAC5E,MAAM,EAAQ;GACd;GACA;GACD,CAAC,EAEK,KAAK,OAAO,iBAAiB,EAAQ;;CAQ9C,cAAsB,GAAiE;EACrF,IAAM,IAAS,EAAQ;AACvB,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAU,KAAK,aAAa,IAAI,EAAO;AAC7C,MAAI,CAAC,EAEH,QAAO,KAAK,cAAc,EAAQ;EAGpC,IAAM,IAAI,EAAW,EAAQ,EACvB,IAAQ,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO,IAC1D,IAAS,EAAE,IACX,IAA6C,EAAE;AAgBrD,SAdI,EAAM,SAAS,MACjB,EAAQ,eAAe,GACvB,EAAQ,KAAK,GAAG,KAAK,OAAO,iBAAiB,GAAS,EAAM,CAAC,GAG3D,MAAW,cAAc,CAAC,EAAQ,UACpC,EAAQ,SAAS,IACjB,EAAQ,KAAK,GAAG,KAAK,OAAO,eAAe,GAAS,EAAE,CAAC,EACvD,KAAK,SAAS,MAAM,uDAAuD,EAAE,UAAU,EAAQ,UAAU,CAAC,IACjG,MAAW,aAAa,CAAC,EAAQ,WAC1C,EAAQ,SAAS,IACjB,KAAK,SAAS,MAAM,sDAAsD,EAAE,UAAU,EAAQ,UAAU,CAAC,GAGpG;;CAQT,cAAsB,GAAiE;EACrF,IAAM,IAAS,EAAQ;AACvB,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAU,KAAK,WAAW,EAAQ,EAClC,IAAI,EAAQ,WAAW,EAAE,EACzB,IAAa,EAAE,OAAmB,QAClC,IAAS,EAAE,IAEX,IAAU,KAAK,aAAa,IAAI,EAAO;AAE7C,MAAI,CAAC,EACH,QAAO,KAAK,oBAAoB,GAAS,GAAY,GAAQ,EAAO;EAItE,IAAM,IAAO,KAAK,YAAY,EAAQ;AAGtC,MAAI,EAAK,WAAW,EAAQ,YAAY,EAAE;GACxC,IAAM,IAAQ,EAAK,MAAM,EAAQ,YAAY,OAAO,EAC9C,IAA6C,EAAE;AAcrD,UAZI,EAAM,SAAS,MACjB,EAAQ,cAAc,GACtB,EAAQ,KAAK,GAAG,KAAK,OAAO,iBAAiB,GAAS,EAAM,CAAC,GAG3D,MAAW,cAAc,CAAC,EAAQ,UACpC,EAAQ,SAAS,IACjB,EAAQ,KAAK,GAAG,KAAK,OAAO,eAAe,GAAS,EAAE,CAAC,IAC9C,MAAW,aAAa,CAAC,EAAQ,WAC1C,EAAQ,SAAS,KAGZ;;AAST,SALA,EAAQ,cAAc,GACtB,EAAQ,UAAU,EAAE,GAAG,GAAG,EAE1B,KAAK,sBAAsB,EAAQ,EAE5B,EAAE;;CAGX,oBACE,GACA,GACA,GACA,GACmC;AAEnC,MAAI,CAAC,EACH,QAAO,KAAK,OAAO,eAAe,EAAQ;EAG5C,IAAM,IAAW,EAAQ,UAAA,uBAA+B,IAClD,IAAI,EAAQ,WAAW,EAAE,EACzB,IAAO,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO;AAE/D,OAAK,SAAS,MAAM,kEAAkE;GACpF,MAAM,EAAQ;GACd;GACA;GACD,CAAC;EAGF,IAAM,IAAiC;GACrC,MAAM,EAAQ;GACd;GACA,aAAa;GACb,SAAS,EAAE,GAAG,GAAG;GACjB,QAAQ,MAAW,cAAc,MAAW;GAC7C;AACD,OAAK,aAAa,IAAI,GAAQ,EAAW;EAGzC,IAAM,IAAU,KAAK,OAAO,iBAAiB,EAAW;AAUxD,SARI,EAAK,SAAS,KAChB,EAAQ,KAAK,GAAG,KAAK,OAAO,iBAAiB,GAAY,EAAK,CAAC,EAG7D,MAAW,cACb,EAAQ,KAAK,GAAG,KAAK,OAAO,eAAe,GAAY,EAAE,CAAC,EAGrD;;CAQT,cAAsB,GAAiE;EACrF,IAAM,IAAS,EAAQ;AACvB,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAU,KAAK,aAAa,IAAI,EAAO;AAW7C,SATA,KAAK,sBAAsB,GAAQ,EAAQ,EAEvC,MACF,EAAQ,cAAc,IACtB,EAAQ,SAAS,KAGnB,KAAK,SAAS,MAAM,uCAAuC,EAAE,WAAQ,CAAC,EAE/D,EAAE;;GAcA,MACX,GACA,IAA8B,EAAE,KACE,IAAI,GAAmB,GAAO,EAAQ,EC3TpE,KAAN,MAA0E;CAIxE,YAAY,GAA+B;AACzC,kCAH0B,IAAI,KAA0B,EAGxD,KAAK,UAAU;;CAGjB,aAAa,GAAiB,GAAuD;EACnF,IAAM,IAAU,KAAK,aAAa,EAAQ,EACpC,IAAmB,EAAE;AAC3B,OAAK,IAAM,KAAS,KAAK,QACvB,CAAK,EAAQ,IAAI,EAAM,IAAI,KACzB,EAAQ,IAAI,EAAM,IAAI,EACtB,EAAO,KAAK,GAAG,EAAM,MAAM,EAAQ,CAAC;AAGxC,SAAO;;CAGT,YAAY,GAAiB,GAAwB;AACnD,OAAK,aAAa,EAAQ,CAAC,IAAI,EAAS;;CAG1C,WAAW,GAAiB,GAAwB;AAClD,OAAK,SAAS,IAAI,EAAQ,EAAE,OAAO,EAAS;;CAG9C,WAAW,GAAuB;AAChC,OAAK,SAAS,OAAO,EAAQ;;CAG/B,aAAqB,GAA8B;EACjD,IAAI,IAAM,KAAK,SAAS,IAAI,EAAQ;AAKpC,SAJK,MACH,oBAAM,IAAI,KAAK,EACf,KAAK,SAAS,IAAI,GAAS,EAAI,GAE1B;;GAcE,MAAkC,MAC7C,IAAI,GAAwB,EAAO,ECrG/B,KAAgB,MAAwD;CAC5E,IAAM,IAAO,GAAgB,EAAQ;AACrC,QAAO;EACL,GAAG;EAEH,wBAAwB,EAAK,KAAK,mBAAmB;EACtD;GAkCG,KAAS,MAAoC,GAA6C,EAAM,EAYhG,MAAqB,GAA2B,MAElD,MAAU,UACV,MAAU,YACV,MAAU,oBACV,MAAU,gBACV,MAAU,WACV,MAAU,UAEH,IAEF,GAQH,KAAmB,MAA2C,EAAK,WAAW,QAAQ,EAQtF,MAAqB,MAA2B;AAC/C,OACL,KAAI;AAEF,SAAO,KAAK,MAAM,EAAM;SAClB;AACN,SAAO;;GAQL,MAAmB,MAAmD;CAC1E,IAAM,IAAI,EAAa,EAAQ,QAAQ;AACvC,SAAQ,EAAQ,MAAhB;EACE,KAAK,OACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,YACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,aACH,QAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAQ;GACpB,UAAU,EAAE,MAAM,YAAY,GAAG;GACjC,SAAS,EAAE,KAAK,UAAU;GAC1B,OAAO,EAAE,IAAI,QAAQ;GACrB,kBAAkB,EAAE,KAAK,mBAAmB;GAC5C,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,QACE,QAAO;GAAE,MAAM;GAAc,IAAI,EAAQ;GAAU;;GAKnD,MAAmB,GAA6B,MAAqC;AACzF,SAAQ,EAAQ,MAAhB;EACE,KAAK,OACH,QAAO;GAAE,MAAM;GAAc,IAAI,EAAQ;GAAU;GAAO;EAE5D,KAAK,YACH,QAAO;GAAE,MAAM;GAAmB,IAAI,EAAQ;GAAU;GAAO;EAEjE,KAAK,aACH,QAAO;GAAE,MAAM;GAAoB,YAAY,EAAQ;GAAU,gBAAgB;GAAO;EAE1F,QACE,QAAO;GAAE,MAAM;GAAc,IAAI,EAAQ;GAAU;GAAO;;GAK1D,MAAiB,GAA6B,MAA8D;CAChH,IAAM,IAAI,EAAa,EAAe;AACtC,SAAQ,EAAQ,MAAhB;EACE,KAAK,OACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,YACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,aACH,QAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAQ;GACpB,UAAU,EAAE,MAAM,YAAY,EAAa,EAAQ,QAAQ,CAAC,MAAM,YAAY,GAAG,CAAC;GAClF,OAAO,GAAkB,EAAQ,YAAY;GAC7C,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,QACE,QAAO;GAAE,MAAM;GAAY,IAAI,EAAQ;GAAU;;GASjD,WACJ,GAA0C,CACxC;CACE,KAAK;CACL,QAAQ,MAAQ,CAAC,EAAe;EAAE,MAAM;EAAkB,WAAW,EAAI;EAAW,CAAC,CAAC;CACvF,EACD;CACE,KAAK;CACL,aAAa,CAAC,EAAE,MAAM,cAAuB,CAAC;CAC/C,CACF,CAAC,EASE,KACJ,GACA,GACA,MACU,EAAU,aAAa,GAAQ,EAAQ,CAAC,KAAK,OAAO;CAAE,MAAM;CAAS,OAAO;CAAG,EAAE,EAMvF,MAAe,GAAuB,GAAgB,OAC1D,EAAU,YAAY,GAAQ,QAAQ,EAC/B,EACL,EAAe;CACb,MAAM;CACN,WAAW,EAAE,IAAI,YAAY;CAC7B,iBAAiB,EAAE,KAAK,kBAAkB;CAC3C,CAAC,CACH,GAGG,MAAmB,GAAgB,OACvC,EAAU,YAAY,GAAQ,aAAa,EACpC,EAAM,EAAE,MAAM,cAAc,CAAC,GAGhC,MAAoB,GAAgB,OACxC,EAAU,WAAW,GAAQ,aAAa,EACnC,EAAM,EAAE,MAAM,eAAe,CAAC,GAGjC,MAAgB,GAAuB,GAAgB,OAC3D,EAAU,WAAW,EAAO,EACrB,EACL,EAAe;CACb,MAAM;CACN,cAAc,GAAkB,EAAE,IAAI,eAAe,EAAE,OAAO;CAC9D,iBAAiB,EAAE,KAAK,kBAAkB;CAC3C,CAAC,CACH,GAGG,MAAe,MAEZ,EAAM;CAAE,MAAM;CAAS,WADZ,OAAO,KAAS,WAAW,IAAO;CACX,CAAC,EAGtC,MAAe,GAAe,GAAgB,OAClD,EAAU,WAAW,EAAO,EAErB,EAAM,EAAe;CAAE,MAAM;CAAkB,QADvC,OAAO,KAAS,YAAY,IAAO,IAAO,KAAA;CACK,CAAC,CAAC,GAG5D,MAAyB,MAC7B,EAAM;CAAE,MAAM;CAAoB,iBAAiB,EAAE,KAAK,kBAAkB;CAAE,CAAC,EAE3E,MAAc,GAAuB,MACzC,EACE,EAAe;CACb,MAAM;CACN,KAAK,OAAO,KAAS,WAAW,IAAO;CACvC,WAAW,EAAE,MAAM,aAAa,GAAG;CACnC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,CACH,EAEG,MAAmB,GAAuB,MAC9C,EACE,EAAe;CACb,MAAM;CACN,UAAU,EAAE,MAAM,YAAY,GAAG;CACjC,KAAK,OAAO,KAAS,WAAW,IAAO;CACvC,OAAO,EAAE,IAAI,QAAQ;CACrB,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,CACH,EAEG,MAAwB,MAC5B,EACE,EAAe;CACb,MAAM;CACN,UAAU,EAAE,MAAM,YAAY,GAAG;CACjC,WAAW,EAAE,MAAM,aAAa,GAAG;CACnC,OAAO,EAAE,MAAM,SAAS,GAAG;CAC3B,UAAU,EAAE,IAAI,WAAW;CAC3B,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,CACH,EAEG,MAAwB,GAAuB,MAAyB;CAE5E,IAAM,IAAS;AACf,QAAO,EACL,EAAe;EACb,MAAM;EACN,YAAY,EAAE,MAAM,cAAc,GAAG;EACrC,UAAU,EAAE,MAAM,YAAY,GAAG;EACjC,WAAW,GAAQ,aAAa;EAChC,OAAO,GAAQ;EACf,SAAS,EAAE,KAAK,UAAU;EAC1B,OAAO,EAAE,IAAI,QAAQ;EACrB,kBAAkB,EAAE,KAAK,mBAAmB;EAC5C,kBAAkB,EAAE,kBAAkB;EACvC,CAAC,CACH;GAGG,MAA6B,GAAuB,MAAyB;CAEjF,IAAM,IAAS;AACf,QAAO,EACL,EAAe;EACb,MAAM;EACN,YAAY,EAAE,MAAM,cAAc,GAAG;EACrC,QAAQ,GAAQ;EAChB,SAAS,EAAE,KAAK,UAAU;EAC1B,kBAAkB,EAAE,KAAK,mBAAmB;EAC5C,aAAa,EAAE,KAAK,cAAc;EACnC,CAAC,CACH;GAGG,MAAyB,GAAuB,MAAyB;CAE7E,IAAM,IAAS;AACf,QAAO,EACL,EAAe;EACb,MAAM;EACN,YAAY,EAAE,MAAM,cAAc,GAAG;EACrC,WAAW,GAAQ,aAAa;EAChC,SAAS,EAAE,KAAK,UAAU;EAC1B,kBAAkB,EAAE,KAAK,mBAAmB;EAC7C,CAAC,CACH;GAGG,MAA6B,MACjC,EAAM;CACJ,MAAM;CACN,YAAY,EAAE,MAAM,cAAc,GAAG;CACrC,YAAY,EAAE,MAAM,cAAc,GAAG;CACtC,CAAC,EAEE,MAA0B,MAC9B,EAAM;CAAE,MAAM;CAAsB,YAAY,EAAE,MAAM,cAAc,GAAG;CAAE,CAAC,EAExE,MAAmB,GAAwB,GAAuB,MACtE,EACE,EAAe;CACb,MAAM;CACN;CACA,IAAI,EAAE,IAAI,KAAK;CACf,WAAW,EAAE,KAAK,YAAY;CAC/B,CAAC,CACH,EAMG,MACJ,GACA,GACA,GACA,MACU;CACV,IAAM,IAAU,EAAa,GAAW,GAAQ,EAAE,WAAW,EAAE,IAAI,YAAY,EAAE,CAAC;AA2BlF,QAzBA,EAAQ,KACN;EACE,MAAM;EACN,OAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAE,MAAM,cAAc,GAAG;GACrC,UAAU,EAAE,MAAM,YAAY,GAAG;GACjC,SAAS,EAAE,KAAK,UAAU;GAC1B,OAAO,EAAE,IAAI,QAAQ;GACrB,kBAAkB,EAAE,KAAK,mBAAmB;GAC5C,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EACH,EACD;EACE,MAAM;EACN,OAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAE,MAAM,cAAc,GAAG;GACrC,UAAU,EAAE,MAAM,YAAY,GAAG;GACjC,OAAO;GACP,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EACH,CACF,EAEM;GAiBH,MAAyB,MAAiC;CAC9D,IAAM,IAAI,EAAM,WAAW,EAAE,EACvB,IAAI,EAAa,EAAE,EACnB,IAAQ,EAAA,kBAAkB,QAC1B,IAAY,EAAE,IAAI,YAAY,IAAI,IAEpC;AAEJ,SAAQ,EAAM,MAAd;EACE,KAAK;AACH,OAAO;IAAE,MAAM;IAAQ,MAAM,OAAO,EAAM,QAAS,WAAW,EAAM,OAAO;IAAI;AAC/E;EAEF,KAAK;AACH,OAAO;IACL,MAAM;IACN,WAAW,EAAE,MAAM,aAAa,GAAG;IACnC,KAAK,OAAO,EAAM,QAAS,WAAW,EAAM,OAAO;IACpD;AACD;EAEF;AACE,GAAI,EAAgB,EAAM,KAAK,KAE7B,IAAO,EAAe;IAAE,MAAM,EAAM;IAAM,IAAI,EAAE,IAAI,KAAK;IAAE,MAAM,EAAM;IAAM,CAAC;AAEhF;;AAOJ,QAHK,IAGE,CAAC;EAAE,MAAM;EAAW,SADG;GAAE,IAAI;GAAW;GAAM,OAAO,CAAC,EAAK;GAAE;EAChC,CAAC,GAHnB,EAAE;GAchB,MAAyB,GAAc,OAC1C,MAAS,UAAU,MAAS,UAAU,EAAgB,EAAK,KAAA,iBAAoB,GAE5E,MAAyB,GAAuB,MAA0D;CAC9G,IAAM,IAAI,EAAM,WAAW,EAAE,EACvB,IAAI,EAAa,EAAE,EACnB,IAAS,EAAA,qBAAqB;AAIpC,KAAI,GAAsB,EAAM,MAAM,EAAE,CACtC,QAAO,GAAsB,EAAM;AAGrC,KAAI,EAAM,SAAS,aACjB,QAAO,GAA4B,GAAG,EAAM,MAAM,GAAQ,EAAU;AAGtE,SAAQ,EAAM,MAAd;EACE,KAAK,QACH,QAAO,GAAY,GAAG,GAAQ,EAAU;EAE1C,KAAK,aACH,QAAO,GAAgB,GAAQ,EAAU;EAE3C,KAAK,cACH,QAAO,GAAiB,GAAQ,EAAU;EAE5C,KAAK,SACH,QAAO,GAAa,GAAG,GAAQ,EAAU;EAE3C,KAAK,QACH,QAAO,GAAY,EAAM,KAAK;EAEhC,KAAK,QACH,QAAO,GAAY,EAAM,MAAM,GAAQ,EAAU;EAEnD,KAAK,mBACH,QAAO,GAAsB,EAAE;EAEjC,KAAK,OACH,QAAO,GAAW,GAAG,EAAM,KAAK;EAElC,KAAK,aACH,QAAO,GAAgB,GAAG,EAAM,KAAK;EAEvC,KAAK,kBACH,QAAO,GAAqB,EAAE;EAEhC,KAAK,mBACH,QAAO,GAAqB,GAAG,EAAM,KAAK;EAE5C,KAAK,wBACH,QAAO,GAA0B,GAAG,EAAM,KAAK;EAEjD,KAAK,oBACH,QAAO,GAAsB,GAAG,EAAM,KAAK;EAE7C,KAAK,wBACH,QAAO,GAA0B,EAAE;EAErC,KAAK,qBACH,QAAO,GAAuB,EAAE;EAElC,QACE,QAAO,EAAgB,EAAM,KAAK,GAAG,GAAgB,EAAM,MAAM,GAAG,EAAM,KAAK,GAAG,EAAE;;GASpF,MACJ,OACuD;CACvD,mBAAmB,MAAuC;EAGxD,IAAM,IAAU,EAAa,GAFd,EAAQ,QAAA,qBAA2B,IAEF,EAAE,WADhC,EAAa,EAAQ,QAAQ,CAAC,IAAI,YAAY,EACH,CAAC;AAE9D,SADA,EAAQ,KAAK;GAAE,MAAM;GAAS,OAAO,GAAgB,EAAQ;GAAE,CAAC,EACzD;;CAGT,mBAAmB,GAA6B,MAAyB,EAAM,GAAgB,GAAS,EAAM,CAAC;CAE/G,iBAAiB,GAA6B,MAC5C,EAAM,GAAc,GAAS,EAAe,CAAC;CAE/C,iBAAiB,MAAmC,GAAsB,GAAS,EAAU;CAC9F,GAMK,KAAN,MAAwF;CAGtF,YAAY,IAA8B,EAAE,EAAE;AAC5C,OAAK,QAAQ,GACX,GAAY,IAA8B,CAAC,EAC3C,EACD;;CAGH,OAAO,GAAqC;AAC1C,SAAO,KAAK,MAAM,OAAO,EAAQ;;GAcxB,MAAiB,IAA8B,EAAE,KAC5D,IAAI,GAAwB,EAAQ,ECvgBhC,IAAN,MAAgD;CAW9C,YAAY,GAAuB,IAA8B,EAAE,EAAE;AASnE,mCAd2B,IAAI,KAA0B,kBACvB,EAAE,iBAEpB,IAGhB,KAAK,UAAU,GACf,KAAK,mBAAmB,EAAQ,UAChC,KAAK,iBAAiB,EAAQ,QAC9B,KAAK,iBACH,EAAQ,oBACD,KAGT,KAAK,UAAU,EAAQ,QAAQ,YAAY,EAAE,WAAW,eAAe,CAAC;;CAI1E,MAAM,gBAAgB,GAAyB,GAAkD;AAE/F,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,yCAAyC,EAAE,MAAM,EAAQ,MAAM,CAAC;EACpF,IAAM,IAAM,KAAK,sBAAsB,GAAS,EAAK;AACrD,SAAO,KAAK,QAAQ,QAAQ,EAAI;;CAIlC,MAAM,qBAAqB,GAA4B,GAAkD;AAEvG,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,8CAA8C,EAAE,OAAO,EAAS,QAAQ,CAAC;EAC7F,IAAM,IAAO,EAAS,KAAK,MAAM,KAAK,sBAAsB,GAAG,EAAK,CAAC;AACrE,SAAO,KAAK,QAAQ,QAAQ,EAAK;;CAInC,MAAM,YAAY,GAAkB,GAAwB,GAAoC;AAE9F,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,qCAAqC;GAAE,MAAM,EAAQ;GAAM;GAAU,CAAC;EAE1F,IAAM,IAAa,KAAK,cAAc,EAAQ,WAAW,EAAE,EAAE,EAAK;AAGlE,EAFA,EAAW,KAAiB,QAC5B,EAAW,KAAiB,aAC5B,EAAW,KAAoB;EAE/B,IAAM,IAAW,KAAK,iBAAiB,EAAK,EACtC,IAAoB;GACxB,MAAM,EAAQ;GACd,MAAM,EAAQ;GACd,QAAQ,EAAE,SAAS,GAAY;GAC/B,GAAI,IAAW,EAAE,aAAU,GAAG,EAAE;GACjC;AAED,OAAK,iBAAiB,EAAI;EAE1B,IAAM,KADS,MAAM,KAAK,QAAQ,QAAQ,EAAI,EACxB,QAAQ;AAE9B,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,0DAA0D,EAAQ,KAAK,eAAe,EAAS,IAC/F,EAAU,YACV,IACD;AAYH,EATA,KAAK,UAAU,IAAI,GAAU;GAC3B;GACA,MAAM,EAAQ;GACd;GACA,aAAa,EAAQ;GACrB,mBAAmB;GACnB,SAAS;GACV,CAAC,EAEF,KAAK,SAAS,MAAM,oDAAoD;GACtE,MAAM,EAAQ;GACd;GACA;GACD,CAAC;;CAIJ,aAAa,GAAkB,GAAoB;AACjD,OAAK,kBAAkB;EACvB,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,8DAA8D,EAAS,IACvE,EAAU,iBACV,IACD;AAGH,IAAQ,eAAe;EAEvB,IAAM,IAA0B;GAC9B,QAAQ,EAAQ;GAChB;GACA,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAQ,mBAAmB,EAAE;GACtD;AAED,OAAK,iBAAiB,EAAU;EAChC,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAU;AAC/C,OAAK,SAAS,KAAK;GAAE,SAAS;GAAG;GAAU,CAAC;;CAI9C,MAAM,YAAY,GAAkB,GAAuC;AAEzE,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,qCAAqC,EAAE,aAAU,CAAC;EAEtE,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,0DAA0D,EAAS,IACnE,EAAU,iBACV,IACD;AAIH,IAAQ,eAAe,EAAQ;EAE/B,IAAM,IAAa,KAAK,qBAAqB,GAAS,EAAQ,WAAW,EAAE,CAAC;AAC5E,IAAW,KAAiB;EAE5B,IAAM,IAAoB;GACxB,QAAQ,EAAQ;GAChB,MAAM,EAAQ;GACd,QAAQ,EAAE,SAAS,GAAY;GAChC;AAED,OAAK,iBAAiB,EAAI;EAC1B,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAI;AAKzC,EAJA,KAAK,SAAS,KAAK;GAAE,SAAS;GAAG;GAAU,CAAC,EAE5C,MAAM,KAAK,eAAe,EAE1B,KAAK,SAAS,MAAM,mDAAmD,EAAE,aAAU,CAAC;;CAItF,MAAM,YAAY,GAAkB,GAAoC;AAEtE,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,qCAAqC,EAAE,aAAU,CAAC;EAEtE,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,0DAA0D,EAAS,IACnE,EAAU,iBACV,IACD;AAGH,IAAQ,UAAU;EAElB,IAAM,IAAa,KAAK,qBAAqB,GAAS,EAAE,EAAE,EAAK;AAC/D,IAAW,KAAiB;EAE5B,IAAM,IAAoB;GACxB,QAAQ,EAAQ;GAChB,MAAM;GACN,QAAQ,EAAE,SAAS,GAAY;GAChC;AAED,OAAK,iBAAiB,EAAI;EAC1B,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAI;AAKzC,EAJA,KAAK,SAAS,KAAK;GAAE,SAAS;GAAG;GAAU,CAAC,EAE5C,MAAM,KAAK,eAAe,EAE1B,KAAK,SAAS,MAAM,oDAAoD,EAAE,aAAU,CAAC;;CAIvF,MAAM,gBAAgB,GAAoC;AAExD,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,yCAAyC,EAAE,aAAa,KAAK,UAAU,MAAM,CAAC;AAElG,OAAK,IAAM,KAAW,KAAK,UAAU,QAAQ,EAAE;AAC7C,KAAQ,UAAU;GAElB,IAAM,IAAa,KAAK,qBAAqB,GAAS,EAAE,EAAE,EAAK;AAC/D,KAAW,KAAiB;GAE5B,IAAM,IAAoB;IACxB,QAAQ,EAAQ;IAChB,MAAM;IACN,QAAQ,EAAE,SAAS,GAAY;IAChC;AAED,QAAK,iBAAiB,EAAI;GAC1B,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAI;AACzC,QAAK,SAAS,KAAK;IAAE,SAAS;IAAG,UAAU,EAAQ;IAAU,CAAC;;AAGhE,QAAM,KAAK,eAAe;;CAI5B,MAAc,gBAA+B;AAE3C,MAAI,KAAK,cACP,QAAO,KAAK;EAGd,IAAM,IAAW,KAAK;AACtB,WAAK,WAAW,EAAE,EAEd,EAAS,WAAW,GAIxB;GAFA,KAAK,SAAS,MAAM,uCAAuC,EAAE,OAAO,EAAS,QAAQ,CAAC,EAEtF,KAAK,gBAAgB,KAAK,SAAS,EAAS;AAC5C,OAAI;AACF,UAAM,KAAK;aACH;AACR,SAAK,gBAAgB,KAAA;;;;CAIzB,MAAc,SAAS,GAA0C;EAC/D,IAAM,IAAU,MAAM,QAAQ,WAAW,EAAS,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,EACxE,oBAAW,IAAI,KAAa;AAElC,OAAK,IAAM,CAAC,GAAG,MAAW,EAAQ,SAAS,EAAE;GAC3C,IAAM,IAAQ,EAAS;AACvB,GAAI,KAAS,EAAO,WAAW,cAC7B,EAAS,IAAI,EAAM,SAAS;;AAIhC,MAAI,EAAS,SAAS,GAAG;AACvB,QAAK,SAAS,MAAM,4DAA4D;AAChF;;AAGF,OAAK,SAAS,KAAK,iEAAiE,EAClF,eAAe,CAAC,GAAG,EAAS,EAC7B,CAAC;EAEF,IAAM,IAAyD,EAAE;AAEjE,OAAK,IAAM,KAAY,GAAU;GAC/B,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,OAAI,CAAC,EAAS;GAEd,IAAM,IAAiB,EAAQ,UAAU,YAAY,YAC/C,IAAoB;IACxB,QAAQ,EAAQ;IAChB,MAAM,EAAQ;IACd,QAAQ,EAAE,SAAS;KAAE,GAAG,EAAQ;MAAoB,IAAgB;KAAgB,EAAE;IACvF;AAED,OAAI;AACF,UAAM,KAAK,QAAQ,cAAc,EAAI;YAC9B,GAAO;AACd,MAAe,KAAK;KAAE;KAAU;KAAO,CAAC;;;AAI5C,MAAI,EAAe,SAAS,GAAG;GAC7B,IAAM,IAAM,EAAe,KAAK,MAAM,EAAE,SAAS,CAAC,KAAK,KAAK;AAE5D,SADA,KAAK,SAAS,MAAM,uDAAuD,EAAE,eAAe,GAAK,CAAC,EAC5F,IAAI,EAAK,UACb,mEAAmE,KACnE,EAAU,uBACV,IACD;;;CAKL,MAAM,QAAuB;AACvB,YAAK,SAET;GADA,KAAK,SAAS,MAAM,8BAA8B,EAClD,KAAK,UAAU;AACf,OAAI;AACF,UAAM,KAAK,eAAe;aAClB;AACR,SAAK,UAAU,OAAO;;AAExB,QAAK,SAAS,MAAM,6CAA6C;;;CAQnE,iBAAyB,GAAyB;AAChD,MAAI;AACF,QAAK,eAAe,EAAI;WACjB,GAAO;AACd,QAAK,SAAS,MAAM,qDAAqD,EAAE,UAAO,CAAC;;;CAIvF,mBAAiC;AAC/B,MAAI,KAAK,QACP,OAAM,IAAI,EAAK,UAAU,uDAAuD,EAAU,iBAAiB,IAAI;;CAInH,iBAAyB,GAAyC;AAChE,SAAO,GAAM,YAAY,KAAK;;CAGhC,cAAsB,GAAsC,GAA6C;EAEvG,IAAM,IAAS;GAAE,GADK,EAAa,KAAK,gBAAgB,SAAS,GAAM,QAAQ,QAAQ;GACpD,GAAG;GAAc;AAIpD,SAHI,GAAM,cAAc,KAAA,MACtB,EAAO,KAAiB,EAAK,YAExB;;CAGT,sBAA8B,GAAyB,GAAmC;EACxF,IAAM,IAAU,KAAK,cAAc,EAAQ,WAAW,EAAE,EAAE,EAAK;AAC/D,IAAQ,KAAiB;EACzB,IAAM,IAAW,KAAK,iBAAiB,EAAK,EAEtC,IAAoB;GACxB,MAAM,EAAQ;GACd,MAAM,EAAQ;GACd,QAAQ;IACN;IACA,GAAI,EAAQ,YAAY,EAAE,WAAW,IAAM,GAAG,EAAE;IACjD;GACD,GAAI,IAAW,EAAE,aAAU,GAAG,EAAE;GACjC;AAGD,SADA,KAAK,iBAAiB,EAAI,EACnB;;CAYT,qBACE,GACA,GACA,GACwB;EACxB,IAAM,IAAI,EAAE,GAAG,EAAQ,mBAAmB,EACpC,IAAgB,EAAa,KAAK,gBAAgB,SAAS,GAAM,QAAQ,QAAQ;AAGvF,SAFA,OAAO,OAAO,GAAG,EAAc,EAC/B,OAAO,OAAO,GAAG,EAAa,EACvB;;GAcE,MAAqB,GAAuB,IAA8B,EAAE,KACvF,IAAI,EAAmB,GAAQ,EAAQ,ECvanC,KAAN,MAAwF;CAItF,YAAY,GAAuB,IAA8B,EAAE,EAAE;AACnE,kBAHiB,IAGjB,KAAK,QAAQ,GAAkB,GAAQ,EAAQ;;CAGjD,MAAM,YAAY,GAA0B,GAAwC;AAClF,UAAQ,EAAM,MAAd;GAGE,KAAK,cAAc;IACjB,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAQ,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACxF;;GAGF,KAAK,mBAAmB;IACtB,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAa,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AAC7F;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,WAAW,EAAM,QAAQ,CAC9B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,YAAY,EAAM,YAAY;KAAE,MAAM;KAAc,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACtG;;GAKF,KAAK;AACH,SAAK,MAAM,aAAa,EAAM,IAAI,EAAM,MAAM;AAC9C;GAGF,KAAK;AACH,SAAK,MAAM,aAAa,EAAM,IAAI,EAAM,MAAM;AAC9C;GAGF,KAAK;AACH,SAAK,MAAM,aAAa,EAAM,YAAY,EAAM,eAAe;AAC/D;GAKF,KAAK,YAAY;IACf,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAQ,MAAM;KAAI,SAAS;KAAG,CAAC;AAC9E;;GAGF,KAAK,iBAAiB;IACpB,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAa,MAAM;KAAI,SAAS;KAAG,CAAC;AACnF;;GAGF,KAAK;AAGH,QAAI;KACF,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,WAAM,KAAK,MAAM,YAAY,EAAM,YAAY;MAAE,MAAM;MAAc,MAAM;MAAI,SAAS;MAAG,CAAC;aACrF,GAAgB;AAEvB,SAAI,EAAE,aAAiB,EAAK,aAAa,EAAY,GAAO,EAAU,gBAAgB,EACpF,OAAM;KAER,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,WAAW,EAAM,QAAQ,CAC9B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,WAAM,KAAK,MAAM,gBAAgB;MAAE,MAAM;MAAc,MAAM,EAAM;MAAO,SAAS;MAAG,CAAC;;AAEzF;GAKF,KAAK,SAAS;IACZ,IAAM,IAAI,GAAc,CACrB,IAAI,aAAa,EAAM,UAAU,CACjC,KAAK,mBAAmB,EAAM,gBAAgB,CAC9C,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAS,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACnF;;GAGF,KAAK;AACH,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAc,MAAM;KAAI,EAAE,EAAS;AAC5E;GAGF,KAAK;AACH,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAe,MAAM;KAAI,EAAE,EAAS;AAC7E;GAGF,KAAK,UAAU;IACb,IAAM,IAAI,GAAc,CACrB,IAAI,gBAAgB,EAAM,aAAa,CACvC,KAAK,mBAAmB,EAAM,gBAAgB,CAC9C,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAU,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACpF;;GAGF,KAAK;AACH,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAS,MAAM,EAAM;KAAW,EAAE,EAAS;AACpF;GAGF,KAAK;AAGH,IAFA,KAAK,WAAW,IAChB,MAAM,KAAK,MAAM,gBAAgB,EAAS,EAC1C,MAAM,KAAK,MAAM,gBACf;KAAE,MAAM;KAAS,MAAM,EAAM,UAAU;KAAI,SAAS,GAAG,IAAgB,WAAW;KAAE,EACpF,EACD;AACD;GAKF,KAAK,oBAAoB;IACvB,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,WAAW,EAAM,QAAQ,CAC9B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAC/B,MAAM;KACN,MAAM;MAAE,WAAW,EAAM;MAAW,OAAO,EAAM;MAAO;KACxD,SAAS;KACV,CAAC;AACF;;GAGF,KAAK,yBAAyB;IAC5B,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,KAAK,WAAW,EAAM,QAAQ,CAC9B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,eAAe,EAAM,YAAY,CACtC,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAC/B,MAAM;KACN,MAAM,EAAE,QAAQ,EAAM,QAAQ;KAC9B,SAAS;KACV,CAAC;AACF;;GAGF,KAAK,qBAAqB;IACxB,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,KAAK,WAAW,EAAM,QAAQ,CAC9B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAC/B,MAAM;KACN,MAAM,EAAE,WAAW,EAAM,WAAW;KACpC,SAAS;KACV,CAAC;AACF;;GAGF,KAAK,yBAAyB;IAC5B,IAAM,IAAI,GAAc,CAAC,IAAI,cAAc,EAAM,WAAW,CAAC,IAAI,cAAc,EAAM,WAAW,CAAC,OAAO;AACxG,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAyB,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACnG;;GAGF,KAAK,sBAAsB;IACzB,IAAM,IAAI,GAAc,CAAC,IAAI,cAAc,EAAM,WAAW,CAAC,OAAO;AACpE,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAsB,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AAChG;;GAKF,KAAK,QAAQ;IACX,IAAM,IAAI,GAAc,CACrB,IAAI,aAAa,EAAM,UAAU,CACjC,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAQ,MAAM,EAAM;KAAK,SAAS;KAAG,EAAE,EAAS;AACzF;;GAGF,KAAK,cAAc;IACjB,IAAM,IAAI,GAAc,CACrB,IAAI,YAAY,EAAM,SAAS,CAC/B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAc,MAAM,EAAM;KAAK,SAAS;KAAG,EAAE,EAAS;AAC/F;;GAGF,KAAK,mBAAmB;IACtB,IAAM,IAAI,GAAc,CACrB,IAAI,YAAY,EAAM,SAAS,CAC/B,IAAI,aAAa,EAAM,UAAU,CACjC,IAAI,SAAS,EAAM,MAAM,CACzB,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAmB,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AAC7F;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAI,GAAc,CAAC,KAAK,mBAAmB,EAAM,gBAAgB,CAAC,OAAO;AAC/E,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAoB,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AAC9F;;GAKF;AACE,QAAI,EAAM,KAAK,WAAW,QAAQ,EAAE;KAClC,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,aAAa,EAAM,UAAU,CAAC,OAAO,EACjF,IAAY,EAAM,cAAc;AACtC,WAAM,KAAK,MAAM,gBAAgB;MAAE,MAAM,EAAM;MAAM,MAAM,EAAM;MAAM,SAAS;MAAG;MAAW,EAAE,EAAS;;AAE3G;;;CAKN,MAAM,WAAW,GAA0B,GAAsD;AAC/F,MAAI,CAAC,EAAM,KAAK,WAAW,QAAQ,CACjC,OAAM,IAAI,EAAK,UACb,sEAAsE,EAAM,KAAK,IACjF,EAAU,iBACV,IACD;EAEH,IAAM,IAAI,GAAc,CACrB,IAAI,MAAM,QAAQ,IAAQ,EAAM,KAAK,KAAA,EAAU,CAC/C,KAAK,aAAa,eAAe,IAAQ,EAAM,YAAY,KAAA,EAAU,CACrE,OAAO,EACJ,IAAY,eAAe,KAAS,EAAM,cAAc;AAC9D,SAAO,KAAK,MAAM,gBAChB;GAAE,MAAM,EAAM;GAAM,MAAM,UAAU,IAAQ,EAAM,OAAO,KAAA;GAAW,SAAS;GAAG;GAAW,EAC3F,EACD;;CAGH,MAAM,cAAc,GAA0B,GAAsD;EAClG,IAAM,IAAW,EAAS,SAAS,MAAQ,GAAsB,EAAI,CAAC;AACtE,SAAO,KAAK,MAAM,qBAAqB,GAAU,EAAS;;CAG5D,MAAM,MAAM,GAAgC;AACtC,OAAK,aACT,KAAK,WAAW,IAChB,MAAM,KAAK,MAAM,iBAAiB,EAClC,MAAM,KAAK,MAAM,gBAAgB;GAC/B,MAAM;GACN,MAAM,KAAU;GAChB,SAAS,GAAG,IAAgB,WAAW;GACxC,CAAC;;CAGJ,MAAM,QAAuB;AAC3B,QAAM,KAAK,MAAM,OAAO;;GAQtB,MAAyB,MAA4C;CACzE,IAAM,IAAY,EAAQ,IACpB,IAA6B,EAAE;AAErC,MAAK,IAAM,KAAQ,EAAQ,MACzB,SAAQ,EAAK,MAAb;EACE,KAAK;AACH,KAAS,KAAK;IAAE,MAAM;IAAQ,MAAM,EAAK;IAAM,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,OAAO;IAAE,CAAC;AAC7G;EAEF,KAAK;AACH,KAAS,KAAK;IACZ,MAAM;IACN,MAAM,EAAK;IACX,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,IAAI,aAAa,EAAK,UAAU,CAAC,OAAO;IAC7F,CAAC;AACF;EAEF;AACE,GAAI,EAAa,EAAK,IACpB,EAAS,KAAK;IACZ,MAAM,EAAK;IACX,MAAM,EAAK;IACX,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,IAAI,MAAM,EAAK,GAAG,CAAC,OAAO;IAC/E,CAAC;AAEJ;;AASN,QAJI,EAAS,WAAW,KACtB,EAAS,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAI,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,OAAO;EAAE,CAAC,EAGjG;GC/VI,KAAyD;CACpE,gBD6WA,GACA,IAA8B,EAAE,KACmB,IAAI,GAAwB,GAAQ,EAAQ;CC9W/F;CACA;CAEA,gBAAgB,MAAkC,EAAQ;CAE1D,aAAa,MACX,EAAM,SAAS,YAAY,EAAM,SAAS,WAAW,EAAM,SAAS;CACvE,ECMY,MACX,MACqD,EAA0B;CAAE,GAAG;CAAS,OAAO;CAAgB,CAAC,ECdjH,MACJ,MAC0D,UAAU,KAAK,OAAO,EAAE,QAAS,YAWhF,MACX,GACA,MACkB;CAClB,IAAM,IAAmB,EAA6B,KAAK;AAW3D,QATI,EAAiB,YAAY,SAC3B,GAAkB,EAAmB,GACvC,EAAiB,UAAU,EAAoB,GAAoB,EAAY,GAG/E,EAAiB,UAAU,EADT,GAA0B,EAAmB,EACL,EAAY,GAInE,EAAiB;GCpCb,MACX,GACA,MACS;AACT,SAAgB;AACT,QAIL,QAHoB,EAAU,GAAG,iBAAiB;AAChD,WAAkB,EAAU,aAAa,CAAC;IAC1C;IAED,CAAC,GAAW,EAAY,CAAC"}
1
+ {"version":3,"file":"ably-ai-transport-vercel-react.js","names":["marker","symbol","_a","_b","name","marker2","symbol2","_a2","name2","marker3","symbol3","_a3","name3","marker4","symbol4","_a4","name4","marker5","symbol5","_a5","name5","marker6","symbol6","_a6","name6","marker7","symbol7","_a7","name7","marker8","symbol8","_a8","name8","marker9","symbol9","_a9","name9","marker10","symbol10","_a10","name10","marker11","symbol11","_a11","name11","marker12","symbol12","_a12","name12","marker13","symbol13","_a13","name13","marker14","symbol14","_a14","floatSafeRemainder","initializer","util.jsonStringifyReplacer","_parse","core.$ZodAsyncError","util.finalizeIssue","core.config","parse","errors.$ZodRealError","parseAsync","errors.$ZodError","safeParse","safeParseAsync","encode","decode","encodeAsync","decodeAsync","safeEncode","safeDecode","safeEncodeAsync","safeDecodeAsync","duration","_emoji","date","time","datetime","string","number","boolean","_null","util.floatSafeRemainder","util.NUMBER_FORMAT_RANGES","regexes.integer","util.nullish","util.getLengthableOrigin","regexes.lowercase","regexes.uppercase","util.escapeRegex","util.aborted","core.$ZodAsyncError","safeParse","safeParseAsync","regexes.string","regexes.guid","regexes.uuid","regexes.email","regexes.emoji","regexes.nanoid","regexes.cuid","regexes.cuid2","regexes.ulid","regexes.xid","regexes.ksuid","regexes.datetime","regexes.date","regexes.time","regexes.duration","regexes.ipv4","regexes.ipv6","regexes.cidrv4","regexes.cidrv6","regexes.base64","regexes.base64url","regexes.e164","isValidJWT","regexes.number","regexes.boolean","regexes.null","util.prefixIssues","util.optionalKeys","util.cached","isObject","util.isObject","util.esc","allowsEval","util.allowsEval","util.finalizeIssue","core.config","util.cleanRegex","mergeValues","util.isPlainObject","util.getEnumValues","util.escapeRegex","core.$ZodEncodeError","util.issue","_a","util.normalizeParams","_null","checks.$ZodCheckLessThan","checks.$ZodCheckGreaterThan","checks.$ZodCheckMultipleOf","checks.$ZodCheckMaxLength","checks.$ZodCheckMinLength","checks.$ZodCheckLengthEquals","checks.$ZodCheckRegex","checks.$ZodCheckLowerCase","checks.$ZodCheckUpperCase","checks.$ZodCheckIncludes","checks.$ZodCheckStartsWith","checks.$ZodCheckEndsWith","checks.$ZodCheckOverwrite","util.slugify","issue","util.issue","checks.$ZodCheck","describe","meta","process","process","core._isoDateTime","core._isoDate","core._isoTime","core._isoDuration","core.formatError","core.flattenError","util.jsonStringifyReplacer","ZodError","core.$constructor","ZodType","util.mergeDefs","core.clone","parse.parse","parse.safeParse","parse.parseAsync","parse.safeParseAsync","parse.encode","parse.decode","parse.encodeAsync","parse.decodeAsync","parse.safeEncode","parse.safeDecode","parse.safeEncodeAsync","parse.safeDecodeAsync","checks.overwrite","array","processors.stringProcessor","checks.regex","checks.includes","checks.startsWith","checks.endsWith","checks.minLength","checks.maxLength","checks.length","checks.lowercase","checks.uppercase","checks.trim","checks.normalize","checks.toLowerCase","checks.toUpperCase","checks.slugify","ZodString","core._email","core._url","core._jwt","core._emoji","core._guid","core._uuid","core._uuidv4","core._uuidv6","core._uuidv7","core._nanoid","core._cuid","core._cuid2","core._ulid","core._base64","core._base64url","core._xid","core._ksuid","core._ipv4","core._ipv6","core._cidrv4","core._cidrv6","core._e164","iso.datetime","iso.date","iso.time","iso.duration","core._string","ZodNumber","processors.numberProcessor","checks.gt","checks.gte","checks.lt","checks.lte","checks.multipleOf","core._number","core._int","ZodBoolean","processors.booleanProcessor","core._boolean","ZodNull","processors.nullProcessor","core._null","ZodUnknown","processors.unknownProcessor","core._unknown","ZodNever","processors.neverProcessor","core._never","ZodArray","processors.arrayProcessor","core._array","ZodObject","processors.objectProcessor","util.extend","util.safeExtend","util.merge","util.pick","util.omit","util.partial","ZodOptional","util.required","object","util.normalizeParams","ZodUnion","processors.unionProcessor","ZodDiscriminatedUnion","ZodIntersection","processors.intersectionProcessor","ZodRecord","processors.recordProcessor","ZodEnum","processors.enumProcessor","ZodLiteral","processors.literalProcessor","processors.transformProcessor","core.$ZodEncodeError","issue","util.issue","processors.optionalProcessor","ZodNullable","processors.nullableProcessor","ZodDefault","processors.defaultProcessor","util.shallowClone","processors.prefaultProcessor","processors.nonoptionalProcessor","ZodCatch","processors.catchProcessor","processors.pipeProcessor","ZodReadonly","processors.readonlyProcessor","ZodLazy","processors.lazyProcessor","processors.customProcessor","core._custom","core._refine","core._superRefine","core.describe","core.meta","defaultErrorMap","defaultErrorMap","emojiRegex","defaultErrorMap","name","marker","symbol","_a","ZodFirstPartyTypeKind2","ZodFirstPartyTypeKind3","z4.toJSONSchema","z4.safeParseAsync","TypeValidationError2","AISDKError8","DownloadError2","z.union","z.string","z.instanceof","z.custom","z2.lazy","z2.union","z2.null","z2.string","z2.number","z2.boolean","z2.record","z2.array","z3.record","z3.string","z4.object","z4.literal","z4.string","z4.union","z4.instanceof","z4.unknown","z4.boolean","z4.discriminatedUnion","z4.array","z4.record","z5.object","z5.literal","z5.string","z5.union","z5.array","asSchema2","safeParseJSON2","safeValidateTypes2","TypeValidationError2","z7.union","z7.strictObject","z7.literal","z7.string","z7.boolean","z7.unknown","z7.custom","z7.enum","createIdGenerator2","lazySchema2","zodSchema2","z8.array","z8.object","z8.string","z8.enum","z8.unknown","z8.union","z8.literal","z8.boolean","z8.never","createIdGenerator3","createIdGenerator4"],"sources":["../../../src/react/contexts/transport-context.ts","../../../src/constants.ts","../../../src/errors.ts","../../../src/event-emitter.ts","../../../src/logger.ts","../../../src/utils.ts","../../../src/core/transport/headers.ts","../../../src/core/transport/stream-router.ts","../../../src/core/transport/tree.ts","../../../src/core/transport/decode-history.ts","../../../src/core/transport/view.ts","../../../src/core/transport/client-transport.ts","../../../src/react/contexts/transport-provider.tsx","../../../src/react/use-ably-messages.ts","../../../src/react/use-active-turns.ts","../../../src/react/use-client-transport.ts","../../../src/react/use-view.ts","../../../src/react/use-create-view.ts","../../../src/react/use-tree.ts","../../../src/react/create-transport-hooks.ts","../../../src/vercel/codec/tool-transitions.ts","../../../src/vercel/codec/accumulator.ts","../../../src/core/codec/decoder.ts","../../../src/core/codec/lifecycle-tracker.ts","../../../src/vercel/codec/decoder.ts","../../../node_modules/@ai-sdk/provider/dist/index.mjs","../../../node_modules/zod/v4/core/core.js","../../../node_modules/zod/v4/core/util.js","../../../node_modules/zod/v4/core/errors.js","../../../node_modules/zod/v4/core/parse.js","../../../node_modules/zod/v4/core/regexes.js","../../../node_modules/zod/v4/core/checks.js","../../../node_modules/zod/v4/core/doc.js","../../../node_modules/zod/v4/core/versions.js","../../../node_modules/zod/v4/core/schemas.js","../../../node_modules/zod/v4/core/registries.js","../../../node_modules/zod/v4/core/api.js","../../../node_modules/zod/v4/core/to-json-schema.js","../../../node_modules/zod/v4/core/json-schema-processors.js","../../../node_modules/zod/v4/classic/iso.js","../../../node_modules/zod/v4/classic/errors.js","../../../node_modules/zod/v4/classic/parse.js","../../../node_modules/zod/v4/classic/schemas.js","../../../node_modules/zod/v3/helpers/util.js","../../../node_modules/zod/v3/ZodError.js","../../../node_modules/zod/v3/locales/en.js","../../../node_modules/zod/v3/errors.js","../../../node_modules/zod/v3/helpers/parseUtil.js","../../../node_modules/zod/v3/helpers/errorUtil.js","../../../node_modules/zod/v3/types.js","../../../node_modules/@ai-sdk/provider-utils/dist/index.mjs","../../../node_modules/ai/dist/index.mjs","../../../src/core/codec/encoder.ts","../../../src/vercel/codec/encoder.ts","../../../src/vercel/codec/index.ts","../../../src/vercel/transport/chat-transport.ts","../../../src/vercel/transport/index.ts","../../../src/vercel/react/contexts/chat-transport-context.ts","../../../src/vercel/react/contexts/chat-transport-provider.tsx","../../../src/vercel/react/use-chat-transport.ts","../../../src/vercel/react/use-message-sync.ts","../../../src/vercel/react/use-staged-add-tool-approval-response.ts"],"sourcesContent":["import type * as Ably from 'ably';\nimport { createContext } from 'react';\n\nimport type { ClientTransport } from '../../core/transport/types.js';\n\n/**\n * A single entry in the transport registry, holding the transport and any\n * error that occurred during its construction.\n *\n * `transport` is `undefined` when construction failed.\n * `error` is set when `createClientTransport` threw during provider render.\n */\nexport interface TransportSlot {\n /** The constructed transport, or `undefined` if construction failed. */\n transport: ClientTransport<unknown, unknown> | undefined;\n /** Construction error from `createClientTransport`, or `undefined` on success. */\n error: Ably.ErrorInfo | undefined;\n}\n\n/** The shape of the TransportContext value — a record of channelName → slot. */\nexport type TransportContextValue = Readonly<Record<string, TransportSlot>>;\n\n/**\n * Context that holds the registered {@link ClientTransport} slots, keyed by channelName.\n * Each slot contains the transport (or `undefined` on construction failure) and any error.\n * Populated by {@link TransportProvider}; read by {@link useClientTransport}.\n */\nexport const TransportContext = createContext<TransportContextValue>({});\n\n/**\n * Context that holds the nearest (innermost) transport slot.\n * Each {@link TransportProvider} sets this to its own slot, so descendants\n * can access the nearest transport without knowing its channel name.\n * `undefined` when no provider is present.\n * Read by hooks whose `transport` argument is omitted.\n */\nexport const NearestTransportContext = createContext<TransportSlot | undefined>(undefined);\n","/**\n * Shared constants used by both codec and transport layers.\n *\n * Header constants define the `x-ably-*` wire protocol. Message and event\n * name constants define the transport lifecycle signals on the channel.\n *\n * These live at the top level (not in codec/ or transport/) because both\n * layers need them — the codec core reads/writes stream and status headers,\n * while the transport layer reads/writes turn, cancel, and role headers.\n */\n\n// ---------------------------------------------------------------------------\n// Stream headers (used by codec encoder/decoder core)\n// ---------------------------------------------------------------------------\n\n/** Header: whether this Ably message uses streaming (message appends) or is discrete. Always \"true\" or \"false\". */\nexport const HEADER_STREAM = 'x-ably-stream';\n\n/** Header: lifecycle status of a streamed message. Only set when x-ably-stream is \"true\". */\nexport const HEADER_STATUS = 'x-ably-status';\n\n/** Header: stream identity. Set by the encoder on every streamed message; read by the decoder to correlate streams. */\nexport const HEADER_STREAM_ID = 'x-ably-stream-id';\n\n/** Header: marks a message as a discrete message part (from writeMessages). Set by publishDiscreteBatch; not set on lifecycle events from publishDiscrete. */\nexport const HEADER_DISCRETE = 'x-ably-discrete';\n\n// ---------------------------------------------------------------------------\n// Identity headers (used by transport for turn correlation)\n// ---------------------------------------------------------------------------\n\n/** Header: turn correlation ID. Set on every message in a turn. */\nexport const HEADER_TURN_ID = 'x-ably-turn-id';\n\n/** Header: message identity. Assigned per message (user or assistant). Used for optimistic reconciliation on the client. */\nexport const HEADER_MSG_ID = 'x-ably-msg-id';\n\n/** Header: clientId of the user who initiated the turn. Set by the server on stream messages. */\nexport const HEADER_TURN_CLIENT_ID = 'x-ably-turn-client-id';\n\n/** Header: message role (e.g. \"user\", \"assistant\"). */\nexport const HEADER_ROLE = 'x-ably-role';\n\n/** Header: the msg-id of the existing message this Ably message amends. Present on cross-turn amendment events. */\nexport const HEADER_AMEND = 'x-ably-amend';\n\n// ---------------------------------------------------------------------------\n// Cancel headers\n// ---------------------------------------------------------------------------\n\n/** Header: cancel a specific turn by ID. */\nexport const HEADER_CANCEL_TURN_ID = 'x-ably-cancel-turn-id';\n\n/** Header: cancel all turns belonging to the sender's clientId. */\nexport const HEADER_CANCEL_OWN = 'x-ably-cancel-own';\n\n/** Header: cancel all turns on the channel. */\nexport const HEADER_CANCEL_ALL = 'x-ably-cancel-all';\n\n/** Header: cancel all turns belonging to a specific clientId. */\nexport const HEADER_CANCEL_CLIENT_ID = 'x-ably-cancel-client-id';\n\n// ---------------------------------------------------------------------------\n// Fork / branching headers\n// ---------------------------------------------------------------------------\n\n/** Header: the msg-id of the immediately preceding message in this branch. */\nexport const HEADER_PARENT = 'x-ably-parent';\n\n/** Header: the msg-id of the message this one replaces (creates a fork). */\nexport const HEADER_FORK_OF = 'x-ably-fork-of';\n\n// ---------------------------------------------------------------------------\n// Turn lifecycle headers\n// ---------------------------------------------------------------------------\n\n/** Header: reason a turn ended (on x-ably-turn-end messages). */\nexport const HEADER_TURN_REASON = 'x-ably-turn-reason';\n\n// ---------------------------------------------------------------------------\n// Message / event names\n// ---------------------------------------------------------------------------\n\n/** Message name: client->server cancel signal. */\nexport const EVENT_CANCEL = 'x-ably-cancel';\n\n/** Message name: server publishes this to signal a turn has started. */\nexport const EVENT_TURN_START = 'x-ably-turn-start';\n\n/** Message name: server publishes this to signal a turn has ended. */\nexport const EVENT_TURN_END = 'x-ably-turn-end';\n\n/** Message name: transport-level abort signal (stream cancelled). */\nexport const EVENT_ABORT = 'x-ably-abort';\n\n/** Message name: transport-level error signal. */\nexport const EVENT_ERROR = 'x-ably-error';\n\n// ---------------------------------------------------------------------------\n// Domain header prefix (used by codec implementations)\n// ---------------------------------------------------------------------------\n\n/** Prefix for domain-specific headers. Distinguishes codec-layer headers from transport `x-ably-*` headers. */\nexport const DOMAIN_HEADER_PREFIX = 'x-domain-';\n","import * as Ably from 'ably';\n\n/**\n * Error codes for the AI Transport SDK.\n */\nexport enum ErrorCode {\n /**\n * The request was invalid.\n */\n BadRequest = 40000,\n\n /**\n * Invalid argument provided.\n */\n InvalidArgument = 40003,\n\n // 104000 - 104999 are reserved for AI Transport SDK errors\n\n /**\n * Encoder recovery failed after flush — one or more updateMessage calls\n * could not recover a failed append pipeline.\n */\n EncoderRecoveryFailed = 104000,\n\n /**\n * A transport-level channel subscription callback threw unexpectedly.\n */\n TransportSubscriptionError = 104001,\n\n /**\n * Cancel listener or onCancel hook threw while processing a cancel message.\n */\n CancelListenerError = 104002,\n\n /**\n * A publish within a turn failed (lifecycle event, message, or event).\n */\n TurnLifecycleError = 104003,\n\n /**\n * An operation was attempted on a transport that has already been closed.\n */\n TransportClosed = 104004,\n\n /**\n * The HTTP POST to the server endpoint failed (network error or non-2xx response).\n */\n TransportSendFailed = 104005,\n\n /**\n * The Ably channel lost message continuity — the channel entered FAILED,\n * SUSPENDED, or DETACHED, or re-attached with `resumed: false`. Active\n * streams can no longer be guaranteed to receive all events.\n */\n ChannelContinuityLost = 104006,\n\n /**\n * An operation was attempted but the channel is not in a usable state\n * (not ATTACHED or ATTACHING).\n */\n ChannelNotReady = 104007,\n\n /**\n * An error occurred while piping a response stream to the channel — either\n * the source event stream threw (e.g. LLM provider rate limit, model error,\n * network failure) or an underlying publish failed mid-stream.\n */\n StreamError = 104008,\n}\n\n/**\n * Returns true if the {@link Ably.ErrorInfo} code matches the provided ErrorCode value.\n * @param errorInfo The error info to check.\n * @param error The error code to compare against.\n * @returns true if the error code matches, false otherwise.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\nexport const errorInfoIs = (errorInfo: Ably.ErrorInfo, error: ErrorCode): boolean => errorInfo.code === error;\n","/**\n * Type-safe EventEmitter wrapping Ably's internal EventEmitter.\n *\n * Takes a single `EventsMap` type parameter — an interface mapping event names\n * to payload types — rather than Ably's three type parameters. Adapted from\n * the ably-chat-js SDK.\n *\n * ```ts\n * interface MyEvents {\n * reaction: { emoji: string };\n * status: { online: boolean };\n * }\n *\n * const emitter = new EventEmitter<MyEvents>(logger);\n * emitter.on('reaction', (event) => console.log(event.emoji));\n * emitter.emit('reaction', { emoji: '👍' });\n * ```\n */\n\nimport * as Ably from 'ably';\n\nimport type { Logger } from './logger.js';\n\n/** Callback receiving a union of all possible event payloads. */\ntype Callback<EventsMap> = (arg: EventsMap[keyof EventsMap]) => void;\n\n/** Callback receiving the payload for a single event type. */\ntype CallbackSingle<K> = (arg: K) => void;\n\n/**\n * Type-safe interface for the Ably EventEmitter, parameterized by an EventsMap\n * that maps event names to their payload types.\n */\ninterface InterfaceEventEmitter<EventsMap> extends Ably.EventEmitter<Callback<EventsMap>, void, keyof EventsMap> {\n /** Emit an event with a type-safe payload. Payload is optional for `undefined`-typed events. */\n emit<K extends keyof EventsMap>(\n event: K,\n ...args: EventsMap[K] extends undefined ? [EventsMap[K]?] : [EventsMap[K]]\n ): void;\n\n /** Subscribe to a single event with a typed callback. */\n on<K extends keyof EventsMap>(event: K, callback: CallbackSingle<EventsMap[K]>): void;\n /** Subscribe to two events with a union-typed callback. */\n on<K1 extends keyof EventsMap, K2 extends keyof EventsMap>(\n events: [K1, K2],\n callback: CallbackSingle<EventsMap[K1] | EventsMap[K2]>,\n ): void;\n /** Subscribe to three events with a union-typed callback. */\n on<K1 extends keyof EventsMap, K2 extends keyof EventsMap, K3 extends keyof EventsMap>(\n events: [K1, K2, K3],\n callback: CallbackSingle<EventsMap[K1] | EventsMap[K2] | EventsMap[K3]>,\n ): void;\n /** Subscribe to an array of events. */\n on(events: (keyof EventsMap)[], callback: Callback<EventsMap>): void;\n /** Subscribe to all events. */\n on(callback: Callback<EventsMap>): void;\n\n /** Unsubscribe a callback from a specific event. */\n off<K extends keyof EventsMap>(event: K, listener: CallbackSingle<EventsMap[K]>): void;\n /** Unsubscribe a callback from all events, or remove all listeners if no callback provided. */\n off(listener?: Callback<EventsMap>): void;\n}\n\n/**\n * Bridge from our {@link Logger} to the Ably EventEmitter's internal logger\n * contract. Ably's EventEmitter calls `logger.logAction(level, action, message)`\n * when a listener throws — we route that to our Logger's `error` method.\n * @param logger - The application logger to delegate to.\n * @returns An object satisfying the Ably EventEmitter's logger interface.\n */\nconst toAblyLogger = (logger: Logger): unknown => ({\n logAction: (_level: number, action: string, message?: string) => {\n logger.error(action, { detail: message });\n },\n shouldLog: () => true,\n});\n\n// CAST: Access Ably's internal EventEmitter constructor. Not publicly exported\n// but available to other Ably SDKs. The logger parameter ensures listener\n// exceptions are caught and logged rather than crashing.\nconst InternalEventEmitter: new <EventsMap>(logger: unknown) => InterfaceEventEmitter<EventsMap> = (\n Ably.Realtime as unknown as { EventEmitter: new <EventsMap>(logger: unknown) => InterfaceEventEmitter<EventsMap> }\n).EventEmitter;\n\n/**\n * Type-safe EventEmitter based on Ably's internal EventEmitter.\n *\n * Provides the same semantics as {@link Ably.EventEmitter} (error isolation\n * between listeners, synchronous dispatch) but with a single `EventsMap` type\n * parameter for ergonomic type safety.\n *\n * Requires a {@link Logger} so that listener exceptions are routed through\n * the application's logging infrastructure rather than silently swallowed.\n */\nexport class EventEmitter<EventsMap> extends InternalEventEmitter<EventsMap> {\n /**\n * Create a new EventEmitter.\n * @param logger - Application logger. Listener exceptions are logged at error level.\n */\n constructor(logger: Logger) {\n super(toAblyLogger(logger));\n }\n}\n","import * as Ably from 'ably';\n\nimport { ErrorCode } from './errors.js';\n\n/**\n * Structured logger with leveled output and hierarchical context.\n * Implementations filter messages by level and delegate to a {@link LogHandler}.\n */\nexport interface Logger {\n /**\n * Log a message at the trace level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n trace(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the debug level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n debug(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the info level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n info(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the warn level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n warn(message: string, context?: LogContext): void;\n\n /**\n * Log a message at the error level.\n * @param message The message to log.\n * @param context The context of the log message as key-value pairs.\n */\n error(message: string, context?: LogContext): void;\n\n /**\n * Creates a new logger with a context that will be merged with any context provided to individual log calls.\n * The context will be overridden by any matching keys in the individual log call's context.\n * @param context The context to use for all log calls.\n * @returns A new logger instance with the context.\n */\n withContext(context: LogContext): Logger;\n}\n\n/**\n * Represents the different levels of logging that can be used.\n */\nexport enum LogLevel {\n /**\n * Something routine and expected has occurred. This level will provide logs for the vast majority of operations\n * and function calls.\n */\n Trace = 'trace',\n\n /**\n * Development information, messages that are useful when trying to debug library behavior,\n * but superfluous to normal operation.\n */\n Debug = 'debug',\n\n /**\n * Informational messages. Operationally significant to the library but not out of the ordinary.\n */\n Info = 'info',\n\n /**\n * Anything that is not immediately an error, but could cause unexpected behavior in the future. For example,\n * passing an invalid value to an option. Indicates that some action should be taken to prevent future errors.\n */\n Warn = 'warn',\n\n /**\n * A given operation has failed and cannot be automatically recovered. The error may threaten the continuity\n * of operation.\n */\n Error = 'error',\n\n /**\n * No logging will be performed.\n */\n Silent = 'silent',\n}\n\n/**\n * Represents the context of a log message.\n * It is an object of key-value pairs that can be used to provide additional context to a log message.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type LogContext = Record<string, any>;\n\n/**\n * A function that can be used to handle log messages.\n * @param message The message to log.\n * @param level The log level of the message.\n * @param context The context of the log message as key-value pairs.\n */\nexport type LogHandler = (message: string, level: LogLevel, context?: LogContext) => void;\n\n/**\n * A simple console logger that logs messages to the console.\n * @param message The message to log.\n * @param level The log level of the message.\n * @param context - The context of the log message as key-value pairs.\n */\nexport const consoleLogger = (message: string, level: LogLevel, context?: LogContext) => {\n const contextString = context ? `, context: ${JSON.stringify(context)}` : '';\n const formattedMessage = `[${new Date().toISOString()}] ${level.valueOf().toUpperCase()} ably-ai-transport: ${message}${contextString}`;\n\n switch (level) {\n case LogLevel.Trace:\n case LogLevel.Debug: {\n console.log(formattedMessage);\n break;\n }\n case LogLevel.Info: {\n console.info(formattedMessage);\n break;\n }\n case LogLevel.Warn: {\n console.warn(formattedMessage);\n break;\n }\n case LogLevel.Error: {\n console.error(formattedMessage);\n break;\n }\n case LogLevel.Silent: {\n break;\n }\n }\n};\n\n/**\n * Options for creating a logger.\n */\nexport interface LoggerOptions {\n logHandler?: LogHandler;\n logLevel: LogLevel;\n}\n\nexport const makeLogger = (options: LoggerOptions): Logger => {\n const logHandler = options.logHandler ?? consoleLogger;\n\n return new DefaultLogger(logHandler, options.logLevel);\n};\n\n/**\n * A convenient list of log levels as numbers that can be used for easier comparison.\n */\nenum LogLevelNumber {\n Trace = 0,\n Debug = 1,\n Info = 2,\n Warn = 3,\n Error = 4,\n Silent = 5,\n}\n\n/**\n * A mapping of log levels to their numeric equivalents.\n */\nconst logLevelNumberMap = new Map<LogLevel, LogLevelNumber>([\n [LogLevel.Trace, LogLevelNumber.Trace],\n [LogLevel.Debug, LogLevelNumber.Debug],\n [LogLevel.Info, LogLevelNumber.Info],\n [LogLevel.Warn, LogLevelNumber.Warn],\n [LogLevel.Error, LogLevelNumber.Error],\n [LogLevel.Silent, LogLevelNumber.Silent],\n]);\n\n/**\n * A default logger implementation.\n */\nclass DefaultLogger implements Logger {\n private readonly _handler: LogHandler;\n private readonly _levelNumber: LogLevelNumber;\n private readonly _context?: LogContext;\n\n constructor(handler: LogHandler, level: LogLevel, context?: LogContext) {\n this._handler = handler;\n this._context = context;\n\n const levelNumber = logLevelNumberMap.get(level);\n if (levelNumber === undefined) {\n throw new Ably.ErrorInfo(`unable to create logger; invalid log level: ${level}`, ErrorCode.InvalidArgument, 400);\n }\n\n this._levelNumber = levelNumber;\n }\n\n trace(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Trace, LogLevelNumber.Trace, context);\n }\n\n debug(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Debug, LogLevelNumber.Debug, context);\n }\n\n info(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Info, LogLevelNumber.Info, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Warn, LogLevelNumber.Warn, context);\n }\n\n error(message: string, context?: LogContext): void {\n this._write(message, LogLevel.Error, LogLevelNumber.Error, context);\n }\n\n withContext(context: LogContext): Logger {\n // Get the original log level by finding the key in logLevelNumberMap that matches this._levelNumber\n const originalLevel =\n [...logLevelNumberMap.entries()].find(([, value]) => value === this._levelNumber)?.[0] ?? LogLevel.Error;\n\n return new DefaultLogger(this._handler, originalLevel, this._mergeContext(context));\n }\n\n private _write(message: string, level: LogLevel, levelNumber: LogLevelNumber, context?: LogContext): void {\n if (levelNumber >= this._levelNumber) {\n this._handler(message, level, this._mergeContext(context));\n }\n }\n\n private _mergeContext(context?: LogContext): LogContext | undefined {\n if (!this._context) {\n return context ?? undefined;\n }\n\n return context ? { ...this._context, ...context } : this._context;\n }\n}\n","/**\n * Shared utilities for working with Ably messages.\n *\n * These are general-purpose helpers used by both the codec and transport\n * layers. They live at the top level to avoid either layer depending on\n * the other.\n */\n\nimport type * as Ably from 'ably';\n\nimport { DOMAIN_HEADER_PREFIX } from './constants.js';\n\n/**\n * Extract extras.headers from an Ably InboundMessage.\n * @param message - The Ably message to extract headers from.\n * @returns The headers record, or an empty object if absent.\n */\nexport const getHeaders = (message: Ably.InboundMessage): Record<string, string> => {\n // CAST: Ably SDK types `extras` as `any`; runtime checks below guard access.\n const extras = message.extras as unknown;\n if (!extras || typeof extras !== 'object') return {};\n const headers = (extras as { headers?: unknown }).headers;\n if (!headers || typeof headers !== 'object') return {};\n // CAST: Ably wire protocol guarantees headers is Record<string, string>\n // when present, verified by the runtime guards above.\n return headers as Record<string, string>;\n};\n\n/**\n * Parse a JSON string, returning undefined on failure.\n * @param value - The JSON string to parse.\n * @returns The parsed value, or undefined if parsing fails.\n */\nexport const parseJson = (value: string | undefined): unknown => {\n if (value === undefined) return undefined;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Set a header value if defined, skipping undefined and null. Strings are set directly,\n * booleans and numbers are stringified, objects are JSON-serialized.\n * @param headers - The headers object to mutate.\n * @param key - The header key.\n * @param value - The value to set.\n */\nexport const setIfPresent = (headers: Record<string, string>, key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (typeof value === 'string') {\n headers[key] = value;\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n headers[key] = String(value);\n } else if (typeof value === 'object') {\n headers[key] = JSON.stringify(value);\n }\n};\n\n/**\n * Set multiple headers at once, skipping entries whose values are undefined or null.\n * Each value is converted using the same rules as {@link setIfPresent}.\n * @param headers - The headers object to mutate.\n * @param entries - Key-value pairs to set.\n */\nexport const setHeadersIfPresent = (headers: Record<string, string>, entries: Record<string, unknown>): void => {\n for (const [key, value] of Object.entries(entries)) {\n setIfPresent(headers, key, value);\n }\n};\n\n/**\n * Merge two header records into a new object. Later values override earlier ones.\n * Undefined inputs are treated as empty.\n * @param base - Base headers (lower priority).\n * @param overrides - Override headers (higher priority).\n * @returns A new merged headers object.\n */\nexport const mergeHeaders = (\n base: Record<string, string> | undefined,\n overrides: Record<string, string> | undefined,\n): Record<string, string> => ({\n ...base,\n ...overrides,\n});\n\n/**\n * Parse a boolean header (\"true\"/\"false\"), returning undefined if absent.\n * @param value - The header string to parse.\n * @returns True if \"true\", false for any other string, or undefined if absent.\n */\nexport const parseBool = (value: string | undefined): boolean | undefined => {\n if (value === undefined) return undefined;\n return value === 'true';\n};\n\n/**\n * Build a domain headers record from key-value pairs. Each key is automatically\n * prefixed with {@link DOMAIN_HEADER_PREFIX}. Values that are undefined or null\n * are skipped; strings are set directly; booleans, numbers, and objects are\n * converted using the same rules as {@link setIfPresent}.\n * @param entries - Unprefixed key-value pairs (e.g. `{ toolCallId: 'tc-1' }` becomes `{ 'x-domain-toolCallId': 'tc-1' }`).\n * @returns A new headers record with prefixed keys.\n */\nexport const domainHeaders = (entries: Record<string, unknown>): Record<string, string> => {\n const h: Record<string, string> = {};\n for (const [key, value] of Object.entries(entries)) {\n setIfPresent(h, DOMAIN_HEADER_PREFIX + key, value);\n }\n return h;\n};\n\n/**\n * Read a domain header value from a headers record.\n * @param headers - The headers record to read from.\n * @param key - The unprefixed domain key (e.g. `'toolCallId'` reads `'x-domain-toolCallId'`).\n * @returns The header value, or undefined if absent.\n */\nexport const getDomainHeader = (headers: Record<string, string>, key: string): string | undefined =>\n headers[DOMAIN_HEADER_PREFIX + key];\n\n/**\n * Mapped type that converts properties whose type includes `undefined`\n * into optional properties with `undefined` excluded from the value.\n * Properties typed as `unknown` are kept required (since `undefined extends unknown`\n * is always true, but `unknown` fields are intentionally broad, not optional).\n */\nexport type Stripped<T> = {\n [K in keyof T as undefined extends T[K] ? (unknown extends T[K] ? K : never) : K]: T[K];\n} & {\n [K in keyof T as undefined extends T[K] ? (unknown extends T[K] ? never : K) : never]?: Exclude<T[K], undefined>;\n};\n\n/**\n * Remove all keys whose value is `undefined` from a shallow object.\n * Returns a new object — the input is not mutated. Useful for building\n * chunk literals with optional fields without conditional spread noise.\n *\n * The return type converts `{ foo: T | undefined }` to `{ foo?: T }`,\n * matching the optional-field pattern used by the AI SDK chunk types.\n * @param obj - The object to strip undefined values from.\n * @returns A shallow copy with undefined-valued keys removed.\n */\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Stripped<T> => {\n const result = {} as Record<string, unknown>;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n // CAST: The runtime strip guarantees the Stripped<T> contract —\n // required keys are always present, optional keys are absent when undefined.\n return result as Stripped<T>;\n};\n\n// ---------------------------------------------------------------------------\n// DomainHeaderReader — typed accessors for domain headers\n// ---------------------------------------------------------------------------\n\n/**\n * Typed accessor wrapper around a headers record for reading domain headers.\n * Reduces repetitive `getDomainHeader` + `parseBool` / `parseJson` chains.\n */\nexport interface DomainHeaderReader {\n /** Read a domain header as a string, or undefined if absent. */\n str(key: string): string | undefined;\n /** Read a domain header as a string, falling back to a default if absent. */\n strOr(key: string, fallback: string): string;\n /** Read a domain header as a boolean (\"true\"/\"false\"), or undefined if absent. */\n bool(key: string): boolean | undefined;\n /** Read a domain header as parsed JSON, or undefined if absent or invalid. */\n json(key: string): unknown;\n}\n\n/**\n * Create a {@link DomainHeaderReader} over a headers record.\n * @param headers - The raw headers record to read domain headers from.\n * @returns A typed accessor for domain header values.\n */\nexport const headerReader = (headers: Record<string, string>): DomainHeaderReader => ({\n str: (key: string) => getDomainHeader(headers, key),\n strOr: (key: string, fallback: string) => getDomainHeader(headers, key) ?? fallback,\n bool: (key: string) => parseBool(getDomainHeader(headers, key)),\n json: (key: string) => parseJson(getDomainHeader(headers, key)),\n});\n\n// ---------------------------------------------------------------------------\n// DomainHeaderWriter — typed builder for domain headers\n// ---------------------------------------------------------------------------\n\n/**\n * Fluent builder for constructing domain header records with typed setters.\n * Mirrors {@link DomainHeaderReader} with the same method names for symmetry.\n * Undefined values are silently skipped on all setters.\n */\nexport interface DomainHeaderWriter {\n /** Set a string domain header. Skips if value is undefined. */\n str(key: string, value: string | undefined): DomainHeaderWriter;\n /** Set a boolean domain header (serialized as \"true\"/\"false\"). Skips if value is undefined. */\n bool(key: string, value: boolean | undefined): DomainHeaderWriter;\n /** Set a JSON-serialized domain header. Skips if value is undefined or null. */\n json(key: string, value: unknown): DomainHeaderWriter;\n /** Return the accumulated headers record. */\n build(): Record<string, string>;\n}\n\n/**\n * Create a {@link DomainHeaderWriter} for building a domain headers record.\n * @returns A fluent builder that prefixes each key with the domain header prefix.\n */\nexport const headerWriter = (): DomainHeaderWriter => {\n const h: Record<string, string> = {};\n const writer: DomainHeaderWriter = {\n str: (key: string, value: string | undefined) => {\n if (value !== undefined) h[DOMAIN_HEADER_PREFIX + key] = value;\n return writer;\n },\n bool: (key: string, value: boolean | undefined) => {\n if (value !== undefined) h[DOMAIN_HEADER_PREFIX + key] = String(value);\n return writer;\n },\n json: (key: string, value: unknown) => {\n if (value !== undefined && value !== null) h[DOMAIN_HEADER_PREFIX + key] = JSON.stringify(value);\n return writer;\n },\n build: () => h,\n };\n return writer;\n};\n","/**\n * Transport header builder.\n *\n * Single source of truth for which `x-ably-*` headers every transport\n * message carries. Used by the server transport (addMessages, streamResponse)\n * and will be used by the client transport (optimistic message stamping).\n */\n\nimport {\n HEADER_AMEND,\n HEADER_FORK_OF,\n HEADER_MSG_ID,\n HEADER_PARENT,\n HEADER_ROLE,\n HEADER_TURN_CLIENT_ID,\n HEADER_TURN_ID,\n} from '../../constants.js';\n\n/**\n * Build the standard transport header set for a message.\n * @param opts - The header values to include.\n * @param opts.role - Message role (e.g. \"user\", \"assistant\").\n * @param opts.turnId - Turn correlation ID.\n * @param opts.msgId - Message identity.\n * @param opts.turnClientId - ClientId of the turn initiator.\n * @param opts.parent - Preceding message's msg-id (for branching).\n * @param opts.forkOf - Forked message's msg-id (for edit/regen).\n * @param opts.amend - The msg-id of the existing message this message targets (cross-turn events).\n * @returns A headers record with the `x-ably-*` transport headers set.\n */\nexport const buildTransportHeaders = (opts: {\n role: string;\n turnId: string;\n msgId: string;\n turnClientId?: string;\n parent?: string;\n forkOf?: string;\n amend?: string;\n}): Record<string, string> => {\n const h: Record<string, string> = {\n [HEADER_ROLE]: opts.role,\n [HEADER_TURN_ID]: opts.turnId,\n [HEADER_MSG_ID]: opts.msgId,\n };\n if (opts.turnClientId !== undefined) h[HEADER_TURN_CLIENT_ID] = opts.turnClientId;\n if (opts.parent) h[HEADER_PARENT] = opts.parent;\n if (opts.forkOf) h[HEADER_FORK_OF] = opts.forkOf;\n if (opts.amend) h[HEADER_AMEND] = opts.amend;\n return h;\n};\n","/**\n * Client-side stream routing.\n *\n * Maintains a map of turnId to ReadableStreamController. Routes decoded events\n * to the correct stream. Closes streams on terminal events, explicit close, or\n * error.\n */\n\nimport * as Ably from 'ably';\n\nimport { ErrorCode } from '../../errors.js';\nimport type { Logger } from '../../logger.js';\nimport type { TurnEntry } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Interface\n// ---------------------------------------------------------------------------\n\n/** Routes decoded events to the correct turn's ReadableStream. */\nexport interface StreamRouter<TEvent> {\n /** Register a new stream for a turnId. Returns the ReadableStream the consumer reads from. */\n createStream(turnId: string): ReadableStream<TEvent>;\n /** Close the stream for a turnId. Returns true if a stream existed. */\n closeStream(turnId: string): boolean;\n /** Error the stream for a turnId. The consumer's reader will reject with the given error. Returns true if a stream existed. */\n errorStream(turnId: string, error: Ably.ErrorInfo): boolean;\n /** Enqueue an event to the correct stream. Returns true if routed successfully. */\n route(turnId: string, event: TEvent): boolean;\n /** Whether a specific turnId has an active stream. */\n has(turnId: string): boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CT14\nclass DefaultStreamRouter<TEvent> implements StreamRouter<TEvent> {\n private readonly _turns = new Map<string, TurnEntry<TEvent>>();\n private readonly _isTerminal: (event: TEvent) => boolean;\n private readonly _logger: Logger;\n\n constructor(isTerminal: (event: TEvent) => boolean, logger: Logger) {\n this._isTerminal = isTerminal;\n this._logger = logger;\n }\n\n createStream(turnId: string): ReadableStream<TEvent> {\n this._logger.trace('StreamRouter.createStream();', { turnId });\n\n // Build stream+controller together. ReadableStream's start() runs synchronously\n // per spec, so the controller is captured before the constructor returns.\n const entry: { controller?: ReadableStreamDefaultController<TEvent> } = {};\n const stream = new ReadableStream<TEvent>({\n start(controller) {\n entry.controller = controller;\n },\n });\n if (!entry.controller) {\n throw new Ably.ErrorInfo(\n 'unable to create stream; ReadableStream start() was not called synchronously',\n ErrorCode.TransportSubscriptionError,\n 500,\n );\n }\n this._turns.set(turnId, { controller: entry.controller, turnId });\n return stream;\n }\n\n // Spec: AIT-CT14b\n closeStream(turnId: string): boolean {\n const turn = this._turns.get(turnId);\n if (!turn) return false;\n\n this._logger.debug('StreamRouter.closeStream(); closing stream', { turnId });\n try {\n turn.controller.close();\n } catch {\n /* consumer cancelled the stream */\n }\n this._turns.delete(turnId);\n return true;\n }\n\n // Spec: AIT-CT14c\n errorStream(turnId: string, error: Ably.ErrorInfo): boolean {\n const turn = this._turns.get(turnId);\n if (!turn) return false;\n\n this._logger.debug('StreamRouter.errorStream(); erroring stream', { turnId });\n try {\n turn.controller.error(error);\n } catch {\n /* consumer cancelled the stream */\n }\n this._turns.delete(turnId);\n return true;\n }\n\n // Spec: AIT-CT14a\n route(turnId: string, event: TEvent): boolean {\n const turn = this._turns.get(turnId);\n if (!turn) return false;\n\n try {\n turn.controller.enqueue(event);\n } catch {\n this._turns.delete(turnId);\n return false;\n }\n\n if (this._isTerminal(event)) {\n this.closeStream(turnId);\n }\n return true;\n }\n\n has(turnId: string): boolean {\n return this._turns.has(turnId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a StreamRouter that routes decoded events to per-turn ReadableStreams.\n * @param isTerminal - Predicate that returns true for events that close the stream.\n * @param logger - Logger for diagnostic output.\n * @returns A new {@link StreamRouter} instance.\n */\nexport const createStreamRouter = <TEvent>(\n isTerminal: (event: TEvent) => boolean,\n logger: Logger,\n): StreamRouter<TEvent> => new DefaultStreamRouter(isTerminal, logger);\n","/**\n * Tree — materializes a branching conversation from a flat\n * oplog of Ably messages using serial-first ordering.\n *\n * Serial order (the total order assigned by Ably) is the primary mechanism\n * for linear message sequences. `x-ably-parent` and `x-ably-fork-of` headers\n * are only structurally meaningful at branch points — where the user is\n * interacting with a visible message and the client always has it loaded.\n *\n * `upsert()` is the sole mutation method. Messages can arrive in any order\n * (live subscription, history pages, seed data) and the tree produces the\n * correct `flattenNodes()` output once all messages are present.\n *\n * The tree owns conversation state. `flattenNodes()` returns the linear node\n * list for the currently selected branches — this is what the transport's\n * `getMessages()` delegates to.\n */\n\nimport type * as Ably from 'ably';\n\nimport { HEADER_FORK_OF, HEADER_PARENT } from '../../constants.js';\nimport { EventEmitter } from '../../event-emitter.js';\nimport type { Logger } from '../../logger.js';\nimport type { MessageNode, Tree, TurnLifecycleEvent } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Internal node type\n// ---------------------------------------------------------------------------\n\ninterface InternalNode<TMessage> {\n node: MessageNode<TMessage>;\n /** Insertion sequence — tiebreaker for null-serial messages. */\n insertSeq: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal interface — extended surface consumed by View\n// ---------------------------------------------------------------------------\n\n/** Internal tree surface used by View — not part of the public Tree API. */\nexport interface TreeInternal<TMessage> extends Tree<TMessage> {\n /**\n * Monotonic counter that increments on structural changes (node insert,\n * delete, serial promotion/reorder) but NOT on content-only updates\n * (existing node's message replaced). Allows the View to skip full\n * tree walks when only message content changed.\n */\n readonly structuralVersion: number;\n\n /**\n * Flatten the tree along selected branches into a linear node list.\n * The `selections` map provides the selected sibling's msgId at each\n * fork point, keyed by group root msgId. Fork points not present in\n * the map default to the latest sibling. If a selectedMsgId is not\n * found in the sibling group (stale/deleted), falls back to latest.\n */\n flattenNodes(selections: Map<string, string>): MessageNode<TMessage>[];\n\n /**\n * Get the \"group root\" msgId for a sibling group — the original message\n * that all forks in the group trace back to.\n */\n getGroupRoot(msgId: string): string;\n\n /**\n * Get the sibling group that `msgId` belongs to, as full MessageNode objects.\n * Allows callers to resolve index ↔ msgId without losing identity.\n */\n getSiblingNodes(msgId: string): MessageNode<TMessage>[];\n\n /** Forward a raw Ably message event to tree subscribers. */\n emitAblyMessage(msg: Ably.InboundMessage): void;\n /** Forward a turn lifecycle event to tree subscribers. */\n emitTurn(event: TurnLifecycleEvent): void;\n /** Register an active turn. */\n trackTurn(turnId: string, clientId: string): void;\n /** Unregister an active turn. */\n untrackTurn(turnId: string): void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/** EventEmitter events map for the tree. */\ninterface TreeEventsMap {\n update: undefined;\n 'ably-message': Ably.InboundMessage;\n turn: TurnLifecycleEvent;\n}\n\n// Spec: AIT-CT13\nexport class DefaultTree<TMessage> implements TreeInternal<TMessage> {\n /** All nodes indexed by msgId (x-ably-msg-id). */\n private readonly _nodeIndex = new Map<string, InternalNode<TMessage>>();\n\n /**\n * All nodes sorted by serial (lexicographic). Null-serial messages\n * (optimistic inserts, seed data) sort after all serial-bearing messages,\n * ordered among themselves by insertion sequence.\n */\n private readonly _sortedList: InternalNode<TMessage>[] = [];\n\n /**\n * Parent index: parentId to set of child msgIds.\n * Nodes with no parent are indexed under the key `null`.\n */\n private readonly _parentIndex = new Map<string | undefined, Set<string>>();\n\n private readonly _emitter: EventEmitter<TreeEventsMap>;\n private readonly _logger: Logger;\n\n /** Active turns: turnId → clientId. */\n private readonly _turnClientIds = new Map<string, string>();\n\n /** Monotonically increasing counter for insertion sequence. */\n private _seqCounter = 0;\n\n /** Incremented on structural changes; unchanged on content-only updates. */\n private _structuralVersion = 0;\n\n get structuralVersion(): number {\n return this._structuralVersion;\n }\n\n constructor(logger: Logger) {\n this._logger = logger;\n this._emitter = new EventEmitter<TreeEventsMap>(logger);\n }\n\n // -------------------------------------------------------------------------\n // Sorted list maintenance\n // -------------------------------------------------------------------------\n\n /**\n * Compare two nodes for sorted list ordering.\n * Serial-bearing nodes sort by serial (lexicographic).\n * Null-serial nodes sort after all serial-bearing nodes.\n * Among null-serial nodes, sort by insertion sequence.\n * @param a - First node to compare.\n * @param b - Second node to compare.\n * @returns Negative if a sorts before b, positive if after, zero if equal.\n */\n // Spec: AIT-CT13a\n private _compareNodes(a: InternalNode<TMessage>, b: InternalNode<TMessage>): number {\n const sa = a.node.serial;\n const sb = b.node.serial;\n if (sa === undefined && sb === undefined) return a.insertSeq - b.insertSeq;\n if (sa === undefined) return 1; // a sorts after serial-bearing b\n if (sb === undefined) return -1; // b sorts after serial-bearing a\n if (sa < sb) return -1;\n if (sa > sb) return 1;\n return a.insertSeq - b.insertSeq; // same serial: preserve insertion order\n }\n\n /**\n * Insert a node into sortedList at the correct position via binary search.\n * @param internal - The node to insert.\n */\n private _insertSorted(internal: InternalNode<TMessage>): void {\n const serial = internal.node.serial;\n\n // Fast path: null-serial always appends to end (among other null-serials)\n if (serial === undefined) {\n this._sortedList.push(internal);\n return;\n }\n\n // Binary search for insertion point among serial-bearing nodes.\n let lo = 0;\n let hi = this._sortedList.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const midNode = this._sortedList[mid];\n if (!midNode) break; // unreachable: mid is always in bounds\n if (this._compareNodes(midNode, internal) <= 0) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n this._sortedList.splice(lo, 0, internal);\n }\n\n /**\n * Remove a node from sortedList.\n * @param internal - The node to remove.\n */\n private _removeSorted(internal: InternalNode<TMessage>): void {\n const idx = this._sortedList.indexOf(internal);\n if (idx !== -1) this._sortedList.splice(idx, 1);\n }\n\n // -------------------------------------------------------------------------\n // Parent index maintenance\n // -------------------------------------------------------------------------\n\n private _addToParentIndex(parentId: string | undefined, msgId: string): void {\n let set = this._parentIndex.get(parentId);\n if (!set) {\n set = new Set();\n this._parentIndex.set(parentId, set);\n }\n set.add(msgId);\n }\n\n private _removeFromParentIndex(parentId: string | undefined, msgId: string): void {\n const set = this._parentIndex.get(parentId);\n if (set) {\n set.delete(msgId);\n if (set.size === 0) this._parentIndex.delete(parentId);\n }\n }\n\n // -------------------------------------------------------------------------\n // Sibling grouping\n // -------------------------------------------------------------------------\n\n /**\n * Get the sibling group that `msgId` belongs to.\n *\n * A sibling group is: the original message + all messages whose `forkOf`\n * points to the original (or transitively to a sibling). We find the\n * group root by following `forkOf` chains to the earliest ancestor that\n * has no `forkOf` (or whose `forkOf` target doesn't share the same parent).\n * @param msgId - The msg-id to look up the sibling group for.\n * @returns The ordered list of sibling nodes.\n */\n // Spec: AIT-CT13b\n private _getSiblingGroup(msgId: string): MessageNode<TMessage>[] {\n const entry = this._nodeIndex.get(msgId);\n if (!entry) return [];\n\n // Find the \"original\" — the message at the root of the fork chain\n // that shares the same parentId. Guard against cycles in forkOf chains.\n let original = entry.node;\n const visitedGroup = new Set<string>([original.msgId]);\n while (original.forkOf) {\n if (visitedGroup.has(original.forkOf)) break; // cycle guard\n const forkTarget = this._nodeIndex.get(original.forkOf);\n if (!forkTarget || forkTarget.node.parentId !== original.parentId) break;\n original = forkTarget.node;\n visitedGroup.add(original.msgId);\n }\n\n // Collect all siblings: nodes with the same parentId that either\n // ARE the original, or have a forkOf chain leading to the original.\n const parentId = original.parentId;\n const originalId = original.msgId;\n const siblings: InternalNode<TMessage>[] = [];\n\n const candidateIds = this._parentIndex.get(parentId);\n if (candidateIds) {\n for (const childId of candidateIds) {\n const childEntry = this._nodeIndex.get(childId);\n if (childEntry && this._isSiblingOf(childEntry.node, originalId)) {\n siblings.push(childEntry);\n }\n }\n }\n\n // Sort by Ably serial (lexicographic). Messages without a serial\n // (optimistic inserts before server relay) sort after all serial-bearing\n // siblings — they represent the user's most recent action.\n siblings.sort((a, b) => this._compareNodes(a, b));\n return siblings.map((s) => s.node);\n }\n\n /**\n * Check if `node` belongs to the sibling group rooted at `originalId`.\n * A node is a sibling if it IS the original or its forkOf chain leads\n * to the original (with the same parentId).\n * @param node - The node to check.\n * @param originalId - The group root to match against.\n * @returns True if the node belongs to the sibling group.\n */\n private _isSiblingOf(node: MessageNode<TMessage>, originalId: string): boolean {\n if (node.msgId === originalId) return true;\n let current = node;\n const visited = new Set<string>([current.msgId]);\n while (current.forkOf) {\n if (current.forkOf === originalId) return true;\n if (visited.has(current.forkOf)) break; // cycle guard\n const target = this._nodeIndex.get(current.forkOf);\n if (!target) break;\n current = target.node;\n visited.add(current.msgId);\n }\n return false;\n }\n\n /**\n * Get the \"group root\" msgId for a sibling group — the original message\n * that all forks trace back to.\n * @param msgId - Any msg-id in the sibling group.\n * @returns The msg-id of the group root.\n */\n getGroupRoot(msgId: string): string {\n const entry = this._nodeIndex.get(msgId);\n if (!entry) return msgId;\n\n let current = entry.node;\n const visited = new Set<string>([current.msgId]);\n while (current.forkOf) {\n if (visited.has(current.forkOf)) break; // cycle guard\n const forkTarget = this._nodeIndex.get(current.forkOf);\n if (!forkTarget || forkTarget.node.parentId !== current.parentId) break;\n current = forkTarget.node;\n visited.add(current.msgId);\n }\n return current.msgId;\n }\n\n // -------------------------------------------------------------------------\n // Public query methods\n // -------------------------------------------------------------------------\n\n flattenNodes(selections: Map<string, string>): MessageNode<TMessage>[] {\n this._logger.trace('DefaultTree.flattenNodes();');\n const result: MessageNode<TMessage>[] = [];\n const currentPath = new Set<string>();\n // Track which sibling groups we've already resolved to avoid\n // re-resolving for every member of the group.\n const resolvedGroups = new Map<string, string>(); // groupRootId → selected msgId\n\n for (const internal of this._sortedList) {\n const node = internal.node;\n const { msgId, parentId } = node;\n\n // Step 1: Check parent reachability.\n if (parentId !== undefined && !currentPath.has(parentId)) {\n continue;\n }\n\n // Step 2: Check sibling selection.\n const group = this._getSiblingGroup(msgId);\n if (group.length > 1) {\n const groupRootId = this.getGroupRoot(msgId);\n let selectedId = resolvedGroups.get(groupRootId);\n if (selectedId === undefined) {\n const preferredId = selections.get(groupRootId);\n // Verify the preferred msgId is in the group, otherwise default to latest\n if (preferredId && group.some((n) => n.msgId === preferredId)) {\n selectedId = preferredId;\n } else {\n const latest = group.at(-1);\n if (!latest) break; // unreachable: group.length > 1\n selectedId = latest.msgId;\n }\n resolvedGroups.set(groupRootId, selectedId);\n }\n if (msgId !== selectedId) {\n continue;\n }\n }\n\n currentPath.add(msgId);\n result.push(node);\n }\n\n return result;\n }\n\n getSiblings(msgId: string): TMessage[] {\n this._logger.trace('DefaultTree.getSiblings();', { msgId });\n return this._getSiblingGroup(msgId).map((n) => n.message);\n }\n\n getSiblingNodes(msgId: string): MessageNode<TMessage>[] {\n return this._getSiblingGroup(msgId);\n }\n\n hasSiblings(msgId: string): boolean {\n return this._getSiblingGroup(msgId).length > 1;\n }\n\n getNode(msgId: string): MessageNode<TMessage> | undefined {\n this._logger.trace('DefaultTree.getNode();', { msgId });\n return this._nodeIndex.get(msgId)?.node;\n }\n\n getHeaders(msgId: string): Record<string, string> | undefined {\n this._logger.trace('DefaultTree.getHeaders();', { msgId });\n return this._nodeIndex.get(msgId)?.node.headers;\n }\n\n // -------------------------------------------------------------------------\n // Mutation\n // -------------------------------------------------------------------------\n\n upsert(msgId: string, message: TMessage, headers: Record<string, string>, serial?: string): void {\n const parentId = headers[HEADER_PARENT] ?? undefined;\n const forkOf = headers[HEADER_FORK_OF] ?? undefined;\n\n const existing = this._nodeIndex.get(msgId);\n if (existing) {\n // Update in place — message content may have changed (e.g. streaming).\n // Only update headers if the new headers are non-empty (prevents\n // streaming updates from erasing canonical headers).\n existing.node.message = message;\n if (Object.keys(headers).length > 0) {\n existing.node.headers = { ...headers };\n }\n // Spec: AIT-CT13d\n // Promote serial: optimistic (null) → server-assigned on relay.\n if (serial && !existing.node.serial) {\n this._logger.debug('Tree.upsert(); promoting serial', { msgId, serial });\n existing.node.serial = serial;\n // Re-sort: remove from current position, re-insert at correct position.\n this._removeSorted(existing);\n this._insertSorted(existing);\n this._structuralVersion++;\n }\n this._emitter.emit('update');\n return;\n }\n\n this._logger.trace('Tree.upsert(); inserting new node', { msgId, parentId, forkOf });\n\n const node: MessageNode<TMessage> = {\n kind: 'message',\n message,\n msgId,\n parentId,\n forkOf,\n headers: { ...headers },\n serial,\n };\n\n const internal: InternalNode<TMessage> = { node, insertSeq: this._seqCounter++ };\n this._nodeIndex.set(msgId, internal);\n this._addToParentIndex(parentId, msgId);\n this._insertSorted(internal);\n this._structuralVersion++;\n this._emitter.emit('update');\n }\n\n delete(msgId: string): void {\n const entry = this._nodeIndex.get(msgId);\n if (!entry) return;\n\n this._logger.debug('Tree.delete();', { msgId });\n\n const { node } = entry;\n\n // Remove from parent index\n this._removeFromParentIndex(node.parentId, msgId);\n\n // Remove from sorted list\n this._removeSorted(entry);\n\n // Remove from primary index\n this._nodeIndex.delete(msgId);\n\n // Children are NOT deleted — they become unreachable in flattenNodes()\n // because their parent is no longer on the active path.\n this._structuralVersion++;\n this._emitter.emit('update');\n }\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CT17\n getActiveTurnIds(): Map<string, Set<string>> {\n this._logger.trace('DefaultTree.getActiveTurnIds();');\n const result = new Map<string, Set<string>>();\n for (const [turnId, clientId] of this._turnClientIds) {\n let set = result.get(clientId);\n if (!set) {\n set = new Set<string>();\n result.set(clientId, set);\n }\n set.add(turnId);\n }\n return result;\n }\n\n // Spec: AIT-CT8b, AIT-CT8e\n on(event: 'update', handler: () => void): () => void;\n on(event: 'ably-message', handler: (msg: Ably.InboundMessage) => void): () => void;\n on(event: 'turn', handler: (event: TurnLifecycleEvent) => void): () => void;\n on(\n event: 'update' | 'ably-message' | 'turn',\n handler: (() => void) | ((msg: Ably.InboundMessage) => void) | ((event: TurnLifecycleEvent) => void),\n ): () => void {\n // CAST: overload signatures enforce correct handler types per event name.\n const cb = handler as (arg: TreeEventsMap[keyof TreeEventsMap]) => void;\n this._emitter.on(event, cb);\n return () => {\n this._emitter.off(event, cb);\n };\n }\n\n // -------------------------------------------------------------------------\n // Internal methods (called by the transport, not part of Tree interface)\n // -------------------------------------------------------------------------\n\n /**\n * Forward a raw Ably message event to tree subscribers.\n * @param msg - The raw Ably message to emit.\n */\n emitAblyMessage(msg: Ably.InboundMessage): void {\n this._logger.trace('DefaultTree.emitAblyMessage();');\n this._emitter.emit('ably-message', msg);\n }\n\n /**\n * Forward a turn lifecycle event to tree subscribers.\n * @param event - The turn lifecycle event to emit.\n */\n emitTurn(event: TurnLifecycleEvent): void {\n this._logger.trace('DefaultTree.emitTurn();', { turnId: event.turnId });\n this._emitter.emit('turn', event);\n }\n\n /**\n * Register an active turn.\n * @param turnId - The turn's unique identifier.\n * @param clientId - The client that owns the turn.\n */\n trackTurn(turnId: string, clientId: string): void {\n this._logger.trace('DefaultTree.trackTurn();', { turnId, clientId });\n this._turnClientIds.set(turnId, clientId);\n }\n\n /**\n * Unregister an active turn.\n * @param turnId - The turn to untrack.\n */\n untrackTurn(turnId: string): void {\n this._logger.trace('DefaultTree.untrackTurn();', { turnId });\n this._turnClientIds.delete(turnId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Tree that materializes branching history from a flat oplog.\n * @param logger - Logger for diagnostic output.\n * @returns A new {@link DefaultTree} instance. The transport uses DefaultTree\n * directly for internal methods (emitAblyMessage, emitTurn, trackTurn, untrackTurn).\n * Public consumers see the narrower {@link Tree} interface.\n */\nexport const createTree = <TMessage>(logger: Logger): DefaultTree<TMessage> => new DefaultTree(logger);\n","/**\n * decodeHistory — load conversation history from an Ably channel and\n * return decoded messages as a paginated HistoryPage result.\n *\n * Uses a fresh decoder (not shared with the live subscription) to avoid\n * state conflicts. Per-turn accumulators handle interleaved turns correctly.\n *\n * The `limit` option controls the number of **messages** returned,\n * not the number of Ably wire messages fetched. The implementation pages\n * back through Ably history until `limit` complete messages have\n * been assembled. Partial turns (incomplete at the page boundary) are\n * buffered internally and completed when `next()` fetches more pages.\n *\n * Only completed messages appear in `items`. A message is complete when\n * its terminal event (finish/abort/error) has been received.\n *\n * Because Ably history returns newest-first while the decoder requires\n * chronological order, all collected Ably messages are re-decoded from\n * oldest to newest at the point a result is built. This handles turns\n * that span page boundaries correctly. The fetch loop uses a cheap\n * header-based completion counter to decide when to stop paging, so the\n * full decode runs exactly once per traversal regardless of page count.\n */\n\nimport type * as Ably from 'ably';\n\nimport {\n HEADER_AMEND,\n HEADER_DISCRETE,\n HEADER_MSG_ID,\n HEADER_STATUS,\n HEADER_STREAM,\n HEADER_TURN_ID,\n} from '../../constants.js';\nimport type { Logger } from '../../logger.js';\nimport { getHeaders } from '../../utils.js';\nimport type { Codec, DecoderOutput, MessageAccumulator } from '../codec/types.js';\nimport type { HistoryPage, LoadHistoryOptions } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Shared state across pages within one history traversal\n// ---------------------------------------------------------------------------\n\ninterface HistoryState<TEvent, TMessage> {\n codec: Codec<TEvent, TMessage>;\n /** All raw Ably messages collected so far, in newest-first order (as received from Ably). */\n rawMessages: Ably.InboundMessage[];\n /** How many completed messages have been returned to the consumer so far. */\n returnedCount: number;\n /** How many raw Ably messages have been returned to the consumer so far. */\n returnedRawCount: number;\n /** The last Ably page cursor for continued pagination. */\n lastAblyPage: Ably.PaginatedResult<Ably.InboundMessage> | undefined;\n /**\n * Cached result of the last {@link decodeAll} call, reused while\n * `rawMessages` is unchanged. Invalidated implicitly by comparing\n * {@link cachedAtRawLength} against `rawMessages.length`; `rawMessages`\n * is append-only within a traversal so length is a sufficient key.\n */\n cachedDecode: DecodedItem<TMessage>[] | undefined;\n /** `rawMessages.length` at the time {@link cachedDecode} was produced. */\n cachedAtRawLength: number;\n /**\n * `x-ably-msg-id`s for which the decoder has something to produce output\n * from: any `message.create` / `message.update` / `message.append` with\n * `x-ably-stream: \"true\"` (establishes a tracker via create or\n * first-contact), or a `message.create` carrying `x-ably-discrete` (a\n * discrete message, created and terminated in one wire message).\n */\n startedMsgIds: Set<string>;\n /**\n * `x-ably-msg-id`s with a terminal wire signal: either `x-ably-discrete`\n * on a `message.create` (discrete message) or `x-ably-status: \"finished\"`\n * / `\"aborted\"` on any action (closed stream).\n */\n terminatedMsgIds: Set<string>;\n /**\n * `x-ably-msg-id`s that are both started AND terminated - ready to appear\n * in the decoded output. The fetch loop reads this set's size to decide\n * when to stop paging, avoiding a full decode per page. Maintained\n * incrementally by {@link countNewCompletions}. Grows monotonically.\n */\n completedMsgIds: Set<string>;\n logger: Logger;\n}\n\n/** A completed message paired with its canonical wire headers and serial. */\ninterface DecodedItem<TMessage> {\n message: TMessage;\n headers: Record<string, string>;\n /** Ably serial from the first Ably message for this domain message. */\n serial: string;\n}\n\n// ---------------------------------------------------------------------------\n// Decode all collected messages from scratch (chronological order)\n// ---------------------------------------------------------------------------\n\n/**\n * Re-decode all collected raw messages into completed domain messages.\n * @param state - The shared history traversal state.\n * @returns Completed messages in newest-first order.\n */\nconst decodeAll = <TEvent, TMessage>(state: HistoryState<TEvent, TMessage>): DecodedItem<TMessage>[] => {\n // Reverse to chronological (oldest first)\n const chronological = [...state.rawMessages].toReversed();\n\n // Fresh decoder and per-turn accumulators for each full re-decode.\n const decoder = state.codec.createDecoder();\n const turns = new Map<\n string,\n {\n accumulator: MessageAccumulator<TEvent, TMessage>;\n firstSeen: number;\n /** Headers from the first Ably message per x-ably-msg-id within this turn. */\n msgHeaders: Map<string, Record<string, string>>;\n /** Ably serial from the first Ably message per x-ably-msg-id within this turn. */\n msgSerials: Map<string, string>;\n }\n >();\n const defaultAccumulator = state.codec.createAccumulator();\n let orderCounter = 0;\n\n // Headers and serials for non-turn discrete messages, keyed by x-ably-msg-id.\n const discreteHeaders = new Map<string, Record<string, string>>();\n const discreteSerials = new Map<string, string>();\n // Track which msgId produced each non-turn discrete message output (in order).\n const discreteMsgIds: string[] = [];\n\n // Cross-turn event targets to complete after all events are processed.\n // Deferred so that finish/abort events that follow the update in serial\n // order can still process on the active message (e.g. applying messageMetadata).\n const deferredCompletions: { accumulator: MessageAccumulator<TEvent, TMessage>; messageId: string }[] = [];\n\n for (const msg of chronological) {\n const outputs: DecoderOutput<TEvent, TMessage>[] = decoder.decode(msg);\n const headers = getHeaders(msg);\n const turnId = headers[HEADER_TURN_ID];\n const msgId = headers[HEADER_MSG_ID];\n const serial = msg.serial;\n const amendTarget = headers[HEADER_AMEND];\n\n // Cross-turn events target an existing message from a different turn.\n // Route to the owning turn's accumulator via initMessage lifecycle.\n if (amendTarget) {\n for (const turn of turns.values()) {\n if (turn.msgHeaders.has(amendTarget)) {\n const headerKeys = [...turn.msgHeaders.keys()];\n const msgIndex = headerKeys.indexOf(amendTarget);\n const currentMsg = msgIndex === -1 ? undefined : turn.accumulator.messages[msgIndex];\n if (currentMsg) {\n turn.accumulator.initMessage(amendTarget, currentMsg);\n }\n turn.accumulator.processOutputs(outputs);\n deferredCompletions.push({ accumulator: turn.accumulator, messageId: amendTarget });\n break;\n }\n }\n continue;\n }\n\n if (turnId) {\n let turn = turns.get(turnId);\n if (!turn) {\n turn = {\n accumulator: state.codec.createAccumulator(),\n firstSeen: orderCounter++,\n msgHeaders: new Map(),\n msgSerials: new Map(),\n };\n turns.set(turnId, turn);\n }\n // Capture headers per msg-id within this turn. Update on later\n // messages too (e.g. closing append overrides status from\n // \"streaming\" to \"finished\"/\"aborted\"). Only merge when the\n // incoming message has non-empty headers.\n if (msgId) {\n const existing = turn.msgHeaders.get(msgId);\n if (!existing) {\n turn.msgHeaders.set(msgId, { ...headers });\n if (serial) turn.msgSerials.set(msgId, serial);\n } else if (Object.keys(headers).length > 0) {\n Object.assign(existing, headers);\n }\n }\n turn.accumulator.processOutputs(outputs);\n } else {\n defaultAccumulator.processOutputs(outputs);\n\n // Capture headers and serial for non-turn discrete messages by x-ably-msg-id.\n for (const output of outputs) {\n if (output.kind === 'message' && msgId) {\n discreteMsgIds.push(msgId);\n const existingDiscrete = discreteHeaders.get(msgId);\n if (!existingDiscrete) {\n discreteHeaders.set(msgId, { ...headers });\n if (serial) discreteSerials.set(msgId, serial);\n } else if (Object.keys(headers).length > 0) {\n Object.assign(existingDiscrete, headers);\n }\n }\n }\n }\n }\n\n // Complete any messages that were re-activated for cross-turn updates.\n // Idempotent — if finish already removed the message from active tracking,\n // completeMessage is a no-op.\n for (const { accumulator, messageId } of deferredCompletions) {\n accumulator.completeMessage(messageId);\n }\n\n // Collect completed messages in chronological order (oldest first) by turn.\n const completed: DecodedItem<TMessage>[] = [];\n\n // Default accumulator messages: pair with their discrete headers by position.\n for (const [i, msg] of defaultAccumulator.completedMessages.entries()) {\n const mid = discreteMsgIds[i];\n completed.push({\n message: msg,\n headers: mid ? (discreteHeaders.get(mid) ?? {}) : {},\n serial: mid ? (discreteSerials.get(mid) ?? '') : '',\n });\n }\n\n const sorted = [...turns.values()].toSorted((a, b) => a.firstSeen - b.firstSeen);\n for (const turn of sorted) {\n // Assign headers and serials to each completed message in this turn.\n // The turn's msgHeaders map is keyed by x-ably-msg-id and ordered by\n // first-seen. Completed messages are matched positionally.\n const headerEntries = [...turn.msgHeaders.entries()];\n let headerIdx = 0;\n\n for (const msg of turn.accumulator.completedMessages) {\n const entry = headerEntries[headerIdx];\n if (entry) {\n const [mid, hdrs] = entry;\n completed.push({\n message: msg,\n headers: hdrs,\n serial: turn.msgSerials.get(mid) ?? '',\n });\n headerIdx++;\n } else {\n completed.push({ message: msg, headers: {}, serial: '' });\n }\n }\n }\n\n // Reverse to newest-first. The consumer slices from the front for the\n // most recent page, and progressively deeper for older pages.\n return completed.toReversed();\n};\n\n/**\n * Cached wrapper around {@link decodeAll}. Returns the previous result when\n * `rawMessages` hasn't changed since the last decode; otherwise re-decodes\n * and updates the cache. The cache key is `rawMessages.length` because\n * `rawMessages` is append-only within a traversal.\n * @param state - The shared history traversal state.\n * @returns Completed messages in newest-first order.\n */\nconst decodeAllCached = <TEvent, TMessage>(state: HistoryState<TEvent, TMessage>): DecodedItem<TMessage>[] => {\n if (state.cachedDecode && state.cachedAtRawLength === state.rawMessages.length) {\n return state.cachedDecode;\n }\n const result = decodeAll(state);\n state.cachedDecode = result;\n state.cachedAtRawLength = state.rawMessages.length;\n return result;\n};\n\n// ---------------------------------------------------------------------------\n// Incremental completion counting (avoids full decode inside the fetch loop)\n// ---------------------------------------------------------------------------\n\n/**\n * Scan newly-added raw messages and track which `x-ably-msg-id`s have\n * become complete. Used by {@link fetchUntilLimit} to decide when enough\n * completed messages have been collected, without running the decoder.\n *\n * A msg-id is considered complete only when BOTH of these have been seen:\n * - a \"start\" signal: either `x-ably-discrete` on a `message.create`\n * (discrete messages are created and terminated by the same wire\n * message), OR any `message.create` / `message.update` / `message.append`\n * with `x-ably-stream: \"true\"` (the decoder establishes a tracker via\n * create or first-contact).\n * - a \"terminal\" signal: `x-ably-discrete` on the create, or\n * `x-ably-status: \"finished\"` / `\"aborted\"` on any later action.\n *\n * Why update and append count as starts: Ably history can compact a live\n * `create + append + ... + append{status:finished}` sequence into a single\n * `message.update` with `STREAM=true` and `STATUS=finished`. The decoder\n * handles that in {@link _decodeUpdate} via first-contact. Counting only\n * `message.create` as a start would cause the fetch loop to page past a\n * compacted turn without ever marking it complete.\n *\n * Requiring both halves matters when a streaming turn spans a page\n * boundary: the terminal arrives in the newer page (fetched first) while\n * the start sits in an older page. Counting the terminal alone would stop\n * the fetch loop prematurely - the decoder would have no stream state to\n * resolve, and the message wouldn't make it into the result.\n *\n * Messages skipped for counting:\n * - Missing `x-ably-msg-id`: lifecycle events not tied to a domain message.\n * - `x-ably-amend` set: amendments target an existing message, not a new\n * completion.\n * - `message.delete`: clears the tracker, doesn't produce output.\n *\n * Known edge case: if Ably history is truncated and a terminal survives\n * while every start signal for its msg-id has rolled off, the counter will\n * never mark that `msg-id` complete. The loop keeps fetching until it runs\n * out of pages, then returns whatever the decoder actually produced.\n * Matches the existing behaviour for the same truncation scenario.\n * @param state - The shared history traversal state.\n * @param newMessages - The Ably messages just pushed onto `state.rawMessages`.\n */\nconst countNewCompletions = <TEvent, TMessage>(\n state: HistoryState<TEvent, TMessage>,\n newMessages: readonly Ably.InboundMessage[],\n): void => {\n for (const msg of newMessages) {\n const headers = getHeaders(msg);\n const msgId = headers[HEADER_MSG_ID];\n if (!msgId) continue;\n // Amendments target an existing message, not a new completion.\n // Defensive: no current encoder path produces an amendment carrying\n // HEADER_STREAM=true, HEADER_STATUS, or HEADER_DISCRETE.\n if (headers[HEADER_AMEND]) continue;\n\n const action = msg.action;\n const isDiscreteCreate = action === 'message.create' && HEADER_DISCRETE in headers;\n // Any content-producing action on a streamed serial counts as a start:\n // the decoder uses create or first-contact (update/append) to establish\n // its tracker. Delete clears tracker state and emits nothing, so it\n // never counts as a start.\n const hasStreamContent =\n headers[HEADER_STREAM] === 'true' &&\n (action === 'message.create' || action === 'message.update' || action === 'message.append');\n const status = headers[HEADER_STATUS];\n const isTerminal = status === 'finished' || status === 'aborted';\n\n if (isDiscreteCreate || hasStreamContent) state.startedMsgIds.add(msgId);\n if (isDiscreteCreate || isTerminal) state.terminatedMsgIds.add(msgId);\n if (state.startedMsgIds.has(msgId) && state.terminatedMsgIds.has(msgId)) {\n state.completedMsgIds.add(msgId);\n }\n }\n};\n\n// ---------------------------------------------------------------------------\n// Fetch Ably pages until we have enough completed messages\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch Ably history pages until we have enough completed messages.\n *\n * The loop uses {@link countNewCompletions} to decide when to stop -\n * a cheap O(new messages) header scan - rather than running the full\n * decoder per page. The decoder runs exactly once later, in\n * {@link buildResult}, against the fully-collected `rawMessages`.\n * @param state - The shared history traversal state.\n * @param ablyPage - The current Ably paginated result to start from.\n * @param limit - Target number of completed messages beyond what has already been returned.\n */\nconst fetchUntilLimit = async <TEvent, TMessage>(\n state: HistoryState<TEvent, TMessage>,\n ablyPage: Ably.PaginatedResult<Ably.InboundMessage>,\n limit: number,\n): Promise<void> => {\n state.rawMessages.push(...ablyPage.items);\n state.lastAblyPage = ablyPage;\n countNewCompletions(state, ablyPage.items);\n\n const target = state.returnedCount + limit;\n while (state.completedMsgIds.size < target && ablyPage.hasNext()) {\n state.logger.debug('decodeHistory.fetchUntilLimit(); fetching next page', {\n collected: state.rawMessages.length,\n completed: state.completedMsgIds.size,\n });\n const nextPage = await ablyPage.next();\n if (!nextPage) break;\n ablyPage = nextPage;\n state.rawMessages.push(...nextPage.items);\n state.lastAblyPage = nextPage;\n countNewCompletions(state, nextPage.items);\n }\n};\n\n// ---------------------------------------------------------------------------\n// Build HistoryPage result from current state\n// ---------------------------------------------------------------------------\n\n/**\n * Build a HistoryPage from the current decode state.\n * @param state - The shared history traversal state.\n * @param limit - Max messages per page.\n * @returns A page of decoded history with a `next()` cursor.\n */\nconst buildResult = <TEvent, TMessage>(state: HistoryState<TEvent, TMessage>, limit: number): HistoryPage<TMessage> => {\n // allCompleted is newest-first. Slice from returnedCount for this page,\n // then reverse to chronological for display.\n const allCompleted = decodeAllCached(state);\n\n const pageSlice = allCompleted.slice(state.returnedCount, state.returnedCount + limit);\n const chronSlice = [...pageSlice].toReversed();\n state.returnedCount += pageSlice.length;\n\n const moreCompleted = allCompleted.length > state.returnedCount;\n const moreAblyPages = state.lastAblyPage?.hasNext() ?? false;\n\n // Raw Ably messages for this page in chronological order.\n const newRawCount = state.rawMessages.length - state.returnedRawCount;\n const rawSlice = newRawCount > 0 ? state.rawMessages.slice(state.returnedRawCount).toReversed() : [];\n state.returnedRawCount = state.rawMessages.length;\n\n return {\n items: chronSlice.map((d) => ({ message: d.message, headers: d.headers, serial: d.serial })),\n rawMessages: rawSlice,\n hasNext: () => moreCompleted || moreAblyPages,\n next: async () => {\n if (moreCompleted) {\n return buildResult(state, limit);\n }\n if (!moreAblyPages || !state.lastAblyPage) return;\n const nextAbly = await state.lastAblyPage.next();\n if (!nextAbly) return;\n await fetchUntilLimit(state, nextAbly, limit);\n return buildResult(state, limit);\n },\n };\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Load conversation history from a channel and return decoded messages.\n *\n * Attaches the channel if not already attached, then calls\n * `channel.history({ untilAttach: true })` to guarantee no gap between\n * historical and live messages. The attach is idempotent.\n *\n * The `limit` option controls the number of complete messages\n * returned per page, not the number of Ably wire messages fetched.\n * @param channel - The Ably channel to load history from.\n * @param codec - The codec for decoding wire messages into domain messages.\n * @param options - Pagination options.\n * @param logger - Logger for diagnostic output.\n * @returns The first page of decoded history.\n */\n// Spec: AIT-CT11, AIT-CT11b\nexport const decodeHistory = async <TEvent, TMessage>(\n channel: Ably.RealtimeChannel,\n codec: Codec<TEvent, TMessage>,\n options: LoadHistoryOptions | undefined,\n logger: Logger,\n): Promise<HistoryPage<TMessage>> => {\n const limit = options?.limit ?? 100;\n const state: HistoryState<TEvent, TMessage> = {\n codec,\n rawMessages: [],\n returnedCount: 0,\n returnedRawCount: 0,\n lastAblyPage: undefined,\n cachedDecode: undefined,\n cachedAtRawLength: 0,\n startedMsgIds: new Set<string>(),\n terminatedMsgIds: new Set<string>(),\n completedMsgIds: new Set<string>(),\n logger,\n };\n\n logger.trace('decodeHistory();', { limit });\n\n // Request more Ably messages than the domain limit to account for\n // the many-to-one ratio (multiple wire messages per message).\n const wireLimit = limit * 10;\n\n await channel.attach();\n const ablyPage = await channel.history({ untilAttach: true, limit: wireLimit });\n await fetchUntilLimit(state, ablyPage, limit);\n return buildResult(state, limit);\n};\n","/**\n * DefaultView — a paginated, branch-aware projection over the Tree.\n *\n * Wraps a Tree and manages a pagination window that controls which nodes\n * are visible to the UI. New live messages appear immediately; older messages\n * are revealed progressively via `loadOlder()`.\n *\n * Each View owns its own branch selection state and pagination window,\n * allowing multiple independent Views over the same Tree.\n *\n * Events are scoped to the visible window — 'update' only fires when the\n * visible output changes, 'ably-message' only for messages corresponding to\n * visible nodes, and 'turn' only for turns with visible messages.\n */\n\nimport * as Ably from 'ably';\n\nimport { EVENT_TURN_END, EVENT_TURN_START, HEADER_MSG_ID, HEADER_TURN_ID } from '../../constants.js';\nimport { ErrorCode } from '../../errors.js';\nimport { EventEmitter } from '../../event-emitter.js';\nimport type { Logger } from '../../logger.js';\nimport { getHeaders } from '../../utils.js';\nimport type { Codec } from '../codec/types.js';\nimport { decodeHistory } from './decode-history.js';\nimport type { TreeInternal } from './tree.js';\nimport type {\n ActiveTurn,\n EventsNode,\n HistoryPage,\n MessageNode,\n SendOptions,\n TurnLifecycleEvent,\n View,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Events map\n// ---------------------------------------------------------------------------\n\ninterface ViewEventsMap {\n update: undefined;\n 'ably-message': Ably.InboundMessage;\n turn: TurnLifecycleEvent;\n}\n\n// ---------------------------------------------------------------------------\n// Send delegate\n// ---------------------------------------------------------------------------\n\n/**\n * Internal delegate function provided by the transport for executing sends.\n * The View pre-computes the visible branch history and passes it directly,\n * so the delegate has no back-reference to the View.\n * When `eventNodes` is provided, the transport includes them in the POST body\n * for the server to publish as cross-turn events.\n */\nexport type SendDelegate<TEvent, TMessage> = (\n input: TMessage | TMessage[],\n options: SendOptions | undefined,\n history: MessageNode<TMessage>[],\n eventNodes?: EventsNode<TEvent>[],\n) => Promise<ActiveTurn<TEvent>>;\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/** Options for creating a View. */\nexport interface ViewOptions<TEvent, TMessage> {\n /** The tree to project. */\n tree: TreeInternal<TMessage>;\n /** The Ably channel to load history from. */\n channel: Ably.RealtimeChannel;\n /** The codec for decoding history messages. */\n codec: Codec<TEvent, TMessage>;\n /** Delegate for executing sends through the transport. */\n sendDelegate: SendDelegate<TEvent, TMessage>;\n /** Logger for diagnostic output. */\n logger: Logger;\n /** Called when the view is closed, allowing the owner to clean up references. */\n onClose?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Branch selection\n// ---------------------------------------------------------------------------\n\n/**\n * Tagged union representing why a branch was selected.\n * Stored per group root in the View's `_branchSelections` map.\n */\ntype BranchSelection =\n /** Explicit navigation via `select()`. */\n | { kind: 'user'; selectedId: string }\n /** This view initiated a fork (edit or regenerate) — auto-selected the result. */\n | { kind: 'auto'; selectedId: string }\n /** An external fork appeared — pinned to the currently-visible sibling to prevent drift. */\n | { kind: 'pinned'; selectedId: string }\n /** This view's `regenerate()` is in flight — select newest when turn's response arrives. */\n | { kind: 'pending'; turnId: string };\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport class DefaultView<TEvent, TMessage> implements View<TEvent, TMessage> {\n private readonly _tree: TreeInternal<TMessage>;\n private readonly _channel: Ably.RealtimeChannel;\n private readonly _codec: Codec<TEvent, TMessage>;\n private readonly _sendDelegate: SendDelegate<TEvent, TMessage>;\n private readonly _logger: Logger;\n private readonly _emitter: EventEmitter<ViewEventsMap>;\n private readonly _onClose?: () => void;\n\n /**\n * View-local branch selections: group root msgId → selection intent.\n * Fork points not present here default to the latest sibling.\n * Replaces the previous numeric-index _selections and _pendingForkSelections\n * with a single tagged-union map that carries the selected msgId (not index)\n * and the reason for the selection.\n */\n private readonly _branchSelections = new Map<string, BranchSelection>();\n\n /** Spec: AIT-CT11c — msg-ids loaded from history but not yet revealed to the UI. */\n private readonly _withheldMsgIds = new Set<string>();\n\n /** Snapshot of visible msgIds — used to detect structural changes and for selection pinning. */\n private _lastVisibleIds: string[] = [];\n\n /** Snapshot of visible message references — used to detect in-place content updates (streaming). */\n private _lastVisibleMessages: TMessage[] = [];\n\n /** Cached set of turn IDs present on the visible branch — avoids recomputing flattenNodes() on turn events. */\n private _lastVisibleTurnIds = new Set<string>();\n\n /** Whether there are more history pages to fetch from the channel. */\n private _hasMoreHistory = false;\n\n /** Internal state for continuing history pagination. */\n private _lastHistoryPage: HistoryPage<TMessage> | undefined;\n\n /** Buffer of withheld nodes, drained newest-first by successive loadOlder() calls. */\n private readonly _withheldBuffer: MessageNode<TMessage>[] = [];\n\n /** Unsubscribe functions for tree event subscriptions. */\n private readonly _unsubs: (() => void)[] = [];\n\n /**\n * Cached result of the last flattenNodes computation. Public `flattenNodes()`\n * returns this in O(1); internal callers use `_computeFlatNodes()` when a\n * fresh tree walk is needed (structural changes, selection changes, history reveal).\n */\n private _cachedNodes: MessageNode<TMessage>[] = [];\n\n /** Last seen tree structural version - used to distinguish content-only from structural updates. */\n private _lastStructuralVersion = -1;\n\n private _loadingOlder = false;\n private _processingHistory = false;\n private _closed = false;\n\n constructor(options: ViewOptions<TEvent, TMessage>) {\n this._tree = options.tree;\n this._channel = options.channel;\n this._codec = options.codec;\n this._sendDelegate = options.sendDelegate;\n this._onClose = options.onClose;\n this._logger = options.logger.withContext({ component: 'View' });\n this._logger.trace('DefaultView();');\n this._emitter = new EventEmitter<ViewEventsMap>(this._logger);\n\n // Compute initial cache and snapshot visible state\n this._cachedNodes = this._computeFlatNodes();\n this._lastStructuralVersion = this._tree.structuralVersion;\n this._updateVisibleSnapshot(this._cachedNodes);\n\n // Subscribe to tree events and re-emit scoped versions\n this._unsubs.push(\n this._tree.on('update', () => {\n this._onTreeUpdate();\n }),\n this._tree.on('ably-message', (msg) => {\n this._onTreeAblyMessage(msg);\n }),\n this._tree.on('turn', (event) => {\n this._onTreeTurn(event);\n }),\n );\n }\n\n // -------------------------------------------------------------------------\n // Public query methods\n // -------------------------------------------------------------------------\n\n getMessages(): TMessage[] {\n return this.flattenNodes().map((n) => n.message);\n }\n\n // Spec: AIT-CT9, AIT-CT11c\n flattenNodes(): MessageNode<TMessage>[] {\n return this._cachedNodes;\n }\n\n /**\n * Walk the tree and compute a fresh visible node list, applying branch\n * selections and withheld-message filtering. Use this instead of the\n * public `flattenNodes()` when the cache may be stale (structural\n * changes, selection changes, history reveal).\n * @returns A fresh array of visible nodes.\n */\n private _computeFlatNodes(): MessageNode<TMessage>[] {\n const nodes = this._tree.flattenNodes(this._resolveSelections());\n if (this._withheldMsgIds.size === 0) return nodes;\n return nodes.filter((n) => !this._withheldMsgIds.has(n.msgId));\n }\n\n hasOlder(): boolean {\n return this._withheldBuffer.length > 0 || this._hasMoreHistory;\n }\n\n async loadOlder(limit = 100): Promise<void> {\n if (this._closed || this._loadingOlder) return;\n this._loadingOlder = true;\n this._logger.trace('DefaultView.loadOlder();', { limit });\n\n try {\n // Drain withheld buffer first (older messages, released newest-first)\n if (this._withheldBuffer.length > 0) {\n const batch = this._withheldBuffer.splice(-limit, limit);\n this._releaseWithheld(batch);\n return;\n }\n\n // Buffer exhausted — load from channel history\n if (!this._hasMoreHistory && !this._lastHistoryPage) {\n // First load\n await this._loadFirstPage(limit);\n return;\n }\n\n if (!this._hasMoreHistory) return;\n\n // Continue from last page\n if (!this._lastHistoryPage?.hasNext()) {\n this._hasMoreHistory = false;\n return;\n }\n\n const nextPage = await this._lastHistoryPage.next();\n // Re-check: close() may be called during the await from another call stack\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- close() may be called during await\n if (this._closed || !nextPage) {\n if (!nextPage) this._hasMoreHistory = false;\n return;\n }\n\n await this._loadAndReveal(nextPage, limit);\n } catch (error) {\n this._logger.error('DefaultView.loadOlder(); failed', { error });\n throw error;\n } finally {\n this._loadingOlder = false;\n }\n }\n\n // -------------------------------------------------------------------------\n // Branch navigation\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CT13c\n select(msgId: string, index: number): void {\n this._logger.trace('DefaultView.select();', { msgId, index });\n const nodes = this._tree.getSiblingNodes(msgId);\n if (nodes.length <= 1) return;\n const groupRootId = this._tree.getGroupRoot(msgId);\n const clamped = Math.max(0, Math.min(index, nodes.length - 1));\n const selected = nodes[clamped];\n if (!selected) return; // unreachable: clamped is always in bounds\n this._branchSelections.set(groupRootId, { kind: 'user', selectedId: selected.msgId });\n this._logger.debug('DefaultView.select();', { msgId, index: clamped, selectedId: selected.msgId });\n this._cachedNodes = this._computeFlatNodes();\n this._updateVisibleSnapshot(this._cachedNodes);\n this._emitter.emit('update');\n }\n\n getSelectedIndex(msgId: string): number {\n this._logger.trace('DefaultView.getSelectedIndex();', { msgId });\n const nodes = this._tree.getSiblingNodes(msgId);\n if (nodes.length <= 1) return 0;\n const groupRootId = this._tree.getGroupRoot(msgId);\n const sel = this._branchSelections.get(groupRootId);\n if (!sel || sel.kind === 'pending') return nodes.length - 1; // default: latest\n const idx = nodes.findIndex((n) => n.msgId === sel.selectedId);\n if (idx === -1) return nodes.length - 1; // fallback if stale\n return idx;\n }\n\n getSiblings(msgId: string): TMessage[] {\n return this._tree.getSiblings(msgId);\n }\n\n hasSiblings(msgId: string): boolean {\n return this._tree.hasSiblings(msgId);\n }\n\n getNode(msgId: string): MessageNode<TMessage> | undefined {\n return this._tree.getNode(msgId);\n }\n\n // -------------------------------------------------------------------------\n // Write operations\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CT3, AIT-CT4\n async send(input: TMessage | TMessage[], options?: SendOptions): Promise<ActiveTurn<TEvent>> {\n this._logger.trace('DefaultView.send();');\n if (this._closed) {\n throw new Ably.ErrorInfo('unable to send; view is closed', ErrorCode.InvalidArgument, 400);\n }\n\n // Pre-compute visible branch history before the delegate call so the\n // transport has no back-reference to the View (one-way dependency).\n const history = this.flattenNodes();\n const result = await this._sendDelegate(input, options, history);\n\n // Spec: AIT-CT13e\n // Auto-select the new fork in this view when creating a fork.\n if (options?.forkOf) {\n const groupRoot = this._tree.getGroupRoot(options.forkOf);\n\n if (result.optimisticMsgIds.length > 0) {\n // The delegate optimistically inserted user messages (edit path).\n // Auto-select the last optimistic msgId — this is deterministic and\n // avoids the sibling-count race that exists when inferring from tree state.\n const lastMsgId = result.optimisticMsgIds.at(-1);\n if (lastMsgId) {\n this._branchSelections.set(groupRoot, { kind: 'auto', selectedId: lastMsgId });\n this._cachedNodes = this._computeFlatNodes();\n this._updateVisibleSnapshot(this._cachedNodes);\n this._emitter.emit('update');\n }\n } else {\n // No optimistic insert (e.g. regenerate sends no user messages). Defer\n // auto-selection until the server response creates the new sibling.\n // Store the group root (not the raw forkOf) so _pinBranchSelections\n // can match it regardless of which sibling is currently visible.\n this._branchSelections.set(groupRoot, { kind: 'pending', turnId: result.turnId });\n this._logger.debug('DefaultView.send(); deferring fork auto-selection', {\n forkOf: options.forkOf,\n groupRoot,\n turnId: result.turnId,\n });\n\n // Bound pending entry lifetime to the turn — clean up on turn-end.\n const turnUnsub = this._tree.on('turn', (evt) => {\n if (evt.type !== EVENT_TURN_END || evt.turnId !== result.turnId) return;\n const sel = this._branchSelections.get(groupRoot);\n if (sel?.kind === 'pending' && sel.turnId === result.turnId) {\n this._branchSelections.delete(groupRoot);\n }\n turnUnsub();\n const idx = this._unsubs.indexOf(turnUnsub);\n if (idx !== -1) this._unsubs.splice(idx, 1);\n });\n this._unsubs.push(turnUnsub);\n }\n }\n\n return result;\n }\n\n // Spec: AIT-CT5\n async regenerate(messageId: string, options?: SendOptions): Promise<ActiveTurn<TEvent>> {\n this._logger.trace('DefaultView.regenerate();', { messageId });\n\n const node = this._tree.getNode(messageId);\n if (!node) {\n throw new Ably.ErrorInfo(\n `unable to regenerate; message not found in tree: ${messageId}`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n const parentId = node.parentId;\n\n return this.send([], {\n ...options,\n body: {\n history: this._getHistoryBefore(messageId),\n ...options?.body,\n },\n forkOf: messageId,\n parent: parentId,\n });\n }\n\n // Spec: AIT-CT6\n async edit(\n messageId: string,\n newMessages: TMessage | TMessage[],\n options?: SendOptions,\n ): Promise<ActiveTurn<TEvent>> {\n this._logger.trace('DefaultView.edit();', { messageId });\n\n const node = this._tree.getNode(messageId);\n if (!node) {\n throw new Ably.ErrorInfo(\n `unable to edit; message not found in tree: ${messageId}`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n const parentId = node.parentId;\n\n return this.send(newMessages, {\n ...options,\n body: {\n history: this._getHistoryBefore(messageId),\n ...options?.body,\n },\n forkOf: messageId,\n parent: parentId,\n });\n }\n\n async update(msgId: string, events: TEvent[], options?: SendOptions): Promise<ActiveTurn<TEvent>> {\n if (this._closed) {\n throw new Ably.ErrorInfo('unable to update; view is closed', ErrorCode.InvalidArgument, 400);\n }\n this._logger.trace('DefaultView.update();', { msgId, eventCount: events.length });\n const eventNodes: EventsNode<TEvent>[] = [{ kind: 'event', msgId, events }];\n return this._sendDelegate([], options, this.flattenNodes(), eventNodes);\n }\n\n private _getHistoryBefore(messageId: string): MessageNode<TMessage>[] {\n this._logger.trace('DefaultView._getHistoryBefore();', { messageId });\n const all = this.flattenNodes();\n const idx = all.findIndex((n) => n.msgId === messageId);\n if (idx === -1) {\n this._logger.warn('DefaultView._getHistoryBefore(); target not in visible nodes, returning full list', {\n messageId,\n });\n return all;\n }\n return all.slice(0, idx);\n }\n\n // -------------------------------------------------------------------------\n // Observation\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CT17\n getActiveTurnIds(): Map<string, Set<string>> {\n this._logger.trace('DefaultView.getActiveTurnIds();');\n const allTurns = this._tree.getActiveTurnIds();\n if (this._withheldMsgIds.size === 0) return allTurns;\n\n // Filter to turns that have at least one visible message\n const result = new Map<string, Set<string>>();\n for (const [clientId, turnIds] of allTurns) {\n const filtered = new Set<string>();\n for (const turnId of turnIds) {\n if (this._lastVisibleTurnIds.has(turnId)) filtered.add(turnId);\n }\n if (filtered.size > 0) result.set(clientId, filtered);\n }\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Event subscription\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CT8a, AIT-CT8b, AIT-CT8e\n on(event: 'update', handler: () => void): () => void;\n on(event: 'ably-message', handler: (msg: Ably.InboundMessage) => void): () => void;\n on(event: 'turn', handler: (event: TurnLifecycleEvent) => void): () => void;\n on(\n event: 'update' | 'ably-message' | 'turn',\n handler: (() => void) | ((msg: Ably.InboundMessage) => void) | ((event: TurnLifecycleEvent) => void),\n ): () => void {\n // CAST: overload signatures enforce correct handler types per event name.\n const cb = handler as (arg: ViewEventsMap[keyof ViewEventsMap]) => void;\n this._emitter.on(event, cb);\n return () => {\n this._emitter.off(event, cb);\n };\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n /**\n * Tear down the view — unsubscribe from tree events.\n */\n close(): void {\n this._logger.info('DefaultView.close();');\n this._closed = true;\n this._loadingOlder = false;\n for (const unsub of this._unsubs) unsub();\n this._unsubs.length = 0;\n this._emitter.off();\n this._branchSelections.clear();\n this._withheldMsgIds.clear();\n this._withheldBuffer.length = 0;\n this._onClose?.();\n }\n\n // -------------------------------------------------------------------------\n // Private: history loading\n // -------------------------------------------------------------------------\n\n private async _loadFirstPage(limit: number): Promise<void> {\n // Snapshot before loading — everything already in the tree stays visible\n const beforeMsgIds = new Set(this._tree.flattenNodes(this._resolveSelections()).map((n) => n.msgId));\n\n const firstPage = await decodeHistory(this._channel, this._codec, { limit }, this._logger);\n if (this._closed) return;\n const { newVisible, lastPage } = await this._loadUntilVisible(firstPage, limit, beforeMsgIds);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- close() may be called during await\n if (this._closed) return;\n\n this._lastHistoryPage = lastPage;\n this._hasMoreHistory = lastPage.hasNext();\n\n // Split into withheld (older, kept hidden) and released (newest, shown now).\n // Only add the actually-withheld messages to the set — adding all then\n // releasing would cause a spurious empty-list update if a tree event fires\n // between the two operations.\n const released = newVisible.slice(-limit);\n const withheld = newVisible.slice(0, -limit);\n for (const n of withheld) {\n this._withheldMsgIds.add(n.msgId);\n }\n this._withheldBuffer.push(...withheld);\n this._releaseWithheld(released);\n }\n\n private async _loadAndReveal(page: HistoryPage<TMessage>, limit: number): Promise<void> {\n // Everything currently in the tree is \"already known\"\n const alreadyKnown = new Set(this._tree.flattenNodes(this._resolveSelections()).map((n) => n.msgId));\n\n const { newVisible, lastPage } = await this._loadUntilVisible(page, limit, alreadyKnown);\n if (this._closed) return;\n this._lastHistoryPage = lastPage;\n this._hasMoreHistory = lastPage.hasNext();\n\n // Release the newest `limit` items; rest stays in buffer.\n // Only add actually-withheld messages to the set — adding all then\n // releasing would cause a spurious empty-list update if a tree event\n // fires between the two operations.\n const batch = newVisible.slice(-limit);\n const withheld = newVisible.slice(0, -limit);\n for (const n of withheld) {\n this._withheldMsgIds.add(n.msgId);\n }\n this._withheldBuffer.push(...withheld);\n this._releaseWithheld(batch);\n }\n\n private _processHistoryPage(page: HistoryPage<TMessage>): void {\n this._processingHistory = true;\n try {\n for (const item of page.items) {\n const msgId = item.headers[HEADER_MSG_ID];\n if (!msgId) continue;\n this._tree.upsert(msgId, item.message, item.headers, item.serial);\n }\n\n for (const msg of page.rawMessages) {\n this._tree.emitAblyMessage(msg);\n }\n } finally {\n this._processingHistory = false;\n }\n }\n\n private async _loadUntilVisible(\n firstPage: HistoryPage<TMessage>,\n target: number,\n beforeMsgIds: Set<string>,\n ): Promise<{ newVisible: MessageNode<TMessage>[]; lastPage: HistoryPage<TMessage> }> {\n this._processHistoryPage(firstPage);\n let page = firstPage;\n\n const newVisibleCount = (): number => {\n let count = 0;\n for (const n of this._tree.flattenNodes(this._resolveSelections())) {\n if (!beforeMsgIds.has(n.msgId)) count++;\n }\n return count;\n };\n\n while (newVisibleCount() < target && page.hasNext()) {\n const nextPage = await page.next();\n if (!nextPage || this._closed) break;\n this._processHistoryPage(nextPage);\n page = nextPage;\n }\n\n const newVisible = this._tree.flattenNodes(this._resolveSelections()).filter((n) => !beforeMsgIds.has(n.msgId));\n return { newVisible, lastPage: page };\n }\n\n // Spec: AIT-CT11a\n private _releaseWithheld(nodes: MessageNode<TMessage>[]): void {\n for (const n of nodes) {\n this._withheldMsgIds.delete(n.msgId);\n }\n if (nodes.length > 0) {\n this._cachedNodes = this._computeFlatNodes();\n this._updateVisibleSnapshot(this._cachedNodes);\n this._emitter.emit('update');\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: scoped event forwarding\n // -------------------------------------------------------------------------\n\n private _updateVisibleSnapshot(nodes?: MessageNode<TMessage>[]): void {\n const resolved = nodes ?? this.flattenNodes();\n this._lastVisibleIds = resolved.map((n) => n.msgId);\n this._lastVisibleMessages = resolved.map((n) => n.message);\n this._lastVisibleTurnIds = new Set<string>();\n for (const n of resolved) {\n const turnId = n.headers[HEADER_TURN_ID];\n if (turnId) this._lastVisibleTurnIds.add(turnId);\n }\n }\n\n private _onTreeUpdate(): void {\n // Suppress update forwarding while processing history pages. During\n // _processHistoryPage, each tree.upsert() fires this handler synchronously\n // — but _withheldMsgIds hasn't been populated yet, so flattenNodes() would\n // return unfiltered history. Without this guard, subscribers briefly see all\n // history messages before the pagination window is applied. The final update\n // is emitted by _releaseWithheld after withholding is set up.\n // Scoped to _processingHistory (not _loadingOlder) so that live streaming\n // updates arriving during the async history fetch are still forwarded.\n if (this._processingHistory) return;\n\n const currentVersion = this._tree.structuralVersion;\n\n // Content-only fast path: the tree structure hasn't changed (no new\n // nodes, deletions, or serial reorders), so the cached node list is\n // still structurally valid. The tree mutated an existing node's\n // .message in place - check if any visible message reference changed.\n // JS single-threaded: structuralVersion cannot change between the\n // check and the response within this synchronous handler invocation.\n if (currentVersion === this._lastStructuralVersion) {\n const changed = this._cachedNodes.some((node, i) => node.message !== this._lastVisibleMessages[i]);\n if (changed) {\n this._lastVisibleMessages = this._cachedNodes.map((n) => n.message);\n this._cachedNodes = [...this._cachedNodes];\n this._emitter.emit('update');\n }\n return;\n }\n\n // Structural update: full re-walk required.\n this._lastStructuralVersion = currentVersion;\n\n // Pin selections for previously-visible nodes that now have siblings.\n // This prevents new forks (from other views' edits/regenerates) from\n // shifting this view to a branch the user didn't navigate to.\n this._pinBranchSelections();\n this._resolvePendingSelections();\n\n const nodes = this._computeFlatNodes();\n const newIds = nodes.map((n) => n.msgId);\n const newMessages = nodes.map((n) => n.message);\n if (this._visibleChanged(newIds, newMessages)) {\n this._cachedNodes = nodes;\n this._updateVisibleSnapshot(nodes);\n this._emitter.emit('update');\n }\n }\n\n /**\n * Build a resolved selections map from `_branchSelections` for passing\n * to `tree.flattenNodes()`. Pending entries (no sibling yet) are omitted,\n * causing the tree to use the default (latest sibling).\n * @returns Resolved map of groupRoot → selectedMsgId.\n */\n private _resolveSelections(): Map<string, string> {\n const resolved = new Map<string, string>();\n for (const [groupRoot, sel] of this._branchSelections) {\n if (sel.kind === 'pending') continue;\n resolved.set(groupRoot, sel.selectedId);\n }\n return resolved;\n }\n\n /**\n * For each previously-visible message that now has siblings but no\n * explicit selection, pin the selection to that message's msgId.\n * This preserves the current branch when new forks appear from\n * other views or external sources.\n *\n * Exception: if the fork was initiated by this view (tracked as a\n * `pending` BranchSelection), select the newest sibling instead of\n * pinning the old one. This handles regenerate, where no optimistic\n * insert was possible at send time.\n */\n private _pinBranchSelections(): void {\n for (const msgId of this._lastVisibleIds) {\n if (!this._tree.hasSiblings(msgId)) continue;\n const groupRoot = this._tree.getGroupRoot(msgId);\n const existing = this._branchSelections.get(groupRoot);\n\n // Spec: AIT-CT13e\n // Check if this fork was initiated by this view (e.g. regenerate).\n // If so, select the newest sibling — but only if it belongs to the\n // pending turn. Without this check, a sibling from another view's\n // concurrent fork would be incorrectly auto-selected.\n if (existing?.kind === 'pending') {\n const nodes = this._tree.getSiblingNodes(msgId);\n const newest = nodes.at(-1);\n if (newest && newest.msgId !== msgId) {\n const newestTurnId = newest.headers[HEADER_TURN_ID];\n if (newestTurnId === existing.turnId) {\n this._logger.debug('DefaultView._pinBranchSelections(); auto-selecting pending fork', {\n msgId,\n newestId: newest.msgId,\n turnId: existing.turnId,\n });\n this._branchSelections.set(groupRoot, { kind: 'auto', selectedId: newest.msgId });\n }\n }\n continue;\n }\n\n // Spec: AIT-CT13f\n // External fork — pin to the currently-visible sibling.\n if (existing) continue; // already have a selection\n this._branchSelections.set(groupRoot, { kind: 'pinned', selectedId: msgId });\n }\n }\n\n /**\n * Resolve pending selections that are no longer on the visible branch.\n * `_pinBranchSelections` only checks visible nodes, so if the user navigated\n * away before the server response arrived, the pending entry would linger.\n * This pass checks all pending entries against the tree directly.\n */\n private _resolvePendingSelections(): void {\n for (const [groupRoot, sel] of this._branchSelections) {\n if (sel.kind !== 'pending') continue;\n const nodes = this._tree.getSiblingNodes(groupRoot);\n if (nodes.length <= 1) continue;\n const newest = nodes.at(-1);\n if (!newest || newest.msgId === groupRoot) continue;\n const newestTurnId = newest.headers[HEADER_TURN_ID];\n if (newestTurnId === sel.turnId) {\n this._logger.debug('DefaultView._resolvePendingSelections(); resolving off-branch pending', {\n groupRoot,\n newestId: newest.msgId,\n turnId: sel.turnId,\n });\n this._branchSelections.set(groupRoot, { kind: 'auto', selectedId: newest.msgId });\n }\n }\n }\n\n private _onTreeAblyMessage(msg: Ably.InboundMessage): void {\n // Re-emit only if the message corresponds to a visible node\n const headers = getHeaders(msg);\n const msgId = headers[HEADER_MSG_ID];\n if (!msgId) {\n // Non-message events (turn-start, turn-end, cancel) — always forward\n this._emitter.emit('ably-message', msg);\n return;\n }\n // Check that msgId is on the visible branch and not withheld\n if (this._lastVisibleIds.includes(msgId)) {\n this._emitter.emit('ably-message', msg);\n }\n }\n\n private _onTreeTurn(event: TurnLifecycleEvent): void {\n // Check if any messages for this turn are already on the visible branch.\n if (this._lastVisibleTurnIds.has(event.turnId)) {\n this._emitter.emit('turn', event);\n return;\n }\n\n // For turn-start, use branch metadata to predict visibility before\n // messages arrive. Own turns have optimistic inserts (caught above).\n // Remote turns carry parent/forkOf from the server.\n if (event.type === EVENT_TURN_START && this._isTurnStartVisible(event)) {\n // Track the predicted turnId so the corresponding turn-end is not\n // dropped if it arrives before messages update the snapshot.\n this._lastVisibleTurnIds.add(event.turnId);\n this._emitter.emit('turn', event);\n }\n }\n\n /**\n * Predict whether a turn-start's messages will be visible on this view's branch\n * using the parent/forkOf metadata from the event.\n * @param event - The turn-start lifecycle event with optional branch metadata.\n * @returns True if the turn's messages are expected to be visible on this view's branch.\n */\n private _isTurnStartVisible(event: TurnLifecycleEvent & { type: typeof EVENT_TURN_START }): boolean {\n const { parent } = event;\n\n // No parent metadata — can't determine branch, forward as default.\n // This covers root turns (parent omitted) and backward compat.\n if (parent === undefined) return true;\n\n // Check if the parent is on the visible branch\n return this._lastVisibleIds.includes(parent);\n }\n\n private _visibleChanged(newIds: string[], newMessages: TMessage[]): boolean {\n if (newIds.length !== this._lastVisibleIds.length) return true;\n for (const [i, newId] of newIds.entries()) {\n if (newId !== this._lastVisibleIds[i]) return true;\n }\n // Also detect in-place content updates (e.g. streaming) via reference comparison\n for (const [i, msg] of newMessages.entries()) {\n if (msg !== this._lastVisibleMessages[i]) return true;\n }\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a View that projects a paginated window over a Tree.\n * @param options - The tree, channel, codec, and logger to use.\n * @returns A new {@link DefaultView} instance.\n */\nexport const createView = <TEvent, TMessage>(options: ViewOptions<TEvent, TMessage>): DefaultView<TEvent, TMessage> =>\n new DefaultView(options);\n","/**\n * Core client-side transport, parameterized by codec.\n *\n * Composes StreamRouter and Tree to handle the full client-side\n * lifecycle. Subscribes to the Ably channel on construction. The same\n * subscription, decoder, and channel are reused across turns.\n *\n * The client never publishes user messages directly. Instead, it sends them\n * to the server via HTTP POST. The server publishes user messages and turn\n * lifecycle events (turn-start, turn-end) on behalf of the client.\n */\n\nimport * as Ably from 'ably';\n\nimport {\n EVENT_CANCEL,\n EVENT_TURN_END,\n EVENT_TURN_START,\n HEADER_AMEND,\n HEADER_CANCEL_ALL,\n HEADER_CANCEL_CLIENT_ID,\n HEADER_CANCEL_OWN,\n HEADER_CANCEL_TURN_ID,\n HEADER_FORK_OF,\n HEADER_MSG_ID,\n HEADER_PARENT,\n HEADER_TURN_CLIENT_ID,\n HEADER_TURN_ID,\n HEADER_TURN_REASON,\n} from '../../constants.js';\nimport { ErrorCode } from '../../errors.js';\nimport { EventEmitter } from '../../event-emitter.js';\nimport type { Logger } from '../../logger.js';\nimport { LogLevel, makeLogger } from '../../logger.js';\nimport { getHeaders } from '../../utils.js';\nimport type { DecoderOutput, MessageAccumulator, StreamDecoder } from '../codec/types.js';\nimport { buildTransportHeaders } from './headers.js';\nimport type { StreamRouter } from './stream-router.js';\nimport { createStreamRouter } from './stream-router.js';\nimport type { DefaultTree } from './tree.js';\nimport { createTree } from './tree.js';\nimport type {\n ActiveTurn,\n CancelFilter,\n ClientTransport,\n ClientTransportOptions,\n CloseOptions,\n EventsNode,\n MessageNode,\n SendOptions,\n Tree,\n TurnEndReason,\n TurnLifecycleEvent,\n View,\n} from './types.js';\nimport { createView, type DefaultView } from './view.js';\n\n/**\n * Returned from `on()` when the transport is already closed — the subscription\n * is silently ignored since no further events will fire.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-function -- intentional no-op\nconst noopUnsubscribe = (): void => {};\n\n// ---------------------------------------------------------------------------\n// Internal state machine\n// ---------------------------------------------------------------------------\n\nenum ClientTransportState {\n READY = 'ready',\n CLOSED = 'closed',\n}\n\n// ---------------------------------------------------------------------------\n// Event map for the transport's typed EventEmitter\n// ---------------------------------------------------------------------------\n\ninterface ClientTransportEventsMap {\n error: Ably.ErrorInfo;\n}\n\n// ---------------------------------------------------------------------------\n// Per-turn observer state — consolidated to avoid parallel-map bookkeeping\n// ---------------------------------------------------------------------------\n\ninterface TurnObserverState<TEvent, TMessage> {\n headers: Record<string, string>;\n serial: string | undefined;\n accumulator: MessageAccumulator<TEvent, TMessage>;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CT1\nclass DefaultClientTransport<TEvent, TMessage> implements ClientTransport<TEvent, TMessage> {\n private readonly _channel: Ably.RealtimeChannel;\n private readonly _codec: ClientTransportOptions<TEvent, TMessage>['codec'];\n private readonly _clientId: string | undefined;\n private readonly _api: string;\n private readonly _credentials: RequestCredentials | undefined;\n private readonly _headersFn: (() => Record<string, string>) | undefined;\n private readonly _bodyFn: (() => Record<string, unknown>) | undefined;\n private readonly _fetchFn: typeof globalThis.fetch;\n private readonly _logger: Logger;\n\n // Typed event emitter — only 'error' remains on the transport\n private readonly _emitter: EventEmitter<ClientTransportEventsMap>;\n\n // Relay detection — tracks msg-ids of optimistic inserts for reconciliation\n private readonly _ownMsgIds = new Set<string>();\n private readonly _ownTurnIds = new Set<string>();\n\n // Track msgIds per turn for cleanup on turn-end\n private readonly _turnMsgIds = new Map<string, Set<string>>();\n\n // Per-turn observer state: headers, serial, and accumulator in one map.\n // A single .delete(turnId) cleans up all three.\n private readonly _turnObservers = new Map<string, TurnObserverState<TEvent, TMessage>>();\n\n // Callbacks to resolve pending waitForTurn promises on close, preventing leaked subscriptions.\n private readonly _closeResolvers: (() => void)[] = [];\n\n // Sub-components\n private readonly _tree: DefaultTree<TMessage>;\n private readonly _view: DefaultView<TEvent, TMessage>;\n private readonly _views = new Set<DefaultView<TEvent, TMessage>>();\n private readonly _router: StreamRouter<TEvent>;\n private readonly _decoder: StreamDecoder<TEvent, TMessage>;\n\n // Spec: AIT-CT10, AIT-CT10a\n readonly tree: Tree<TMessage>;\n readonly view: View<TEvent, TMessage>;\n\n // Channel subscription — subscribe() returns a Promise that resolves when the channel attaches\n private readonly _attachPromise: Promise<unknown>;\n private readonly _onMessage: (msg: Ably.InboundMessage) => void;\n\n private _state = ClientTransportState.READY;\n private _hasAttachedOnce: boolean;\n private readonly _onChannelStateChange: Ably.channelEventCallback;\n\n // Events staged locally via stageEvents(). Flushed into the eventNodes\n // parameter of _internalSend on the next send operation.\n private _pendingLocalEvents: EventsNode<TEvent>[] = [];\n\n constructor(options: ClientTransportOptions<TEvent, TMessage>) {\n this._channel = options.channel;\n this._codec = options.codec;\n this._clientId = options.clientId;\n this._api = options.api;\n this._credentials = options.credentials;\n // CAST: TS can't narrow options.headers/body inside a closure because the outer\n // object is mutable. The truthiness check on the preceding line guarantees non-nullish.\n this._headersFn =\n typeof options.headers === 'function'\n ? options.headers\n : options.headers\n ? () => options.headers as Record<string, string>\n : undefined;\n this._bodyFn =\n typeof options.body === 'function'\n ? options.body\n : options.body\n ? () => options.body as Record<string, unknown>\n : undefined;\n this._fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this._logger = (options.logger ?? makeLogger({ logLevel: LogLevel.Silent })).withContext({\n component: 'ClientTransport',\n });\n\n this._emitter = new EventEmitter<ClientTransportEventsMap>(this._logger);\n this._hasAttachedOnce = this._channel.state === 'attached';\n\n // Compose sub-components\n this._tree = createTree<TMessage>(this._logger);\n this._view = createView<TEvent, TMessage>({\n tree: this._tree,\n channel: this._channel,\n codec: this._codec,\n sendDelegate: this._internalSend.bind(this),\n logger: this._logger,\n onClose: () => this._views.delete(this._view),\n });\n this._router = createStreamRouter<TEvent>(this._codec.isTerminal.bind(this._codec), this._logger);\n this._decoder = this._codec.createDecoder();\n\n this._views.add(this._view);\n\n // Public accessors (typed as narrow interfaces)\n this.tree = this._tree;\n this.view = this._view;\n\n // Seed tree with initial messages — transport assigns its own msgId\n if (options.messages) {\n let prevMsgId: string | undefined;\n for (const msg of options.messages) {\n const msgId = crypto.randomUUID();\n const seedHeaders: Record<string, string> = { [HEADER_MSG_ID]: msgId };\n if (prevMsgId) seedHeaders[HEADER_PARENT] = prevMsgId;\n this._tree.upsert(msgId, msg, seedHeaders);\n prevMsgId = msgId;\n }\n }\n\n // Spec: AIT-CT2\n // Subscribe before attach (RTL7g)\n this._onMessage = (ablyMessage: Ably.InboundMessage) => {\n this._handleMessage(ablyMessage);\n };\n this._attachPromise = this._channel.subscribe(this._onMessage);\n\n // Listen for channel state changes that break message continuity.\n // _hasAttachedOnce is seeded from the channel's current state so that\n // pre-attached channels are handled correctly. It distinguishes the\n // initial attach (expected) from a genuine discontinuity.\n this._onChannelStateChange = (stateChange: Ably.ChannelStateChange) => {\n this._handleChannelStateChange(stateChange);\n };\n this._channel.on(this._onChannelStateChange);\n }\n\n // ---------------------------------------------------------------------------\n // Message subscription handler\n // ---------------------------------------------------------------------------\n\n private _handleMessage(ablyMessage: Ably.InboundMessage): void {\n if (this._state === ClientTransportState.CLOSED) return;\n\n try {\n // Spec: AIT-CT16a\n // --- Turn lifecycle events from the server ---\n if (ablyMessage.name === EVENT_TURN_START) {\n const headers = getHeaders(ablyMessage);\n const turnId = headers[HEADER_TURN_ID];\n const turnCid = headers[HEADER_TURN_CLIENT_ID] ?? '';\n if (turnId) {\n this._tree.trackTurn(turnId, turnCid);\n const parentRaw = headers[HEADER_PARENT];\n const forkOf = headers[HEADER_FORK_OF];\n this._tree.emitTurn({\n type: EVENT_TURN_START,\n turnId,\n clientId: turnCid,\n ...(parentRaw !== undefined && { parent: parentRaw }),\n ...(forkOf !== undefined && { forkOf }),\n });\n }\n this._tree.emitAblyMessage(ablyMessage);\n return;\n }\n\n if (ablyMessage.name === EVENT_TURN_END) {\n const headers = getHeaders(ablyMessage);\n const turnId = headers[HEADER_TURN_ID];\n const turnCid = headers[HEADER_TURN_CLIENT_ID] ?? '';\n // CAST: server always writes a valid TurnEndReason; default to 'complete' for robustness\n const reason = (headers[HEADER_TURN_REASON] ?? 'complete') as TurnEndReason;\n if (turnId) {\n this._router.closeStream(turnId);\n this._turnObservers.delete(turnId);\n this._tree.untrackTurn(turnId);\n // Clean up per-turn relay-detection state\n const msgIds = this._turnMsgIds.get(turnId);\n if (msgIds) {\n for (const mid of msgIds) this._ownMsgIds.delete(mid);\n this._turnMsgIds.delete(turnId);\n }\n this._ownTurnIds.delete(turnId);\n this._tree.emitTurn({ type: EVENT_TURN_END, turnId, clientId: turnCid, reason });\n }\n this._tree.emitAblyMessage(ablyMessage);\n return;\n }\n\n // --- Codec-decoded messages ---\n const outputs = this._decoder.decode(ablyMessage);\n const headers = getHeaders(ablyMessage);\n const serial = ablyMessage.serial;\n\n // Cross-turn events target an existing message from a prior turn,\n // bypassing the current turn's accumulator.\n const amendTarget = headers[HEADER_AMEND];\n if (amendTarget) {\n for (const output of outputs) {\n if (output.kind === 'event') {\n this._handleAmendmentEvent(amendTarget, output);\n }\n }\n return;\n }\n\n // Always update observer headers, even when the decoder produces no outputs.\n // This ensures header transitions (e.g. x-ably-status: streaming → aborted)\n // are captured for events that the decoder suppresses (AIT-CD8: aborted\n // stream appends emit no events but still carry the updated status header).\n const turnId = headers[HEADER_TURN_ID];\n if (turnId) {\n this._updateTurnObserverHeaders(turnId, headers, serial);\n }\n\n for (const output of outputs) {\n if (output.kind === 'message') {\n this._handleMessageOutput(output.message, headers, serial, ablyMessage.action);\n } else {\n this._handleEventOutput(output, headers);\n }\n }\n\n // Emit ably-message AFTER decode/upsert so that View subscribers can\n // find the node in _lastVisibleIds (which is refreshed by tree 'update'\n // events triggered during upsert).\n this._tree.emitAblyMessage(ablyMessage);\n } catch (error) {\n const cause = error instanceof Ably.ErrorInfo ? error : undefined;\n this._emitter.emit(\n 'error',\n new Ably.ErrorInfo(\n `unable to process channel message; ${error instanceof Error ? error.message : String(error)}`,\n ErrorCode.TransportSubscriptionError,\n 500,\n cause,\n ),\n );\n }\n }\n\n /**\n * Handle a decoded domain message (user message create or relayed own message).\n * @param message - The decoded domain message.\n * @param headers - Ably headers from the wire message.\n * @param serial - Ably serial for tree ordering.\n * @param action - Ably message action (e.g. 'message.create').\n */\n private _handleMessageOutput(\n message: TMessage,\n headers: Record<string, string>,\n serial: string | undefined,\n action: string | undefined,\n ): void {\n // Spec: AIT-CT15\n const msgId = headers[HEADER_MSG_ID];\n if (msgId && this._ownMsgIds.has(msgId)) {\n // Relayed own message — reconcile optimistic entry with server-assigned fields\n this._upsertAndNotify(message, headers, serial);\n return;\n }\n\n if (action === 'message.create') {\n this._upsertAndNotify(message, headers, serial);\n }\n }\n\n /**\n * Handle a decoded streaming event: route to own-turn stream or accumulate for observer.\n * @param output - The decoded event output from the codec.\n * @param headers - Ably headers from the wire message.\n */\n private _handleEventOutput(output: DecoderOutput<TEvent, TMessage>, headers: Record<string, string>): void {\n if (output.kind !== 'event') return;\n const event = output.event;\n const turnId = headers[HEADER_TURN_ID];\n if (!turnId) return;\n\n // Observer headers are already updated in _handleMessage (before outputs\n // are iterated) so that header transitions are captured even when the\n // decoder produces no outputs (e.g. aborted stream appends per AIT-CD8).\n\n // Active own turn — route to the ReadableStream\n if (this._router.route(turnId, event)) {\n this._accumulateAndEmit(turnId, output);\n if (this._codec.isTerminal(event)) this._turnObservers.delete(turnId);\n return;\n }\n\n // Completed own turn — late arrival, skip\n if (this._ownTurnIds.has(turnId) && !this._turnObservers.has(turnId)) return;\n\n // Spec: AIT-CT16\n // Observer turn — accumulate and emit\n this._accumulateAndEmit(turnId, output);\n if (this._codec.isTerminal(event)) this._turnObservers.delete(turnId);\n }\n\n /**\n * Handle a cross-turn event targeting an existing message from a prior turn.\n * Creates a temporary accumulator, seeds it with the existing message,\n * processes the event, and upserts the updated message into the tree.\n * @param targetMsgId - The x-ably-msg-id of the message to update.\n * @param output - The decoded event output to apply.\n */\n private _handleAmendmentEvent(targetMsgId: string, output: DecoderOutput<TEvent, TMessage>): void {\n this._logger.trace('ClientTransport._handleAmendmentEvent();', { targetMsgId });\n\n const existingNode = this._tree.getNode(targetMsgId);\n if (!existingNode) {\n this._logger.debug('ClientTransport._handleAmendmentEvent(); target not found, dropping', { targetMsgId });\n return;\n }\n\n const accumulator = this._codec.createAccumulator();\n accumulator.initMessage(targetMsgId, existingNode.message);\n accumulator.processOutputs([output]);\n\n const updatedMsg = accumulator.messages.at(-1);\n if (updatedMsg) {\n this._tree.upsert(targetMsgId, updatedMsg, existingNode.headers, existingNode.serial);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Channel state change handler\n // ---------------------------------------------------------------------------\n\n // Spec: AIT-CT19, AIT-CT19a\n private _handleChannelStateChange(stateChange: Ably.ChannelStateChange): void {\n if (this._state === ClientTransportState.CLOSED) return;\n\n const { current, resumed } = stateChange;\n\n // Track the initial attach so we don't treat it as a discontinuity\n if (current === 'attached' && !this._hasAttachedOnce) {\n this._hasAttachedOnce = true;\n return;\n }\n\n // Continuity-breaking states:\n // - FAILED, SUSPENDED, DETACHED: no more messages expected (or gap)\n // - ATTACHED with resumed: false (UPDATE): messages were lost\n const continuityLost =\n current === 'failed' || current === 'suspended' || current === 'detached' || (current === 'attached' && !resumed);\n\n if (!continuityLost) return;\n\n this._logger.error('ClientTransport._handleChannelStateChange(); channel continuity lost', {\n current,\n resumed,\n previous: stateChange.previous,\n });\n\n const err = new Ably.ErrorInfo(\n `unable to deliver events; channel continuity lost (${current}${current === 'attached' ? ', resumed: false' : ''})`,\n ErrorCode.ChannelContinuityLost,\n 500,\n stateChange.reason,\n );\n\n // As with cancellation (_closeMatchingTurnStreams), do not clear\n // _ownTurnIds or _turnObservers here — late events must still accumulate\n // into the tree. The turn-end handler cleans up observers.\n for (const turnId of this._ownTurnIds) {\n this._router.errorStream(turnId, err);\n }\n\n this._emitter.emit('error', err);\n }\n\n // ---------------------------------------------------------------------------\n // Tree mutation + notification helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Upsert a message into the tree and notify subscribers.\n * @param message - The domain message to insert or update.\n * @param headers - Ably headers for the message.\n * @param serial - Ably serial for tree ordering.\n */\n private _upsertAndNotify(message: TMessage, headers: Record<string, string>, serial?: string): void {\n const msgId = headers[HEADER_MSG_ID];\n if (!msgId) return;\n this._tree.upsert(msgId, message, headers, serial);\n }\n\n // ---------------------------------------------------------------------------\n // Observer accumulation\n // ---------------------------------------------------------------------------\n\n /**\n * Ensure a TurnObserverState exists for turnId, updating headers and serial as new events arrive.\n * @param turnId - The turn to track.\n * @param headers - Headers from the current event.\n * @param serial - Ably serial from the current event.\n */\n private _updateTurnObserverHeaders(\n turnId: string,\n headers: Record<string, string>,\n serial: string | undefined,\n ): void {\n const existing = this._turnObservers.get(turnId);\n if (existing) {\n if (Object.keys(headers).length > 0) {\n Object.assign(existing.headers, headers);\n }\n // Always advance the serial so the tree node sorts after all\n // earlier messages in the turn (e.g. user-message relays that\n // arrive before the assistant response).\n if (serial !== undefined) {\n existing.serial = serial;\n }\n } else {\n this._turnObservers.set(turnId, {\n headers: { ...headers },\n serial,\n accumulator: this._codec.createAccumulator(),\n });\n }\n }\n\n /**\n * Process a streaming event through the turn's accumulator and emit the latest message.\n * @param turnId - The turn this event belongs to.\n * @param output - The decoded event output to accumulate.\n */\n private _accumulateAndEmit(turnId: string, output: DecoderOutput<TEvent, TMessage>): void {\n const observer = this._turnObservers.get(turnId);\n if (!observer) return;\n\n // Sync the accumulator with the tree before processing. If the message\n // was updated externally (via cross-turn events), initMessage syncs the\n // accumulator's state so the update isn't lost when processing\n // late turn events like finish-step/finish.\n const msgId = observer.headers[HEADER_MSG_ID];\n if (msgId) {\n const treeNode = this._tree.getNode(msgId);\n if (treeNode) {\n observer.accumulator.initMessage(msgId, treeNode.message);\n }\n }\n\n observer.accumulator.processOutputs([output]);\n\n const messages = observer.accumulator.messages;\n if (messages.length === 0) return;\n\n let message: TMessage | undefined;\n try {\n message = structuredClone(messages.at(-1));\n } catch {\n // CAST: structuredClone can fail if the message contains non-cloneable\n // values (e.g. functions). Fall back to the reference — the tree upsert\n // below copies headers independently, so shared message state is the\n // only risk. Accumulator messages are replaced on each event, so\n // mutation between events is not a practical concern.\n message = messages.at(-1);\n }\n\n if (message) {\n const msgId = observer.headers[HEADER_MSG_ID];\n if (msgId) {\n this._tree.upsert(msgId, message, { ...observer.headers }, observer.serial);\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Cancel helpers\n // ---------------------------------------------------------------------------\n\n private async _publishCancel(filter: CancelFilter): Promise<void> {\n this._logger.trace('ClientTransport._publishCancel();', { filter });\n\n const headers: Record<string, string> = {};\n if (filter.turnId) {\n headers[HEADER_CANCEL_TURN_ID] = filter.turnId;\n } else if (filter.own) {\n headers[HEADER_CANCEL_OWN] = 'true';\n } else if (filter.clientId) {\n headers[HEADER_CANCEL_CLIENT_ID] = filter.clientId;\n } else if (filter.all) {\n headers[HEADER_CANCEL_ALL] = 'true';\n }\n\n await this._channel.publish({\n name: EVENT_CANCEL,\n extras: { headers },\n });\n }\n\n private _closeMatchingTurnStreams(filter: CancelFilter): void {\n // Only close the router streams here — do NOT clear _turnObservers.\n // The observer must remain alive so that late server events (e.g. abort,\n // x-ably-status: aborted) arriving before turn-end are still accumulated\n // into the message store. The turn-end handler cleans up observers.\n for (const turnId of this._getMatchingTurnIds(filter)) {\n this._router.closeStream(turnId);\n }\n }\n\n private _getMatchingTurnIds(filter: CancelFilter): Set<string> {\n const matched = new Set<string>();\n const activeTurns = this._tree.getActiveTurnIds();\n\n if (filter.all) {\n for (const turnIds of activeTurns.values()) {\n for (const turnId of turnIds) matched.add(turnId);\n }\n } else if (filter.own) {\n const ownTurns = activeTurns.get(this._clientId ?? '');\n if (ownTurns) {\n for (const turnId of ownTurns) matched.add(turnId);\n }\n } else if (filter.clientId) {\n const clientTurns = activeTurns.get(filter.clientId);\n if (clientTurns) {\n for (const turnId of clientTurns) matched.add(turnId);\n }\n } else if (filter.turnId) {\n // Check if the turnId exists in any client's turns\n for (const turnIds of activeTurns.values()) {\n if (turnIds.has(filter.turnId)) {\n matched.add(filter.turnId);\n break;\n }\n }\n }\n return matched;\n }\n\n // ---------------------------------------------------------------------------\n // Input message helpers\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n // Spec: AIT-CT10b\n createView(): View<TEvent, TMessage> {\n if (this._state === ClientTransportState.CLOSED) {\n throw new Ably.ErrorInfo('unable to create view; transport is closed', ErrorCode.TransportClosed, 400);\n }\n this._logger.trace('DefaultClientTransport.createView();');\n const view = createView<TEvent, TMessage>({\n tree: this._tree,\n channel: this._channel,\n codec: this._codec,\n sendDelegate: this._internalSend.bind(this),\n logger: this._logger,\n onClose: () => this._views.delete(view),\n });\n this._views.add(view);\n return view;\n }\n\n // Spec: AIT-CT3, AIT-CT4\n private async _internalSend(\n input: TMessage | TMessage[],\n sendOptions: SendOptions | undefined,\n history: MessageNode<TMessage>[],\n eventNodes?: EventsNode<TEvent>[],\n ): Promise<ActiveTurn<TEvent>> {\n if (this._state === ClientTransportState.CLOSED) {\n throw new Ably.ErrorInfo('unable to send; transport is closed', ErrorCode.TransportClosed, 400);\n }\n await this._attachPromise;\n // CAST: re-check after await — close() may have been called while waiting for attach.\n // TypeScript's control flow narrows _state after the first check, but the\n // await yields and close() can mutate _state concurrently.\n if ((this._state as ClientTransportState) === ClientTransportState.CLOSED) {\n throw new Ably.ErrorInfo('unable to send; transport is closed', ErrorCode.TransportClosed, 400);\n }\n\n // Spec: AIT-CT20\n const state = this._channel.state;\n if (state !== 'attached' && state !== 'attaching') {\n throw new Ably.ErrorInfo(`unable to send; channel is ${state}`, ErrorCode.ChannelNotReady, 400);\n }\n\n this._logger.trace('ClientTransport._internalSend();');\n\n const msgs = Array.isArray(input) ? input : [input];\n const turnId = crypto.randomUUID();\n this._ownTurnIds.add(turnId);\n this._tree.trackTurn(turnId, this._clientId ?? '');\n\n // Flush any events staged via stageEvents() since the last send. They\n // have already been applied to the tree, so merge them into the POST\n // body without re-applying. External eventNodes (e.g. from view.update)\n // have NOT been applied yet and need the optimistic tree update below.\n const flushedStaged = this._pendingLocalEvents;\n this._pendingLocalEvents = [];\n\n // Optimistic tree updates for external cross-turn events — must happen\n // before capturing history so the POST body includes the updated\n // message state.\n if (eventNodes && eventNodes.length > 0) {\n this._applyEventsToTree(eventNodes);\n }\n\n const allEventNodes: EventsNode<TEvent>[] = [...flushedStaged, ...(eventNodes ?? [])];\n\n const msgIds = new Set<string>();\n const postMessages: MessageNode<TMessage>[] = [];\n\n // The View pre-computed the visible branch before calling this delegate,\n // so preInsertHistory reflects the state before any optimistic inserts.\n const preInsertHistory = history;\n\n // Spec: AIT-CT3d\n // Auto-compute parent from the current thread if not explicitly provided\n let autoParent: string | undefined;\n if (sendOptions?.parent === undefined && !sendOptions?.forkOf) {\n const lastNode = preInsertHistory.at(-1);\n if (lastNode) {\n autoParent = lastNode.msgId;\n }\n }\n\n // Capture the first parent for the POST body before the loop advances it.\n const postParent = sendOptions?.parent === undefined ? autoParent : sendOptions.parent;\n\n for (const message of msgs) {\n const msgId = crypto.randomUUID();\n this._ownMsgIds.add(msgId);\n msgIds.add(msgId);\n\n const resolvedParent = sendOptions?.parent === undefined ? autoParent : sendOptions.parent;\n\n const optimisticHeaders = buildTransportHeaders({\n role: 'user',\n turnId,\n msgId,\n turnClientId: this._clientId,\n parent: resolvedParent,\n forkOf: sendOptions?.forkOf,\n });\n // Spec: AIT-CT3c\n // Optimistically insert each user message into the tree\n this._upsertAndNotify(message, optimisticHeaders);\n\n // Build MessageNode for the POST body\n postMessages.push({\n kind: 'message',\n message,\n msgId,\n parentId: resolvedParent,\n forkOf: sendOptions?.forkOf,\n headers: optimisticHeaders,\n serial: undefined,\n });\n\n // Spec: AIT-CT3e\n // Chain: each subsequent message in the batch parents off the previous\n // one, forming a linear conversation thread rather than siblings.\n if (sendOptions?.parent === undefined && !sendOptions?.forkOf) {\n autoParent = msgId;\n }\n }\n\n this._turnMsgIds.set(turnId, msgIds);\n\n // Create ReadableStream via router\n const stream = this._router.createStream(turnId);\n\n // Resolve headers and body\n const resolvedHeaders = this._headersFn?.() ?? {};\n const resolvedBody = this._bodyFn?.() ?? {};\n\n const postBody: Record<string, unknown> = {\n ...resolvedBody,\n history: preInsertHistory,\n ...sendOptions?.body,\n turnId,\n clientId: this._clientId,\n messages: postMessages,\n ...(sendOptions?.forkOf !== undefined && { forkOf: sendOptions.forkOf }),\n ...(postParent !== undefined && { parent: postParent }),\n ...(allEventNodes.length > 0 && { events: allEventNodes }),\n };\n\n const postHeaders: Record<string, string> = {\n ...resolvedHeaders,\n ...sendOptions?.headers,\n };\n\n // Spec: AIT-CT3a, AIT-CT3b\n // Fire-and-forget: POST must not block the stream return to the caller.\n // .catch() is intentional — async/await would delay stream availability.\n this._fetchFn(this._api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...postHeaders,\n },\n body: JSON.stringify(postBody),\n ...(this._credentials ? { credentials: this._credentials } : {}),\n })\n .then((response) => {\n if (!response.ok) {\n const err = new Ably.ErrorInfo(\n `unable to send; HTTP POST to ${this._api} returned ${String(response.status)} ${response.statusText}`,\n ErrorCode.TransportSendFailed,\n response.status,\n );\n this._emitter.emit('error', err);\n this._router.errorStream(turnId, err);\n }\n })\n .catch((error: unknown) => {\n const cause = error instanceof Ably.ErrorInfo ? error : undefined;\n const err = new Ably.ErrorInfo(\n `unable to send; HTTP POST to ${this._api} failed: ${error instanceof Error ? error.message : String(error)}`,\n ErrorCode.TransportSendFailed,\n 500,\n cause,\n );\n this._emitter.emit('error', err);\n this._router.errorStream(turnId, err);\n });\n\n return {\n stream,\n turnId,\n cancel: async () => this.cancel({ turnId }),\n optimisticMsgIds: [...msgIds],\n };\n }\n\n // Spec: AIT-CT7, AIT-CT7a\n async cancel(filter?: CancelFilter): Promise<void> {\n if (this._state === ClientTransportState.CLOSED) return;\n const resolved = filter ?? { own: true };\n this._logger.debug('ClientTransport.cancel();', { filter: resolved });\n await this._publishCancel(resolved);\n this._closeMatchingTurnStreams(resolved);\n }\n\n stageEvents(msgId: string, events: TEvent[]): void {\n this._logger.trace('ClientTransport.stageEvents();', { msgId, eventCount: events.length });\n if (this._state === ClientTransportState.CLOSED) {\n this._logger.warn('ClientTransport.stageEvents(); transport is closed', { msgId });\n return;\n }\n if (!this._tree.getNode(msgId)) {\n this._logger.warn('ClientTransport.stageEvents(); msgId not found in tree', { msgId });\n return;\n }\n if (events.length === 0) return;\n const node: EventsNode<TEvent> = { kind: 'event', msgId, events };\n // Apply immediately so any subsequent useMessageSync / tree observer\n // sees the merged state — no window where the staged event can be\n // clobbered by an interleaved observer turn update.\n this._applyEventsToTree([node]);\n this._pendingLocalEvents.push(node);\n }\n\n stageMessage(msgId: string, message: TMessage): void {\n this._logger.trace('ClientTransport.stageMessage();', { msgId });\n if (this._state === ClientTransportState.CLOSED) {\n this._logger.warn('ClientTransport.stageMessage(); transport is closed', { msgId });\n return;\n }\n const existing = this._tree.getNode(msgId);\n if (!existing) {\n this._logger.warn('ClientTransport.stageMessage(); msgId not found in tree', { msgId });\n return;\n }\n // Preserve structural metadata; only the message body changes.\n this._tree.upsert(msgId, message, existing.headers, existing.serial);\n }\n\n // Apply events to the tree using the codec's accumulator. Shared by\n // stageEvents (local staging) and _internalSend (external eventNodes\n // arriving via view.update).\n private _applyEventsToTree(eventNodes: EventsNode<TEvent>[]): void {\n for (const node of eventNodes) {\n const existingNode = this._tree.getNode(node.msgId);\n if (!existingNode) continue;\n const outputs = node.events.map((event) => ({\n kind: 'event' as const,\n event,\n messageId: node.msgId,\n }));\n const accumulator = this._codec.createAccumulator();\n accumulator.initMessage(node.msgId, existingNode.message);\n accumulator.processOutputs(outputs);\n const updatedMsg = accumulator.messages.at(-1);\n if (updatedMsg) {\n this._tree.upsert(node.msgId, updatedMsg, existingNode.headers, existingNode.serial);\n }\n }\n }\n\n // Spec: AIT-CT18\n async waitForTurn(filter?: CancelFilter): Promise<void> {\n if (this._state === ClientTransportState.CLOSED) return;\n const resolved = filter ?? { own: true };\n const remaining = this._getMatchingTurnIds(resolved);\n if (remaining.size === 0) return;\n\n this._logger.debug('ClientTransport.waitForTurn();', { turnIds: [...remaining] });\n\n return new Promise<void>((resolve) => {\n let resolved = false;\n const done = (): void => {\n if (resolved) return;\n resolved = true;\n unsub();\n const idx = this._closeResolvers.indexOf(done);\n if (idx !== -1) this._closeResolvers.splice(idx, 1);\n resolve();\n };\n\n const unsub = this._tree.on('turn', (event: TurnLifecycleEvent) => {\n if (event.type !== EVENT_TURN_END) return;\n remaining.delete(event.turnId);\n if (remaining.size === 0) done();\n });\n\n // Resolve on transport close to prevent leaked subscriptions\n this._closeResolvers.push(done);\n });\n }\n\n // Spec: AIT-CT8, AIT-CT8c, AIT-CT8d\n on(event: 'error', handler: (error: Ably.ErrorInfo) => void): () => void {\n if (this._state === ClientTransportState.CLOSED) return noopUnsubscribe;\n // CAST: the overload signature enforces the correct handler type.\n const cb = handler as (arg: ClientTransportEventsMap[keyof ClientTransportEventsMap]) => void;\n this._emitter.on(event, cb);\n return () => {\n this._emitter.off(event, cb);\n };\n }\n\n // Spec: AIT-CT12, AIT-CT12a, AIT-CT12b, AIT-CT10c\n async close(options?: CloseOptions): Promise<void> {\n if (this._state === ClientTransportState.CLOSED) return;\n this._state = ClientTransportState.CLOSED;\n this._logger.info('ClientTransport.close();');\n\n // Best-effort cancel publish before tearing down local state\n if (options?.cancel) {\n try {\n await this._publishCancel(options.cancel);\n } catch {\n // Swallow: cancel is best-effort during teardown\n }\n this._closeMatchingTurnStreams(options.cancel);\n }\n\n this._channel.unsubscribe(this._onMessage);\n this._channel.off(this._onChannelStateChange);\n\n // Close any remaining active streams\n for (const turnId of this._ownTurnIds) {\n this._router.closeStream(turnId);\n }\n\n this._turnObservers.clear();\n this._emitter.off();\n for (const v of this._views) v.close();\n this._views.clear();\n for (const resolve of this._closeResolvers) resolve();\n this._closeResolvers.length = 0;\n this._ownTurnIds.clear();\n this._ownMsgIds.clear();\n this._turnMsgIds.clear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a client-side transport that manages conversation state over an Ably channel.\n *\n * Subscribes to the channel immediately (before attach per RTL7g). The caller should\n * ensure the channel is attached or will be attached shortly after creation.\n * @param options - Configuration for the client transport.\n * @returns A new {@link ClientTransport} instance.\n */\nexport const createClientTransport = <TEvent, TMessage>(\n options: ClientTransportOptions<TEvent, TMessage>,\n): ClientTransport<TEvent, TMessage> => new DefaultClientTransport(options);\n","/**\n * TransportProvider: creates a ClientTransport and makes it available to\n * descendants via TransportContext.\n *\n * Wraps children with Ably's ChannelProvider so the underlying channel\n * lifecycle is managed in one place. An inner component calls useChannel\n * to get the stable channel reference and creates the transport once on\n * first render (via useRef).\n *\n * If createClientTransport throws, the error is stored in the TransportSlot\n * (alongside an undefined transport) so that useClientTransport can surface it\n * as transportError without crashing the component tree.\n *\n * The transport is closed when the provider truly unmounts. The close is\n * scheduled as a microtask so that React Strict Mode's synchronous\n * remount cycle (mount → fake-unmount → remount) can cancel it before it\n * fires, avoiding unnecessary transport teardown in development.\n *\n * Multiple TransportProviders can be nested using distinct channelNames.\n * Each provider merges its slot into the parent record so descendants\n * can access all registered transports via useClientTransport(channelName).\n */\n\nimport * as Ably from 'ably';\nimport { ChannelProvider, useChannel } from 'ably/react';\nimport { type PropsWithChildren, type ReactNode, useContext, useEffect, useMemo, useRef } from 'react';\n\nimport { createClientTransport } from '../../core/transport/client-transport.js';\nimport type { ClientTransport, ClientTransportOptions } from '../../core/transport/types.js';\nimport { ErrorCode } from '../../errors.js';\nimport type { TransportSlot } from '../contexts/transport-context.js';\nimport { NearestTransportContext, TransportContext } from '../contexts/transport-context.js';\n\n/**\n * Props for {@link TransportProvider}.\n *\n * All {@link ClientTransportOptions} except `channel` (managed internally) plus `channelName`.\n */\nexport interface TransportProviderProps<TEvent, TMessage>\n extends Omit<ClientTransportOptions<TEvent, TMessage>, 'channel'>, PropsWithChildren {\n /** The Ably channel name to subscribe to. Also used as the context registry key. */\n channelName: string;\n}\n\n// Inner component: rendered inside ChannelProvider so useChannel resolves to\n// the channel created by the outer wrapper.\nconst TransportProviderInner = <TEvent, TMessage>({\n channelName,\n children,\n ...transportOptions\n}: TransportProviderProps<TEvent, TMessage>) => {\n const { channel } = useChannel({ channelName });\n const transportRef = useRef<ClientTransport<TEvent, TMessage> | undefined>(undefined);\n const transportChannelRef = useRef<string>(channelName);\n const transportsToDisposeRef = useRef<ClientTransport<unknown, unknown>[]>([]);\n const pendingCloseRef = useRef(false);\n const constructionErrorRef = useRef<Ably.ErrorInfo | undefined>(undefined);\n\n const alreadyCreatedOrFailed = !!transportRef.current || !!constructionErrorRef.current;\n\n if (!alreadyCreatedOrFailed || transportChannelRef.current !== channelName) {\n transportChannelRef.current = channelName;\n if (transportRef.current) transportsToDisposeRef.current.push(transportRef.current);\n try {\n transportRef.current = createClientTransport({ ...transportOptions, channel });\n constructionErrorRef.current = undefined;\n } catch (error) {\n transportRef.current = undefined;\n constructionErrorRef.current =\n error instanceof Ably.ErrorInfo\n ? error\n : new Ably.ErrorInfo('Unknown error while creating transport', ErrorCode.BadRequest, 400);\n }\n }\n\n const parentMap = useContext(TransportContext);\n\n // Capture ref values as locals so useMemo deps track changes correctly.\n // CAST: TransportContext stores transports with erased generics.\n // The generic types are fixed at the TransportProvider<TEvent, TMessage> boundary.\n const currentTransport = transportRef.current as ClientTransport<unknown, unknown> | undefined;\n const currentError = constructionErrorRef.current;\n\n const slot = useMemo<TransportSlot>(\n () => ({ transport: currentTransport, error: currentError }),\n [currentTransport, currentError],\n );\n\n const contextValue = useMemo(() => ({ ...parentMap, [channelName]: slot }), [channelName, parentMap, slot]);\n\n useEffect(\n () => () => {\n for (const transport of transportsToDisposeRef.current) void transport.close();\n },\n [channelName],\n );\n\n // Close the transport when the component truly unmounts. The close is\n // scheduled as a microtask: in React Strict Mode (dev) the component\n // remounts synchronously before any microtask can drain, so the remount's\n // effect setup resets pendingCloseRef.current = false and cancels the\n // close. On a real unmount no remount follows, the microtask fires, and\n // the transport is closed.\n useEffect(() => {\n pendingCloseRef.current = false;\n return () => {\n pendingCloseRef.current = true;\n void Promise.resolve().then(() => {\n if (pendingCloseRef.current) {\n void transportRef.current?.close();\n }\n });\n };\n }, []);\n\n return (\n <TransportContext.Provider value={contextValue}>\n <NearestTransportContext.Provider value={slot}>{children}</NearestTransportContext.Provider>\n </TransportContext.Provider>\n );\n};\n\n/**\n * Provide a {@link ClientTransport} to descendant components.\n *\n * Wraps children with Ably's `ChannelProvider` using `channelName`, creates a\n * transport from the resolved channel and the remaining options, and registers it\n * in `TransportContext` under `channelName`. Descendants call\n * {@link useClientTransport} with the same `channelName` to access the transport.\n *\n * If `createClientTransport` throws during construction, the error is surfaced\n * through `useClientTransport` as `transportError` — the component tree does not\n * crash and children are still rendered.\n *\n * ```tsx\n * <TransportProvider channelName=\"ai:demo\" codec={UIMessageCodec}>\n * <Chat />\n * </TransportProvider>\n *\n * // Inside Chat:\n * const { transport, transportError } = useClientTransport({ channelName: 'ai:demo' });\n * ```\n *\n * For multiple transports, nest providers with distinct channelNames:\n *\n * ```tsx\n * <TransportProvider channelName=\"ai:main\" codec={UIMessageCodec}>\n * <TransportProvider channelName=\"ai:aux\" codec={UIMessageCodec}>\n * <App />\n * </TransportProvider>\n * </TransportProvider>\n *\n * // Inside App:\n * const { transport: main } = useClientTransport({ channelName: 'ai:main' });\n * const { transport: aux } = useClientTransport({ channelName: 'ai:aux' });\n * ```\n * @param props - Provider configuration including `channelName`, `codec`, and all other {@link ClientTransportOptions}.\n * @returns A React element wrapping children with ChannelProvider and TransportContext.\n */\nexport const TransportProvider = <TEvent, TMessage>(props: TransportProviderProps<TEvent, TMessage>): ReactNode => (\n <ChannelProvider channelName={props.channelName}>\n <TransportProviderInner {...props} />\n </ChannelProvider>\n);\n","/**\n * useAblyMessages — reactive raw Ably message log from a ClientTransport.\n *\n * Accumulates raw Ably InboundMessages from the transport's tree\n * 'ably-message' event. Messages are appended in arrival order.\n *\n * When `transport` is omitted, defaults to the nearest\n * {@link TransportProvider}'s transport via context.\n * Pass `skip: true` to bypass all subscriptions and return an empty array.\n */\n\nimport type * as Ably from 'ably';\nimport { useContext, useEffect, useRef, useState } from 'react';\n\nimport type { ClientTransport } from '../core/transport/types.js';\nimport { NearestTransportContext } from './contexts/transport-context.js';\n\n/**\n * Subscribe to raw Ably message updates from a client transport's tree.\n * When `transport` is omitted, uses the nearest {@link TransportProvider}'s transport via context.\n * @param props - Options including optional `transport` and `skip`.\n * @param props.transport - Transport to subscribe to; defaults to the nearest provider.\n * @param props.skip - When `true`, skip all subscriptions and return an empty array.\n * @returns The accumulated raw Ably messages in chronological order.\n */\nexport const useAblyMessages = <TEvent, TMessage>({\n transport,\n skip,\n}: { transport?: ClientTransport<TEvent, TMessage>; skip?: boolean } = {}): Ably.InboundMessage[] => {\n const nearestSlot = useContext(NearestTransportContext);\n // CAST: NearestTransportContext stores transport with erased generics; types fixed at call site.\n const resolved = skip\n ? undefined\n : ((transport ?? nearestSlot?.transport) as ClientTransport<TEvent, TMessage> | undefined);\n\n const [messages, setMessages] = useState<Ably.InboundMessage[]>([]);\n const messagesRef = useRef<Ably.InboundMessage[]>([]);\n\n useEffect(() => {\n // Reset on transport change\n messagesRef.current = [];\n setMessages([]);\n\n if (!resolved) return;\n\n const unsub = resolved.tree.on('ably-message', (msg: Ably.InboundMessage) => {\n const next = [...messagesRef.current, msg];\n messagesRef.current = next;\n setMessages(next);\n });\n return unsub;\n }, [resolved]);\n\n return messages;\n};\n","/**\n * useActiveTurns: reactive view of active turns on the channel,\n * keyed by clientId.\n *\n * Subscribes to transport tree turn lifecycle events and maintains a\n * Map<clientId, Set<turnId>> that updates on every turn start/end.\n *\n * Uses tree (not view) so that all turns are tracked — including remote\n * turns whose messages haven't arrived yet.\n *\n * Generic — works with any codec, not tied to Vercel types.\n */\n\nimport { useContext, useEffect, useState } from 'react';\n\nimport { EVENT_TURN_START } from '../constants.js';\nimport type { ClientTransport, TurnLifecycleEvent } from '../core/transport/types.js';\nimport { NearestTransportContext } from './contexts/transport-context.js';\n\n/**\n * Returns a reactive Map of all active turns on the channel, keyed by clientId.\n * Updates when turns start or end. When `transport` is omitted, uses the nearest\n * {@link TransportProvider}'s transport via context.\n * @param props - Options including optional `transport`.\n * @param props.transport - Transport to track turns for; defaults to the nearest provider.\n * @returns A Map where keys are clientIds and values are Sets of active turnIds.\n */\nexport const useActiveTurns = <TEvent, TMessage>({\n transport,\n}: { transport?: ClientTransport<TEvent, TMessage> | null } = {}): Map<string, Set<string>> => {\n const nearestSlot = useContext(NearestTransportContext);\n // CAST: NearestTransportContext stores transport with erased generics; types fixed at call site.\n const resolved = (transport ?? nearestSlot?.transport) as ClientTransport<TEvent, TMessage> | undefined;\n\n const [turns, setTurns] = useState<Map<string, Set<string>>>(() => new Map());\n\n useEffect(() => {\n if (!resolved) return;\n\n // Initialize from current state\n setTurns(resolved.tree.getActiveTurnIds());\n\n const unsubscribe = resolved.tree.on('turn', (event: TurnLifecycleEvent) => {\n setTurns((prev) => {\n const next = new Map(prev);\n\n if (event.type === EVENT_TURN_START) {\n const set = new Set(next.get(event.clientId));\n set.add(event.turnId);\n next.set(event.clientId, set);\n } else {\n const existing = next.get(event.clientId);\n if (existing) {\n const updated = new Set(existing);\n updated.delete(event.turnId);\n if (updated.size === 0) {\n next.delete(event.clientId);\n } else {\n next.set(event.clientId, updated);\n }\n }\n }\n\n return next;\n });\n });\n\n return unsubscribe;\n }, [resolved]);\n\n return turns;\n};\n","/**\n * useClientTransport — read a ClientTransport from the nearest TransportProvider.\n *\n * The transport is created by {@link TransportProvider}, which also wraps the subtree\n * with Ably's `ChannelProvider`. This hook is a thin context reader — it does not\n * create or manage transport state.\n *\n * **Provider lookup**\n * - Omit `channelName` to use the innermost `TransportProvider` in the tree.\n * - Pass `channelName` to look up a specific provider by name.\n * - Pass `skip: true` to receive a stub transport that throws on any access —\n * safe to hold in state before auth or other conditions are ready.\n *\n * **Error handling**\n * - When no matching provider is found, or when the provider's `createClientTransport`\n * call threw, `transportError` is set on the returned object instead of throwing.\n * The component can render an error state without an error boundary.\n * - Pass `onError` to receive post-construction transport errors (e.g. send failures,\n * channel continuity loss) without wiring `transport.on('error', ...)` manually.\n */\n\nimport * as Ably from 'ably';\nimport { useContext, useEffect, useRef } from 'react';\n\nimport type { ClientTransport, Tree, View } from '../core/transport/types.js';\nimport { ErrorCode } from '../errors.js';\nimport { NearestTransportContext, TransportContext } from './contexts/transport-context.js';\n\nconst SKIPPED_TRANSPORT: ClientTransport<unknown, unknown> = {\n get tree(): Tree<unknown> {\n throw new Ably.ErrorInfo('unable to access tree; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n get view(): View<unknown, unknown> {\n throw new Ably.ErrorInfo('unable to access view; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n createView: (): View<unknown, unknown> => {\n throw new Ably.ErrorInfo('unable to create view; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n cancel: () => {\n throw new Ably.ErrorInfo('unable to cancel; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n stageEvents: () => {\n throw new Ably.ErrorInfo('unable to stage events; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n stageMessage: () => {\n throw new Ably.ErrorInfo('unable to stage message; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n waitForTurn: () => {\n throw new Ably.ErrorInfo('unable to wait for turn; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n on: () => {\n throw new Ably.ErrorInfo('unable to subscribe; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n close: () => {\n throw new Ably.ErrorInfo('unable to close; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n};\n\n/**\n * Return value of {@link useClientTransport}.\n *\n * `transport` is always a valid object. When `skip` is `true`, when no provider was\n * found, or when the provider's transport construction failed, `transport` is a stub\n * that throws {@link Ably.ErrorInfo} on every access.\n * Check `transportError` before using `transport` to avoid those throws.\n */\nexport interface ClientTransportHandle<TEvent, TMessage> {\n /**\n * The resolved transport.\n *\n * A throwing stub when `skip` is `true`, when no matching {@link TransportProvider}\n * was found in the tree, or when transport construction failed.\n */\n transport: ClientTransport<TEvent, TMessage>;\n /**\n * Set when no matching {@link TransportProvider} was found, when transport\n * construction failed, and `skip` is `false`.\n * `undefined` when the transport resolved successfully or when `skip` is `true`.\n */\n transportError?: Ably.ErrorInfo | undefined;\n}\n\n/**\n * Read a {@link ClientTransport} from the nearest {@link TransportProvider}.\n *\n * Returns `{ transport, transportError }`. When no provider is found or transport\n * construction failed, `transportError` is set and `transport` is a stub that throws\n * on access — the hook never throws during render.\n *\n * Pass `onError` to subscribe to post-construction transport errors\n * (e.g. {@link ErrorCode.TransportSendFailed}, {@link ErrorCode.ChannelContinuityLost})\n * without calling `transport.on('error', …)` manually. The subscription is\n * created when the transport resolves and removed on unmount.\n * @param props - Hook options.\n * @param props.channelName - Look up a specific provider by channel name; omit for the nearest.\n * @param props.skip - When `true`, return the stub transport immediately without reading context.\n * @param props.onError - Called whenever the resolved transport emits an error event.\n * @returns `{ transport, transportError }`.\n */\nexport const useClientTransport = <TEvent, TMessage>({\n channelName,\n skip,\n onError,\n}: {\n /**\n * Channel name passed to the enclosing {@link TransportProvider}.\n * Omit to use the nearest provider in the tree.\n */\n channelName?: string;\n /**\n * When `true`, skip context lookup and return a stub transport that throws on\n * any access. Use when a condition (auth, feature flag) is not yet resolved.\n */\n skip?: boolean;\n /**\n * Called whenever the resolved transport emits an error event.\n * The subscription is established once the transport resolves and\n * automatically removed on unmount or when the transport changes.\n */\n onError?: (error: Ably.ErrorInfo) => void;\n} = {}): ClientTransportHandle<TEvent, TMessage> => {\n const registry = useContext(TransportContext);\n const nearestSlot = useContext(NearestTransportContext);\n const errorCallbackRef = useRef(onError);\n errorCallbackRef.current = onError;\n\n // Compute the transport for the onError subscription *before* any conditional\n // returns to satisfy React's rules of hooks (no hooks in branches).\n // Erased generics — this ref is only used in the useEffect below.\n const resolvedForEffect: ClientTransport<unknown, unknown> | undefined = skip\n ? undefined\n : channelName === undefined\n ? nearestSlot?.transport\n : registry[channelName]?.transport;\n\n useEffect(() => {\n if (!resolvedForEffect) return;\n return resolvedForEffect.on('error', (errorInfo) => {\n errorCallbackRef.current?.(errorInfo);\n });\n }, [resolvedForEffect]);\n\n if (skip) {\n return {\n transport: SKIPPED_TRANSPORT as unknown as ClientTransport<TEvent, TMessage>,\n };\n }\n\n if (channelName !== undefined) {\n const slot = registry[channelName];\n if (slot) {\n if (slot.transport) {\n // CAST: TransportContext stores transports with erased generics.\n // The caller is responsible for using type parameters matching those of the TransportProvider.\n return {\n transport: slot.transport as unknown as ClientTransport<TEvent, TMessage>,\n };\n }\n // Provider exists but construction failed.\n return {\n transport: SKIPPED_TRANSPORT as unknown as ClientTransport<TEvent, TMessage>,\n transportError: slot.error,\n };\n }\n return {\n transport: SKIPPED_TRANSPORT as unknown as ClientTransport<TEvent, TMessage>,\n transportError: new Ably.ErrorInfo(\n `unable to use transport; no TransportProvider found for channelName \"${channelName}\"`,\n ErrorCode.BadRequest,\n 400,\n ),\n };\n }\n\n if (nearestSlot) {\n if (nearestSlot.transport) {\n // CAST: NearestTransportContext stores transport with erased generics; types fixed at call site.\n return {\n transport: nearestSlot.transport as unknown as ClientTransport<TEvent, TMessage>,\n };\n }\n // Nearest provider exists but construction failed.\n return {\n transport: SKIPPED_TRANSPORT as unknown as ClientTransport<TEvent, TMessage>,\n transportError: nearestSlot.error,\n };\n }\n\n return {\n transport: SKIPPED_TRANSPORT as unknown as ClientTransport<TEvent, TMessage>,\n transportError: new Ably.ErrorInfo(\n 'unable to use transport; no TransportProvider found in the tree',\n ErrorCode.BadRequest,\n 400,\n ),\n };\n};\n","/**\n * useView — reactive paginated view of the conversation.\n *\n * Subscribes to view updates and exposes the visible nodes, branch navigation,\n * write operations, pagination state, and a `loadOlder` callback. Pass `transport`\n * to use a transport's default view, or `view` to subscribe to a specific\n * {@link View} directly. When both are omitted, defaults to the nearest\n * {@link TransportProvider}'s transport via context.\n */\n\nimport * as Ably from 'ably';\nimport { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { ActiveTurn, ClientTransport, MessageNode, SendOptions, View } from '../core/transport/types.js';\nimport { ErrorCode } from '../errors.js';\nimport { NearestTransportContext } from './contexts/transport-context.js';\n\n/** Options for configuring the view's initial load behavior. */\nexport interface UseViewOptions {\n /** Maximum number of older messages to load per page. Defaults to 100. */\n limit?: number;\n}\n\n/** Handle for the paginated, branch-aware conversation view. */\nexport interface ViewHandle<TEvent, TMessage> {\n /** The visible domain messages along the selected branch. */\n messages: TMessage[];\n /** Visible conversation nodes along the selected branch. */\n nodes: MessageNode<TMessage>[];\n /** Whether there are older messages that can be revealed via `loadOlder`. */\n hasOlder: boolean;\n /** Whether a page load is currently in progress. */\n loading: boolean;\n /**\n * Set when the most recent `loadOlder` call failed.\n * Cleared automatically on the next successful load.\n * `undefined` when no error has occurred or when `skip` is `true`.\n */\n loadError: Ably.ErrorInfo | undefined;\n /**\n * Load older messages into the view. No-op if already loading.\n * On failure, `error` is set; on success, `error` is cleared.\n */\n loadOlder: () => Promise<void>;\n /** Select a sibling at a fork point by index. Triggers a view update with the new branch. */\n select: (msgId: string, index: number) => void;\n /** Index of the currently selected sibling at a fork point. */\n getSelectedIndex: (msgId: string) => number;\n /** Get all sibling messages at a fork point, ordered chronologically by serial. */\n getSiblings: (msgId: string) => TMessage[];\n /** Whether a message has sibling alternatives (i.e., show navigation arrows). */\n hasSiblings: (msgId: string) => boolean;\n /** Get a node by msgId, or undefined if not found. */\n getNode: (msgId: string) => MessageNode<TMessage> | undefined;\n /** Send one or more messages in the context of this view's selected branch. */\n send: (messages: TMessage | TMessage[], options?: SendOptions) => Promise<ActiveTurn<TEvent>>;\n /** Regenerate an assistant message, using this view's branch for history. */\n regenerate: (messageId: string, options?: SendOptions) => Promise<ActiveTurn<TEvent>>;\n /** Edit a user message, forking from this view's branch. */\n edit: (messageId: string, newMessages: TMessage | TMessage[], options?: SendOptions) => Promise<ActiveTurn<TEvent>>;\n /** Amend an existing message and start a continuation turn (e.g. tool results). */\n update: (msgId: string, events: TEvent[], options?: SendOptions) => Promise<ActiveTurn<TEvent>>;\n}\n\n/**\n * Subscribe to a view and return the visible node list with pagination, navigation, and write operations.\n *\n * `view` takes priority over `transport`. When neither is provided, the nearest\n * {@link TransportProvider}'s transport is used. When `limit` is provided, auto-loads\n * the first page on mount (SWR-style).\n * @param props - Options for selecting the view source and configuring auto-load.\n * @param props.transport - Client transport whose default view to subscribe to; defaults to the nearest provider.\n * @param props.view - A specific {@link View} to subscribe to directly. Takes priority over `transport`.\n * @param props.limit - Max older messages per page; when provided, auto-loads on mount.\n * @param props.skip - When `true`, skip all subscriptions and return an empty handle.\n * @returns A {@link ViewHandle} with nodes, pagination state, navigation, write operations, and loadOlder.\n */\nexport const useView = <TEvent, TMessage>({\n transport,\n view,\n limit,\n skip,\n}: {\n /** Client transport whose default view to subscribe to; defaults to the nearest provider when omitted. */\n transport?: ClientTransport<TEvent, TMessage> | null;\n /** A specific {@link View} to subscribe to directly. Takes priority over `transport`. */\n view?: View<TEvent, TMessage> | null;\n /** When provided, auto-loads the first page on mount. Omit for manual loading. */\n limit?: number;\n /** When `true`, skip all subscriptions and return an empty handle immediately. */\n skip?: boolean;\n} = {}): ViewHandle<TEvent, TMessage> => {\n const nearestSlot = useContext(NearestTransportContext);\n // CAST: NearestTransportContext stores transport with erased generics; types fixed at call site.\n const resolvedTransport = skip\n ? undefined\n : (transport ?? (nearestSlot?.transport as unknown as ClientTransport<TEvent, TMessage> | undefined));\n const resolvedView = skip ? undefined : (view ?? resolvedTransport?.view);\n\n const [nodes, setNodes] = useState<MessageNode<TMessage>[]>(() => resolvedView?.flattenNodes() ?? []);\n const [hasOlder, setHasOlder] = useState(() => resolvedView?.hasOlder() ?? false);\n const [loading, setLoading] = useState(false);\n const [loadError, setLoadError] = useState<Ably.ErrorInfo | undefined>();\n const loadingRef = useRef(false);\n\n // Auto-load first page on mount when limit is provided (SWR-style).\n // Fires once per view instance — subsequent changes to limit\n // only affect manual loadOlder() calls, not the initial auto-load.\n const autoLoad = limit !== undefined;\n const autoLoadedRef = useRef(false);\n\n // Subscribe to view updates\n useEffect(() => {\n if (!resolvedView) {\n setNodes([]);\n setHasOlder(false);\n setLoadError(undefined);\n return;\n }\n\n // Reset auto-load flag so the new view gets its first page loaded\n autoLoadedRef.current = false;\n\n // Sync initial state\n setNodes(resolvedView.flattenNodes());\n setHasOlder(resolvedView.hasOlder());\n setLoadError(undefined);\n\n const unsub = resolvedView.on('update', () => {\n setNodes(resolvedView.flattenNodes());\n setHasOlder(resolvedView.hasOlder());\n });\n return unsub;\n }, [resolvedView]);\n\n const loadOlder = useCallback(async () => {\n if (!resolvedView || loadingRef.current) return;\n loadingRef.current = true;\n setLoading(true);\n try {\n await resolvedView.loadOlder(limit);\n setLoadError(undefined);\n } catch (error) {\n if (error instanceof Ably.ErrorInfo) {\n setLoadError(error);\n } else {\n setLoadError(new Ably.ErrorInfo('Unknown error loading older messages', ErrorCode.BadRequest, 400));\n }\n } finally {\n loadingRef.current = false;\n setLoading(false);\n }\n }, [resolvedView, limit]);\n\n useEffect(() => {\n if (!autoLoad || autoLoadedRef.current || !resolvedView) return;\n autoLoadedRef.current = true;\n void loadOlder();\n }, [autoLoad, resolvedView, loadOlder]);\n\n const messages = useMemo(() => nodes.map((n) => n.message), [nodes]);\n\n // Branch navigation callbacks\n const select = useCallback(\n (msgId: string, index: number) => {\n resolvedView?.select(msgId, index);\n },\n [resolvedView],\n );\n\n const getSelectedIndex = useCallback((msgId: string) => resolvedView?.getSelectedIndex(msgId) ?? 0, [resolvedView]);\n\n const getSiblings = useCallback((msgId: string) => resolvedView?.getSiblings(msgId) ?? [], [resolvedView]);\n\n const hasSiblings = useCallback((msgId: string) => resolvedView?.hasSiblings(msgId) ?? false, [resolvedView]);\n\n const getNode = useCallback((msgId: string) => resolvedView?.getNode(msgId), [resolvedView]);\n\n // Write operation callbacks\n const send = useCallback(\n async (msgs: TMessage | TMessage[], opts?: SendOptions) => {\n if (!resolvedView)\n throw new Ably.ErrorInfo('unable to send; view is not available', ErrorCode.InvalidArgument, 400);\n return resolvedView.send(msgs, opts);\n },\n [resolvedView],\n );\n\n const regenerate = useCallback(\n async (messageId: string, opts?: SendOptions) => {\n if (!resolvedView)\n throw new Ably.ErrorInfo('unable to regenerate; view is not available', ErrorCode.InvalidArgument, 400);\n return resolvedView.regenerate(messageId, opts);\n },\n [resolvedView],\n );\n\n const edit = useCallback(\n async (messageId: string, newMessages: TMessage | TMessage[], opts?: SendOptions) => {\n if (!resolvedView)\n throw new Ably.ErrorInfo('unable to edit; view is not available', ErrorCode.InvalidArgument, 400);\n return resolvedView.edit(messageId, newMessages, opts);\n },\n [resolvedView],\n );\n\n const update = useCallback(\n async (msgId: string, events: TEvent[], opts?: SendOptions) => {\n if (!resolvedView)\n throw new Ably.ErrorInfo('unable to update; view is not available', ErrorCode.InvalidArgument, 400);\n return resolvedView.update(msgId, events, opts);\n },\n [resolvedView],\n );\n\n return {\n messages,\n nodes,\n hasOlder,\n loading,\n loadError,\n loadOlder,\n select,\n getSelectedIndex,\n getSiblings,\n hasSiblings,\n getNode,\n send,\n regenerate,\n edit,\n update,\n };\n};\n","/**\n * useCreateView — create an independent view with the same API as useView.\n *\n * Calls {@link ClientTransport.createView} to create an independent view over\n * the same conversation tree, then subscribes to it exactly like\n * {@link useView}. The view is closed automatically on unmount or when the\n * transport reference changes.\n *\n * Pass `null` or omit `transport` to defer creation (e.g. when a split pane is\n * collapsed). The returned handle has empty state until a transport is provided.\n * When `transport` is omitted entirely, defaults to the nearest\n * {@link TransportProvider}'s transport via context.\n * Pass `skip: true` to bypass all context reads and view creation entirely.\n */\n\nimport { useContext, useEffect, useState } from 'react';\n\nimport type { ClientTransport, View } from '../core/transport/types.js';\nimport { NearestTransportContext } from './contexts/transport-context.js';\nimport type { ViewHandle } from './use-view.js';\nimport { useView } from './use-view.js';\n\n/**\n * Create an independent {@link View} and subscribe to it.\n * Returns the same {@link ViewHandle} as {@link useView}, but backed by a\n * newly created view with its own branch selections and pagination state.\n * The view is closed on unmount or when the transport changes.\n * When `transport` is omitted, uses the nearest {@link TransportProvider}'s transport via context.\n * @param props - Options including optional `transport`, `limit` for auto-load, and `skip`.\n * @param props.transport - Transport to create a view from; defaults to the nearest provider.\n * @param props.limit - Max older messages per page; when provided, auto-loads on mount.\n * @param props.skip - When `true`, skip view creation and return an empty handle.\n * @returns A {@link ViewHandle} with nodes, pagination, navigation, and write operations.\n */\nexport const useCreateView = <TEvent, TMessage>({\n transport,\n limit,\n skip,\n}: {\n /** The transport to create a view from, or null/undefined to use the nearest provider. */\n transport?: ClientTransport<TEvent, TMessage> | null;\n /** When provided, auto-loads the first page on mount. Omit for manual load. */\n limit?: number;\n /** When `true`, skip view creation and return an empty handle immediately. */\n skip?: boolean;\n} = {}): ViewHandle<TEvent, TMessage> => {\n const nearestSlot = useContext(NearestTransportContext);\n // CAST: NearestTransportContext stores transport with erased generics; types fixed at call site.\n const resolved = skip\n ? undefined\n : ((transport ?? nearestSlot?.transport) as ClientTransport<TEvent, TMessage> | null | undefined);\n\n const [view, setView] = useState<View<TEvent, TMessage> | undefined>();\n\n useEffect(() => {\n if (!resolved) {\n setView(undefined);\n return;\n }\n const v = resolved.createView();\n setView(v);\n return () => {\n v.close();\n };\n }, [resolved]);\n\n return useView({ view, limit, skip });\n};\n","/**\n * useTree — stable structural query callbacks for a ClientTransport's tree.\n *\n * Returns a {@link TreeHandle} with methods to inspect the tree structure.\n * These are thin `useCallback` wrappers around `transport.tree` — no local\n * state or subscriptions. Branch navigation (select, getSelectedIndex) is\n * on {@link ViewHandle} from {@link useView}.\n *\n * When `transport` is omitted, defaults to the nearest\n * {@link TransportProvider}'s transport via context.\n */\n\nimport { useCallback, useContext } from 'react';\n\nimport type { ClientTransport, MessageNode } from '../core/transport/types.js';\nimport { NearestTransportContext } from './contexts/transport-context.js';\n\n/** Handle for querying the conversation tree structure. */\nexport interface TreeHandle<TMessage> {\n /** Get all sibling messages at a fork point, ordered chronologically by serial. */\n getSiblings: (msgId: string) => TMessage[];\n /** Whether a message has sibling alternatives (i.e., show navigation arrows). */\n hasSiblings: (msgId: string) => boolean;\n /** Get a node by msgId, or undefined if not found. */\n getNode: (msgId: string) => MessageNode<TMessage> | undefined;\n}\n\n/**\n * Provide stable structural query callbacks backed by the transport's tree.\n * When `transport` is omitted, uses the nearest {@link TransportProvider}'s transport via context.\n * @param props - Options including optional `transport`.\n * @param props.transport - Transport to read tree structure from; defaults to the nearest provider.\n * @returns A {@link TreeHandle} with structural query methods.\n */\nexport const useTree = <TEvent, TMessage>({\n transport,\n}: { transport?: ClientTransport<TEvent, TMessage> } = {}): TreeHandle<TMessage> => {\n const nearestSlot = useContext(NearestTransportContext);\n // CAST: NearestTransportContext stores transport with erased generics; types fixed at call site.\n const resolved = (transport ?? nearestSlot?.transport) as ClientTransport<TEvent, TMessage> | undefined;\n\n const getSiblings = useCallback((msgId: string) => resolved?.tree.getSiblings(msgId) ?? [], [resolved]);\n\n const hasSiblings = useCallback((msgId: string) => resolved?.tree.hasSiblings(msgId) ?? false, [resolved]);\n\n const getNode = useCallback((msgId: string) => resolved?.tree.getNode(msgId), [resolved]);\n\n return {\n getSiblings,\n hasSiblings,\n getNode,\n };\n};\n","/**\n * createTransportHooks: factory that captures TEvent and TMessage once and returns\n * a bundle of type-safe hooks + TransportProvider. Hook call sites need no type\n * parameters at every use — just call the hooks directly.\n * @example\n * // Once per app (e.g. in a shared transport.ts):\n * export const {\n * TransportProvider,\n * useClientTransport,\n * useView,\n * useActiveTurns,\n * } = createTransportHooks<UIMessageChunk, UIMessage>();\n *\n * // In page:\n * <TransportProvider channelName=\"ai:demo\" codec={UIMessageCodec}>\n * <Chat />\n * </TransportProvider>\n *\n * // In Chat — no type params needed, transport is implicit from nearest provider:\n * const { nodes } = useView({ limit: 30 });\n * const turns = useActiveTurns();\n */\n\nimport type * as Ably from 'ably';\nimport type { ComponentType } from 'react';\n\nimport type { ClientTransport, View } from '../core/transport/types.js';\nimport type { TransportProviderProps } from './contexts/transport-provider.js';\nimport { TransportProvider as _TransportProvider } from './contexts/transport-provider.js';\nimport { useAblyMessages as _useAblyMessages } from './use-ably-messages.js';\nimport { useActiveTurns as _useActiveTurns } from './use-active-turns.js';\nimport type { ClientTransportHandle } from './use-client-transport.js';\nimport { useClientTransport as _useClientTransport } from './use-client-transport.js';\nimport { useCreateView as _useCreateView } from './use-create-view.js';\nimport type { TreeHandle } from './use-tree.js';\nimport { useTree as _useTree } from './use-tree.js';\nimport type { ViewHandle } from './use-view.js';\nimport { useView as _useView } from './use-view.js';\n\n/**\n * Bundle of type-safe hooks and provider returned by {@link createTransportHooks}.\n *\n * `TEvent` and `TMessage` are baked in at factory creation time so no type params\n * are needed at hook call sites.\n */\nexport interface TransportHooks<TEvent, TMessage> {\n /**\n * `TransportProvider` narrowed to `TEvent`/`TMessage`. No JSX type params needed.\n */\n TransportProvider: ComponentType<TransportProviderProps<TEvent, TMessage>>;\n /**\n * Read the transport from context. No type params needed.\n *\n * Returns `{ transport, transportError }`. When no provider is found,\n * `transportError` is set and `transport` is a stub that throws on access —\n * the hook never throws during render.\n *\n * Pass `onError` to subscribe to post-construction transport errors\n * (e.g. send failures, channel continuity loss) without wiring\n * `transport.on('error', …)` manually.\n */\n useClientTransport: (props?: {\n /** Channel name to look up; omit to use the nearest {@link TransportProvider}. */\n channelName?: string;\n /** When `true`, return a stub transport that throws on any access. */\n skip?: boolean;\n /** Called whenever the resolved transport emits an error event. */\n onError?: (error: Ably.ErrorInfo) => void;\n }) => ClientTransportHandle<TEvent, TMessage>;\n /**\n * Subscribe to the nearest transport's view and return the visible node list with pagination.\n * Pass `transport` to use a transport's default view, `view` to subscribe to a specific view\n * directly. Pass `limit` to auto-load on mount. Pass `skip: true` for an empty handle.\n */\n useView: (props?: {\n /** Client transport whose default view to subscribe to; defaults to the nearest {@link TransportProvider}. */\n transport?: ClientTransport<TEvent, TMessage> | null;\n /** A specific {@link View} to subscribe to directly. Takes priority over `transport`. */\n view?: View<TEvent, TMessage> | null;\n /** When provided, auto-loads the first page on mount. */\n limit?: number;\n /** When `true`, skip all subscriptions and return an empty handle. */\n skip?: boolean;\n }) => ViewHandle<TEvent, TMessage>;\n /**\n * Track active turns across all clients on the channel.\n * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.\n */\n useActiveTurns: (props?: {\n /** Override transport; defaults to the nearest {@link TransportProvider}. */\n transport?: ClientTransport<TEvent, TMessage> | null;\n }) => Map<string, Set<string>>;\n /**\n * Navigate conversation branches in the transport tree.\n * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.\n */\n useTree: (props?: {\n /** Override transport; defaults to the nearest {@link TransportProvider}. */\n transport?: ClientTransport<TEvent, TMessage>;\n }) => TreeHandle<TMessage>;\n /**\n * Subscribe to raw Ably messages on the transport channel.\n * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.\n * Pass `skip: true` to return an empty array without subscribing.\n */\n useAblyMessages: (props?: {\n /** Override transport; defaults to the nearest {@link TransportProvider}. */\n transport?: ClientTransport<TEvent, TMessage>;\n /** When `true`, skip all subscriptions and return an empty array. */\n skip?: boolean;\n }) => Ably.InboundMessage[];\n /**\n * Create an independent view over the same tree.\n * Pass `transport` to override; defaults to the nearest {@link TransportProvider}.\n * Pass `skip: true` to return an empty handle without creating a view.\n */\n useCreateView: (props?: {\n /** Override transport; defaults to the nearest {@link TransportProvider}. */\n transport?: ClientTransport<TEvent, TMessage> | null;\n /** When provided, auto-loads the first page on mount. */\n limit?: number;\n /** When `true`, skip view creation and return an empty handle. */\n skip?: boolean;\n }) => ViewHandle<TEvent, TMessage>;\n}\n\n/**\n * Create a bundle of type-safe hooks and provider for a given `TEvent`/`TMessage` pair.\n *\n * `TEvent` and `TMessage` are captured at factory creation time; hook call sites need\n * no type parameters. The returned hooks are thin wrappers around the standalone hooks\n * with the types resolved.\n * @returns A {@link TransportHooks} bundle.\n */\nexport const createTransportHooks = <TEvent, TMessage>(): TransportHooks<TEvent, TMessage> => ({\n // CAST: TransportProvider is generic; factory narrows it to TEvent/TMessage.\n TransportProvider: _TransportProvider as ComponentType<TransportProviderProps<TEvent, TMessage>>,\n useClientTransport: (props) => _useClientTransport<TEvent, TMessage>(props ?? {}),\n useView: (props) => _useView<TEvent, TMessage>(props ?? {}),\n useActiveTurns: (props) => _useActiveTurns<TEvent, TMessage>(props ?? {}),\n useTree: (props) => _useTree<TEvent, TMessage>(props ?? {}),\n useAblyMessages: (props) => _useAblyMessages<TEvent, TMessage>(props ?? {}),\n useCreateView: (props) => _useCreateView<TEvent, TMessage>(props ?? {}),\n});\n","/**\n * Shared tool part transition logic for the Vercel AI SDK codec.\n *\n * Extracted from the accumulator so the tool output state transition logic\n * lives in one place, reusable by the accumulator and any other callers.\n */\n\nimport type * as AI from 'ai';\n\nimport { stripUndefined } from '../../utils.js';\n\n// ---------------------------------------------------------------------------\n// Tool output chunk type guard\n// ---------------------------------------------------------------------------\n\n/** The set of UIMessageChunk types that represent tool output transitions. */\nexport type ToolOutputChunk = Extract<\n AI.UIMessageChunk,\n { type: 'tool-output-available' | 'tool-output-error' | 'tool-output-denied' | 'tool-approval-request' }\n>;\n\n/**\n * Whether a UIMessageChunk is a tool output transition event.\n * @param chunk - The chunk to test.\n * @returns True if the chunk is a tool output transition type.\n */\nexport const isToolOutputChunk = (chunk: AI.UIMessageChunk): chunk is ToolOutputChunk =>\n chunk.type === 'tool-output-available' ||\n chunk.type === 'tool-output-error' ||\n chunk.type === 'tool-output-denied' ||\n chunk.type === 'tool-approval-request';\n\n// ---------------------------------------------------------------------------\n// Tool base helper\n// ---------------------------------------------------------------------------\n\n/** Fields shared by all DynamicToolUIPart state variants. */\ninterface ToolBaseFields {\n type: 'dynamic-tool';\n toolName: string;\n toolCallId: string;\n title?: string;\n providerExecuted?: boolean;\n}\n\n/**\n * Extract the state-independent base fields for a DynamicToolUIPart.\n * Works with both chunks (tool-input-start, etc.) and existing parts.\n * @param source - Any object containing the required tool identity fields.\n * @param source.toolCallId - The tool call identifier.\n * @param source.toolName - The tool name.\n * @param source.title - Optional display title.\n * @param source.providerExecuted - Whether the provider executed the tool.\n * @returns Base fields shared across all DynamicToolUIPart state variants.\n */\nexport const toolBase = (source: {\n toolCallId: string;\n toolName: string;\n title?: string;\n providerExecuted?: boolean;\n}): ToolBaseFields =>\n stripUndefined({\n type: 'dynamic-tool' as const,\n toolCallId: source.toolCallId,\n toolName: source.toolName,\n title: source.title,\n providerExecuted: source.providerExecuted,\n });\n\n// ---------------------------------------------------------------------------\n// Tool part transition\n// ---------------------------------------------------------------------------\n\n/**\n * Transition a DynamicToolUIPart to a new state based on a tool output chunk.\n * Pure function — does not mutate the input part.\n * @param part - The existing tool part to transition.\n * @param chunk - The tool output chunk describing the transition.\n * @returns A new DynamicToolUIPart in the target state.\n */\nexport const transitionToolPart = (part: AI.DynamicToolUIPart, chunk: ToolOutputChunk): AI.DynamicToolUIPart => {\n const base = toolBase(part);\n\n switch (chunk.type) {\n case 'tool-output-available': {\n return stripUndefined({\n ...base,\n state: 'output-available' as const,\n input: part.input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n });\n }\n\n case 'tool-output-error': {\n return {\n ...base,\n state: 'output-error',\n input: part.input,\n errorText: chunk.errorText,\n };\n }\n\n case 'tool-output-denied': {\n return {\n ...base,\n state: 'output-denied',\n input: part.input,\n approval: { id: '', approved: false },\n };\n }\n\n case 'tool-approval-request': {\n return {\n ...base,\n state: 'approval-requested',\n input: part.input,\n approval: { id: chunk.approvalId },\n };\n }\n }\n};\n","/**\n * Vercel AI SDK Message Accumulator\n *\n * Builds and maintains a UIMessage[] list from decoder outputs.\n * Implements MessageAccumulator<UIMessageChunk, UIMessage>.\n *\n * The accumulator consumes DecoderOutput[] from the decoder and groups\n * streaming events into UIMessage objects using lifecycle boundaries\n * (start/finish). Complete messages (from writeMessages) are inserted\n * directly.\n *\n * Multiple messages can be in-progress concurrently — each is identified\n * by the `messageId` field on DecoderOutput (read from x-ably-msg-id).\n */\n\nimport type * as AI from 'ai';\n\nimport type { DecoderOutput, MessageAccumulator } from '../../core/codec/types.js';\nimport { stripUndefined } from '../../utils.js';\nimport { toolBase, transitionToolPart } from './tool-transitions.js';\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Status of a streamed message (text, reasoning, or tool-input). */\ntype StreamStatus = 'streaming' | 'finished' | 'aborted';\n\n/**\n * Tracks an in-progress tool part's position and accumulated streaming input.\n * Text and reasoning parts don't need this — we write directly to the part.\n * Tool parts need the extra `inputText` buffer because deltas arrive as raw\n * JSON fragments that must be accumulated before parsing.\n */\ninterface ToolPartTracker {\n /** Index in the message's parts array. */\n partIndex: number;\n /** Accumulated streaming input text (for JSON parsing on completion). */\n inputText: string;\n}\n\n/** Bundled per-message state for an in-progress message. */\ninterface ActiveMessageState {\n message: AI.UIMessage;\n textStreams: DeltaStreamTracker;\n reasoningStreams: DeltaStreamTracker;\n toolTrackers: Record<string, ToolPartTracker>;\n streamStatus: Map<string, StreamStatus>;\n}\n\n// ---------------------------------------------------------------------------\n// DeltaStreamTracker — manages text or reasoning stream accumulation\n// ---------------------------------------------------------------------------\n\n/**\n * Tracks in-progress text or reasoning streams within a single message.\n * Owns the mapping from stream ID to part index, enforcing the pairing\n * of part type and index map by construction.\n */\nclass DeltaStreamTracker {\n private readonly _partType: 'text' | 'reasoning';\n private _activeIndex = new Map<string, number>();\n\n constructor(partType: 'text' | 'reasoning') {\n this._partType = partType;\n }\n\n start(id: string, msg: AI.UIMessage, streamStatus: Map<string, StreamStatus>): void {\n this._activeIndex.set(id, msg.parts.length);\n msg.parts.push({ type: this._partType, text: '' });\n streamStatus.set(id, 'streaming');\n }\n\n delta(id: string, msg: AI.UIMessage, text: string): void {\n const idx = this._activeIndex.get(id);\n if (idx === undefined) return;\n const part = msg.parts[idx];\n if (part?.type === this._partType) {\n part.text += text;\n }\n }\n\n end(id: string, streamStatus: Map<string, StreamStatus>): void {\n streamStatus.set(id, 'finished');\n this._activeIndex.delete(id);\n }\n\n reset(): void {\n this._activeIndex = new Map();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\nclass DefaultUIMessageAccumulator implements MessageAccumulator<AI.UIMessageChunk, AI.UIMessage> {\n private readonly _messageList: AI.UIMessage[] = [];\n private readonly _activeMessages = new Map<string, ActiveMessageState>();\n\n get messages(): AI.UIMessage[] {\n return this._messageList;\n }\n\n get completedMessages(): AI.UIMessage[] {\n const activeSet = new Set<AI.UIMessage>();\n for (const state of this._activeMessages.values()) {\n activeSet.add(state.message);\n }\n return this._messageList.filter((msg) => !activeSet.has(msg));\n }\n\n get hasActiveStream(): boolean {\n for (const state of this._activeMessages.values()) {\n for (const status of state.streamStatus.values()) {\n if (status === 'streaming') return true;\n }\n }\n return false;\n }\n\n processOutputs(outputs: DecoderOutput<AI.UIMessageChunk, AI.UIMessage>[]): void {\n for (const output of outputs) {\n if (output.kind === 'message') {\n this._messageList.push(output.message);\n } else if (output.messageId !== undefined) {\n this._processEvent(output.event, output.messageId);\n }\n }\n }\n\n updateMessage(message: AI.UIMessage): void {\n const idx = this._messageList.findIndex((m) => m.id === message.id);\n if (idx !== -1) {\n this._messageList[idx] = message;\n }\n }\n\n initMessage(messageId: string, message: AI.UIMessage): void {\n const existing = this._activeMessages.get(messageId);\n\n if (existing) {\n // Already active — sync with the externally updated message.\n // Replace the message and rebuild tool trackers so the accumulator\n // reflects updates (e.g. cross-turn amendments applied to the tree)\n // that happened outside the streaming flow.\n const cloned = structuredClone(message);\n const listIdx = this._messageList.indexOf(existing.message);\n existing.message = cloned;\n if (listIdx !== -1) {\n this._messageList[listIdx] = cloned;\n }\n existing.toolTrackers = {};\n for (let i = 0; i < cloned.parts.length; i++) {\n const part = cloned.parts[i];\n if (part?.type === 'dynamic-tool') {\n existing.toolTrackers[part.toolCallId] = { partIndex: i, inputText: '' };\n existing.streamStatus.set(part.toolCallId, 'finished');\n }\n }\n return;\n }\n\n // Not active — create tracking state from the existing message.\n const cloned = structuredClone(message);\n const toolTrackers: Record<string, ToolPartTracker> = {};\n const streamStatus = new Map<string, StreamStatus>();\n\n for (let i = 0; i < cloned.parts.length; i++) {\n const part = cloned.parts[i];\n if (part?.type === 'dynamic-tool') {\n toolTrackers[part.toolCallId] = { partIndex: i, inputText: '' };\n streamStatus.set(part.toolCallId, 'finished');\n }\n }\n\n const state: ActiveMessageState = {\n message: cloned,\n textStreams: new DeltaStreamTracker('text'),\n reasoningStreams: new DeltaStreamTracker('reasoning'),\n toolTrackers,\n streamStatus,\n };\n\n this._activeMessages.set(messageId, state);\n\n // If this message is already in the list (completed previously),\n // replace in-place. Otherwise push as a new entry.\n const existingIdx = this._messageList.findIndex((m) => m.id === message.id);\n if (existingIdx === -1) {\n this._messageList.push(state.message);\n } else {\n this._messageList[existingIdx] = state.message;\n }\n }\n\n completeMessage(messageId: string): void {\n this._activeMessages.delete(messageId);\n }\n\n // -------------------------------------------------------------------------\n // Shared helpers\n // -------------------------------------------------------------------------\n\n private _ensureActiveMessage(messageId: string): ActiveMessageState {\n const existing = this._activeMessages.get(messageId);\n if (existing) return existing;\n\n const state: ActiveMessageState = {\n message: { id: messageId, role: 'assistant', parts: [] },\n textStreams: new DeltaStreamTracker('text'),\n reasoningStreams: new DeltaStreamTracker('reasoning'),\n toolTrackers: {},\n streamStatus: new Map(),\n };\n this._activeMessages.set(messageId, state);\n this._messageList.push(state.message);\n return state;\n }\n\n /**\n * Look up a tracked tool part by toolCallId within a message state.\n * @param toolCallId - The tool call identifier to look up.\n * @param state - The active message state to search in.\n * @returns The tracker and current part, or undefined if not found.\n */\n private _getToolPart(\n toolCallId: string,\n state: ActiveMessageState,\n ): { tracker: ToolPartTracker; part: AI.DynamicToolUIPart } | undefined {\n const tracker = state.toolTrackers[toolCallId];\n if (!tracker) return undefined;\n\n const existing = state.message.parts[tracker.partIndex];\n if (existing?.type !== 'dynamic-tool') return undefined;\n\n return { tracker, part: existing };\n }\n\n // -------------------------------------------------------------------------\n // Event dispatch\n // -------------------------------------------------------------------------\n\n private _processEvent(chunk: AI.UIMessageChunk, messageId: string): void {\n switch (chunk.type) {\n case 'start':\n case 'start-step':\n case 'finish-step':\n case 'finish':\n case 'abort':\n case 'error':\n case 'message-metadata': {\n this._processLifecycle(chunk, messageId);\n break;\n }\n\n case 'text-start':\n case 'text-delta':\n case 'text-end':\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end': {\n this._processTextOrReasoning(chunk, messageId);\n break;\n }\n\n case 'tool-input-start':\n case 'tool-input-delta':\n case 'tool-input-available':\n case 'tool-input-error': {\n this._processToolInput(chunk, messageId);\n break;\n }\n\n case 'tool-output-available':\n case 'tool-output-error':\n case 'tool-output-denied':\n case 'tool-approval-request': {\n this._processToolOutput(chunk, messageId);\n break;\n }\n\n case 'file':\n case 'source-url':\n case 'source-document': {\n this._processContentPart(chunk, messageId);\n break;\n }\n\n default: {\n if (chunk.type.startsWith('data-')) {\n if (chunk.transient) break;\n\n const state = this._ensureActiveMessage(messageId);\n\n // CAST: chunk.type is `data-${string}` which satisfies DataUIPart,\n // but TypeScript cannot verify the template literal matches a\n // specific UIMessagePart variant at the type level.\n const dataPart = stripUndefined({\n type: chunk.type,\n id: chunk.id,\n data: chunk.data,\n }) as AI.UIMessage['parts'][number];\n\n if (chunk.id !== undefined) {\n const idx = state.message.parts.findIndex((p) => p.type === chunk.type && 'id' in p && p.id === chunk.id);\n if (idx !== -1) {\n state.message.parts[idx] = dataPart;\n break;\n }\n }\n\n state.message.parts.push(dataPart);\n }\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle events\n // -------------------------------------------------------------------------\n\n private _processLifecycle(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'start' | 'start-step' | 'finish-step' | 'finish' | 'abort' | 'error' | 'message-metadata' }\n >,\n messageId: string,\n ): void {\n switch (chunk.type) {\n case 'start': {\n const state = this._ensureActiveMessage(messageId);\n if (chunk.messageId) state.message.id = chunk.messageId;\n if (chunk.messageMetadata !== undefined) {\n state.message.metadata = chunk.messageMetadata;\n }\n break;\n }\n\n case 'start-step': {\n const state = this._ensureActiveMessage(messageId);\n state.message.parts.push({ type: 'step-start' });\n break;\n }\n\n case 'finish-step': {\n const state = this._activeMessages.get(messageId);\n if (state) {\n state.textStreams.reset();\n state.reasoningStreams.reset();\n }\n break;\n }\n\n case 'finish': {\n const state = this._activeMessages.get(messageId);\n if (state && chunk.messageMetadata !== undefined) {\n state.message.metadata = chunk.messageMetadata;\n }\n this._activeMessages.delete(messageId);\n break;\n }\n\n case 'abort': {\n const state = this._activeMessages.get(messageId);\n if (state) {\n for (const [id, status] of state.streamStatus) {\n if (status === 'streaming') {\n state.streamStatus.set(id, 'aborted');\n }\n }\n }\n this._activeMessages.delete(messageId);\n break;\n }\n\n case 'error': {\n break;\n }\n\n case 'message-metadata': {\n const state = this._activeMessages.get(messageId);\n if (state && chunk.messageMetadata !== undefined) {\n state.message.metadata = chunk.messageMetadata;\n }\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Text and reasoning streaming\n // -------------------------------------------------------------------------\n\n private _processTextOrReasoning(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'text-start' | 'text-delta' | 'text-end' | 'reasoning-start' | 'reasoning-delta' | 'reasoning-end' }\n >,\n messageId: string,\n ): void {\n const state = this._ensureActiveMessage(messageId);\n\n switch (chunk.type) {\n case 'text-start': {\n state.textStreams.start(chunk.id, state.message, state.streamStatus);\n break;\n }\n case 'text-delta': {\n state.textStreams.delta(chunk.id, state.message, chunk.delta);\n break;\n }\n case 'text-end': {\n state.textStreams.end(chunk.id, state.streamStatus);\n break;\n }\n case 'reasoning-start': {\n state.reasoningStreams.start(chunk.id, state.message, state.streamStatus);\n break;\n }\n case 'reasoning-delta': {\n state.reasoningStreams.delta(chunk.id, state.message, chunk.delta);\n break;\n }\n case 'reasoning-end': {\n state.reasoningStreams.end(chunk.id, state.streamStatus);\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Tool input streaming\n // -------------------------------------------------------------------------\n\n private _processToolInput(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'tool-input-start' | 'tool-input-delta' | 'tool-input-available' | 'tool-input-error' }\n >,\n messageId: string,\n ): void {\n switch (chunk.type) {\n case 'tool-input-start': {\n const state = this._ensureActiveMessage(messageId);\n const partIndex = state.message.parts.length;\n state.message.parts.push({ ...toolBase(chunk), state: 'input-streaming', input: undefined });\n state.toolTrackers[chunk.toolCallId] = { partIndex, inputText: '' };\n state.streamStatus.set(chunk.toolCallId, 'streaming');\n break;\n }\n\n case 'tool-input-delta': {\n const state = this._ensureActiveMessage(messageId);\n const tracker = state.toolTrackers[chunk.toolCallId];\n if (!tracker) break;\n tracker.inputText += chunk.inputTextDelta;\n\n let parsedInput: unknown;\n try {\n // CAST: JSON.parse returns any; unknown is the safe trust-boundary type.\n parsedInput = JSON.parse(tracker.inputText) as unknown;\n } catch {\n parsedInput = undefined;\n }\n\n const found = this._getToolPart(chunk.toolCallId, state);\n if (!found) break;\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'input-streaming',\n input: parsedInput,\n };\n break;\n }\n\n case 'tool-input-available': {\n const state = this._ensureActiveMessage(messageId);\n const found = this._getToolPart(chunk.toolCallId, state);\n if (!found) break;\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'input-available',\n input: chunk.input,\n };\n state.streamStatus.set(chunk.toolCallId, 'finished');\n break;\n }\n\n case 'tool-input-error': {\n const state = this._ensureActiveMessage(messageId);\n const found = this._getToolPart(chunk.toolCallId, state);\n if (found) {\n state.message.parts[found.tracker.partIndex] = {\n ...toolBase(found.part),\n state: 'output-error',\n input: chunk.input,\n errorText: chunk.errorText,\n };\n } else {\n const partIndex = state.message.parts.length;\n state.message.parts.push({\n ...toolBase(chunk),\n state: 'output-error',\n input: chunk.input,\n errorText: chunk.errorText,\n });\n state.toolTrackers[chunk.toolCallId] = { partIndex, inputText: '' };\n }\n state.streamStatus.set(chunk.toolCallId, 'finished');\n break;\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Tool output transitions\n // -------------------------------------------------------------------------\n\n private _processToolOutput(\n chunk: Extract<\n AI.UIMessageChunk,\n { type: 'tool-output-available' | 'tool-output-error' | 'tool-output-denied' | 'tool-approval-request' }\n >,\n messageId: string,\n ): void {\n const state = this._ensureActiveMessage(messageId);\n const found = this._getToolPart(chunk.toolCallId, state);\n if (!found) return;\n\n state.message.parts[found.tracker.partIndex] = transitionToolPart(found.part, chunk);\n }\n\n // -------------------------------------------------------------------------\n // Content parts\n // -------------------------------------------------------------------------\n\n private _processContentPart(\n chunk: Extract<AI.UIMessageChunk, { type: 'file' | 'source-url' | 'source-document' }>,\n messageId: string,\n ): void {\n const state = this._ensureActiveMessage(messageId);\n\n switch (chunk.type) {\n case 'file': {\n state.message.parts.push({ type: 'file', mediaType: chunk.mediaType, url: chunk.url });\n break;\n }\n\n case 'source-url': {\n state.message.parts.push(\n stripUndefined({\n type: 'source-url' as const,\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n }),\n );\n break;\n }\n\n case 'source-document': {\n state.message.parts.push(\n stripUndefined({\n type: 'source-document' as const,\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n }),\n );\n break;\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel AI SDK accumulator that builds UIMessage[] from decoder outputs.\n * @returns A {@link MessageAccumulator} for UIMessageChunk/UIMessage.\n */\nexport const createAccumulator = (): MessageAccumulator<AI.UIMessageChunk, AI.UIMessage> =>\n new DefaultUIMessageAccumulator();\n","/**\n * Decoder core — action dispatch and serial tracking machinery.\n *\n * Handles the Ably message action patterns (create, append, update, delete)\n * and delegates to domain-specific hooks for event building and discrete\n * event decoding.\n *\n * Domain decoders call `createDecoderCore(hooks, options)` and provide hooks\n * for stream classification, event building, and discrete decoding.\n */\n\nimport type * as Ably from 'ably';\n\nimport { HEADER_MSG_ID, HEADER_STATUS, HEADER_STREAM, HEADER_STREAM_ID } from '../../constants.js';\nimport type { Logger } from '../../logger.js';\nimport { getHeaders } from '../../utils.js';\nimport type { DecoderOutput, MessagePayload, StreamTrackerState } from './types.js';\n\n/**\n * Wrap a domain event as a single-element decoder output array.\n * @param event - The domain event to wrap.\n * @returns A single-element array containing the event as a decoder output.\n */\nexport const eventOutput = <TEvent, TMessage>(event: TEvent): DecoderOutput<TEvent, TMessage>[] => [\n { kind: 'event', event },\n];\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/** Options for creating a decoder core. */\nexport interface DecoderCoreOptions {\n /** Called when a tracked stream is replaced (non-prefix update). Receives the tracker with updated state. */\n onStreamUpdate?: (tracker: StreamTrackerState) => void;\n /** Called when a message is deleted. Receives the serial and tracker (if one exists). */\n onStreamDelete?: (serial: string, tracker: StreamTrackerState | undefined) => void;\n /** Logger instance for diagnostic output. */\n logger?: Logger;\n}\n\n// ---------------------------------------------------------------------------\n// Domain hooks\n// ---------------------------------------------------------------------------\n\n/** Hooks that a domain codec provides to the decoder core for stream classification and event building. */\nexport interface DecoderCoreHooks<TEvent, TMessage> {\n /**\n * Build domain events emitted when a new stream starts. May return multiple\n * events (e.g. a start event and a start-step event).\n */\n buildStartEvents(tracker: StreamTrackerState): DecoderOutput<TEvent, TMessage>[];\n\n /** Build domain events for a text delta received on a stream. */\n buildDeltaEvents(tracker: StreamTrackerState, delta: string): DecoderOutput<TEvent, TMessage>[];\n\n /**\n * Build domain events emitted when a stream finishes (x-ably-status:finished).\n * Not called for aborted streams. The closing headers may differ from\n * tracker.headers if the closing append carried updated headers.\n */\n buildEndEvents(\n tracker: StreamTrackerState,\n closingHeaders: Record<string, string>,\n ): DecoderOutput<TEvent, TMessage>[];\n\n /**\n * Decode a discrete message (message.create where x-ably-stream is \"false\",\n * or a non-streamable first-contact update). Handles user messages, lifecycle\n * events, tool lifecycle, data-*, etc.\n */\n decodeDiscrete(input: MessagePayload): DecoderOutput<TEvent, TMessage>[];\n}\n\n// ---------------------------------------------------------------------------\n// Interface\n// ---------------------------------------------------------------------------\n\n/** The decoder core returned by {@link createDecoderCore}. */\nexport interface DecoderCore<TEvent, TMessage> {\n /** Decode a single Ably message into zero or more domain outputs. */\n decode(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[];\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CD7\nclass DefaultDecoderCore<TEvent, TMessage> implements DecoderCore<TEvent, TMessage> {\n private readonly _hooks: DecoderCoreHooks<TEvent, TMessage>;\n private readonly _logger: Logger | undefined;\n private readonly _onStreamUpdate: ((tracker: StreamTrackerState) => void) | undefined;\n private readonly _onStreamDelete: ((serial: string, tracker: StreamTrackerState | undefined) => void) | undefined;\n private readonly _serialState = new Map<string, StreamTrackerState>();\n\n constructor(hooks: DecoderCoreHooks<TEvent, TMessage>, options: DecoderCoreOptions = {}) {\n this._hooks = hooks;\n this._onStreamUpdate = options.onStreamUpdate;\n this._onStreamDelete = options.onStreamDelete;\n this._logger = options.logger?.withContext({ component: 'DecoderCore' });\n }\n\n decode(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const action = message.action;\n\n this._logger?.trace('DefaultDecoderCore.decode();', { action, serial: message.serial, name: message.name });\n\n let outputs: DecoderOutput<TEvent, TMessage>[];\n\n switch (action) {\n // Spec: AIT-CD7a\n case 'message.create': {\n const payload = this._toPayload(message);\n\n outputs =\n payload.headers?.[HEADER_STREAM] === 'true'\n ? this._decodeStreamedCreate(payload, message.serial)\n : this._hooks.decodeDiscrete(payload);\n break;\n }\n\n case 'message.append': {\n outputs = this._decodeAppend(message);\n break;\n }\n\n case 'message.update': {\n outputs = this._decodeUpdate(message);\n break;\n }\n\n case 'message.delete': {\n outputs = this._decodeDelete(message);\n break;\n }\n\n default: {\n return [];\n }\n }\n\n // Tag all event outputs with the message ID from x-ably-msg-id for accumulator correlation.\n const messageId = getHeaders(message)[HEADER_MSG_ID];\n if (messageId) {\n for (const output of outputs) {\n if (output.kind === 'event') {\n output.messageId = messageId;\n }\n }\n }\n\n return outputs;\n }\n\n // -------------------------------------------------------------------------\n // Private: extract MessagePayload\n // -------------------------------------------------------------------------\n\n private _toPayload(message: Ably.InboundMessage): MessagePayload {\n return {\n name: message.name ?? '',\n // CAST: Ably SDK types `data` as `any`; cast to unknown is the safe boundary type.\n data: message.data as unknown,\n headers: getHeaders(message),\n };\n }\n\n /**\n * Extract string data from an Ably message, for stream accumulation paths.\n * @param message - The Ably message to extract string data from.\n * @returns The string data, or empty string if data is not a string.\n */\n private _stringData(message: Ably.InboundMessage): string {\n return typeof message.data === 'string' ? message.data : '';\n }\n\n // -------------------------------------------------------------------------\n // Private: safe callback invocation\n // -------------------------------------------------------------------------\n\n private _invokeOnStreamUpdate(tracker: StreamTrackerState): void {\n if (!this._onStreamUpdate) return;\n try {\n this._onStreamUpdate(tracker);\n } catch (error) {\n this._logger?.error('DefaultDecoderCore._invokeOnStreamUpdate(); callback threw', { error });\n }\n }\n\n private _invokeOnStreamDelete(serial: string, tracker: StreamTrackerState | undefined): void {\n if (!this._onStreamDelete) return;\n try {\n this._onStreamDelete(serial, tracker);\n } catch (error) {\n this._logger?.error('DefaultDecoderCore._invokeOnStreamDelete(); callback threw', { error });\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: streamed message create\n // -------------------------------------------------------------------------\n\n private _decodeStreamedCreate(\n payload: MessagePayload,\n serial: string | undefined,\n ): DecoderOutput<TEvent, TMessage>[] {\n if (!serial) return [];\n\n const streamId = payload.headers?.[HEADER_STREAM_ID] ?? '';\n const h = payload.headers ?? {};\n\n const tracker: StreamTrackerState = {\n name: payload.name,\n streamId,\n accumulated: '',\n headers: { ...h },\n closed: false,\n };\n this._serialState.set(serial, tracker);\n\n this._logger?.debug('DefaultDecoderCore._decodeStreamedCreate(); new stream', {\n name: payload.name,\n streamId,\n serial,\n });\n\n return this._hooks.buildStartEvents(tracker);\n }\n\n // -------------------------------------------------------------------------\n // Private: append handling\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD8\n private _decodeAppend(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const serial = message.serial;\n if (!serial) return [];\n\n const tracker = this._serialState.get(serial);\n if (!tracker) {\n // Unknown serial on append — treat as first-contact update\n return this._decodeUpdate(message);\n }\n\n const h = getHeaders(message);\n const delta = typeof message.data === 'string' ? message.data : '';\n const status = h[HEADER_STATUS];\n const outputs: DecoderOutput<TEvent, TMessage>[] = [];\n\n if (delta.length > 0) {\n tracker.accumulated += delta;\n outputs.push(...this._hooks.buildDeltaEvents(tracker, delta));\n }\n\n if (status === 'finished' && !tracker.closed) {\n tracker.closed = true;\n outputs.push(...this._hooks.buildEndEvents(tracker, h));\n this._logger?.debug('DefaultDecoderCore._decodeAppend(); stream finished', { streamId: tracker.streamId });\n } else if (status === 'aborted' && !tracker.closed) {\n tracker.closed = true;\n this._logger?.debug('DefaultDecoderCore._decodeAppend(); stream aborted', { streamId: tracker.streamId });\n }\n\n return outputs;\n }\n\n // -------------------------------------------------------------------------\n // Private: update handling (first-contact, prefix-match, replacement)\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD9\n private _decodeUpdate(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const serial = message.serial;\n if (!serial) return [];\n\n const payload = this._toPayload(message);\n const h = payload.headers ?? {};\n const isStreamed = h[HEADER_STREAM] === 'true';\n const status = h[HEADER_STATUS];\n\n const tracker = this._serialState.get(serial);\n\n if (!tracker) {\n return this._decodeFirstContact(payload, isStreamed, status, serial);\n }\n\n // Updates to tracked streams use string data for prefix-match accumulation\n const data = this._stringData(message);\n\n // --- Tracker exists: prefix-match or replacement ---\n if (data.startsWith(tracker.accumulated)) {\n const delta = data.slice(tracker.accumulated.length);\n const outputs: DecoderOutput<TEvent, TMessage>[] = [];\n\n if (delta.length > 0) {\n tracker.accumulated = data;\n outputs.push(...this._hooks.buildDeltaEvents(tracker, delta));\n }\n\n if (status === 'finished' && !tracker.closed) {\n tracker.closed = true;\n outputs.push(...this._hooks.buildEndEvents(tracker, h));\n } else if (status === 'aborted' && !tracker.closed) {\n tracker.closed = true;\n }\n\n return outputs;\n }\n\n // --- Replacement (NOT a prefix match) ---\n tracker.accumulated = data;\n tracker.headers = { ...h };\n\n this._invokeOnStreamUpdate(tracker);\n\n return [];\n }\n\n private _decodeFirstContact(\n payload: MessagePayload,\n isStreamed: boolean,\n status: string | undefined,\n serial: string,\n ): DecoderOutput<TEvent, TMessage>[] {\n // Non-streamed messages are discrete\n if (!isStreamed) {\n return this._hooks.decodeDiscrete(payload);\n }\n\n const streamId = payload.headers?.[HEADER_STREAM_ID] ?? '';\n const h = payload.headers ?? {};\n const data = typeof payload.data === 'string' ? payload.data : '';\n\n this._logger?.debug('DefaultDecoderCore._decodeFirstContact(); first-contact stream', {\n name: payload.name,\n streamId,\n serial,\n });\n\n // Create tracker\n const newTracker: StreamTrackerState = {\n name: payload.name,\n streamId,\n accumulated: data,\n headers: { ...h },\n closed: status === 'finished' || status === 'aborted',\n };\n this._serialState.set(serial, newTracker);\n\n // Emit start + delta (if any) + end (if finished)\n const outputs = this._hooks.buildStartEvents(newTracker);\n\n if (data.length > 0) {\n outputs.push(...this._hooks.buildDeltaEvents(newTracker, data));\n }\n\n if (status === 'finished') {\n outputs.push(...this._hooks.buildEndEvents(newTracker, h));\n }\n\n return outputs;\n }\n\n // -------------------------------------------------------------------------\n // Private: delete handling\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD10\n private _decodeDelete(message: Ably.InboundMessage): DecoderOutput<TEvent, TMessage>[] {\n const serial = message.serial;\n if (!serial) return [];\n\n const tracker = this._serialState.get(serial);\n\n this._invokeOnStreamDelete(serial, tracker);\n\n if (tracker) {\n tracker.accumulated = '';\n tracker.closed = true;\n }\n\n this._logger?.debug('DefaultDecoderCore._decodeDelete();', { serial });\n\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a decoder core with the given domain hooks.\n * @param hooks - Domain-specific hooks for stream classification, event building, and discrete decoding.\n * @param options - Decoder configuration (callbacks, logger).\n * @returns A new {@link DecoderCore} instance.\n */\nexport const createDecoderCore = <TEvent, TMessage>(\n hooks: DecoderCoreHooks<TEvent, TMessage>,\n options: DecoderCoreOptions = {},\n): DecoderCore<TEvent, TMessage> => new DefaultDecoderCore(hooks, options);\n","/**\n * Generic lifecycle tracker for codec decoders.\n *\n * Manages per-scope (typically per-turn) tracking of lifecycle phases that\n * must be emitted before content events. When a phase has not been emitted\n * (e.g. mid-stream join), the tracker synthesizes the missing events using\n * codec-provided build functions.\n *\n * Codecs configure the tracker with an ordered list of phases, then compose\n * it into their decoder hooks. The tracker is independent of any specific\n * codec or event type.\n */\n\n// ---------------------------------------------------------------------------\n// Phase configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Configuration for a single lifecycle phase that may need to be\n * synthesized when missing from the wire stream.\n */\nexport interface PhaseConfig<TEvent> {\n /** Unique key identifying this phase (e.g. \"start\", \"start-step\"). */\n key: string;\n /**\n * Build the synthetic event(s) for this phase. Called with a context\n * record that codecs populate at the call site — the tracker passes\n * it through without interpreting it.\n * @param context - Key-value pairs from the call site (e.g. headers).\n * @returns One or more synthetic events to emit for this phase.\n */\n build(context: Record<string, string | undefined>): TEvent[];\n}\n\n// ---------------------------------------------------------------------------\n// Tracker interface\n// ---------------------------------------------------------------------------\n\n/**\n * Per-scope lifecycle tracker that ensures required phases are emitted\n * before content events, synthesizing missing ones for mid-stream joins.\n *\n * Scoped by an arbitrary string key (typically a turn ID). Each scope\n * tracks independently which phases have been emitted.\n */\nexport interface LifecycleTracker<TEvent> {\n /**\n * Ensure all configured phases have been emitted for the given scope.\n * Returns synthetic events for any phases not yet marked as emitted,\n * then marks them. Returns an empty array if all phases are current.\n * @param scopeId - The scope to check (e.g. turn ID).\n * @param context - Key-value pairs passed through to phase build functions.\n * @returns Synthetic events for missing phases, in configuration order.\n */\n ensurePhases(scopeId: string, context: Record<string, string | undefined>): TEvent[];\n\n /**\n * Mark a phase as emitted from the wire (not synthetic). Call this\n * when the real event arrives so the tracker does not re-synthesize it.\n * @param scopeId - The scope (e.g. turn ID).\n * @param phaseKey - The phase key to mark.\n */\n markEmitted(scopeId: string, phaseKey: string): void;\n\n /**\n * Reset a phase so it will be re-synthesized on the next\n * {@link ensurePhases} call. Used for repeating phases (e.g. \"start-step\"\n * resets after \"finish-step\").\n * @param scopeId - The scope (e.g. turn ID).\n * @param phaseKey - The phase key to reset.\n */\n resetPhase(scopeId: string, phaseKey: string): void;\n\n /**\n * Remove all tracking state for a scope. Call on turn completion\n * (finish, abort) to free memory.\n * @param scopeId - The scope to clear.\n */\n clearScope(scopeId: string): void;\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CD13\nclass DefaultLifecycleTracker<TEvent> implements LifecycleTracker<TEvent> {\n private readonly _phases: PhaseConfig<TEvent>[];\n private readonly _emitted = new Map<string, Set<string>>();\n\n constructor(phases: PhaseConfig<TEvent>[]) {\n this._phases = phases;\n }\n\n ensurePhases(scopeId: string, context: Record<string, string | undefined>): TEvent[] {\n const emitted = this._getOrCreate(scopeId);\n const events: TEvent[] = [];\n for (const phase of this._phases) {\n if (!emitted.has(phase.key)) {\n emitted.add(phase.key);\n events.push(...phase.build(context));\n }\n }\n return events;\n }\n\n markEmitted(scopeId: string, phaseKey: string): void {\n this._getOrCreate(scopeId).add(phaseKey);\n }\n\n resetPhase(scopeId: string, phaseKey: string): void {\n this._emitted.get(scopeId)?.delete(phaseKey);\n }\n\n clearScope(scopeId: string): void {\n this._emitted.delete(scopeId);\n }\n\n private _getOrCreate(scopeId: string): Set<string> {\n let set = this._emitted.get(scopeId);\n if (!set) {\n set = new Set();\n this._emitted.set(scopeId, set);\n }\n return set;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a lifecycle tracker configured with the given phases.\n * Phases are checked and synthesized in array order.\n * @param phases - Ordered phase configurations.\n * @returns A new {@link LifecycleTracker} instance.\n */\nexport const createLifecycleTracker = <TEvent>(phases: PhaseConfig<TEvent>[]): LifecycleTracker<TEvent> =>\n new DefaultLifecycleTracker(phases);\n","/**\n * Vercel AI SDK Decoder\n *\n * Maps Ably inbound messages to DecoderOutput<UIMessageChunk, UIMessage>[].\n *\n * Delegates action dispatch and serial tracking to the decoder core.\n * This file contains only the Vercel-specific event building, discrete\n * event decoding, and synthetic event emission.\n *\n * Domain-specific headers use the `x-domain-` prefix. Transport-level\n * headers use the `x-ably-` prefix.\n */\n\nimport type * as Ably from 'ably';\nimport type * as AI from 'ai';\n\nimport { HEADER_DISCRETE, HEADER_ROLE, HEADER_TURN_ID } from '../../constants.js';\nimport type { DecoderCore, DecoderCoreHooks, DecoderCoreOptions } from '../../core/codec/decoder.js';\nimport { createDecoderCore, eventOutput } from '../../core/codec/decoder.js';\nimport type { LifecycleTracker } from '../../core/codec/lifecycle-tracker.js';\nimport { createLifecycleTracker } from '../../core/codec/lifecycle-tracker.js';\nimport type { DecoderOutput, MessagePayload, StreamDecoder, StreamTrackerState } from '../../core/codec/types.js';\nimport { type DomainHeaderReader, headerReader as rawHeaderReader, stripUndefined } from '../../utils.js';\n\n// ---------------------------------------------------------------------------\n// Vercel-specific header reader (casts providerMetadata to AI.ProviderMetadata)\n// ---------------------------------------------------------------------------\n\ninterface VercelHeaderReader extends DomainHeaderReader {\n /** Read the `providerMetadata` domain header, cast to the AI SDK type. */\n providerMetadata(): AI.ProviderMetadata | undefined;\n}\n\n/**\n * Create a header reader that adds Vercel-specific `providerMetadata` typing.\n * @param headers - The raw headers record to read domain headers from.\n * @returns A typed accessor with Vercel-specific providerMetadata typing.\n */\nconst headerReader = (headers: Record<string, string>): VercelHeaderReader => {\n const base = rawHeaderReader(headers);\n return {\n ...base,\n // CAST: Trust boundary — the encoder serialized a valid ProviderMetadata value.\n providerMetadata: () => base.json('providerMetadata') as AI.ProviderMetadata | undefined,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Wire format types (trust boundaries for JSON-parsed data)\n// ---------------------------------------------------------------------------\n\n/** Wire format for tool-input-error data payload. */\ninterface ToolInputErrorWireData {\n errorText?: string;\n input?: unknown;\n}\n\n/** Wire format for tool-output-available data payload. */\ninterface ToolOutputAvailableWireData {\n output?: unknown;\n}\n\n/** Wire format for tool-output-error data payload. */\ninterface ToolOutputErrorWireData {\n errorText?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Shared output type alias\n// ---------------------------------------------------------------------------\n\ntype Out = DecoderOutput<AI.UIMessageChunk, AI.UIMessage>;\n\n/**\n * Bind eventOutput to the Vercel domain types.\n * @param chunk - The UIMessageChunk to wrap.\n * @returns A single-element decoder output array.\n */\nconst event = (chunk: AI.UIMessageChunk): Out[] => eventOutput<AI.UIMessageChunk, AI.UIMessage>(chunk);\n\n// ---------------------------------------------------------------------------\n// JSON boundary helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a finish reason string against the FinishReason union.\n * @param value - The finish reason string from the wire, or undefined.\n * @param fallback - Default finish reason if the value is not recognized.\n * @returns The validated FinishReason.\n */\nconst parseFinishReason = (value: string | undefined, fallback: AI.FinishReason): AI.FinishReason => {\n if (\n value === 'stop' ||\n value === 'length' ||\n value === 'content-filter' ||\n value === 'tool-calls' ||\n value === 'error' ||\n value === 'other'\n ) {\n return value;\n }\n return fallback;\n};\n\n/**\n * Type predicate for data-* message names.\n * @param name - The message name to check.\n * @returns True if the name starts with \"data-\".\n */\nconst isDataEventName = (name: string): name is `data-${string}` => name.startsWith('data-');\n\n/**\n * Parse a string as JSON, returning the raw string if parsing fails\n * or undefined if empty.\n * @param value - The string to attempt JSON parsing on.\n * @returns The parsed value, the raw string on parse failure, or undefined if empty.\n */\nconst parseJsonOrString = (value: string): unknown => {\n if (!value) return undefined;\n try {\n // CAST: JSON.parse returns any; unknown is the safe trust-boundary type.\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n};\n\n// ---------------------------------------------------------------------------\n// Streamed message event builders\n// ---------------------------------------------------------------------------\n\nconst buildStartChunk = (tracker: StreamTrackerState): AI.UIMessageChunk => {\n const r = headerReader(tracker.headers);\n switch (tracker.name) {\n case 'text': {\n return stripUndefined({\n type: 'text-start' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'reasoning': {\n return stripUndefined({\n type: 'reasoning-start' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'tool-input': {\n return stripUndefined({\n type: 'tool-input-start' as const,\n toolCallId: tracker.streamId,\n toolName: r.strOr('toolName', ''),\n dynamic: r.bool('dynamic'),\n title: r.str('title'),\n providerExecuted: r.bool('providerExecuted'),\n providerMetadata: r.providerMetadata(),\n });\n }\n default: {\n return { type: 'text-start', id: tracker.streamId };\n }\n }\n};\n\nconst buildDeltaChunk = (tracker: StreamTrackerState, delta: string): AI.UIMessageChunk => {\n switch (tracker.name) {\n case 'text': {\n return { type: 'text-delta', id: tracker.streamId, delta };\n }\n case 'reasoning': {\n return { type: 'reasoning-delta', id: tracker.streamId, delta };\n }\n case 'tool-input': {\n return { type: 'tool-input-delta', toolCallId: tracker.streamId, inputTextDelta: delta };\n }\n default: {\n return { type: 'text-delta', id: tracker.streamId, delta };\n }\n }\n};\n\nconst buildEndChunk = (tracker: StreamTrackerState, closingHeaders: Record<string, string>): AI.UIMessageChunk => {\n const r = headerReader(closingHeaders);\n switch (tracker.name) {\n case 'text': {\n return stripUndefined({\n type: 'text-end' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'reasoning': {\n return stripUndefined({\n type: 'reasoning-end' as const,\n id: tracker.streamId,\n providerMetadata: r.providerMetadata(),\n });\n }\n case 'tool-input': {\n return stripUndefined({\n type: 'tool-input-available' as const,\n toolCallId: tracker.streamId,\n toolName: r.strOr('toolName', headerReader(tracker.headers).strOr('toolName', '')),\n input: parseJsonOrString(tracker.accumulated),\n providerMetadata: r.providerMetadata(),\n });\n }\n default: {\n return { type: 'text-end', id: tracker.streamId };\n }\n }\n};\n\n// ---------------------------------------------------------------------------\n// Lifecycle tracker configuration (synthetic event phases)\n// ---------------------------------------------------------------------------\n\nconst createVercelLifecycleTracker = (): LifecycleTracker<AI.UIMessageChunk> =>\n createLifecycleTracker<AI.UIMessageChunk>([\n {\n key: 'start',\n build: (ctx) => [stripUndefined({ type: 'start' as const, messageId: ctx.messageId })],\n },\n {\n key: 'start-step',\n build: () => [{ type: 'start-step' as const }],\n },\n ]);\n\n/**\n * Run the lifecycle tracker and wrap results as DecoderOutput events.\n * @param lifecycle - The lifecycle tracker instance.\n * @param turnId - The turn scope ID.\n * @param context - Context passed through to phase build functions.\n * @returns Decoder outputs for any synthesized lifecycle events.\n */\nconst ensurePhases = (\n lifecycle: LifecycleTracker<AI.UIMessageChunk>,\n turnId: string,\n context: Record<string, string | undefined>,\n): Out[] => lifecycle.ensurePhases(turnId, context).map((e) => ({ kind: 'event', event: e }));\n\n// ---------------------------------------------------------------------------\n// Discrete event decoders (one function per event type)\n// ---------------------------------------------------------------------------\n\nconst decodeStart = (r: VercelHeaderReader, turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.markEmitted(turnId, 'start');\n return event(\n stripUndefined({\n type: 'start' as const,\n messageId: r.str('messageId'),\n messageMetadata: r.json('messageMetadata'),\n }),\n );\n};\n\nconst decodeStartStep = (turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.markEmitted(turnId, 'start-step');\n return event({ type: 'start-step' });\n};\n\nconst decodeFinishStep = (turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.resetPhase(turnId, 'start-step');\n return event({ type: 'finish-step' });\n};\n\nconst decodeFinish = (r: VercelHeaderReader, turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.clearScope(turnId);\n return event(\n stripUndefined({\n type: 'finish' as const,\n finishReason: parseFinishReason(r.str('finishReason'), 'stop'),\n messageMetadata: r.json('messageMetadata'),\n }),\n );\n};\n\nconst decodeError = (data: unknown, turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.clearScope(turnId);\n const errorText = typeof data === 'string' ? data : '';\n return event({ type: 'error', errorText });\n};\n\nconst decodeAbort = (data: unknown, turnId: string, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n lifecycle.clearScope(turnId);\n const reason = typeof data === 'string' && data ? data : undefined;\n return event(stripUndefined({ type: 'abort' as const, reason }));\n};\n\nconst decodeMessageMetadata = (r: VercelHeaderReader): Out[] =>\n event({ type: 'message-metadata', messageMetadata: r.json('messageMetadata') });\n\nconst decodeFile = (r: VercelHeaderReader, data: unknown): Out[] =>\n event(\n stripUndefined({\n type: 'file' as const,\n url: typeof data === 'string' ? data : '',\n mediaType: r.strOr('mediaType', ''),\n providerMetadata: r.providerMetadata(),\n }),\n );\n\nconst decodeSourceUrl = (r: VercelHeaderReader, data: unknown): Out[] =>\n event(\n stripUndefined({\n type: 'source-url' as const,\n sourceId: r.strOr('sourceId', ''),\n url: typeof data === 'string' ? data : '',\n title: r.str('title'),\n providerMetadata: r.providerMetadata(),\n }),\n );\n\nconst decodeSourceDocument = (r: VercelHeaderReader): Out[] =>\n event(\n stripUndefined({\n type: 'source-document' as const,\n sourceId: r.strOr('sourceId', ''),\n mediaType: r.strOr('mediaType', ''),\n title: r.strOr('title', ''),\n filename: r.str('filename'),\n providerMetadata: r.providerMetadata(),\n }),\n );\n\nconst decodeToolInputError = (r: VercelHeaderReader, data: unknown): Out[] => {\n // CAST: Trust boundary — encoder produced the expected object shape.\n const parsed = data as ToolInputErrorWireData | undefined;\n return event(\n stripUndefined({\n type: 'tool-input-error' as const,\n toolCallId: r.strOr('toolCallId', ''),\n toolName: r.strOr('toolName', ''),\n errorText: parsed?.errorText ?? '',\n input: parsed?.input,\n dynamic: r.bool('dynamic'),\n title: r.str('title'),\n providerExecuted: r.bool('providerExecuted'),\n providerMetadata: r.providerMetadata(),\n }),\n );\n};\n\nconst decodeToolOutputAvailable = (r: VercelHeaderReader, data: unknown): Out[] => {\n // CAST: Trust boundary — encoder produced the expected object shape.\n const parsed = data as ToolOutputAvailableWireData | undefined;\n return event(\n stripUndefined({\n type: 'tool-output-available' as const,\n toolCallId: r.strOr('toolCallId', ''),\n output: parsed?.output,\n dynamic: r.bool('dynamic'),\n providerExecuted: r.bool('providerExecuted'),\n preliminary: r.bool('preliminary'),\n }),\n );\n};\n\nconst decodeToolOutputError = (r: VercelHeaderReader, data: unknown): Out[] => {\n // CAST: Trust boundary — encoder produced the expected object shape.\n const parsed = data as ToolOutputErrorWireData | undefined;\n return event(\n stripUndefined({\n type: 'tool-output-error' as const,\n toolCallId: r.strOr('toolCallId', ''),\n errorText: parsed?.errorText ?? '',\n dynamic: r.bool('dynamic'),\n providerExecuted: r.bool('providerExecuted'),\n }),\n );\n};\n\nconst decodeToolApprovalRequest = (r: VercelHeaderReader): Out[] =>\n event({\n type: 'tool-approval-request',\n toolCallId: r.strOr('toolCallId', ''),\n approvalId: r.strOr('approvalId', ''),\n });\n\nconst decodeToolOutputDenied = (r: VercelHeaderReader): Out[] =>\n event({ type: 'tool-output-denied', toolCallId: r.strOr('toolCallId', '') });\n\nconst decodeDataEvent = (name: `data-${string}`, r: VercelHeaderReader, data: unknown): Out[] =>\n event(\n stripUndefined({\n type: name,\n data,\n id: r.str('id'),\n transient: r.bool('transient'),\n }),\n );\n\n// ---------------------------------------------------------------------------\n// Non-streaming tool-input helper\n// ---------------------------------------------------------------------------\n\nconst decodeNonStreamingToolInput = (\n r: VercelHeaderReader,\n data: unknown,\n turnId: string,\n lifecycle: LifecycleTracker<AI.UIMessageChunk>,\n): Out[] => {\n const outputs = ensurePhases(lifecycle, turnId, { messageId: r.str('messageId') });\n\n outputs.push(\n {\n kind: 'event',\n event: stripUndefined({\n type: 'tool-input-start' as const,\n toolCallId: r.strOr('toolCallId', ''),\n toolName: r.strOr('toolName', ''),\n dynamic: r.bool('dynamic'),\n title: r.str('title'),\n providerExecuted: r.bool('providerExecuted'),\n providerMetadata: r.providerMetadata(),\n }),\n },\n {\n kind: 'event',\n event: stripUndefined({\n type: 'tool-input-available' as const,\n toolCallId: r.strOr('toolCallId', ''),\n toolName: r.strOr('toolName', ''),\n input: data,\n providerMetadata: r.providerMetadata(),\n }),\n },\n );\n\n return outputs;\n};\n\n// ---------------------------------------------------------------------------\n// Discrete event dispatch\n// ---------------------------------------------------------------------------\n\n/**\n * Reconstruct a UIMessage from a discrete message part published by writeMessages.\n * The encoder splits each UIMessage into per-part Ably messages with a shared\n * x-domain-messageId. This function rebuilds a single-part UIMessage from one\n * such Ably message. The transport's tree upsert merges parts that share the\n * same x-ably-msg-id, so multi-part messages accumulate correctly over\n * successive decoder calls.\n * @param input - The discrete message payload to decode.\n * @returns A single-element array with the reconstructed UIMessage, or empty if unrecognized.\n */\nconst decodeDiscreteMessage = (input: MessagePayload): Out[] => {\n const h = input.headers ?? {};\n const r = headerReader(h);\n const role = (h[HEADER_ROLE] ?? 'user') as AI.UIMessage['role'];\n const messageId = r.str('messageId') ?? '';\n\n let part: AI.UIMessage['parts'][number] | undefined;\n\n switch (input.name) {\n case 'text': {\n part = { type: 'text', text: typeof input.data === 'string' ? input.data : '' };\n break;\n }\n case 'file': {\n part = {\n type: 'file',\n mediaType: r.strOr('mediaType', ''),\n url: typeof input.data === 'string' ? input.data : '',\n };\n break;\n }\n default: {\n if (isDataEventName(input.name)) {\n // CAST: data-* part type matches the DataUIPart shape.\n part = stripUndefined({ type: input.name, id: r.str('id'), data: input.data }) as AI.UIMessage['parts'][number];\n }\n break;\n }\n }\n\n if (!part) return [];\n\n const message: AI.UIMessage = { id: messageId, role, parts: [part] };\n return [{ kind: 'message', message }];\n};\n\n/**\n * Whether a message name represents a discrete message part (written by writeMessages)\n * rather than a streaming lifecycle event. Distinguished by the `x-ably-discrete` header\n * which {@link publishDiscreteBatch} sets on batch-published message payloads. Lifecycle\n * events published via {@link publishDiscrete} (including streaming `data-*` chunks)\n * do not carry this header.\n * @param name - The Ably message name to check.\n * @param headers - The Ably message headers to inspect for discrete marker presence.\n * @returns True if this is a discrete message part, false if it's a lifecycle event.\n */\nconst isDiscreteMessagePart = (name: string, headers: Record<string, string>): boolean =>\n (name === 'text' || name === 'file' || isDataEventName(name)) && HEADER_DISCRETE in headers;\n\nconst decodeDiscretePayload = (input: MessagePayload, lifecycle: LifecycleTracker<AI.UIMessageChunk>): Out[] => {\n const h = input.headers ?? {};\n const r = headerReader(h);\n const turnId = h[HEADER_TURN_ID] ?? '';\n\n // Discrete message parts from writeMessages (user messages, history entries).\n // Distinguished from lifecycle events by the presence of x-ably-discrete.\n if (isDiscreteMessagePart(input.name, h)) {\n return decodeDiscreteMessage(input);\n }\n\n if (input.name === 'tool-input') {\n return decodeNonStreamingToolInput(r, input.data, turnId, lifecycle);\n }\n\n switch (input.name) {\n case 'start': {\n return decodeStart(r, turnId, lifecycle);\n }\n case 'start-step': {\n return decodeStartStep(turnId, lifecycle);\n }\n case 'finish-step': {\n return decodeFinishStep(turnId, lifecycle);\n }\n case 'finish': {\n return decodeFinish(r, turnId, lifecycle);\n }\n case 'error': {\n return decodeError(input.data, turnId, lifecycle);\n }\n case 'abort': {\n return decodeAbort(input.data, turnId, lifecycle);\n }\n case 'message-metadata': {\n return decodeMessageMetadata(r);\n }\n case 'file': {\n return decodeFile(r, input.data);\n }\n case 'source-url': {\n return decodeSourceUrl(r, input.data);\n }\n case 'source-document': {\n return decodeSourceDocument(r);\n }\n case 'tool-input-error': {\n return decodeToolInputError(r, input.data);\n }\n case 'tool-output-available': {\n return decodeToolOutputAvailable(r, input.data);\n }\n case 'tool-output-error': {\n return decodeToolOutputError(r, input.data);\n }\n case 'tool-approval-request': {\n return decodeToolApprovalRequest(r);\n }\n case 'tool-output-denied': {\n return decodeToolOutputDenied(r);\n }\n default: {\n return isDataEventName(input.name) ? decodeDataEvent(input.name, r, input.data) : [];\n }\n }\n};\n\n// ---------------------------------------------------------------------------\n// Decoder core hooks\n// ---------------------------------------------------------------------------\n\nconst createHooks = (\n lifecycle: LifecycleTracker<AI.UIMessageChunk>,\n): DecoderCoreHooks<AI.UIMessageChunk, AI.UIMessage> => ({\n buildStartEvents: (tracker: StreamTrackerState): Out[] => {\n const turnId = tracker.headers[HEADER_TURN_ID] ?? '';\n const messageId = headerReader(tracker.headers).str('messageId');\n const outputs = ensurePhases(lifecycle, turnId, { messageId });\n outputs.push({ kind: 'event', event: buildStartChunk(tracker) });\n return outputs;\n },\n\n buildDeltaEvents: (tracker: StreamTrackerState, delta: string): Out[] => event(buildDeltaChunk(tracker, delta)),\n\n buildEndEvents: (tracker: StreamTrackerState, closingHeaders: Record<string, string>): Out[] =>\n event(buildEndChunk(tracker, closingHeaders)),\n\n decodeDiscrete: (payload: MessagePayload): Out[] => decodeDiscretePayload(payload, lifecycle),\n});\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\nclass DefaultUIMessageDecoder implements StreamDecoder<AI.UIMessageChunk, AI.UIMessage> {\n private readonly _core: DecoderCore<AI.UIMessageChunk, AI.UIMessage>;\n\n constructor(options: DecoderCoreOptions = {}) {\n this._core = createDecoderCore<AI.UIMessageChunk, AI.UIMessage>(\n createHooks(createVercelLifecycleTracker()),\n options,\n );\n }\n\n decode(message: Ably.InboundMessage): Out[] {\n return this._core.decode(message);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel AI SDK decoder that maps Ably messages to UIMessageChunk\n * events and UIMessage objects via the decoder core.\n * @param options - Decoder configuration (callbacks, logger).\n * @returns A {@link StreamDecoder} for UIMessageChunk/UIMessage.\n */\nexport const createDecoder = (options: DecoderCoreOptions = {}): StreamDecoder<AI.UIMessageChunk, AI.UIMessage> =>\n new DefaultUIMessageDecoder(options);\n","// src/errors/ai-sdk-error.ts\nvar marker = \"vercel.ai.error\";\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar AISDKError = class _AISDKError extends (_b = Error, _a = symbol, _b) {\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name: name14,\n message,\n cause\n }) {\n super(message);\n this[_a] = true;\n this.name = name14;\n this.cause = cause;\n }\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error) {\n return _AISDKError.hasMarker(error, marker);\n }\n static hasMarker(error, marker15) {\n const markerSymbol = Symbol.for(marker15);\n return error != null && typeof error === \"object\" && markerSymbol in error && typeof error[markerSymbol] === \"boolean\" && error[markerSymbol] === true;\n }\n};\n\n// src/errors/api-call-error.ts\nvar name = \"AI_APICallError\";\nvar marker2 = `vercel.ai.error.${name}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2, _b2;\nvar APICallError = class extends (_b2 = AISDKError, _a2 = symbol2, _b2) {\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null && (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500),\n // server error\n data\n }) {\n super({ name, message, cause });\n this[_a2] = true;\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker2);\n }\n};\n\n// src/errors/empty-response-body-error.ts\nvar name2 = \"AI_EmptyResponseBodyError\";\nvar marker3 = `vercel.ai.error.${name2}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3, _b3;\nvar EmptyResponseBodyError = class extends (_b3 = AISDKError, _a3 = symbol3, _b3) {\n // used in isInstance\n constructor({ message = \"Empty response body\" } = {}) {\n super({ name: name2, message });\n this[_a3] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker3);\n }\n};\n\n// src/errors/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\n// src/errors/invalid-argument-error.ts\nvar name3 = \"AI_InvalidArgumentError\";\nvar marker4 = `vercel.ai.error.${name3}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4, _b4;\nvar InvalidArgumentError = class extends (_b4 = AISDKError, _a4 = symbol4, _b4) {\n constructor({\n message,\n cause,\n argument\n }) {\n super({ name: name3, message, cause });\n this[_a4] = true;\n this.argument = argument;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker4);\n }\n};\n\n// src/errors/invalid-prompt-error.ts\nvar name4 = \"AI_InvalidPromptError\";\nvar marker5 = `vercel.ai.error.${name4}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5, _b5;\nvar InvalidPromptError = class extends (_b5 = AISDKError, _a5 = symbol5, _b5) {\n constructor({\n prompt,\n message,\n cause\n }) {\n super({ name: name4, message: `Invalid prompt: ${message}`, cause });\n this[_a5] = true;\n this.prompt = prompt;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker5);\n }\n};\n\n// src/errors/invalid-response-data-error.ts\nvar name5 = \"AI_InvalidResponseDataError\";\nvar marker6 = `vercel.ai.error.${name5}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6, _b6;\nvar InvalidResponseDataError = class extends (_b6 = AISDKError, _a6 = symbol6, _b6) {\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`\n }) {\n super({ name: name5, message });\n this[_a6] = true;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker6);\n }\n};\n\n// src/errors/json-parse-error.ts\nvar name6 = \"AI_JSONParseError\";\nvar marker7 = `vercel.ai.error.${name6}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7, _b7;\nvar JSONParseError = class extends (_b7 = AISDKError, _a7 = symbol7, _b7) {\n constructor({ text, cause }) {\n super({\n name: name6,\n message: `JSON parsing failed: Text: ${text}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a7] = true;\n this.text = text;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker7);\n }\n};\n\n// src/errors/load-api-key-error.ts\nvar name7 = \"AI_LoadAPIKeyError\";\nvar marker8 = `vercel.ai.error.${name7}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8, _b8;\nvar LoadAPIKeyError = class extends (_b8 = AISDKError, _a8 = symbol8, _b8) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name7, message });\n this[_a8] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker8);\n }\n};\n\n// src/errors/load-setting-error.ts\nvar name8 = \"AI_LoadSettingError\";\nvar marker9 = `vercel.ai.error.${name8}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9, _b9;\nvar LoadSettingError = class extends (_b9 = AISDKError, _a9 = symbol9, _b9) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name8, message });\n this[_a9] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker9);\n }\n};\n\n// src/errors/no-content-generated-error.ts\nvar name9 = \"AI_NoContentGeneratedError\";\nvar marker10 = `vercel.ai.error.${name9}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10, _b10;\nvar NoContentGeneratedError = class extends (_b10 = AISDKError, _a10 = symbol10, _b10) {\n // used in isInstance\n constructor({\n message = \"No content generated.\"\n } = {}) {\n super({ name: name9, message });\n this[_a10] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker10);\n }\n};\n\n// src/errors/no-such-model-error.ts\nvar name10 = \"AI_NoSuchModelError\";\nvar marker11 = `vercel.ai.error.${name10}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11, _b11;\nvar NoSuchModelError = class extends (_b11 = AISDKError, _a11 = symbol11, _b11) {\n constructor({\n errorName = name10,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`\n }) {\n super({ name: errorName, message });\n this[_a11] = true;\n this.modelId = modelId;\n this.modelType = modelType;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker11);\n }\n};\n\n// src/errors/too-many-embedding-values-for-call-error.ts\nvar name11 = \"AI_TooManyEmbeddingValuesForCallError\";\nvar marker12 = `vercel.ai.error.${name11}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12, _b12;\nvar TooManyEmbeddingValuesForCallError = class extends (_b12 = AISDKError, _a12 = symbol12, _b12) {\n constructor(options) {\n super({\n name: name11,\n message: `Too many values for a single embedding call. The ${options.provider} model \"${options.modelId}\" can only embed up to ${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`\n });\n this[_a12] = true;\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker12);\n }\n};\n\n// src/errors/type-validation-error.ts\nvar name12 = \"AI_TypeValidationError\";\nvar marker13 = `vercel.ai.error.${name12}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13, _b13;\nvar TypeValidationError = class _TypeValidationError extends (_b13 = AISDKError, _a13 = symbol13, _b13) {\n constructor({\n value,\n cause,\n context\n }) {\n let contextPrefix = \"Type validation failed\";\n if (context == null ? void 0 : context.field) {\n contextPrefix += ` for ${context.field}`;\n }\n if ((context == null ? void 0 : context.entityName) || (context == null ? void 0 : context.entityId)) {\n contextPrefix += \" (\";\n const parts = [];\n if (context.entityName) {\n parts.push(context.entityName);\n }\n if (context.entityId) {\n parts.push(`id: \"${context.entityId}\"`);\n }\n contextPrefix += parts.join(\", \");\n contextPrefix += \")\";\n }\n super({\n name: name12,\n message: `${contextPrefix}: Value: ${JSON.stringify(value)}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a13] = true;\n this.value = value;\n this.context = context;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker13);\n }\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value and context, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @param {TypeValidationContext} params.context - Optional context about what is being validated.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n context\n }) {\n var _a15, _b15, _c;\n if (_TypeValidationError.isInstance(cause) && cause.value === value && ((_a15 = cause.context) == null ? void 0 : _a15.field) === (context == null ? void 0 : context.field) && ((_b15 = cause.context) == null ? void 0 : _b15.entityName) === (context == null ? void 0 : context.entityName) && ((_c = cause.context) == null ? void 0 : _c.entityId) === (context == null ? void 0 : context.entityId)) {\n return cause;\n }\n return new _TypeValidationError({ value, cause, context });\n }\n};\n\n// src/errors/unsupported-functionality-error.ts\nvar name13 = \"AI_UnsupportedFunctionalityError\";\nvar marker14 = `vercel.ai.error.${name13}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14, _b14;\nvar UnsupportedFunctionalityError = class extends (_b14 = AISDKError, _a14 = symbol14, _b14) {\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`\n }) {\n super({ name: name13, message });\n this[_a14] = true;\n this.functionality = functionality;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker14);\n }\n};\n\n// src/json-value/is-json.ts\nfunction isJSONValue(value) {\n if (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n if (typeof value === \"object\") {\n return Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n }\n return false;\n}\nfunction isJSONArray(value) {\n return Array.isArray(value) && value.every(isJSONValue);\n}\nfunction isJSONObject(value) {\n return value != null && typeof value === \"object\" && Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n}\nexport {\n AISDKError,\n APICallError,\n EmptyResponseBodyError,\n InvalidArgumentError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError,\n getErrorMessage,\n isJSONArray,\n isJSONObject,\n isJSONValue\n};\n//# sourceMappingURL=index.mjs.map","/** A special constant with type `never` */\nexport const NEVER = Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n if (!inst._zod) {\n Object.defineProperty(inst, \"_zod\", {\n value: {\n def,\n constr: _,\n traits: new Set(),\n },\n enumerable: false,\n });\n }\n if (inst._zod.traits.has(name)) {\n return;\n }\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n const proto = _.prototype;\n const keys = Object.keys(proto);\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (!(k in inst)) {\n inst[k] = proto[k].bind(inst);\n }\n }\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport class $ZodEncodeError extends Error {\n constructor(name) {\n super(`Encountered unidirectional transform during encode: ${name}`);\n this.name = \"ZodEncodeError\";\n }\n}\nexport const globalConfig = {};\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n","// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error(\"Unexpected value in exhaustive check\");\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepString = step.toString();\n let stepDecCount = (stepString.split(\".\")[1] || \"\").length;\n if (stepDecCount === 0 && /\\d?e-\\d?/.test(stepString)) {\n const match = stepString.match(/\\d?e-(\\d?)/);\n if (match?.[1]) {\n stepDecCount = Number.parseInt(match[1]);\n }\n }\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nconst EVALUATING = Symbol(\"evaluating\");\nexport function defineLazy(object, key, getter) {\n let value = undefined;\n Object.defineProperty(object, key, {\n get() {\n if (value === EVALUATING) {\n // Circular reference detected, return undefined to break the cycle\n return undefined;\n }\n if (value === undefined) {\n value = EVALUATING;\n value = getter();\n }\n return value;\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function objectClone(obj) {\n return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function mergeDefs(...defs) {\n const mergedDescriptors = {};\n for (const def of defs) {\n const descriptors = Object.getOwnPropertyDescriptors(def);\n Object.assign(mergedDescriptors, descriptors);\n }\n return Object.defineProperties({}, mergedDescriptors);\n}\nexport function cloneDef(schema) {\n return mergeDefs(schema._zod.def);\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport function slugify(input) {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\nexport const captureStackTrace = (\"captureStackTrace\" in Error ? Error.captureStackTrace : (..._args) => { });\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = cached(() => {\n // @ts-ignore\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n if (typeof ctor !== \"function\")\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function shallowClone(o) {\n if (isPlainObject(o))\n return { ...o };\n if (Array.isArray(o))\n return [...o];\n return o;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n // @ts-ignore\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = new Set([\"string\", \"number\", \"bigint\", \"boolean\", \"symbol\", \"undefined\"]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".pick() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = {};\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n newShape[key] = currDef.shape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function omit(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".omit() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = { ...schema._zod.def.shape };\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const checks = schema._zod.def.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n // Only throw if new shape overlaps with existing shape\n // Use getOwnPropertyDescriptor to check key existence without accessing values\n const existingShape = schema._zod.def.shape;\n for (const key in shape) {\n if (Object.getOwnPropertyDescriptor(existingShape, key) !== undefined) {\n throw new Error(\"Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.\");\n }\n }\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function safeExtend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to safeExtend: expected a plain object\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function merge(a, b) {\n const def = mergeDefs(a._zod.def, {\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n get catchall() {\n return b._zod.def.catchall;\n },\n checks: [], // delete existing checks\n });\n return clone(a, def);\n}\nexport function partial(Class, schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".partial() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function required(Class, schema, mask) {\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n });\n return clone(schema, def);\n}\n// invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom\nexport function aborted(x, startIndex = 0) {\n if (x.aborted === true)\n return true;\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true) {\n return true;\n }\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const full = { ...iss, path: iss.path ?? [] };\n // for backwards compatibility\n if (!iss.message) {\n const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\";\n full.message = message;\n }\n // delete (full as any).def;\n delete full.inst;\n delete full.continue;\n if (!ctx?.reportInput) {\n delete full.input;\n }\n return full;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n // @ts-ignore\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function parsedType(data) {\n const t = typeof data;\n switch (t) {\n case \"number\": {\n return Number.isNaN(data) ? \"nan\" : \"number\";\n }\n case \"object\": {\n if (data === null) {\n return \"null\";\n }\n if (Array.isArray(data)) {\n return \"array\";\n }\n const obj = data;\n if (obj && Object.getPrototypeOf(obj) !== Object.prototype && \"constructor\" in obj && obj.constructor) {\n return obj.constructor.name;\n }\n }\n }\n return t;\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// Codec utility functions\nexport function base64ToUint8Array(base64) {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\nexport function uint8ArrayToBase64(bytes) {\n let binaryString = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binaryString += String.fromCharCode(bytes[i]);\n }\n return btoa(binaryString);\n}\nexport function base64urlToUint8Array(base64url) {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n return base64ToUint8Array(base64 + padding);\n}\nexport function uint8ArrayToBase64url(bytes) {\n return uint8ArrayToBase64(bytes).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\nexport function hexToUint8Array(hex) {\n const cleanHex = hex.replace(/^0x/, \"\");\n if (cleanHex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string length\");\n }\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);\n }\n return bytes;\n}\nexport function uint8ArrayToHex(bytes) {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n","import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n inst.message = JSON.stringify(def, util.jsonStringifyReplacer, 2);\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, mapper = (issue) => issue.message) {\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues });\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues });\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, mapper = (issue) => issue.message) {\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, issue.path));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * ✖ Expected number, received string at \"username\n * favoriteNumbers[0]\n * ✖ Invalid input: expected number\n * ```\n */\nexport function toDotPath(_path) {\n const segs = [];\n const path = _path.map((seg) => (typeof seg === \"object\" ? seg.key : seg));\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => (a.path ?? []).length - (b.path ?? []).length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`✖ ${issue.message}`);\n if (issue.path?.length)\n lines.push(` → at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n","import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\nexport const _encode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parse(_Err)(schema, value, ctx);\n};\nexport const encode = /* @__PURE__*/ _encode(errors.$ZodRealError);\nexport const _decode = (_Err) => (schema, value, _ctx) => {\n return _parse(_Err)(schema, value, _ctx);\n};\nexport const decode = /* @__PURE__*/ _decode(errors.$ZodRealError);\nexport const _encodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parseAsync(_Err)(schema, value, ctx);\n};\nexport const encodeAsync = /* @__PURE__*/ _encodeAsync(errors.$ZodRealError);\nexport const _decodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _parseAsync(_Err)(schema, value, _ctx);\n};\nexport const decodeAsync = /* @__PURE__*/ _decodeAsync(errors.$ZodRealError);\nexport const _safeEncode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParse(_Err)(schema, value, ctx);\n};\nexport const safeEncode = /* @__PURE__*/ _safeEncode(errors.$ZodRealError);\nexport const _safeDecode = (_Err) => (schema, value, _ctx) => {\n return _safeParse(_Err)(schema, value, _ctx);\n};\nexport const safeDecode = /* @__PURE__*/ _safeDecode(errors.$ZodRealError);\nexport const _safeEncodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParseAsync(_Err)(schema, value, ctx);\n};\nexport const safeEncodeAsync = /* @__PURE__*/ _safeEncodeAsync(errors.$ZodRealError);\nexport const _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _safeParseAsync(_Err)(schema, value, _ctx);\n};\nexport const safeDecodeAsync = /* @__PURE__*/ _safeDecodeAsync(errors.$ZodRealError);\n","import * as util from \"./util.js\";\nexport const cuid = /^[cC][^\\s-]{8,}$/;\nexport const cuid2 = /^[0-9a-z]+$/;\nexport const ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/;\nexport const xid = /^[0-9a-vA-V]{20}$/;\nexport const ksuid = /^[A-Za-z0-9]{27}$/;\nexport const nanoid = /^[a-zA-Z0-9_-]{21}$/;\n/** ISO 8601-1 duration regex. Does not support the 8601-2 extensions like negative durations or fractional/negative components. */\nexport const duration = /^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$/;\n/** Implements ISO 8601-2 extensions like explicit +- prefixes, mixing weeks with other units, and fractional/negative components. */\nexport const extendedDuration = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n/** A regex for any UUID-like identifier: 8-4-4-4-12 hex pattern */\nexport const guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n/** Returns a regex for validating an RFC 9562/4122 UUID.\n *\n * @param version Optionally specify a version 1-8. If no version is specified, all versions are supported. */\nexport const uuid = (version) => {\n if (!version)\n return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;\n return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`);\n};\nexport const uuid4 = /*@__PURE__*/ uuid(4);\nexport const uuid6 = /*@__PURE__*/ uuid(6);\nexport const uuid7 = /*@__PURE__*/ uuid(7);\n/** Practical email validation */\nexport const email = /^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/;\n/** Equivalent to the HTML5 input[type=email] validation implemented by browsers. Source: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email */\nexport const html5Email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n/** The classic emailregex.com regex for RFC 5322-compliant emails */\nexport const rfc5322Email = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/** A loose regex that allows Unicode characters, enforces length limits, and that's about it. */\nexport const unicodeEmail = /^[^\\s@\"]{1,64}@[^\\s@]{1,255}$/u;\nexport const idnEmail = unicodeEmail;\nexport const browserEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emoji = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nexport function emoji() {\n return new RegExp(_emoji, \"u\");\n}\nexport const ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nexport const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;\nexport const mac = (delimiter) => {\n const escapedDelim = util.escapeRegex(delimiter ?? \":\");\n return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);\n};\nexport const cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$/;\nexport const cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nexport const base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;\nexport const base64url = /^[A-Za-z0-9_-]*$/;\n// based on https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address\n// export const hostname: RegExp = /^([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+$/;\nexport const hostname = /^(?=.{1,253}\\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\\.?$/;\nexport const domain = /^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/;\n// https://blog.stevenlevithan.com/archives/validate-phone-number#r4-3 (regex sans spaces)\n// E.164: leading digit must be 1-9; total digits (excluding '+') between 7-15\nexport const e164 = /^\\+[1-9]\\d{6,14}$/;\n// const dateSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateSource = `(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))`;\nexport const date = /*@__PURE__*/ new RegExp(`^${dateSource}$`);\nfunction timeSource(args) {\n const hhmm = `(?:[01]\\\\d|2[0-3]):[0-5]\\\\d`;\n const regex = typeof args.precision === \"number\"\n ? args.precision === -1\n ? `${hhmm}`\n : args.precision === 0\n ? `${hhmm}:[0-5]\\\\d`\n : `${hhmm}:[0-5]\\\\d\\\\.\\\\d{${args.precision}}`\n : `${hhmm}(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?`;\n return regex;\n}\nexport function time(args) {\n return new RegExp(`^${timeSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetime(args) {\n const time = timeSource({ precision: args.precision });\n const opts = [\"Z\"];\n if (args.local)\n opts.push(\"\");\n // if (args.offset) opts.push(`([+-]\\\\d{2}:\\\\d{2})`);\n if (args.offset)\n opts.push(`([+-](?:[01]\\\\d|2[0-3]):[0-5]\\\\d)`);\n const timeRegex = `${time}(?:${opts.join(\"|\")})`;\n return new RegExp(`^${dateSource}T(?:${timeRegex})$`);\n}\nexport const string = (params) => {\n const regex = params ? `[\\\\s\\\\S]{${params?.minimum ?? 0},${params?.maximum ?? \"\"}}` : `[\\\\s\\\\S]*`;\n return new RegExp(`^${regex}$`);\n};\nexport const bigint = /^-?\\d+n?$/;\nexport const integer = /^-?\\d+$/;\nexport const number = /^-?\\d+(?:\\.\\d+)?$/;\nexport const boolean = /^(?:true|false)$/i;\nconst _null = /^null$/i;\nexport { _null as null };\nconst _undefined = /^undefined$/i;\nexport { _undefined as undefined };\n// regex for string with no uppercase letters\nexport const lowercase = /^[^A-Z]*$/;\n// regex for string with no lowercase letters\nexport const uppercase = /^[^a-z]*$/;\n// regex for hexadecimal strings (any length)\nexport const hex = /^[0-9a-fA-F]*$/;\n// Hash regexes for different algorithms and encodings\n// Helper function to create base64 regex with exact length and padding\nfunction fixedBase64(bodyLength, padding) {\n return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`);\n}\n// Helper function to create base64url regex with exact length (no padding)\nfunction fixedBase64url(length) {\n return new RegExp(`^[A-Za-z0-9_-]{${length}}$`);\n}\n// MD5 (16 bytes): base64 = 24 chars total (22 + \"==\")\nexport const md5_hex = /^[0-9a-fA-F]{32}$/;\nexport const md5_base64 = /*@__PURE__*/ fixedBase64(22, \"==\");\nexport const md5_base64url = /*@__PURE__*/ fixedBase64url(22);\n// SHA1 (20 bytes): base64 = 28 chars total (27 + \"=\")\nexport const sha1_hex = /^[0-9a-fA-F]{40}$/;\nexport const sha1_base64 = /*@__PURE__*/ fixedBase64(27, \"=\");\nexport const sha1_base64url = /*@__PURE__*/ fixedBase64url(27);\n// SHA256 (32 bytes): base64 = 44 chars total (43 + \"=\")\nexport const sha256_hex = /^[0-9a-fA-F]{64}$/;\nexport const sha256_base64 = /*@__PURE__*/ fixedBase64(43, \"=\");\nexport const sha256_base64url = /*@__PURE__*/ fixedBase64url(43);\n// SHA384 (48 bytes): base64 = 64 chars total (no padding)\nexport const sha384_hex = /^[0-9a-fA-F]{96}$/;\nexport const sha384_base64 = /*@__PURE__*/ fixedBase64(64, \"\");\nexport const sha384_base64url = /*@__PURE__*/ fixedBase64url(64);\n// SHA512 (64 bytes): base64 = 88 chars total (86 + \"==\")\nexport const sha512_hex = /^[0-9a-fA-F]{128}$/;\nexport const sha512_base64 = /*@__PURE__*/ fixedBase64(86, \"==\");\nexport const sha512_base64url = /*@__PURE__*/ fixedBase64url(86);\n","// import { $ZodType } from \"./schemas.js\";\nimport * as core from \"./core.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nexport const $ZodCheck = /*@__PURE__*/ core.$constructor(\"$ZodCheck\", (inst, def) => {\n var _a;\n inst._zod ?? (inst._zod = {});\n inst._zod.def = def;\n (_a = inst._zod).onattach ?? (_a.onattach = []);\n});\nconst numericOriginMap = {\n number: \"number\",\n bigint: \"bigint\",\n object: \"date\",\n};\nexport const $ZodCheckLessThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckLessThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY;\n if (def.value < curr) {\n if (def.inclusive)\n bag.maximum = def.value;\n else\n bag.exclusiveMaximum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value <= def.value : payload.value < def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckGreaterThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckGreaterThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY;\n if (def.value > curr) {\n if (def.inclusive)\n bag.minimum = def.value;\n else\n bag.exclusiveMinimum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value >= def.value : payload.value > def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMultipleOf = \n/*@__PURE__*/ core.$constructor(\"$ZodCheckMultipleOf\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n var _a;\n (_a = inst._zod.bag).multipleOf ?? (_a.multipleOf = def.value);\n });\n inst._zod.check = (payload) => {\n if (typeof payload.value !== typeof def.value)\n throw new Error(\"Cannot mix number and bigint in multiple_of check.\");\n const isMultiple = typeof payload.value === \"bigint\"\n ? payload.value % def.value === BigInt(0)\n : util.floatSafeRemainder(payload.value, def.value) === 0;\n if (isMultiple)\n return;\n payload.issues.push({\n origin: typeof payload.value,\n code: \"not_multiple_of\",\n divisor: def.value,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckNumberFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n def.format = def.format || \"float64\";\n const isInt = def.format?.includes(\"int\");\n const origin = isInt ? \"int\" : \"number\";\n const [minimum, maximum] = util.NUMBER_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n if (isInt)\n bag.pattern = regexes.integer;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (isInt) {\n if (!Number.isInteger(input)) {\n // invalid_format issue\n // payload.issues.push({\n // expected: def.format,\n // format: def.format,\n // code: \"invalid_format\",\n // input,\n // inst,\n // });\n // invalid_type issue\n payload.issues.push({\n expected: origin,\n format: def.format,\n code: \"invalid_type\",\n continue: false,\n input,\n inst,\n });\n return;\n // not_multiple_of issue\n // payload.issues.push({\n // code: \"not_multiple_of\",\n // origin: \"number\",\n // input,\n // inst,\n // divisor: 1,\n // });\n }\n if (!Number.isSafeInteger(input)) {\n if (input > 0) {\n // too_big\n payload.issues.push({\n input,\n code: \"too_big\",\n maximum: Number.MAX_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n else {\n // too_small\n payload.issues.push({\n input,\n code: \"too_small\",\n minimum: Number.MIN_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n return;\n }\n }\n if (input < minimum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_small\",\n minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckBigIntFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n const [minimum, maximum] = util.BIGINT_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (input < minimum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_small\",\n minimum: minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckMaxSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size <= def.maximum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size >= def.minimum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckSizeEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckSizeEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.size;\n bag.maximum = def.size;\n bag.size = def.size;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size === def.size)\n return;\n const tooBig = size > def.size;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n ...(tooBig ? { code: \"too_big\", maximum: def.size } : { code: \"too_small\", minimum: def.size }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMaxLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length <= def.maximum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length >= def.minimum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLengthEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckLengthEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.length;\n bag.maximum = def.length;\n bag.length = def.length;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length === def.length)\n return;\n const origin = util.getLengthableOrigin(input);\n const tooBig = length > def.length;\n payload.issues.push({\n origin,\n ...(tooBig ? { code: \"too_big\", maximum: def.length } : { code: \"too_small\", minimum: def.length }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckStringFormat\", (inst, def) => {\n var _a, _b;\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n if (def.pattern) {\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(def.pattern);\n }\n });\n if (def.pattern)\n (_a = inst._zod).check ?? (_a.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n ...(def.pattern ? { pattern: def.pattern.toString() } : {}),\n inst,\n continue: !def.abort,\n });\n });\n else\n (_b = inst._zod).check ?? (_b.check = () => { });\n});\nexport const $ZodCheckRegex = /*@__PURE__*/ core.$constructor(\"$ZodCheckRegex\", (inst, def) => {\n $ZodCheckStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"regex\",\n input: payload.value,\n pattern: def.pattern.toString(),\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLowerCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckLowerCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.lowercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckUpperCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckUpperCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.uppercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckIncludes = /*@__PURE__*/ core.$constructor(\"$ZodCheckIncludes\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const escapedRegex = util.escapeRegex(def.includes);\n const pattern = new RegExp(typeof def.position === \"number\" ? `^.{${def.position}}${escapedRegex}` : escapedRegex);\n def.pattern = pattern;\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.includes(def.includes, def.position))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"includes\",\n includes: def.includes,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStartsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckStartsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`^${util.escapeRegex(def.prefix)}.*`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.startsWith(def.prefix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"starts_with\",\n prefix: def.prefix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckEndsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckEndsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`.*${util.escapeRegex(def.suffix)}$`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.endsWith(def.suffix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"ends_with\",\n suffix: def.suffix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n///////////////////////////////////\n///// $ZodCheckProperty /////\n///////////////////////////////////\nfunction handleCheckPropertyResult(result, payload, property) {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(property, result.issues));\n }\n}\nexport const $ZodCheckProperty = /*@__PURE__*/ core.$constructor(\"$ZodCheckProperty\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n const result = def.schema._zod.run({\n value: payload.value[def.property],\n issues: [],\n }, {});\n if (result instanceof Promise) {\n return result.then((result) => handleCheckPropertyResult(result, payload, def.property));\n }\n handleCheckPropertyResult(result, payload, def.property);\n return;\n };\n});\nexport const $ZodCheckMimeType = /*@__PURE__*/ core.$constructor(\"$ZodCheckMimeType\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const mimeSet = new Set(def.mime);\n inst._zod.onattach.push((inst) => {\n inst._zod.bag.mime = def.mime;\n });\n inst._zod.check = (payload) => {\n if (mimeSet.has(payload.value.type))\n return;\n payload.issues.push({\n code: \"invalid_value\",\n values: def.mime,\n input: payload.value.type,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckOverwrite = /*@__PURE__*/ core.$constructor(\"$ZodCheckOverwrite\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n payload.value = def.tx(payload.value);\n };\n});\n","export class Doc {\n constructor(args = []) {\n this.content = [];\n this.indent = 0;\n if (this)\n this.args = args;\n }\n indented(fn) {\n this.indent += 1;\n fn(this);\n this.indent -= 1;\n }\n write(arg) {\n if (typeof arg === \"function\") {\n arg(this, { execution: \"sync\" });\n arg(this, { execution: \"async\" });\n return;\n }\n const content = arg;\n const lines = content.split(\"\\n\").filter((x) => x);\n const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length));\n const dedented = lines.map((x) => x.slice(minIndent)).map((x) => \" \".repeat(this.indent * 2) + x);\n for (const line of dedented) {\n this.content.push(line);\n }\n }\n compile() {\n const F = Function;\n const args = this?.args;\n const content = this?.content ?? [``];\n const lines = [...content.map((x) => ` ${x}`)];\n // console.log(lines.join(\"\\n\"));\n return new F(...args, lines.join(\"\\n\"));\n }\n}\n","export const version = {\n major: 4,\n minor: 3,\n patch: 6,\n};\n","import * as checks from \"./checks.js\";\nimport * as core from \"./core.js\";\nimport { Doc } from \"./doc.js\";\nimport { parse, parseAsync, safeParse, safeParseAsync } from \"./parse.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nimport { version } from \"./versions.js\";\nexport const $ZodType = /*@__PURE__*/ core.$constructor(\"$ZodType\", (inst, def) => {\n var _a;\n inst ?? (inst = {});\n inst._zod.def = def; // set _def property\n inst._zod.bag = inst._zod.bag || {}; // initialize _bag object\n inst._zod.version = version;\n const checks = [...(inst._zod.def.checks ?? [])];\n // if inst is itself a checks.$ZodCheck, run it as a check\n if (inst._zod.traits.has(\"$ZodCheck\")) {\n checks.unshift(inst);\n }\n for (const ch of checks) {\n for (const fn of ch._zod.onattach) {\n fn(inst);\n }\n }\n if (checks.length === 0) {\n // deferred initializer\n // inst._zod.parse is not yet defined\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n inst._zod.deferred?.push(() => {\n inst._zod.run = inst._zod.parse;\n });\n }\n else {\n const runChecks = (payload, checks, ctx) => {\n let isAborted = util.aborted(payload);\n let asyncResult;\n for (const ch of checks) {\n if (ch._zod.def.when) {\n const shouldRun = ch._zod.def.when(payload);\n if (!shouldRun)\n continue;\n }\n else if (isAborted) {\n continue;\n }\n const currLen = payload.issues.length;\n const _ = ch._zod.check(payload);\n if (_ instanceof Promise && ctx?.async === false) {\n throw new core.$ZodAsyncError();\n }\n if (asyncResult || _ instanceof Promise) {\n asyncResult = (asyncResult ?? Promise.resolve()).then(async () => {\n await _;\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n return;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n });\n }\n else {\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n continue;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n }\n }\n if (asyncResult) {\n return asyncResult.then(() => {\n return payload;\n });\n }\n return payload;\n };\n const handleCanaryResult = (canary, payload, ctx) => {\n // abort if the canary is aborted\n if (util.aborted(canary)) {\n canary.aborted = true;\n return canary;\n }\n // run checks first, then\n const checkResult = runChecks(payload, checks, ctx);\n if (checkResult instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return checkResult.then((checkResult) => inst._zod.parse(checkResult, ctx));\n }\n return inst._zod.parse(checkResult, ctx);\n };\n inst._zod.run = (payload, ctx) => {\n if (ctx.skipChecks) {\n return inst._zod.parse(payload, ctx);\n }\n if (ctx.direction === \"backward\") {\n // run canary\n // initial pass (no checks)\n const canary = inst._zod.parse({ value: payload.value, issues: [] }, { ...ctx, skipChecks: true });\n if (canary instanceof Promise) {\n return canary.then((canary) => {\n return handleCanaryResult(canary, payload, ctx);\n });\n }\n return handleCanaryResult(canary, payload, ctx);\n }\n // forward\n const result = inst._zod.parse(payload, ctx);\n if (result instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return result.then((result) => runChecks(result, checks, ctx));\n }\n return runChecks(result, checks, ctx);\n };\n }\n // Lazy initialize ~standard to avoid creating objects for every schema\n util.defineLazy(inst, \"~standard\", () => ({\n validate: (value) => {\n try {\n const r = safeParse(inst, value);\n return r.success ? { value: r.data } : { issues: r.error?.issues };\n }\n catch (_) {\n return safeParseAsync(inst, value).then((r) => (r.success ? { value: r.data } : { issues: r.error?.issues }));\n }\n },\n vendor: \"zod\",\n version: 1,\n }));\n});\nexport { clone } from \"./util.js\";\nexport const $ZodString = /*@__PURE__*/ core.$constructor(\"$ZodString\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = [...(inst?._zod.bag?.patterns ?? [])].pop() ?? regexes.string(inst._zod.bag);\n inst._zod.parse = (payload, _) => {\n if (def.coerce)\n try {\n payload.value = String(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"string\")\n return payload;\n payload.issues.push({\n expected: \"string\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodStringFormat\", (inst, def) => {\n // check initialization must come first\n checks.$ZodCheckStringFormat.init(inst, def);\n $ZodString.init(inst, def);\n});\nexport const $ZodGUID = /*@__PURE__*/ core.$constructor(\"$ZodGUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.guid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodUUID = /*@__PURE__*/ core.$constructor(\"$ZodUUID\", (inst, def) => {\n if (def.version) {\n const versionMap = {\n v1: 1,\n v2: 2,\n v3: 3,\n v4: 4,\n v5: 5,\n v6: 6,\n v7: 7,\n v8: 8,\n };\n const v = versionMap[def.version];\n if (v === undefined)\n throw new Error(`Invalid UUID version: \"${def.version}\"`);\n def.pattern ?? (def.pattern = regexes.uuid(v));\n }\n else\n def.pattern ?? (def.pattern = regexes.uuid());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodEmail = /*@__PURE__*/ core.$constructor(\"$ZodEmail\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.email);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodURL = /*@__PURE__*/ core.$constructor(\"$ZodURL\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n try {\n // Trim whitespace from input\n const trimmed = payload.value.trim();\n // @ts-ignore\n const url = new URL(trimmed);\n if (def.hostname) {\n def.hostname.lastIndex = 0;\n if (!def.hostname.test(url.hostname)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid hostname\",\n pattern: def.hostname.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n if (def.protocol) {\n def.protocol.lastIndex = 0;\n if (!def.protocol.test(url.protocol.endsWith(\":\") ? url.protocol.slice(0, -1) : url.protocol)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid protocol\",\n pattern: def.protocol.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n // Set the output value based on normalize flag\n if (def.normalize) {\n // Use normalized URL\n payload.value = url.href;\n }\n else {\n // Preserve the original input (trimmed)\n payload.value = trimmed;\n }\n return;\n }\n catch (_) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodEmoji = /*@__PURE__*/ core.$constructor(\"$ZodEmoji\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.emoji());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodNanoID = /*@__PURE__*/ core.$constructor(\"$ZodNanoID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.nanoid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID = /*@__PURE__*/ core.$constructor(\"$ZodCUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID2 = /*@__PURE__*/ core.$constructor(\"$ZodCUID2\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid2);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodULID = /*@__PURE__*/ core.$constructor(\"$ZodULID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ulid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodXID = /*@__PURE__*/ core.$constructor(\"$ZodXID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.xid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodKSUID = /*@__PURE__*/ core.$constructor(\"$ZodKSUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ksuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODateTime = /*@__PURE__*/ core.$constructor(\"$ZodISODateTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.datetime(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODate = /*@__PURE__*/ core.$constructor(\"$ZodISODate\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.date);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISOTime = /*@__PURE__*/ core.$constructor(\"$ZodISOTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.time(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODuration = /*@__PURE__*/ core.$constructor(\"$ZodISODuration\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.duration);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodIPv4 = /*@__PURE__*/ core.$constructor(\"$ZodIPv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv4);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv4`;\n});\nexport const $ZodIPv6 = /*@__PURE__*/ core.$constructor(\"$ZodIPv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv6);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv6`;\n inst._zod.check = (payload) => {\n try {\n // @ts-ignore\n new URL(`http://[${payload.value}]`);\n // return;\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"ipv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodMAC = /*@__PURE__*/ core.$constructor(\"$ZodMAC\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.mac(def.delimiter));\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `mac`;\n});\nexport const $ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv4);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv6); // not used for validation\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n const parts = payload.value.split(\"/\");\n try {\n if (parts.length !== 2)\n throw new Error();\n const [address, prefix] = parts;\n if (!prefix)\n throw new Error();\n const prefixNum = Number(prefix);\n if (`${prefixNum}` !== prefix)\n throw new Error();\n if (prefixNum < 0 || prefixNum > 128)\n throw new Error();\n // @ts-ignore\n new URL(`http://[${address}]`);\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"cidrv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64(data) {\n if (data === \"\")\n return true;\n if (data.length % 4 !== 0)\n return false;\n try {\n // @ts-ignore\n atob(data);\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodBase64 = /*@__PURE__*/ core.$constructor(\"$ZodBase64\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64\";\n inst._zod.check = (payload) => {\n if (isValidBase64(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64URL(data) {\n if (!regexes.base64url.test(data))\n return false;\n const base64 = data.replace(/[-_]/g, (c) => (c === \"-\" ? \"+\" : \"/\"));\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\");\n return isValidBase64(padded);\n}\nexport const $ZodBase64URL = /*@__PURE__*/ core.$constructor(\"$ZodBase64URL\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64url);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64url\";\n inst._zod.check = (payload) => {\n if (isValidBase64URL(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodE164 = /*@__PURE__*/ core.$constructor(\"$ZodE164\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.e164);\n $ZodStringFormat.init(inst, def);\n});\n////////////////////////////// ZodJWT //////////////////////////////\nexport function isValidJWT(token, algorithm = null) {\n try {\n const tokensParts = token.split(\".\");\n if (tokensParts.length !== 3)\n return false;\n const [header] = tokensParts;\n if (!header)\n return false;\n // @ts-ignore\n const parsedHeader = JSON.parse(atob(header));\n if (\"typ\" in parsedHeader && parsedHeader?.typ !== \"JWT\")\n return false;\n if (!parsedHeader.alg)\n return false;\n if (algorithm && (!(\"alg\" in parsedHeader) || parsedHeader.alg !== algorithm))\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodJWT = /*@__PURE__*/ core.$constructor(\"$ZodJWT\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (isValidJWT(payload.value, def.alg))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"jwt\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCustomStringFormat\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (def.fn(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodNumber = /*@__PURE__*/ core.$constructor(\"$ZodNumber\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = inst._zod.bag.pattern ?? regexes.number;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Number(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"number\" && !Number.isNaN(input) && Number.isFinite(input)) {\n return payload;\n }\n const received = typeof input === \"number\"\n ? Number.isNaN(input)\n ? \"NaN\"\n : !Number.isFinite(input)\n ? \"Infinity\"\n : undefined\n : undefined;\n payload.issues.push({\n expected: \"number\",\n code: \"invalid_type\",\n input,\n inst,\n ...(received ? { received } : {}),\n });\n return payload;\n };\n});\nexport const $ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodNumberFormat\", (inst, def) => {\n checks.$ZodCheckNumberFormat.init(inst, def);\n $ZodNumber.init(inst, def); // no format checks\n});\nexport const $ZodBoolean = /*@__PURE__*/ core.$constructor(\"$ZodBoolean\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.boolean;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Boolean(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"boolean\")\n return payload;\n payload.issues.push({\n expected: \"boolean\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigInt = /*@__PURE__*/ core.$constructor(\"$ZodBigInt\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.bigint;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = BigInt(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"bigint\")\n return payload;\n payload.issues.push({\n expected: \"bigint\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodBigIntFormat\", (inst, def) => {\n checks.$ZodCheckBigIntFormat.init(inst, def);\n $ZodBigInt.init(inst, def); // no format checks\n});\nexport const $ZodSymbol = /*@__PURE__*/ core.$constructor(\"$ZodSymbol\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"symbol\")\n return payload;\n payload.issues.push({\n expected: \"symbol\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodUndefined = /*@__PURE__*/ core.$constructor(\"$ZodUndefined\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.undefined;\n inst._zod.values = new Set([undefined]);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"undefined\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodNull = /*@__PURE__*/ core.$constructor(\"$ZodNull\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.null;\n inst._zod.values = new Set([null]);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (input === null)\n return payload;\n payload.issues.push({\n expected: \"null\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodAny = /*@__PURE__*/ core.$constructor(\"$ZodAny\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodUnknown = /*@__PURE__*/ core.$constructor(\"$ZodUnknown\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodNever = /*@__PURE__*/ core.$constructor(\"$ZodNever\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n payload.issues.push({\n expected: \"never\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodVoid = /*@__PURE__*/ core.$constructor(\"$ZodVoid\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"void\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodDate = /*@__PURE__*/ core.$constructor(\"$ZodDate\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce) {\n try {\n payload.value = new Date(payload.value);\n }\n catch (_err) { }\n }\n const input = payload.value;\n const isDate = input instanceof Date;\n const isValidDate = isDate && !Number.isNaN(input.getTime());\n if (isValidDate)\n return payload;\n payload.issues.push({\n expected: \"date\",\n code: \"invalid_type\",\n input,\n ...(isDate ? { received: \"Invalid Date\" } : {}),\n inst,\n });\n return payload;\n };\n});\nfunction handleArrayResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodArray = /*@__PURE__*/ core.$constructor(\"$ZodArray\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n expected: \"array\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = Array(input.length);\n const proms = [];\n for (let i = 0; i < input.length; i++) {\n const item = input[i];\n const result = def.element._zod.run({\n value: item,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleArrayResult(result, payload, i)));\n }\n else {\n handleArrayResult(result, payload, i);\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload; //handleArrayResultsAsync(parseResults, final);\n };\n});\nfunction handlePropertyResult(result, final, key, input, isOptionalOut) {\n if (result.issues.length) {\n // For optional-out schemas, ignore errors on absent keys\n if (isOptionalOut && !(key in input)) {\n return;\n }\n final.issues.push(...util.prefixIssues(key, result.issues));\n }\n if (result.value === undefined) {\n if (key in input) {\n final.value[key] = undefined;\n }\n }\n else {\n final.value[key] = result.value;\n }\n}\nfunction normalizeDef(def) {\n const keys = Object.keys(def.shape);\n for (const k of keys) {\n if (!def.shape?.[k]?._zod?.traits?.has(\"$ZodType\")) {\n throw new Error(`Invalid element at key \"${k}\": expected a Zod schema`);\n }\n }\n const okeys = util.optionalKeys(def.shape);\n return {\n ...def,\n keys,\n keySet: new Set(keys),\n numKeys: keys.length,\n optionalKeys: new Set(okeys),\n };\n}\nfunction handleCatchall(proms, input, payload, ctx, def, inst) {\n const unrecognized = [];\n // iterate over input keys\n const keySet = def.keySet;\n const _catchall = def.catchall._zod;\n const t = _catchall.def.type;\n const isOptionalOut = _catchall.optout === \"optional\";\n for (const key in input) {\n if (keySet.has(key))\n continue;\n if (t === \"never\") {\n unrecognized.push(key);\n continue;\n }\n const r = _catchall.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (unrecognized.length) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n keys: unrecognized,\n input,\n inst,\n });\n }\n if (!proms.length)\n return payload;\n return Promise.all(proms).then(() => {\n return payload;\n });\n}\nexport const $ZodObject = /*@__PURE__*/ core.$constructor(\"$ZodObject\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodType.init(inst, def);\n // const sh = def.shape;\n const desc = Object.getOwnPropertyDescriptor(def, \"shape\");\n if (!desc?.get) {\n const sh = def.shape;\n Object.defineProperty(def, \"shape\", {\n get: () => {\n const newSh = { ...sh };\n Object.defineProperty(def, \"shape\", {\n value: newSh,\n });\n return newSh;\n },\n });\n }\n const _normalized = util.cached(() => normalizeDef(def));\n util.defineLazy(inst._zod, \"propValues\", () => {\n const shape = def.shape;\n const propValues = {};\n for (const key in shape) {\n const field = shape[key]._zod;\n if (field.values) {\n propValues[key] ?? (propValues[key] = new Set());\n for (const v of field.values)\n propValues[key].add(v);\n }\n }\n return propValues;\n });\n const isObject = util.isObject;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = {};\n const proms = [];\n const shape = value.shape;\n for (const key of value.keys) {\n const el = shape[key];\n const isOptionalOut = el._zod.optout === \"optional\";\n const r = el._zod.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (!catchall) {\n return proms.length ? Promise.all(proms).then(() => payload) : payload;\n }\n return handleCatchall(proms, input, payload, ctx, _normalized.value, inst);\n };\n});\nexport const $ZodObjectJIT = /*@__PURE__*/ core.$constructor(\"$ZodObjectJIT\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodObject.init(inst, def);\n const superParse = inst._zod.parse;\n const _normalized = util.cached(() => normalizeDef(def));\n const generateFastpass = (shape) => {\n const doc = new Doc([\"shape\", \"payload\", \"ctx\"]);\n const normalized = _normalized.value;\n const parseStr = (key) => {\n const k = util.esc(key);\n return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`;\n };\n doc.write(`const input = payload.value;`);\n const ids = Object.create(null);\n let counter = 0;\n for (const key of normalized.keys) {\n ids[key] = `key_${counter++}`;\n }\n // A: preserve key order {\n doc.write(`const newResult = {};`);\n for (const key of normalized.keys) {\n const id = ids[key];\n const k = util.esc(key);\n const schema = shape[key];\n const isOptionalOut = schema?._zod?.optout === \"optional\";\n doc.write(`const ${id} = ${parseStr(key)};`);\n if (isOptionalOut) {\n // For optional-out schemas, ignore errors on absent keys\n doc.write(`\n if (${id}.issues.length) {\n if (${k} in input) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n else {\n doc.write(`\n if (${id}.issues.length) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n }\n doc.write(`payload.value = newResult;`);\n doc.write(`return payload;`);\n const fn = doc.compile();\n return (payload, ctx) => fn(shape, payload, ctx);\n };\n let fastpass;\n const isObject = util.isObject;\n const jit = !core.globalConfig.jitless;\n const allowsEval = util.allowsEval;\n const fastEnabled = jit && allowsEval.value; // && !def.catchall;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) {\n // always synchronous\n if (!fastpass)\n fastpass = generateFastpass(def.shape);\n payload = fastpass(payload, ctx);\n if (!catchall)\n return payload;\n return handleCatchall([], input, payload, ctx, value, inst);\n }\n return superParse(payload, ctx);\n };\n});\nfunction handleUnionResults(results, final, inst, ctx) {\n for (const result of results) {\n if (result.issues.length === 0) {\n final.value = result.value;\n return final;\n }\n }\n const nonaborted = results.filter((r) => !util.aborted(r));\n if (nonaborted.length === 1) {\n final.value = nonaborted[0].value;\n return nonaborted[0];\n }\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n return final;\n}\nexport const $ZodUnion = /*@__PURE__*/ core.$constructor(\"$ZodUnion\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.options.some((o) => o._zod.optin === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"optout\", () => def.options.some((o) => o._zod.optout === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"values\", () => {\n if (def.options.every((o) => o._zod.values)) {\n return new Set(def.options.flatMap((option) => Array.from(option._zod.values)));\n }\n return undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n if (def.options.every((o) => o._zod.pattern)) {\n const patterns = def.options.map((o) => o._zod.pattern);\n return new RegExp(`^(${patterns.map((p) => util.cleanRegex(p.source)).join(\"|\")})$`);\n }\n return undefined;\n });\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n if (result.issues.length === 0)\n return result;\n results.push(result);\n }\n }\n if (!async)\n return handleUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleUnionResults(results, payload, inst, ctx);\n });\n };\n});\nfunction handleExclusiveUnionResults(results, final, inst, ctx) {\n const successes = results.filter((r) => r.issues.length === 0);\n if (successes.length === 1) {\n final.value = successes[0].value;\n return final;\n }\n if (successes.length === 0) {\n // No matches - same as regular union\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n }\n else {\n // Multiple matches - exclusive union failure\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: [],\n inclusive: false,\n });\n }\n return final;\n}\nexport const $ZodXor = /*@__PURE__*/ core.$constructor(\"$ZodXor\", (inst, def) => {\n $ZodUnion.init(inst, def);\n def.inclusive = false;\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n results.push(result);\n }\n }\n if (!async)\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n });\n };\n});\nexport const $ZodDiscriminatedUnion = \n/*@__PURE__*/\ncore.$constructor(\"$ZodDiscriminatedUnion\", (inst, def) => {\n def.inclusive = false;\n $ZodUnion.init(inst, def);\n const _super = inst._zod.parse;\n util.defineLazy(inst._zod, \"propValues\", () => {\n const propValues = {};\n for (const option of def.options) {\n const pv = option._zod.propValues;\n if (!pv || Object.keys(pv).length === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(option)}\"`);\n for (const [k, v] of Object.entries(pv)) {\n if (!propValues[k])\n propValues[k] = new Set();\n for (const val of v) {\n propValues[k].add(val);\n }\n }\n }\n return propValues;\n });\n const disc = util.cached(() => {\n const opts = def.options;\n const map = new Map();\n for (const o of opts) {\n const values = o._zod.propValues?.[def.discriminator];\n if (!values || values.size === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(o)}\"`);\n for (const v of values) {\n if (map.has(v)) {\n throw new Error(`Duplicate discriminator value \"${String(v)}\"`);\n }\n map.set(v, o);\n }\n }\n return map;\n });\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isObject(input)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"object\",\n input,\n inst,\n });\n return payload;\n }\n const opt = disc.value.get(input?.[def.discriminator]);\n if (opt) {\n return opt._zod.run(payload, ctx);\n }\n if (def.unionFallback) {\n return _super(payload, ctx);\n }\n // no matching discriminator\n payload.issues.push({\n code: \"invalid_union\",\n errors: [],\n note: \"No matching discriminator\",\n discriminator: def.discriminator,\n input,\n path: [def.discriminator],\n inst,\n });\n return payload;\n };\n});\nexport const $ZodIntersection = /*@__PURE__*/ core.$constructor(\"$ZodIntersection\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n const left = def.left._zod.run({ value: input, issues: [] }, ctx);\n const right = def.right._zod.run({ value: input, issues: [] }, ctx);\n const async = left instanceof Promise || right instanceof Promise;\n if (async) {\n return Promise.all([left, right]).then(([left, right]) => {\n return handleIntersectionResults(payload, left, right);\n });\n }\n return handleIntersectionResults(payload, left, right);\n };\n});\nfunction mergeValues(a, b) {\n // const aType = parse.t(a);\n // const bType = parse.t(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n if (a instanceof Date && b instanceof Date && +a === +b) {\n return { valid: true, data: a };\n }\n if (util.isPlainObject(a) && util.isPlainObject(b)) {\n const bKeys = Object.keys(b);\n const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [key, ...sharedValue.mergeErrorPath],\n };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return { valid: false, mergeErrorPath: [] };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [index, ...sharedValue.mergeErrorPath],\n };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n return { valid: false, mergeErrorPath: [] };\n}\nfunction handleIntersectionResults(result, left, right) {\n // Track which side(s) report each key as unrecognized\n const unrecKeys = new Map();\n let unrecIssue;\n for (const iss of left.issues) {\n if (iss.code === \"unrecognized_keys\") {\n unrecIssue ?? (unrecIssue = iss);\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).l = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n for (const iss of right.issues) {\n if (iss.code === \"unrecognized_keys\") {\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).r = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n // Report only keys unrecognized by BOTH sides\n const bothKeys = [...unrecKeys].filter(([, f]) => f.l && f.r).map(([k]) => k);\n if (bothKeys.length && unrecIssue) {\n result.issues.push({ ...unrecIssue, keys: bothKeys });\n }\n if (util.aborted(result))\n return result;\n const merged = mergeValues(left.value, right.value);\n if (!merged.valid) {\n throw new Error(`Unmergable intersection. Error path: ` + `${JSON.stringify(merged.mergeErrorPath)}`);\n }\n result.value = merged.data;\n return result;\n}\nexport const $ZodTuple = /*@__PURE__*/ core.$constructor(\"$ZodTuple\", (inst, def) => {\n $ZodType.init(inst, def);\n const items = def.items;\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n input,\n inst,\n expected: \"tuple\",\n code: \"invalid_type\",\n });\n return payload;\n }\n payload.value = [];\n const proms = [];\n const reversedIndex = [...items].reverse().findIndex((item) => item._zod.optin !== \"optional\");\n const optStart = reversedIndex === -1 ? 0 : items.length - reversedIndex;\n if (!def.rest) {\n const tooBig = input.length > items.length;\n const tooSmall = input.length < optStart - 1;\n if (tooBig || tooSmall) {\n payload.issues.push({\n ...(tooBig\n ? { code: \"too_big\", maximum: items.length, inclusive: true }\n : { code: \"too_small\", minimum: items.length }),\n input,\n inst,\n origin: \"array\",\n });\n return payload;\n }\n }\n let i = -1;\n for (const item of items) {\n i++;\n if (i >= input.length)\n if (i >= optStart)\n continue;\n const result = item._zod.run({\n value: input[i],\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n if (def.rest) {\n const rest = input.slice(items.length);\n for (const el of rest) {\n i++;\n const result = def.rest._zod.run({\n value: el,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleTupleResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodRecord = /*@__PURE__*/ core.$constructor(\"$ZodRecord\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isPlainObject(input)) {\n payload.issues.push({\n expected: \"record\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n const values = def.keyType._zod.values;\n if (values) {\n payload.value = {};\n const recordKeys = new Set();\n for (const key of values) {\n if (typeof key === \"string\" || typeof key === \"number\" || typeof key === \"symbol\") {\n recordKeys.add(typeof key === \"number\" ? key.toString() : key);\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }\n }\n }\n let unrecognized;\n for (const key in input) {\n if (!recordKeys.has(key)) {\n unrecognized = unrecognized ?? [];\n unrecognized.push(key);\n }\n }\n if (unrecognized && unrecognized.length > 0) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n input,\n inst,\n keys: unrecognized,\n });\n }\n }\n else {\n payload.value = {};\n for (const key of Reflect.ownKeys(input)) {\n if (key === \"__proto__\")\n continue;\n let keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n if (keyResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n // Numeric string fallback: if key is a numeric string and failed, retry with Number(key)\n // This handles z.number(), z.literal([1, 2, 3]), and unions containing numeric literals\n const checkNumericKey = typeof key === \"string\" && regexes.number.test(key) && keyResult.issues.length;\n if (checkNumericKey) {\n const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx);\n if (retryResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n if (retryResult.issues.length === 0) {\n keyResult = retryResult;\n }\n }\n if (keyResult.issues.length) {\n if (def.mode === \"loose\") {\n // Pass through unchanged\n payload.value[key] = input[key];\n }\n else {\n // Default \"strict\" behavior: error on invalid key\n payload.issues.push({\n code: \"invalid_key\",\n origin: \"record\",\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n input: key,\n path: [key],\n inst,\n });\n }\n continue;\n }\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload;\n };\n});\nexport const $ZodMap = /*@__PURE__*/ core.$constructor(\"$ZodMap\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Map)) {\n payload.issues.push({\n expected: \"map\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n payload.value = new Map();\n for (const [key, value] of input) {\n const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n const valueResult = def.valueType._zod.run({ value: value, issues: [] }, ctx);\n if (keyResult instanceof Promise || valueResult instanceof Promise) {\n proms.push(Promise.all([keyResult, valueResult]).then(([keyResult, valueResult]) => {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }));\n }\n else {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) {\n if (keyResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, keyResult.issues));\n }\n else {\n final.issues.push({\n code: \"invalid_key\",\n origin: \"map\",\n input,\n inst,\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n if (valueResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, valueResult.issues));\n }\n else {\n final.issues.push({\n origin: \"map\",\n code: \"invalid_element\",\n input,\n inst,\n key: key,\n issues: valueResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n final.value.set(keyResult.value, valueResult.value);\n}\nexport const $ZodSet = /*@__PURE__*/ core.$constructor(\"$ZodSet\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Set)) {\n payload.issues.push({\n input,\n inst,\n expected: \"set\",\n code: \"invalid_type\",\n });\n return payload;\n }\n const proms = [];\n payload.value = new Set();\n for (const item of input) {\n const result = def.valueType._zod.run({ value: item, issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleSetResult(result, payload)));\n }\n else\n handleSetResult(result, payload);\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleSetResult(result, final) {\n if (result.issues.length) {\n final.issues.push(...result.issues);\n }\n final.value.add(result.value);\n}\nexport const $ZodEnum = /*@__PURE__*/ core.$constructor(\"$ZodEnum\", (inst, def) => {\n $ZodType.init(inst, def);\n const values = util.getEnumValues(def.entries);\n const valuesSet = new Set(values);\n inst._zod.values = valuesSet;\n inst._zod.pattern = new RegExp(`^(${values\n .filter((k) => util.propertyKeyTypes.has(typeof k))\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o.toString()))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (valuesSet.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodLiteral = /*@__PURE__*/ core.$constructor(\"$ZodLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n if (def.values.length === 0) {\n throw new Error(\"Cannot create literal schema with no valid values\");\n }\n const values = new Set(def.values);\n inst._zod.values = values;\n inst._zod.pattern = new RegExp(`^(${def.values\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (values.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values: def.values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodFile = /*@__PURE__*/ core.$constructor(\"$ZodFile\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n // @ts-ignore\n if (input instanceof File)\n return payload;\n payload.issues.push({\n expected: \"file\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodTransform = /*@__PURE__*/ core.$constructor(\"$ZodTransform\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n const _out = def.transform(payload.value, payload);\n if (ctx.async) {\n const output = _out instanceof Promise ? _out : Promise.resolve(_out);\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n if (_out instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n payload.value = _out;\n return payload;\n };\n});\nfunction handleOptionalResult(result, input) {\n if (result.issues.length && input === undefined) {\n return { issues: [], value: undefined };\n }\n return result;\n}\nexport const $ZodOptional = /*@__PURE__*/ core.$constructor(\"$ZodOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, undefined]) : undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)})?$`) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n if (def.innerType._zod.optin === \"optional\") {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise)\n return result.then((r) => handleOptionalResult(r, payload.value));\n return handleOptionalResult(result, payload.value);\n }\n if (payload.value === undefined) {\n return payload;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodExactOptional = /*@__PURE__*/ core.$constructor(\"$ZodExactOptional\", (inst, def) => {\n // Call parent init - inherits optin/optout = \"optional\"\n $ZodOptional.init(inst, def);\n // Override values/pattern to NOT add undefined\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"pattern\", () => def.innerType._zod.pattern);\n // Override parse to just delegate (no undefined handling)\n inst._zod.parse = (payload, ctx) => {\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNullable = /*@__PURE__*/ core.$constructor(\"$ZodNullable\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)}|null)$`) : undefined;\n });\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, null]) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n // Forward direction (decode): allow null to pass through\n if (payload.value === null)\n return payload;\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodDefault = /*@__PURE__*/ core.$constructor(\"$ZodDefault\", (inst, def) => {\n $ZodType.init(inst, def);\n // inst._zod.qin = \"true\";\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply defaults for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n /**\n * $ZodDefault returns the default value immediately in forward direction.\n * It doesn't pass the default value into the validator (\"prefault\"). There's no reason to pass the default value through validation. The validity of the default is enforced by TypeScript statically. Otherwise, it's the responsibility of the user to ensure the default is valid. In the case of pipes with divergent in/out types, you can specify the default on the `in` schema of your ZodPipe to set a \"prefault\" for the pipe. */\n return payload;\n }\n // Forward direction: continue with default handling\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleDefaultResult(result, def));\n }\n return handleDefaultResult(result, def);\n };\n});\nfunction handleDefaultResult(payload, def) {\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return payload;\n}\nexport const $ZodPrefault = /*@__PURE__*/ core.$constructor(\"$ZodPrefault\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply prefault for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNonOptional = /*@__PURE__*/ core.$constructor(\"$ZodNonOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => {\n const v = def.innerType._zod.values;\n return v ? new Set([...v].filter((x) => x !== undefined)) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleNonOptionalResult(result, inst));\n }\n return handleNonOptionalResult(result, inst);\n };\n});\nfunction handleNonOptionalResult(payload, inst) {\n if (!payload.issues.length && payload.value === undefined) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"nonoptional\",\n input: payload.value,\n inst,\n });\n }\n return payload;\n}\nexport const $ZodSuccess = /*@__PURE__*/ core.$constructor(\"$ZodSuccess\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(\"ZodSuccess\");\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.issues.length === 0;\n return payload;\n });\n }\n payload.value = result.issues.length === 0;\n return payload;\n };\n});\nexport const $ZodCatch = /*@__PURE__*/ core.$constructor(\"$ZodCatch\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply catch logic\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n });\n }\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n };\n});\nexport const $ZodNaN = /*@__PURE__*/ core.$constructor(\"$ZodNaN\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"number\" || !Number.isNaN(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"nan\",\n code: \"invalid_type\",\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodPipe = /*@__PURE__*/ core.$constructor(\"$ZodPipe\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handlePipeResult(right, def.in, ctx));\n }\n return handlePipeResult(right, def.in, ctx);\n }\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handlePipeResult(left, def.out, ctx));\n }\n return handlePipeResult(left, def.out, ctx);\n };\n});\nfunction handlePipeResult(left, next, ctx) {\n if (left.issues.length) {\n // prevent further checks\n left.aborted = true;\n return left;\n }\n return next._zod.run({ value: left.value, issues: left.issues }, ctx);\n}\nexport const $ZodCodec = /*@__PURE__*/ core.$constructor(\"$ZodCodec\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handleCodecAResult(left, def, ctx));\n }\n return handleCodecAResult(left, def, ctx);\n }\n else {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handleCodecAResult(right, def, ctx));\n }\n return handleCodecAResult(right, def, ctx);\n }\n };\n});\nfunction handleCodecAResult(result, def, ctx) {\n if (result.issues.length) {\n // prevent further checks\n result.aborted = true;\n return result;\n }\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const transformed = def.transform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.out, ctx));\n }\n return handleCodecTxResult(result, transformed, def.out, ctx);\n }\n else {\n const transformed = def.reverseTransform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.in, ctx));\n }\n return handleCodecTxResult(result, transformed, def.in, ctx);\n }\n}\nfunction handleCodecTxResult(left, value, nextSchema, ctx) {\n // Check if transform added any issues\n if (left.issues.length) {\n left.aborted = true;\n return left;\n }\n return nextSchema._zod.run({ value, issues: left.issues }, ctx);\n}\nexport const $ZodReadonly = /*@__PURE__*/ core.$constructor(\"$ZodReadonly\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"propValues\", () => def.innerType._zod.propValues);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType?._zod?.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType?._zod?.optout);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then(handleReadonlyResult);\n }\n return handleReadonlyResult(result);\n };\n});\nfunction handleReadonlyResult(payload) {\n payload.value = Object.freeze(payload.value);\n return payload;\n}\nexport const $ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"$ZodTemplateLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n const regexParts = [];\n for (const part of def.parts) {\n if (typeof part === \"object\" && part !== null) {\n // is Zod schema\n if (!part._zod.pattern) {\n // if (!source)\n throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`);\n }\n const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;\n if (!source)\n throw new Error(`Invalid template literal part: ${part._zod.traits}`);\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n regexParts.push(source.slice(start, end));\n }\n else if (part === null || util.primitiveTypes.has(typeof part)) {\n regexParts.push(util.escapeRegex(`${part}`));\n }\n else {\n throw new Error(`Invalid template literal part: ${part}`);\n }\n }\n inst._zod.pattern = new RegExp(`^${regexParts.join(\"\")}$`);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"string\") {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"string\",\n code: \"invalid_type\",\n });\n return payload;\n }\n inst._zod.pattern.lastIndex = 0;\n if (!inst._zod.pattern.test(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n code: \"invalid_format\",\n format: def.format ?? \"template_literal\",\n pattern: inst._zod.pattern.source,\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodFunction = /*@__PURE__*/ core.$constructor(\"$ZodFunction\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._def = def;\n inst._zod.def = def;\n inst.implement = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implement() must be called with a function\");\n }\n return function (...args) {\n const parsedArgs = inst._def.input ? parse(inst._def.input, args) : args;\n const result = Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return parse(inst._def.output, result);\n }\n return result;\n };\n };\n inst.implementAsync = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implementAsync() must be called with a function\");\n }\n return async function (...args) {\n const parsedArgs = inst._def.input ? await parseAsync(inst._def.input, args) : args;\n const result = await Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return await parseAsync(inst._def.output, result);\n }\n return result;\n };\n };\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"function\") {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"function\",\n input: payload.value,\n inst,\n });\n return payload;\n }\n // Check if output is a promise type to determine if we should use async implementation\n const hasPromiseOutput = inst._def.output && inst._def.output._zod.def.type === \"promise\";\n if (hasPromiseOutput) {\n payload.value = inst.implementAsync(payload.value);\n }\n else {\n payload.value = inst.implement(payload.value);\n }\n return payload;\n };\n inst.input = (...args) => {\n const F = inst.constructor;\n if (Array.isArray(args[0])) {\n return new F({\n type: \"function\",\n input: new $ZodTuple({\n type: \"tuple\",\n items: args[0],\n rest: args[1],\n }),\n output: inst._def.output,\n });\n }\n return new F({\n type: \"function\",\n input: args[0],\n output: inst._def.output,\n });\n };\n inst.output = (output) => {\n const F = inst.constructor;\n return new F({\n type: \"function\",\n input: inst._def.input,\n output,\n });\n };\n return inst;\n});\nexport const $ZodPromise = /*@__PURE__*/ core.$constructor(\"$ZodPromise\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx));\n };\n});\nexport const $ZodLazy = /*@__PURE__*/ core.$constructor(\"$ZodLazy\", (inst, def) => {\n $ZodType.init(inst, def);\n // let _innerType!: any;\n // util.defineLazy(def, \"getter\", () => {\n // if (!_innerType) {\n // _innerType = def.getter();\n // }\n // return () => _innerType;\n // });\n util.defineLazy(inst._zod, \"innerType\", () => def.getter());\n util.defineLazy(inst._zod, \"pattern\", () => inst._zod.innerType?._zod?.pattern);\n util.defineLazy(inst._zod, \"propValues\", () => inst._zod.innerType?._zod?.propValues);\n util.defineLazy(inst._zod, \"optin\", () => inst._zod.innerType?._zod?.optin ?? undefined);\n util.defineLazy(inst._zod, \"optout\", () => inst._zod.innerType?._zod?.optout ?? undefined);\n inst._zod.parse = (payload, ctx) => {\n const inner = inst._zod.innerType;\n return inner._zod.run(payload, ctx);\n };\n});\nexport const $ZodCustom = /*@__PURE__*/ core.$constructor(\"$ZodCustom\", (inst, def) => {\n checks.$ZodCheck.init(inst, def);\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _) => {\n return payload;\n };\n inst._zod.check = (payload) => {\n const input = payload.value;\n const r = def.fn(input);\n if (r instanceof Promise) {\n return r.then((r) => handleRefineResult(r, payload, input, inst));\n }\n handleRefineResult(r, payload, input, inst);\n return;\n };\n});\nfunction handleRefineResult(result, payload, input, inst) {\n if (!result) {\n const _iss = {\n code: \"custom\",\n input,\n inst, // incorporates params.error into issue reporting\n path: [...(inst._zod.def.path ?? [])], // incorporates params.error into issue reporting\n continue: !inst._zod.def.abort,\n // params: inst._zod.def.params,\n };\n if (inst._zod.def.params)\n _iss.params = inst._zod.def.params;\n payload.issues.push(util.issue(_iss));\n }\n}\n","var _a;\nexport const $output = Symbol(\"ZodOutput\");\nexport const $input = Symbol(\"ZodInput\");\nexport class $ZodRegistry {\n constructor() {\n this._map = new WeakMap();\n this._idmap = new Map();\n }\n add(schema, ..._meta) {\n const meta = _meta[0];\n this._map.set(schema, meta);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.set(meta.id, schema);\n }\n return this;\n }\n clear() {\n this._map = new WeakMap();\n this._idmap = new Map();\n return this;\n }\n remove(schema) {\n const meta = this._map.get(schema);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.delete(meta.id);\n }\n this._map.delete(schema);\n return this;\n }\n get(schema) {\n // return this._map.get(schema) as any;\n // inherit metadata\n const p = schema._zod.parent;\n if (p) {\n const pm = { ...(this.get(p) ?? {}) };\n delete pm.id; // do not inherit id\n const f = { ...pm, ...this._map.get(schema) };\n return Object.keys(f).length ? f : undefined;\n }\n return this._map.get(schema);\n }\n has(schema) {\n return this._map.has(schema);\n }\n}\n// registries\nexport function registry() {\n return new $ZodRegistry();\n}\n(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());\nexport const globalRegistry = globalThis.__zod_globalRegistry;\n","import * as checks from \"./checks.js\";\nimport * as registries from \"./registries.js\";\nimport * as schemas from \"./schemas.js\";\nimport * as util from \"./util.js\";\n// @__NO_SIDE_EFFECTS__\nexport function _string(Class, params) {\n return new Class({\n type: \"string\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedString(Class, params) {\n return new Class({\n type: \"string\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _email(Class, params) {\n return new Class({\n type: \"string\",\n format: \"email\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _guid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"guid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v4\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v6\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv7(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v7\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _emoji(Class, params) {\n return new Class({\n type: \"string\",\n format: \"emoji\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nanoid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"nanoid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid2(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid2\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ulid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ulid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _xid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"xid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ksuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ksuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mac(Class, params) {\n return new Class({\n type: \"string\",\n format: \"mac\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _e164(Class, params) {\n return new Class({\n type: \"string\",\n format: \"e164\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _jwt(Class, params) {\n return new Class({\n type: \"string\",\n format: \"jwt\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\nexport const TimePrecision = {\n Any: null,\n Minute: -1,\n Second: 0,\n Millisecond: 3,\n Microsecond: 6,\n};\n// @__NO_SIDE_EFFECTS__\nexport function _isoDateTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"datetime\",\n check: \"string_format\",\n offset: false,\n local: false,\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDate(Class, params) {\n return new Class({\n type: \"string\",\n format: \"date\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"time\",\n check: \"string_format\",\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDuration(Class, params) {\n return new Class({\n type: \"string\",\n format: \"duration\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _number(Class, params) {\n return new Class({\n type: \"number\",\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedNumber(Class, params) {\n return new Class({\n type: \"number\",\n coerce: true,\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"safeint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float64(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"int32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"uint32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _boolean(Class, params) {\n return new Class({\n type: \"boolean\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBoolean(Class, params) {\n return new Class({\n type: \"boolean\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _bigint(Class, params) {\n return new Class({\n type: \"bigint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBigint(Class, params) {\n return new Class({\n type: \"bigint\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"int64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"uint64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _symbol(Class, params) {\n return new Class({\n type: \"symbol\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _undefined(Class, params) {\n return new Class({\n type: \"undefined\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _null(Class, params) {\n return new Class({\n type: \"null\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _any(Class) {\n return new Class({\n type: \"any\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _unknown(Class) {\n return new Class({\n type: \"unknown\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _never(Class, params) {\n return new Class({\n type: \"never\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _void(Class, params) {\n return new Class({\n type: \"void\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _date(Class, params) {\n return new Class({\n type: \"date\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedDate(Class, params) {\n return new Class({\n type: \"date\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nan(Class, params) {\n return new Class({\n type: \"nan\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lt(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lte(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.lte()` instead. */\n_lte as _max, };\n// @__NO_SIDE_EFFECTS__\nexport function _gt(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _gte(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.gte()` instead. */\n_gte as _min, };\n// @__NO_SIDE_EFFECTS__\nexport function _positive(params) {\n return _gt(0, params);\n}\n// negative\n// @__NO_SIDE_EFFECTS__\nexport function _negative(params) {\n return _lt(0, params);\n}\n// nonpositive\n// @__NO_SIDE_EFFECTS__\nexport function _nonpositive(params) {\n return _lte(0, params);\n}\n// nonnegative\n// @__NO_SIDE_EFFECTS__\nexport function _nonnegative(params) {\n return _gte(0, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function _multipleOf(value, params) {\n return new checks.$ZodCheckMultipleOf({\n check: \"multiple_of\",\n ...util.normalizeParams(params),\n value,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxSize(maximum, params) {\n return new checks.$ZodCheckMaxSize({\n check: \"max_size\",\n ...util.normalizeParams(params),\n maximum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minSize(minimum, params) {\n return new checks.$ZodCheckMinSize({\n check: \"min_size\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _size(size, params) {\n return new checks.$ZodCheckSizeEquals({\n check: \"size_equals\",\n ...util.normalizeParams(params),\n size,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxLength(maximum, params) {\n const ch = new checks.$ZodCheckMaxLength({\n check: \"max_length\",\n ...util.normalizeParams(params),\n maximum,\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minLength(minimum, params) {\n return new checks.$ZodCheckMinLength({\n check: \"min_length\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _length(length, params) {\n return new checks.$ZodCheckLengthEquals({\n check: \"length_equals\",\n ...util.normalizeParams(params),\n length,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _regex(pattern, params) {\n return new checks.$ZodCheckRegex({\n check: \"string_format\",\n format: \"regex\",\n ...util.normalizeParams(params),\n pattern,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lowercase(params) {\n return new checks.$ZodCheckLowerCase({\n check: \"string_format\",\n format: \"lowercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uppercase(params) {\n return new checks.$ZodCheckUpperCase({\n check: \"string_format\",\n format: \"uppercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _includes(includes, params) {\n return new checks.$ZodCheckIncludes({\n check: \"string_format\",\n format: \"includes\",\n ...util.normalizeParams(params),\n includes,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _startsWith(prefix, params) {\n return new checks.$ZodCheckStartsWith({\n check: \"string_format\",\n format: \"starts_with\",\n ...util.normalizeParams(params),\n prefix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _endsWith(suffix, params) {\n return new checks.$ZodCheckEndsWith({\n check: \"string_format\",\n format: \"ends_with\",\n ...util.normalizeParams(params),\n suffix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _property(property, schema, params) {\n return new checks.$ZodCheckProperty({\n check: \"property\",\n property,\n schema,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mime(types, params) {\n return new checks.$ZodCheckMimeType({\n check: \"mime_type\",\n mime: types,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _overwrite(tx) {\n return new checks.$ZodCheckOverwrite({\n check: \"overwrite\",\n tx,\n });\n}\n// normalize\n// @__NO_SIDE_EFFECTS__\nexport function _normalize(form) {\n return _overwrite((input) => input.normalize(form));\n}\n// trim\n// @__NO_SIDE_EFFECTS__\nexport function _trim() {\n return _overwrite((input) => input.trim());\n}\n// toLowerCase\n// @__NO_SIDE_EFFECTS__\nexport function _toLowerCase() {\n return _overwrite((input) => input.toLowerCase());\n}\n// toUpperCase\n// @__NO_SIDE_EFFECTS__\nexport function _toUpperCase() {\n return _overwrite((input) => input.toUpperCase());\n}\n// slugify\n// @__NO_SIDE_EFFECTS__\nexport function _slugify() {\n return _overwrite((input) => util.slugify(input));\n}\n// @__NO_SIDE_EFFECTS__\nexport function _array(Class, element, params) {\n return new Class({\n type: \"array\",\n element,\n // get element() {\n // return element;\n // },\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _union(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n ...util.normalizeParams(params),\n });\n}\nexport function _xor(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _discriminatedUnion(Class, discriminator, options, params) {\n return new Class({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _intersection(Class, left, right) {\n return new Class({\n type: \"intersection\",\n left,\n right,\n });\n}\n// export function _tuple(\n// Class: util.SchemaClass<schemas.$ZodTuple>,\n// items: [],\n// params?: string | $ZodTupleParams\n// ): schemas.$ZodTuple<[], null>;\n// @__NO_SIDE_EFFECTS__\nexport function _tuple(Class, items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof schemas.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new Class({\n type: \"tuple\",\n items,\n rest,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _record(Class, keyType, valueType, params) {\n return new Class({\n type: \"record\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _map(Class, keyType, valueType, params) {\n return new Class({\n type: \"map\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _set(Class, valueType, params) {\n return new Class({\n type: \"set\",\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _enum(Class, values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n // if (Array.isArray(values)) {\n // for (const value of values) {\n // entries[value] = value;\n // }\n // } else {\n // Object.assign(entries, values);\n // }\n // const entries: util.EnumLike = {};\n // for (const val of values) {\n // entries[val] = val;\n // }\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function _nativeEnum(Class, entries, params) {\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _literal(Class, value, params) {\n return new Class({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _file(Class, params) {\n return new Class({\n type: \"file\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _transform(Class, fn) {\n return new Class({\n type: \"transform\",\n transform: fn,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _optional(Class, innerType) {\n return new Class({\n type: \"optional\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nullable(Class, innerType) {\n return new Class({\n type: \"nullable\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _default(Class, innerType, defaultValue) {\n return new Class({\n type: \"default\",\n innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nonoptional(Class, innerType, params) {\n return new Class({\n type: \"nonoptional\",\n innerType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _success(Class, innerType) {\n return new Class({\n type: \"success\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _catch(Class, innerType, catchValue) {\n return new Class({\n type: \"catch\",\n innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _pipe(Class, in_, out) {\n return new Class({\n type: \"pipe\",\n in: in_,\n out,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _readonly(Class, innerType) {\n return new Class({\n type: \"readonly\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _templateLiteral(Class, parts, params) {\n return new Class({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lazy(Class, getter) {\n return new Class({\n type: \"lazy\",\n getter,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _promise(Class, innerType) {\n return new Class({\n type: \"promise\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _custom(Class, fn, _params) {\n const norm = util.normalizeParams(_params);\n norm.abort ?? (norm.abort = true); // default to abort:false\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...norm,\n });\n return schema;\n}\n// same as _custom but defaults to abort:false\n// @__NO_SIDE_EFFECTS__\nexport function _refine(Class, fn, _params) {\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...util.normalizeParams(_params),\n });\n return schema;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _superRefine(fn) {\n const ch = _check((payload) => {\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, ch._zod.def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = ch);\n _issue.continue ?? (_issue.continue = !ch._zod.def.abort); // abort is always undefined, so this is always true...\n payload.issues.push(util.issue(_issue));\n }\n };\n return fn(payload.value, payload);\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _check(fn, params) {\n const ch = new checks.$ZodCheck({\n check: \"custom\",\n ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function describe(description) {\n const ch = new checks.$ZodCheck({ check: \"describe\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, description });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function meta(metadata) {\n const ch = new checks.$ZodCheck({ check: \"meta\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, ...metadata });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringbool(Classes, _params) {\n const params = util.normalizeParams(_params);\n let truthyArray = params.truthy ?? [\"true\", \"1\", \"yes\", \"on\", \"y\", \"enabled\"];\n let falsyArray = params.falsy ?? [\"false\", \"0\", \"no\", \"off\", \"n\", \"disabled\"];\n if (params.case !== \"sensitive\") {\n truthyArray = truthyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n falsyArray = falsyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n }\n const truthySet = new Set(truthyArray);\n const falsySet = new Set(falsyArray);\n const _Codec = Classes.Codec ?? schemas.$ZodCodec;\n const _Boolean = Classes.Boolean ?? schemas.$ZodBoolean;\n const _String = Classes.String ?? schemas.$ZodString;\n const stringSchema = new _String({ type: \"string\", error: params.error });\n const booleanSchema = new _Boolean({ type: \"boolean\", error: params.error });\n const codec = new _Codec({\n type: \"pipe\",\n in: stringSchema,\n out: booleanSchema,\n transform: ((input, payload) => {\n let data = input;\n if (params.case !== \"sensitive\")\n data = data.toLowerCase();\n if (truthySet.has(data)) {\n return true;\n }\n else if (falsySet.has(data)) {\n return false;\n }\n else {\n payload.issues.push({\n code: \"invalid_value\",\n expected: \"stringbool\",\n values: [...truthySet, ...falsySet],\n input: payload.value,\n inst: codec,\n continue: false,\n });\n return {};\n }\n }),\n reverseTransform: ((input, _payload) => {\n if (input === true) {\n return truthyArray[0] || \"true\";\n }\n else {\n return falsyArray[0] || \"false\";\n }\n }),\n error: params.error,\n });\n return codec;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringFormat(Class, format, fnOrRegex, _params = {}) {\n const params = util.normalizeParams(_params);\n const def = {\n ...util.normalizeParams(_params),\n check: \"string_format\",\n type: \"string\",\n format,\n fn: typeof fnOrRegex === \"function\" ? fnOrRegex : (val) => fnOrRegex.test(val),\n ...params,\n };\n if (fnOrRegex instanceof RegExp) {\n def.pattern = fnOrRegex;\n }\n const inst = new Class(def);\n return inst;\n}\n","import { globalRegistry } from \"./registries.js\";\n// function initializeContext<T extends schemas.$ZodType>(inputs: JSONSchemaGeneratorParams<T>): ToJSONSchemaContext<T> {\n// return {\n// processor: inputs.processor,\n// metadataRegistry: inputs.metadata ?? globalRegistry,\n// target: inputs.target ?? \"draft-2020-12\",\n// unrepresentable: inputs.unrepresentable ?? \"throw\",\n// };\n// }\nexport function initializeContext(params) {\n // Normalize target: convert old non-hyphenated versions to hyphenated versions\n let target = params?.target ?? \"draft-2020-12\";\n if (target === \"draft-4\")\n target = \"draft-04\";\n if (target === \"draft-7\")\n target = \"draft-07\";\n return {\n processors: params.processors ?? {},\n metadataRegistry: params?.metadata ?? globalRegistry,\n target,\n unrepresentable: params?.unrepresentable ?? \"throw\",\n override: params?.override ?? (() => { }),\n io: params?.io ?? \"output\",\n counter: 0,\n seen: new Map(),\n cycles: params?.cycles ?? \"ref\",\n reused: params?.reused ?? \"inline\",\n external: params?.external ?? undefined,\n };\n}\nexport function process(schema, ctx, _params = { path: [], schemaPath: [] }) {\n var _a;\n const def = schema._zod.def;\n // check for schema in seens\n const seen = ctx.seen.get(schema);\n if (seen) {\n seen.count++;\n // check if cycle\n const isCycle = _params.schemaPath.includes(schema);\n if (isCycle) {\n seen.cycle = _params.path;\n }\n return seen.schema;\n }\n // initialize\n const result = { schema: {}, count: 1, cycle: undefined, path: _params.path };\n ctx.seen.set(schema, result);\n // custom method overrides default behavior\n const overrideSchema = schema._zod.toJSONSchema?.();\n if (overrideSchema) {\n result.schema = overrideSchema;\n }\n else {\n const params = {\n ..._params,\n schemaPath: [..._params.schemaPath, schema],\n path: _params.path,\n };\n if (schema._zod.processJSONSchema) {\n schema._zod.processJSONSchema(ctx, result.schema, params);\n }\n else {\n const _json = result.schema;\n const processor = ctx.processors[def.type];\n if (!processor) {\n throw new Error(`[toJSONSchema]: Non-representable type encountered: ${def.type}`);\n }\n processor(schema, ctx, _json, params);\n }\n const parent = schema._zod.parent;\n if (parent) {\n // Also set ref if processor didn't (for inheritance)\n if (!result.ref)\n result.ref = parent;\n process(parent, ctx, params);\n ctx.seen.get(parent).isParent = true;\n }\n }\n // metadata\n const meta = ctx.metadataRegistry.get(schema);\n if (meta)\n Object.assign(result.schema, meta);\n if (ctx.io === \"input\" && isTransforming(schema)) {\n // examples/defaults only apply to output type of pipe\n delete result.schema.examples;\n delete result.schema.default;\n }\n // set prefault as default\n if (ctx.io === \"input\" && result.schema._prefault)\n (_a = result.schema).default ?? (_a.default = result.schema._prefault);\n delete result.schema._prefault;\n // pulling fresh from ctx.seen in case it was overwritten\n const _result = ctx.seen.get(schema);\n return _result.schema;\n}\nexport function extractDefs(ctx, schema\n// params: EmitParams\n) {\n // iterate over seen map;\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // Track ids to detect duplicates across different schemas\n const idToSchema = new Map();\n for (const entry of ctx.seen.entries()) {\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n const existing = idToSchema.get(id);\n if (existing && existing !== entry[0]) {\n throw new Error(`Duplicate schema id \"${id}\" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);\n }\n idToSchema.set(id, entry[0]);\n }\n }\n // returns a ref to the schema\n // defId will be empty if the ref points to an external schema (or #)\n const makeURI = (entry) => {\n // comparing the seen objects because sometimes\n // multiple schemas map to the same seen object.\n // e.g. lazy\n // external is configured\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n if (ctx.external) {\n const externalId = ctx.external.registry.get(entry[0])?.id; // ?? \"__shared\";// `__schema${ctx.counter++}`;\n // check if schema is in the external registry\n const uriGenerator = ctx.external.uri ?? ((id) => id);\n if (externalId) {\n return { ref: uriGenerator(externalId) };\n }\n // otherwise, add to __shared\n const id = entry[1].defId ?? entry[1].schema.id ?? `schema${ctx.counter++}`;\n entry[1].defId = id; // set defId so it will be reused if needed\n return { defId: id, ref: `${uriGenerator(\"__shared\")}#/${defsSegment}/${id}` };\n }\n if (entry[1] === root) {\n return { ref: \"#\" };\n }\n // self-contained schema\n const uriPrefix = `#`;\n const defUriPrefix = `${uriPrefix}/${defsSegment}/`;\n const defId = entry[1].schema.id ?? `__schema${ctx.counter++}`;\n return { defId, ref: defUriPrefix + defId };\n };\n // stored cached version in `def` property\n // remove all properties, set $ref\n const extractToDef = (entry) => {\n // if the schema is already a reference, do not extract it\n if (entry[1].schema.$ref) {\n return;\n }\n const seen = entry[1];\n const { ref, defId } = makeURI(entry);\n seen.def = { ...seen.schema };\n // defId won't be set if the schema is a reference to an external schema\n // or if the schema is the root schema\n if (defId)\n seen.defId = defId;\n // wipe away all properties except $ref\n const schema = seen.schema;\n for (const key in schema) {\n delete schema[key];\n }\n schema.$ref = ref;\n };\n // throw on cycles\n // break cycles\n if (ctx.cycles === \"throw\") {\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.cycle) {\n throw new Error(\"Cycle detected: \" +\n `#/${seen.cycle?.join(\"/\")}/<root>` +\n '\\n\\nSet the `cycles` parameter to `\"ref\"` to resolve cyclical schemas with defs.');\n }\n }\n }\n // extract schemas into $defs\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n // convert root schema to # $ref\n if (schema === entry[0]) {\n extractToDef(entry); // this has special handling for the root schema\n continue;\n }\n // extract schemas that are in the external registry\n if (ctx.external) {\n const ext = ctx.external.registry.get(entry[0])?.id;\n if (schema !== entry[0] && ext) {\n extractToDef(entry);\n continue;\n }\n }\n // extract schemas with `id` meta\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n extractToDef(entry);\n continue;\n }\n // break cycles\n if (seen.cycle) {\n // any\n extractToDef(entry);\n continue;\n }\n // extract reused schemas\n if (seen.count > 1) {\n if (ctx.reused === \"ref\") {\n extractToDef(entry);\n // biome-ignore lint:\n continue;\n }\n }\n }\n}\nexport function finalize(ctx, schema) {\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // flatten refs - inherit properties from parent schemas\n const flattenRef = (zodSchema) => {\n const seen = ctx.seen.get(zodSchema);\n // already processed\n if (seen.ref === null)\n return;\n const schema = seen.def ?? seen.schema;\n const _cached = { ...schema };\n const ref = seen.ref;\n seen.ref = null; // prevent infinite recursion\n if (ref) {\n flattenRef(ref);\n const refSeen = ctx.seen.get(ref);\n const refSchema = refSeen.schema;\n // merge referenced schema into current\n if (refSchema.$ref && (ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\")) {\n // older drafts can't combine $ref with other properties\n schema.allOf = schema.allOf ?? [];\n schema.allOf.push(refSchema);\n }\n else {\n Object.assign(schema, refSchema);\n }\n // restore child's own properties (child wins)\n Object.assign(schema, _cached);\n const isParentRef = zodSchema._zod.parent === ref;\n // For parent chain, child is a refinement - remove parent-only properties\n if (isParentRef) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (!(key in _cached)) {\n delete schema[key];\n }\n }\n }\n // When ref was extracted to $defs, remove properties that match the definition\n if (refSchema.$ref && refSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in refSeen.def && JSON.stringify(schema[key]) === JSON.stringify(refSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n // If parent was extracted (has $ref), propagate $ref to this schema\n // This handles cases like: readonly().meta({id}).describe()\n // where processor sets ref to innerType but parent should be referenced\n const parent = zodSchema._zod.parent;\n if (parent && parent !== ref) {\n // Ensure parent is processed first so its def has inherited properties\n flattenRef(parent);\n const parentSeen = ctx.seen.get(parent);\n if (parentSeen?.schema.$ref) {\n schema.$ref = parentSeen.schema.$ref;\n // De-duplicate with parent's definition\n if (parentSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in parentSeen.def && JSON.stringify(schema[key]) === JSON.stringify(parentSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n }\n // execute overrides\n ctx.override({\n zodSchema: zodSchema,\n jsonSchema: schema,\n path: seen.path ?? [],\n });\n };\n for (const entry of [...ctx.seen.entries()].reverse()) {\n flattenRef(entry[0]);\n }\n const result = {};\n if (ctx.target === \"draft-2020-12\") {\n result.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n }\n else if (ctx.target === \"draft-07\") {\n result.$schema = \"http://json-schema.org/draft-07/schema#\";\n }\n else if (ctx.target === \"draft-04\") {\n result.$schema = \"http://json-schema.org/draft-04/schema#\";\n }\n else if (ctx.target === \"openapi-3.0\") {\n // OpenAPI 3.0 schema objects should not include a $schema property\n }\n else {\n // Arbitrary string values are allowed but won't have a $schema property set\n }\n if (ctx.external?.uri) {\n const id = ctx.external.registry.get(schema)?.id;\n if (!id)\n throw new Error(\"Schema is missing an `id` property\");\n result.$id = ctx.external.uri(id);\n }\n Object.assign(result, root.def ?? root.schema);\n // build defs object\n const defs = ctx.external?.defs ?? {};\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.def && seen.defId) {\n defs[seen.defId] = seen.def;\n }\n }\n // set definitions in result\n if (ctx.external) {\n }\n else {\n if (Object.keys(defs).length > 0) {\n if (ctx.target === \"draft-2020-12\") {\n result.$defs = defs;\n }\n else {\n result.definitions = defs;\n }\n }\n }\n try {\n // this \"finalizes\" this schema and ensures all cycles are removed\n // each call to finalize() is functionally independent\n // though the seen map is shared\n const finalized = JSON.parse(JSON.stringify(result));\n Object.defineProperty(finalized, \"~standard\", {\n value: {\n ...schema[\"~standard\"],\n jsonSchema: {\n input: createStandardJSONSchemaMethod(schema, \"input\", ctx.processors),\n output: createStandardJSONSchemaMethod(schema, \"output\", ctx.processors),\n },\n },\n enumerable: false,\n writable: false,\n });\n return finalized;\n }\n catch (_err) {\n throw new Error(\"Error converting schema to JSON.\");\n }\n}\nfunction isTransforming(_schema, _ctx) {\n const ctx = _ctx ?? { seen: new Set() };\n if (ctx.seen.has(_schema))\n return false;\n ctx.seen.add(_schema);\n const def = _schema._zod.def;\n if (def.type === \"transform\")\n return true;\n if (def.type === \"array\")\n return isTransforming(def.element, ctx);\n if (def.type === \"set\")\n return isTransforming(def.valueType, ctx);\n if (def.type === \"lazy\")\n return isTransforming(def.getter(), ctx);\n if (def.type === \"promise\" ||\n def.type === \"optional\" ||\n def.type === \"nonoptional\" ||\n def.type === \"nullable\" ||\n def.type === \"readonly\" ||\n def.type === \"default\" ||\n def.type === \"prefault\") {\n return isTransforming(def.innerType, ctx);\n }\n if (def.type === \"intersection\") {\n return isTransforming(def.left, ctx) || isTransforming(def.right, ctx);\n }\n if (def.type === \"record\" || def.type === \"map\") {\n return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx);\n }\n if (def.type === \"pipe\") {\n return isTransforming(def.in, ctx) || isTransforming(def.out, ctx);\n }\n if (def.type === \"object\") {\n for (const key in def.shape) {\n if (isTransforming(def.shape[key], ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"union\") {\n for (const option of def.options) {\n if (isTransforming(option, ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"tuple\") {\n for (const item of def.items) {\n if (isTransforming(item, ctx))\n return true;\n }\n if (def.rest && isTransforming(def.rest, ctx))\n return true;\n return false;\n }\n return false;\n}\n/**\n * Creates a toJSONSchema method for a schema instance.\n * This encapsulates the logic of initializing context, processing, extracting defs, and finalizing.\n */\nexport const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {\n const ctx = initializeContext({ ...params, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\nexport const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) => {\n const { libraryOptions, target } = params ?? {};\n const ctx = initializeContext({ ...(libraryOptions ?? {}), target, io, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\n","import { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\nimport { getEnumValues } from \"./util.js\";\nconst formatMap = {\n guid: \"uuid\",\n url: \"uri\",\n datetime: \"date-time\",\n json_string: \"json-string\",\n regex: \"\", // do not set\n};\n// ==================== SIMPLE TYPE PROCESSORS ====================\nexport const stringProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n json.type = \"string\";\n const { minimum, maximum, format, patterns, contentEncoding } = schema._zod\n .bag;\n if (typeof minimum === \"number\")\n json.minLength = minimum;\n if (typeof maximum === \"number\")\n json.maxLength = maximum;\n // custom pattern overrides format\n if (format) {\n json.format = formatMap[format] ?? format;\n if (json.format === \"\")\n delete json.format; // empty format is not valid\n // JSON Schema format: \"time\" requires a full time with offset or Z\n // z.iso.time() does not include timezone information, so format: \"time\" should never be used\n if (format === \"time\") {\n delete json.format;\n }\n }\n if (contentEncoding)\n json.contentEncoding = contentEncoding;\n if (patterns && patterns.size > 0) {\n const regexes = [...patterns];\n if (regexes.length === 1)\n json.pattern = regexes[0].source;\n else if (regexes.length > 1) {\n json.allOf = [\n ...regexes.map((regex) => ({\n ...(ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\"\n ? { type: \"string\" }\n : {}),\n pattern: regex.source,\n })),\n ];\n }\n }\n};\nexport const numberProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag;\n if (typeof format === \"string\" && format.includes(\"int\"))\n json.type = \"integer\";\n else\n json.type = \"number\";\n if (typeof exclusiveMinimum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.minimum = exclusiveMinimum;\n json.exclusiveMinimum = true;\n }\n else {\n json.exclusiveMinimum = exclusiveMinimum;\n }\n }\n if (typeof minimum === \"number\") {\n json.minimum = minimum;\n if (typeof exclusiveMinimum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMinimum >= minimum)\n delete json.minimum;\n else\n delete json.exclusiveMinimum;\n }\n }\n if (typeof exclusiveMaximum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.maximum = exclusiveMaximum;\n json.exclusiveMaximum = true;\n }\n else {\n json.exclusiveMaximum = exclusiveMaximum;\n }\n }\n if (typeof maximum === \"number\") {\n json.maximum = maximum;\n if (typeof exclusiveMaximum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMaximum <= maximum)\n delete json.maximum;\n else\n delete json.exclusiveMaximum;\n }\n }\n if (typeof multipleOf === \"number\")\n json.multipleOf = multipleOf;\n};\nexport const booleanProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const bigintProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt cannot be represented in JSON Schema\");\n }\n};\nexport const symbolProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Symbols cannot be represented in JSON Schema\");\n }\n};\nexport const nullProcessor = (_schema, ctx, json, _params) => {\n if (ctx.target === \"openapi-3.0\") {\n json.type = \"string\";\n json.nullable = true;\n json.enum = [null];\n }\n else {\n json.type = \"null\";\n }\n};\nexport const undefinedProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Undefined cannot be represented in JSON Schema\");\n }\n};\nexport const voidProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Void cannot be represented in JSON Schema\");\n }\n};\nexport const neverProcessor = (_schema, _ctx, json, _params) => {\n json.not = {};\n};\nexport const anyProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const unknownProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const dateProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Date cannot be represented in JSON Schema\");\n }\n};\nexport const enumProcessor = (schema, _ctx, json, _params) => {\n const def = schema._zod.def;\n const values = getEnumValues(def.entries);\n // Number enums can have both string and number values\n if (values.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (values.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n json.enum = values;\n};\nexport const literalProcessor = (schema, ctx, json, _params) => {\n const def = schema._zod.def;\n const vals = [];\n for (const val of def.values) {\n if (val === undefined) {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Literal `undefined` cannot be represented in JSON Schema\");\n }\n else {\n // do not add to vals\n }\n }\n else if (typeof val === \"bigint\") {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt literals cannot be represented in JSON Schema\");\n }\n else {\n vals.push(Number(val));\n }\n }\n else {\n vals.push(val);\n }\n }\n if (vals.length === 0) {\n // do nothing (an undefined literal was stripped)\n }\n else if (vals.length === 1) {\n const val = vals[0];\n json.type = val === null ? \"null\" : typeof val;\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.enum = [val];\n }\n else {\n json.const = val;\n }\n }\n else {\n if (vals.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (vals.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n if (vals.every((v) => typeof v === \"boolean\"))\n json.type = \"boolean\";\n if (vals.every((v) => v === null))\n json.type = \"null\";\n json.enum = vals;\n }\n};\nexport const nanProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"NaN cannot be represented in JSON Schema\");\n }\n};\nexport const templateLiteralProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const pattern = schema._zod.pattern;\n if (!pattern)\n throw new Error(\"Pattern not found in template literal\");\n _json.type = \"string\";\n _json.pattern = pattern.source;\n};\nexport const fileProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const file = {\n type: \"string\",\n format: \"binary\",\n contentEncoding: \"binary\",\n };\n const { minimum, maximum, mime } = schema._zod.bag;\n if (minimum !== undefined)\n file.minLength = minimum;\n if (maximum !== undefined)\n file.maxLength = maximum;\n if (mime) {\n if (mime.length === 1) {\n file.contentMediaType = mime[0];\n Object.assign(_json, file);\n }\n else {\n Object.assign(_json, file); // shared props at root\n _json.anyOf = mime.map((m) => ({ contentMediaType: m })); // only contentMediaType differs\n }\n }\n else {\n Object.assign(_json, file);\n }\n};\nexport const successProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const customProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Custom types cannot be represented in JSON Schema\");\n }\n};\nexport const functionProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Function types cannot be represented in JSON Schema\");\n }\n};\nexport const transformProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Transforms cannot be represented in JSON Schema\");\n }\n};\nexport const mapProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Map cannot be represented in JSON Schema\");\n }\n};\nexport const setProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Set cannot be represented in JSON Schema\");\n }\n};\n// ==================== COMPOSITE TYPE PROCESSORS ====================\nexport const arrayProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n json.type = \"array\";\n json.items = process(def.element, ctx, { ...params, path: [...params.path, \"items\"] });\n};\nexport const objectProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n json.properties = {};\n const shape = def.shape;\n for (const key in shape) {\n json.properties[key] = process(shape[key], ctx, {\n ...params,\n path: [...params.path, \"properties\", key],\n });\n }\n // required keys\n const allKeys = new Set(Object.keys(shape));\n const requiredKeys = new Set([...allKeys].filter((key) => {\n const v = def.shape[key]._zod;\n if (ctx.io === \"input\") {\n return v.optin === undefined;\n }\n else {\n return v.optout === undefined;\n }\n }));\n if (requiredKeys.size > 0) {\n json.required = Array.from(requiredKeys);\n }\n // catchall\n if (def.catchall?._zod.def.type === \"never\") {\n // strict\n json.additionalProperties = false;\n }\n else if (!def.catchall) {\n // regular\n if (ctx.io === \"output\")\n json.additionalProperties = false;\n }\n else if (def.catchall) {\n json.additionalProperties = process(def.catchall, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n};\nexport const unionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n // Exclusive unions (inclusive === false) use oneOf (exactly one match) instead of anyOf (one or more matches)\n // This includes both z.xor() and discriminated unions\n const isExclusive = def.inclusive === false;\n const options = def.options.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, isExclusive ? \"oneOf\" : \"anyOf\", i],\n }));\n if (isExclusive) {\n json.oneOf = options;\n }\n else {\n json.anyOf = options;\n }\n};\nexport const intersectionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const a = process(def.left, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 0],\n });\n const b = process(def.right, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 1],\n });\n const isSimpleIntersection = (val) => \"allOf\" in val && Object.keys(val).length === 1;\n const allOf = [\n ...(isSimpleIntersection(a) ? a.allOf : [a]),\n ...(isSimpleIntersection(b) ? b.allOf : [b]),\n ];\n json.allOf = allOf;\n};\nexport const tupleProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"array\";\n const prefixPath = ctx.target === \"draft-2020-12\" ? \"prefixItems\" : \"items\";\n const restPath = ctx.target === \"draft-2020-12\" ? \"items\" : ctx.target === \"openapi-3.0\" ? \"items\" : \"additionalItems\";\n const prefixItems = def.items.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, prefixPath, i],\n }));\n const rest = def.rest\n ? process(def.rest, ctx, {\n ...params,\n path: [...params.path, restPath, ...(ctx.target === \"openapi-3.0\" ? [def.items.length] : [])],\n })\n : null;\n if (ctx.target === \"draft-2020-12\") {\n json.prefixItems = prefixItems;\n if (rest) {\n json.items = rest;\n }\n }\n else if (ctx.target === \"openapi-3.0\") {\n json.items = {\n anyOf: prefixItems,\n };\n if (rest) {\n json.items.anyOf.push(rest);\n }\n json.minItems = prefixItems.length;\n if (!rest) {\n json.maxItems = prefixItems.length;\n }\n }\n else {\n json.items = prefixItems;\n if (rest) {\n json.additionalItems = rest;\n }\n }\n // length\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n};\nexport const recordProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n // For looseRecord with regex patterns, use patternProperties\n // This correctly represents \"only validate keys matching the pattern\" semantics\n // and composes well with allOf (intersections)\n const keyType = def.keyType;\n const keyBag = keyType._zod.bag;\n const patterns = keyBag?.patterns;\n if (def.mode === \"loose\" && patterns && patterns.size > 0) {\n // Use patternProperties for looseRecord with regex patterns\n const valueSchema = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"patternProperties\", \"*\"],\n });\n json.patternProperties = {};\n for (const pattern of patterns) {\n json.patternProperties[pattern.source] = valueSchema;\n }\n }\n else {\n // Default behavior: use propertyNames + additionalProperties\n if (ctx.target === \"draft-07\" || ctx.target === \"draft-2020-12\") {\n json.propertyNames = process(def.keyType, ctx, {\n ...params,\n path: [...params.path, \"propertyNames\"],\n });\n }\n json.additionalProperties = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n // Add required for keys with discrete values (enum, literal, etc.)\n const keyValues = keyType._zod.values;\n if (keyValues) {\n const validKeyValues = [...keyValues].filter((v) => typeof v === \"string\" || typeof v === \"number\");\n if (validKeyValues.length > 0) {\n json.required = validKeyValues;\n }\n }\n};\nexport const nullableProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const inner = process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n if (ctx.target === \"openapi-3.0\") {\n seen.ref = def.innerType;\n json.nullable = true;\n }\n else {\n json.anyOf = [inner, { type: \"null\" }];\n }\n};\nexport const nonoptionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const defaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.default = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const prefaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n if (ctx.io === \"input\")\n json._prefault = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const catchProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n let catchValue;\n try {\n catchValue = def.catchValue(undefined);\n }\n catch {\n throw new Error(\"Dynamic catch values are not supported in JSON Schema\");\n }\n json.default = catchValue;\n};\nexport const pipeProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n const innerType = ctx.io === \"input\" ? (def.in._zod.def.type === \"transform\" ? def.out : def.in) : def.out;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\nexport const readonlyProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.readOnly = true;\n};\nexport const promiseProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const optionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const lazyProcessor = (schema, ctx, _json, params) => {\n const innerType = schema._zod.innerType;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\n// ==================== ALL PROCESSORS ====================\nexport const allProcessors = {\n string: stringProcessor,\n number: numberProcessor,\n boolean: booleanProcessor,\n bigint: bigintProcessor,\n symbol: symbolProcessor,\n null: nullProcessor,\n undefined: undefinedProcessor,\n void: voidProcessor,\n never: neverProcessor,\n any: anyProcessor,\n unknown: unknownProcessor,\n date: dateProcessor,\n enum: enumProcessor,\n literal: literalProcessor,\n nan: nanProcessor,\n template_literal: templateLiteralProcessor,\n file: fileProcessor,\n success: successProcessor,\n custom: customProcessor,\n function: functionProcessor,\n transform: transformProcessor,\n map: mapProcessor,\n set: setProcessor,\n array: arrayProcessor,\n object: objectProcessor,\n union: unionProcessor,\n intersection: intersectionProcessor,\n tuple: tupleProcessor,\n record: recordProcessor,\n nullable: nullableProcessor,\n nonoptional: nonoptionalProcessor,\n default: defaultProcessor,\n prefault: prefaultProcessor,\n catch: catchProcessor,\n pipe: pipeProcessor,\n readonly: readonlyProcessor,\n promise: promiseProcessor,\n optional: optionalProcessor,\n lazy: lazyProcessor,\n};\nexport function toJSONSchema(input, params) {\n if (\"_idmap\" in input) {\n // Registry case\n const registry = input;\n const ctx = initializeContext({ ...params, processors: allProcessors });\n const defs = {};\n // First pass: process all schemas to build the seen map\n for (const entry of registry._idmap.entries()) {\n const [_, schema] = entry;\n process(schema, ctx);\n }\n const schemas = {};\n const external = {\n registry,\n uri: params?.uri,\n defs,\n };\n // Update the context with external configuration\n ctx.external = external;\n // Second pass: emit each schema\n for (const entry of registry._idmap.entries()) {\n const [key, schema] = entry;\n extractDefs(ctx, schema);\n schemas[key] = finalize(ctx, schema);\n }\n if (Object.keys(defs).length > 0) {\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n schemas.__shared = {\n [defsSegment]: defs,\n };\n }\n return { schemas };\n }\n // Single schema case\n const ctx = initializeContext({ ...params, processors: allProcessors });\n process(input, ctx);\n extractDefs(ctx, input);\n return finalize(ctx, input);\n}\n","import * as core from \"../core/index.js\";\nimport * as schemas from \"./schemas.js\";\nexport const ZodISODateTime = /*@__PURE__*/ core.$constructor(\"ZodISODateTime\", (inst, def) => {\n core.$ZodISODateTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function datetime(params) {\n return core._isoDateTime(ZodISODateTime, params);\n}\nexport const ZodISODate = /*@__PURE__*/ core.$constructor(\"ZodISODate\", (inst, def) => {\n core.$ZodISODate.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function date(params) {\n return core._isoDate(ZodISODate, params);\n}\nexport const ZodISOTime = /*@__PURE__*/ core.$constructor(\"ZodISOTime\", (inst, def) => {\n core.$ZodISOTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function time(params) {\n return core._isoTime(ZodISOTime, params);\n}\nexport const ZodISODuration = /*@__PURE__*/ core.$constructor(\"ZodISODuration\", (inst, def) => {\n core.$ZodISODuration.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function duration(params) {\n return core._isoDuration(ZodISODuration, params);\n}\n","import * as core from \"../core/index.js\";\nimport { $ZodError } from \"../core/index.js\";\nimport * as util from \"../core/util.js\";\nconst initializer = (inst, issues) => {\n $ZodError.init(inst, issues);\n inst.name = \"ZodError\";\n Object.defineProperties(inst, {\n format: {\n value: (mapper) => core.formatError(inst, mapper),\n // enumerable: false,\n },\n flatten: {\n value: (mapper) => core.flattenError(inst, mapper),\n // enumerable: false,\n },\n addIssue: {\n value: (issue) => {\n inst.issues.push(issue);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n addIssues: {\n value: (issues) => {\n inst.issues.push(...issues);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n isEmpty: {\n get() {\n return inst.issues.length === 0;\n },\n // enumerable: false,\n },\n });\n // Object.defineProperty(inst, \"isEmpty\", {\n // get() {\n // return inst.issues.length === 0;\n // },\n // });\n};\nexport const ZodError = core.$constructor(\"ZodError\", initializer);\nexport const ZodRealError = core.$constructor(\"ZodError\", initializer, {\n Parent: Error,\n});\n// /** @deprecated Use `z.core.$ZodErrorMapCtx` instead. */\n// export type ErrorMapCtx = core.$ZodErrorMapCtx;\n","import * as core from \"../core/index.js\";\nimport { ZodRealError } from \"./errors.js\";\nexport const parse = /* @__PURE__ */ core._parse(ZodRealError);\nexport const parseAsync = /* @__PURE__ */ core._parseAsync(ZodRealError);\nexport const safeParse = /* @__PURE__ */ core._safeParse(ZodRealError);\nexport const safeParseAsync = /* @__PURE__ */ core._safeParseAsync(ZodRealError);\n// Codec functions\nexport const encode = /* @__PURE__ */ core._encode(ZodRealError);\nexport const decode = /* @__PURE__ */ core._decode(ZodRealError);\nexport const encodeAsync = /* @__PURE__ */ core._encodeAsync(ZodRealError);\nexport const decodeAsync = /* @__PURE__ */ core._decodeAsync(ZodRealError);\nexport const safeEncode = /* @__PURE__ */ core._safeEncode(ZodRealError);\nexport const safeDecode = /* @__PURE__ */ core._safeDecode(ZodRealError);\nexport const safeEncodeAsync = /* @__PURE__ */ core._safeEncodeAsync(ZodRealError);\nexport const safeDecodeAsync = /* @__PURE__ */ core._safeDecodeAsync(ZodRealError);\n","import * as core from \"../core/index.js\";\nimport { util } from \"../core/index.js\";\nimport * as processors from \"../core/json-schema-processors.js\";\nimport { createStandardJSONSchemaMethod, createToJSONSchemaMethod } from \"../core/to-json-schema.js\";\nimport * as checks from \"./checks.js\";\nimport * as iso from \"./iso.js\";\nimport * as parse from \"./parse.js\";\nexport const ZodType = /*@__PURE__*/ core.$constructor(\"ZodType\", (inst, def) => {\n core.$ZodType.init(inst, def);\n Object.assign(inst[\"~standard\"], {\n jsonSchema: {\n input: createStandardJSONSchemaMethod(inst, \"input\"),\n output: createStandardJSONSchemaMethod(inst, \"output\"),\n },\n });\n inst.toJSONSchema = createToJSONSchemaMethod(inst, {});\n inst.def = def;\n inst.type = def.type;\n Object.defineProperty(inst, \"_def\", { value: def });\n // base methods\n inst.check = (...checks) => {\n return inst.clone(util.mergeDefs(def, {\n checks: [\n ...(def.checks ?? []),\n ...checks.map((ch) => typeof ch === \"function\" ? { _zod: { check: ch, def: { check: \"custom\" }, onattach: [] } } : ch),\n ],\n }), {\n parent: true,\n });\n };\n inst.with = inst.check;\n inst.clone = (def, params) => core.clone(inst, def, params);\n inst.brand = () => inst;\n inst.register = ((reg, meta) => {\n reg.add(inst, meta);\n return inst;\n });\n // parsing\n inst.parse = (data, params) => parse.parse(inst, data, params, { callee: inst.parse });\n inst.safeParse = (data, params) => parse.safeParse(inst, data, params);\n inst.parseAsync = async (data, params) => parse.parseAsync(inst, data, params, { callee: inst.parseAsync });\n inst.safeParseAsync = async (data, params) => parse.safeParseAsync(inst, data, params);\n inst.spa = inst.safeParseAsync;\n // encoding/decoding\n inst.encode = (data, params) => parse.encode(inst, data, params);\n inst.decode = (data, params) => parse.decode(inst, data, params);\n inst.encodeAsync = async (data, params) => parse.encodeAsync(inst, data, params);\n inst.decodeAsync = async (data, params) => parse.decodeAsync(inst, data, params);\n inst.safeEncode = (data, params) => parse.safeEncode(inst, data, params);\n inst.safeDecode = (data, params) => parse.safeDecode(inst, data, params);\n inst.safeEncodeAsync = async (data, params) => parse.safeEncodeAsync(inst, data, params);\n inst.safeDecodeAsync = async (data, params) => parse.safeDecodeAsync(inst, data, params);\n // refinements\n inst.refine = (check, params) => inst.check(refine(check, params));\n inst.superRefine = (refinement) => inst.check(superRefine(refinement));\n inst.overwrite = (fn) => inst.check(checks.overwrite(fn));\n // wrappers\n inst.optional = () => optional(inst);\n inst.exactOptional = () => exactOptional(inst);\n inst.nullable = () => nullable(inst);\n inst.nullish = () => optional(nullable(inst));\n inst.nonoptional = (params) => nonoptional(inst, params);\n inst.array = () => array(inst);\n inst.or = (arg) => union([inst, arg]);\n inst.and = (arg) => intersection(inst, arg);\n inst.transform = (tx) => pipe(inst, transform(tx));\n inst.default = (def) => _default(inst, def);\n inst.prefault = (def) => prefault(inst, def);\n // inst.coalesce = (def, params) => coalesce(inst, def, params);\n inst.catch = (params) => _catch(inst, params);\n inst.pipe = (target) => pipe(inst, target);\n inst.readonly = () => readonly(inst);\n // meta\n inst.describe = (description) => {\n const cl = inst.clone();\n core.globalRegistry.add(cl, { description });\n return cl;\n };\n Object.defineProperty(inst, \"description\", {\n get() {\n return core.globalRegistry.get(inst)?.description;\n },\n configurable: true,\n });\n inst.meta = (...args) => {\n if (args.length === 0) {\n return core.globalRegistry.get(inst);\n }\n const cl = inst.clone();\n core.globalRegistry.add(cl, args[0]);\n return cl;\n };\n // helpers\n inst.isOptional = () => inst.safeParse(undefined).success;\n inst.isNullable = () => inst.safeParse(null).success;\n inst.apply = (fn) => fn(inst);\n return inst;\n});\n/** @internal */\nexport const _ZodString = /*@__PURE__*/ core.$constructor(\"_ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.stringProcessor(inst, ctx, json, params);\n const bag = inst._zod.bag;\n inst.format = bag.format ?? null;\n inst.minLength = bag.minimum ?? null;\n inst.maxLength = bag.maximum ?? null;\n // validations\n inst.regex = (...args) => inst.check(checks.regex(...args));\n inst.includes = (...args) => inst.check(checks.includes(...args));\n inst.startsWith = (...args) => inst.check(checks.startsWith(...args));\n inst.endsWith = (...args) => inst.check(checks.endsWith(...args));\n inst.min = (...args) => inst.check(checks.minLength(...args));\n inst.max = (...args) => inst.check(checks.maxLength(...args));\n inst.length = (...args) => inst.check(checks.length(...args));\n inst.nonempty = (...args) => inst.check(checks.minLength(1, ...args));\n inst.lowercase = (params) => inst.check(checks.lowercase(params));\n inst.uppercase = (params) => inst.check(checks.uppercase(params));\n // transforms\n inst.trim = () => inst.check(checks.trim());\n inst.normalize = (...args) => inst.check(checks.normalize(...args));\n inst.toLowerCase = () => inst.check(checks.toLowerCase());\n inst.toUpperCase = () => inst.check(checks.toUpperCase());\n inst.slugify = () => inst.check(checks.slugify());\n});\nexport const ZodString = /*@__PURE__*/ core.$constructor(\"ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n _ZodString.init(inst, def);\n inst.email = (params) => inst.check(core._email(ZodEmail, params));\n inst.url = (params) => inst.check(core._url(ZodURL, params));\n inst.jwt = (params) => inst.check(core._jwt(ZodJWT, params));\n inst.emoji = (params) => inst.check(core._emoji(ZodEmoji, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.uuid = (params) => inst.check(core._uuid(ZodUUID, params));\n inst.uuidv4 = (params) => inst.check(core._uuidv4(ZodUUID, params));\n inst.uuidv6 = (params) => inst.check(core._uuidv6(ZodUUID, params));\n inst.uuidv7 = (params) => inst.check(core._uuidv7(ZodUUID, params));\n inst.nanoid = (params) => inst.check(core._nanoid(ZodNanoID, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.cuid = (params) => inst.check(core._cuid(ZodCUID, params));\n inst.cuid2 = (params) => inst.check(core._cuid2(ZodCUID2, params));\n inst.ulid = (params) => inst.check(core._ulid(ZodULID, params));\n inst.base64 = (params) => inst.check(core._base64(ZodBase64, params));\n inst.base64url = (params) => inst.check(core._base64url(ZodBase64URL, params));\n inst.xid = (params) => inst.check(core._xid(ZodXID, params));\n inst.ksuid = (params) => inst.check(core._ksuid(ZodKSUID, params));\n inst.ipv4 = (params) => inst.check(core._ipv4(ZodIPv4, params));\n inst.ipv6 = (params) => inst.check(core._ipv6(ZodIPv6, params));\n inst.cidrv4 = (params) => inst.check(core._cidrv4(ZodCIDRv4, params));\n inst.cidrv6 = (params) => inst.check(core._cidrv6(ZodCIDRv6, params));\n inst.e164 = (params) => inst.check(core._e164(ZodE164, params));\n // iso\n inst.datetime = (params) => inst.check(iso.datetime(params));\n inst.date = (params) => inst.check(iso.date(params));\n inst.time = (params) => inst.check(iso.time(params));\n inst.duration = (params) => inst.check(iso.duration(params));\n});\nexport function string(params) {\n return core._string(ZodString, params);\n}\nexport const ZodStringFormat = /*@__PURE__*/ core.$constructor(\"ZodStringFormat\", (inst, def) => {\n core.$ZodStringFormat.init(inst, def);\n _ZodString.init(inst, def);\n});\nexport const ZodEmail = /*@__PURE__*/ core.$constructor(\"ZodEmail\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmail.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function email(params) {\n return core._email(ZodEmail, params);\n}\nexport const ZodGUID = /*@__PURE__*/ core.$constructor(\"ZodGUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodGUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function guid(params) {\n return core._guid(ZodGUID, params);\n}\nexport const ZodUUID = /*@__PURE__*/ core.$constructor(\"ZodUUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodUUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function uuid(params) {\n return core._uuid(ZodUUID, params);\n}\nexport function uuidv4(params) {\n return core._uuidv4(ZodUUID, params);\n}\n// ZodUUIDv6\nexport function uuidv6(params) {\n return core._uuidv6(ZodUUID, params);\n}\n// ZodUUIDv7\nexport function uuidv7(params) {\n return core._uuidv7(ZodUUID, params);\n}\nexport const ZodURL = /*@__PURE__*/ core.$constructor(\"ZodURL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodURL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function url(params) {\n return core._url(ZodURL, params);\n}\nexport function httpUrl(params) {\n return core._url(ZodURL, {\n protocol: /^https?$/,\n hostname: core.regexes.domain,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEmoji = /*@__PURE__*/ core.$constructor(\"ZodEmoji\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmoji.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function emoji(params) {\n return core._emoji(ZodEmoji, params);\n}\nexport const ZodNanoID = /*@__PURE__*/ core.$constructor(\"ZodNanoID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodNanoID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function nanoid(params) {\n return core._nanoid(ZodNanoID, params);\n}\nexport const ZodCUID = /*@__PURE__*/ core.$constructor(\"ZodCUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid(params) {\n return core._cuid(ZodCUID, params);\n}\nexport const ZodCUID2 = /*@__PURE__*/ core.$constructor(\"ZodCUID2\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID2.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid2(params) {\n return core._cuid2(ZodCUID2, params);\n}\nexport const ZodULID = /*@__PURE__*/ core.$constructor(\"ZodULID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodULID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ulid(params) {\n return core._ulid(ZodULID, params);\n}\nexport const ZodXID = /*@__PURE__*/ core.$constructor(\"ZodXID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodXID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function xid(params) {\n return core._xid(ZodXID, params);\n}\nexport const ZodKSUID = /*@__PURE__*/ core.$constructor(\"ZodKSUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodKSUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ksuid(params) {\n return core._ksuid(ZodKSUID, params);\n}\nexport const ZodIPv4 = /*@__PURE__*/ core.$constructor(\"ZodIPv4\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv4(params) {\n return core._ipv4(ZodIPv4, params);\n}\nexport const ZodMAC = /*@__PURE__*/ core.$constructor(\"ZodMAC\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodMAC.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function mac(params) {\n return core._mac(ZodMAC, params);\n}\nexport const ZodIPv6 = /*@__PURE__*/ core.$constructor(\"ZodIPv6\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv6(params) {\n return core._ipv6(ZodIPv6, params);\n}\nexport const ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv4\", (inst, def) => {\n core.$ZodCIDRv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv4(params) {\n return core._cidrv4(ZodCIDRv4, params);\n}\nexport const ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv6\", (inst, def) => {\n core.$ZodCIDRv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv6(params) {\n return core._cidrv6(ZodCIDRv6, params);\n}\nexport const ZodBase64 = /*@__PURE__*/ core.$constructor(\"ZodBase64\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64(params) {\n return core._base64(ZodBase64, params);\n}\nexport const ZodBase64URL = /*@__PURE__*/ core.$constructor(\"ZodBase64URL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64URL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64url(params) {\n return core._base64url(ZodBase64URL, params);\n}\nexport const ZodE164 = /*@__PURE__*/ core.$constructor(\"ZodE164\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodE164.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function e164(params) {\n return core._e164(ZodE164, params);\n}\nexport const ZodJWT = /*@__PURE__*/ core.$constructor(\"ZodJWT\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodJWT.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function jwt(params) {\n return core._jwt(ZodJWT, params);\n}\nexport const ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"ZodCustomStringFormat\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCustomStringFormat.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function stringFormat(format, fnOrRegex, _params = {}) {\n return core._stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params);\n}\nexport function hostname(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hostname\", core.regexes.hostname, _params);\n}\nexport function hex(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hex\", core.regexes.hex, _params);\n}\nexport function hash(alg, params) {\n const enc = params?.enc ?? \"hex\";\n const format = `${alg}_${enc}`;\n const regex = core.regexes[format];\n if (!regex)\n throw new Error(`Unrecognized hash format: ${format}`);\n return core._stringFormat(ZodCustomStringFormat, format, regex, params);\n}\nexport const ZodNumber = /*@__PURE__*/ core.$constructor(\"ZodNumber\", (inst, def) => {\n core.$ZodNumber.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.numberProcessor(inst, ctx, json, params);\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.int = (params) => inst.check(int(params));\n inst.safe = (params) => inst.check(int(params));\n inst.positive = (params) => inst.check(checks.gt(0, params));\n inst.nonnegative = (params) => inst.check(checks.gte(0, params));\n inst.negative = (params) => inst.check(checks.lt(0, params));\n inst.nonpositive = (params) => inst.check(checks.lte(0, params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n inst.step = (value, params) => inst.check(checks.multipleOf(value, params));\n // inst.finite = (params) => inst.check(core.finite(params));\n inst.finite = () => inst;\n const bag = inst._zod.bag;\n inst.minValue =\n Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null;\n inst.maxValue =\n Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null;\n inst.isInt = (bag.format ?? \"\").includes(\"int\") || Number.isSafeInteger(bag.multipleOf ?? 0.5);\n inst.isFinite = true;\n inst.format = bag.format ?? null;\n});\nexport function number(params) {\n return core._number(ZodNumber, params);\n}\nexport const ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"ZodNumberFormat\", (inst, def) => {\n core.$ZodNumberFormat.init(inst, def);\n ZodNumber.init(inst, def);\n});\nexport function int(params) {\n return core._int(ZodNumberFormat, params);\n}\nexport function float32(params) {\n return core._float32(ZodNumberFormat, params);\n}\nexport function float64(params) {\n return core._float64(ZodNumberFormat, params);\n}\nexport function int32(params) {\n return core._int32(ZodNumberFormat, params);\n}\nexport function uint32(params) {\n return core._uint32(ZodNumberFormat, params);\n}\nexport const ZodBoolean = /*@__PURE__*/ core.$constructor(\"ZodBoolean\", (inst, def) => {\n core.$ZodBoolean.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.booleanProcessor(inst, ctx, json, params);\n});\nexport function boolean(params) {\n return core._boolean(ZodBoolean, params);\n}\nexport const ZodBigInt = /*@__PURE__*/ core.$constructor(\"ZodBigInt\", (inst, def) => {\n core.$ZodBigInt.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.bigintProcessor(inst, ctx, json, params);\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.positive = (params) => inst.check(checks.gt(BigInt(0), params));\n inst.negative = (params) => inst.check(checks.lt(BigInt(0), params));\n inst.nonpositive = (params) => inst.check(checks.lte(BigInt(0), params));\n inst.nonnegative = (params) => inst.check(checks.gte(BigInt(0), params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n const bag = inst._zod.bag;\n inst.minValue = bag.minimum ?? null;\n inst.maxValue = bag.maximum ?? null;\n inst.format = bag.format ?? null;\n});\nexport function bigint(params) {\n return core._bigint(ZodBigInt, params);\n}\nexport const ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"ZodBigIntFormat\", (inst, def) => {\n core.$ZodBigIntFormat.init(inst, def);\n ZodBigInt.init(inst, def);\n});\n// int64\nexport function int64(params) {\n return core._int64(ZodBigIntFormat, params);\n}\n// uint64\nexport function uint64(params) {\n return core._uint64(ZodBigIntFormat, params);\n}\nexport const ZodSymbol = /*@__PURE__*/ core.$constructor(\"ZodSymbol\", (inst, def) => {\n core.$ZodSymbol.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.symbolProcessor(inst, ctx, json, params);\n});\nexport function symbol(params) {\n return core._symbol(ZodSymbol, params);\n}\nexport const ZodUndefined = /*@__PURE__*/ core.$constructor(\"ZodUndefined\", (inst, def) => {\n core.$ZodUndefined.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.undefinedProcessor(inst, ctx, json, params);\n});\nfunction _undefined(params) {\n return core._undefined(ZodUndefined, params);\n}\nexport { _undefined as undefined };\nexport const ZodNull = /*@__PURE__*/ core.$constructor(\"ZodNull\", (inst, def) => {\n core.$ZodNull.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullProcessor(inst, ctx, json, params);\n});\nfunction _null(params) {\n return core._null(ZodNull, params);\n}\nexport { _null as null };\nexport const ZodAny = /*@__PURE__*/ core.$constructor(\"ZodAny\", (inst, def) => {\n core.$ZodAny.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.anyProcessor(inst, ctx, json, params);\n});\nexport function any() {\n return core._any(ZodAny);\n}\nexport const ZodUnknown = /*@__PURE__*/ core.$constructor(\"ZodUnknown\", (inst, def) => {\n core.$ZodUnknown.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unknownProcessor(inst, ctx, json, params);\n});\nexport function unknown() {\n return core._unknown(ZodUnknown);\n}\nexport const ZodNever = /*@__PURE__*/ core.$constructor(\"ZodNever\", (inst, def) => {\n core.$ZodNever.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.neverProcessor(inst, ctx, json, params);\n});\nexport function never(params) {\n return core._never(ZodNever, params);\n}\nexport const ZodVoid = /*@__PURE__*/ core.$constructor(\"ZodVoid\", (inst, def) => {\n core.$ZodVoid.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.voidProcessor(inst, ctx, json, params);\n});\nfunction _void(params) {\n return core._void(ZodVoid, params);\n}\nexport { _void as void };\nexport const ZodDate = /*@__PURE__*/ core.$constructor(\"ZodDate\", (inst, def) => {\n core.$ZodDate.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n const c = inst._zod.bag;\n inst.minDate = c.minimum ? new Date(c.minimum) : null;\n inst.maxDate = c.maximum ? new Date(c.maximum) : null;\n});\nexport function date(params) {\n return core._date(ZodDate, params);\n}\nexport const ZodArray = /*@__PURE__*/ core.$constructor(\"ZodArray\", (inst, def) => {\n core.$ZodArray.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.arrayProcessor(inst, ctx, json, params);\n inst.element = def.element;\n inst.min = (minLength, params) => inst.check(checks.minLength(minLength, params));\n inst.nonempty = (params) => inst.check(checks.minLength(1, params));\n inst.max = (maxLength, params) => inst.check(checks.maxLength(maxLength, params));\n inst.length = (len, params) => inst.check(checks.length(len, params));\n inst.unwrap = () => inst.element;\n});\nexport function array(element, params) {\n return core._array(ZodArray, element, params);\n}\n// .keyof\nexport function keyof(schema) {\n const shape = schema._zod.def.shape;\n return _enum(Object.keys(shape));\n}\nexport const ZodObject = /*@__PURE__*/ core.$constructor(\"ZodObject\", (inst, def) => {\n core.$ZodObjectJIT.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.objectProcessor(inst, ctx, json, params);\n util.defineLazy(inst, \"shape\", () => {\n return def.shape;\n });\n inst.keyof = () => _enum(Object.keys(inst._zod.def.shape));\n inst.catchall = (catchall) => inst.clone({ ...inst._zod.def, catchall: catchall });\n inst.passthrough = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.loose = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.strict = () => inst.clone({ ...inst._zod.def, catchall: never() });\n inst.strip = () => inst.clone({ ...inst._zod.def, catchall: undefined });\n inst.extend = (incoming) => {\n return util.extend(inst, incoming);\n };\n inst.safeExtend = (incoming) => {\n return util.safeExtend(inst, incoming);\n };\n inst.merge = (other) => util.merge(inst, other);\n inst.pick = (mask) => util.pick(inst, mask);\n inst.omit = (mask) => util.omit(inst, mask);\n inst.partial = (...args) => util.partial(ZodOptional, inst, args[0]);\n inst.required = (...args) => util.required(ZodNonOptional, inst, args[0]);\n});\nexport function object(shape, params) {\n const def = {\n type: \"object\",\n shape: shape ?? {},\n ...util.normalizeParams(params),\n };\n return new ZodObject(def);\n}\n// strictObject\nexport function strictObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: never(),\n ...util.normalizeParams(params),\n });\n}\n// looseObject\nexport function looseObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: unknown(),\n ...util.normalizeParams(params),\n });\n}\nexport const ZodUnion = /*@__PURE__*/ core.$constructor(\"ZodUnion\", (inst, def) => {\n core.$ZodUnion.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\nexport function union(options, params) {\n return new ZodUnion({\n type: \"union\",\n options: options,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodXor = /*@__PURE__*/ core.$constructor(\"ZodXor\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodXor.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\n/** Creates an exclusive union (XOR) where exactly one option must match.\n * Unlike regular unions that succeed when any option matches, xor fails if\n * zero or more than one option matches the input. */\nexport function xor(options, params) {\n return new ZodXor({\n type: \"union\",\n options: options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodDiscriminatedUnion = /*@__PURE__*/ core.$constructor(\"ZodDiscriminatedUnion\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodDiscriminatedUnion.init(inst, def);\n});\nexport function discriminatedUnion(discriminator, options, params) {\n // const [options, params] = args;\n return new ZodDiscriminatedUnion({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodIntersection = /*@__PURE__*/ core.$constructor(\"ZodIntersection\", (inst, def) => {\n core.$ZodIntersection.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.intersectionProcessor(inst, ctx, json, params);\n});\nexport function intersection(left, right) {\n return new ZodIntersection({\n type: \"intersection\",\n left: left,\n right: right,\n });\n}\nexport const ZodTuple = /*@__PURE__*/ core.$constructor(\"ZodTuple\", (inst, def) => {\n core.$ZodTuple.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.tupleProcessor(inst, ctx, json, params);\n inst.rest = (rest) => inst.clone({\n ...inst._zod.def,\n rest: rest,\n });\n});\nexport function tuple(items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof core.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new ZodTuple({\n type: \"tuple\",\n items: items,\n rest,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodRecord = /*@__PURE__*/ core.$constructor(\"ZodRecord\", (inst, def) => {\n core.$ZodRecord.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.recordProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n});\nexport function record(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\n// type alksjf = core.output<core.$ZodRecordKey>;\nexport function partialRecord(keyType, valueType, params) {\n const k = core.clone(keyType);\n k._zod.values = undefined;\n return new ZodRecord({\n type: \"record\",\n keyType: k,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport function looseRecord(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n mode: \"loose\",\n ...util.normalizeParams(params),\n });\n}\nexport const ZodMap = /*@__PURE__*/ core.$constructor(\"ZodMap\", (inst, def) => {\n core.$ZodMap.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.mapProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function map(keyType, valueType, params) {\n return new ZodMap({\n type: \"map\",\n keyType: keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSet = /*@__PURE__*/ core.$constructor(\"ZodSet\", (inst, def) => {\n core.$ZodSet.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.setProcessor(inst, ctx, json, params);\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function set(valueType, params) {\n return new ZodSet({\n type: \"set\",\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEnum = /*@__PURE__*/ core.$constructor(\"ZodEnum\", (inst, def) => {\n core.$ZodEnum.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.enumProcessor(inst, ctx, json, params);\n inst.enum = def.entries;\n inst.options = Object.values(def.entries);\n const keys = new Set(Object.keys(def.entries));\n inst.extract = (values, params) => {\n const newEntries = {};\n for (const value of values) {\n if (keys.has(value)) {\n newEntries[value] = def.entries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n inst.exclude = (values, params) => {\n const newEntries = { ...def.entries };\n for (const value of values) {\n if (keys.has(value)) {\n delete newEntries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n});\nfunction _enum(values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport { _enum as enum };\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function nativeEnum(entries, params) {\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLiteral = /*@__PURE__*/ core.$constructor(\"ZodLiteral\", (inst, def) => {\n core.$ZodLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.literalProcessor(inst, ctx, json, params);\n inst.values = new Set(def.values);\n Object.defineProperty(inst, \"value\", {\n get() {\n if (def.values.length > 1) {\n throw new Error(\"This schema contains multiple valid literal values. Use `.values` instead.\");\n }\n return def.values[0];\n },\n });\n});\nexport function literal(value, params) {\n return new ZodLiteral({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\nexport const ZodFile = /*@__PURE__*/ core.$constructor(\"ZodFile\", (inst, def) => {\n core.$ZodFile.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.fileProcessor(inst, ctx, json, params);\n inst.min = (size, params) => inst.check(core._minSize(size, params));\n inst.max = (size, params) => inst.check(core._maxSize(size, params));\n inst.mime = (types, params) => inst.check(core._mime(Array.isArray(types) ? types : [types], params));\n});\nexport function file(params) {\n return core._file(ZodFile, params);\n}\nexport const ZodTransform = /*@__PURE__*/ core.$constructor(\"ZodTransform\", (inst, def) => {\n core.$ZodTransform.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.transformProcessor(inst, ctx, json, params);\n inst._zod.parse = (payload, _ctx) => {\n if (_ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = inst);\n // _issue.continue ??= true;\n payload.issues.push(util.issue(_issue));\n }\n };\n const output = def.transform(payload.value, payload);\n if (output instanceof Promise) {\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n payload.value = output;\n return payload;\n };\n});\nexport function transform(fn) {\n return new ZodTransform({\n type: \"transform\",\n transform: fn,\n });\n}\nexport const ZodOptional = /*@__PURE__*/ core.$constructor(\"ZodOptional\", (inst, def) => {\n core.$ZodOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function optional(innerType) {\n return new ZodOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodExactOptional = /*@__PURE__*/ core.$constructor(\"ZodExactOptional\", (inst, def) => {\n core.$ZodExactOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function exactOptional(innerType) {\n return new ZodExactOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodNullable = /*@__PURE__*/ core.$constructor(\"ZodNullable\", (inst, def) => {\n core.$ZodNullable.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullableProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nullable(innerType) {\n return new ZodNullable({\n type: \"nullable\",\n innerType: innerType,\n });\n}\n// nullish\nexport function nullish(innerType) {\n return optional(nullable(innerType));\n}\nexport const ZodDefault = /*@__PURE__*/ core.$constructor(\"ZodDefault\", (inst, def) => {\n core.$ZodDefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.defaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeDefault = inst.unwrap;\n});\nexport function _default(innerType, defaultValue) {\n return new ZodDefault({\n type: \"default\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodPrefault = /*@__PURE__*/ core.$constructor(\"ZodPrefault\", (inst, def) => {\n core.$ZodPrefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.prefaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function prefault(innerType, defaultValue) {\n return new ZodPrefault({\n type: \"prefault\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodNonOptional = /*@__PURE__*/ core.$constructor(\"ZodNonOptional\", (inst, def) => {\n core.$ZodNonOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nonoptionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nonoptional(innerType, params) {\n return new ZodNonOptional({\n type: \"nonoptional\",\n innerType: innerType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSuccess = /*@__PURE__*/ core.$constructor(\"ZodSuccess\", (inst, def) => {\n core.$ZodSuccess.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.successProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function success(innerType) {\n return new ZodSuccess({\n type: \"success\",\n innerType: innerType,\n });\n}\nexport const ZodCatch = /*@__PURE__*/ core.$constructor(\"ZodCatch\", (inst, def) => {\n core.$ZodCatch.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.catchProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeCatch = inst.unwrap;\n});\nfunction _catch(innerType, catchValue) {\n return new ZodCatch({\n type: \"catch\",\n innerType: innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\nexport { _catch as catch };\nexport const ZodNaN = /*@__PURE__*/ core.$constructor(\"ZodNaN\", (inst, def) => {\n core.$ZodNaN.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nanProcessor(inst, ctx, json, params);\n});\nexport function nan(params) {\n return core._nan(ZodNaN, params);\n}\nexport const ZodPipe = /*@__PURE__*/ core.$constructor(\"ZodPipe\", (inst, def) => {\n core.$ZodPipe.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.pipeProcessor(inst, ctx, json, params);\n inst.in = def.in;\n inst.out = def.out;\n});\nexport function pipe(in_, out) {\n return new ZodPipe({\n type: \"pipe\",\n in: in_,\n out: out,\n // ...util.normalizeParams(params),\n });\n}\nexport const ZodCodec = /*@__PURE__*/ core.$constructor(\"ZodCodec\", (inst, def) => {\n ZodPipe.init(inst, def);\n core.$ZodCodec.init(inst, def);\n});\nexport function codec(in_, out, params) {\n return new ZodCodec({\n type: \"pipe\",\n in: in_,\n out: out,\n transform: params.decode,\n reverseTransform: params.encode,\n });\n}\nexport const ZodReadonly = /*@__PURE__*/ core.$constructor(\"ZodReadonly\", (inst, def) => {\n core.$ZodReadonly.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.readonlyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function readonly(innerType) {\n return new ZodReadonly({\n type: \"readonly\",\n innerType: innerType,\n });\n}\nexport const ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"ZodTemplateLiteral\", (inst, def) => {\n core.$ZodTemplateLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.templateLiteralProcessor(inst, ctx, json, params);\n});\nexport function templateLiteral(parts, params) {\n return new ZodTemplateLiteral({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLazy = /*@__PURE__*/ core.$constructor(\"ZodLazy\", (inst, def) => {\n core.$ZodLazy.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.lazyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.getter();\n});\nexport function lazy(getter) {\n return new ZodLazy({\n type: \"lazy\",\n getter: getter,\n });\n}\nexport const ZodPromise = /*@__PURE__*/ core.$constructor(\"ZodPromise\", (inst, def) => {\n core.$ZodPromise.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.promiseProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function promise(innerType) {\n return new ZodPromise({\n type: \"promise\",\n innerType: innerType,\n });\n}\nexport const ZodFunction = /*@__PURE__*/ core.$constructor(\"ZodFunction\", (inst, def) => {\n core.$ZodFunction.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.functionProcessor(inst, ctx, json, params);\n});\nexport function _function(params) {\n return new ZodFunction({\n type: \"function\",\n input: Array.isArray(params?.input) ? tuple(params?.input) : (params?.input ?? array(unknown())),\n output: params?.output ?? unknown(),\n });\n}\nexport { _function as function };\nexport const ZodCustom = /*@__PURE__*/ core.$constructor(\"ZodCustom\", (inst, def) => {\n core.$ZodCustom.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.customProcessor(inst, ctx, json, params);\n});\n// custom checks\nexport function check(fn) {\n const ch = new core.$ZodCheck({\n check: \"custom\",\n // ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\nexport function custom(fn, _params) {\n return core._custom(ZodCustom, fn ?? (() => true), _params);\n}\nexport function refine(fn, _params = {}) {\n return core._refine(ZodCustom, fn, _params);\n}\n// superRefine\nexport function superRefine(fn) {\n return core._superRefine(fn);\n}\n// Re-export describe and meta from core\nexport const describe = core.describe;\nexport const meta = core.meta;\nfunction _instanceof(cls, params = {}) {\n const inst = new ZodCustom({\n type: \"custom\",\n check: \"custom\",\n fn: (data) => data instanceof cls,\n abort: true,\n ...util.normalizeParams(params),\n });\n inst._zod.bag.Class = cls;\n // Override check to emit invalid_type instead of custom\n inst._zod.check = (payload) => {\n if (!(payload.value instanceof cls)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: cls.name,\n input: payload.value,\n inst,\n path: [...(inst._zod.def.path ?? [])],\n });\n }\n };\n return inst;\n}\nexport { _instanceof as instanceof };\n// stringbool\nexport const stringbool = (...args) => core._stringbool({\n Codec: ZodCodec,\n Boolean: ZodBoolean,\n String: ZodString,\n}, ...args);\nexport function json(params) {\n const jsonSchema = lazy(() => {\n return union([string(params), number(), boolean(), _null(), array(jsonSchema), record(string(), jsonSchema)]);\n });\n return jsonSchema;\n}\n// preprocess\n// /** @deprecated Use `z.pipe()` and `z.transform()` instead. */\nexport function preprocess(fn, schema) {\n return pipe(transform(fn), schema);\n}\n","export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = Object.create(null);\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n // @ts-ignore\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n // @ts-ignore\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","// src/combine-headers.ts\nfunction combineHeaders(...headers) {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...currentHeaders != null ? currentHeaders : {}\n }),\n {}\n );\n}\n\n// src/convert-async-iterator-to-readable-stream.ts\nfunction convertAsyncIteratorToReadableStream(iterator) {\n let cancelled = false;\n return new ReadableStream({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n if (cancelled) return;\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n async cancel(reason) {\n cancelled = true;\n if (iterator.return) {\n try {\n await iterator.return(reason);\n } catch (e) {\n }\n }\n }\n });\n}\n\n// src/create-tool-name-mapping.ts\nfunction createToolNameMapping({\n tools = [],\n providerToolNames,\n resolveProviderToolName\n}) {\n var _a2;\n const customToolNameToProviderToolName = {};\n const providerToolNameToCustomToolName = {};\n for (const tool2 of tools) {\n if (tool2.type === \"provider\") {\n const providerToolName = (_a2 = resolveProviderToolName == null ? void 0 : resolveProviderToolName(tool2)) != null ? _a2 : tool2.id in providerToolNames ? providerToolNames[tool2.id] : void 0;\n if (providerToolName == null) {\n continue;\n }\n customToolNameToProviderToolName[tool2.name] = providerToolName;\n providerToolNameToCustomToolName[providerToolName] = tool2.name;\n }\n }\n return {\n toProviderToolName: (customToolName) => {\n var _a3;\n return (_a3 = customToolNameToProviderToolName[customToolName]) != null ? _a3 : customToolName;\n },\n toCustomToolName: (providerToolName) => {\n var _a3;\n return (_a3 = providerToolNameToCustomToolName[providerToolName]) != null ? _a3 : providerToolName;\n }\n };\n}\n\n// src/delay.ts\nasync function delay(delayInMs, options) {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n const signal = options == null ? void 0 : options.abortSignal;\n return new Promise((resolve2, reject) => {\n if (signal == null ? void 0 : signal.aborted) {\n reject(createAbortError());\n return;\n }\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve2();\n }, delayInMs);\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal == null ? void 0 : signal.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n signal == null ? void 0 : signal.addEventListener(\"abort\", onAbort);\n });\n}\nfunction createAbortError() {\n return new DOMException(\"Delay was aborted\", \"AbortError\");\n}\n\n// src/delayed-promise.ts\nvar DelayedPromise = class {\n constructor() {\n this.status = { type: \"pending\" };\n this._resolve = void 0;\n this._reject = void 0;\n }\n get promise() {\n if (this._promise) {\n return this._promise;\n }\n this._promise = new Promise((resolve2, reject) => {\n if (this.status.type === \"resolved\") {\n resolve2(this.status.value);\n } else if (this.status.type === \"rejected\") {\n reject(this.status.error);\n }\n this._resolve = resolve2;\n this._reject = reject;\n });\n return this._promise;\n }\n resolve(value) {\n var _a2;\n this.status = { type: \"resolved\", value };\n if (this._promise) {\n (_a2 = this._resolve) == null ? void 0 : _a2.call(this, value);\n }\n }\n reject(error) {\n var _a2;\n this.status = { type: \"rejected\", error };\n if (this._promise) {\n (_a2 = this._reject) == null ? void 0 : _a2.call(this, error);\n }\n }\n isResolved() {\n return this.status.type === \"resolved\";\n }\n isRejected() {\n return this.status.type === \"rejected\";\n }\n isPending() {\n return this.status.type === \"pending\";\n }\n};\n\n// src/extract-response-headers.ts\nfunction extractResponseHeaders(response) {\n return Object.fromEntries([...response.headers]);\n}\n\n// src/uint8-utils.ts\nvar { btoa, atob } = globalThis;\nfunction convertBase64ToUint8Array(base64String) {\n const base64Url = base64String.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, (byte) => byte.codePointAt(0));\n}\nfunction convertUint8ArrayToBase64(array) {\n let latin1string = \"\";\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n return btoa(latin1string);\n}\nfunction convertToBase64(value) {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n\n// src/convert-image-model-file-to-data-uri.ts\nfunction convertImageModelFileToDataUri(file) {\n if (file.type === \"url\") return file.url;\n return `data:${file.mediaType};base64,${typeof file.data === \"string\" ? file.data : convertUint8ArrayToBase64(file.data)}`;\n}\n\n// src/convert-to-form-data.ts\nfunction convertToFormData(input, options = {}) {\n const { useArrayBrackets = true } = options;\n const formData = new FormData();\n for (const [key, value] of Object.entries(input)) {\n if (value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 1) {\n formData.append(key, value[0]);\n continue;\n }\n const arrayKey = useArrayBrackets ? `${key}[]` : key;\n for (const item of value) {\n formData.append(arrayKey, item);\n }\n continue;\n }\n formData.append(key, value);\n }\n return formData;\n}\n\n// src/download-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_DownloadError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar DownloadError = class extends (_b = AISDKError, _a = symbol, _b) {\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`\n }) {\n super({ name, message, cause });\n this[_a] = true;\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n\n// src/read-response-with-size-limit.ts\nvar DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;\nasync function readResponseWithSizeLimit({\n response,\n url,\n maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE\n}) {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength != null) {\n const length = parseInt(contentLength, 10);\n if (!isNaN(length) && length > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes (Content-Length: ${length}).`\n });\n }\n }\n const body = response.body;\n if (body == null) {\n return new Uint8Array(0);\n }\n const reader = body.getReader();\n const chunks = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.length;\n if (totalBytes > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes.`\n });\n }\n chunks.push(value);\n }\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n const result = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n// src/validate-download-url.ts\nfunction validateDownloadUrl(url) {\n let parsed;\n try {\n parsed = new URL(url);\n } catch (e) {\n throw new DownloadError({\n url,\n message: `Invalid URL: ${url}`\n });\n }\n if (parsed.protocol === \"data:\") {\n return;\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new DownloadError({\n url,\n message: `URL scheme must be http, https, or data, got ${parsed.protocol}`\n });\n }\n const hostname = parsed.hostname;\n if (!hostname) {\n throw new DownloadError({\n url,\n message: `URL must have a hostname`\n });\n }\n if (hostname === \"localhost\" || hostname.endsWith(\".local\") || hostname.endsWith(\".localhost\")) {\n throw new DownloadError({\n url,\n message: `URL with hostname ${hostname} is not allowed`\n });\n }\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n const ipv6 = hostname.slice(1, -1);\n if (isPrivateIPv6(ipv6)) {\n throw new DownloadError({\n url,\n message: `URL with IPv6 address ${hostname} is not allowed`\n });\n }\n return;\n }\n if (isIPv4(hostname)) {\n if (isPrivateIPv4(hostname)) {\n throw new DownloadError({\n url,\n message: `URL with IP address ${hostname} is not allowed`\n });\n }\n return;\n }\n}\nfunction isIPv4(hostname) {\n const parts = hostname.split(\".\");\n if (parts.length !== 4) return false;\n return parts.every((part) => {\n const num = Number(part);\n return Number.isInteger(num) && num >= 0 && num <= 255 && String(num) === part;\n });\n}\nfunction isPrivateIPv4(ip) {\n const parts = ip.split(\".\").map(Number);\n const [a, b] = parts;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n return false;\n}\nfunction isPrivateIPv6(ip) {\n const normalized = ip.toLowerCase();\n if (normalized === \"::1\") return true;\n if (normalized === \"::\") return true;\n if (normalized.startsWith(\"::ffff:\")) {\n const mappedPart = normalized.slice(7);\n if (isIPv4(mappedPart)) {\n return isPrivateIPv4(mappedPart);\n }\n const hexParts = mappedPart.split(\":\");\n if (hexParts.length === 2) {\n const high = parseInt(hexParts[0], 16);\n const low = parseInt(hexParts[1], 16);\n if (!isNaN(high) && !isNaN(low)) {\n const a = high >> 8 & 255;\n const b = high & 255;\n const c = low >> 8 & 255;\n const d = low & 255;\n return isPrivateIPv4(`${a}.${b}.${c}.${d}`);\n }\n }\n }\n if (normalized.startsWith(\"fc\") || normalized.startsWith(\"fd\")) return true;\n if (normalized.startsWith(\"fe80\")) return true;\n return false;\n}\n\n// src/download-blob.ts\nasync function downloadBlob(url, options) {\n var _a2, _b2;\n validateDownloadUrl(url);\n try {\n const response = await fetch(url, {\n signal: options == null ? void 0 : options.abortSignal\n });\n if (response.redirected) {\n validateDownloadUrl(response.url);\n }\n if (!response.ok) {\n throw new DownloadError({\n url,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url,\n maxBytes: (_a2 = options == null ? void 0 : options.maxBytes) != null ? _a2 : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n const contentType = (_b2 = response.headers.get(\"content-type\")) != null ? _b2 : void 0;\n return new Blob([data], contentType ? { type: contentType } : void 0);\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n throw new DownloadError({ url, cause: error });\n }\n}\n\n// src/generate-id.ts\nimport { InvalidArgumentError } from \"@ai-sdk/provider\";\nvar createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n separator = \"-\"\n} = {}) => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[Math.random() * alphabetLength | 0];\n }\n return chars.join(\"\");\n };\n if (prefix == null) {\n return generator;\n }\n if (alphabet.includes(separator)) {\n throw new InvalidArgumentError({\n argument: \"separator\",\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`\n });\n }\n return () => `${prefix}${separator}${generator()}`;\n};\nvar generateId = createIdGenerator();\n\n// src/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return JSON.stringify(error);\n}\n\n// src/get-from-api.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\n\n// src/handle-fetch-error.ts\nimport { APICallError } from \"@ai-sdk/provider\";\n\n// src/is-abort-error.ts\nfunction isAbortError(error) {\n return (error instanceof Error || error instanceof DOMException) && (error.name === \"AbortError\" || error.name === \"ResponseAborted\" || // Next.js\n error.name === \"TimeoutError\");\n}\n\n// src/handle-fetch-error.ts\nvar FETCH_FAILED_ERROR_MESSAGES = [\"fetch failed\", \"failed to fetch\"];\nvar BUN_ERROR_CODES = [\n \"ConnectionRefused\",\n \"ConnectionClosed\",\n \"FailedToOpenSocket\",\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"EPIPE\"\n];\nfunction isBunNetworkError(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const code = error.code;\n if (typeof code === \"string\" && BUN_ERROR_CODES.includes(code)) {\n return true;\n }\n return false;\n}\nfunction handleFetchError({\n error,\n url,\n requestBodyValues\n}) {\n if (isAbortError(error)) {\n return error;\n }\n if (error instanceof TypeError && FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())) {\n const cause = error.cause;\n if (cause != null) {\n return new APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true\n // retry when network error\n });\n }\n }\n if (isBunNetworkError(error)) {\n return new APICallError({\n message: `Cannot connect to API: ${error.message}`,\n cause: error,\n url,\n requestBodyValues,\n isRetryable: true\n });\n }\n return error;\n}\n\n// src/get-runtime-environment-user-agent.ts\nfunction getRuntimeEnvironmentUserAgent(globalThisAny = globalThis) {\n var _a2, _b2, _c;\n if (globalThisAny.window) {\n return `runtime/browser`;\n }\n if ((_a2 = globalThisAny.navigator) == null ? void 0 : _a2.userAgent) {\n return `runtime/${globalThisAny.navigator.userAgent.toLowerCase()}`;\n }\n if ((_c = (_b2 = globalThisAny.process) == null ? void 0 : _b2.versions) == null ? void 0 : _c.node) {\n return `runtime/node.js/${globalThisAny.process.version.substring(0)}`;\n }\n if (globalThisAny.EdgeRuntime) {\n return `runtime/vercel-edge`;\n }\n return \"runtime/unknown\";\n}\n\n// src/normalize-headers.ts\nfunction normalizeHeaders(headers) {\n if (headers == null) {\n return {};\n }\n const normalized = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value;\n });\n } else {\n if (!Array.isArray(headers)) {\n headers = Object.entries(headers);\n }\n for (const [key, value] of headers) {\n if (value != null) {\n normalized[key.toLowerCase()] = value;\n }\n }\n }\n return normalized;\n}\n\n// src/with-user-agent-suffix.ts\nfunction withUserAgentSuffix(headers, ...userAgentSuffixParts) {\n const normalizedHeaders = new Headers(normalizeHeaders(headers));\n const currentUserAgentHeader = normalizedHeaders.get(\"user-agent\") || \"\";\n normalizedHeaders.set(\n \"user-agent\",\n [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(\" \")\n );\n return Object.fromEntries(normalizedHeaders.entries());\n}\n\n// src/version.ts\nvar VERSION = true ? \"4.0.23\" : \"0.0.0-test\";\n\n// src/get-from-api.ts\nvar getOriginalFetch = () => globalThis.fetch;\nvar getFromApi = async ({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"GET\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n throw new APICallError2({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError2({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n\n// src/inject-json-instruction.ts\nvar DEFAULT_SCHEMA_PREFIX = \"JSON schema:\";\nvar DEFAULT_SCHEMA_SUFFIX = \"You MUST answer with a JSON object that matches the JSON schema above.\";\nvar DEFAULT_GENERIC_SUFFIX = \"You MUST answer with JSON.\";\nfunction injectJsonInstruction({\n prompt,\n schema,\n schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : void 0,\n schemaSuffix = schema != null ? DEFAULT_SCHEMA_SUFFIX : DEFAULT_GENERIC_SUFFIX\n}) {\n return [\n prompt != null && prompt.length > 0 ? prompt : void 0,\n prompt != null && prompt.length > 0 ? \"\" : void 0,\n // add a newline if prompt is not null\n schemaPrefix,\n schema != null ? JSON.stringify(schema) : void 0,\n schemaSuffix\n ].filter((line) => line != null).join(\"\\n\");\n}\nfunction injectJsonInstructionIntoMessages({\n messages,\n schema,\n schemaPrefix,\n schemaSuffix\n}) {\n var _a2, _b2;\n const systemMessage = ((_a2 = messages[0]) == null ? void 0 : _a2.role) === \"system\" ? { ...messages[0] } : { role: \"system\", content: \"\" };\n systemMessage.content = injectJsonInstruction({\n prompt: systemMessage.content,\n schema,\n schemaPrefix,\n schemaSuffix\n });\n return [\n systemMessage,\n ...((_b2 = messages[0]) == null ? void 0 : _b2.role) === \"system\" ? messages.slice(1) : messages\n ];\n}\n\n// src/is-non-nullable.ts\nfunction isNonNullable(value) {\n return value != null;\n}\n\n// src/is-url-supported.ts\nfunction isUrlSupported({\n mediaType,\n url,\n supportedUrls\n}) {\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n return Object.entries(supportedUrls).map(([key, value]) => {\n const mediaType2 = key.toLowerCase();\n return mediaType2 === \"*\" || mediaType2 === \"*/*\" ? { mediaTypePrefix: \"\", regexes: value } : { mediaTypePrefix: mediaType2.replace(/\\*/, \"\"), regexes: value };\n }).filter(({ mediaTypePrefix }) => mediaType.startsWith(mediaTypePrefix)).flatMap(({ regexes }) => regexes).some((pattern) => pattern.test(url));\n}\n\n// src/load-api-key.ts\nimport { LoadAPIKeyError } from \"@ai-sdk/provider\";\nfunction loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = \"apiKey\",\n description\n}) {\n if (typeof apiKey === \"string\") {\n return apiKey;\n }\n if (apiKey != null) {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n apiKey = process.env[environmentVariableName];\n if (apiKey == null) {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof apiKey !== \"string\") {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return apiKey;\n}\n\n// src/load-optional-setting.ts\nfunction loadOptionalSetting({\n settingValue,\n environmentVariableName\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null || typeof process === \"undefined\") {\n return void 0;\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null || typeof settingValue !== \"string\") {\n return void 0;\n }\n return settingValue;\n}\n\n// src/load-setting.ts\nimport { LoadSettingError } from \"@ai-sdk/provider\";\nfunction loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null) {\n throw new LoadSettingError({\n message: `${description} setting must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null) {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof settingValue !== \"string\") {\n throw new LoadSettingError({\n message: `${description} setting must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return settingValue;\n}\n\n// src/media-type-to-extension.ts\nfunction mediaTypeToExtension(mediaType) {\n var _a2;\n const [_type, subtype = \"\"] = mediaType.toLowerCase().split(\"/\");\n return (_a2 = {\n mpeg: \"mp3\",\n \"x-wav\": \"wav\",\n opus: \"ogg\",\n mp4: \"m4a\",\n \"x-m4a\": \"m4a\"\n }[subtype]) != null ? _a2 : subtype;\n}\n\n// src/parse-json.ts\nimport {\n JSONParseError,\n TypeValidationError as TypeValidationError3\n} from \"@ai-sdk/provider\";\n\n// src/secure-json-parse.ts\nvar suspectProtoRx = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/;\nvar suspectConstructorRx = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/;\nfunction _parse(text) {\n const obj = JSON.parse(text);\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (suspectProtoRx.test(text) === false && suspectConstructorRx.test(text) === false) {\n return obj;\n }\n return filter(obj);\n}\nfunction filter(obj) {\n let next = [obj];\n while (next.length) {\n const nodes = next;\n next = [];\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, \"__proto__\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n if (Object.prototype.hasOwnProperty.call(node, \"constructor\") && node.constructor !== null && typeof node.constructor === \"object\" && Object.prototype.hasOwnProperty.call(node.constructor, \"prototype\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === \"object\") {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\nfunction secureJsonParse(text) {\n const { stackTraceLimit } = Error;\n try {\n Error.stackTraceLimit = 0;\n } catch (e) {\n return _parse(text);\n }\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n\n// src/validate-types.ts\nimport { TypeValidationError as TypeValidationError2 } from \"@ai-sdk/provider\";\n\n// src/schema.ts\nimport { TypeValidationError } from \"@ai-sdk/provider\";\nimport * as z4 from \"zod/v4\";\n\n// src/add-additional-properties-to-json-schema.ts\nfunction addAdditionalPropertiesToJsonSchema(jsonSchema2) {\n if (jsonSchema2.type === \"object\" || Array.isArray(jsonSchema2.type) && jsonSchema2.type.includes(\"object\")) {\n jsonSchema2.additionalProperties = false;\n const { properties } = jsonSchema2;\n if (properties != null) {\n for (const key of Object.keys(properties)) {\n properties[key] = visit(properties[key]);\n }\n }\n }\n if (jsonSchema2.items != null) {\n jsonSchema2.items = Array.isArray(jsonSchema2.items) ? jsonSchema2.items.map(visit) : visit(jsonSchema2.items);\n }\n if (jsonSchema2.anyOf != null) {\n jsonSchema2.anyOf = jsonSchema2.anyOf.map(visit);\n }\n if (jsonSchema2.allOf != null) {\n jsonSchema2.allOf = jsonSchema2.allOf.map(visit);\n }\n if (jsonSchema2.oneOf != null) {\n jsonSchema2.oneOf = jsonSchema2.oneOf.map(visit);\n }\n const { definitions } = jsonSchema2;\n if (definitions != null) {\n for (const key of Object.keys(definitions)) {\n definitions[key] = visit(definitions[key]);\n }\n }\n return jsonSchema2;\n}\nfunction visit(def) {\n if (typeof def === \"boolean\") return def;\n return addAdditionalPropertiesToJsonSchema(def);\n}\n\n// src/to-json-schema/zod3-to-json-schema/options.ts\nvar ignoreOverride = /* @__PURE__ */ Symbol(\n \"Let zodToJsonSchema decide on which parser to use\"\n);\nvar defaultOptions = {\n name: void 0,\n $refStrategy: \"root\",\n basePath: [\"#\"],\n effectStrategy: \"input\",\n pipeStrategy: \"all\",\n dateStrategy: \"format:date-time\",\n mapStrategy: \"entries\",\n removeAdditionalStrategy: \"passthrough\",\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: \"definitions\",\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n patternStrategy: \"escape\",\n applyRegexFlags: false,\n emailStrategy: \"format:email\",\n base64Strategy: \"contentEncoding:base64\",\n nameStrategy: \"ref\"\n};\nvar getDefaultOptions = (options) => typeof options === \"string\" ? {\n ...defaultOptions,\n name: options\n} : {\n ...defaultOptions,\n ...options\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nimport { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind3 } from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/any.ts\nfunction parseAnyDef() {\n return {};\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/array.ts\nimport { ZodFirstPartyTypeKind } from \"zod/v3\";\nfunction parseArrayDef(def, refs) {\n var _a2, _b2, _c;\n const res = {\n type: \"array\"\n };\n if (((_a2 = def.type) == null ? void 0 : _a2._def) && ((_c = (_b2 = def.type) == null ? void 0 : _b2._def) == null ? void 0 : _c.typeName) !== ZodFirstPartyTypeKind.ZodAny) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n }\n if (def.minLength) {\n res.minItems = def.minLength.value;\n }\n if (def.maxLength) {\n res.maxItems = def.maxLength.value;\n }\n if (def.exactLength) {\n res.minItems = def.exactLength.value;\n res.maxItems = def.exactLength.value;\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/bigint.ts\nfunction parseBigintDef(def) {\n const res = {\n type: \"integer\",\n format: \"int64\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/boolean.ts\nfunction parseBooleanDef() {\n return { type: \"boolean\" };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/branded.ts\nfunction parseBrandedDef(_def, refs) {\n return parseDef(_def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/catch.ts\nvar parseCatchDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/date.ts\nfunction parseDateDef(def, refs, overrideDateStrategy) {\n const strategy = overrideDateStrategy != null ? overrideDateStrategy : refs.dateStrategy;\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item, i) => parseDateDef(def, refs, item))\n };\n }\n switch (strategy) {\n case \"string\":\n case \"format:date-time\":\n return {\n type: \"string\",\n format: \"date-time\"\n };\n case \"format:date\":\n return {\n type: \"string\",\n format: \"date\"\n };\n case \"integer\":\n return integerDateParser(def);\n }\n}\nvar integerDateParser = (def) => {\n const res = {\n type: \"integer\",\n format: \"unix-time\"\n };\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minimum = check.value;\n break;\n case \"max\":\n res.maximum = check.value;\n break;\n }\n }\n return res;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/default.ts\nfunction parseDefaultDef(_def, refs) {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/effects.ts\nfunction parseEffectsDef(_def, refs) {\n return refs.effectStrategy === \"input\" ? parseDef(_def.schema._def, refs) : parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/enum.ts\nfunction parseEnumDef(def) {\n return {\n type: \"string\",\n enum: Array.from(def.values)\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/intersection.ts\nvar isJsonSchema7AllOfType = (type) => {\n if (\"type\" in type && type.type === \"string\") return false;\n return \"allOf\" in type;\n};\nfunction parseIntersectionDef(def, refs) {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"1\"]\n })\n ].filter((x) => !!x);\n const mergedAllOf = [];\n allOf.forEach((schema) => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n } else {\n let nestedSchema = schema;\n if (\"additionalProperties\" in schema && schema.additionalProperties === false) {\n const { additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length ? { allOf: mergedAllOf } : void 0;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/literal.ts\nfunction parseLiteralDef(def) {\n const parsedType = typeof def.value;\n if (parsedType !== \"bigint\" && parsedType !== \"number\" && parsedType !== \"boolean\" && parsedType !== \"string\") {\n return {\n type: Array.isArray(def.value) ? \"array\" : \"object\"\n };\n }\n return {\n type: parsedType === \"bigint\" ? \"integer\" : parsedType,\n const: def.value\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nimport {\n ZodFirstPartyTypeKind as ZodFirstPartyTypeKind2\n} from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/string.ts\nvar emojiRegex = void 0;\nvar zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email: /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === void 0) {\n emojiRegex = RegExp(\n \"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\",\n \"u\"\n );\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/\n};\nfunction parseStringDef(def, refs) {\n const res = {\n type: \"string\"\n };\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n break;\n case \"max\":\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"email\":\n switch (refs.emailStrategy) {\n case \"format:email\":\n addFormat(res, \"email\", check.message, refs);\n break;\n case \"format:idn-email\":\n addFormat(res, \"idn-email\", check.message, refs);\n break;\n case \"pattern:zod\":\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n break;\n case \"url\":\n addFormat(res, \"uri\", check.message, refs);\n break;\n case \"uuid\":\n addFormat(res, \"uuid\", check.message, refs);\n break;\n case \"regex\":\n addPattern(res, check.regex, check.message, refs);\n break;\n case \"cuid\":\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case \"cuid2\":\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case \"startsWith\":\n addPattern(\n res,\n RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`),\n check.message,\n refs\n );\n break;\n case \"endsWith\":\n addPattern(\n res,\n RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`),\n check.message,\n refs\n );\n break;\n case \"datetime\":\n addFormat(res, \"date-time\", check.message, refs);\n break;\n case \"date\":\n addFormat(res, \"date\", check.message, refs);\n break;\n case \"time\":\n addFormat(res, \"time\", check.message, refs);\n break;\n case \"duration\":\n addFormat(res, \"duration\", check.message, refs);\n break;\n case \"length\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"includes\": {\n addPattern(\n res,\n RegExp(escapeLiteralCheckValue(check.value, refs)),\n check.message,\n refs\n );\n break;\n }\n case \"ip\": {\n if (check.version !== \"v6\") {\n addFormat(res, \"ipv4\", check.message, refs);\n }\n if (check.version !== \"v4\") {\n addFormat(res, \"ipv6\", check.message, refs);\n }\n break;\n }\n case \"base64url\":\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case \"jwt\":\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case \"cidr\": {\n if (check.version !== \"v6\") {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== \"v4\") {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case \"emoji\":\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case \"ulid\": {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case \"base64\": {\n switch (refs.base64Strategy) {\n case \"format:binary\": {\n addFormat(res, \"binary\", check.message, refs);\n break;\n }\n case \"contentEncoding:base64\": {\n res.contentEncoding = \"base64\";\n break;\n }\n case \"pattern:zod\": {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case \"nanoid\": {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"trim\":\n break;\n default:\n /* @__PURE__ */ ((_) => {\n })(check);\n }\n }\n }\n return res;\n}\nfunction escapeLiteralCheckValue(literal, refs) {\n return refs.patternStrategy === \"escape\" ? escapeNonAlphaNumeric(literal) : literal;\n}\nvar ALPHA_NUMERIC = new Set(\n \"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\"\n);\nfunction escapeNonAlphaNumeric(source) {\n let result = \"\";\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += \"\\\\\";\n }\n result += source[i];\n }\n return result;\n}\nfunction addFormat(schema, value, message, refs) {\n var _a2;\n if (schema.format || ((_a2 = schema.anyOf) == null ? void 0 : _a2.some((x) => x.format))) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n if (schema.format) {\n schema.anyOf.push({\n format: schema.format\n });\n delete schema.format;\n }\n schema.anyOf.push({\n format: value,\n ...message && refs.errorMessages && { errorMessage: { format: message } }\n });\n } else {\n schema.format = value;\n }\n}\nfunction addPattern(schema, regex, message, refs) {\n var _a2;\n if (schema.pattern || ((_a2 = schema.allOf) == null ? void 0 : _a2.some((x) => x.pattern))) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n if (schema.pattern) {\n schema.allOf.push({\n pattern: schema.pattern\n });\n delete schema.pattern;\n }\n schema.allOf.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...message && refs.errorMessages && { errorMessage: { pattern: message } }\n });\n } else {\n schema.pattern = stringifyRegExpWithFlags(regex, refs);\n }\n}\nfunction stringifyRegExpWithFlags(regex, refs) {\n var _a2;\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n const flags = {\n i: regex.flags.includes(\"i\"),\n // Case-insensitive\n m: regex.flags.includes(\"m\"),\n // `^` and `$` matches adjacent to newline characters\n s: regex.flags.includes(\"s\")\n // `.` matches newlines\n };\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = \"\";\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n } else if (source[i + 1] === \"-\" && ((_a2 = source[i + 2]) == null ? void 0 : _a2.match(/[a-z]/))) {\n pattern += source[i];\n inCharRange = true;\n } else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n } else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n if (flags.m) {\n if (source[i] === \"^\") {\n pattern += `(^|(?<=[\\r\n]))`;\n continue;\n } else if (source[i] === \"$\") {\n pattern += `($|(?=[\\r\n]))`;\n continue;\n }\n }\n if (flags.s && source[i] === \".\") {\n pattern += inCharGroup ? `${source[i]}\\r\n` : `[${source[i]}\\r\n]`;\n continue;\n }\n pattern += source[i];\n if (source[i] === \"\\\\\") {\n isEscaped = true;\n } else if (inCharGroup && source[i] === \"]\") {\n inCharGroup = false;\n } else if (!inCharGroup && source[i] === \"[\") {\n inCharGroup = true;\n }\n }\n try {\n new RegExp(pattern);\n } catch (e) {\n console.warn(\n `Could not convert regex pattern at ${refs.currentPath.join(\n \"/\"\n )} to a flag-independent form! Falling back to the flag-ignorant source`\n );\n return regex.source;\n }\n return pattern;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nfunction parseRecordDef(def, refs) {\n var _a2, _b2, _c, _d, _e, _f;\n const schema = {\n type: \"object\",\n additionalProperties: (_a2 = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n })) != null ? _a2 : refs.allowedAdditionalProperties\n };\n if (((_b2 = def.keyType) == null ? void 0 : _b2._def.typeName) === ZodFirstPartyTypeKind2.ZodString && ((_c = def.keyType._def.checks) == null ? void 0 : _c.length)) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType\n };\n } else if (((_d = def.keyType) == null ? void 0 : _d._def.typeName) === ZodFirstPartyTypeKind2.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values\n }\n };\n } else if (((_e = def.keyType) == null ? void 0 : _e._def.typeName) === ZodFirstPartyTypeKind2.ZodBranded && def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind2.ZodString && ((_f = def.keyType._def.type._def.checks) == null ? void 0 : _f.length)) {\n const { type, ...keyType } = parseBrandedDef(\n def.keyType._def,\n refs\n );\n return {\n ...schema,\n propertyNames: keyType\n };\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/map.ts\nfunction parseMapDef(def, refs) {\n if (refs.mapStrategy === \"record\") {\n return parseRecordDef(def, refs);\n }\n const keys = parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"0\"]\n }) || parseAnyDef();\n const values = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"1\"]\n }) || parseAnyDef();\n return {\n type: \"array\",\n maxItems: 125,\n items: {\n type: \"array\",\n items: [keys, values],\n minItems: 2,\n maxItems: 2\n }\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/native-enum.ts\nfunction parseNativeEnumDef(def) {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key) => {\n return typeof object[object[key]] !== \"number\";\n });\n const actualValues = actualKeys.map((key) => object[key]);\n const parsedTypes = Array.from(\n new Set(actualValues.map((values) => typeof values))\n );\n return {\n type: parsedTypes.length === 1 ? parsedTypes[0] === \"string\" ? \"string\" : \"number\" : [\"string\", \"number\"],\n enum: actualValues\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/never.ts\nfunction parseNeverDef() {\n return { not: parseAnyDef() };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/null.ts\nfunction parseNullDef() {\n return {\n type: \"null\"\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/union.ts\nvar primitiveMappings = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBigInt: \"integer\",\n ZodBoolean: \"boolean\",\n ZodNull: \"null\"\n};\nfunction parseUnionDef(def, refs) {\n const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n if (options.every(\n (x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length)\n )) {\n const types = options.reduce((types2, x) => {\n const type = primitiveMappings[x._def.typeName];\n return type && !types2.includes(type) ? [...types2, type] : types2;\n }, []);\n return {\n type: types.length > 1 ? types : types[0]\n };\n } else if (options.every((x) => x._def.typeName === \"ZodLiteral\" && !x.description)) {\n const types = options.reduce(\n (acc, x) => {\n const type = typeof x._def.value;\n switch (type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return [...acc, type];\n case \"bigint\":\n return [...acc, \"integer\"];\n case \"object\":\n if (x._def.value === null) return [...acc, \"null\"];\n case \"symbol\":\n case \"undefined\":\n case \"function\":\n default:\n return acc;\n }\n },\n []\n );\n if (types.length === options.length) {\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce(\n (acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n },\n []\n )\n };\n }\n } else if (options.every((x) => x._def.typeName === \"ZodEnum\")) {\n return {\n type: \"string\",\n enum: options.reduce(\n (acc, x) => [\n ...acc,\n ...x._def.values.filter((x2) => !acc.includes(x2))\n ],\n []\n )\n };\n }\n return asAnyOf(def, refs);\n}\nvar asAnyOf = (def, refs) => {\n const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", `${i}`]\n })\n ).filter(\n (x) => !!x && (!refs.strictUnions || typeof x === \"object\" && Object.keys(x).length > 0)\n );\n return anyOf.length ? { anyOf } : void 0;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/nullable.ts\nfunction parseNullableDef(def, refs) {\n if ([\"ZodString\", \"ZodNumber\", \"ZodBigInt\", \"ZodBoolean\", \"ZodNull\"].includes(\n def.innerType._def.typeName\n ) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) {\n return {\n type: [\n primitiveMappings[def.innerType._def.typeName],\n \"null\"\n ]\n };\n }\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"0\"]\n });\n return base && { anyOf: [base, { type: \"null\" }] };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/number.ts\nfunction parseNumberDef(def) {\n const res = {\n type: \"number\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"int\":\n res.type = \"integer\";\n break;\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/object.ts\nfunction parseObjectDef(def, refs) {\n const result = {\n type: \"object\",\n properties: {}\n };\n const required = [];\n const shape = def.shape();\n for (const propName in shape) {\n let propDef = shape[propName];\n if (propDef === void 0 || propDef._def === void 0) {\n continue;\n }\n const propOptional = safeIsOptional(propDef);\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", propName],\n propertyPath: [...refs.currentPath, \"properties\", propName]\n });\n if (parsedDef === void 0) {\n continue;\n }\n result.properties[propName] = parsedDef;\n if (!propOptional) {\n required.push(propName);\n }\n }\n if (required.length) {\n result.required = required;\n }\n const additionalProperties = decideAdditionalProperties(def, refs);\n if (additionalProperties !== void 0) {\n result.additionalProperties = additionalProperties;\n }\n return result;\n}\nfunction decideAdditionalProperties(def, refs) {\n if (def.catchall._def.typeName !== \"ZodNever\") {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n });\n }\n switch (def.unknownKeys) {\n case \"passthrough\":\n return refs.allowedAdditionalProperties;\n case \"strict\":\n return refs.rejectedAdditionalProperties;\n case \"strip\":\n return refs.removeAdditionalStrategy === \"strict\" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties;\n }\n}\nfunction safeIsOptional(schema) {\n try {\n return schema.isOptional();\n } catch (e) {\n return true;\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/optional.ts\nvar parseOptionalDef = (def, refs) => {\n var _a2;\n if (refs.currentPath.toString() === ((_a2 = refs.propertyPath) == null ? void 0 : _a2.toString())) {\n return parseDef(def.innerType._def, refs);\n }\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"1\"]\n });\n return innerSchema ? { anyOf: [{ not: parseAnyDef() }, innerSchema] } : parseAnyDef();\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/pipeline.ts\nvar parsePipelineDef = (def, refs) => {\n if (refs.pipeStrategy === \"input\") {\n return parseDef(def.in._def, refs);\n } else if (refs.pipeStrategy === \"output\") {\n return parseDef(def.out._def, refs);\n }\n const a = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n });\n const b = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", a ? \"1\" : \"0\"]\n });\n return {\n allOf: [a, b].filter((x) => x !== void 0)\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/promise.ts\nfunction parsePromiseDef(def, refs) {\n return parseDef(def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/set.ts\nfunction parseSetDef(def, refs) {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n const schema = {\n type: \"array\",\n uniqueItems: true,\n items\n };\n if (def.minSize) {\n schema.minItems = def.minSize.value;\n }\n if (def.maxSize) {\n schema.maxItems = def.maxSize.value;\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/tuple.ts\nfunction parseTupleDef(def, refs) {\n if (def.rest) {\n return {\n type: \"array\",\n minItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n ),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalItems\"]\n })\n };\n } else {\n return {\n type: \"array\",\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n )\n };\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/undefined.ts\nfunction parseUndefinedDef() {\n return {\n not: parseAnyDef()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/unknown.ts\nfunction parseUnknownDef() {\n return parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/readonly.ts\nvar parseReadonlyDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nvar selectParser = (def, typeName, refs) => {\n switch (typeName) {\n case ZodFirstPartyTypeKind3.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNumber:\n return parseNumberDef(def);\n case ZodFirstPartyTypeKind3.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBigInt:\n return parseBigintDef(def);\n case ZodFirstPartyTypeKind3.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind3.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUndefined:\n return parseUndefinedDef();\n case ZodFirstPartyTypeKind3.ZodNull:\n return parseNullDef();\n case ZodFirstPartyTypeKind3.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUnion:\n case ZodFirstPartyTypeKind3.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLiteral:\n return parseLiteralDef(def);\n case ZodFirstPartyTypeKind3.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLazy:\n return () => def.getter()._def;\n case ZodFirstPartyTypeKind3.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNaN:\n case ZodFirstPartyTypeKind3.ZodNever:\n return parseNeverDef();\n case ZodFirstPartyTypeKind3.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodAny:\n return parseAnyDef();\n case ZodFirstPartyTypeKind3.ZodUnknown:\n return parseUnknownDef();\n case ZodFirstPartyTypeKind3.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodFunction:\n case ZodFirstPartyTypeKind3.ZodVoid:\n case ZodFirstPartyTypeKind3.ZodSymbol:\n return void 0;\n default:\n return /* @__PURE__ */ ((_) => void 0)(typeName);\n }\n};\n\n// src/to-json-schema/zod3-to-json-schema/get-relative-path.ts\nvar getRelativePath = (pathA, pathB) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i]) break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join(\"/\");\n};\n\n// src/to-json-schema/zod3-to-json-schema/parse-def.ts\nfunction parseDef(def, refs, forceResolution = false) {\n var _a2;\n const seenItem = refs.seen.get(def);\n if (refs.override) {\n const overrideResult = (_a2 = refs.override) == null ? void 0 : _a2.call(\n refs,\n def,\n refs,\n seenItem,\n forceResolution\n );\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n if (seenSchema !== void 0) {\n return seenSchema;\n }\n }\n const newItem = { def, path: refs.currentPath, jsonSchema: void 0 };\n refs.seen.set(def, newItem);\n const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);\n const jsonSchema2 = typeof jsonSchemaOrGetter === \"function\" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter;\n if (jsonSchema2) {\n addMeta(def, refs, jsonSchema2);\n }\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema2, def, refs);\n newItem.jsonSchema = jsonSchema2;\n return postProcessResult;\n }\n newItem.jsonSchema = jsonSchema2;\n return jsonSchema2;\n}\nvar get$ref = (item, refs) => {\n switch (refs.$refStrategy) {\n case \"root\":\n return { $ref: item.path.join(\"/\") };\n case \"relative\":\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case \"none\":\n case \"seen\": {\n if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) {\n console.warn(\n `Recursive reference detected at ${refs.currentPath.join(\n \"/\"\n )}! Defaulting to any`\n );\n return parseAnyDef();\n }\n return refs.$refStrategy === \"seen\" ? parseAnyDef() : void 0;\n }\n }\n};\nvar addMeta = (def, refs, jsonSchema2) => {\n if (def.description) {\n jsonSchema2.description = def.description;\n }\n return jsonSchema2;\n};\n\n// src/to-json-schema/zod3-to-json-schema/refs.ts\nvar getRefs = (options) => {\n const _options = getDefaultOptions(options);\n const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath;\n return {\n ..._options,\n currentPath,\n propertyPath: void 0,\n seen: new Map(\n Object.entries(_options.definitions).map(([name2, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name2],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: void 0\n }\n ])\n )\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/zod3-to-json-schema.ts\nvar zod3ToJsonSchema = (schema, options) => {\n var _a2;\n const refs = getRefs(options);\n let definitions = typeof options === \"object\" && options.definitions ? Object.entries(options.definitions).reduce(\n (acc, [name3, schema2]) => {\n var _a3;\n return {\n ...acc,\n [name3]: (_a3 = parseDef(\n schema2._def,\n {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name3]\n },\n true\n )) != null ? _a3 : parseAnyDef()\n };\n },\n {}\n ) : void 0;\n const name2 = typeof options === \"string\" ? options : (options == null ? void 0 : options.nameStrategy) === \"title\" ? void 0 : options == null ? void 0 : options.name;\n const main = (_a2 = parseDef(\n schema._def,\n name2 === void 0 ? refs : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name2]\n },\n false\n )) != null ? _a2 : parseAnyDef();\n const title = typeof options === \"object\" && options.name !== void 0 && options.nameStrategy === \"title\" ? options.name : void 0;\n if (title !== void 0) {\n main.title = title;\n }\n const combined = name2 === void 0 ? definitions ? {\n ...main,\n [refs.definitionPath]: definitions\n } : main : {\n $ref: [\n ...refs.$refStrategy === \"relative\" ? [] : refs.basePath,\n refs.definitionPath,\n name2\n ].join(\"/\"),\n [refs.definitionPath]: {\n ...definitions,\n [name2]: main\n }\n };\n combined.$schema = \"http://json-schema.org/draft-07/schema#\";\n return combined;\n};\n\n// src/schema.ts\nvar schemaSymbol = /* @__PURE__ */ Symbol.for(\"vercel.ai.schema\");\nfunction lazySchema(createSchema) {\n let schema;\n return () => {\n if (schema == null) {\n schema = createSchema();\n }\n return schema;\n };\n}\nfunction jsonSchema(jsonSchema2, {\n validate\n} = {}) {\n return {\n [schemaSymbol]: true,\n _type: void 0,\n // should never be used directly\n get jsonSchema() {\n if (typeof jsonSchema2 === \"function\") {\n jsonSchema2 = jsonSchema2();\n }\n return jsonSchema2;\n },\n validate\n };\n}\nfunction isSchema(value) {\n return typeof value === \"object\" && value !== null && schemaSymbol in value && value[schemaSymbol] === true && \"jsonSchema\" in value && \"validate\" in value;\n}\nfunction asSchema(schema) {\n return schema == null ? jsonSchema({ properties: {}, additionalProperties: false }) : isSchema(schema) ? schema : \"~standard\" in schema ? schema[\"~standard\"].vendor === \"zod\" ? zodSchema(schema) : standardSchema(schema) : schema();\n}\nfunction standardSchema(standardSchema2) {\n return jsonSchema(\n () => addAdditionalPropertiesToJsonSchema(\n standardSchema2[\"~standard\"].jsonSchema.input({\n target: \"draft-07\"\n })\n ),\n {\n validate: async (value) => {\n const result = await standardSchema2[\"~standard\"].validate(value);\n return \"value\" in result ? { success: true, value: result.value } : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: result.issues\n })\n };\n }\n }\n );\n}\nfunction zod3Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => zod3ToJsonSchema(zodSchema2, {\n $refStrategy: useReferences ? \"root\" : \"none\"\n }),\n {\n validate: async (value) => {\n const result = await zodSchema2.safeParseAsync(value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction zod4Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => addAdditionalPropertiesToJsonSchema(\n z4.toJSONSchema(zodSchema2, {\n target: \"draft-7\",\n io: \"input\",\n reused: useReferences ? \"ref\" : \"inline\"\n })\n ),\n {\n validate: async (value) => {\n const result = await z4.safeParseAsync(zodSchema2, value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction isZod4Schema(zodSchema2) {\n return \"_zod\" in zodSchema2;\n}\nfunction zodSchema(zodSchema2, options) {\n if (isZod4Schema(zodSchema2)) {\n return zod4Schema(zodSchema2, options);\n } else {\n return zod3Schema(zodSchema2, options);\n }\n}\n\n// src/validate-types.ts\nasync function validateTypes({\n value,\n schema,\n context\n}) {\n const result = await safeValidateTypes({ value, schema, context });\n if (!result.success) {\n throw TypeValidationError2.wrap({ value, cause: result.error, context });\n }\n return result.value;\n}\nasync function safeValidateTypes({\n value,\n schema,\n context\n}) {\n const actualSchema = asSchema(schema);\n try {\n if (actualSchema.validate == null) {\n return { success: true, value, rawValue: value };\n }\n const result = await actualSchema.validate(value);\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: result.error, context }),\n rawValue: value\n };\n } catch (error) {\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: error, context }),\n rawValue: value\n };\n }\n}\n\n// src/parse-json.ts\nasync function parseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return value;\n }\n return validateTypes({ value, schema });\n } catch (error) {\n if (JSONParseError.isInstance(error) || TypeValidationError3.isInstance(error)) {\n throw error;\n }\n throw new JSONParseError({ text, cause: error });\n }\n}\nasync function safeParseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return { success: true, value, rawValue: value };\n }\n return await safeValidateTypes({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: JSONParseError.isInstance(error) ? error : new JSONParseError({ text, cause: error }),\n rawValue: void 0\n };\n }\n}\nfunction isParsableJson(input) {\n try {\n secureJsonParse(input);\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// src/parse-json-event-stream.ts\nimport {\n EventSourceParserStream\n} from \"eventsource-parser/stream\";\nfunction parseJsonEventStream({\n stream,\n schema\n}) {\n return stream.pipeThrough(new TextDecoderStream()).pipeThrough(new EventSourceParserStream()).pipeThrough(\n new TransformStream({\n async transform({ data }, controller) {\n if (data === \"[DONE]\") {\n return;\n }\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n }\n })\n );\n}\n\n// src/parse-provider-options.ts\nimport { InvalidArgumentError as InvalidArgumentError2 } from \"@ai-sdk/provider\";\nasync function parseProviderOptions({\n provider,\n providerOptions,\n schema\n}) {\n if ((providerOptions == null ? void 0 : providerOptions[provider]) == null) {\n return void 0;\n }\n const parsedProviderOptions = await safeValidateTypes({\n value: providerOptions[provider],\n schema\n });\n if (!parsedProviderOptions.success) {\n throw new InvalidArgumentError2({\n argument: \"providerOptions\",\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error\n });\n }\n return parsedProviderOptions.value;\n}\n\n// src/post-to-api.ts\nimport { APICallError as APICallError3 } from \"@ai-sdk/provider\";\nvar getOriginalFetch2 = () => globalThis.fetch;\nvar postJsonToApi = async ({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: {\n content: JSON.stringify(body),\n values: body\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postFormDataToApi = async ({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n}) => postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries(formData.entries())\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch: fetch2\n});\nvar postToApi = async ({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch: fetch2 = getOriginalFetch2()\n}) => {\n try {\n const response = await fetch2(url, {\n method: \"POST\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n body: body.content,\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n throw new APICallError3({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError3({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n\n// src/types/tool.ts\nfunction tool(tool2) {\n return tool2;\n}\nfunction dynamicTool(tool2) {\n return { ...tool2, type: \"dynamic\" };\n}\n\n// src/provider-tool-factory.ts\nfunction createProviderToolFactory({\n id,\n inputSchema\n}) {\n return ({\n execute,\n outputSchema,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable\n });\n}\nfunction createProviderToolFactoryWithOutputSchema({\n id,\n inputSchema,\n outputSchema,\n supportsDeferredResults\n}) {\n return ({\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n supportsDeferredResults\n });\n}\n\n// src/remove-undefined-entries.ts\nfunction removeUndefinedEntries(record) {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null)\n );\n}\n\n// src/resolve.ts\nasync function resolve(value) {\n if (typeof value === \"function\") {\n value = value();\n }\n return Promise.resolve(value);\n}\n\n// src/response-handler.ts\nimport { APICallError as APICallError4, EmptyResponseBodyError } from \"@ai-sdk/provider\";\nvar createJsonErrorResponseHandler = ({\n errorSchema,\n errorToMessage,\n isRetryable\n}) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n if (responseBody.trim() === \"\") {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema\n });\n return {\n responseHeaders,\n value: new APICallError4({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response, parsedError)\n })\n };\n } catch (parseError) {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n};\nvar createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema\n })\n };\n};\nvar createJsonResponseHandler = (responseSchema) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!parsedResult.success) {\n throw new APICallError4({\n message: \"Invalid JSON response\",\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues\n });\n }\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue\n };\n};\nvar createBinaryResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (!response.body) {\n throw new APICallError4({\n message: \"Response body is empty\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0\n });\n }\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer)\n };\n } catch (error) {\n throw new APICallError4({\n message: \"Failed to read response as array buffer\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0,\n cause: error\n });\n }\n};\nvar createStatusCodeErrorResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody\n })\n };\n};\n\n// src/strip-file-extension.ts\nfunction stripFileExtension(filename) {\n const firstDotIndex = filename.indexOf(\".\");\n return firstDotIndex === -1 ? filename : filename.slice(0, firstDotIndex);\n}\n\n// src/without-trailing-slash.ts\nfunction withoutTrailingSlash(url) {\n return url == null ? void 0 : url.replace(/\\/$/, \"\");\n}\n\n// src/is-async-iterable.ts\nfunction isAsyncIterable(obj) {\n return obj != null && typeof obj[Symbol.asyncIterator] === \"function\";\n}\n\n// src/types/execute-tool.ts\nasync function* executeTool({\n execute,\n input,\n options\n}) {\n const result = execute(input, options);\n if (isAsyncIterable(result)) {\n let lastOutput;\n for await (const output of result) {\n lastOutput = output;\n yield { type: \"preliminary\", output };\n }\n yield { type: \"final\", output: lastOutput };\n } else {\n yield { type: \"final\", output: await result };\n }\n}\n\n// src/index.ts\nimport {\n EventSourceParserStream as EventSourceParserStream2\n} from \"eventsource-parser/stream\";\nexport {\n DEFAULT_MAX_DOWNLOAD_SIZE,\n DelayedPromise,\n DownloadError,\n EventSourceParserStream2 as EventSourceParserStream,\n VERSION,\n asSchema,\n combineHeaders,\n convertAsyncIteratorToReadableStream,\n convertBase64ToUint8Array,\n convertImageModelFileToDataUri,\n convertToBase64,\n convertToFormData,\n convertUint8ArrayToBase64,\n createBinaryResponseHandler,\n createEventSourceResponseHandler,\n createIdGenerator,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createProviderToolFactory,\n createProviderToolFactoryWithOutputSchema,\n createStatusCodeErrorResponseHandler,\n createToolNameMapping,\n delay,\n downloadBlob,\n dynamicTool,\n executeTool,\n extractResponseHeaders,\n generateId,\n getErrorMessage,\n getFromApi,\n getRuntimeEnvironmentUserAgent,\n injectJsonInstructionIntoMessages,\n isAbortError,\n isNonNullable,\n isParsableJson,\n isUrlSupported,\n jsonSchema,\n lazySchema,\n loadApiKey,\n loadOptionalSetting,\n loadSetting,\n mediaTypeToExtension,\n normalizeHeaders,\n parseJSON,\n parseJsonEventStream,\n parseProviderOptions,\n postFormDataToApi,\n postJsonToApi,\n postToApi,\n readResponseWithSizeLimit,\n removeUndefinedEntries,\n resolve,\n safeParseJSON,\n safeValidateTypes,\n stripFileExtension,\n tool,\n validateDownloadUrl,\n validateTypes,\n withUserAgentSuffix,\n withoutTrailingSlash,\n zodSchema\n};\n//# sourceMappingURL=index.mjs.map","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name21 in all)\n __defProp(target, name21, { get: all[name21], enumerable: true });\n};\n\n// src/index.ts\nimport { createGateway, gateway as gateway2 } from \"@ai-sdk/gateway\";\nimport {\n asSchema as asSchema5,\n createIdGenerator as createIdGenerator5,\n dynamicTool,\n generateId,\n jsonSchema,\n parseJsonEventStream as parseJsonEventStream3,\n tool,\n zodSchema as zodSchema3\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-text/generate-text.ts\nimport {\n createIdGenerator,\n getErrorMessage as getErrorMessage5,\n withUserAgentSuffix as withUserAgentSuffix2\n} from \"@ai-sdk/provider-utils\";\n\n// src/error/index.ts\nimport {\n AISDKError as AISDKError21,\n APICallError,\n EmptyResponseBodyError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError\n} from \"@ai-sdk/provider\";\n\n// src/error/invalid-argument-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_InvalidArgumentError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a;\nvar InvalidArgumentError = class extends AISDKError {\n constructor({\n parameter,\n value,\n message\n }) {\n super({\n name,\n message: `Invalid argument for parameter ${parameter}: ${message}`\n });\n this[_a] = true;\n this.parameter = parameter;\n this.value = value;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n_a = symbol;\n\n// src/error/invalid-stream-part-error.ts\nimport { AISDKError as AISDKError2 } from \"@ai-sdk/provider\";\nvar name2 = \"AI_InvalidStreamPartError\";\nvar marker2 = `vercel.ai.error.${name2}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2;\nvar InvalidStreamPartError = class extends AISDKError2 {\n constructor({\n chunk,\n message\n }) {\n super({ name: name2, message });\n this[_a2] = true;\n this.chunk = chunk;\n }\n static isInstance(error) {\n return AISDKError2.hasMarker(error, marker2);\n }\n};\n_a2 = symbol2;\n\n// src/error/invalid-tool-approval-error.ts\nimport { AISDKError as AISDKError3 } from \"@ai-sdk/provider\";\nvar name3 = \"AI_InvalidToolApprovalError\";\nvar marker3 = `vercel.ai.error.${name3}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3;\nvar InvalidToolApprovalError = class extends AISDKError3 {\n constructor({ approvalId }) {\n super({\n name: name3,\n message: `Tool approval response references unknown approvalId: \"${approvalId}\". No matching tool-approval-request found in message history.`\n });\n this[_a3] = true;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError3.hasMarker(error, marker3);\n }\n};\n_a3 = symbol3;\n\n// src/error/invalid-tool-input-error.ts\nimport { AISDKError as AISDKError4, getErrorMessage } from \"@ai-sdk/provider\";\nvar name4 = \"AI_InvalidToolInputError\";\nvar marker4 = `vercel.ai.error.${name4}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4;\nvar InvalidToolInputError = class extends AISDKError4 {\n constructor({\n toolInput,\n toolName,\n cause,\n message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`\n }) {\n super({ name: name4, message, cause });\n this[_a4] = true;\n this.toolInput = toolInput;\n this.toolName = toolName;\n }\n static isInstance(error) {\n return AISDKError4.hasMarker(error, marker4);\n }\n};\n_a4 = symbol4;\n\n// src/error/tool-call-not-found-for-approval-error.ts\nimport { AISDKError as AISDKError5 } from \"@ai-sdk/provider\";\nvar name5 = \"AI_ToolCallNotFoundForApprovalError\";\nvar marker5 = `vercel.ai.error.${name5}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5;\nvar ToolCallNotFoundForApprovalError = class extends AISDKError5 {\n constructor({\n toolCallId,\n approvalId\n }) {\n super({\n name: name5,\n message: `Tool call \"${toolCallId}\" not found for approval request \"${approvalId}\".`\n });\n this[_a5] = true;\n this.toolCallId = toolCallId;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError5.hasMarker(error, marker5);\n }\n};\n_a5 = symbol5;\n\n// src/error/missing-tool-result-error.ts\nimport { AISDKError as AISDKError6 } from \"@ai-sdk/provider\";\nvar name6 = \"AI_MissingToolResultsError\";\nvar marker6 = `vercel.ai.error.${name6}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6;\nvar MissingToolResultsError = class extends AISDKError6 {\n constructor({ toolCallIds }) {\n super({\n name: name6,\n message: `Tool result${toolCallIds.length > 1 ? \"s are\" : \" is\"} missing for tool call${toolCallIds.length > 1 ? \"s\" : \"\"} ${toolCallIds.join(\n \", \"\n )}.`\n });\n this[_a6] = true;\n this.toolCallIds = toolCallIds;\n }\n static isInstance(error) {\n return AISDKError6.hasMarker(error, marker6);\n }\n};\n_a6 = symbol6;\n\n// src/error/no-image-generated-error.ts\nimport { AISDKError as AISDKError7 } from \"@ai-sdk/provider\";\nvar name7 = \"AI_NoImageGeneratedError\";\nvar marker7 = `vercel.ai.error.${name7}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7;\nvar NoImageGeneratedError = class extends AISDKError7 {\n constructor({\n message = \"No image generated.\",\n cause,\n responses\n }) {\n super({ name: name7, message, cause });\n this[_a7] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError7.hasMarker(error, marker7);\n }\n};\n_a7 = symbol7;\n\n// src/error/no-object-generated-error.ts\nimport { AISDKError as AISDKError8 } from \"@ai-sdk/provider\";\nvar name8 = \"AI_NoObjectGeneratedError\";\nvar marker8 = `vercel.ai.error.${name8}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8;\nvar NoObjectGeneratedError = class extends AISDKError8 {\n constructor({\n message = \"No object generated.\",\n cause,\n text: text2,\n response,\n usage,\n finishReason\n }) {\n super({ name: name8, message, cause });\n this[_a8] = true;\n this.text = text2;\n this.response = response;\n this.usage = usage;\n this.finishReason = finishReason;\n }\n static isInstance(error) {\n return AISDKError8.hasMarker(error, marker8);\n }\n};\n_a8 = symbol8;\n\n// src/error/no-output-generated-error.ts\nimport { AISDKError as AISDKError9 } from \"@ai-sdk/provider\";\nvar name9 = \"AI_NoOutputGeneratedError\";\nvar marker9 = `vercel.ai.error.${name9}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9;\nvar NoOutputGeneratedError = class extends AISDKError9 {\n // used in isInstance\n constructor({\n message = \"No output generated.\",\n cause\n } = {}) {\n super({ name: name9, message, cause });\n this[_a9] = true;\n }\n static isInstance(error) {\n return AISDKError9.hasMarker(error, marker9);\n }\n};\n_a9 = symbol9;\n\n// src/error/no-speech-generated-error.ts\nimport { AISDKError as AISDKError10 } from \"@ai-sdk/provider\";\nvar name10 = \"AI_NoSpeechGeneratedError\";\nvar marker10 = `vercel.ai.error.${name10}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10;\nvar NoSpeechGeneratedError = class extends AISDKError10 {\n constructor(options) {\n super({\n name: name10,\n message: \"No speech audio generated.\"\n });\n this[_a10] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError10.hasMarker(error, marker10);\n }\n};\n_a10 = symbol10;\n\n// src/error/no-transcript-generated-error.ts\nimport { AISDKError as AISDKError11 } from \"@ai-sdk/provider\";\nvar name11 = \"AI_NoTranscriptGeneratedError\";\nvar marker11 = `vercel.ai.error.${name11}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11;\nvar NoTranscriptGeneratedError = class extends AISDKError11 {\n constructor(options) {\n super({\n name: name11,\n message: \"No transcript generated.\"\n });\n this[_a11] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError11.hasMarker(error, marker11);\n }\n};\n_a11 = symbol11;\n\n// src/error/no-video-generated-error.ts\nimport { AISDKError as AISDKError12 } from \"@ai-sdk/provider\";\nvar name12 = \"AI_NoVideoGeneratedError\";\nvar marker12 = `vercel.ai.error.${name12}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12;\nvar NoVideoGeneratedError = class extends AISDKError12 {\n constructor({\n message = \"No video generated.\",\n cause,\n responses\n }) {\n super({ name: name12, message, cause });\n this[_a12] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError12.hasMarker(error, marker12);\n }\n /**\n * @deprecated use `isInstance` instead\n */\n static isNoVideoGeneratedError(error) {\n return error instanceof Error && error.name === name12 && typeof error.responses !== \"undefined\" ? true : false;\n }\n /**\n * @deprecated Do not use this method. It will be removed in the next major version.\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause,\n responses: this.responses\n };\n }\n};\n_a12 = symbol12;\n\n// src/error/no-such-tool-error.ts\nimport { AISDKError as AISDKError13 } from \"@ai-sdk/provider\";\nvar name13 = \"AI_NoSuchToolError\";\nvar marker13 = `vercel.ai.error.${name13}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13;\nvar NoSuchToolError = class extends AISDKError13 {\n constructor({\n toolName,\n availableTools = void 0,\n message = `Model tried to call unavailable tool '${toolName}'. ${availableTools === void 0 ? \"No tools are available.\" : `Available tools: ${availableTools.join(\", \")}.`}`\n }) {\n super({ name: name13, message });\n this[_a13] = true;\n this.toolName = toolName;\n this.availableTools = availableTools;\n }\n static isInstance(error) {\n return AISDKError13.hasMarker(error, marker13);\n }\n};\n_a13 = symbol13;\n\n// src/error/tool-call-repair-error.ts\nimport { AISDKError as AISDKError14, getErrorMessage as getErrorMessage2 } from \"@ai-sdk/provider\";\nvar name14 = \"AI_ToolCallRepairError\";\nvar marker14 = `vercel.ai.error.${name14}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14;\nvar ToolCallRepairError = class extends AISDKError14 {\n constructor({\n cause,\n originalError,\n message = `Error repairing tool call: ${getErrorMessage2(cause)}`\n }) {\n super({ name: name14, message, cause });\n this[_a14] = true;\n this.originalError = originalError;\n }\n static isInstance(error) {\n return AISDKError14.hasMarker(error, marker14);\n }\n};\n_a14 = symbol14;\n\n// src/error/unsupported-model-version-error.ts\nimport { AISDKError as AISDKError15 } from \"@ai-sdk/provider\";\nvar UnsupportedModelVersionError = class extends AISDKError15 {\n constructor(options) {\n super({\n name: \"AI_UnsupportedModelVersionError\",\n message: `Unsupported model version ${options.version} for provider \"${options.provider}\" and model \"${options.modelId}\". AI SDK 5 only supports models that implement specification version \"v2\".`\n });\n this.version = options.version;\n this.provider = options.provider;\n this.modelId = options.modelId;\n }\n};\n\n// src/error/ui-message-stream-error.ts\nimport { AISDKError as AISDKError16 } from \"@ai-sdk/provider\";\nvar name15 = \"AI_UIMessageStreamError\";\nvar marker15 = `vercel.ai.error.${name15}`;\nvar symbol15 = Symbol.for(marker15);\nvar _a15;\nvar UIMessageStreamError = class extends AISDKError16 {\n constructor({\n chunkType,\n chunkId,\n message\n }) {\n super({ name: name15, message });\n this[_a15] = true;\n this.chunkType = chunkType;\n this.chunkId = chunkId;\n }\n static isInstance(error) {\n return AISDKError16.hasMarker(error, marker15);\n }\n};\n_a15 = symbol15;\n\n// src/prompt/invalid-data-content-error.ts\nimport { AISDKError as AISDKError17 } from \"@ai-sdk/provider\";\nvar name16 = \"AI_InvalidDataContentError\";\nvar marker16 = `vercel.ai.error.${name16}`;\nvar symbol16 = Symbol.for(marker16);\nvar _a16;\nvar InvalidDataContentError = class extends AISDKError17 {\n constructor({\n content,\n cause,\n message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`\n }) {\n super({ name: name16, message, cause });\n this[_a16] = true;\n this.content = content;\n }\n static isInstance(error) {\n return AISDKError17.hasMarker(error, marker16);\n }\n};\n_a16 = symbol16;\n\n// src/prompt/invalid-message-role-error.ts\nimport { AISDKError as AISDKError18 } from \"@ai-sdk/provider\";\nvar name17 = \"AI_InvalidMessageRoleError\";\nvar marker17 = `vercel.ai.error.${name17}`;\nvar symbol17 = Symbol.for(marker17);\nvar _a17;\nvar InvalidMessageRoleError = class extends AISDKError18 {\n constructor({\n role,\n message = `Invalid message role: '${role}'. Must be one of: \"system\", \"user\", \"assistant\", \"tool\".`\n }) {\n super({ name: name17, message });\n this[_a17] = true;\n this.role = role;\n }\n static isInstance(error) {\n return AISDKError18.hasMarker(error, marker17);\n }\n};\n_a17 = symbol17;\n\n// src/prompt/message-conversion-error.ts\nimport { AISDKError as AISDKError19 } from \"@ai-sdk/provider\";\nvar name18 = \"AI_MessageConversionError\";\nvar marker18 = `vercel.ai.error.${name18}`;\nvar symbol18 = Symbol.for(marker18);\nvar _a18;\nvar MessageConversionError = class extends AISDKError19 {\n constructor({\n originalMessage,\n message\n }) {\n super({ name: name18, message });\n this[_a18] = true;\n this.originalMessage = originalMessage;\n }\n static isInstance(error) {\n return AISDKError19.hasMarker(error, marker18);\n }\n};\n_a18 = symbol18;\n\n// src/error/index.ts\nimport { DownloadError } from \"@ai-sdk/provider-utils\";\n\n// src/util/retry-error.ts\nimport { AISDKError as AISDKError20 } from \"@ai-sdk/provider\";\nvar name19 = \"AI_RetryError\";\nvar marker19 = `vercel.ai.error.${name19}`;\nvar symbol19 = Symbol.for(marker19);\nvar _a19;\nvar RetryError = class extends AISDKError20 {\n constructor({\n message,\n reason,\n errors\n }) {\n super({ name: name19, message });\n this[_a19] = true;\n this.reason = reason;\n this.errors = errors;\n this.lastError = errors[errors.length - 1];\n }\n static isInstance(error) {\n return AISDKError20.hasMarker(error, marker19);\n }\n};\n_a19 = symbol19;\n\n// src/util/as-array.ts\nfunction asArray(value) {\n return value === void 0 ? [] : Array.isArray(value) ? value : [value];\n}\n\n// src/util/notify.ts\nasync function notify(options) {\n for (const callback of asArray(options.callbacks)) {\n if (callback == null)\n continue;\n try {\n await callback(options.event);\n } catch (_ignored) {\n }\n }\n}\n\n// src/logger/log-warnings.ts\nfunction formatWarning({\n warning,\n provider,\n model\n}) {\n const prefix = `AI SDK Warning (${provider} / ${model}):`;\n switch (warning.type) {\n case \"unsupported\": {\n let message = `${prefix} The feature \"${warning.feature}\" is not supported.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"compatibility\": {\n let message = `${prefix} The feature \"${warning.feature}\" is used in a compatibility mode.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"other\": {\n return `${prefix} ${warning.message}`;\n }\n default: {\n return `${prefix} ${JSON.stringify(warning, null, 2)}`;\n }\n }\n}\nvar FIRST_WARNING_INFO_MESSAGE = \"AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false.\";\nvar hasLoggedBefore = false;\nvar logWarnings = (options) => {\n if (options.warnings.length === 0) {\n return;\n }\n const logger = globalThis.AI_SDK_LOG_WARNINGS;\n if (logger === false) {\n return;\n }\n if (typeof logger === \"function\") {\n logger(options);\n return;\n }\n if (!hasLoggedBefore) {\n hasLoggedBefore = true;\n console.info(FIRST_WARNING_INFO_MESSAGE);\n }\n for (const warning of options.warnings) {\n console.warn(\n formatWarning({\n warning,\n provider: options.provider,\n model: options.model\n })\n );\n }\n};\n\n// src/model/resolve-model.ts\nimport { gateway } from \"@ai-sdk/gateway\";\n\n// src/util/log-v2-compatibility-warning.ts\nfunction logV2CompatibilityWarning({\n provider,\n modelId\n}) {\n logWarnings({\n warnings: [\n {\n type: \"compatibility\",\n feature: \"specificationVersion\",\n details: `Using v2 specification compatibility mode. Some features may not be available.`\n }\n ],\n provider,\n model: modelId\n });\n}\n\n// src/model/as-embedding-model-v3.ts\nfunction asEmbeddingModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-image-model-v3.ts\nfunction asImageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-language-model-v3.ts\nfunction asLanguageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n switch (prop) {\n case \"specificationVersion\":\n return \"v3\";\n case \"doGenerate\":\n return async (...args) => {\n const result = await target.doGenerate(...args);\n return {\n ...result,\n finishReason: convertV2FinishReasonToV3(result.finishReason),\n usage: convertV2UsageToV3(result.usage)\n };\n };\n case \"doStream\":\n return async (...args) => {\n const result = await target.doStream(...args);\n return {\n ...result,\n stream: convertV2StreamToV3(result.stream)\n };\n };\n default:\n return target[prop];\n }\n }\n });\n}\nfunction convertV2StreamToV3(stream) {\n return stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"finish\":\n controller.enqueue({\n ...chunk,\n finishReason: convertV2FinishReasonToV3(chunk.finishReason),\n usage: convertV2UsageToV3(chunk.usage)\n });\n break;\n default:\n controller.enqueue(chunk);\n break;\n }\n }\n })\n );\n}\nfunction convertV2FinishReasonToV3(finishReason) {\n return {\n unified: finishReason === \"unknown\" ? \"other\" : finishReason,\n raw: void 0\n };\n}\nfunction convertV2UsageToV3(usage) {\n return {\n inputTokens: {\n total: usage.inputTokens,\n noCache: void 0,\n cacheRead: usage.cachedInputTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: usage.outputTokens,\n text: void 0,\n reasoning: usage.reasoningTokens\n }\n };\n}\n\n// src/model/as-speech-model-v3.ts\nfunction asSpeechModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-transcription-model-v3.ts\nfunction asTranscriptionModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/resolve-model.ts\nfunction resolveLanguageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asLanguageModelV3(model);\n }\n return getGlobalProvider().languageModel(model);\n}\nfunction resolveEmbeddingModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asEmbeddingModelV3(model);\n }\n return getGlobalProvider().embeddingModel(model);\n}\nfunction resolveTranscriptionModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asTranscriptionModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).transcriptionModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveSpeechModel(model) {\n var _a21, _b;\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asSpeechModelV3(model);\n }\n return (_b = (_a21 = getGlobalProvider()).speechModel) == null ? void 0 : _b.call(_a21, model);\n}\nfunction resolveImageModel(model) {\n if (typeof model !== \"string\") {\n if (model.specificationVersion !== \"v3\" && model.specificationVersion !== \"v2\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asImageModelV3(model);\n }\n return getGlobalProvider().imageModel(model);\n}\nfunction resolveVideoModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const videoModel = provider.videoModel;\n if (!videoModel) {\n throw new Error(\n 'The default provider does not support video models. Please use a Experimental_VideoModelV3 object from a provider (e.g., vertex.video(\"model-id\")).'\n );\n }\n return videoModel(model);\n }\n if (model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return model;\n}\nfunction resolveRerankingModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const rerankingModel = provider.rerankingModel;\n if (!rerankingModel) {\n throw new Error(\n 'The default provider does not support reranking models. Please use a RerankingModel object from a provider (e.g., gateway.rerankingModel(\"model-id\")).'\n );\n }\n return rerankingModel(model);\n }\n if (model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return model;\n}\nfunction getGlobalProvider() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a21 : gateway;\n}\n\n// src/prompt/call-settings.ts\nfunction getTotalTimeoutMs(timeout) {\n if (timeout == null) {\n return void 0;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n return timeout.totalMs;\n}\nfunction getStepTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.stepMs;\n}\nfunction getChunkTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.chunkMs;\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nimport {\n isUrlSupported\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/detect-media-type.ts\nimport { convertBase64ToUint8Array } from \"@ai-sdk/provider-utils\";\nvar imageMediaTypeSignatures = [\n {\n mediaType: \"image/gif\",\n bytesPrefix: [71, 73, 70]\n // GIF\n },\n {\n mediaType: \"image/png\",\n bytesPrefix: [137, 80, 78, 71]\n // PNG\n },\n {\n mediaType: \"image/jpeg\",\n bytesPrefix: [255, 216]\n // JPEG\n },\n {\n mediaType: \"image/webp\",\n bytesPrefix: [\n 82,\n 73,\n 70,\n 70,\n // \"RIFF\"\n null,\n null,\n null,\n null,\n // file size (variable)\n 87,\n 69,\n 66,\n 80\n // \"WEBP\"\n ]\n },\n {\n mediaType: \"image/bmp\",\n bytesPrefix: [66, 77]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [73, 73, 42, 0]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [77, 77, 0, 42]\n },\n {\n mediaType: \"image/avif\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 97,\n 118,\n 105,\n 102\n ]\n },\n {\n mediaType: \"image/heic\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 104,\n 101,\n 105,\n 99\n ]\n }\n];\nvar audioMediaTypeSignatures = [\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 251]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 250]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 243]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 242]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 227]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 226]\n },\n {\n mediaType: \"audio/wav\",\n bytesPrefix: [\n 82,\n // R\n 73,\n // I\n 70,\n // F\n 70,\n // F\n null,\n null,\n null,\n null,\n 87,\n // W\n 65,\n // A\n 86,\n // V\n 69\n // E\n ]\n },\n {\n mediaType: \"audio/ogg\",\n bytesPrefix: [79, 103, 103, 83]\n },\n {\n mediaType: \"audio/flac\",\n bytesPrefix: [102, 76, 97, 67]\n },\n {\n mediaType: \"audio/aac\",\n bytesPrefix: [64, 21, 0, 0]\n },\n {\n mediaType: \"audio/mp4\",\n bytesPrefix: [102, 116, 121, 112]\n },\n {\n mediaType: \"audio/webm\",\n bytesPrefix: [26, 69, 223, 163]\n }\n];\nvar videoMediaTypeSignatures = [\n {\n mediaType: \"video/mp4\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n null,\n 102,\n 116,\n 121,\n 112\n // ftyp\n ]\n },\n {\n mediaType: \"video/webm\",\n bytesPrefix: [26, 69, 223, 163]\n // EBML\n },\n {\n mediaType: \"video/quicktime\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 20,\n 102,\n 116,\n 121,\n 112,\n 113,\n 116\n // ftypqt\n ]\n },\n {\n mediaType: \"video/x-msvideo\",\n bytesPrefix: [82, 73, 70, 70]\n // RIFF (AVI)\n }\n];\nvar stripID3 = (data) => {\n const bytes = typeof data === \"string\" ? convertBase64ToUint8Array(data) : data;\n const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;\n return bytes.slice(id3Size + 10);\n};\nfunction stripID3TagsIfPresent(data) {\n const hasId3 = typeof data === \"string\" && data.startsWith(\"SUQz\") || typeof data !== \"string\" && data.length > 10 && data[0] === 73 && // 'I'\n data[1] === 68 && // 'D'\n data[2] === 51;\n return hasId3 ? stripID3(data) : data;\n}\nfunction detectMediaType({\n data,\n signatures\n}) {\n const processedData = stripID3TagsIfPresent(data);\n const bytes = typeof processedData === \"string\" ? convertBase64ToUint8Array(\n processedData.substring(0, Math.min(processedData.length, 24))\n ) : processedData;\n for (const signature of signatures) {\n if (bytes.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(\n (byte, index) => byte === null || bytes[index] === byte\n )) {\n return signature.mediaType;\n }\n }\n return void 0;\n}\n\n// src/util/download/download.ts\nimport {\n DownloadError as DownloadError2,\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n validateDownloadUrl\n} from \"@ai-sdk/provider-utils\";\nimport {\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent\n} from \"@ai-sdk/provider-utils\";\n\n// src/version.ts\nvar VERSION = true ? \"6.0.159\" : \"0.0.0-test\";\n\n// src/util/download/download.ts\nvar download = async ({\n url,\n maxBytes,\n abortSignal\n}) => {\n var _a21;\n const urlText = url.toString();\n validateDownloadUrl(urlText);\n try {\n const response = await fetch(urlText, {\n headers: withUserAgentSuffix(\n {},\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n signal: abortSignal\n });\n if (response.redirected) {\n validateDownloadUrl(response.url);\n }\n if (!response.ok) {\n throw new DownloadError2({\n url: urlText,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url: urlText,\n maxBytes: maxBytes != null ? maxBytes : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n return {\n data,\n mediaType: (_a21 = response.headers.get(\"content-type\")) != null ? _a21 : void 0\n };\n } catch (error) {\n if (DownloadError2.isInstance(error)) {\n throw error;\n }\n throw new DownloadError2({ url: urlText, cause: error });\n }\n};\n\n// src/util/download/download-function.ts\nvar createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(\n requestedDownloads.map(\n async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : download2(requestedDownload)\n )\n);\n\n// src/prompt/data-content.ts\nimport { AISDKError as AISDKError22 } from \"@ai-sdk/provider\";\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array2,\n convertUint8ArrayToBase64\n} from \"@ai-sdk/provider-utils\";\nimport { z } from \"zod/v4\";\n\n// src/prompt/split-data-url.ts\nfunction splitDataUrl(dataUrl) {\n try {\n const [header, base64Content] = dataUrl.split(\",\");\n return {\n mediaType: header.split(\";\")[0].split(\":\")[1],\n base64Content\n };\n } catch (error) {\n return {\n mediaType: void 0,\n base64Content: void 0\n };\n }\n}\n\n// src/prompt/data-content.ts\nvar dataContentSchema = z.union([\n z.string(),\n z.instanceof(Uint8Array),\n z.instanceof(ArrayBuffer),\n z.custom(\n // Buffer might not be available in some environments such as CloudFlare:\n (value) => {\n var _a21, _b;\n return (_b = (_a21 = globalThis.Buffer) == null ? void 0 : _a21.isBuffer(value)) != null ? _b : false;\n },\n { message: \"Must be a Buffer\" }\n )\n]);\nfunction convertToLanguageModelV3DataContent(content) {\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: void 0 };\n }\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: void 0 };\n }\n if (typeof content === \"string\") {\n try {\n content = new URL(content);\n } catch (error) {\n }\n }\n if (content instanceof URL && content.protocol === \"data:\") {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(\n content.toString()\n );\n if (dataUrlMediaType == null || base64Content == null) {\n throw new AISDKError22({\n name: \"InvalidDataContentError\",\n message: `Invalid data URL format in content ${content.toString()}`\n });\n }\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n return { data: content, mediaType: void 0 };\n}\nfunction convertDataContentToBase64String(content) {\n if (typeof content === \"string\") {\n return content;\n }\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n return convertUint8ArrayToBase64(content);\n}\nfunction convertDataContentToUint8Array(content) {\n if (content instanceof Uint8Array) {\n return content;\n }\n if (typeof content === \"string\") {\n try {\n return convertBase64ToUint8Array2(content);\n } catch (error) {\n throw new InvalidDataContentError({\n message: \"Invalid data content. Content string is not a base64-encoded media.\",\n content,\n cause: error\n });\n }\n }\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n throw new InvalidDataContentError({ content });\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nasync function convertToLanguageModelPrompt({\n prompt,\n supportedUrls,\n download: download2 = createDefaultDownloadFunction()\n}) {\n const downloadedAssets = await downloadAssets(\n prompt.messages,\n download2,\n supportedUrls\n );\n const approvalIdToToolCallId = /* @__PURE__ */ new Map();\n for (const message of prompt.messages) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === \"tool-approval-request\" && \"approvalId\" in part && \"toolCallId\" in part) {\n approvalIdToToolCallId.set(\n part.approvalId,\n part.toolCallId\n );\n }\n }\n }\n }\n const approvedToolCallIds = /* @__PURE__ */ new Set();\n for (const message of prompt.messages) {\n if (message.role === \"tool\") {\n for (const part of message.content) {\n if (part.type === \"tool-approval-response\") {\n const toolCallId = approvalIdToToolCallId.get(part.approvalId);\n if (toolCallId) {\n approvedToolCallIds.add(toolCallId);\n }\n }\n }\n }\n }\n const messages = [\n ...prompt.system != null ? typeof prompt.system === \"string\" ? [{ role: \"system\", content: prompt.system }] : asArray(prompt.system).map((message) => ({\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n })) : [],\n ...prompt.messages.map(\n (message) => convertToLanguageModelMessage({ message, downloadedAssets })\n )\n ];\n const combinedMessages = [];\n for (const message of messages) {\n if (message.role !== \"tool\") {\n combinedMessages.push(message);\n continue;\n }\n const lastCombinedMessage = combinedMessages.at(-1);\n if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === \"tool\") {\n lastCombinedMessage.content.push(...message.content);\n } else {\n combinedMessages.push(message);\n }\n }\n const toolCallIds = /* @__PURE__ */ new Set();\n for (const message of combinedMessages) {\n switch (message.role) {\n case \"assistant\": {\n for (const content of message.content) {\n if (content.type === \"tool-call\" && !content.providerExecuted) {\n toolCallIds.add(content.toolCallId);\n }\n }\n break;\n }\n case \"tool\": {\n for (const content of message.content) {\n if (content.type === \"tool-result\") {\n toolCallIds.delete(content.toolCallId);\n }\n }\n break;\n }\n case \"user\":\n case \"system\":\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({\n toolCallIds: Array.from(toolCallIds)\n });\n }\n break;\n }\n }\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) });\n }\n return combinedMessages.filter(\n // Filter out empty tool messages (e.g. if they only contained\n // tool-approval-response parts that were removed).\n // This prevents sending invalid empty messages to the provider.\n // Note: provider-executed tool-approval-response parts are preserved.\n (message) => message.role !== \"tool\" || message.content.length > 0\n );\n}\nfunction convertToLanguageModelMessage({\n message,\n downloadedAssets\n}) {\n const role = message.role;\n switch (role) {\n case \"system\": {\n return {\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n };\n }\n case \"user\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"user\",\n content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== \"text\" || part.text !== \"\"),\n providerOptions: message.providerOptions\n };\n }\n case \"assistant\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n return {\n role: \"assistant\",\n content: message.content.filter(\n // remove empty text parts (no text, and no provider options):\n (part) => part.type !== \"text\" || part.text !== \"\" || part.providerOptions != null\n ).filter(\n (part) => part.type !== \"tool-approval-request\"\n ).map((part) => {\n const providerOptions = part.providerOptions;\n switch (part.type) {\n case \"file\": {\n const { data, mediaType } = convertToLanguageModelV3DataContent(\n part.data\n );\n return {\n type: \"file\",\n data,\n filename: part.filename,\n mediaType: mediaType != null ? mediaType : part.mediaType,\n providerOptions\n };\n }\n case \"reasoning\": {\n return {\n type: \"reasoning\",\n text: part.text,\n providerOptions\n };\n }\n case \"text\": {\n return {\n type: \"text\",\n text: part.text,\n providerOptions\n };\n }\n case \"tool-call\": {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions\n };\n }\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput(part.output),\n providerOptions\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n case \"tool\": {\n return {\n role: \"tool\",\n content: message.content.filter(\n // Only include tool-approval-response for provider-executed tools\n (part) => part.type !== \"tool-approval-response\" || part.providerExecuted\n ).map((part) => {\n switch (part.type) {\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput(part.output),\n providerOptions: part.providerOptions\n };\n }\n case \"tool-approval-response\": {\n return {\n type: \"tool-approval-response\",\n approvalId: part.approvalId,\n approved: part.approved,\n reason: part.reason\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n }\n default: {\n const _exhaustiveCheck = role;\n throw new InvalidMessageRoleError({ role: _exhaustiveCheck });\n }\n }\n}\nasync function downloadAssets(messages, download2, supportedUrls) {\n const plannedDownloads = messages.filter((message) => message.role === \"user\").map((message) => message.content).filter(\n (content) => Array.isArray(content)\n ).flat().filter(\n (part) => part.type === \"image\" || part.type === \"file\"\n ).map((part) => {\n var _a21;\n const mediaType = (_a21 = part.mediaType) != null ? _a21 : part.type === \"image\" ? \"image/*\" : void 0;\n let data = part.type === \"image\" ? part.image : part.data;\n if (typeof data === \"string\") {\n try {\n data = new URL(data);\n } catch (ignored) {\n }\n }\n return { mediaType, data };\n }).filter(\n (part) => part.data instanceof URL\n ).map((part) => ({\n url: part.data,\n isUrlSupportedByModel: part.mediaType != null && isUrlSupported({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls\n })\n }));\n const downloadedFiles = await download2(plannedDownloads);\n return Object.fromEntries(\n downloadedFiles.map(\n (file, index) => file == null ? null : [\n plannedDownloads[index].url.toString(),\n { data: file.data, mediaType: file.mediaType }\n ]\n ).filter((file) => file != null)\n );\n}\nfunction convertPartToLanguageModelPart(part, downloadedAssets) {\n var _a21;\n if (part.type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n providerOptions: part.providerOptions\n };\n }\n let originalData;\n const type = part.type;\n switch (type) {\n case \"image\":\n originalData = part.image;\n break;\n case \"file\":\n originalData = part.data;\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n const { data: convertedData, mediaType: convertedMediaType } = convertToLanguageModelV3DataContent(originalData);\n let mediaType = convertedMediaType != null ? convertedMediaType : part.mediaType;\n let data = convertedData;\n if (data instanceof URL) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType != null ? mediaType : mediaType = downloadedFile.mediaType;\n }\n }\n switch (type) {\n case \"image\": {\n if (data instanceof Uint8Array || typeof data === \"string\") {\n mediaType = (_a21 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a21 : mediaType;\n }\n return {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/*\",\n // any image\n filename: void 0,\n data,\n providerOptions: part.providerOptions\n };\n }\n case \"file\": {\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n return {\n type: \"file\",\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions\n };\n }\n }\n}\nfunction mapToolResultOutput(output) {\n if (output.type !== \"content\") {\n return output;\n }\n return {\n type: \"content\",\n value: output.value.map((item) => {\n if (item.type !== \"media\") {\n return item;\n }\n if (item.mediaType.startsWith(\"image/\")) {\n return {\n type: \"image-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n }\n return {\n type: \"file-data\",\n data: item.data,\n mediaType: item.mediaType\n };\n })\n };\n}\n\n// src/prompt/create-tool-model-output.ts\nimport { getErrorMessage as getErrorMessage3 } from \"@ai-sdk/provider\";\nasync function createToolModelOutput({\n toolCallId,\n input,\n output,\n tool: tool2,\n errorMode\n}) {\n if (errorMode === \"text\") {\n return { type: \"error-text\", value: getErrorMessage3(output) };\n } else if (errorMode === \"json\") {\n return { type: \"error-json\", value: toJSONValue(output) };\n }\n if (tool2 == null ? void 0 : tool2.toModelOutput) {\n return await tool2.toModelOutput({ toolCallId, input, output });\n }\n return typeof output === \"string\" ? { type: \"text\", value: output } : { type: \"json\", value: toJSONValue(output) };\n}\nfunction toJSONValue(value) {\n return value === void 0 ? null : value;\n}\n\n// src/prompt/prepare-call-settings.ts\nfunction prepareCallSettings({\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n stopSequences\n}) {\n if (maxOutputTokens != null) {\n if (!Number.isInteger(maxOutputTokens)) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be an integer\"\n });\n }\n if (maxOutputTokens < 1) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be >= 1\"\n });\n }\n }\n if (temperature != null) {\n if (typeof temperature !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"temperature\",\n value: temperature,\n message: \"temperature must be a number\"\n });\n }\n }\n if (topP != null) {\n if (typeof topP !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topP\",\n value: topP,\n message: \"topP must be a number\"\n });\n }\n }\n if (topK != null) {\n if (typeof topK !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topK\",\n value: topK,\n message: \"topK must be a number\"\n });\n }\n }\n if (presencePenalty != null) {\n if (typeof presencePenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"presencePenalty\",\n value: presencePenalty,\n message: \"presencePenalty must be a number\"\n });\n }\n }\n if (frequencyPenalty != null) {\n if (typeof frequencyPenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"frequencyPenalty\",\n value: frequencyPenalty,\n message: \"frequencyPenalty must be a number\"\n });\n }\n }\n if (seed != null) {\n if (!Number.isInteger(seed)) {\n throw new InvalidArgumentError({\n parameter: \"seed\",\n value: seed,\n message: \"seed must be an integer\"\n });\n }\n }\n return {\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n stopSequences,\n seed\n };\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\nimport { asSchema } from \"@ai-sdk/provider-utils\";\n\n// src/util/is-non-empty-object.ts\nfunction isNonEmptyObject(object2) {\n return object2 != null && Object.keys(object2).length > 0;\n}\n\n// src/prompt/prepare-tools-and-tool-choice.ts\nasync function prepareToolsAndToolChoice({\n tools,\n toolChoice,\n activeTools\n}) {\n if (!isNonEmptyObject(tools)) {\n return {\n tools: void 0,\n toolChoice: void 0\n };\n }\n const filteredTools = activeTools != null ? Object.entries(tools).filter(\n ([name21]) => activeTools.includes(name21)\n ) : Object.entries(tools);\n const languageModelTools = [];\n for (const [name21, tool2] of filteredTools) {\n const toolType = tool2.type;\n switch (toolType) {\n case void 0:\n case \"dynamic\":\n case \"function\":\n languageModelTools.push({\n type: \"function\",\n name: name21,\n description: tool2.description,\n inputSchema: await asSchema(tool2.inputSchema).jsonSchema,\n ...tool2.inputExamples != null ? { inputExamples: tool2.inputExamples } : {},\n providerOptions: tool2.providerOptions,\n ...tool2.strict != null ? { strict: tool2.strict } : {}\n });\n break;\n case \"provider\":\n languageModelTools.push({\n type: \"provider\",\n name: name21,\n id: tool2.id,\n args: tool2.args\n });\n break;\n default: {\n const exhaustiveCheck = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }\n return {\n tools: languageModelTools,\n toolChoice: toolChoice == null ? { type: \"auto\" } : typeof toolChoice === \"string\" ? { type: toolChoice } : { type: \"tool\", toolName: toolChoice.toolName }\n };\n}\n\n// src/prompt/standardize-prompt.ts\nimport { InvalidPromptError as InvalidPromptError2 } from \"@ai-sdk/provider\";\nimport {\n safeValidateTypes\n} from \"@ai-sdk/provider-utils\";\nimport { z as z6 } from \"zod/v4\";\n\n// src/prompt/message.ts\nimport { z as z5 } from \"zod/v4\";\n\n// src/types/provider-metadata.ts\nimport { z as z3 } from \"zod/v4\";\n\n// src/types/json-value.ts\nimport { z as z2 } from \"zod/v4\";\nvar jsonValueSchema = z2.lazy(\n () => z2.union([\n z2.null(),\n z2.string(),\n z2.number(),\n z2.boolean(),\n z2.record(z2.string(), jsonValueSchema.optional()),\n z2.array(jsonValueSchema)\n ])\n);\n\n// src/types/provider-metadata.ts\nvar providerMetadataSchema = z3.record(\n z3.string(),\n z3.record(z3.string(), jsonValueSchema.optional())\n);\n\n// src/prompt/content-part.ts\nimport { z as z4 } from \"zod/v4\";\nvar textPartSchema = z4.object({\n type: z4.literal(\"text\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar imagePartSchema = z4.object({\n type: z4.literal(\"image\"),\n image: z4.union([dataContentSchema, z4.instanceof(URL)]),\n mediaType: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar filePartSchema = z4.object({\n type: z4.literal(\"file\"),\n data: z4.union([dataContentSchema, z4.instanceof(URL)]),\n filename: z4.string().optional(),\n mediaType: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar reasoningPartSchema = z4.object({\n type: z4.literal(\"reasoning\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolCallPartSchema = z4.object({\n type: z4.literal(\"tool-call\"),\n toolCallId: z4.string(),\n toolName: z4.string(),\n input: z4.unknown(),\n providerOptions: providerMetadataSchema.optional(),\n providerExecuted: z4.boolean().optional()\n});\nvar outputSchema = z4.discriminatedUnion(\n \"type\",\n [\n z4.object({\n type: z4.literal(\"text\"),\n value: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"execution-denied\"),\n reason: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"error-text\"),\n value: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"error-json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"content\"),\n value: z4.array(\n z4.union([\n z4.object({\n type: z4.literal(\"text\"),\n text: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"media\"),\n data: z4.string(),\n mediaType: z4.string()\n }),\n z4.object({\n type: z4.literal(\"file-data\"),\n data: z4.string(),\n mediaType: z4.string(),\n filename: z4.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"file-url\"),\n url: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"file-id\"),\n fileId: z4.union([z4.string(), z4.record(z4.string(), z4.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-data\"),\n data: z4.string(),\n mediaType: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-url\"),\n url: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"image-file-id\"),\n fileId: z4.union([z4.string(), z4.record(z4.string(), z4.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z4.object({\n type: z4.literal(\"custom\"),\n providerOptions: providerMetadataSchema.optional()\n })\n ])\n )\n })\n ]\n);\nvar toolResultPartSchema = z4.object({\n type: z4.literal(\"tool-result\"),\n toolCallId: z4.string(),\n toolName: z4.string(),\n output: outputSchema,\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolApprovalRequestSchema = z4.object({\n type: z4.literal(\"tool-approval-request\"),\n approvalId: z4.string(),\n toolCallId: z4.string()\n});\nvar toolApprovalResponseSchema = z4.object({\n type: z4.literal(\"tool-approval-response\"),\n approvalId: z4.string(),\n approved: z4.boolean(),\n reason: z4.string().optional()\n});\n\n// src/prompt/message.ts\nvar systemModelMessageSchema = z5.object(\n {\n role: z5.literal(\"system\"),\n content: z5.string(),\n providerOptions: providerMetadataSchema.optional()\n }\n);\nvar userModelMessageSchema = z5.object({\n role: z5.literal(\"user\"),\n content: z5.union([\n z5.string(),\n z5.array(z5.union([textPartSchema, imagePartSchema, filePartSchema]))\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar assistantModelMessageSchema = z5.object({\n role: z5.literal(\"assistant\"),\n content: z5.union([\n z5.string(),\n z5.array(\n z5.union([\n textPartSchema,\n filePartSchema,\n reasoningPartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n toolApprovalRequestSchema\n ])\n )\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolModelMessageSchema = z5.object({\n role: z5.literal(\"tool\"),\n content: z5.array(z5.union([toolResultPartSchema, toolApprovalResponseSchema])),\n providerOptions: providerMetadataSchema.optional()\n});\nvar modelMessageSchema = z5.union([\n systemModelMessageSchema,\n userModelMessageSchema,\n assistantModelMessageSchema,\n toolModelMessageSchema\n]);\n\n// src/prompt/standardize-prompt.ts\nasync function standardizePrompt(prompt) {\n if (prompt.prompt == null && prompt.messages == null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (prompt.prompt != null && prompt.messages != null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt and messages cannot be defined at the same time\"\n });\n }\n if (prompt.system != null && typeof prompt.system !== \"string\" && !asArray(prompt.system).every(\n (message) => typeof message === \"object\" && message !== null && \"role\" in message && message.role === \"system\"\n )) {\n throw new InvalidPromptError2({\n prompt,\n message: \"system must be a string, SystemModelMessage, or array of SystemModelMessage\"\n });\n }\n let messages;\n if (prompt.prompt != null && typeof prompt.prompt === \"string\") {\n messages = [{ role: \"user\", content: prompt.prompt }];\n } else if (prompt.prompt != null && Array.isArray(prompt.prompt)) {\n messages = prompt.prompt;\n } else if (prompt.messages != null) {\n messages = prompt.messages;\n } else {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (messages.length === 0) {\n throw new InvalidPromptError2({\n prompt,\n message: \"messages must not be empty\"\n });\n }\n const validationResult = await safeValidateTypes({\n value: messages,\n schema: z6.array(modelMessageSchema)\n });\n if (!validationResult.success) {\n throw new InvalidPromptError2({\n prompt,\n message: \"The messages do not match the ModelMessage[] schema.\",\n cause: validationResult.error\n });\n }\n return {\n messages,\n system: prompt.system\n };\n}\n\n// src/prompt/wrap-gateway-error.ts\nimport { GatewayAuthenticationError } from \"@ai-sdk/gateway\";\nimport { AISDKError as AISDKError23 } from \"@ai-sdk/provider\";\nfunction wrapGatewayError(error) {\n if (!GatewayAuthenticationError.isInstance(error))\n return error;\n const isProductionEnv = (process == null ? void 0 : process.env.NODE_ENV) === \"production\";\n const moreInfoURL = \"https://ai-sdk.dev/unauthenticated-ai-gateway\";\n if (isProductionEnv) {\n return new AISDKError23({\n name: \"GatewayError\",\n message: `Unauthenticated. Configure AI_GATEWAY_API_KEY or use a provider module. Learn more: ${moreInfoURL}`\n });\n }\n return Object.assign(\n new Error(`\\x1B[1m\\x1B[31mUnauthenticated request to AI Gateway.\\x1B[0m\n\nTo authenticate, set the \\x1B[33mAI_GATEWAY_API_KEY\\x1B[0m environment variable with your API key.\n\nAlternatively, you can use a provider module instead of the AI Gateway.\n\nLearn more: \\x1B[34m${moreInfoURL}\\x1B[0m\n\n`),\n { name: \"GatewayAuthenticationError\" }\n );\n}\n\n// src/telemetry/assemble-operation-name.ts\nfunction assembleOperationName({\n operationId,\n telemetry\n}) {\n return {\n // standardized operation and resource name:\n \"operation.name\": `${operationId}${(telemetry == null ? void 0 : telemetry.functionId) != null ? ` ${telemetry.functionId}` : \"\"}`,\n \"resource.name\": telemetry == null ? void 0 : telemetry.functionId,\n // detailed, AI SDK specific data:\n \"ai.operationId\": operationId,\n \"ai.telemetry.functionId\": telemetry == null ? void 0 : telemetry.functionId\n };\n}\n\n// src/telemetry/get-base-telemetry-attributes.ts\nfunction getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers\n}) {\n var _a21;\n return {\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n if (key === \"timeout\") {\n const totalTimeoutMs = getTotalTimeoutMs(\n value\n );\n if (totalTimeoutMs != null) {\n attributes[`ai.settings.${key}`] = totalTimeoutMs;\n }\n } else {\n attributes[`ai.settings.${key}`] = value;\n }\n return attributes;\n }, {}),\n // add metadata as attributes:\n ...Object.entries((_a21 = telemetry == null ? void 0 : telemetry.metadata) != null ? _a21 : {}).reduce(\n (attributes, [key, value]) => {\n attributes[`ai.telemetry.metadata.${key}`] = value;\n return attributes;\n },\n {}\n ),\n // request headers\n ...Object.entries(headers != null ? headers : {}).reduce((attributes, [key, value]) => {\n if (value !== void 0) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {})\n };\n}\n\n// src/telemetry/get-tracer.ts\nimport { trace } from \"@opentelemetry/api\";\n\n// src/telemetry/noop-tracer.ts\nvar noopTracer = {\n startSpan() {\n return noopSpan;\n },\n startActiveSpan(name21, arg1, arg2, arg3) {\n if (typeof arg1 === \"function\") {\n return arg1(noopSpan);\n }\n if (typeof arg2 === \"function\") {\n return arg2(noopSpan);\n }\n if (typeof arg3 === \"function\") {\n return arg3(noopSpan);\n }\n }\n};\nvar noopSpan = {\n spanContext() {\n return noopSpanContext;\n },\n setAttribute() {\n return this;\n },\n setAttributes() {\n return this;\n },\n addEvent() {\n return this;\n },\n addLink() {\n return this;\n },\n addLinks() {\n return this;\n },\n setStatus() {\n return this;\n },\n updateName() {\n return this;\n },\n end() {\n return this;\n },\n isRecording() {\n return false;\n },\n recordException() {\n return this;\n }\n};\nvar noopSpanContext = {\n traceId: \"\",\n spanId: \"\",\n traceFlags: 0\n};\n\n// src/telemetry/get-tracer.ts\nfunction getTracer({\n isEnabled = false,\n tracer\n} = {}) {\n if (!isEnabled) {\n return noopTracer;\n }\n if (tracer) {\n return tracer;\n }\n return trace.getTracer(\"ai\");\n}\n\n// src/telemetry/record-span.ts\nimport {\n SpanStatusCode,\n context\n} from \"@opentelemetry/api\";\nasync function recordSpan({\n name: name21,\n tracer,\n attributes,\n fn,\n endWhenDone = true\n}) {\n return tracer.startActiveSpan(\n name21,\n { attributes: await attributes },\n async (span) => {\n const ctx = context.active();\n try {\n const result = await context.with(ctx, () => fn(span));\n if (endWhenDone) {\n span.end();\n }\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n span.end();\n }\n throw error;\n }\n }\n );\n}\nfunction recordErrorOnSpan(span, error) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\n// src/telemetry/select-telemetry-attributes.ts\nasync function selectTelemetryAttributes({\n telemetry,\n attributes\n}) {\n if ((telemetry == null ? void 0 : telemetry.isEnabled) !== true) {\n return {};\n }\n const resultAttributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) {\n continue;\n }\n if (typeof value === \"object\" && \"input\" in value && typeof value.input === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordInputs) === false) {\n continue;\n }\n const result = await value.input();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n if (typeof value === \"object\" && \"output\" in value && typeof value.output === \"function\") {\n if ((telemetry == null ? void 0 : telemetry.recordOutputs) === false) {\n continue;\n }\n const result = await value.output();\n if (result != null) {\n resultAttributes[key] = result;\n }\n continue;\n }\n resultAttributes[key] = value;\n }\n return resultAttributes;\n}\n\n// src/telemetry/stringify-for-telemetry.ts\nfunction stringifyForTelemetry(prompt) {\n return JSON.stringify(\n prompt.map((message) => ({\n ...message,\n content: typeof message.content === \"string\" ? message.content : message.content.map(\n (part) => part.type === \"file\" ? {\n ...part,\n data: part.data instanceof Uint8Array ? convertDataContentToBase64String(part.data) : part.data\n } : part\n )\n }))\n );\n}\n\n// src/telemetry/telemetry-integration-registry.ts\nfunction registerTelemetryIntegration(integration) {\n if (!globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) {\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS = [];\n }\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS.push(integration);\n}\nfunction getGlobalTelemetryIntegrations() {\n var _a21;\n return (_a21 = globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) != null ? _a21 : [];\n}\n\n// src/telemetry/get-global-telemetry-integration.ts\nfunction bindTelemetryIntegration(integration) {\n var _a21, _b, _c, _d, _e, _f;\n return {\n onStart: (_a21 = integration.onStart) == null ? void 0 : _a21.bind(integration),\n onStepStart: (_b = integration.onStepStart) == null ? void 0 : _b.bind(integration),\n onToolCallStart: (_c = integration.onToolCallStart) == null ? void 0 : _c.bind(integration),\n onToolCallFinish: (_d = integration.onToolCallFinish) == null ? void 0 : _d.bind(integration),\n onStepFinish: (_e = integration.onStepFinish) == null ? void 0 : _e.bind(integration),\n onFinish: (_f = integration.onFinish) == null ? void 0 : _f.bind(integration)\n };\n}\nfunction getGlobalTelemetryIntegration() {\n const globalIntegrations = getGlobalTelemetryIntegrations();\n return (integrations) => {\n const localIntegrations = asArray(integrations);\n const allIntegrations = [...globalIntegrations, ...localIntegrations];\n function createTelemetryComposite(getListenerFromIntegration) {\n const listeners = allIntegrations.map(getListenerFromIntegration).filter(Boolean);\n return async (event) => {\n for (const listener of listeners) {\n try {\n await listener(event);\n } catch (_ignored) {\n }\n }\n };\n }\n return {\n onStart: createTelemetryComposite((integration) => integration.onStart),\n onStepStart: createTelemetryComposite(\n (integration) => integration.onStepStart\n ),\n onToolCallStart: createTelemetryComposite(\n (integration) => integration.onToolCallStart\n ),\n onToolCallFinish: createTelemetryComposite(\n (integration) => integration.onToolCallFinish\n ),\n onStepFinish: createTelemetryComposite(\n (integration) => integration.onStepFinish\n ),\n onFinish: createTelemetryComposite((integration) => integration.onFinish)\n };\n };\n}\n\n// src/types/usage.ts\nfunction asLanguageModelUsage(usage) {\n return {\n inputTokens: usage.inputTokens.total,\n inputTokenDetails: {\n noCacheTokens: usage.inputTokens.noCache,\n cacheReadTokens: usage.inputTokens.cacheRead,\n cacheWriteTokens: usage.inputTokens.cacheWrite\n },\n outputTokens: usage.outputTokens.total,\n outputTokenDetails: {\n textTokens: usage.outputTokens.text,\n reasoningTokens: usage.outputTokens.reasoning\n },\n totalTokens: addTokenCounts(\n usage.inputTokens.total,\n usage.outputTokens.total\n ),\n raw: usage.raw,\n reasoningTokens: usage.outputTokens.reasoning,\n cachedInputTokens: usage.inputTokens.cacheRead\n };\n}\nfunction createNullLanguageModelUsage() {\n return {\n inputTokens: void 0,\n inputTokenDetails: {\n noCacheTokens: void 0,\n cacheReadTokens: void 0,\n cacheWriteTokens: void 0\n },\n outputTokens: void 0,\n outputTokenDetails: {\n textTokens: void 0,\n reasoningTokens: void 0\n },\n totalTokens: void 0,\n raw: void 0\n };\n}\nfunction addLanguageModelUsage(usage1, usage2) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j;\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n (_a21 = usage1.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n (_b = usage2.inputTokenDetails) == null ? void 0 : _b.noCacheTokens\n ),\n cacheReadTokens: addTokenCounts(\n (_c = usage1.inputTokenDetails) == null ? void 0 : _c.cacheReadTokens,\n (_d = usage2.inputTokenDetails) == null ? void 0 : _d.cacheReadTokens\n ),\n cacheWriteTokens: addTokenCounts(\n (_e = usage1.inputTokenDetails) == null ? void 0 : _e.cacheWriteTokens,\n (_f = usage2.inputTokenDetails) == null ? void 0 : _f.cacheWriteTokens\n )\n },\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n (_g = usage1.outputTokenDetails) == null ? void 0 : _g.textTokens,\n (_h = usage2.outputTokenDetails) == null ? void 0 : _h.textTokens\n ),\n reasoningTokens: addTokenCounts(\n (_i = usage1.outputTokenDetails) == null ? void 0 : _i.reasoningTokens,\n (_j = usage2.outputTokenDetails) == null ? void 0 : _j.reasoningTokens\n )\n },\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens),\n reasoningTokens: addTokenCounts(\n usage1.reasoningTokens,\n usage2.reasoningTokens\n ),\n cachedInputTokens: addTokenCounts(\n usage1.cachedInputTokens,\n usage2.cachedInputTokens\n )\n };\n}\nfunction addTokenCounts(tokenCount1, tokenCount2) {\n return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0);\n}\nfunction addImageModelUsage(usage1, usage2) {\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens)\n };\n}\n\n// src/util/merge-objects.ts\nfunction mergeObjects(base, overrides) {\n if (base === void 0 && overrides === void 0) {\n return void 0;\n }\n if (base === void 0) {\n return overrides;\n }\n if (overrides === void 0) {\n return base;\n }\n const result = { ...base };\n for (const key in overrides) {\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overridesValue = overrides[key];\n if (overridesValue === void 0)\n continue;\n const baseValue = key in base ? base[key] : void 0;\n const isSourceObject = overridesValue !== null && typeof overridesValue === \"object\" && !Array.isArray(overridesValue) && !(overridesValue instanceof Date) && !(overridesValue instanceof RegExp);\n const isTargetObject = baseValue !== null && baseValue !== void 0 && typeof baseValue === \"object\" && !Array.isArray(baseValue) && !(baseValue instanceof Date) && !(baseValue instanceof RegExp);\n if (isSourceObject && isTargetObject) {\n result[key] = mergeObjects(\n baseValue,\n overridesValue\n );\n } else {\n result[key] = overridesValue;\n }\n }\n }\n return result;\n}\n\n// src/util/retry-with-exponential-backoff.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\nimport { delay, getErrorMessage as getErrorMessage4, isAbortError } from \"@ai-sdk/provider-utils\";\nfunction getRetryDelayInMs({\n error,\n exponentialBackoffDelay\n}) {\n const headers = error.responseHeaders;\n if (!headers)\n return exponentialBackoffDelay;\n let ms;\n const retryAfterMs = headers[\"retry-after-ms\"];\n if (retryAfterMs) {\n const timeoutMs = parseFloat(retryAfterMs);\n if (!Number.isNaN(timeoutMs)) {\n ms = timeoutMs;\n }\n }\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter && ms === void 0) {\n const timeoutSeconds = parseFloat(retryAfter);\n if (!Number.isNaN(timeoutSeconds)) {\n ms = timeoutSeconds * 1e3;\n } else {\n ms = Date.parse(retryAfter) - Date.now();\n }\n }\n if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) {\n return ms;\n }\n return exponentialBackoffDelay;\n}\nvar retryWithExponentialBackoffRespectingRetryHeaders = ({\n maxRetries = 2,\n initialDelayInMs = 2e3,\n backoffFactor = 2,\n abortSignal\n} = {}) => async (f) => _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs: initialDelayInMs,\n backoffFactor,\n abortSignal\n});\nasync function _retryWithExponentialBackoff(f, {\n maxRetries,\n delayInMs,\n backoffFactor,\n abortSignal\n}, errors = []) {\n try {\n return await f();\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n if (maxRetries === 0) {\n throw error;\n }\n const errorMessage = getErrorMessage4(error);\n const newErrors = [...errors, error];\n const tryNumber = newErrors.length;\n if (tryNumber > maxRetries) {\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,\n reason: \"maxRetriesExceeded\",\n errors: newErrors\n });\n }\n if (error instanceof Error && APICallError2.isInstance(error) && error.isRetryable === true && tryNumber <= maxRetries) {\n await delay(\n getRetryDelayInMs({\n error,\n exponentialBackoffDelay: delayInMs\n }),\n { abortSignal }\n );\n return _retryWithExponentialBackoff(\n f,\n {\n maxRetries,\n delayInMs: backoffFactor * delayInMs,\n backoffFactor,\n abortSignal\n },\n newErrors\n );\n }\n if (tryNumber === 1) {\n throw error;\n }\n throw new RetryError({\n message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,\n reason: \"errorNotRetryable\",\n errors: newErrors\n });\n }\n}\n\n// src/util/prepare-retries.ts\nfunction prepareRetries({\n maxRetries,\n abortSignal\n}) {\n if (maxRetries != null) {\n if (!Number.isInteger(maxRetries)) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be an integer\"\n });\n }\n if (maxRetries < 0) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be >= 0\"\n });\n }\n }\n const maxRetriesResult = maxRetries != null ? maxRetries : 2;\n return {\n maxRetries: maxRetriesResult,\n retry: retryWithExponentialBackoffRespectingRetryHeaders({\n maxRetries: maxRetriesResult,\n abortSignal\n })\n };\n}\n\n// src/generate-text/collect-tool-approvals.ts\nfunction collectToolApprovals({\n messages\n}) {\n const lastMessage = messages.at(-1);\n if ((lastMessage == null ? void 0 : lastMessage.role) != \"tool\") {\n return {\n approvedToolApprovals: [],\n deniedToolApprovals: []\n };\n }\n const toolCallsByToolCallId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-call\") {\n toolCallsByToolCallId[part.toolCallId] = part;\n }\n }\n }\n }\n const toolApprovalRequestsByApprovalId = {};\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-approval-request\") {\n toolApprovalRequestsByApprovalId[part.approvalId] = part;\n }\n }\n }\n }\n const toolResults = {};\n for (const part of lastMessage.content) {\n if (part.type === \"tool-result\") {\n toolResults[part.toolCallId] = part;\n }\n }\n const approvedToolApprovals = [];\n const deniedToolApprovals = [];\n const approvalResponses = lastMessage.content.filter(\n (part) => part.type === \"tool-approval-response\"\n );\n for (const approvalResponse of approvalResponses) {\n const approvalRequest = toolApprovalRequestsByApprovalId[approvalResponse.approvalId];\n if (approvalRequest == null) {\n throw new InvalidToolApprovalError({\n approvalId: approvalResponse.approvalId\n });\n }\n if (toolResults[approvalRequest.toolCallId] != null) {\n continue;\n }\n const toolCall = toolCallsByToolCallId[approvalRequest.toolCallId];\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: approvalRequest.toolCallId,\n approvalId: approvalRequest.approvalId\n });\n }\n const approval = {\n approvalRequest,\n approvalResponse,\n toolCall\n };\n if (approvalResponse.approved) {\n approvedToolApprovals.push(approval);\n } else {\n deniedToolApprovals.push(approval);\n }\n }\n return { approvedToolApprovals, deniedToolApprovals };\n}\n\n// src/generate-text/execute-tool-call.ts\nimport { executeTool } from \"@ai-sdk/provider-utils\";\n\n// src/util/now.ts\nfunction now() {\n var _a21, _b;\n return (_b = (_a21 = globalThis == null ? void 0 : globalThis.performance) == null ? void 0 : _a21.now()) != null ? _b : Date.now();\n}\n\n// src/generate-text/execute-tool-call.ts\nasync function executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onPreliminaryToolResult,\n onToolCallStart,\n onToolCallFinish\n}) {\n const { toolName, toolCallId, input } = toolCall;\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.execute) == null) {\n return void 0;\n }\n const baseCallbackEvent = {\n stepNumber,\n model,\n toolCall,\n messages,\n abortSignal,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n };\n return recordSpan({\n name: \"ai.toolCall\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.toolCall\",\n telemetry\n }),\n \"ai.toolCall.name\": toolName,\n \"ai.toolCall.id\": toolCallId,\n \"ai.toolCall.args\": {\n output: () => JSON.stringify(input)\n }\n }\n }),\n tracer,\n fn: async (span) => {\n let output;\n await notify({ event: baseCallbackEvent, callbacks: onToolCallStart });\n const startTime = now();\n try {\n const stream = executeTool({\n execute: tool2.execute.bind(tool2),\n input,\n options: {\n toolCallId,\n messages,\n abortSignal,\n experimental_context\n }\n });\n for await (const part of stream) {\n if (part.type === \"preliminary\") {\n onPreliminaryToolResult == null ? void 0 : onPreliminaryToolResult({\n ...toolCall,\n type: \"tool-result\",\n output: part.output,\n preliminary: true\n });\n } else {\n output = part.output;\n }\n }\n } catch (error) {\n const durationMs2 = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: false,\n error,\n durationMs: durationMs2\n },\n callbacks: onToolCallFinish\n });\n recordErrorOnSpan(span, error);\n return {\n type: \"tool-error\",\n toolCallId,\n toolName,\n input,\n error,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {}\n };\n }\n const durationMs = now() - startTime;\n await notify({\n event: {\n ...baseCallbackEvent,\n success: true,\n output,\n durationMs\n },\n callbacks: onToolCallFinish\n });\n try {\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.toolCall.result\": {\n output: () => JSON.stringify(output)\n }\n }\n })\n );\n } catch (ignored) {\n }\n return {\n type: \"tool-result\",\n toolCallId,\n toolName,\n input,\n output,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {}\n };\n }\n });\n}\n\n// src/generate-text/extract-reasoning-content.ts\nfunction extractReasoningContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"reasoning\"\n );\n return parts.length === 0 ? void 0 : parts.map((content2) => content2.text).join(\"\\n\");\n}\n\n// src/generate-text/extract-text-content.ts\nfunction extractTextContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"text\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((content2) => content2.text).join(\"\");\n}\n\n// src/generate-text/generated-file.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array3,\n convertUint8ArrayToBase64 as convertUint8ArrayToBase642\n} from \"@ai-sdk/provider-utils\";\nvar DefaultGeneratedFile = class {\n constructor({\n data,\n mediaType\n }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? void 0 : data;\n this.uint8ArrayData = isUint8Array ? data : void 0;\n this.mediaType = mediaType;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase642(this.uint8ArrayData);\n }\n return this.base64Data;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array3(this.base64Data);\n }\n return this.uint8ArrayData;\n }\n};\nvar DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {\n constructor(options) {\n super(options);\n this.type = \"file\";\n }\n};\n\n// src/generate-text/is-approval-needed.ts\nasync function isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n}) {\n if (tool2.needsApproval == null) {\n return false;\n }\n if (typeof tool2.needsApproval === \"boolean\") {\n return tool2.needsApproval;\n }\n return await tool2.needsApproval(toolCall.input, {\n toolCallId: toolCall.toolCallId,\n messages,\n experimental_context\n });\n}\n\n// src/generate-text/output.ts\nvar output_exports = {};\n__export(output_exports, {\n array: () => array,\n choice: () => choice,\n json: () => json,\n object: () => object,\n text: () => text\n});\nimport {\n TypeValidationError as TypeValidationError2\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema2,\n resolve,\n safeParseJSON as safeParseJSON2,\n safeValidateTypes as safeValidateTypes2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/parse-partial-json.ts\nimport { safeParseJSON } from \"@ai-sdk/provider-utils\";\n\n// src/util/fix-json.ts\nfunction fixJson(input) {\n const stack = [\"ROOT\"];\n let lastValidIndex = -1;\n let literalStart = null;\n function processValueStart(char, i, swapState) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_STRING\");\n break;\n }\n case \"f\":\n case \"t\":\n case \"n\": {\n lastValidIndex = i;\n literalStart = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_LITERAL\");\n break;\n }\n case \"-\": {\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"{\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_OBJECT_START\");\n break;\n }\n case \"[\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_ARRAY_START\");\n break;\n }\n }\n }\n }\n function processAfterObjectValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_COMMA\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n function processAfterArrayValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const currentState = stack[stack.length - 1];\n switch (currentState) {\n case \"ROOT\":\n processValueStart(char, i, \"FINISH\");\n break;\n case \"INSIDE_OBJECT_START\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_COMMA\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_KEY\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_KEY\": {\n switch (char) {\n case \":\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_BEFORE_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_BEFORE_VALUE\": {\n processValueStart(char, i, \"INSIDE_OBJECT_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n processAfterObjectValue(char, i);\n break;\n }\n case \"INSIDE_STRING\": {\n switch (char) {\n case '\"': {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"\\\\\": {\n stack.push(\"INSIDE_STRING_ESCAPE\");\n break;\n }\n default: {\n lastValidIndex = i;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_START\": {\n switch (char) {\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_COMMA\": {\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_STRING_ESCAPE\": {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"INSIDE_NUMBER\": {\n switch (char) {\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n break;\n }\n case \"e\":\n case \"E\":\n case \"-\":\n case \".\": {\n break;\n }\n case \",\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"}\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"]\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n break;\n }\n default: {\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, i + 1);\n if (!\"false\".startsWith(partialLiteral) && !\"true\".startsWith(partialLiteral) && !\"null\".startsWith(partialLiteral)) {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n } else if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n } else {\n lastValidIndex = i;\n }\n break;\n }\n }\n }\n let result = input.slice(0, lastValidIndex + 1);\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i];\n switch (state) {\n case \"INSIDE_STRING\": {\n result += '\"';\n break;\n }\n case \"INSIDE_OBJECT_KEY\":\n case \"INSIDE_OBJECT_AFTER_KEY\":\n case \"INSIDE_OBJECT_AFTER_COMMA\":\n case \"INSIDE_OBJECT_START\":\n case \"INSIDE_OBJECT_BEFORE_VALUE\":\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n result += \"}\";\n break;\n }\n case \"INSIDE_ARRAY_START\":\n case \"INSIDE_ARRAY_AFTER_COMMA\":\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n result += \"]\";\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, input.length);\n if (\"true\".startsWith(partialLiteral)) {\n result += \"true\".slice(partialLiteral.length);\n } else if (\"false\".startsWith(partialLiteral)) {\n result += \"false\".slice(partialLiteral.length);\n } else if (\"null\".startsWith(partialLiteral)) {\n result += \"null\".slice(partialLiteral.length);\n }\n }\n }\n }\n return result;\n}\n\n// src/util/parse-partial-json.ts\nasync function parsePartialJson(jsonText) {\n if (jsonText === void 0) {\n return { value: void 0, state: \"undefined-input\" };\n }\n let result = await safeParseJSON({ text: jsonText });\n if (result.success) {\n return { value: result.value, state: \"successful-parse\" };\n }\n result = await safeParseJSON({ text: fixJson(jsonText) });\n if (result.success) {\n return { value: result.value, state: \"repaired-parse\" };\n }\n return { value: void 0, state: \"failed-parse\" };\n}\n\n// src/generate-text/output.ts\nvar text = () => ({\n name: \"text\",\n responseFormat: Promise.resolve({ type: \"text\" }),\n async parseCompleteOutput({ text: text2 }) {\n return text2;\n },\n async parsePartialOutput({ text: text2 }) {\n return { partial: text2 };\n },\n createElementStreamTransform() {\n return void 0;\n }\n});\nvar object = ({\n schema: inputSchema,\n name: name21,\n description\n}) => {\n const schema = asSchema2(inputSchema);\n return {\n name: \"object\",\n responseFormat: resolve(schema.jsonSchema).then((jsonSchema2) => ({\n type: \"json\",\n schema: jsonSchema2,\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n })),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await safeValidateTypes2({\n value: parseResult.value,\n schema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return {\n // Note: currently no validation of partial results:\n partial: result.value\n };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar array = ({\n element: inputElementSchema,\n name: name21,\n description\n}) => {\n const elementSchema = asSchema2(inputElementSchema);\n return {\n name: \"array\",\n // JSON schema that describes an array of elements:\n responseFormat: resolve(elementSchema.jsonSchema).then((jsonSchema2) => {\n const { $schema, ...itemSchema } = jsonSchema2;\n return {\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n };\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object with an elements array\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n for (const element of outerValue.elements) {\n const validationResult = await safeValidateTypes2({\n value: element,\n schema: elementSchema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n }\n return outerValue.elements;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n return void 0;\n }\n const rawElements = result.state === \"repaired-parse\" && outerValue.elements.length > 0 ? outerValue.elements.slice(0, -1) : outerValue.elements;\n const parsedElements = [];\n for (const rawElement of rawElements) {\n const validationResult = await safeValidateTypes2({\n value: rawElement,\n schema: elementSchema\n });\n if (validationResult.success) {\n parsedElements.push(validationResult.value);\n }\n }\n return { partial: parsedElements };\n }\n }\n },\n createElementStreamTransform() {\n let publishedElements = 0;\n return new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n for (; publishedElements < partialOutput.length; publishedElements++) {\n controller.enqueue(partialOutput[publishedElements]);\n }\n }\n }\n });\n }\n };\n};\nvar choice = ({\n options: choiceOptions,\n name: name21,\n description\n}) => {\n return {\n name: \"choice\",\n // JSON schema that describes an enumeration:\n responseFormat: Promise.resolve({\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: choiceOptions }\n },\n required: [\"result\"],\n additionalProperties: false\n },\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\" || !choiceOptions.includes(outerValue.result)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object that contains a choice value.\"\n }),\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return outerValue.result;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\") {\n return void 0;\n }\n const potentialMatches = choiceOptions.filter(\n (choiceOption) => choiceOption.startsWith(outerValue.result)\n );\n if (result.state === \"successful-parse\") {\n return potentialMatches.includes(outerValue.result) ? { partial: outerValue.result } : void 0;\n } else {\n return potentialMatches.length === 1 ? { partial: potentialMatches[0] } : void 0;\n }\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar json = ({\n name: name21,\n description\n} = {}) => {\n return {\n name: \"json\",\n responseFormat: Promise.resolve({\n type: \"json\",\n ...name21 != null && { name: name21 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context2) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return parseResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return result.value === void 0 ? void 0 : { partial: result.value };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\n\n// src/generate-text/parse-tool-call.ts\nimport {\n asSchema as asSchema3,\n safeParseJSON as safeParseJSON3,\n safeValidateTypes as safeValidateTypes3\n} from \"@ai-sdk/provider-utils\";\nasync function parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages\n}) {\n var _a21;\n try {\n if (tools == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({ toolName: toolCall.toolName });\n }\n try {\n return await doParseToolCall({ toolCall, tools });\n } catch (error) {\n if (repairToolCall == null || !(NoSuchToolError.isInstance(error) || InvalidToolInputError.isInstance(error))) {\n throw error;\n }\n let repairedToolCall = null;\n try {\n repairedToolCall = await repairToolCall({\n toolCall,\n tools,\n inputSchema: async ({ toolName }) => {\n const { inputSchema } = tools[toolName];\n return await asSchema3(inputSchema).jsonSchema;\n },\n system,\n messages,\n error\n });\n } catch (repairError) {\n throw new ToolCallRepairError({\n cause: repairError,\n originalError: error\n });\n }\n if (repairedToolCall == null) {\n throw error;\n }\n return await doParseToolCall({ toolCall: repairedToolCall, tools });\n }\n } catch (error) {\n const parsedInput = await safeParseJSON3({ text: toolCall.input });\n const input = parsedInput.success ? parsedInput.value : toolCall.input;\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input,\n dynamic: true,\n invalid: true,\n error,\n title: (_a21 = tools == null ? void 0 : tools[toolCall.toolName]) == null ? void 0 : _a21.title,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata\n };\n }\n}\nasync function parseProviderExecutedDynamicToolCall(toolCall) {\n const parseResult = toolCall.input.trim() === \"\" ? { success: true, value: {} } : await safeParseJSON3({ text: toolCall.input });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName: toolCall.toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: true,\n dynamic: true,\n providerMetadata: toolCall.providerMetadata\n };\n}\nasync function doParseToolCall({\n toolCall,\n tools\n}) {\n const toolName = toolCall.toolName;\n const tool2 = tools[toolName];\n if (tool2 == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({\n toolName: toolCall.toolName,\n availableTools: Object.keys(tools)\n });\n }\n const schema = asSchema3(tool2.inputSchema);\n const parseResult = toolCall.input.trim() === \"\" ? await safeValidateTypes3({ value: {}, schema }) : await safeParseJSON3({ text: toolCall.input, schema });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return tool2.type === \"dynamic\" ? {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n dynamic: true,\n title: tool2.title\n } : {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n title: tool2.title\n };\n}\n\n// src/generate-text/step-result.ts\nvar DefaultStepResult = class {\n constructor({\n stepNumber,\n model,\n functionId,\n metadata,\n experimental_context,\n content,\n finishReason,\n rawFinishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata\n }) {\n this.stepNumber = stepNumber;\n this.model = model;\n this.functionId = functionId;\n this.metadata = metadata;\n this.experimental_context = experimental_context;\n this.content = content;\n this.finishReason = finishReason;\n this.rawFinishReason = rawFinishReason;\n this.usage = usage;\n this.warnings = warnings;\n this.request = request;\n this.response = response;\n this.providerMetadata = providerMetadata;\n }\n get text() {\n return this.content.filter((part) => part.type === \"text\").map((part) => part.text).join(\"\");\n }\n get reasoning() {\n return this.content.filter((part) => part.type === \"reasoning\");\n }\n get reasoningText() {\n return this.reasoning.length === 0 ? void 0 : this.reasoning.map((part) => part.text).join(\"\");\n }\n get files() {\n return this.content.filter((part) => part.type === \"file\").map((part) => part.file);\n }\n get sources() {\n return this.content.filter((part) => part.type === \"source\");\n }\n get toolCalls() {\n return this.content.filter((part) => part.type === \"tool-call\");\n }\n get staticToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic !== true\n );\n }\n get dynamicToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic === true\n );\n }\n get toolResults() {\n return this.content.filter((part) => part.type === \"tool-result\");\n }\n get staticToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic !== true\n );\n }\n get dynamicToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic === true\n );\n }\n};\n\n// src/generate-text/stop-condition.ts\nfunction stepCountIs(stepCount) {\n return ({ steps }) => steps.length === stepCount;\n}\nfunction isLoopFinished() {\n return () => false;\n}\nfunction hasToolCall(toolName) {\n return ({ steps }) => {\n var _a21, _b, _c;\n return (_c = (_b = (_a21 = steps[steps.length - 1]) == null ? void 0 : _a21.toolCalls) == null ? void 0 : _b.some(\n (toolCall) => toolCall.toolName === toolName\n )) != null ? _c : false;\n };\n}\nasync function isStopConditionMet({\n stopConditions,\n steps\n}) {\n return (await Promise.all(stopConditions.map((condition) => condition({ steps })))).some((result) => result);\n}\n\n// src/generate-text/to-response-messages.ts\nasync function toResponseMessages({\n content: inputContent,\n tools\n}) {\n const responseMessages = [];\n const content = [];\n for (const part of inputContent) {\n if (part.type === \"source\") {\n continue;\n }\n if ((part.type === \"tool-result\" || part.type === \"tool-error\") && !part.providerExecuted) {\n continue;\n }\n if (part.type === \"text\" && part.text.length === 0) {\n continue;\n }\n switch (part.type) {\n case \"text\":\n content.push({\n type: \"text\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"reasoning\":\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"file\":\n content.push({\n type: \"file\",\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-call\":\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.invalid && typeof part.input !== \"object\" ? {} : part.input,\n providerExecuted: part.providerExecuted,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-result\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.output,\n errorMode: \"none\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-error\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.error,\n errorMode: \"json\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-approval-request\":\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n }\n if (content.length > 0) {\n responseMessages.push({\n role: \"assistant\",\n content\n });\n }\n const toolResultContent = [];\n for (const part of inputContent) {\n if (!(part.type === \"tool-result\" || part.type === \"tool-error\") || part.providerExecuted) {\n continue;\n }\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: tools == null ? void 0 : tools[part.toolName],\n output: part.type === \"tool-result\" ? part.output : part.error,\n errorMode: part.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolResultContent.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n }\n if (toolResultContent.length > 0) {\n responseMessages.push({\n role: \"tool\",\n content: toolResultContent\n });\n }\n return responseMessages;\n}\n\n// src/util/merge-abort-signals.ts\nfunction mergeAbortSignals(...signals) {\n const validSignals = signals.filter(\n (signal) => signal != null\n );\n if (validSignals.length === 0) {\n return void 0;\n }\n if (validSignals.length === 1) {\n return validSignals[0];\n }\n const controller = new AbortController();\n for (const signal of validSignals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n signal.addEventListener(\n \"abort\",\n () => {\n controller.abort(signal.reason);\n },\n { once: true }\n );\n }\n return controller.signal;\n}\n\n// src/generate-text/generate-text.ts\nvar originalGenerateId = createIdGenerator({\n prefix: \"aitxt\",\n size: 24\n});\nasync function generateText({\n model: modelArg,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_prepareStep,\n prepareStep = experimental_prepareStep,\n experimental_repairToolCall: repairToolCall,\n experimental_download: download2,\n experimental_context,\n experimental_include: include,\n _internal: { generateId: generateId2 = originalGenerateId } = {},\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n onStepFinish,\n onFinish,\n ...settings\n}) {\n const model = resolveLanguageModel(modelArg);\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const stopConditions = asArray(stopWhen);\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const mergedAbortSignal = mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal\n );\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal: mergedAbortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = withUserAgentSuffix2(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const tracer = getTracer(telemetry);\n try {\n return await recordSpan({\n name: \"ai.generateText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": model.provider,\n \"ai.model.id\": model.modelId,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;\n const initialMessages = initialPrompt.messages;\n const responseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n if (deniedToolApprovals.length > 0 || localApprovedToolApprovals.length > 0) {\n const toolOutputs = await executeTools({\n toolCalls: localApprovedToolApprovals.map(\n (toolApproval) => toolApproval.toolCall\n ),\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: 0,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const toolContent = [];\n for (const output2 of toolOutputs) {\n const modelOutput = await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: modelOutput\n });\n }\n for (const toolApproval of deniedToolApprovals) {\n toolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason,\n // For provider-executed tools, include approvalId so provider can correlate\n ...toolApproval.toolCall.providerExecuted && {\n providerOptions: {\n openai: {\n approvalId: toolApproval.approvalResponse.approvalId\n }\n }\n }\n }\n });\n }\n responseMessages.push({\n role: \"tool\",\n content: toolContent\n });\n }\n const callSettings2 = prepareCallSettings(settings);\n let currentModelResponse;\n let clientToolCalls = [];\n let clientToolOutputs = [];\n const steps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n do {\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n try {\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps,\n stepNumber: steps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n experimental_context = (_d = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _d : experimental_context;\n const stepActiveTools = (_e = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _e : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_f = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _f : toolChoice,\n activeTools: stepActiveTools\n });\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: steps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...steps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal,\n include,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n currentModelResponse = await retry(\n () => {\n var _a22;\n return recordSpan({\n name: \"ai.generateText.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateText.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": settings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": settings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": settings.presencePenalty,\n \"gen_ai.request.stop_sequences\": settings.stopSequences,\n \"gen_ai.request.temperature\": (_a22 = settings.temperature) != null ? _a22 : void 0,\n \"gen_ai.request.top_k\": settings.topK,\n \"gen_ai.request.top_p\": settings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a23, _b2, _c2, _d2, _e2, _f2, _g2, _h2;\n const result = await stepModel.doGenerate({\n ...callSettings2,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal: mergedAbortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b2 = (_a23 = result.response) == null ? void 0 : _a23.id) != null ? _b2 : generateId2(),\n timestamp: (_d2 = (_c2 = result.response) == null ? void 0 : _c2.timestamp) != null ? _d2 : /* @__PURE__ */ new Date(),\n modelId: (_f2 = (_e2 = result.response) == null ? void 0 : _e2.modelId) != null ? _f2 : stepModel.modelId,\n headers: (_g2 = result.response) == null ? void 0 : _g2.headers,\n body: (_h2 = result.response) == null ? void 0 : _h2.body\n };\n const usage = asLanguageModelUsage(result.usage);\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(result.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(result.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(result.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result.providerMetadata\n ),\n \"ai.usage.inputTokens\": result.usage.inputTokens.total,\n \"ai.usage.inputTokenDetails.noCacheTokens\": result.usage.inputTokens.noCache,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": result.usage.inputTokens.cacheRead,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": result.usage.inputTokens.cacheWrite,\n \"ai.usage.outputTokens\": result.usage.outputTokens.total,\n \"ai.usage.outputTokenDetails.textTokens\": result.usage.outputTokens.text,\n \"ai.usage.outputTokenDetails.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.totalTokens\": usage.totalTokens,\n \"ai.usage.reasoningTokens\": result.usage.outputTokens.reasoning,\n \"ai.usage.cachedInputTokens\": result.usage.inputTokens.cacheRead,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result.usage.outputTokens.total\n }\n })\n );\n return { ...result, response: responseData };\n }\n });\n }\n );\n const stepToolCalls = await Promise.all(\n currentModelResponse.content.filter(\n (part) => part.type === \"tool-call\"\n ).map(\n (toolCall) => parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n system,\n messages: stepInputMessages\n })\n )\n );\n const toolApprovalRequests = {};\n for (const toolCall of stepToolCalls) {\n if (toolCall.invalid) {\n continue;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n continue;\n }\n if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages: stepInputMessages,\n experimental_context\n })) {\n toolApprovalRequests[toolCall.toolCallId] = {\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n };\n }\n }\n const invalidToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.invalid && toolCall.dynamic\n );\n clientToolOutputs = [];\n for (const toolCall of invalidToolCalls) {\n clientToolOutputs.push({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage5(toolCall.error),\n dynamic: true\n });\n }\n clientToolCalls = stepToolCalls.filter(\n (toolCall) => !toolCall.providerExecuted\n );\n if (tools != null) {\n clientToolOutputs.push(\n ...await executeTools({\n toolCalls: clientToolCalls.filter(\n (toolCall) => !toolCall.invalid && toolApprovalRequests[toolCall.toolCallId] == null\n ),\n tools,\n tracer,\n telemetry,\n messages: stepInputMessages,\n abortSignal: mergedAbortSignal,\n experimental_context,\n stepNumber: steps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n })\n );\n }\n for (const toolCall of stepToolCalls) {\n if (!toolCall.providerExecuted)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInResponse = currentModelResponse.content.some(\n (part) => part.type === \"tool-result\" && part.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInResponse) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const part of currentModelResponse.content) {\n if (part.type === \"tool-result\") {\n pendingDeferredToolCalls.delete(part.toolCallId);\n }\n }\n const stepContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: clientToolOutputs,\n toolApprovalRequests: Object.values(toolApprovalRequests),\n tools\n });\n responseMessages.push(\n ...await toResponseMessages({\n content: stepContent,\n tools\n })\n );\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? (_j = currentModelResponse.request) != null ? _j : {} : { ...currentModelResponse.request, body: void 0 };\n const stepResponse = {\n ...currentModelResponse.response,\n // deep clone msgs to avoid mutating past messages in multi-step:\n messages: structuredClone(responseMessages),\n // Conditionally include response body:\n body: ((_k = include == null ? void 0 : include.responseBody) != null ? _k : true) ? (_l = currentModelResponse.response) == null ? void 0 : _l.body : void 0\n };\n const stepNumber = steps.length;\n const currentStepResult = new DefaultStepResult({\n stepNumber,\n model: stepModelInfo,\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata,\n experimental_context,\n content: stepContent,\n finishReason: currentModelResponse.finishReason.unified,\n rawFinishReason: currentModelResponse.finishReason.raw,\n usage: asLanguageModelUsage(currentModelResponse.usage),\n warnings: currentModelResponse.warnings,\n providerMetadata: currentModelResponse.providerMetadata,\n request: stepRequest,\n response: stepResponse\n });\n logWarnings({\n warnings: (_m = currentModelResponse.warnings) != null ? _m : [],\n provider: stepModelInfo.provider,\n model: stepModelInfo.modelId\n });\n steps.push(currentStepResult);\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n } finally {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n } while (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({ stopConditions, steps })\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": currentModelResponse.finishReason.unified,\n \"ai.response.text\": {\n output: () => extractTextContent(currentModelResponse.content)\n },\n \"ai.response.reasoning\": {\n output: () => extractReasoningContent(currentModelResponse.content)\n },\n \"ai.response.toolCalls\": {\n output: () => {\n const toolCalls = asToolCalls(currentModelResponse.content);\n return toolCalls == null ? void 0 : JSON.stringify(toolCalls);\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n currentModelResponse.providerMetadata\n )\n }\n })\n );\n const lastStep = steps[steps.length - 1];\n const totalUsage = steps.reduce(\n (totalUsage2, step) => {\n return addLanguageModelUsage(totalUsage2, step.usage);\n },\n {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0,\n reasoningTokens: void 0,\n cachedInputTokens: void 0\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_n = totalUsage.inputTokenDetails) == null ? void 0 : _n.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_o = totalUsage.inputTokenDetails) == null ? void 0 : _o.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_p = totalUsage.inputTokenDetails) == null ? void 0 : _p.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_q = totalUsage.outputTokenDetails) == null ? void 0 : _q.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_r = totalUsage.outputTokenDetails) == null ? void 0 : _r.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_s = totalUsage.outputTokenDetails) == null ? void 0 : _s.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_t = totalUsage.inputTokenDetails) == null ? void 0 : _t.cacheReadTokens\n }\n })\n );\n await notify({\n event: {\n stepNumber: lastStep.stepNumber,\n model: lastStep.model,\n functionId: lastStep.functionId,\n metadata: lastStep.metadata,\n experimental_context: lastStep.experimental_context,\n finishReason: lastStep.finishReason,\n rawFinishReason: lastStep.rawFinishReason,\n usage: lastStep.usage,\n content: lastStep.content,\n text: lastStep.text,\n reasoningText: lastStep.reasoningText,\n reasoning: lastStep.reasoning,\n files: lastStep.files,\n sources: lastStep.sources,\n toolCalls: lastStep.toolCalls,\n staticToolCalls: lastStep.staticToolCalls,\n dynamicToolCalls: lastStep.dynamicToolCalls,\n toolResults: lastStep.toolResults,\n staticToolResults: lastStep.staticToolResults,\n dynamicToolResults: lastStep.dynamicToolResults,\n request: lastStep.request,\n response: lastStep.response,\n warnings: lastStep.warnings,\n providerMetadata: lastStep.providerMetadata,\n steps,\n totalUsage\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n let resolvedOutput;\n if (lastStep.finishReason === \"stop\") {\n const outputSpecification = output != null ? output : text();\n resolvedOutput = await outputSpecification.parseCompleteOutput(\n { text: lastStep.text },\n {\n response: lastStep.response,\n usage: lastStep.usage,\n finishReason: lastStep.finishReason\n }\n );\n }\n return new DefaultGenerateTextResult({\n steps,\n totalUsage,\n output: resolvedOutput\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nasync function executeTools({\n toolCalls,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n const toolOutputs = await Promise.all(\n toolCalls.map(\n async (toolCall) => executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n })\n )\n );\n return toolOutputs.filter(\n (output) => output != null\n );\n}\nvar DefaultGenerateTextResult = class {\n constructor(options) {\n this.steps = options.steps;\n this._output = options.output;\n this.totalUsage = options.totalUsage;\n }\n get finalStep() {\n return this.steps[this.steps.length - 1];\n }\n get content() {\n return this.finalStep.content;\n }\n get text() {\n return this.finalStep.text;\n }\n get files() {\n return this.finalStep.files;\n }\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n get reasoning() {\n return this.finalStep.reasoning;\n }\n get toolCalls() {\n return this.finalStep.toolCalls;\n }\n get staticToolCalls() {\n return this.finalStep.staticToolCalls;\n }\n get dynamicToolCalls() {\n return this.finalStep.dynamicToolCalls;\n }\n get toolResults() {\n return this.finalStep.toolResults;\n }\n get staticToolResults() {\n return this.finalStep.staticToolResults;\n }\n get dynamicToolResults() {\n return this.finalStep.dynamicToolResults;\n }\n get sources() {\n return this.finalStep.sources;\n }\n get finishReason() {\n return this.finalStep.finishReason;\n }\n get rawFinishReason() {\n return this.finalStep.rawFinishReason;\n }\n get warnings() {\n return this.finalStep.warnings;\n }\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n get response() {\n return this.finalStep.response;\n }\n get request() {\n return this.finalStep.request;\n }\n get usage() {\n return this.finalStep.usage;\n }\n get experimental_output() {\n return this.output;\n }\n get output() {\n if (this._output == null) {\n throw new NoOutputGeneratedError();\n }\n return this._output;\n }\n};\nfunction asToolCalls(content) {\n const parts = content.filter(\n (part) => part.type === \"tool-call\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((toolCall) => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input\n }));\n}\nfunction asContent({\n content,\n toolCalls,\n toolOutputs,\n toolApprovalRequests,\n tools\n}) {\n const contentParts = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n case \"source\":\n contentParts.push(part);\n break;\n case \"file\": {\n contentParts.push({\n type: \"file\",\n file: new DefaultGeneratedFile(part),\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"tool-call\": {\n contentParts.push(\n toolCalls.find((toolCall) => toolCall.toolCallId === part.toolCallId)\n );\n break;\n }\n case \"tool-result\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n const tool2 = tools == null ? void 0 : tools[part.toolName];\n const supportsDeferredResults = (tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults;\n if (!supportsDeferredResults) {\n throw new Error(`Tool call ${part.toolCallId} not found.`);\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n error: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n output: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n error: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n output: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: part.toolCallId,\n approvalId: part.approvalId\n });\n }\n contentParts.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCall\n });\n break;\n }\n }\n }\n return [...contentParts, ...toolOutputs, ...toolApprovalRequests];\n}\n\n// src/generate-text/stream-text.ts\nimport {\n getErrorMessage as getErrorMessage7,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError2\n} from \"@ai-sdk/provider\";\nimport {\n createIdGenerator as createIdGenerator2,\n DelayedPromise,\n isAbortError as isAbortError2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/prepare-headers.ts\nfunction prepareHeaders(headers, defaultHeaders) {\n const responseHeaders = new Headers(headers != null ? headers : {});\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!responseHeaders.has(key)) {\n responseHeaders.set(key, value);\n }\n }\n return responseHeaders;\n}\n\n// src/text-stream/create-text-stream-response.ts\nfunction createTextStreamResponse({\n status,\n statusText,\n headers,\n textStream\n}) {\n return new Response(textStream.pipeThrough(new TextEncoderStream()), {\n status: status != null ? status : 200,\n statusText,\n headers: prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n })\n });\n}\n\n// src/util/write-to-server-response.ts\nfunction writeToServerResponse({\n response,\n status,\n statusText,\n headers,\n stream\n}) {\n const statusCode = status != null ? status : 200;\n if (statusText !== void 0) {\n response.writeHead(statusCode, statusText, headers);\n } else {\n response.writeHead(statusCode, headers);\n }\n const reader = stream.getReader();\n const read = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n const canContinue = response.write(value);\n if (!canContinue) {\n await new Promise((resolve3) => {\n response.once(\"drain\", resolve3);\n });\n }\n }\n } catch (error) {\n throw error;\n } finally {\n response.end();\n }\n };\n read();\n}\n\n// src/text-stream/pipe-text-stream-to-response.ts\nfunction pipeTextStreamToResponse({\n response,\n status,\n statusText,\n headers,\n textStream\n}) {\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n }).entries()\n ),\n stream: textStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/ui-message-stream/json-to-sse-transform-stream.ts\nvar JsonToSseTransformStream = class extends TransformStream {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\n\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n }\n });\n }\n};\n\n// src/ui-message-stream/ui-message-stream-headers.ts\nvar UI_MESSAGE_STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n \"x-accel-buffering\": \"no\"\n // disable nginx buffering\n};\n\n// src/ui-message-stream/create-ui-message-stream-response.ts\nfunction createUIMessageStreamResponse({\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n return new Response(sseStream.pipeThrough(new TextEncoderStream()), {\n status,\n statusText,\n headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS)\n });\n}\n\n// src/ui-message-stream/get-response-ui-message-id.ts\nfunction getResponseUIMessageId({\n originalMessages,\n responseMessageId\n}) {\n if (originalMessages == null) {\n return void 0;\n }\n const lastMessage = originalMessages[originalMessages.length - 1];\n return (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage.id : typeof responseMessageId === \"function\" ? responseMessageId() : responseMessageId;\n}\n\n// src/ui/process-ui-message-stream.ts\nimport { validateTypes } from \"@ai-sdk/provider-utils\";\n\n// src/ui-message-stream/ui-message-chunks.ts\nimport { z as z7 } from \"zod/v4\";\nimport { lazySchema, zodSchema } from \"@ai-sdk/provider-utils\";\nvar uiMessageChunkSchema = lazySchema(\n () => zodSchema(\n z7.union([\n z7.strictObject({\n type: z7.literal(\"text-start\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"text-delta\"),\n id: z7.string(),\n delta: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"text-end\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"error\"),\n errorText: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-start\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-delta\"),\n toolCallId: z7.string(),\n inputTextDelta: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-available\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-input-error\"),\n toolCallId: z7.string(),\n toolName: z7.string(),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n errorText: z7.string(),\n title: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-approval-request\"),\n approvalId: z7.string(),\n toolCallId: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-available\"),\n toolCallId: z7.string(),\n output: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z7.boolean().optional(),\n preliminary: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-error\"),\n toolCallId: z7.string(),\n errorText: z7.string(),\n providerExecuted: z7.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n dynamic: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"tool-output-denied\"),\n toolCallId: z7.string()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-start\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-delta\"),\n id: z7.string(),\n delta: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"reasoning-end\"),\n id: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"source-url\"),\n sourceId: z7.string(),\n url: z7.string(),\n title: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"source-document\"),\n sourceId: z7.string(),\n mediaType: z7.string(),\n title: z7.string(),\n filename: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.literal(\"file\"),\n url: z7.string(),\n mediaType: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.strictObject({\n type: z7.custom(\n (value) => typeof value === \"string\" && value.startsWith(\"data-\"),\n { message: 'Type must start with \"data-\"' }\n ),\n id: z7.string().optional(),\n data: z7.unknown(),\n transient: z7.boolean().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"start-step\")\n }),\n z7.strictObject({\n type: z7.literal(\"finish-step\")\n }),\n z7.strictObject({\n type: z7.literal(\"start\"),\n messageId: z7.string().optional(),\n messageMetadata: z7.unknown().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"finish\"),\n finishReason: z7.enum([\n \"stop\",\n \"length\",\n \"content-filter\",\n \"tool-calls\",\n \"error\",\n \"other\"\n ]).optional(),\n messageMetadata: z7.unknown().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"abort\"),\n reason: z7.string().optional()\n }),\n z7.strictObject({\n type: z7.literal(\"message-metadata\"),\n messageMetadata: z7.unknown()\n })\n ])\n )\n);\nfunction isDataUIMessageChunk(chunk) {\n return chunk.type.startsWith(\"data-\");\n}\n\n// src/ui/ui-messages.ts\nfunction isDataUIPart(part) {\n return part.type.startsWith(\"data-\");\n}\nfunction isTextUIPart(part) {\n return part.type === \"text\";\n}\nfunction isFileUIPart(part) {\n return part.type === \"file\";\n}\nfunction isReasoningUIPart(part) {\n return part.type === \"reasoning\";\n}\nfunction isStaticToolUIPart(part) {\n return part.type.startsWith(\"tool-\");\n}\nfunction isDynamicToolUIPart(part) {\n return part.type === \"dynamic-tool\";\n}\nfunction isToolUIPart(part) {\n return isStaticToolUIPart(part) || isDynamicToolUIPart(part);\n}\nvar isToolOrDynamicToolUIPart = isToolUIPart;\nfunction getStaticToolName(part) {\n return part.type.split(\"-\").slice(1).join(\"-\");\n}\nfunction getToolName(part) {\n return isDynamicToolUIPart(part) ? part.toolName : getStaticToolName(part);\n}\nvar getToolOrDynamicToolName = getToolName;\n\n// src/ui/process-ui-message-stream.ts\nfunction createStreamingUIMessageState({\n lastMessage,\n messageId\n}) {\n return {\n message: (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage : {\n id: messageId,\n metadata: void 0,\n role: \"assistant\",\n parts: []\n },\n activeTextParts: {},\n activeReasoningParts: {},\n partialToolCalls: {}\n };\n}\nfunction processUIMessageStream({\n stream,\n messageMetadataSchema,\n dataPartSchemas,\n runUpdateMessageJob,\n onError,\n onToolCall,\n onData\n}) {\n return stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n await runUpdateMessageJob(async ({ state, write }) => {\n var _a21, _b, _c, _d;\n function getToolInvocation(toolCallId) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n const toolInvocation = toolInvocations.find(\n (invocation) => invocation.toolCallId === toolCallId\n );\n if (toolInvocation == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-invocation\",\n chunkId: toolCallId,\n message: `No tool invocation found for tool call ID \"${toolCallId}\".`\n });\n }\n return toolInvocation;\n }\n function updateToolPart(options) {\n var _a22;\n const part = state.message.parts.find(\n (part2) => isStaticToolUIPart(part2) && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n anyPart.providerExecuted = (_a22 = anyOptions.providerExecuted) != null ? _a22 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: `tool-${options.toolName}`,\n toolCallId: options.toolCallId,\n state: options.state,\n title: options.title,\n input: anyOptions.input,\n output: anyOptions.output,\n rawInput: anyOptions.rawInput,\n errorText: anyOptions.errorText,\n providerExecuted: anyOptions.providerExecuted,\n preliminary: anyOptions.preliminary,\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n function updateDynamicToolPart(options) {\n var _a22, _b2;\n const part = state.message.parts.find(\n (part2) => part2.type === \"dynamic-tool\" && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.toolName = options.toolName;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = (_a22 = anyOptions.rawInput) != null ? _a22 : anyPart.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n anyPart.providerExecuted = (_b2 = anyOptions.providerExecuted) != null ? _b2 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: \"dynamic-tool\",\n toolName: options.toolName,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n errorText: anyOptions.errorText,\n preliminary: anyOptions.preliminary,\n providerExecuted: anyOptions.providerExecuted,\n title: options.title,\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n async function updateMessageMetadata(metadata) {\n if (metadata != null) {\n const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata) : metadata;\n if (messageMetadataSchema != null) {\n await validateTypes({\n value: mergedMetadata,\n schema: messageMetadataSchema,\n context: {\n field: \"message.metadata\",\n entityId: state.message.id\n }\n });\n }\n state.message.metadata = mergedMetadata;\n }\n }\n switch (chunk.type) {\n case \"text-start\": {\n const textPart = {\n type: \"text\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeTextParts[chunk.id] = textPart;\n state.message.parts.push(textPart);\n write();\n break;\n }\n case \"text-delta\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-delta\",\n chunkId: chunk.id,\n message: `Received text-delta for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-delta\" chunks.`\n });\n }\n textPart.text += chunk.delta;\n textPart.providerMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textPart.providerMetadata;\n write();\n break;\n }\n case \"text-end\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-end\",\n chunkId: chunk.id,\n message: `Received text-end for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-end\" chunks.`\n });\n }\n textPart.state = \"done\";\n textPart.providerMetadata = (_b = chunk.providerMetadata) != null ? _b : textPart.providerMetadata;\n delete state.activeTextParts[chunk.id];\n write();\n break;\n }\n case \"reasoning-start\": {\n const reasoningPart = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeReasoningParts[chunk.id] = reasoningPart;\n state.message.parts.push(reasoningPart);\n write();\n break;\n }\n case \"reasoning-delta\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-delta\",\n chunkId: chunk.id,\n message: `Received reasoning-delta for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-delta\" chunks.`\n });\n }\n reasoningPart.text += chunk.delta;\n reasoningPart.providerMetadata = (_c = chunk.providerMetadata) != null ? _c : reasoningPart.providerMetadata;\n write();\n break;\n }\n case \"reasoning-end\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-end\",\n chunkId: chunk.id,\n message: `Received reasoning-end for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-end\" chunks.`\n });\n }\n reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata;\n reasoningPart.state = \"done\";\n delete state.activeReasoningParts[chunk.id];\n write();\n break;\n }\n case \"file\": {\n state.message.parts.push({\n type: \"file\",\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n write();\n break;\n }\n case \"source-url\": {\n state.message.parts.push({\n type: \"source-url\",\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"source-document\": {\n state.message.parts.push({\n type: \"source-document\",\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"tool-input-start\": {\n const toolInvocations = state.message.parts.filter(isStaticToolUIPart);\n state.partialToolCalls[chunk.toolCallId] = {\n text: \"\",\n toolName: chunk.toolName,\n index: toolInvocations.length,\n dynamic: chunk.dynamic,\n title: chunk.title\n };\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-delta\": {\n const partialToolCall = state.partialToolCalls[chunk.toolCallId];\n if (partialToolCall == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-input-delta\",\n chunkId: chunk.toolCallId,\n message: `Received tool-input-delta for missing tool call with ID \"${chunk.toolCallId}\". Ensure a \"tool-input-start\" chunk is sent before any \"tool-input-delta\" chunks.`\n });\n }\n partialToolCall.text += chunk.inputTextDelta;\n const { value: partialArgs } = await parsePartialJson(\n partialToolCall.text\n );\n if (partialToolCall.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title\n });\n }\n write();\n break;\n }\n case \"tool-input-available\": {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title\n });\n }\n write();\n if (onToolCall && !chunk.providerExecuted) {\n await onToolCall({\n toolCall: chunk\n });\n }\n break;\n }\n case \"tool-input-error\": {\n const existingPart = state.message.parts.filter(isToolUIPart).find((p) => p.toolCallId === chunk.toolCallId);\n const isDynamic = existingPart != null ? existingPart.type === \"dynamic-tool\" : !!chunk.dynamic;\n if (isDynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: void 0,\n rawInput: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata\n });\n }\n write();\n break;\n }\n case \"tool-approval-request\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"approval-requested\";\n toolInvocation.approval = { id: chunk.approvalId };\n write();\n break;\n }\n case \"tool-output-denied\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"output-denied\";\n write();\n break;\n }\n case \"tool-output-available\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n providerExecuted: chunk.providerExecuted,\n preliminary: chunk.preliminary,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n }\n write();\n break;\n }\n case \"tool-output-error\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-error\",\n input: toolInvocation.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-error\",\n input: toolInvocation.input,\n rawInput: toolInvocation.rawInput,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title\n });\n }\n write();\n break;\n }\n case \"start-step\": {\n state.message.parts.push({ type: \"step-start\" });\n break;\n }\n case \"finish-step\": {\n state.activeTextParts = {};\n state.activeReasoningParts = {};\n break;\n }\n case \"start\": {\n if (chunk.messageId != null) {\n state.message.id = chunk.messageId;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageId != null || chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"finish\": {\n if (chunk.finishReason != null) {\n state.finishReason = chunk.finishReason;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"message-metadata\": {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"error\": {\n onError == null ? void 0 : onError(new Error(chunk.errorText));\n break;\n }\n default: {\n if (isDataUIMessageChunk(chunk)) {\n if ((dataPartSchemas == null ? void 0 : dataPartSchemas[chunk.type]) != null) {\n const partIdx = state.message.parts.findIndex(\n (p) => \"id\" in p && \"data\" in p && p.id === chunk.id && p.type === chunk.type\n );\n const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length;\n await validateTypes({\n value: chunk.data,\n schema: dataPartSchemas[chunk.type],\n context: {\n field: `message.parts[${actualPartIdx}].data`,\n entityName: chunk.type,\n entityId: chunk.id\n }\n });\n }\n const dataChunk = chunk;\n if (dataChunk.transient) {\n onData == null ? void 0 : onData(dataChunk);\n break;\n }\n const existingUIPart = dataChunk.id != null ? state.message.parts.find(\n (chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id\n ) : void 0;\n if (existingUIPart != null) {\n existingUIPart.data = dataChunk.data;\n } else {\n state.message.parts.push(dataChunk);\n }\n onData == null ? void 0 : onData(dataChunk);\n write();\n }\n }\n }\n controller.enqueue(chunk);\n });\n }\n })\n );\n}\n\n// src/ui-message-stream/handle-ui-message-stream-finish.ts\nfunction handleUIMessageStreamFinish({\n messageId,\n originalMessages = [],\n onStepFinish,\n onFinish,\n onError,\n stream\n}) {\n let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1];\n if ((lastMessage == null ? void 0 : lastMessage.role) !== \"assistant\") {\n lastMessage = void 0;\n } else {\n messageId = lastMessage.id;\n }\n let isAborted = false;\n const idInjectedStream = stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"start\") {\n const startChunk = chunk;\n if (startChunk.messageId == null && messageId != null) {\n startChunk.messageId = messageId;\n }\n }\n if (chunk.type === \"abort\") {\n isAborted = true;\n }\n controller.enqueue(chunk);\n }\n })\n );\n if (onFinish == null && onStepFinish == null) {\n return idInjectedStream;\n }\n const state = createStreamingUIMessageState({\n lastMessage: lastMessage ? structuredClone(lastMessage) : void 0,\n messageId: messageId != null ? messageId : \"\"\n // will be overridden by the stream\n });\n const runUpdateMessageJob = async (job) => {\n await job({ state, write: () => {\n } });\n };\n let finishCalled = false;\n const callOnFinish = async () => {\n if (finishCalled || !onFinish) {\n return;\n }\n finishCalled = true;\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n await onFinish({\n isAborted,\n isContinuation,\n responseMessage: state.message,\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n state.message\n ],\n finishReason: state.finishReason\n });\n };\n const callOnStepFinish = async () => {\n if (!onStepFinish) {\n return;\n }\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n try {\n await onStepFinish({\n isContinuation,\n responseMessage: structuredClone(state.message),\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n structuredClone(state.message)\n ]\n });\n } catch (error) {\n onError(error);\n }\n };\n return processUIMessageStream({\n stream: idInjectedStream,\n runUpdateMessageJob,\n onError\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type === \"finish-step\") {\n await callOnStepFinish();\n }\n controller.enqueue(chunk);\n },\n // @ts-expect-error cancel is still new and missing from types https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility\n async cancel() {\n await callOnFinish();\n },\n async flush() {\n await callOnFinish();\n }\n })\n );\n}\n\n// src/ui-message-stream/pipe-ui-message-stream-to-response.ts\nfunction pipeUIMessageStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries()\n ),\n stream: sseStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/util/async-iterable-stream.ts\nfunction createAsyncIterableStream(source) {\n const stream = source.pipeThrough(new TransformStream());\n stream[Symbol.asyncIterator] = function() {\n const reader = this.getReader();\n let finished = false;\n async function cleanup(cancelStream) {\n var _a21;\n if (finished)\n return;\n finished = true;\n try {\n if (cancelStream) {\n await ((_a21 = reader.cancel) == null ? void 0 : _a21.call(reader));\n }\n } finally {\n try {\n reader.releaseLock();\n } catch (e) {\n }\n }\n }\n return {\n /**\n * Reads the next chunk from the stream.\n * @returns A promise resolving to the next IteratorResult.\n */\n async next() {\n if (finished) {\n return { done: true, value: void 0 };\n }\n const { done, value } = await reader.read();\n if (done) {\n await cleanup(true);\n return { done: true, value: void 0 };\n }\n return { done: false, value };\n },\n /**\n * May be called on early exit (e.g., break from for-await) or after completion.\n * Ensures the stream is cancelled and resources are released.\n * @returns A promise resolving to a completed IteratorResult.\n */\n async return() {\n await cleanup(true);\n return { done: true, value: void 0 };\n },\n /**\n * Called on early exit with error.\n * Ensures the stream is cancelled and resources are released, then rethrows the error.\n * @param err The error to throw.\n * @returns A promise that rejects with the provided error.\n */\n async throw(err) {\n await cleanup(true);\n throw err;\n }\n };\n };\n return stream;\n}\n\n// src/util/consume-stream.ts\nasync function consumeStream({\n stream,\n onError\n}) {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done)\n break;\n }\n } catch (error) {\n onError == null ? void 0 : onError(error);\n } finally {\n reader.releaseLock();\n }\n}\n\n// src/util/create-resolvable-promise.ts\nfunction createResolvablePromise() {\n let resolve3;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve3 = res;\n reject = rej;\n });\n return {\n promise,\n resolve: resolve3,\n reject\n };\n}\n\n// src/util/create-stitchable-stream.ts\nfunction createStitchableStream() {\n let innerStreamReaders = [];\n let controller = null;\n let isClosed = false;\n let waitForNewStream = createResolvablePromise();\n const terminate = () => {\n isClosed = true;\n waitForNewStream.resolve();\n innerStreamReaders.forEach((reader) => reader.cancel());\n innerStreamReaders = [];\n controller == null ? void 0 : controller.close();\n };\n const processPull = async () => {\n if (isClosed && innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n return;\n }\n if (innerStreamReaders.length === 0) {\n waitForNewStream = createResolvablePromise();\n await waitForNewStream.promise;\n return processPull();\n }\n try {\n const { value, done } = await innerStreamReaders[0].read();\n if (done) {\n innerStreamReaders.shift();\n if (innerStreamReaders.length === 0 && isClosed) {\n controller == null ? void 0 : controller.close();\n } else {\n await processPull();\n }\n } else {\n controller == null ? void 0 : controller.enqueue(value);\n }\n } catch (error) {\n controller == null ? void 0 : controller.error(error);\n innerStreamReaders.shift();\n terminate();\n }\n };\n return {\n stream: new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n },\n pull: processPull,\n async cancel() {\n for (const reader of innerStreamReaders) {\n await reader.cancel();\n }\n innerStreamReaders = [];\n isClosed = true;\n }\n }),\n addStream: (innerStream) => {\n if (isClosed) {\n throw new Error(\"Cannot add inner stream: outer stream is closed\");\n }\n innerStreamReaders.push(innerStream.getReader());\n waitForNewStream.resolve();\n },\n /**\n * Gracefully close the outer stream. This will let the inner streams\n * finish processing and then close the outer stream.\n */\n close: () => {\n isClosed = true;\n waitForNewStream.resolve();\n if (innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n }\n },\n /**\n * Immediately close the outer stream. This will cancel all inner streams\n * and close the outer stream.\n */\n terminate\n };\n}\n\n// src/generate-text/run-tools-transformation.ts\nimport {\n getErrorMessage as getErrorMessage6\n} from \"@ai-sdk/provider-utils\";\nfunction runToolsTransformation({\n tools,\n generatorStream,\n tracer,\n telemetry,\n system,\n messages,\n abortSignal,\n repairToolCall,\n experimental_context,\n generateId: generateId2,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish\n}) {\n let toolResultsStreamController = null;\n const toolResultsStream = new ReadableStream({\n start(controller) {\n toolResultsStreamController = controller;\n }\n });\n const outstandingToolResults = /* @__PURE__ */ new Set();\n const toolInputs = /* @__PURE__ */ new Map();\n const toolCallsByToolCallId = /* @__PURE__ */ new Map();\n let canClose = false;\n let finishChunk = void 0;\n function attemptClose() {\n if (canClose && outstandingToolResults.size === 0) {\n if (finishChunk != null) {\n toolResultsStreamController.enqueue(finishChunk);\n }\n toolResultsStreamController.close();\n }\n }\n const forwardStream = new TransformStream({\n async transform(chunk, controller) {\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"stream-start\":\n case \"text-start\":\n case \"text-delta\":\n case \"text-end\":\n case \"reasoning-start\":\n case \"reasoning-delta\":\n case \"reasoning-end\":\n case \"tool-input-start\":\n case \"tool-input-delta\":\n case \"tool-input-end\":\n case \"source\":\n case \"response-metadata\":\n case \"error\":\n case \"raw\": {\n controller.enqueue(chunk);\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n file: new DefaultGeneratedFileWithType({\n data: chunk.data,\n mediaType: chunk.mediaType\n }),\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n break;\n }\n case \"finish\": {\n finishChunk = {\n type: \"finish\",\n finishReason: chunk.finishReason.unified,\n rawFinishReason: chunk.finishReason.raw,\n usage: asLanguageModelUsage(chunk.usage),\n providerMetadata: chunk.providerMetadata\n };\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n if (toolCall == null) {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error: new ToolCallNotFoundForApprovalError({\n toolCallId: chunk.toolCallId,\n approvalId: chunk.approvalId\n })\n });\n break;\n }\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: chunk.approvalId,\n toolCall\n });\n break;\n }\n case \"tool-call\": {\n try {\n const toolCall = await parseToolCall({\n toolCall: chunk,\n tools,\n repairToolCall,\n system,\n messages\n });\n toolCallsByToolCallId.set(toolCall.toolCallId, toolCall);\n controller.enqueue(toolCall);\n if (toolCall.invalid) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage6(toolCall.error),\n dynamic: true,\n title: toolCall.title\n });\n break;\n }\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if (tool2 == null) {\n break;\n }\n if (tool2.onInputAvailable != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages,\n abortSignal,\n experimental_context\n });\n }\n if (await isApprovalNeeded({\n tool: tool2,\n toolCall,\n messages,\n experimental_context\n })) {\n toolResultsStreamController.enqueue({\n type: \"tool-approval-request\",\n approvalId: generateId2(),\n toolCall\n });\n break;\n }\n toolInputs.set(toolCall.toolCallId, toolCall.input);\n if (tool2.execute != null && toolCall.providerExecuted !== true) {\n const toolExecutionId = generateId2();\n outstandingToolResults.add(toolExecutionId);\n executeToolCall({\n toolCall,\n tools,\n tracer,\n telemetry,\n messages,\n abortSignal,\n experimental_context,\n stepNumber,\n model,\n onToolCallStart,\n onToolCallFinish,\n onPreliminaryToolResult: (result) => {\n toolResultsStreamController.enqueue(result);\n }\n }).then((result) => {\n toolResultsStreamController.enqueue(result);\n }).catch((error) => {\n toolResultsStreamController.enqueue({\n type: \"error\",\n error\n });\n }).finally(() => {\n outstandingToolResults.delete(toolExecutionId);\n attemptClose();\n });\n }\n } catch (error) {\n toolResultsStreamController.enqueue({ type: \"error\", error });\n }\n break;\n }\n case \"tool-result\": {\n const toolName = chunk.toolName;\n if (chunk.isError) {\n toolResultsStreamController.enqueue({\n type: \"tool-error\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n providerExecuted: true,\n error: chunk.result,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolInputs.get(chunk.toolCallId),\n output: chunk.result,\n providerExecuted: true,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = chunkType;\n throw new Error(`Unhandled chunk type: ${_exhaustiveCheck}`);\n }\n }\n },\n flush() {\n canClose = true;\n attemptClose();\n }\n });\n return new ReadableStream({\n async start(controller) {\n return Promise.all([\n generatorStream.pipeThrough(forwardStream).pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n }\n })\n ),\n toolResultsStream.pipeTo(\n new WritableStream({\n write(chunk) {\n controller.enqueue(chunk);\n },\n close() {\n controller.close();\n }\n })\n )\n ]);\n }\n });\n}\n\n// src/generate-text/stream-text.ts\nvar originalGenerateId2 = createIdGenerator2({\n prefix: \"aitxt\",\n size: 24\n});\nfunction streamText({\n model,\n tools,\n toolChoice,\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n timeout,\n headers,\n stopWhen = stepCountIs(1),\n experimental_output,\n output = experimental_output,\n experimental_telemetry: telemetry,\n prepareStep,\n providerOptions,\n experimental_activeTools,\n activeTools = experimental_activeTools,\n experimental_repairToolCall: repairToolCall,\n experimental_transform: transform,\n experimental_download: download2,\n includeRawChunks = false,\n onChunk,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n onAbort,\n onStepFinish,\n experimental_onStart: onStart,\n experimental_onStepStart: onStepStart,\n experimental_onToolCallStart: onToolCallStart,\n experimental_onToolCallFinish: onToolCallFinish,\n experimental_context,\n experimental_include: include,\n _internal: { now: now2 = now, generateId: generateId2 = originalGenerateId2 } = {},\n ...settings\n}) {\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const chunkTimeoutMs = getChunkTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const chunkAbortController = chunkTimeoutMs != null ? new AbortController() : void 0;\n return new DefaultStreamTextResult({\n model: resolveLanguageModel(model),\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal: mergeAbortSignals(\n abortSignal,\n totalTimeoutMs != null ? AbortSignal.timeout(totalTimeoutMs) : void 0,\n stepAbortController == null ? void 0 : stepAbortController.signal,\n chunkAbortController == null ? void 0 : chunkAbortController.signal\n ),\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms: asArray(transform),\n activeTools,\n repairToolCall,\n stopConditions: asArray(stopWhen),\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n timeout,\n stopWhen,\n originalAbortSignal: abortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n now: now2,\n generateId: generateId2,\n experimental_context,\n download: download2,\n include\n });\n}\nfunction createOutputTransformStream(output) {\n let firstTextChunkId = void 0;\n let text2 = \"\";\n let textChunk = \"\";\n let textProviderMetadata = void 0;\n let lastPublishedValue = \"\";\n function publishTextChunk({\n controller,\n partialOutput = void 0\n }) {\n controller.enqueue({\n part: {\n type: \"text-delta\",\n id: firstTextChunkId,\n text: textChunk,\n providerMetadata: textProviderMetadata\n },\n partialOutput\n });\n textChunk = \"\";\n }\n return new TransformStream({\n async transform(chunk, controller) {\n var _a21;\n if (chunk.type === \"finish-step\" && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n if (chunk.type !== \"text-delta\" && chunk.type !== \"text-start\" && chunk.type !== \"text-end\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-start\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-end\") {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n text2 += chunk.text;\n textChunk += chunk.text;\n textProviderMetadata = (_a21 = chunk.providerMetadata) != null ? _a21 : textProviderMetadata;\n const result = await output.parsePartialOutput({ text: text2 });\n if (result !== void 0) {\n const currentValue = typeof result.partial === \"string\" ? result.partial : JSON.stringify(result.partial);\n if (currentValue !== lastPublishedValue) {\n publishTextChunk({ controller, partialOutput: result.partial });\n lastPublishedValue = currentValue;\n }\n }\n }\n });\n}\nvar DefaultStreamTextResult = class {\n constructor({\n model,\n telemetry,\n headers,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n transforms,\n activeTools,\n repairToolCall,\n stopConditions,\n output,\n providerOptions,\n prepareStep,\n includeRawChunks,\n now: now2,\n generateId: generateId2,\n timeout,\n stopWhen,\n originalAbortSignal,\n onChunk,\n onError,\n onFinish,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onToolCallStart,\n onToolCallFinish,\n experimental_context,\n download: download2,\n include\n }) {\n this._totalUsage = new DelayedPromise();\n this._finishReason = new DelayedPromise();\n this._rawFinishReason = new DelayedPromise();\n this._steps = new DelayedPromise();\n this.outputSpecification = output;\n this.includeRawChunks = includeRawChunks;\n this.tools = tools;\n const createGlobalTelemetry = getGlobalTelemetryIntegration();\n const globalTelemetry = createGlobalTelemetry(telemetry == null ? void 0 : telemetry.integrations);\n let stepFinish;\n let recordedContent = [];\n const recordedResponseMessages = [];\n let recordedFinishReason = void 0;\n let recordedRawFinishReason = void 0;\n let recordedTotalUsage = void 0;\n let recordedRequest = {};\n let recordedWarnings = [];\n const recordedSteps = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n let rootSpan;\n let activeTextContent = {};\n let activeReasoningContent = {};\n const eventProcessor = new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c, _d;\n controller.enqueue(chunk);\n const { part } = chunk;\n if (part.type === \"text-delta\" || part.type === \"reasoning-delta\" || part.type === \"source\" || part.type === \"tool-call\" || part.type === \"tool-result\" || part.type === \"tool-input-start\" || part.type === \"tool-input-delta\" || part.type === \"raw\") {\n await (onChunk == null ? void 0 : onChunk({ chunk: part }));\n }\n if (part.type === \"error\") {\n await onError({ error: wrapGatewayError(part.error) });\n }\n if (part.type === \"text-start\") {\n activeTextContent[part.id] = {\n type: \"text\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeTextContent[part.id]);\n }\n if (part.type === \"text-delta\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.text += part.text;\n activeText.providerMetadata = (_a21 = part.providerMetadata) != null ? _a21 : activeText.providerMetadata;\n }\n if (part.type === \"text-end\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeText.providerMetadata;\n delete activeTextContent[part.id];\n }\n if (part.type === \"reasoning-start\") {\n activeReasoningContent[part.id] = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeReasoningContent[part.id]);\n }\n if (part.type === \"reasoning-delta\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.text += part.text;\n activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata;\n }\n if (part.type === \"reasoning-end\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.providerMetadata = (_d = part.providerMetadata) != null ? _d : activeReasoning.providerMetadata;\n delete activeReasoningContent[part.id];\n }\n if (part.type === \"file\") {\n recordedContent.push({\n type: \"file\",\n file: part.file,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (part.type === \"source\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-call\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-result\" && !part.preliminary) {\n recordedContent.push(part);\n }\n if (part.type === \"tool-approval-request\") {\n recordedContent.push(part);\n }\n if (part.type === \"tool-error\") {\n recordedContent.push(part);\n }\n if (part.type === \"start-step\") {\n recordedContent = [];\n activeReasoningContent = {};\n activeTextContent = {};\n recordedRequest = part.request;\n recordedWarnings = part.warnings;\n }\n if (part.type === \"finish-step\") {\n const stepMessages = await toResponseMessages({\n content: recordedContent,\n tools\n });\n const currentStepResult = new DefaultStepResult({\n stepNumber: recordedSteps.length,\n model: modelInfo,\n ...callbackTelemetryProps,\n experimental_context,\n content: recordedContent,\n finishReason: part.finishReason,\n rawFinishReason: part.rawFinishReason,\n usage: part.usage,\n warnings: recordedWarnings,\n request: recordedRequest,\n response: {\n ...part.response,\n messages: [...recordedResponseMessages, ...stepMessages]\n },\n providerMetadata: part.providerMetadata\n });\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, globalTelemetry.onStepFinish]\n });\n logWarnings({\n warnings: recordedWarnings,\n provider: modelInfo.provider,\n model: modelInfo.modelId\n });\n recordedSteps.push(currentStepResult);\n recordedResponseMessages.push(...stepMessages);\n stepFinish.resolve();\n }\n if (part.type === \"finish\") {\n recordedTotalUsage = part.totalUsage;\n recordedFinishReason = part.finishReason;\n recordedRawFinishReason = part.rawFinishReason;\n }\n },\n async flush(controller) {\n var _a21, _b, _c, _d, _e, _f, _g;\n try {\n if (recordedSteps.length === 0) {\n const error = (abortSignal == null ? void 0 : abortSignal.aborted) ? abortSignal.reason : new NoOutputGeneratedError({\n message: \"No output generated. Check the stream for errors.\"\n });\n self._finishReason.reject(error);\n self._rawFinishReason.reject(error);\n self._totalUsage.reject(error);\n self._steps.reject(error);\n return;\n }\n const finishReason = recordedFinishReason != null ? recordedFinishReason : \"other\";\n const totalUsage = recordedTotalUsage != null ? recordedTotalUsage : createNullLanguageModelUsage();\n self._finishReason.resolve(finishReason);\n self._rawFinishReason.resolve(recordedRawFinishReason);\n self._totalUsage.resolve(totalUsage);\n self._steps.resolve(recordedSteps);\n const finalStep = recordedSteps[recordedSteps.length - 1];\n await notify({\n event: {\n stepNumber: finalStep.stepNumber,\n model: finalStep.model,\n functionId: finalStep.functionId,\n metadata: finalStep.metadata,\n experimental_context: finalStep.experimental_context,\n finishReason: finalStep.finishReason,\n rawFinishReason: finalStep.rawFinishReason,\n totalUsage,\n usage: finalStep.usage,\n content: finalStep.content,\n text: finalStep.text,\n reasoningText: finalStep.reasoningText,\n reasoning: finalStep.reasoning,\n files: finalStep.files,\n sources: finalStep.sources,\n toolCalls: finalStep.toolCalls,\n staticToolCalls: finalStep.staticToolCalls,\n dynamicToolCalls: finalStep.dynamicToolCalls,\n toolResults: finalStep.toolResults,\n staticToolResults: finalStep.staticToolResults,\n dynamicToolResults: finalStep.dynamicToolResults,\n request: finalStep.request,\n response: finalStep.response,\n warnings: finalStep.warnings,\n providerMetadata: finalStep.providerMetadata,\n steps: recordedSteps\n },\n callbacks: [\n onFinish,\n globalTelemetry.onFinish\n ]\n });\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.text\": { output: () => finalStep.text },\n \"ai.response.reasoning\": {\n output: () => finalStep.reasoningText\n },\n \"ai.response.toolCalls\": {\n output: () => {\n var _a22;\n return ((_a22 = finalStep.toolCalls) == null ? void 0 : _a22.length) ? JSON.stringify(finalStep.toolCalls) : void 0;\n }\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n finalStep.providerMetadata\n ),\n \"ai.usage.inputTokens\": totalUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a21 = totalUsage.inputTokenDetails) == null ? void 0 : _a21.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b = totalUsage.inputTokenDetails) == null ? void 0 : _b.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c = totalUsage.inputTokenDetails) == null ? void 0 : _c.cacheWriteTokens,\n \"ai.usage.outputTokens\": totalUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d = totalUsage.outputTokenDetails) == null ? void 0 : _d.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e = totalUsage.outputTokenDetails) == null ? void 0 : _e.reasoningTokens,\n \"ai.usage.totalTokens\": totalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f = totalUsage.outputTokenDetails) == null ? void 0 : _f.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g = totalUsage.inputTokenDetails) == null ? void 0 : _g.cacheReadTokens\n }\n })\n );\n } catch (error) {\n controller.error(error);\n } finally {\n rootSpan.end();\n }\n }\n });\n const stitchableStream = createStitchableStream();\n this.addStream = stitchableStream.addStream;\n this.closeStream = stitchableStream.close;\n const reader = stitchableStream.stream.getReader();\n let stream = new ReadableStream({\n async start(controller) {\n controller.enqueue({ type: \"start\" });\n },\n async pull(controller) {\n function abort() {\n onAbort == null ? void 0 : onAbort({ steps: recordedSteps });\n controller.enqueue({\n type: \"abort\",\n // The `reason` is usually of type DOMException, but it can also be of any type,\n // so we use getErrorMessage for serialization because it is already designed to accept values of the unknown type.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/reason\n ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: getErrorMessage7(abortSignal.reason) } : {}\n });\n controller.close();\n }\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n if (abortSignal == null ? void 0 : abortSignal.aborted) {\n abort();\n return;\n }\n controller.enqueue(value);\n } catch (error) {\n if (isAbortError2(error) && (abortSignal == null ? void 0 : abortSignal.aborted)) {\n abort();\n } else {\n controller.error(error);\n }\n }\n },\n cancel(reason) {\n return stitchableStream.stream.cancel(reason);\n }\n });\n for (const transform of transforms) {\n stream = stream.pipeThrough(\n transform({\n tools,\n stopStream() {\n stitchableStream.terminate();\n }\n })\n );\n }\n this.baseStream = stream.pipeThrough(createOutputTransformStream(output != null ? output : text())).pipeThrough(eventProcessor);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const tracer = getTracer(telemetry);\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const self = this;\n const modelInfo = { provider: model.provider, modelId: model.modelId };\n const callbackTelemetryProps = {\n functionId: telemetry == null ? void 0 : telemetry.functionId,\n metadata: telemetry == null ? void 0 : telemetry.metadata\n };\n recordSpan({\n name: \"ai.streamText\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.streamText\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n }\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpanArg) => {\n rootSpan = rootSpanArg;\n const initialPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n await notify({\n event: {\n model: modelInfo,\n system,\n prompt,\n messages,\n tools,\n toolChoice,\n activeTools,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStart,\n globalTelemetry.onStart\n ]\n });\n const initialMessages = initialPrompt.messages;\n const initialResponseMessages = [];\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n if (deniedToolApprovals.length > 0 || approvedToolApprovals.length > 0) {\n const localApprovedToolApprovals = approvedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const localDeniedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => !toolApproval.toolCall.providerExecuted\n );\n const deniedProviderExecutedToolApprovals = deniedToolApprovals.filter(\n (toolApproval) => toolApproval.toolCall.providerExecuted\n );\n let toolExecutionStepStreamController;\n const toolExecutionStepStream = new ReadableStream({\n start(controller) {\n toolExecutionStepStreamController = controller;\n }\n });\n self.addStream(toolExecutionStepStream);\n try {\n for (const toolApproval of [\n ...localDeniedToolApprovals,\n ...deniedProviderExecutedToolApprovals\n ]) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue({\n type: \"tool-output-denied\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName\n });\n }\n const toolOutputs = [];\n await Promise.all(\n localApprovedToolApprovals.map(async (toolApproval) => {\n const result = await executeToolCall({\n toolCall: toolApproval.toolCall,\n tools,\n tracer,\n telemetry,\n messages: initialMessages,\n abortSignal,\n experimental_context,\n stepNumber: recordedSteps.length,\n model: modelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ],\n onPreliminaryToolResult: (result2) => {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result2);\n }\n });\n if (result != null) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result);\n toolOutputs.push(result);\n }\n })\n );\n if (toolOutputs.length > 0 || localDeniedToolApprovals.length > 0) {\n const localToolContent = [];\n for (const output2 of toolOutputs) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: tools == null ? void 0 : tools[output2.toolName],\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n })\n });\n }\n for (const toolApproval of localDeniedToolApprovals) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval.toolCall.toolCallId,\n toolName: toolApproval.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval.approvalResponse.reason\n }\n });\n }\n initialResponseMessages.push({\n role: \"tool\",\n content: localToolContent\n });\n }\n } finally {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.close();\n }\n }\n recordedResponseMessages.push(...initialResponseMessages);\n async function streamStep({\n currentStep,\n responseMessages,\n usage\n }) {\n var _a21, _b, _c, _d, _e, _f, _g, _h, _i;\n const includeRawChunks2 = self.includeRawChunks;\n const stepTimeoutId = stepTimeoutMs != null ? setTimeout(() => stepAbortController.abort(), stepTimeoutMs) : void 0;\n let chunkTimeoutId = void 0;\n function resetChunkTimeout() {\n if (chunkTimeoutMs != null) {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n }\n chunkTimeoutId = setTimeout(\n () => chunkAbortController.abort(),\n chunkTimeoutMs\n );\n }\n }\n function clearChunkTimeout() {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n chunkTimeoutId = void 0;\n }\n }\n function clearStepTimeout() {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n try {\n stepFinish = new DelayedPromise();\n const stepInputMessages = [...initialMessages, ...responseMessages];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps: recordedSteps,\n stepNumber: recordedSteps.length,\n messages: stepInputMessages,\n experimental_context\n }));\n const stepModel = resolveLanguageModel(\n (_a21 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a21 : model\n );\n const stepModelInfo = {\n provider: stepModel.provider,\n modelId: stepModel.modelId\n };\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n system: (_b = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _b : initialPrompt.system,\n messages: (_c = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _c : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2\n });\n const stepActiveTools = (_d = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _d : activeTools;\n const { toolChoice: stepToolChoice, tools: stepTools } = await prepareToolsAndToolChoice({\n tools,\n toolChoice: (_e = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _e : toolChoice,\n activeTools: stepActiveTools\n });\n experimental_context = (_f = prepareStepResult == null ? void 0 : prepareStepResult.experimental_context) != null ? _f : experimental_context;\n const stepMessages = (_g = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _g : stepInputMessages;\n const stepSystem = (_h = prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _h : initialPrompt.system;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n system: stepSystem,\n messages: stepMessages,\n tools,\n toolChoice: stepToolChoice,\n activeTools: stepActiveTools,\n steps: [...recordedSteps],\n providerOptions: stepProviderOptions,\n timeout,\n headers,\n stopWhen,\n output,\n abortSignal: originalAbortSignal,\n include,\n ...callbackTelemetryProps,\n experimental_context\n },\n callbacks: [\n onStepStart,\n globalTelemetry.onStepStart\n ]\n });\n const {\n result: { stream: stream2, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamText.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamText.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // model:\n \"ai.model.provider\": stepModel.provider,\n \"ai.model.id\": stepModel.modelId,\n // prompt:\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n \"ai.prompt.tools\": {\n // convert the language model level tools:\n input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))\n },\n \"ai.prompt.toolChoice\": {\n input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": stepModel.provider,\n \"gen_ai.request.model\": stepModel.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.stop_sequences\": callSettings.stopSequences,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n // get before the call\n doStreamSpan: doStreamSpan2,\n result: await stepModel.doStream({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal,\n headers,\n includeRawChunks: includeRawChunks2\n })\n })\n })\n );\n const streamWithToolResults = runToolsTransformation({\n tools,\n generatorStream: stream2,\n tracer,\n telemetry,\n system,\n messages: stepInputMessages,\n repairToolCall,\n abortSignal,\n experimental_context,\n generateId: generateId2,\n stepNumber: recordedSteps.length,\n model: stepModelInfo,\n onToolCallStart: [\n onToolCallStart,\n globalTelemetry.onToolCallStart\n ],\n onToolCallFinish: [\n onToolCallFinish,\n globalTelemetry.onToolCallFinish\n ]\n });\n const stepRequest = ((_i = include == null ? void 0 : include.requestBody) != null ? _i : true) ? request != null ? request : {} : { ...request, body: void 0 };\n const stepToolCalls = [];\n const stepToolOutputs = [];\n let warnings;\n const activeToolCallToolNames = {};\n let stepFinishReason = \"other\";\n let stepRawFinishReason = void 0;\n let stepUsage = createNullLanguageModelUsage();\n let stepProviderMetadata;\n let stepFirstChunk = true;\n let stepResponse = {\n id: generateId2(),\n timestamp: /* @__PURE__ */ new Date(),\n modelId: modelInfo.modelId\n };\n let activeText = \"\";\n self.addStream(\n streamWithToolResults.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a22, _b2, _c2, _d2, _e2;\n resetChunkTimeout();\n if (chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (stepFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n stepFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.response.msToFirstChunk\": msToFirstChunk\n });\n controller.enqueue({\n type: \"start-step\",\n request: stepRequest,\n warnings: warnings != null ? warnings : []\n });\n }\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"tool-approval-request\":\n case \"text-start\":\n case \"text-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"text-delta\": {\n if (chunk.delta.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n activeText += chunk.delta;\n }\n break;\n }\n case \"reasoning-start\":\n case \"reasoning-end\": {\n controller.enqueue(chunk);\n break;\n }\n case \"reasoning-delta\": {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n break;\n }\n case \"tool-call\": {\n controller.enqueue(chunk);\n stepToolCalls.push(chunk);\n break;\n }\n case \"tool-result\": {\n controller.enqueue(chunk);\n if (!chunk.preliminary) {\n stepToolOutputs.push(chunk);\n }\n break;\n }\n case \"tool-error\": {\n controller.enqueue(chunk);\n stepToolOutputs.push(chunk);\n break;\n }\n case \"response-metadata\": {\n stepResponse = {\n id: (_a22 = chunk.id) != null ? _a22 : stepResponse.id,\n timestamp: (_b2 = chunk.timestamp) != null ? _b2 : stepResponse.timestamp,\n modelId: (_c2 = chunk.modelId) != null ? _c2 : stepResponse.modelId\n };\n break;\n }\n case \"finish\": {\n stepUsage = chunk.usage;\n stepFinishReason = chunk.finishReason;\n stepRawFinishReason = chunk.rawFinishReason;\n stepProviderMetadata = chunk.providerMetadata;\n const msToFinish = now2() - startTimestampMs;\n doStreamSpan.addEvent(\"ai.stream.finish\");\n doStreamSpan.setAttributes({\n \"ai.response.msToFinish\": msToFinish,\n \"ai.response.avgOutputTokensPerSecond\": 1e3 * ((_d2 = stepUsage.outputTokens) != null ? _d2 : 0) / msToFinish\n });\n break;\n }\n case \"file\": {\n controller.enqueue(chunk);\n break;\n }\n case \"source\": {\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-start\": {\n activeToolCallToolNames[chunk.id] = chunk.toolName;\n const tool2 = tools == null ? void 0 : tools[chunk.toolName];\n if ((tool2 == null ? void 0 : tool2.onInputStart) != null) {\n await tool2.onInputStart({\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue({\n ...chunk,\n dynamic: (_e2 = chunk.dynamic) != null ? _e2 : (tool2 == null ? void 0 : tool2.type) === \"dynamic\",\n title: tool2 == null ? void 0 : tool2.title\n });\n break;\n }\n case \"tool-input-end\": {\n delete activeToolCallToolNames[chunk.id];\n controller.enqueue(chunk);\n break;\n }\n case \"tool-input-delta\": {\n const toolName = activeToolCallToolNames[chunk.id];\n const tool2 = tools == null ? void 0 : tools[toolName];\n if ((tool2 == null ? void 0 : tool2.onInputDelta) != null) {\n await tool2.onInputDelta({\n inputTextDelta: chunk.delta,\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n experimental_context\n });\n }\n controller.enqueue(chunk);\n break;\n }\n case \"error\": {\n controller.enqueue(chunk);\n stepFinishReason = \"error\";\n break;\n }\n case \"raw\": {\n if (includeRawChunks2) {\n controller.enqueue(chunk);\n }\n break;\n }\n default: {\n const exhaustiveCheck = chunkType;\n throw new Error(\n `Unknown chunk type: ${exhaustiveCheck}`\n );\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n var _a22, _b2, _c2, _d2, _e2, _f2, _g2;\n const stepToolCallsJson = stepToolCalls.length > 0 ? JSON.stringify(stepToolCalls) : void 0;\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": stepFinishReason,\n \"ai.response.toolCalls\": {\n output: () => stepToolCallsJson\n },\n \"ai.response.id\": stepResponse.id,\n \"ai.response.model\": stepResponse.modelId,\n \"ai.response.timestamp\": stepResponse.timestamp.toISOString(),\n \"ai.usage.inputTokens\": stepUsage.inputTokens,\n \"ai.usage.inputTokenDetails.noCacheTokens\": (_a22 = stepUsage.inputTokenDetails) == null ? void 0 : _a22.noCacheTokens,\n \"ai.usage.inputTokenDetails.cacheReadTokens\": (_b2 = stepUsage.inputTokenDetails) == null ? void 0 : _b2.cacheReadTokens,\n \"ai.usage.inputTokenDetails.cacheWriteTokens\": (_c2 = stepUsage.inputTokenDetails) == null ? void 0 : _c2.cacheWriteTokens,\n \"ai.usage.outputTokens\": stepUsage.outputTokens,\n \"ai.usage.outputTokenDetails.textTokens\": (_d2 = stepUsage.outputTokenDetails) == null ? void 0 : _d2.textTokens,\n \"ai.usage.outputTokenDetails.reasoningTokens\": (_e2 = stepUsage.outputTokenDetails) == null ? void 0 : _e2.reasoningTokens,\n \"ai.usage.totalTokens\": stepUsage.totalTokens,\n \"ai.usage.reasoningTokens\": (_f2 = stepUsage.outputTokenDetails) == null ? void 0 : _f2.reasoningTokens,\n \"ai.usage.cachedInputTokens\": (_g2 = stepUsage.inputTokenDetails) == null ? void 0 : _g2.cacheReadTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n stepFinishReason\n ],\n \"gen_ai.response.id\": stepResponse.id,\n \"gen_ai.response.model\": stepResponse.modelId,\n \"gen_ai.usage.input_tokens\": stepUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": stepUsage.outputTokens\n }\n })\n );\n } catch (error) {\n }\n controller.enqueue({\n type: \"finish-step\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n usage: stepUsage,\n providerMetadata: stepProviderMetadata,\n response: {\n ...stepResponse,\n headers: response == null ? void 0 : response.headers\n }\n });\n const combinedUsage = addLanguageModelUsage(\n usage,\n stepUsage\n );\n await stepFinish.promise;\n const processedStep = recordedSteps[recordedSteps.length - 1];\n try {\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.text\": {\n output: () => processedStep.text\n },\n \"ai.response.reasoning\": {\n output: () => processedStep.reasoningText\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n processedStep.providerMetadata\n )\n }\n })\n );\n } catch (error) {\n } finally {\n doStreamSpan.end();\n }\n const clientToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.providerExecuted !== true\n );\n const clientToolOutputs = stepToolOutputs.filter(\n (toolOutput) => toolOutput.providerExecuted !== true\n );\n for (const toolCall of stepToolCalls) {\n if (toolCall.providerExecuted !== true)\n continue;\n const tool2 = tools == null ? void 0 : tools[toolCall.toolName];\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInStep = stepToolOutputs.some(\n (output2) => (output2.type === \"tool-result\" || output2.type === \"tool-error\") && output2.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInStep) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const output2 of stepToolOutputs) {\n if (output2.type === \"tool-result\" || output2.type === \"tool-error\") {\n pendingDeferredToolCalls.delete(output2.toolCallId);\n }\n }\n clearStepTimeout();\n clearChunkTimeout();\n if (\n // Continue if:\n // 1. There are client tool calls that have all been executed, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({\n stopConditions,\n steps: recordedSteps\n })\n ) {\n responseMessages.push(\n ...await toResponseMessages({\n content: (\n // use transformed content to create the messages for the next step:\n recordedSteps[recordedSteps.length - 1].content\n ),\n tools\n })\n );\n try {\n await streamStep({\n currentStep: currentStep + 1,\n responseMessages,\n usage: combinedUsage\n });\n } catch (error) {\n controller.enqueue({\n type: \"error\",\n error\n });\n self.closeStream();\n }\n } else {\n controller.enqueue({\n type: \"finish\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n totalUsage: combinedUsage\n });\n self.closeStream();\n }\n }\n })\n )\n );\n } finally {\n clearStepTimeout();\n clearChunkTimeout();\n }\n }\n await streamStep({\n currentStep: 0,\n responseMessages: initialResponseMessages,\n usage: createNullLanguageModelUsage()\n });\n }\n }).catch((error) => {\n self.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n self.closeStream();\n });\n }\n get steps() {\n this.consumeStream();\n return this._steps.promise;\n }\n get finalStep() {\n return this.steps.then((steps) => steps[steps.length - 1]);\n }\n get content() {\n return this.finalStep.then((step) => step.content);\n }\n get warnings() {\n return this.finalStep.then((step) => step.warnings);\n }\n get providerMetadata() {\n return this.finalStep.then((step) => step.providerMetadata);\n }\n get text() {\n return this.finalStep.then((step) => step.text);\n }\n get reasoningText() {\n return this.finalStep.then((step) => step.reasoningText);\n }\n get reasoning() {\n return this.finalStep.then((step) => step.reasoning);\n }\n get sources() {\n return this.finalStep.then((step) => step.sources);\n }\n get files() {\n return this.finalStep.then((step) => step.files);\n }\n get toolCalls() {\n return this.finalStep.then((step) => step.toolCalls);\n }\n get staticToolCalls() {\n return this.finalStep.then((step) => step.staticToolCalls);\n }\n get dynamicToolCalls() {\n return this.finalStep.then((step) => step.dynamicToolCalls);\n }\n get toolResults() {\n return this.finalStep.then((step) => step.toolResults);\n }\n get staticToolResults() {\n return this.finalStep.then((step) => step.staticToolResults);\n }\n get dynamicToolResults() {\n return this.finalStep.then((step) => step.dynamicToolResults);\n }\n get usage() {\n return this.finalStep.then((step) => step.usage);\n }\n get request() {\n return this.finalStep.then((step) => step.request);\n }\n get response() {\n return this.finalStep.then((step) => step.response);\n }\n get totalUsage() {\n this.consumeStream();\n return this._totalUsage.promise;\n }\n get finishReason() {\n this.consumeStream();\n return this._finishReason.promise;\n }\n get rawFinishReason() {\n this.consumeStream();\n return this._rawFinishReason.promise;\n }\n /**\n * Split out a new stream from the original stream.\n * The original stream is replaced to allow for further splitting,\n * since we do not know how many times the stream will be split.\n *\n * Note: this leads to buffering the stream content on the server.\n * However, the LLM results are expected to be small enough to not cause issues.\n */\n teeStream() {\n const [stream1, stream2] = this.baseStream.tee();\n this.baseStream = stream2;\n return stream1;\n }\n get textStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n if (part.type === \"text-delta\") {\n controller.enqueue(part.text);\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n controller.enqueue(part);\n }\n })\n )\n );\n }\n async consumeStream(options) {\n var _a21;\n try {\n await consumeStream({\n stream: this.fullStream,\n onError: options == null ? void 0 : options.onError\n });\n } catch (error) {\n (_a21 = options == null ? void 0 : options.onError) == null ? void 0 : _a21.call(options, error);\n }\n }\n get experimental_partialOutputStream() {\n return this.partialOutputStream;\n }\n get partialOutputStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n }\n })\n )\n );\n }\n get elementStream() {\n var _a21, _b, _c;\n const transform = (_a21 = this.outputSpecification) == null ? void 0 : _a21.createElementStreamTransform();\n if (transform == null) {\n throw new UnsupportedFunctionalityError2({\n functionality: `element streams in ${(_c = (_b = this.outputSpecification) == null ? void 0 : _b.name) != null ? _c : \"text\"} mode`\n });\n }\n return createAsyncIterableStream(this.teeStream().pipeThrough(transform));\n }\n get output() {\n return this.finalStep.then((step) => {\n var _a21;\n const output = (_a21 = this.outputSpecification) != null ? _a21 : text();\n return output.parseCompleteOutput(\n { text: step.text },\n {\n response: step.response,\n usage: step.usage,\n finishReason: step.finishReason\n }\n );\n });\n }\n toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = getErrorMessage7\n } = {}) {\n const responseMessageId = generateMessageId != null ? getResponseUIMessageId({\n originalMessages,\n responseMessageId: generateMessageId\n }) : void 0;\n const isDynamic = (part) => {\n var _a21;\n const tool2 = (_a21 = this.tools) == null ? void 0 : _a21[part.toolName];\n if (tool2 == null) {\n return part.dynamic;\n }\n return (tool2 == null ? void 0 : tool2.type) === \"dynamic\" ? true : void 0;\n };\n const baseStream = this.fullStream.pipeThrough(\n new TransformStream({\n transform: async (part, controller) => {\n const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part });\n const partType = part.type;\n switch (partType) {\n case \"text-start\": {\n controller.enqueue({\n type: \"text-start\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-delta\": {\n controller.enqueue({\n type: \"text-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"text-end\": {\n controller.enqueue({\n type: \"text-end\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"reasoning-start\": {\n controller.enqueue({\n type: \"reasoning-start\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"reasoning-delta\": {\n if (sendReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"reasoning-end\": {\n controller.enqueue({\n type: \"reasoning-end\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"file\": {\n controller.enqueue({\n type: \"file\",\n mediaType: part.file.mediaType,\n url: `data:${part.file.mediaType};base64,${part.file.base64}`,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"source\": {\n if (sendSources && part.sourceType === \"url\") {\n controller.enqueue({\n type: \"source-url\",\n sourceId: part.id,\n url: part.url,\n title: part.title,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (sendSources && part.sourceType === \"document\") {\n controller.enqueue({\n type: \"source-document\",\n sourceId: part.id,\n mediaType: part.mediaType,\n title: part.title,\n filename: part.filename,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n break;\n }\n case \"tool-input-start\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-input-start\",\n toolCallId: part.id,\n toolName: part.toolName,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n break;\n }\n case \"tool-input-delta\": {\n controller.enqueue({\n type: \"tool-input-delta\",\n toolCallId: part.id,\n inputTextDelta: part.delta\n });\n break;\n }\n case \"tool-call\": {\n const dynamic = isDynamic(part);\n if (part.invalid) {\n controller.enqueue({\n type: \"tool-input-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n errorText: onError(part.error),\n ...part.title != null ? { title: part.title } : {}\n });\n } else {\n controller.enqueue({\n type: \"tool-input-available\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId\n });\n break;\n }\n case \"tool-result\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-available\",\n toolCallId: part.toolCallId,\n output: part.output,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.preliminary != null ? { preliminary: part.preliminary } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-error\": {\n const dynamic = isDynamic(part);\n controller.enqueue({\n type: \"tool-output-error\",\n toolCallId: part.toolCallId,\n errorText: part.providerExecuted ? typeof part.error === \"string\" ? part.error : JSON.stringify(part.error) : onError(part.error),\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...dynamic != null ? { dynamic } : {}\n });\n break;\n }\n case \"tool-output-denied\": {\n controller.enqueue({\n type: \"tool-output-denied\",\n toolCallId: part.toolCallId\n });\n break;\n }\n case \"error\": {\n controller.enqueue({\n type: \"error\",\n errorText: onError(part.error)\n });\n break;\n }\n case \"start-step\": {\n controller.enqueue({ type: \"start-step\" });\n break;\n }\n case \"finish-step\": {\n controller.enqueue({ type: \"finish-step\" });\n break;\n }\n case \"start\": {\n if (sendStart) {\n controller.enqueue({\n type: \"start\",\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},\n ...responseMessageId != null ? { messageId: responseMessageId } : {}\n });\n }\n break;\n }\n case \"finish\": {\n if (sendFinish) {\n controller.enqueue({\n type: \"finish\",\n finishReason: part.finishReason,\n ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}\n });\n }\n break;\n }\n case \"abort\": {\n controller.enqueue(part);\n break;\n }\n case \"tool-input-end\": {\n break;\n }\n case \"raw\": {\n break;\n }\n default: {\n const exhaustiveCheck = partType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n if (messageMetadataValue != null && partType !== \"start\" && partType !== \"finish\") {\n controller.enqueue({\n type: \"message-metadata\",\n messageMetadata: messageMetadataValue\n });\n }\n }\n })\n );\n return createAsyncIterableStream(\n handleUIMessageStreamFinish({\n stream: baseStream,\n messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(),\n originalMessages,\n onFinish,\n onError\n })\n );\n }\n pipeUIMessageStreamToResponse(response, {\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n pipeUIMessageStreamToResponse({\n response,\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toUIMessageStreamResponse({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/agent/tool-loop-agent.ts\nvar ToolLoopAgent = class {\n constructor(settings) {\n this.version = \"agent-v1\";\n this.settings = settings;\n }\n /**\n * The id of the agent.\n */\n get id() {\n return this.settings.id;\n }\n /**\n * The tools that the agent can use.\n */\n get tools() {\n return this.settings.tools;\n }\n async prepareCall(options) {\n var _a21, _b, _c, _d;\n const { onStepFinish: _settingsOnStepFinish, ...settingsWithoutCallback } = this.settings;\n const baseCallArgs = {\n ...settingsWithoutCallback,\n stopWhen: (_a21 = this.settings.stopWhen) != null ? _a21 : stepCountIs(20),\n ...options\n };\n const preparedCallArgs = (_d = await ((_c = (_b = this.settings).prepareCall) == null ? void 0 : _c.call(\n _b,\n baseCallArgs\n ))) != null ? _d : baseCallArgs;\n const { instructions, messages, prompt, ...callArgs } = preparedCallArgs;\n return {\n ...callArgs,\n // restore prompt types\n ...{ system: instructions, messages, prompt }\n };\n }\n mergeOnStepFinishCallbacks(methodCallback) {\n const constructorCallback = this.settings.onStepFinish;\n if (methodCallback && constructorCallback) {\n return async (stepResult) => {\n await constructorCallback(stepResult);\n await methodCallback(stepResult);\n };\n }\n return methodCallback != null ? methodCallback : constructorCallback;\n }\n /**\n * Generates an output from the agent (non-streaming).\n */\n async generate({\n abortSignal,\n timeout,\n onStepFinish,\n ...options\n }) {\n return generateText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n /**\n * Streams an output from the agent (streaming).\n */\n async stream({\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...options\n }) {\n return streamText({\n ...await this.prepareCall(options),\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish: this.mergeOnStepFinishCallbacks(onStepFinish)\n });\n }\n};\n\n// src/ui-message-stream/create-ui-message-stream.ts\nimport {\n generateId as generateIdFunc,\n getErrorMessage as getErrorMessage8\n} from \"@ai-sdk/provider-utils\";\nfunction createUIMessageStream({\n execute,\n onError = getErrorMessage8,\n originalMessages,\n onStepFinish,\n onFinish,\n generateId: generateId2 = generateIdFunc\n}) {\n let controller;\n const ongoingStreamPromises = [];\n const stream = new ReadableStream({\n start(controllerArg) {\n controller = controllerArg;\n }\n });\n function safeEnqueue(data) {\n try {\n controller.enqueue(data);\n } catch (error) {\n }\n }\n try {\n const result = execute({\n writer: {\n write(part) {\n safeEnqueue(part);\n },\n merge(streamArg) {\n ongoingStreamPromises.push(\n (async () => {\n const reader = streamArg.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n safeEnqueue(value);\n }\n })().catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n },\n onError\n }\n });\n if (result) {\n ongoingStreamPromises.push(\n result.catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n }\n } catch (error) {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n }\n const waitForStreams = new Promise(async (resolve3) => {\n while (ongoingStreamPromises.length > 0) {\n await ongoingStreamPromises.shift();\n }\n resolve3();\n });\n waitForStreams.finally(() => {\n try {\n controller.close();\n } catch (error) {\n }\n });\n return handleUIMessageStreamFinish({\n stream,\n messageId: generateId2(),\n originalMessages,\n onStepFinish,\n onFinish,\n onError\n });\n}\n\n// src/ui-message-stream/read-ui-message-stream.ts\nfunction readUIMessageStream({\n message,\n stream,\n onError,\n terminateOnError = false\n}) {\n var _a21;\n let controller;\n let hasErrored = false;\n const outputStream = new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n }\n });\n const state = createStreamingUIMessageState({\n messageId: (_a21 = message == null ? void 0 : message.id) != null ? _a21 : \"\",\n lastMessage: message\n });\n const handleError = (error) => {\n onError == null ? void 0 : onError(error);\n if (!hasErrored && terminateOnError) {\n hasErrored = true;\n controller == null ? void 0 : controller.error(error);\n }\n };\n consumeStream({\n stream: processUIMessageStream({\n stream,\n runUpdateMessageJob(job) {\n return job({\n state,\n write: () => {\n controller == null ? void 0 : controller.enqueue(structuredClone(state.message));\n }\n });\n },\n onError: handleError\n }),\n onError: handleError\n }).finally(() => {\n if (!hasErrored) {\n controller == null ? void 0 : controller.close();\n }\n });\n return createAsyncIterableStream(outputStream);\n}\n\n// src/ui/convert-to-model-messages.ts\nimport {\n isNonNullable\n} from \"@ai-sdk/provider-utils\";\nasync function convertToModelMessages(messages, options) {\n const modelMessages = [];\n if (options == null ? void 0 : options.ignoreIncompleteToolCalls) {\n messages = messages.map((message) => ({\n ...message,\n parts: message.parts.filter(\n (part) => !isToolUIPart(part) || part.state !== \"input-streaming\" && part.state !== \"input-available\"\n )\n }));\n }\n for (const message of messages) {\n switch (message.role) {\n case \"system\": {\n const textParts = message.parts.filter(\n (part) => part.type === \"text\"\n );\n const providerMetadata = textParts.reduce((acc, part) => {\n if (part.providerMetadata != null) {\n return { ...acc, ...part.providerMetadata };\n }\n return acc;\n }, {});\n modelMessages.push({\n role: \"system\",\n content: textParts.map((part) => part.text).join(\"\"),\n ...Object.keys(providerMetadata).length > 0 ? { providerOptions: providerMetadata } : {}\n });\n break;\n }\n case \"user\": {\n modelMessages.push({\n role: \"user\",\n content: message.parts.map((part) => {\n var _a21;\n if (isTextUIPart(part)) {\n return {\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isFileUIPart(part)) {\n return {\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isDataUIPart(part)) {\n return (_a21 = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _a21.call(\n options,\n part\n );\n }\n }).filter(isNonNullable)\n });\n break;\n }\n case \"assistant\": {\n if (message.parts != null) {\n let block = [];\n async function processBlock() {\n var _a21, _b, _c, _d, _e, _f, _g;\n if (block.length === 0) {\n return;\n }\n const content = [];\n for (const part of block) {\n if (isTextUIPart(part)) {\n content.push({\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isFileUIPart(part)) {\n content.push({\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.url,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isReasoningUIPart(part)) {\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n } else if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n if (part.state !== \"input-streaming\") {\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName,\n input: part.state === \"output-error\" ? (_a21 = part.input) != null ? _a21 : \"rawInput\" in part ? part.rawInput : void 0 : part.input,\n providerExecuted: part.providerExecuted,\n ...part.callProviderMetadata != null ? { providerOptions: part.callProviderMetadata } : {}\n });\n if (part.approval != null) {\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approval.id,\n toolCallId: part.toolCallId\n });\n }\n if (part.providerExecuted === true && part.state !== \"approval-responded\" && (part.state === \"output-available\" || part.state === \"output-error\")) {\n const resultProviderMetadata = (_b = part.resultProviderMetadata) != null ? _b : part.callProviderMetadata;\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n output: part.state === \"output-error\" ? part.errorText : part.output,\n tool: (_c = options == null ? void 0 : options.tools) == null ? void 0 : _c[toolName],\n errorMode: part.state === \"output-error\" ? \"json\" : \"none\"\n }),\n ...resultProviderMetadata != null ? { providerOptions: resultProviderMetadata } : {}\n });\n }\n }\n } else if (isDataUIPart(part)) {\n const dataPart = (_d = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _d.call(\n options,\n part\n );\n if (dataPart != null) {\n content.push(dataPart);\n }\n } else {\n const _exhaustiveCheck = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n modelMessages.push({\n role: \"assistant\",\n content\n });\n const toolParts = block.filter(\n (part) => {\n var _a22;\n return isToolUIPart(part) && (part.providerExecuted !== true || ((_a22 = part.approval) == null ? void 0 : _a22.approved) != null);\n }\n );\n if (toolParts.length > 0) {\n {\n const content2 = [];\n for (const toolPart of toolParts) {\n if (((_e = toolPart.approval) == null ? void 0 : _e.approved) != null) {\n content2.push({\n type: \"tool-approval-response\",\n approvalId: toolPart.approval.id,\n approved: toolPart.approval.approved,\n reason: toolPart.approval.reason,\n providerExecuted: toolPart.providerExecuted\n });\n }\n if (toolPart.providerExecuted === true) {\n continue;\n }\n switch (toolPart.state) {\n case \"output-denied\": {\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName: getToolName(toolPart),\n output: {\n type: \"error-text\",\n value: (_f = toolPart.approval.reason) != null ? _f : \"Tool execution denied.\"\n },\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n case \"output-error\":\n case \"output-available\": {\n const toolName = getToolName(toolPart);\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: toolPart.toolCallId,\n input: toolPart.input,\n output: toolPart.state === \"output-error\" ? toolPart.errorText : toolPart.output,\n tool: (_g = options == null ? void 0 : options.tools) == null ? void 0 : _g[toolName],\n errorMode: toolPart.state === \"output-error\" ? \"text\" : \"none\"\n }),\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n }\n }\n if (content2.length > 0) {\n modelMessages.push({\n role: \"tool\",\n content: content2\n });\n }\n }\n }\n block = [];\n }\n for (const part of message.parts) {\n if (isTextUIPart(part) || isReasoningUIPart(part) || isFileUIPart(part) || isToolUIPart(part) || isDataUIPart(part)) {\n block.push(part);\n } else if (part.type === \"step-start\") {\n await processBlock();\n }\n }\n await processBlock();\n break;\n }\n break;\n }\n default: {\n const _exhaustiveCheck = message.role;\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported role: ${_exhaustiveCheck}`\n });\n }\n }\n }\n return modelMessages;\n}\n\n// src/ui/validate-ui-messages.ts\nimport { TypeValidationError as TypeValidationError3 } from \"@ai-sdk/provider\";\nimport {\n lazySchema as lazySchema2,\n validateTypes as validateTypes2,\n zodSchema as zodSchema2\n} from \"@ai-sdk/provider-utils\";\nimport { z as z8 } from \"zod/v4\";\nvar uiMessagesSchema = lazySchema2(\n () => zodSchema2(\n z8.array(\n z8.object({\n id: z8.string(),\n role: z8.enum([\"system\", \"user\", \"assistant\"]),\n metadata: z8.unknown().optional(),\n parts: z8.array(\n z8.union([\n z8.object({\n type: z8.literal(\"text\"),\n text: z8.string(),\n state: z8.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"reasoning\"),\n text: z8.string(),\n state: z8.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"source-url\"),\n sourceId: z8.string(),\n url: z8.string(),\n title: z8.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"source-document\"),\n sourceId: z8.string(),\n mediaType: z8.string(),\n title: z8.string(),\n filename: z8.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"file\"),\n mediaType: z8.string(),\n filename: z8.string().optional(),\n url: z8.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z8.object({\n type: z8.literal(\"step-start\")\n }),\n z8.object({\n type: z8.string().startsWith(\"data-\"),\n id: z8.string().optional(),\n data: z8.unknown()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n state: z8.literal(\"input-streaming\"),\n input: z8.unknown().optional(),\n providerExecuted: z8.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n state: z8.literal(\"input-available\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n state: z8.literal(\"approval-requested\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.never().optional(),\n reason: z8.never().optional()\n })\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n state: z8.literal(\"approval-responded\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.boolean(),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n state: z8.literal(\"output-available\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.unknown(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z8.boolean().optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n state: z8.literal(\"output-error\"),\n input: z8.unknown(),\n rawInput: z8.unknown().optional(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.literal(\"dynamic-tool\"),\n toolName: z8.string(),\n toolCallId: z8.string(),\n state: z8.literal(\"output-denied\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(false),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n state: z8.literal(\"input-streaming\"),\n providerExecuted: z8.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n input: z8.unknown().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n state: z8.literal(\"input-available\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.never().optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n state: z8.literal(\"approval-requested\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.never().optional(),\n reason: z8.never().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n state: z8.literal(\"approval-responded\"),\n input: z8.unknown(),\n providerExecuted: z8.boolean().optional(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.boolean(),\n reason: z8.string().optional()\n })\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n state: z8.literal(\"output-available\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.unknown(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z8.boolean().optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n state: z8.literal(\"output-error\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n rawInput: z8.unknown().optional(),\n output: z8.never().optional(),\n errorText: z8.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(true),\n reason: z8.string().optional()\n }).optional()\n }),\n z8.object({\n type: z8.string().startsWith(\"tool-\"),\n toolCallId: z8.string(),\n state: z8.literal(\"output-denied\"),\n providerExecuted: z8.boolean().optional(),\n input: z8.unknown(),\n output: z8.never().optional(),\n errorText: z8.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z8.object({\n id: z8.string(),\n approved: z8.literal(false),\n reason: z8.string().optional()\n })\n })\n ])\n ).nonempty(\"Message must contain at least one part\")\n })\n ).nonempty(\"Messages array must not be empty\")\n )\n);\nasync function safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n try {\n if (messages == null) {\n return {\n success: false,\n error: new InvalidArgumentError({\n parameter: \"messages\",\n value: messages,\n message: \"messages parameter must be provided\"\n })\n };\n }\n const validatedMessages = await validateTypes2({\n value: messages,\n schema: uiMessagesSchema\n });\n if (metadataSchema) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n await validateTypes2({\n value: message.metadata,\n schema: metadataSchema,\n context: {\n field: `messages[${msgIdx}].metadata`,\n entityId: message.id\n }\n });\n }\n }\n if (dataSchemas || tools) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n for (const [partIdx, part] of message.parts.entries()) {\n if (dataSchemas && part.type.startsWith(\"data-\")) {\n const dataPart = part;\n const dataName = dataPart.type.slice(5);\n const dataSchema = dataSchemas[dataName];\n if (!dataSchema) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: dataPart.data,\n cause: `No data schema found for data part ${dataName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n })\n };\n }\n await validateTypes2({\n value: dataPart.data,\n schema: dataSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n });\n }\n if (tools && part.type.startsWith(\"tool-\")) {\n const toolPart = part;\n const toolName = toolPart.type.slice(5);\n const tool2 = tools[toolName];\n if (!tool2) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: toolPart.input,\n cause: `No tool schema found for tool part ${toolName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n })\n };\n }\n if (toolPart.state === \"input-available\" || toolPart.state === \"output-available\" || toolPart.state === \"output-error\" && toolPart.input !== void 0) {\n await validateTypes2({\n value: toolPart.input,\n schema: tool2.inputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n if (toolPart.state === \"output-available\" && tool2.outputSchema) {\n await validateTypes2({\n value: toolPart.output,\n schema: tool2.outputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].output`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n }\n }\n }\n }\n return {\n success: true,\n data: validatedMessages\n };\n } catch (error) {\n const err = error;\n return {\n success: false,\n error: err\n };\n }\n}\nasync function validateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n const response = await safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n });\n if (!response.success)\n throw response.error;\n return response.data;\n}\n\n// src/agent/create-agent-ui-stream.ts\nasync function createAgentUIStream({\n agent,\n uiMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish,\n ...uiMessageStreamOptions\n}) {\n var _a21;\n const validatedMessages = await validateUIMessages({\n messages: uiMessages,\n tools: agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: agent.tools\n });\n const result = await agent.stream({\n prompt: modelMessages,\n options,\n abortSignal,\n timeout,\n experimental_transform,\n onStepFinish\n });\n return result.toUIMessageStream({\n ...uiMessageStreamOptions,\n // TODO reading `originalMessages` is here for bc, always use `validatedMessages` in v7\n originalMessages: (_a21 = uiMessageStreamOptions.originalMessages) != null ? _a21 : validatedMessages\n });\n}\n\n// src/agent/create-agent-ui-stream-response.ts\nasync function createAgentUIStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n return createUIMessageStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/agent/pipe-agent-ui-stream-to-response.ts\nasync function pipeAgentUIStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n pipeUIMessageStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/embed/embed.ts\nimport { withUserAgentSuffix as withUserAgentSuffix3 } from \"@ai-sdk/provider-utils\";\nasync function embed({\n model: modelArg,\n value,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix3(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embed\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.value\": { input: () => JSON.stringify(value) }\n }\n }),\n tracer,\n fn: async (span) => {\n const { embedding, usage, warnings, response, providerMetadata } = await retry(\n () => (\n // nested spans to align with the embedMany telemetry data:\n recordSpan({\n name: \"ai.embed.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embed.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": { input: () => [JSON.stringify(value)] }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a21;\n const modelResponse = await model.doEmbed({\n values: [value],\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embedding2 = modelResponse.embeddings[0];\n const usage2 = (_a21 = modelResponse.usage) != null ? _a21 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => modelResponse.embeddings.map(\n (embedding3) => JSON.stringify(embedding3)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embedding: embedding2,\n usage: usage2,\n warnings: modelResponse.warnings,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n })\n )\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embedding\": { output: () => JSON.stringify(embedding) },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n return new DefaultEmbedResult({\n value,\n embedding,\n usage,\n warnings,\n providerMetadata,\n response\n });\n }\n });\n}\nvar DefaultEmbedResult = class {\n constructor(options) {\n this.value = options.value;\n this.embedding = options.embedding;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n }\n};\n\n// src/embed/embed-many.ts\nimport { withUserAgentSuffix as withUserAgentSuffix4 } from \"@ai-sdk/provider-utils\";\n\n// src/util/split-array.ts\nfunction splitArray(array2, chunkSize) {\n if (chunkSize <= 0) {\n throw new Error(\"chunkSize must be greater than 0\");\n }\n const result = [];\n for (let i = 0; i < array2.length; i += chunkSize) {\n result.push(array2.slice(i, i + chunkSize));\n }\n return result;\n}\n\n// src/embed/embed-many.ts\nasync function embedMany({\n model: modelArg,\n values,\n maxParallelCalls = Infinity,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix4(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.embedMany\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.embedMany\", telemetry }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([\n model.maxEmbeddingsPerCall,\n model.supportsParallelCalls\n ]);\n if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {\n const { embeddings: embeddings2, usage, warnings: warnings2, response, providerMetadata: providerMetadata2 } = await retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => values.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22;\n const modelResponse = await model.doEmbed({\n values,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings3 = modelResponse.embeddings;\n const usage2 = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings3.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage2.tokens\n }\n })\n );\n return {\n embeddings: embeddings3,\n usage: usage2,\n warnings: modelResponse.warnings,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n logWarnings({\n warnings: warnings2,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings: embeddings2,\n usage,\n warnings: warnings2,\n providerMetadata: providerMetadata2,\n responses: [response]\n });\n }\n const valueChunks = splitArray(values, maxEmbeddingsPerCall);\n const embeddings = [];\n const warnings = [];\n const responses = [];\n let tokens = 0;\n let providerMetadata;\n const parallelChunks = splitArray(\n valueChunks,\n supportsParallelCalls ? maxParallelCalls : 1\n );\n for (const parallelChunk of parallelChunks) {\n const results = await Promise.all(\n parallelChunk.map((chunk) => {\n return retry(() => {\n return recordSpan({\n name: \"ai.embedMany.doEmbed\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.embedMany.doEmbed\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.values\": {\n input: () => chunk.map((value) => JSON.stringify(value))\n }\n }\n }),\n tracer,\n fn: async (doEmbedSpan) => {\n var _a22;\n const modelResponse = await model.doEmbed({\n values: chunk,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings2 = modelResponse.embeddings;\n const usage = (_a22 = modelResponse.usage) != null ? _a22 : { tokens: NaN };\n doEmbedSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings2.map(\n (embedding) => JSON.stringify(embedding)\n )\n },\n \"ai.usage.tokens\": usage.tokens\n }\n })\n );\n return {\n embeddings: embeddings2,\n usage,\n warnings: modelResponse.warnings,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n }\n });\n });\n })\n );\n for (const result of results) {\n embeddings.push(...result.embeddings);\n warnings.push(...result.warnings);\n responses.push(result.response);\n tokens += result.usage.tokens;\n if (result.providerMetadata) {\n if (!providerMetadata) {\n providerMetadata = { ...result.providerMetadata };\n } else {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n providerMetadata[providerName] = {\n ...(_a21 = providerMetadata[providerName]) != null ? _a21 : {},\n ...metadata\n };\n }\n }\n }\n }\n }\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.embeddings\": {\n output: () => embeddings.map((embedding) => JSON.stringify(embedding))\n },\n \"ai.usage.tokens\": tokens\n }\n })\n );\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage: { tokens },\n warnings,\n providerMetadata,\n responses\n });\n }\n });\n}\nvar DefaultEmbedManyResult = class {\n constructor(options) {\n this.values = options.values;\n this.embeddings = options.embeddings;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.responses = options.responses;\n }\n};\n\n// src/generate-image/generate-image.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array4,\n withUserAgentSuffix as withUserAgentSuffix5\n} from \"@ai-sdk/provider-utils\";\nasync function generateImage({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxImagesPerCall,\n size,\n aspectRatio,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21, _b;\n const model = resolveImageModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix5(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const maxImagesPerCallWithDefault = (_a21 = maxImagesPerCall != null ? maxImagesPerCall : await invokeModelMaxImagesPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxImagesPerCallWithDefault);\n const callImageCounts = Array.from({ length: callCount }, (_, i) => {\n if (i < callCount - 1) {\n return maxImagesPerCallWithDefault;\n }\n const remainder = n % maxImagesPerCallWithDefault;\n return remainder === 0 ? maxImagesPerCallWithDefault : remainder;\n });\n const results = await Promise.all(\n callImageCounts.map(\n async (callImageCount) => retry(() => {\n const { prompt, files, mask } = normalizePrompt(promptArg);\n return model.doGenerate({\n prompt,\n files,\n mask,\n n: callImageCount,\n abortSignal,\n headers: headersWithUserAgent,\n size,\n aspectRatio,\n seed,\n providerOptions: providerOptions != null ? providerOptions : {}\n });\n })\n )\n );\n const images = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n let totalUsage = {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0\n };\n for (const result of results) {\n images.push(\n ...result.images.map(\n (image) => {\n var _a22;\n return new DefaultGeneratedFile({\n data: image,\n mediaType: (_a22 = detectMediaType({\n data: image,\n signatures: imageMediaTypeSignatures\n })) != null ? _a22 : \"image/png\"\n });\n }\n )\n );\n warnings.push(...result.warnings);\n if (result.usage != null) {\n totalUsage = addImageModelUsage(totalUsage, result.usage);\n }\n if (result.providerMetadata) {\n for (const [providerName, metadata] of Object.entries(result.providerMetadata)) {\n if (providerName === \"gateway\") {\n const currentEntry = providerMetadata[providerName];\n if (currentEntry != null && typeof currentEntry === \"object\") {\n providerMetadata[providerName] = {\n ...currentEntry,\n ...metadata\n };\n } else {\n providerMetadata[providerName] = metadata;\n }\n const imagesValue = providerMetadata[providerName].images;\n if (Array.isArray(imagesValue) && imagesValue.length === 0) {\n delete providerMetadata[providerName].images;\n }\n } else {\n (_b = providerMetadata[providerName]) != null ? _b : providerMetadata[providerName] = { images: [] };\n providerMetadata[providerName].images.push(\n ...result.providerMetadata[providerName].images\n );\n }\n }\n }\n responses.push(result.response);\n }\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n if (!images.length) {\n throw new NoImageGeneratedError({ responses });\n }\n return new DefaultGenerateImageResult({\n images,\n warnings,\n responses,\n providerMetadata,\n usage: totalUsage\n });\n}\nvar DefaultGenerateImageResult = class {\n constructor(options) {\n this.images = options.images;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata;\n this.usage = options.usage;\n }\n get image() {\n return this.images[0];\n }\n};\nasync function invokeModelMaxImagesPerCall(model) {\n const isFunction = model.maxImagesPerCall instanceof Function;\n if (!isFunction) {\n return model.maxImagesPerCall;\n }\n return model.maxImagesPerCall({\n modelId: model.modelId\n });\n}\nfunction normalizePrompt(prompt) {\n if (typeof prompt === \"string\") {\n return { prompt, files: void 0, mask: void 0 };\n }\n return {\n prompt: prompt.text,\n files: prompt.images.map(toImageModelV3File),\n mask: prompt.mask ? toImageModelV3File(prompt.mask) : void 0\n };\n}\nfunction toImageModelV3File(dataContent) {\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"http\")) {\n return {\n type: \"url\",\n url: dataContent\n };\n }\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"data:\")) {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(dataContent);\n if (base64Content != null) {\n const uint8Data2 = convertBase64ToUint8Array4(base64Content);\n return {\n type: \"file\",\n data: uint8Data2,\n mediaType: dataUrlMediaType || detectMediaType({\n data: uint8Data2,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n }\n }\n const uint8Data = convertDataContentToUint8Array(dataContent);\n return {\n type: \"file\",\n data: uint8Data,\n mediaType: detectMediaType({\n data: uint8Data,\n signatures: imageMediaTypeSignatures\n }) || \"image/png\"\n };\n}\n\n// src/generate-image/index.ts\nvar experimental_generateImage = generateImage;\n\n// src/generate-object/generate-object.ts\nimport {\n createIdGenerator as createIdGenerator3,\n withUserAgentSuffix as withUserAgentSuffix6\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-object/output-strategy.ts\nimport {\n isJSONArray,\n isJSONObject,\n TypeValidationError as TypeValidationError4,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError3\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema4,\n safeValidateTypes as safeValidateTypes4\n} from \"@ai-sdk/provider-utils\";\nvar noSchemaOutputStrategy = {\n type: \"no-schema\",\n jsonSchema: async () => void 0,\n async validatePartialResult({ value, textDelta }) {\n return { success: true, value: { partial: value, textDelta } };\n },\n async validateFinalResult(value, context2) {\n return value === void 0 ? {\n success: false,\n error: new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n text: context2.text,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n })\n } : { success: true, value };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in no-schema mode\"\n });\n }\n};\nvar objectOutputStrategy = (schema) => ({\n type: \"object\",\n jsonSchema: async () => await schema.jsonSchema,\n async validatePartialResult({ value, textDelta }) {\n return {\n success: true,\n value: {\n // Note: currently no validation of partial results:\n partial: value,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n return safeValidateTypes4({ value, schema });\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in object mode\"\n });\n }\n});\nvar arrayOutputStrategy = (schema) => {\n return {\n type: \"array\",\n // wrap in object that contains array of elements, since most LLMs will not\n // be able to generate an array directly:\n // possible future optimization: use arrays directly when model supports grammar-guided generation\n jsonSchema: async () => {\n const { $schema, ...itemSchema } = await schema.jsonSchema;\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n };\n },\n async validatePartialResult({\n value,\n latestObject,\n isFirstDelta,\n isFinalDelta\n }) {\n var _a21;\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n const resultArray = [];\n for (let i = 0; i < inputArray.length; i++) {\n const element = inputArray[i];\n const result = await safeValidateTypes4({ value: element, schema });\n if (i === inputArray.length - 1 && !isFinalDelta) {\n continue;\n }\n if (!result.success) {\n return result;\n }\n resultArray.push(result.value);\n }\n const publishedElementCount = (_a21 = latestObject == null ? void 0 : latestObject.length) != null ? _a21 : 0;\n let textDelta = \"\";\n if (isFirstDelta) {\n textDelta += \"[\";\n }\n if (publishedElementCount > 0) {\n textDelta += \",\";\n }\n textDelta += resultArray.slice(publishedElementCount).map((element) => JSON.stringify(element)).join(\",\");\n if (isFinalDelta) {\n textDelta += \"]\";\n }\n return {\n success: true,\n value: {\n partial: resultArray,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n for (const element of inputArray) {\n const result = await safeValidateTypes4({ value: element, schema });\n if (!result.success) {\n return result;\n }\n }\n return { success: true, value: inputArray };\n },\n createElementStream(originalStream) {\n let publishedElements = 0;\n return createAsyncIterableStream(\n originalStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\": {\n const array2 = chunk.object;\n for (; publishedElements < array2.length; publishedElements++) {\n controller.enqueue(array2[publishedElements]);\n }\n break;\n }\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(\n `Unsupported chunk type: ${_exhaustiveCheck}`\n );\n }\n }\n }\n })\n )\n );\n }\n };\n};\nvar enumOutputStrategy = (enumValues) => {\n return {\n type: \"enum\",\n // wrap in object that contains result, since most LLMs will not\n // be able to generate an enum value directly:\n // possible future optimization: use enums directly when model supports top-level enums\n jsonSchema: async () => ({\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: enumValues }\n },\n required: [\"result\"],\n additionalProperties: false\n }),\n async validateFinalResult(value) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n return enumValues.includes(result) ? { success: true, value: result } : {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n },\n async validatePartialResult({ value, textDelta }) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n const possibleEnumValues = enumValues.filter(\n (enumValue) => enumValue.startsWith(result)\n );\n if (value.result.length === 0 || possibleEnumValues.length === 0) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n }\n return {\n success: true,\n value: {\n partial: possibleEnumValues.length > 1 ? result : possibleEnumValues[0],\n textDelta\n }\n };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in enum mode\"\n });\n }\n };\n};\nfunction getOutputStrategy({\n output,\n schema,\n enumValues\n}) {\n switch (output) {\n case \"object\":\n return objectOutputStrategy(asSchema4(schema));\n case \"array\":\n return arrayOutputStrategy(asSchema4(schema));\n case \"enum\":\n return enumOutputStrategy(enumValues);\n case \"no-schema\":\n return noSchemaOutputStrategy;\n default: {\n const _exhaustiveCheck = output;\n throw new Error(`Unsupported output: ${_exhaustiveCheck}`);\n }\n }\n}\n\n// src/generate-object/parse-and-validate-object-result.ts\nimport { JSONParseError as JSONParseError2, TypeValidationError as TypeValidationError5 } from \"@ai-sdk/provider\";\nimport { safeParseJSON as safeParseJSON4 } from \"@ai-sdk/provider-utils\";\nasync function parseAndValidateObjectResult(result, outputStrategy, context2) {\n const parseResult = await safeParseJSON4({ text: result });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n const validationResult = await outputStrategy.validateFinalResult(\n parseResult.value,\n {\n text: result,\n response: context2.response,\n usage: context2.usage\n }\n );\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: result,\n response: context2.response,\n usage: context2.usage,\n finishReason: context2.finishReason\n });\n }\n return validationResult.value;\n}\nasync function parseAndValidateObjectResultWithRepair(result, outputStrategy, repairText, context2) {\n try {\n return await parseAndValidateObjectResult(result, outputStrategy, context2);\n } catch (error) {\n if (repairText != null && NoObjectGeneratedError.isInstance(error) && (JSONParseError2.isInstance(error.cause) || TypeValidationError5.isInstance(error.cause))) {\n const repairedText = await repairText({\n text: result,\n error: error.cause\n });\n if (repairedText === null) {\n throw error;\n }\n return await parseAndValidateObjectResult(\n repairedText,\n outputStrategy,\n context2\n );\n }\n throw error;\n }\n}\n\n// src/generate-object/validate-object-generation-input.ts\nfunction validateObjectGenerationInput({\n output,\n schema,\n schemaName,\n schemaDescription,\n enumValues\n}) {\n if (output != null && output !== \"object\" && output !== \"array\" && output !== \"enum\" && output !== \"no-schema\") {\n throw new InvalidArgumentError({\n parameter: \"output\",\n value: output,\n message: \"Invalid output type.\"\n });\n }\n if (output === \"no-schema\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for no-schema output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for no-schema output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for no-schema output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for no-schema output.\"\n });\n }\n }\n if (output === \"object\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is required for object output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for object output.\"\n });\n }\n }\n if (output === \"array\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Element schema is required for array output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for array output.\"\n });\n }\n }\n if (output === \"enum\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for enum output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for enum output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for enum output.\"\n });\n }\n if (enumValues == null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are required for enum output.\"\n });\n }\n for (const value of enumValues) {\n if (typeof value !== \"string\") {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value,\n message: \"Enum values must be strings.\"\n });\n }\n }\n }\n}\n\n// src/generate-object/generate-object.ts\nvar originalGenerateId3 = createIdGenerator3({ prefix: \"aiobj\", size: 24 });\nasync function generateObject(options) {\n const {\n model: modelArg,\n output = \"object\",\n system,\n prompt,\n messages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n _internal: {\n generateId: generateId2 = originalGenerateId3,\n currentDate = () => /* @__PURE__ */ new Date()\n } = {},\n ...settings\n } = options;\n const model = resolveLanguageModel(modelArg);\n const enumValues = \"enum\" in options ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n const callSettings = prepareCallSettings(settings);\n const headersWithUserAgent = withUserAgentSuffix6(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers: headersWithUserAgent,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const jsonSchema2 = await outputStrategy.jsonSchema();\n try {\n return await recordSpan({\n name: \"ai.generateObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": jsonSchema2 != null ? { input: () => JSON.stringify(jsonSchema2) } : void 0,\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n fn: async (span) => {\n var _a21;\n let result;\n let finishReason;\n let usage;\n let warnings;\n let response;\n let request;\n let resultProviderMetadata;\n let reasoning;\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n });\n const generateResult = await retry(\n () => recordSpan({\n name: \"ai.generateObject.doGenerate\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.generateObject.doGenerate\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(promptMessages)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n fn: async (span2) => {\n var _a22, _b, _c, _d, _e, _f, _g, _h;\n const result2 = await model.doGenerate({\n responseFormat: {\n type: \"json\",\n schema: jsonSchema2,\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers: headersWithUserAgent\n });\n const responseData = {\n id: (_b = (_a22 = result2.response) == null ? void 0 : _a22.id) != null ? _b : generateId2(),\n timestamp: (_d = (_c = result2.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(),\n modelId: (_f = (_e = result2.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId,\n headers: (_g = result2.response) == null ? void 0 : _g.headers,\n body: (_h = result2.response) == null ? void 0 : _h.body\n };\n const text2 = extractTextContent(result2.content);\n const reasoning2 = extractReasoningContent(result2.content);\n if (text2 === void 0) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: the model did not return a response.\",\n response: responseData,\n usage: asLanguageModelUsage(result2.usage),\n finishReason: result2.finishReason.unified\n });\n }\n span2.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": result2.finishReason.unified,\n \"ai.response.object\": { output: () => text2 },\n \"ai.response.id\": responseData.id,\n \"ai.response.model\": responseData.modelId,\n \"ai.response.timestamp\": responseData.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(\n result2.providerMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": result2.usage.inputTokens.total,\n \"ai.usage.completionTokens\": result2.usage.outputTokens.total,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [\n result2.finishReason.unified\n ],\n \"gen_ai.response.id\": responseData.id,\n \"gen_ai.response.model\": responseData.modelId,\n \"gen_ai.usage.input_tokens\": result2.usage.inputTokens.total,\n \"gen_ai.usage.output_tokens\": result2.usage.outputTokens.total\n }\n })\n );\n return {\n ...result2,\n objectText: text2,\n reasoning: reasoning2,\n responseData\n };\n }\n })\n );\n result = generateResult.objectText;\n finishReason = generateResult.finishReason.unified;\n usage = asLanguageModelUsage(generateResult.usage);\n warnings = generateResult.warnings;\n resultProviderMetadata = generateResult.providerMetadata;\n request = (_a21 = generateResult.request) != null ? _a21 : {};\n response = generateResult.responseData;\n reasoning = generateResult.reasoning;\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n const object2 = await parseAndValidateObjectResultWithRepair(\n result,\n outputStrategy,\n repairText,\n {\n response,\n usage,\n finishReason\n }\n );\n span.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(\n resultProviderMetadata\n ),\n // TODO rename telemetry attributes to inputTokens and outputTokens\n \"ai.usage.promptTokens\": usage.inputTokens,\n \"ai.usage.completionTokens\": usage.outputTokens\n }\n })\n );\n return new DefaultGenerateObjectResult({\n object: object2,\n reasoning,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata\n });\n }\n });\n } catch (error) {\n throw wrapGatewayError(error);\n }\n}\nvar DefaultGenerateObjectResult = class {\n constructor(options) {\n this.object = options.object;\n this.finishReason = options.finishReason;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n this.request = options.request;\n this.reasoning = options.reasoning;\n }\n toJsonResponse(init) {\n var _a21;\n return new Response(JSON.stringify(this.object), {\n status: (_a21 = init == null ? void 0 : init.status) != null ? _a21 : 200,\n headers: prepareHeaders(init == null ? void 0 : init.headers, {\n \"content-type\": \"application/json; charset=utf-8\"\n })\n });\n }\n};\n\n// src/generate-object/stream-object.ts\nimport {\n createIdGenerator as createIdGenerator4,\n DelayedPromise as DelayedPromise2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/cosine-similarity.ts\nfunction cosineSimilarity(vector1, vector2) {\n if (vector1.length !== vector2.length) {\n throw new InvalidArgumentError({\n parameter: \"vector1,vector2\",\n value: { vector1Length: vector1.length, vector2Length: vector2.length },\n message: `Vectors must have the same length`\n });\n }\n const n = vector1.length;\n if (n === 0) {\n return 0;\n }\n let magnitudeSquared1 = 0;\n let magnitudeSquared2 = 0;\n let dotProduct = 0;\n for (let i = 0; i < n; i++) {\n const value1 = vector1[i];\n const value2 = vector2[i];\n magnitudeSquared1 += value1 * value1;\n magnitudeSquared2 += value2 * value2;\n dotProduct += value1 * value2;\n }\n return magnitudeSquared1 === 0 || magnitudeSquared2 === 0 ? 0 : dotProduct / (Math.sqrt(magnitudeSquared1) * Math.sqrt(magnitudeSquared2));\n}\n\n// src/util/download/create-download.ts\nfunction createDownload(options) {\n return ({ url, abortSignal }) => download({ url, maxBytes: options == null ? void 0 : options.maxBytes, abortSignal });\n}\n\n// src/util/data-url.ts\nfunction getTextFromDataUrl(dataUrl) {\n const [header, base64Content] = dataUrl.split(\",\");\n const mediaType = header.split(\";\")[0].split(\":\")[1];\n if (mediaType == null || base64Content == null) {\n throw new Error(\"Invalid data URL format\");\n }\n try {\n return window.atob(base64Content);\n } catch (error) {\n throw new Error(`Error decoding data URL`);\n }\n}\n\n// src/util/is-deep-equal-data.ts\nfunction isDeepEqualData(obj1, obj2) {\n if (obj1 === obj2)\n return true;\n if (obj1 == null || obj2 == null)\n return false;\n if (typeof obj1 !== \"object\" && typeof obj2 !== \"object\")\n return obj1 === obj2;\n if (obj1.constructor !== obj2.constructor)\n return false;\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length)\n return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!isDeepEqualData(obj1[i], obj2[i]))\n return false;\n }\n return true;\n }\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length)\n return false;\n for (const key of keys1) {\n if (!keys2.includes(key))\n return false;\n if (!isDeepEqualData(obj1[key], obj2[key]))\n return false;\n }\n return true;\n}\n\n// src/util/serial-job-executor.ts\nvar SerialJobExecutor = class {\n constructor() {\n this.queue = [];\n this.isProcessing = false;\n }\n async processQueue() {\n if (this.isProcessing) {\n return;\n }\n this.isProcessing = true;\n while (this.queue.length > 0) {\n await this.queue[0]();\n this.queue.shift();\n }\n this.isProcessing = false;\n }\n async run(job) {\n return new Promise((resolve3, reject) => {\n this.queue.push(async () => {\n try {\n await job();\n resolve3();\n } catch (error) {\n reject(error);\n }\n });\n void this.processQueue();\n });\n }\n};\n\n// src/util/simulate-readable-stream.ts\nimport { delay as delayFunction } from \"@ai-sdk/provider-utils\";\nfunction simulateReadableStream({\n chunks,\n initialDelayInMs = 0,\n chunkDelayInMs = 0,\n _internal\n}) {\n var _a21;\n const delay2 = (_a21 = _internal == null ? void 0 : _internal.delay) != null ? _a21 : delayFunction;\n let index = 0;\n return new ReadableStream({\n async pull(controller) {\n if (index < chunks.length) {\n await delay2(index === 0 ? initialDelayInMs : chunkDelayInMs);\n controller.enqueue(chunks[index++]);\n } else {\n controller.close();\n }\n }\n });\n}\n\n// src/generate-object/stream-object.ts\nvar originalGenerateId4 = createIdGenerator4({ prefix: \"aiobj\", size: 24 });\nfunction streamObject(options) {\n const {\n model,\n output = \"object\",\n system,\n prompt,\n messages,\n maxRetries,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry: telemetry,\n experimental_download: download2,\n providerOptions,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n _internal: {\n generateId: generateId2 = originalGenerateId4,\n currentDate = () => /* @__PURE__ */ new Date(),\n now: now2 = now\n } = {},\n ...settings\n } = options;\n const enumValues = \"enum\" in options && options.enum ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n return new DefaultStreamObjectResult({\n model,\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n });\n}\nvar DefaultStreamObjectResult = class {\n constructor({\n model: modelArg,\n headers,\n telemetry,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n outputStrategy,\n system,\n prompt,\n messages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n }) {\n this._object = new DelayedPromise2();\n this._usage = new DelayedPromise2();\n this._providerMetadata = new DelayedPromise2();\n this._warnings = new DelayedPromise2();\n this._request = new DelayedPromise2();\n this._response = new DelayedPromise2();\n this._finishReason = new DelayedPromise2();\n const model = resolveLanguageModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const callSettings = prepareCallSettings(settings);\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { ...callSettings, maxRetries }\n });\n const tracer = getTracer(telemetry);\n const self = this;\n const stitchableStream = createStitchableStream();\n const eventProcessor = new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n if (chunk.type === \"error\") {\n onError({ error: wrapGatewayError(chunk.error) });\n }\n }\n });\n this.baseStream = stitchableStream.stream.pipeThrough(eventProcessor);\n recordSpan({\n name: \"ai.streamObject\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.prompt\": {\n input: () => JSON.stringify({ system, prompt, messages })\n },\n \"ai.schema\": {\n input: async () => JSON.stringify(await outputStrategy.jsonSchema())\n },\n \"ai.schema.name\": schemaName,\n \"ai.schema.description\": schemaDescription,\n \"ai.settings.output\": outputStrategy.type\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (rootSpan) => {\n const standardizedPrompt = await standardizePrompt({\n system,\n prompt,\n messages\n });\n const callOptions = {\n responseFormat: {\n type: \"json\",\n schema: await outputStrategy.jsonSchema(),\n name: schemaName,\n description: schemaDescription\n },\n ...prepareCallSettings(settings),\n prompt: await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2\n }),\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks: false\n };\n const transformer = {\n transform: (chunk, controller) => {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.delta);\n break;\n case \"response-metadata\":\n case \"finish\":\n case \"error\":\n case \"stream-start\":\n controller.enqueue(chunk);\n break;\n }\n }\n };\n const {\n result: { stream, response, request },\n doStreamSpan,\n startTimestampMs\n } = await retry(\n () => recordSpan({\n name: \"ai.streamObject.doStream\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.streamObject.doStream\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n \"ai.prompt.messages\": {\n input: () => stringifyForTelemetry(callOptions.prompt)\n },\n // standardized gen-ai llm span attributes:\n \"gen_ai.system\": model.provider,\n \"gen_ai.request.model\": model.modelId,\n \"gen_ai.request.frequency_penalty\": callSettings.frequencyPenalty,\n \"gen_ai.request.max_tokens\": callSettings.maxOutputTokens,\n \"gen_ai.request.presence_penalty\": callSettings.presencePenalty,\n \"gen_ai.request.temperature\": callSettings.temperature,\n \"gen_ai.request.top_k\": callSettings.topK,\n \"gen_ai.request.top_p\": callSettings.topP\n }\n }),\n tracer,\n endWhenDone: false,\n fn: async (doStreamSpan2) => ({\n startTimestampMs: now2(),\n doStreamSpan: doStreamSpan2,\n result: await model.doStream(callOptions)\n })\n })\n );\n self._request.resolve(request != null ? request : {});\n let warnings;\n let usage = createNullLanguageModelUsage();\n let finishReason;\n let providerMetadata;\n let object2;\n let error;\n let accumulatedText = \"\";\n let textDelta = \"\";\n let fullResponse = {\n id: generateId2(),\n timestamp: currentDate(),\n modelId: model.modelId\n };\n let latestObjectJson = void 0;\n let latestObject = void 0;\n let isFirstChunk = true;\n let isFirstDelta = true;\n const transformedStream = stream.pipeThrough(new TransformStream(transformer)).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a21, _b, _c;\n if (typeof chunk === \"object\" && chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (isFirstChunk) {\n const msToFirstChunk = now2() - startTimestampMs;\n isFirstChunk = false;\n doStreamSpan.addEvent(\"ai.stream.firstChunk\", {\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n doStreamSpan.setAttributes({\n \"ai.stream.msToFirstChunk\": msToFirstChunk\n });\n }\n if (typeof chunk === \"string\") {\n accumulatedText += chunk;\n textDelta += chunk;\n const { value: currentObjectJson, state: parseState } = await parsePartialJson(accumulatedText);\n if (currentObjectJson !== void 0 && !isDeepEqualData(latestObjectJson, currentObjectJson)) {\n const validationResult = await outputStrategy.validatePartialResult({\n value: currentObjectJson,\n textDelta,\n latestObject,\n isFirstDelta,\n isFinalDelta: parseState === \"successful-parse\"\n });\n if (validationResult.success && !isDeepEqualData(\n latestObject,\n validationResult.value.partial\n )) {\n latestObjectJson = currentObjectJson;\n latestObject = validationResult.value.partial;\n controller.enqueue({\n type: \"object\",\n object: latestObject\n });\n controller.enqueue({\n type: \"text-delta\",\n textDelta: validationResult.value.textDelta\n });\n textDelta = \"\";\n isFirstDelta = false;\n }\n }\n return;\n }\n switch (chunk.type) {\n case \"response-metadata\": {\n fullResponse = {\n id: (_a21 = chunk.id) != null ? _a21 : fullResponse.id,\n timestamp: (_b = chunk.timestamp) != null ? _b : fullResponse.timestamp,\n modelId: (_c = chunk.modelId) != null ? _c : fullResponse.modelId\n };\n break;\n }\n case \"finish\": {\n if (textDelta !== \"\") {\n controller.enqueue({ type: \"text-delta\", textDelta });\n }\n finishReason = chunk.finishReason.unified;\n usage = asLanguageModelUsage(chunk.usage);\n providerMetadata = chunk.providerMetadata;\n controller.enqueue({\n ...chunk,\n finishReason: chunk.finishReason.unified,\n usage,\n response: fullResponse\n });\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n self._usage.resolve(usage);\n self._providerMetadata.resolve(providerMetadata);\n self._warnings.resolve(warnings);\n self._response.resolve({\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n });\n self._finishReason.resolve(finishReason != null ? finishReason : \"other\");\n try {\n object2 = await parseAndValidateObjectResultWithRepair(\n accumulatedText,\n outputStrategy,\n repairText,\n {\n response: fullResponse,\n usage,\n finishReason\n }\n );\n self._object.resolve(object2);\n } catch (e) {\n error = e;\n self._object.reject(e);\n }\n break;\n }\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n // invoke onFinish callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n try {\n const finalUsage = usage != null ? usage : {\n promptTokens: NaN,\n completionTokens: NaN,\n totalTokens: NaN\n };\n doStreamSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.response.finishReason\": finishReason,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.id\": fullResponse.id,\n \"ai.response.model\": fullResponse.modelId,\n \"ai.response.timestamp\": fullResponse.timestamp.toISOString(),\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata),\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n // standardized gen-ai llm span attributes:\n \"gen_ai.response.finish_reasons\": [finishReason],\n \"gen_ai.response.id\": fullResponse.id,\n \"gen_ai.response.model\": fullResponse.modelId,\n \"gen_ai.usage.input_tokens\": finalUsage.inputTokens,\n \"gen_ai.usage.output_tokens\": finalUsage.outputTokens\n }\n })\n );\n doStreamSpan.end();\n rootSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.usage.inputTokens\": finalUsage.inputTokens,\n \"ai.usage.outputTokens\": finalUsage.outputTokens,\n \"ai.usage.totalTokens\": finalUsage.totalTokens,\n \"ai.usage.reasoningTokens\": finalUsage.reasoningTokens,\n \"ai.usage.cachedInputTokens\": finalUsage.cachedInputTokens,\n \"ai.response.object\": {\n output: () => JSON.stringify(object2)\n },\n \"ai.response.providerMetadata\": JSON.stringify(providerMetadata)\n }\n })\n );\n await (onFinish == null ? void 0 : onFinish({\n usage: finalUsage,\n object: object2,\n error,\n response: {\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n },\n warnings,\n providerMetadata\n }));\n } catch (error2) {\n controller.enqueue({ type: \"error\", error: error2 });\n } finally {\n rootSpan.end();\n }\n }\n })\n );\n stitchableStream.addStream(transformedStream);\n }\n }).catch((error) => {\n stitchableStream.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n }).finally(() => {\n stitchableStream.close();\n });\n this.outputStrategy = outputStrategy;\n }\n get object() {\n return this._object.promise;\n }\n get usage() {\n return this._usage.promise;\n }\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n get warnings() {\n return this._warnings.promise;\n }\n get request() {\n return this._request.promise;\n }\n get response() {\n return this._response.promise;\n }\n get finishReason() {\n return this._finishReason.promise;\n }\n get partialObjectStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\":\n controller.enqueue(chunk.object);\n break;\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get elementStream() {\n return this.outputStrategy.createElementStream(this.baseStream);\n }\n get textStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.textDelta);\n break;\n case \"object\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(this.baseStream);\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n textStream: this.textStream,\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n textStream: this.textStream,\n ...init\n });\n }\n};\n\n// src/generate-speech/generate-speech.ts\nimport { withUserAgentSuffix as withUserAgentSuffix7 } from \"@ai-sdk/provider-utils\";\n\n// src/generate-speech/generated-audio-file.ts\nvar DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {\n constructor({\n data,\n mediaType\n }) {\n super({ data, mediaType });\n let format = \"mp3\";\n if (mediaType) {\n const mediaTypeParts = mediaType.split(\"/\");\n if (mediaTypeParts.length === 2) {\n if (mediaType !== \"audio/mpeg\") {\n format = mediaTypeParts[1];\n }\n }\n }\n if (!format) {\n throw new Error(\n \"Audio format must be provided or determinable from media type\"\n );\n }\n this.format = format;\n }\n};\n\n// src/generate-speech/generate-speech.ts\nasync function generateSpeech({\n model,\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a21;\n const resolvedModel = resolveSpeechModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const headersWithUserAgent = withUserAgentSuffix7(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const result = await retry(\n () => resolvedModel.doGenerate({\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n })\n );\n if (!result.audio || result.audio.length === 0) {\n throw new NoSpeechGeneratedError({ responses: [result.response] });\n }\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n return new DefaultSpeechResult({\n audio: new DefaultGeneratedAudioFile({\n data: result.audio,\n mediaType: (_a21 = detectMediaType({\n data: result.audio,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/mp3\"\n }),\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultSpeechResult = class {\n constructor(options) {\n var _a21;\n this.audio = options.audio;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/generate-text/prune-messages.ts\nfunction pruneMessages({\n messages,\n reasoning = \"none\",\n toolCalls = [],\n emptyMessages = \"remove\"\n}) {\n if (reasoning === \"all\" || reasoning === \"before-last-message\") {\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" || typeof message.content === \"string\" || reasoning === \"before-last-message\" && messageIndex === messages.length - 1) {\n return message;\n }\n return {\n ...message,\n content: message.content.filter((part) => part.type !== \"reasoning\")\n };\n });\n }\n if (toolCalls === \"none\") {\n toolCalls = [];\n } else if (toolCalls === \"all\") {\n toolCalls = [{ type: \"all\" }];\n } else if (toolCalls === \"before-last-message\") {\n toolCalls = [{ type: \"before-last-message\" }];\n } else if (typeof toolCalls === \"string\") {\n toolCalls = [{ type: toolCalls }];\n }\n for (const toolCall of toolCalls) {\n const keepLastMessagesCount = toolCall.type === \"all\" ? void 0 : toolCall.type === \"before-last-message\" ? 1 : Number(\n toolCall.type.slice(\"before-last-\".length).slice(0, -\"-messages\".length)\n );\n const keptToolCallIds = /* @__PURE__ */ new Set();\n const keptApprovalIds = /* @__PURE__ */ new Set();\n if (keepLastMessagesCount != null) {\n for (const message of messages.slice(-keepLastMessagesCount)) {\n if ((message.role === \"assistant\" || message.role === \"tool\") && typeof message.content !== \"string\") {\n for (const part of message.content) {\n if (part.type === \"tool-call\" || part.type === \"tool-result\") {\n keptToolCallIds.add(part.toolCallId);\n } else if (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") {\n keptApprovalIds.add(part.approvalId);\n }\n }\n }\n }\n }\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" && message.role !== \"tool\" || typeof message.content === \"string\" || keepLastMessagesCount && messageIndex >= messages.length - keepLastMessagesCount) {\n return message;\n }\n const toolCallIdToToolName = {};\n const approvalIdToToolName = {};\n return {\n ...message,\n content: message.content.filter((part) => {\n if (part.type !== \"tool-call\" && part.type !== \"tool-result\" && part.type !== \"tool-approval-request\" && part.type !== \"tool-approval-response\") {\n return true;\n }\n if (part.type === \"tool-call\") {\n toolCallIdToToolName[part.toolCallId] = part.toolName;\n } else if (part.type === \"tool-approval-request\") {\n approvalIdToToolName[part.approvalId] = toolCallIdToToolName[part.toolCallId];\n }\n if ((part.type === \"tool-call\" || part.type === \"tool-result\") && keptToolCallIds.has(part.toolCallId) || (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") && keptApprovalIds.has(part.approvalId)) {\n return true;\n }\n return toolCall.tools != null && !toolCall.tools.includes(\n part.type === \"tool-call\" || part.type === \"tool-result\" ? part.toolName : approvalIdToToolName[part.approvalId]\n );\n })\n };\n });\n }\n if (emptyMessages === \"remove\") {\n messages = messages.filter((message) => message.content.length > 0);\n }\n return messages;\n}\n\n// src/generate-text/smooth-stream.ts\nimport { delay as originalDelay } from \"@ai-sdk/provider-utils\";\nimport { InvalidArgumentError as InvalidArgumentError2 } from \"@ai-sdk/provider\";\nvar CHUNKING_REGEXPS = {\n word: /\\S+\\s+/m,\n line: /\\n+/m\n};\nfunction smoothStream({\n delayInMs = 10,\n chunking = \"word\",\n _internal: { delay: delay2 = originalDelay } = {}\n} = {}) {\n let detectChunk;\n if (chunking != null && typeof chunking === \"object\" && \"segment\" in chunking && typeof chunking.segment === \"function\") {\n const segmenter = chunking;\n detectChunk = (buffer) => {\n if (buffer.length === 0)\n return null;\n const iterator = segmenter.segment(buffer)[Symbol.iterator]();\n const first = iterator.next().value;\n return (first == null ? void 0 : first.segment) || null;\n };\n } else if (typeof chunking === \"function\") {\n detectChunk = (buffer) => {\n const match = chunking(buffer);\n if (match == null) {\n return null;\n }\n if (!match.length) {\n throw new Error(`Chunking function must return a non-empty string.`);\n }\n if (!buffer.startsWith(match)) {\n throw new Error(\n `Chunking function must return a match that is a prefix of the buffer. Received: \"${match}\" expected to start with \"${buffer}\"`\n );\n }\n return match;\n };\n } else {\n const chunkingRegex = typeof chunking === \"string\" ? CHUNKING_REGEXPS[chunking] : chunking instanceof RegExp ? chunking : void 0;\n if (chunkingRegex == null) {\n throw new InvalidArgumentError2({\n argument: \"chunking\",\n message: `Chunking must be \"word\", \"line\", a RegExp, an Intl.Segmenter, or a ChunkDetector function. Received: ${chunking}`\n });\n }\n detectChunk = (buffer) => {\n const match = chunkingRegex.exec(buffer);\n if (!match) {\n return null;\n }\n return buffer.slice(0, match.index) + (match == null ? void 0 : match[0]);\n };\n }\n return () => {\n let buffer = \"\";\n let id = \"\";\n let type = void 0;\n let providerMetadata = void 0;\n function flushBuffer(controller) {\n if (buffer.length > 0 && type !== void 0) {\n controller.enqueue({\n type,\n text: buffer,\n id,\n ...providerMetadata != null ? { providerMetadata } : {}\n });\n buffer = \"\";\n providerMetadata = void 0;\n }\n }\n return new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type !== \"text-delta\" && chunk.type !== \"reasoning-delta\") {\n flushBuffer(controller);\n controller.enqueue(chunk);\n return;\n }\n if ((chunk.type !== type || chunk.id !== id) && buffer.length > 0) {\n flushBuffer(controller);\n }\n buffer += chunk.text;\n id = chunk.id;\n type = chunk.type;\n if (chunk.providerMetadata != null) {\n providerMetadata = chunk.providerMetadata;\n }\n let match;\n while ((match = detectChunk(buffer)) != null) {\n controller.enqueue({ type, text: match, id });\n buffer = buffer.slice(match.length);\n await delay2(delayInMs);\n }\n }\n });\n };\n}\n\n// src/generate-video/generate-video.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array5,\n withUserAgentSuffix as withUserAgentSuffix8\n} from \"@ai-sdk/provider-utils\";\nvar defaultDownload = createDownload();\nasync function experimental_generateVideo({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxVideosPerCall,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload\n}) {\n var _a21;\n const model = resolveVideoModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix8(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const { prompt, image } = normalizePrompt2(promptArg);\n const maxVideosPerCallWithDefault = (_a21 = maxVideosPerCall != null ? maxVideosPerCall : await invokeModelMaxVideosPerCall(model)) != null ? _a21 : 1;\n const callCount = Math.ceil(n / maxVideosPerCallWithDefault);\n const callVideoCounts = Array.from({ length: callCount }, (_, index) => {\n const remaining = n - index * maxVideosPerCallWithDefault;\n return Math.min(remaining, maxVideosPerCallWithDefault);\n });\n const results = await Promise.all(\n callVideoCounts.map(\n async (callVideoCount) => retry(\n () => model.doGenerate({\n prompt,\n n: callVideoCount,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n image,\n providerOptions: providerOptions != null ? providerOptions : {},\n headers: headersWithUserAgent,\n abortSignal\n })\n )\n )\n );\n const videos = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n for (const result of results) {\n for (const videoData of result.videos) {\n switch (videoData.type) {\n case \"url\": {\n const { data, mediaType: downloadedMediaType } = await downloadFn({\n url: new URL(videoData.url),\n abortSignal\n });\n const isUsableMediaType = (type) => !!type && type !== \"application/octet-stream\";\n const mediaType = isUsableMediaType(videoData.mediaType) && videoData.mediaType || isUsableMediaType(downloadedMediaType) && downloadedMediaType || detectMediaType({\n data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data,\n mediaType\n })\n );\n break;\n }\n case \"base64\": {\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType: videoData.mediaType || \"video/mp4\"\n })\n );\n break;\n }\n case \"binary\": {\n const mediaType = videoData.mediaType || detectMediaType({\n data: videoData.data,\n signatures: videoMediaTypeSignatures\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType\n })\n );\n break;\n }\n }\n }\n warnings.push(...result.warnings);\n responses.push({\n timestamp: result.response.timestamp,\n modelId: result.response.modelId,\n headers: result.response.headers,\n providerMetadata: result.providerMetadata\n });\n if (result.providerMetadata != null) {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n const existingMetadata = providerMetadata[providerName];\n if (existingMetadata != null && typeof existingMetadata === \"object\") {\n providerMetadata[providerName] = {\n ...existingMetadata,\n ...metadata\n };\n if (\"videos\" in existingMetadata && Array.isArray(existingMetadata.videos) && \"videos\" in metadata && Array.isArray(metadata.videos)) {\n providerMetadata[providerName].videos = [\n ...existingMetadata.videos,\n ...metadata.videos\n ];\n }\n } else {\n providerMetadata[providerName] = metadata;\n }\n }\n }\n }\n if (videos.length === 0) {\n throw new NoVideoGeneratedError({ responses });\n }\n if (warnings.length > 0) {\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n }\n return {\n video: videos[0],\n videos,\n warnings,\n responses,\n providerMetadata\n };\n}\nfunction normalizePrompt2(promptArg) {\n var _a21, _b;\n if (typeof promptArg === \"string\") {\n return {\n prompt: promptArg,\n image: void 0\n };\n }\n let image;\n if (promptArg.image != null) {\n const dataContent = promptArg.image;\n if (typeof dataContent === \"string\") {\n if (dataContent.startsWith(\"http://\") || dataContent.startsWith(\"https://\")) {\n image = {\n type: \"url\",\n url: dataContent\n };\n } else if (dataContent.startsWith(\"data:\")) {\n const { mediaType, base64Content } = splitDataUrl(dataContent);\n image = {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : \"image/png\",\n data: convertBase64ToUint8Array5(base64Content != null ? base64Content : \"\")\n };\n } else {\n const bytes = convertBase64ToUint8Array5(dataContent);\n const mediaType = (_a21 = detectMediaType({\n data: bytes,\n signatures: imageMediaTypeSignatures\n })) != null ? _a21 : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: bytes\n };\n }\n } else if (dataContent instanceof Uint8Array) {\n const mediaType = (_b = detectMediaType({\n data: dataContent,\n signatures: imageMediaTypeSignatures\n })) != null ? _b : \"image/png\";\n image = {\n type: \"file\",\n mediaType,\n data: dataContent\n };\n }\n }\n return {\n prompt: promptArg.text,\n image\n };\n}\nasync function invokeModelMaxVideosPerCall(model) {\n if (typeof model.maxVideosPerCall === \"function\") {\n return await model.maxVideosPerCall({ modelId: model.modelId });\n }\n return model.maxVideosPerCall;\n}\n\n// src/middleware/default-embedding-settings-middleware.ts\nfunction defaultEmbeddingSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/default-settings-middleware.ts\nfunction defaultSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/extract-json-middleware.ts\nfunction defaultTransform(text2) {\n return text2.replace(/^```(?:json)?\\s*\\n?/, \"\").replace(/\\n?```\\s*$/, \"\").trim();\n}\nfunction extractJsonMiddleware(options) {\n var _a21;\n const transform = (_a21 = options == null ? void 0 : options.transform) != null ? _a21 : defaultTransform;\n const hasCustomTransform = (options == null ? void 0 : options.transform) !== void 0;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n transformedContent.push({\n ...part,\n text: transform(part.text)\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const textBlocks = {};\n const SUFFIX_BUFFER_SIZE = 12;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n textBlocks[chunk.id] = {\n startEvent: chunk,\n // Custom transforms need to buffer all content\n phase: hasCustomTransform ? \"buffering\" : \"prefix\",\n buffer: \"\",\n prefixStripped: false\n };\n return;\n }\n if (chunk.type === \"text-delta\") {\n const block = textBlocks[chunk.id];\n if (!block) {\n controller.enqueue(chunk);\n return;\n }\n block.buffer += chunk.delta;\n if (block.phase === \"buffering\") {\n return;\n }\n if (block.phase === \"prefix\") {\n if (block.buffer.length > 0 && !block.buffer.startsWith(\"`\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else if (block.buffer.startsWith(\"```\")) {\n if (block.buffer.includes(\"\\n\")) {\n const prefixMatch = block.buffer.match(/^```(?:json)?\\s*\\n/);\n if (prefixMatch) {\n block.buffer = block.buffer.slice(\n prefixMatch[0].length\n );\n block.prefixStripped = true;\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n } else if (block.buffer.length >= 3 && !block.buffer.startsWith(\"```\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n if (block.phase === \"streaming\" && block.buffer.length > SUFFIX_BUFFER_SIZE) {\n const toStream = block.buffer.slice(0, -SUFFIX_BUFFER_SIZE);\n block.buffer = block.buffer.slice(-SUFFIX_BUFFER_SIZE);\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: toStream\n });\n }\n return;\n }\n if (chunk.type === \"text-end\") {\n const block = textBlocks[chunk.id];\n if (block) {\n if (block.phase === \"prefix\" || block.phase === \"buffering\") {\n controller.enqueue(block.startEvent);\n }\n let remaining = block.buffer;\n if (block.phase === \"buffering\") {\n remaining = transform(remaining);\n } else if (block.prefixStripped) {\n remaining = remaining.replace(/\\n?```\\s*$/, \"\").trimEnd();\n } else {\n remaining = transform(remaining);\n }\n if (remaining.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: remaining\n });\n }\n controller.enqueue(chunk);\n delete textBlocks[chunk.id];\n return;\n }\n }\n controller.enqueue(chunk);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/util/get-potential-start-index.ts\nfunction getPotentialStartIndex(text2, searchedText) {\n if (searchedText.length === 0) {\n return null;\n }\n const directIndex = text2.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n for (let i = text2.length - 1; i >= 0; i--) {\n const suffix = text2.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n return null;\n}\n\n// src/middleware/extract-reasoning-middleware.ts\nfunction extractReasoningMiddleware({\n tagName,\n separator = \"\\n\",\n startWithReasoning = false\n}) {\n const openingTag = `<${tagName}>`;\n const closingTag = `</${tagName}>`;\n return {\n specificationVersion: \"v3\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n const text2 = startWithReasoning ? openingTag + part.text : part.text;\n const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, \"gs\");\n const matches = Array.from(text2.matchAll(regexp));\n if (!matches.length) {\n transformedContent.push(part);\n continue;\n }\n const reasoningText = matches.map((match) => match[1]).join(separator);\n let textWithoutReasoning = text2;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n const beforeMatch = textWithoutReasoning.slice(0, match.index);\n const afterMatch = textWithoutReasoning.slice(\n match.index + match[0].length\n );\n textWithoutReasoning = beforeMatch + (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : \"\") + afterMatch;\n }\n transformedContent.push({\n type: \"reasoning\",\n text: reasoningText\n });\n transformedContent.push({\n type: \"text\",\n text: textWithoutReasoning\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const reasoningExtractions = {};\n let delayedTextStart;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n delayedTextStart = chunk;\n return;\n }\n if (chunk.type === \"text-end\" && delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n if (reasoningExtractions[chunk.id] == null) {\n reasoningExtractions[chunk.id] = {\n isFirstReasoning: true,\n isFirstText: true,\n afterSwitch: false,\n isReasoning: startWithReasoning,\n buffer: \"\",\n idCounter: 0,\n textId: chunk.id\n };\n }\n const activeExtraction = reasoningExtractions[chunk.id];\n activeExtraction.buffer += chunk.delta;\n function publish(text2) {\n if (text2.length > 0) {\n const prefix = activeExtraction.afterSwitch && (activeExtraction.isReasoning ? !activeExtraction.isFirstReasoning : !activeExtraction.isFirstText) ? separator : \"\";\n if (activeExtraction.isReasoning && (activeExtraction.afterSwitch || activeExtraction.isFirstReasoning)) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n delta: prefix + text2,\n id: `reasoning-${activeExtraction.idCounter}`\n });\n } else {\n if (delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n controller.enqueue({\n type: \"text-delta\",\n delta: prefix + text2,\n id: activeExtraction.textId\n });\n }\n activeExtraction.afterSwitch = false;\n if (activeExtraction.isReasoning) {\n activeExtraction.isFirstReasoning = false;\n } else {\n activeExtraction.isFirstText = false;\n }\n }\n }\n do {\n const nextTag = activeExtraction.isReasoning ? closingTag : openingTag;\n const startIndex = getPotentialStartIndex(\n activeExtraction.buffer,\n nextTag\n );\n if (startIndex == null) {\n publish(activeExtraction.buffer);\n activeExtraction.buffer = \"\";\n break;\n }\n publish(activeExtraction.buffer.slice(0, startIndex));\n const foundFullMatch = startIndex + nextTag.length <= activeExtraction.buffer.length;\n if (foundFullMatch) {\n activeExtraction.buffer = activeExtraction.buffer.slice(\n startIndex + nextTag.length\n );\n if (activeExtraction.isReasoning) {\n if (activeExtraction.isFirstReasoning) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n controller.enqueue({\n type: \"reasoning-end\",\n id: `reasoning-${activeExtraction.idCounter++}`\n });\n }\n activeExtraction.isReasoning = !activeExtraction.isReasoning;\n activeExtraction.afterSwitch = true;\n } else {\n activeExtraction.buffer = activeExtraction.buffer.slice(startIndex);\n break;\n }\n } while (true);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/middleware/simulate-streaming-middleware.ts\nfunction simulateStreamingMiddleware() {\n return {\n specificationVersion: \"v3\",\n wrapStream: async ({ doGenerate }) => {\n const result = await doGenerate();\n let id = 0;\n const simulatedStream = new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: result.warnings\n });\n controller.enqueue({ type: \"response-metadata\", ...result.response });\n for (const part of result.content) {\n switch (part.type) {\n case \"text\": {\n if (part.text.length > 0) {\n controller.enqueue({ type: \"text-start\", id: String(id) });\n controller.enqueue({\n type: \"text-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"text-end\", id: String(id) });\n id++;\n }\n break;\n }\n case \"reasoning\": {\n controller.enqueue({\n type: \"reasoning-start\",\n id: String(id),\n providerMetadata: part.providerMetadata\n });\n controller.enqueue({\n type: \"reasoning-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"reasoning-end\", id: String(id) });\n id++;\n break;\n }\n default: {\n controller.enqueue(part);\n break;\n }\n }\n }\n controller.enqueue({\n type: \"finish\",\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata\n });\n controller.close();\n }\n });\n return {\n stream: simulatedStream,\n request: result.request,\n response: result.response\n };\n }\n };\n}\n\n// src/middleware/add-tool-input-examples-middleware.ts\nfunction defaultFormatExample(example) {\n return JSON.stringify(example.input);\n}\nfunction addToolInputExamplesMiddleware({\n prefix = \"Input Examples:\",\n format = defaultFormatExample,\n remove = true\n} = {}) {\n return {\n specificationVersion: \"v3\",\n transformParams: async ({ params }) => {\n var _a21;\n if (!((_a21 = params.tools) == null ? void 0 : _a21.length)) {\n return params;\n }\n const transformedTools = params.tools.map((tool2) => {\n var _a22;\n if (tool2.type !== \"function\" || !((_a22 = tool2.inputExamples) == null ? void 0 : _a22.length)) {\n return tool2;\n }\n const formattedExamples = tool2.inputExamples.map((example, index) => format(example, index)).join(\"\\n\");\n const examplesSection = `${prefix}\n${formattedExamples}`;\n const toolDescription = tool2.description ? `${tool2.description}\n\n${examplesSection}` : examplesSection;\n return {\n ...tool2,\n description: toolDescription,\n inputExamples: remove ? void 0 : tool2.inputExamples\n };\n });\n return {\n ...params,\n tools: transformedTools\n };\n }\n };\n}\n\n// src/middleware/wrap-language-model.ts\nvar wrapLanguageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n wrapStream,\n overrideProvider,\n overrideModelId,\n overrideSupportedUrls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({\n params,\n type\n }) {\n return transformParams ? await transformParams({ params, type, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n supportedUrls: (_c = overrideSupportedUrls == null ? void 0 : overrideSupportedUrls({ model })) != null ? _c : model.supportedUrls,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params, type: \"generate\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n doStream,\n params: transformedParams,\n model\n }) : doGenerate();\n },\n async doStream(params) {\n const transformedParams = await doTransform({ params, type: \"stream\" });\n const doGenerate = async () => model.doGenerate(transformedParams);\n const doStream = async () => model.doStream(transformedParams);\n return wrapStream ? wrapStream({ doGenerate, doStream, params: transformedParams, model }) : doStream();\n }\n };\n};\n\n// src/middleware/wrap-embedding-model.ts\nvar wrapEmbeddingModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap2({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap2 = ({\n model,\n middleware: {\n transformParams,\n wrapEmbed,\n overrideProvider,\n overrideModelId,\n overrideMaxEmbeddingsPerCall,\n overrideSupportsParallelCalls\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c, _d;\n async function doTransform({\n params\n }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n return {\n specificationVersion: \"v3\",\n provider: (_a21 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a21 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n maxEmbeddingsPerCall: (_c = overrideMaxEmbeddingsPerCall == null ? void 0 : overrideMaxEmbeddingsPerCall({ model })) != null ? _c : model.maxEmbeddingsPerCall,\n supportsParallelCalls: (_d = overrideSupportsParallelCalls == null ? void 0 : overrideSupportsParallelCalls({ model })) != null ? _d : model.supportsParallelCalls,\n async doEmbed(params) {\n const transformedParams = await doTransform({ params });\n const doEmbed = async () => model.doEmbed(transformedParams);\n return wrapEmbed ? wrapEmbed({\n doEmbed,\n params: transformedParams,\n model\n }) : doEmbed();\n }\n };\n};\n\n// src/middleware/wrap-image-model.ts\nvar wrapImageModel = ({\n model,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n return [...asArray(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap3({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap3 = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n overrideProvider,\n overrideModelId,\n overrideMaxImagesPerCall\n },\n modelId,\n providerId\n}) => {\n var _a21, _b, _c;\n async function doTransform({ params }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n const maxImagesPerCallRaw = (_a21 = overrideMaxImagesPerCall == null ? void 0 : overrideMaxImagesPerCall({ model })) != null ? _a21 : model.maxImagesPerCall;\n const maxImagesPerCall = maxImagesPerCallRaw instanceof Function ? maxImagesPerCallRaw.bind(model) : maxImagesPerCallRaw;\n return {\n specificationVersion: \"v3\",\n provider: (_b = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _b : model.provider,\n modelId: (_c = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _c : model.modelId,\n maxImagesPerCall,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params });\n const doGenerate = async () => model.doGenerate(transformedParams);\n return wrapGenerate ? wrapGenerate({\n doGenerate,\n params: transformedParams,\n model\n }) : doGenerate();\n }\n };\n};\n\n// src/model/as-provider-v3.ts\nfunction asProviderV3(provider) {\n if (\"specificationVersion\" in provider && provider.specificationVersion === \"v3\") {\n return provider;\n }\n const v2Provider = provider;\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => asLanguageModelV3(v2Provider.languageModel(modelId)),\n embeddingModel: (modelId) => asEmbeddingModelV3(v2Provider.textEmbeddingModel(modelId)),\n imageModel: (modelId) => asImageModelV3(v2Provider.imageModel(modelId)),\n transcriptionModel: v2Provider.transcriptionModel ? (modelId) => asTranscriptionModelV3(v2Provider.transcriptionModel(modelId)) : void 0,\n speechModel: v2Provider.speechModel ? (modelId) => asSpeechModelV3(v2Provider.speechModel(modelId)) : void 0,\n rerankingModel: void 0\n // v2 providers don't have reranking models\n };\n}\n\n// src/middleware/wrap-provider.ts\nfunction wrapProvider({\n provider,\n languageModelMiddleware,\n imageModelMiddleware\n}) {\n const providerV3 = asProviderV3(provider);\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => wrapLanguageModel({\n model: providerV3.languageModel(modelId),\n middleware: languageModelMiddleware\n }),\n embeddingModel: providerV3.embeddingModel,\n imageModel: (modelId) => {\n let model = providerV3.imageModel(modelId);\n if (imageModelMiddleware != null) {\n model = wrapImageModel({ model, middleware: imageModelMiddleware });\n }\n return model;\n },\n transcriptionModel: providerV3.transcriptionModel,\n speechModel: providerV3.speechModel,\n rerankingModel: providerV3.rerankingModel\n };\n}\n\n// src/registry/custom-provider.ts\nimport {\n NoSuchModelError as NoSuchModelError2\n} from \"@ai-sdk/provider\";\nfunction customProvider({\n languageModels,\n embeddingModels,\n imageModels,\n transcriptionModels,\n speechModels,\n rerankingModels,\n videoModels,\n fallbackProvider: fallbackProviderArg\n}) {\n const fallbackProvider = fallbackProviderArg ? asProviderV3(fallbackProviderArg) : void 0;\n return {\n specificationVersion: \"v3\",\n languageModel(modelId) {\n if (languageModels != null && modelId in languageModels) {\n return languageModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.languageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"languageModel\" });\n },\n embeddingModel(modelId) {\n if (embeddingModels != null && modelId in embeddingModels) {\n return embeddingModels[modelId];\n }\n if (fallbackProvider) {\n return fallbackProvider.embeddingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"embeddingModel\" });\n },\n imageModel(modelId) {\n if (imageModels != null && modelId in imageModels) {\n return imageModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.imageModel) {\n return fallbackProvider.imageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"imageModel\" });\n },\n transcriptionModel(modelId) {\n if (transcriptionModels != null && modelId in transcriptionModels) {\n return transcriptionModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.transcriptionModel) {\n return fallbackProvider.transcriptionModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"transcriptionModel\" });\n },\n speechModel(modelId) {\n if (speechModels != null && modelId in speechModels) {\n return speechModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.speechModel) {\n return fallbackProvider.speechModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"speechModel\" });\n },\n rerankingModel(modelId) {\n if (rerankingModels != null && modelId in rerankingModels) {\n return rerankingModels[modelId];\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.rerankingModel) {\n return fallbackProvider.rerankingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"rerankingModel\" });\n },\n videoModel(modelId) {\n if (videoModels != null && modelId in videoModels) {\n return videoModels[modelId];\n }\n const videoModel = fallbackProvider == null ? void 0 : fallbackProvider.videoModel;\n if (videoModel) {\n return videoModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"videoModel\" });\n }\n };\n}\nvar experimental_customProvider = customProvider;\n\n// src/registry/no-such-provider-error.ts\nimport { AISDKError as AISDKError24, NoSuchModelError as NoSuchModelError3 } from \"@ai-sdk/provider\";\nvar name20 = \"AI_NoSuchProviderError\";\nvar marker20 = `vercel.ai.error.${name20}`;\nvar symbol20 = Symbol.for(marker20);\nvar _a20;\nvar NoSuchProviderError = class extends NoSuchModelError3 {\n constructor({\n modelId,\n modelType,\n providerId,\n availableProviders,\n message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`\n }) {\n super({ errorName: name20, modelId, modelType, message });\n this[_a20] = true;\n this.providerId = providerId;\n this.availableProviders = availableProviders;\n }\n static isInstance(error) {\n return AISDKError24.hasMarker(error, marker20);\n }\n};\n_a20 = symbol20;\n\n// src/registry/provider-registry.ts\nimport {\n NoSuchModelError as NoSuchModelError4\n} from \"@ai-sdk/provider\";\nfunction createProviderRegistry(providers, {\n separator = \":\",\n languageModelMiddleware,\n imageModelMiddleware\n} = {}) {\n const registry = new DefaultProviderRegistry({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n });\n for (const [id, provider] of Object.entries(providers)) {\n registry.registerProvider({ id, provider });\n }\n return registry;\n}\nvar experimental_createProviderRegistry = createProviderRegistry;\nvar DefaultProviderRegistry = class {\n constructor({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n }) {\n this.providers = {};\n this.separator = separator;\n this.languageModelMiddleware = languageModelMiddleware;\n this.imageModelMiddleware = imageModelMiddleware;\n }\n registerProvider({\n id,\n provider\n }) {\n this.providers[id] = provider;\n }\n getProvider(id, modelType) {\n const provider = this.providers[id];\n if (provider == null) {\n throw new NoSuchProviderError({\n modelId: id,\n modelType,\n providerId: id,\n availableProviders: Object.keys(this.providers)\n });\n }\n return provider;\n }\n splitId(id, modelType) {\n const index = id.indexOf(this.separator);\n if (index === -1) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType,\n message: `Invalid ${modelType} id for registry: ${id} (must be in the format \"providerId${this.separator}modelId\")`\n });\n }\n return [id.slice(0, index), id.slice(index + this.separator.length)];\n }\n languageModel(id) {\n var _a21, _b;\n const [providerId, modelId] = this.splitId(id, \"languageModel\");\n let model = (_b = (_a21 = this.getProvider(providerId, \"languageModel\")).languageModel) == null ? void 0 : _b.call(\n _a21,\n modelId\n );\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"languageModel\" });\n }\n if (this.languageModelMiddleware != null) {\n model = wrapLanguageModel({\n model,\n middleware: this.languageModelMiddleware\n });\n }\n return model;\n }\n embeddingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"embeddingModel\");\n const provider = this.getProvider(providerId, \"embeddingModel\");\n const model = (_a21 = provider.embeddingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"embeddingModel\"\n });\n }\n return model;\n }\n imageModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"imageModel\");\n const provider = this.getProvider(providerId, \"imageModel\");\n let model = (_a21 = provider.imageModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"imageModel\" });\n }\n if (this.imageModelMiddleware != null) {\n model = wrapImageModel({\n model,\n middleware: this.imageModelMiddleware\n });\n }\n return model;\n }\n transcriptionModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"transcriptionModel\");\n const provider = this.getProvider(providerId, \"transcriptionModel\");\n const model = (_a21 = provider.transcriptionModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"transcriptionModel\"\n });\n }\n return model;\n }\n speechModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"speechModel\");\n const provider = this.getProvider(providerId, \"speechModel\");\n const model = (_a21 = provider.speechModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"speechModel\" });\n }\n return model;\n }\n rerankingModel(id) {\n var _a21;\n const [providerId, modelId] = this.splitId(id, \"rerankingModel\");\n const provider = this.getProvider(providerId, \"rerankingModel\");\n const model = (_a21 = provider.rerankingModel) == null ? void 0 : _a21.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"rerankingModel\" });\n }\n return model;\n }\n};\n\n// src/rerank/rerank.ts\nasync function rerank({\n model: modelArg,\n documents,\n query,\n topN,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry: telemetry\n}) {\n const model = resolveRerankingModel(modelArg);\n if (documents.length === 0) {\n return new DefaultRerankResult({\n originalDocuments: [],\n ranking: [],\n providerMetadata: void 0,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: model.modelId\n }\n });\n }\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const documentsToSend = typeof documents[0] === \"string\" ? { type: \"text\", values: documents } : { type: \"object\", values: documents };\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model,\n telemetry,\n headers,\n settings: { maxRetries }\n });\n const tracer = getTracer(telemetry);\n return recordSpan({\n name: \"ai.rerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({ operationId: \"ai.rerank\", telemetry }),\n ...baseTelemetryAttributes,\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async () => {\n var _a21, _b;\n const { ranking, response, providerMetadata, warnings } = await retry(\n () => recordSpan({\n name: \"ai.rerank.doRerank\",\n attributes: selectTelemetryAttributes({\n telemetry,\n attributes: {\n ...assembleOperationName({\n operationId: \"ai.rerank.doRerank\",\n telemetry\n }),\n ...baseTelemetryAttributes,\n // specific settings that only make sense on the outer level:\n \"ai.documents\": {\n input: () => documents.map((document) => JSON.stringify(document))\n }\n }\n }),\n tracer,\n fn: async (doRerankSpan) => {\n const modelResponse = await model.doRerank({\n documents: documentsToSend,\n query,\n topN,\n providerOptions,\n abortSignal,\n headers\n });\n const ranking2 = modelResponse.ranking;\n doRerankSpan.setAttributes(\n await selectTelemetryAttributes({\n telemetry,\n attributes: {\n \"ai.ranking.type\": documentsToSend.type,\n \"ai.ranking\": {\n output: () => ranking2.map((ranking3) => JSON.stringify(ranking3))\n }\n }\n })\n );\n return {\n ranking: ranking2,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n warnings: modelResponse.warnings\n };\n }\n })\n );\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n return new DefaultRerankResult({\n originalDocuments: documents,\n ranking: ranking.map((ranking2) => ({\n originalIndex: ranking2.index,\n score: ranking2.relevanceScore,\n document: documents[ranking2.index]\n })),\n providerMetadata,\n response: {\n id: response == null ? void 0 : response.id,\n timestamp: (_a21 = response == null ? void 0 : response.timestamp) != null ? _a21 : /* @__PURE__ */ new Date(),\n modelId: (_b = response == null ? void 0 : response.modelId) != null ? _b : model.modelId,\n headers: response == null ? void 0 : response.headers,\n body: response == null ? void 0 : response.body\n }\n });\n }\n });\n}\nvar DefaultRerankResult = class {\n constructor(options) {\n this.originalDocuments = options.originalDocuments;\n this.ranking = options.ranking;\n this.response = options.response;\n this.providerMetadata = options.providerMetadata;\n }\n get rerankedDocuments() {\n return this.ranking.map((ranking) => ranking.document);\n }\n};\n\n// src/transcribe/transcribe.ts\nimport { withUserAgentSuffix as withUserAgentSuffix9 } from \"@ai-sdk/provider-utils\";\nvar defaultDownload2 = createDownload();\nasync function transcribe({\n model,\n audio,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload2\n}) {\n const resolvedModel = resolveTranscriptionModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix9(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const audioData = audio instanceof URL ? (await downloadFn({ url: audio, abortSignal })).data : convertDataContentToUint8Array(audio);\n const result = await retry(\n () => {\n var _a21;\n return resolvedModel.doGenerate({\n audio: audioData,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions,\n mediaType: (_a21 = detectMediaType({\n data: audioData,\n signatures: audioMediaTypeSignatures\n })) != null ? _a21 : \"audio/wav\"\n });\n }\n );\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n if (!result.text) {\n throw new NoTranscriptGeneratedError({ responses: [result.response] });\n }\n return new DefaultTranscriptionResult({\n text: result.text,\n segments: result.segments,\n language: result.language,\n durationInSeconds: result.durationInSeconds,\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultTranscriptionResult = class {\n constructor(options) {\n var _a21;\n this.text = options.text;\n this.segments = options.segments;\n this.language = options.language;\n this.durationInSeconds = options.durationInSeconds;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a21 = options.providerMetadata) != null ? _a21 : {};\n }\n};\n\n// src/ui/call-completion-api.ts\nimport {\n parseJsonEventStream,\n withUserAgentSuffix as withUserAgentSuffix10,\n getRuntimeEnvironmentUserAgent as getRuntimeEnvironmentUserAgent2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/process-text-stream.ts\nasync function processTextStream({\n stream,\n onTextPart\n}) {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n await onTextPart(value);\n }\n}\n\n// src/ui/call-completion-api.ts\nvar getOriginalFetch = () => fetch;\nasync function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onFinish,\n onError,\n fetch: fetch2 = getOriginalFetch()\n}) {\n var _a21;\n try {\n setLoading(true);\n setError(void 0);\n const abortController = new AbortController();\n setAbortController(abortController);\n setCompletion(\"\");\n const response = await fetch2(api, {\n method: \"POST\",\n body: JSON.stringify({\n prompt,\n ...body\n }),\n credentials,\n headers: withUserAgentSuffix10(\n {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent2()\n ),\n signal: abortController.signal\n }).catch((err) => {\n throw err;\n });\n if (!response.ok) {\n throw new Error(\n (_a21 = await response.text()) != null ? _a21 : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n let result = \"\";\n switch (streamProtocol) {\n case \"text\": {\n await processTextStream({\n stream: response.body,\n onTextPart: (chunk) => {\n result += chunk;\n setCompletion(result);\n }\n });\n break;\n }\n case \"data\": {\n await consumeStream({\n stream: parseJsonEventStream({\n stream: response.body,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(part) {\n if (!part.success) {\n throw part.error;\n }\n const streamPart = part.value;\n if (streamPart.type === \"text-delta\") {\n result += streamPart.delta;\n setCompletion(result);\n } else if (streamPart.type === \"error\") {\n throw new Error(streamPart.errorText);\n }\n }\n })\n ),\n onError: (error) => {\n throw error;\n }\n });\n break;\n }\n default: {\n const exhaustiveCheck = streamProtocol;\n throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);\n }\n }\n if (onFinish) {\n onFinish(prompt, result);\n }\n setAbortController(null);\n return result;\n } catch (err) {\n if (err.name === \"AbortError\") {\n setAbortController(null);\n return null;\n }\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n setError(err);\n } finally {\n setLoading(false);\n }\n}\n\n// src/ui/chat.ts\nimport {\n generateId as generateIdFunc2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/convert-file-list-to-file-ui-parts.ts\nasync function convertFileListToFileUIParts(files) {\n if (files == null) {\n return [];\n }\n if (!globalThis.FileList || !(files instanceof globalThis.FileList)) {\n throw new Error(\"FileList is not supported in the current environment\");\n }\n return Promise.all(\n Array.from(files).map(async (file) => {\n const { name: name21, type } = file;\n const dataUrl = await new Promise((resolve3, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n var _a21;\n resolve3((_a21 = readerEvent.target) == null ? void 0 : _a21.result);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n return {\n type: \"file\",\n mediaType: type,\n filename: name21,\n url: dataUrl\n };\n })\n );\n}\n\n// src/ui/default-chat-transport.ts\nimport { parseJsonEventStream as parseJsonEventStream2 } from \"@ai-sdk/provider-utils\";\n\n// src/ui/http-chat-transport.ts\nimport {\n normalizeHeaders,\n resolve as resolve2\n} from \"@ai-sdk/provider-utils\";\nvar HttpChatTransport = class {\n constructor({\n api = \"/api/chat\",\n credentials,\n headers,\n body,\n fetch: fetch2,\n prepareSendMessagesRequest,\n prepareReconnectToStreamRequest\n }) {\n this.api = api;\n this.credentials = credentials;\n this.headers = headers;\n this.body = body;\n this.fetch = fetch2;\n this.prepareSendMessagesRequest = prepareSendMessagesRequest;\n this.prepareReconnectToStreamRequest = prepareReconnectToStreamRequest;\n }\n async sendMessages({\n abortSignal,\n ...options\n }) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareSendMessagesRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n messages: options.messages,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n trigger: options.trigger,\n messageId: options.messageId\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : this.api;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const body = (preparedRequest == null ? void 0 : preparedRequest.body) !== void 0 ? preparedRequest.body : {\n ...resolvedBody,\n ...options.body,\n id: options.chatId,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId\n };\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: JSON.stringify(body),\n credentials,\n signal: abortSignal\n });\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n async reconnectToStream(options) {\n var _a21, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a21 = this.prepareReconnectToStreamRequest) == null ? void 0 : _a21.call(this, {\n api: this.api,\n id: options.chatId,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : `${this.api}/${options.chatId}/stream`;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"GET\",\n headers,\n credentials\n });\n if (response.status === 204) {\n return null;\n }\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n};\n\n// src/ui/default-chat-transport.ts\nvar DefaultChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return parseJsonEventStream2({\n stream,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (!chunk.success) {\n throw chunk.error;\n }\n controller.enqueue(chunk.value);\n }\n })\n );\n }\n};\n\n// src/ui/chat.ts\nvar AbstractChat = class {\n constructor({\n generateId: generateId2 = generateIdFunc2,\n id = generateId2(),\n transport = new DefaultChatTransport(),\n messageMetadataSchema,\n dataPartSchemas,\n state,\n onError,\n onToolCall,\n onFinish,\n onData,\n sendAutomaticallyWhen\n }) {\n this.activeResponse = void 0;\n this.jobExecutor = new SerialJobExecutor();\n /**\n * Appends or replaces a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * If a messageId is provided, the message will be replaced.\n */\n this.sendMessage = async (message, options) => {\n var _a21, _b, _c, _d;\n if (message == null) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n return;\n }\n let uiMessage;\n if (\"text\" in message || \"files\" in message) {\n const fileParts = Array.isArray(message.files) ? message.files : await convertFileListToFileUIParts(message.files);\n uiMessage = {\n parts: [\n ...fileParts,\n ...\"text\" in message && message.text != null ? [{ type: \"text\", text: message.text }] : []\n ]\n };\n } else {\n uiMessage = message;\n }\n if (message.messageId != null) {\n const messageIndex = this.state.messages.findIndex(\n (m) => m.id === message.messageId\n );\n if (messageIndex === -1) {\n throw new Error(`message with id ${message.messageId} not found`);\n }\n if (this.state.messages[messageIndex].role !== \"user\") {\n throw new Error(\n `message with id ${message.messageId} is not a user message`\n );\n }\n this.state.messages = this.state.messages.slice(0, messageIndex + 1);\n this.state.replaceMessage(messageIndex, {\n ...uiMessage,\n id: message.messageId,\n role: (_b = uiMessage.role) != null ? _b : \"user\",\n metadata: message.metadata\n });\n } else {\n this.state.pushMessage({\n ...uiMessage,\n id: (_c = uiMessage.id) != null ? _c : this.generateId(),\n role: (_d = uiMessage.role) != null ? _d : \"user\",\n metadata: message.metadata\n });\n }\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: message.messageId,\n ...options\n });\n };\n /**\n * Regenerate the assistant message with the provided message id.\n * If no message id is provided, the last assistant message will be regenerated.\n */\n this.regenerate = async ({\n messageId,\n ...options\n } = {}) => {\n const messageIndex = messageId == null ? this.state.messages.length - 1 : this.state.messages.findIndex((message) => message.id === messageId);\n if (messageIndex === -1) {\n throw new Error(`message ${messageId} not found`);\n }\n this.state.messages = this.state.messages.slice(\n 0,\n // if the message is a user message, we need to include it in the request:\n this.messages[messageIndex].role === \"assistant\" ? messageIndex : messageIndex + 1\n );\n await this.makeRequest({\n trigger: \"regenerate-message\",\n messageId,\n ...options\n });\n };\n /**\n * Attempt to resume an ongoing streaming response.\n */\n this.resumeStream = async (options = {}) => {\n await this.makeRequest({ trigger: \"resume-stream\", ...options });\n };\n /**\n * Clear the error state and set the status to ready if the chat is in an error state.\n */\n this.clearError = () => {\n if (this.status === \"error\") {\n this.state.error = void 0;\n this.setStatus({ status: \"ready\" });\n }\n };\n this.addToolApprovalResponse = async ({\n id,\n approved,\n reason,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.state === \"approval-requested\" && part.approval.id === id ? {\n ...part,\n state: \"approval-responded\",\n approval: { id, approved, reason }\n } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n this.addToolOutput = async ({\n state = \"output-available\",\n toolCallId,\n output,\n errorText,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.toolCallId === toolCallId ? { ...part, state, output, errorText } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a21;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a21 = this.lastMessage) == null ? void 0 : _a21.id,\n ...options\n });\n }\n });\n }\n });\n /** @deprecated Use addToolOutput */\n this.addToolResult = this.addToolOutput;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n this.stop = async () => {\n var _a21;\n if (this.status !== \"streaming\" && this.status !== \"submitted\")\n return;\n if ((_a21 = this.activeResponse) == null ? void 0 : _a21.abortController) {\n this.activeResponse.abortController.abort();\n }\n };\n this.id = id;\n this.transport = transport;\n this.generateId = generateId2;\n this.messageMetadataSchema = messageMetadataSchema;\n this.dataPartSchemas = dataPartSchemas;\n this.state = state;\n this.onError = onError;\n this.onToolCall = onToolCall;\n this.onFinish = onFinish;\n this.onData = onData;\n this.sendAutomaticallyWhen = sendAutomaticallyWhen;\n }\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n get status() {\n return this.state.status;\n }\n setStatus({\n status,\n error\n }) {\n if (this.status === status)\n return;\n this.state.status = status;\n this.state.error = error;\n }\n get error() {\n return this.state.error;\n }\n get messages() {\n return this.state.messages;\n }\n get lastMessage() {\n return this.state.messages[this.state.messages.length - 1];\n }\n set messages(messages) {\n this.state.messages = messages;\n }\n async shouldSendAutomatically() {\n if (!this.sendAutomaticallyWhen)\n return false;\n const result = this.sendAutomaticallyWhen({\n messages: this.state.messages\n });\n if (result && typeof result === \"object\" && \"then\" in result) {\n return await result;\n }\n return result;\n }\n async makeRequest({\n trigger,\n metadata,\n headers,\n body,\n messageId\n }) {\n var _a21, _b, _c;\n let resumeStream;\n if (trigger === \"resume-stream\") {\n try {\n const reconnect = await this.transport.reconnectToStream({\n chatId: this.id,\n metadata,\n headers,\n body\n });\n if (reconnect == null) {\n return;\n }\n resumeStream = reconnect;\n } catch (err) {\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n return;\n }\n }\n this.setStatus({ status: \"submitted\", error: void 0 });\n const lastMessage = this.lastMessage;\n let isAbort = false;\n let isDisconnect = false;\n let isError = false;\n try {\n const activeResponse = {\n state: createStreamingUIMessageState({\n lastMessage: this.state.snapshot(lastMessage),\n messageId: this.generateId()\n }),\n abortController: new AbortController()\n };\n activeResponse.abortController.signal.addEventListener(\"abort\", () => {\n isAbort = true;\n });\n this.activeResponse = activeResponse;\n let stream;\n if (trigger === \"resume-stream\") {\n stream = resumeStream;\n } else {\n stream = await this.transport.sendMessages({\n chatId: this.id,\n messages: this.state.messages,\n abortSignal: activeResponse.abortController.signal,\n metadata,\n headers,\n body,\n trigger,\n messageId\n });\n }\n const runUpdateMessageJob = (job) => (\n // serialize the job execution to avoid race conditions:\n this.jobExecutor.run(\n () => job({\n state: activeResponse.state,\n write: () => {\n var _a22;\n this.setStatus({ status: \"streaming\" });\n const replaceLastMessage = activeResponse.state.message.id === ((_a22 = this.lastMessage) == null ? void 0 : _a22.id);\n if (replaceLastMessage) {\n this.state.replaceMessage(\n this.state.messages.length - 1,\n activeResponse.state.message\n );\n } else {\n this.state.pushMessage(activeResponse.state.message);\n }\n }\n })\n )\n );\n await consumeStream({\n stream: processUIMessageStream({\n stream,\n onToolCall: this.onToolCall,\n onData: this.onData,\n messageMetadataSchema: this.messageMetadataSchema,\n dataPartSchemas: this.dataPartSchemas,\n runUpdateMessageJob,\n onError: (error) => {\n throw error;\n }\n }),\n onError: (error) => {\n throw error;\n }\n });\n this.setStatus({ status: \"ready\" });\n } catch (err) {\n if (isAbort || err.name === \"AbortError\") {\n isAbort = true;\n this.setStatus({ status: \"ready\" });\n return null;\n }\n isError = true;\n if (err instanceof TypeError && (err.message.toLowerCase().includes(\"fetch\") || err.message.toLowerCase().includes(\"network\"))) {\n isDisconnect = true;\n }\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n } finally {\n try {\n (_b = this.onFinish) == null ? void 0 : _b.call(this, {\n message: this.activeResponse.state.message,\n messages: this.state.messages,\n isAbort,\n isDisconnect,\n isError,\n finishReason: (_a21 = this.activeResponse) == null ? void 0 : _a21.state.finishReason\n });\n } catch (err) {\n console.error(err);\n }\n this.activeResponse = void 0;\n }\n if (!isError && await this.shouldSendAutomatically()) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_c = this.lastMessage) == null ? void 0 : _c.id,\n metadata,\n headers,\n body\n });\n }\n }\n};\n\n// src/ui/direct-chat-transport.ts\nvar DirectChatTransport = class {\n constructor({\n agent,\n options,\n ...uiMessageStreamOptions\n }) {\n this.agent = agent;\n this.agentOptions = options;\n this.uiMessageStreamOptions = uiMessageStreamOptions;\n }\n async sendMessages({\n messages,\n abortSignal\n }) {\n const validatedMessages = await validateUIMessages({\n messages,\n tools: this.agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: this.agent.tools\n });\n const result = await this.agent.stream({\n prompt: modelMessages,\n abortSignal,\n ...this.agentOptions !== void 0 ? { options: this.agentOptions } : {}\n });\n return result.toUIMessageStream(this.uiMessageStreamOptions);\n }\n /**\n * Direct transport does not support reconnection since there is no\n * persistent server-side stream to reconnect to.\n *\n * @returns Always returns `null`\n */\n async reconnectToStream(_options) {\n return null;\n }\n};\n\n// src/ui/last-assistant-message-is-complete-with-approval-responses.ts\nfunction lastAssistantMessageIsCompleteWithApprovalResponses({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart);\n return (\n // has at least one tool approval response\n lastStepToolInvocations.filter((part) => part.state === \"approval-responded\").length > 0 && // all tool approvals must have a response\n lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\" || part.state === \"approval-responded\"\n )\n );\n}\n\n// src/ui/last-assistant-message-is-complete-with-tool-calls.ts\nfunction lastAssistantMessageIsCompleteWithToolCalls({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart).filter((part) => !part.providerExecuted);\n return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\"\n );\n}\n\n// src/ui/transform-text-to-ui-message-stream.ts\nfunction transformTextToUiMessageStream({\n stream\n}) {\n return stream.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"start\" });\n controller.enqueue({ type: \"start-step\" });\n controller.enqueue({ type: \"text-start\", id: \"text-1\" });\n },\n async transform(part, controller) {\n controller.enqueue({ type: \"text-delta\", id: \"text-1\", delta: part });\n },\n async flush(controller) {\n controller.enqueue({ type: \"text-end\", id: \"text-1\" });\n controller.enqueue({ type: \"finish-step\" });\n controller.enqueue({ type: \"finish\" });\n }\n })\n );\n}\n\n// src/ui/text-stream-chat-transport.ts\nvar TextStreamChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return transformTextToUiMessageStream({\n stream: stream.pipeThrough(new TextDecoderStream())\n });\n }\n};\nexport {\n AISDKError21 as AISDKError,\n APICallError,\n AbstractChat,\n DefaultChatTransport,\n DefaultGeneratedFile,\n DirectChatTransport,\n DownloadError,\n EmptyResponseBodyError,\n ToolLoopAgent as Experimental_Agent,\n HttpChatTransport,\n InvalidArgumentError,\n InvalidDataContentError,\n InvalidMessageRoleError,\n InvalidPromptError,\n InvalidResponseDataError,\n InvalidStreamPartError,\n InvalidToolApprovalError,\n InvalidToolInputError,\n JSONParseError,\n JsonToSseTransformStream,\n LoadAPIKeyError,\n LoadSettingError,\n MessageConversionError,\n MissingToolResultsError,\n NoContentGeneratedError,\n NoImageGeneratedError,\n NoObjectGeneratedError,\n NoOutputGeneratedError,\n NoSpeechGeneratedError,\n NoSuchModelError,\n NoSuchProviderError,\n NoSuchToolError,\n NoTranscriptGeneratedError,\n NoVideoGeneratedError,\n output_exports as Output,\n RetryError,\n SerialJobExecutor,\n TextStreamChatTransport,\n TooManyEmbeddingValuesForCallError,\n ToolCallNotFoundForApprovalError,\n ToolCallRepairError,\n ToolLoopAgent,\n TypeValidationError,\n UIMessageStreamError,\n UI_MESSAGE_STREAM_HEADERS,\n UnsupportedFunctionalityError,\n UnsupportedModelVersionError,\n addToolInputExamplesMiddleware,\n asSchema5 as asSchema,\n assistantModelMessageSchema,\n bindTelemetryIntegration,\n callCompletionApi,\n consumeStream,\n convertFileListToFileUIParts,\n convertToModelMessages,\n cosineSimilarity,\n createAgentUIStream,\n createAgentUIStreamResponse,\n createDownload,\n createGateway,\n createIdGenerator5 as createIdGenerator,\n createProviderRegistry,\n createTextStreamResponse,\n createUIMessageStream,\n createUIMessageStreamResponse,\n customProvider,\n defaultEmbeddingSettingsMiddleware,\n defaultSettingsMiddleware,\n dynamicTool,\n embed,\n embedMany,\n experimental_createProviderRegistry,\n experimental_customProvider,\n experimental_generateImage,\n generateSpeech as experimental_generateSpeech,\n experimental_generateVideo,\n transcribe as experimental_transcribe,\n extractJsonMiddleware,\n extractReasoningMiddleware,\n gateway2 as gateway,\n generateId,\n generateImage,\n generateObject,\n generateText,\n getStaticToolName,\n getTextFromDataUrl,\n getToolName,\n getToolOrDynamicToolName,\n hasToolCall,\n isDataUIPart,\n isDeepEqualData,\n isFileUIPart,\n isLoopFinished,\n isReasoningUIPart,\n isStaticToolUIPart,\n isTextUIPart,\n isToolOrDynamicToolUIPart,\n isToolUIPart,\n jsonSchema,\n lastAssistantMessageIsCompleteWithApprovalResponses,\n lastAssistantMessageIsCompleteWithToolCalls,\n modelMessageSchema,\n parseJsonEventStream3 as parseJsonEventStream,\n parsePartialJson,\n pipeAgentUIStreamToResponse,\n pipeTextStreamToResponse,\n pipeUIMessageStreamToResponse,\n pruneMessages,\n readUIMessageStream,\n registerTelemetryIntegration,\n rerank,\n safeValidateUIMessages,\n simulateReadableStream,\n simulateStreamingMiddleware,\n smoothStream,\n stepCountIs,\n streamObject,\n streamText,\n systemModelMessageSchema,\n tool,\n toolModelMessageSchema,\n uiMessageChunkSchema,\n userModelMessageSchema,\n validateUIMessages,\n wrapEmbeddingModel,\n wrapImageModel,\n wrapLanguageModel,\n wrapProvider,\n zodSchema3 as zodSchema\n};\n//# sourceMappingURL=index.mjs.map","/**\n * Encoder core — message append lifecycle machinery.\n *\n * Provides Ably primitives (publish, append, close, abort, flush) that\n * domain-specific encoders wire their event types to.\n *\n * Domain encoders call `createEncoderCore(writer, options)` and use the\n * returned core to map domain events to Ably operations without\n * reimplementing the message append lifecycle.\n */\n\nimport * as Ably from 'ably';\n\nimport { HEADER_DISCRETE, HEADER_MSG_ID, HEADER_STATUS, HEADER_STREAM, HEADER_STREAM_ID } from '../../constants.js';\nimport { ErrorCode } from '../../errors.js';\nimport type { Logger } from '../../logger.js';\nimport { mergeHeaders } from '../../utils.js';\nimport type { ChannelWriter, EncoderOptions, Extras, MessagePayload, StreamPayload, WriteOptions } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/** Options for creating an encoder core. Extends {@link EncoderOptions} with a logger. */\nexport interface EncoderCoreOptions extends EncoderOptions {\n /** Logger instance for diagnostic output. */\n logger?: Logger;\n}\n\n// ---------------------------------------------------------------------------\n// Stream tracker (internal)\n// ---------------------------------------------------------------------------\n\ninterface StreamState {\n serial: string;\n name: string;\n streamId: string;\n accumulated: string;\n persistentHeaders: Record<string, string>;\n aborted: boolean;\n}\n\ninterface PendingAppend {\n promise: Promise<Ably.UpdateDeleteResult>;\n streamId: string;\n}\n\n// ---------------------------------------------------------------------------\n// Encoder core interface\n// ---------------------------------------------------------------------------\n\n/** The core encoder primitives that domain codec encoders delegate to. */\nexport interface EncoderCore {\n /** Publish a single discrete (non-streaming) message described by a payload. */\n publishDiscrete(payload: MessagePayload, opts?: WriteOptions): Promise<Ably.PublishResult>;\n\n /** Publish multiple discrete messages atomically in a single channel publish. */\n publishDiscreteBatch(payloads: MessagePayload[], opts?: WriteOptions): Promise<Ably.PublishResult>;\n\n /** Start a streamed message with x-ably-status:streaming. */\n startStream(streamId: string, payload: StreamPayload, opts?: WriteOptions): Promise<void>;\n\n /**\n * Append data to an in-flight streamed message. Fire-and-forget: errors are\n * collected internally and surfaced by {@link closeStream} or {@link close}.\n */\n appendStream(streamId: string, data: string): void;\n\n /**\n * Close a streamed message with x-ably-status:finished. Flushes all pending\n * appends for recovery before returning. Repeats persistent and payload headers.\n */\n closeStream(streamId: string, payload: StreamPayload): Promise<void>;\n\n /**\n * Abort a single in-progress stream (x-ably-status:aborted) and flush all\n * pending appends for recovery before returning.\n */\n abortStream(streamId: string, opts?: WriteOptions): Promise<void>;\n\n /**\n * Abort all in-progress streams (x-ably-status:aborted) and flush all\n * pending appends for recovery before returning.\n */\n abortAllStreams(opts?: WriteOptions): Promise<void>;\n\n /** Flush + clear trackers. Idempotent. */\n close(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\n// Spec: AIT-CD1\nclass DefaultEncoderCore implements EncoderCore {\n private readonly _writer: ChannelWriter;\n private readonly _defaultClientId: string | undefined;\n private readonly _defaultExtras: Extras | undefined;\n private readonly _onMessageHook: (message: Ably.Message) => void;\n private readonly _logger: Logger | undefined;\n private readonly _trackers = new Map<string, StreamState>();\n private _pending: PendingAppend[] = [];\n private _flushPromise: Promise<void> | undefined;\n private _closed = false;\n\n constructor(writer: ChannelWriter, options: EncoderCoreOptions = {}) {\n this._writer = writer;\n this._defaultClientId = options.clientId;\n this._defaultExtras = options.extras;\n this._onMessageHook =\n options.onMessage ??\n (() => {\n /* noop */\n });\n this._logger = options.logger?.withContext({ component: 'EncoderCore' });\n }\n\n // Spec: AIT-CD11\n async publishDiscrete(payload: MessagePayload, opts?: WriteOptions): Promise<Ably.PublishResult> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.publishDiscrete();', { name: payload.name });\n const msg = this._buildDiscreteMessage(payload, opts);\n return this._writer.publish(msg);\n }\n\n // Spec: AIT-CD11a\n async publishDiscreteBatch(payloads: MessagePayload[], opts?: WriteOptions): Promise<Ably.PublishResult> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.publishDiscreteBatch();', { count: payloads.length });\n const msgs = payloads.map((p) => this._buildDiscreteMessage(p, opts));\n // Mark batch-published payloads as discrete message parts (from writeMessages).\n // The decoder relies on this header to distinguish message parts from lifecycle\n // events that also happen to be discrete (x-ably-stream: false).\n for (const msg of msgs) {\n // CAST: extras is built by _buildDiscreteMessage with a known { headers } shape.\n (msg.extras as { headers: Record<string, string> }).headers[HEADER_DISCRETE] = 'true';\n }\n return this._writer.publish(msgs);\n }\n\n // Spec: AIT-CD2\n async startStream(streamId: string, payload: StreamPayload, opts?: WriteOptions): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.startStream();', { name: payload.name, streamId });\n\n const allHeaders = this._buildHeaders(payload.headers ?? {}, opts);\n allHeaders[HEADER_STREAM] = 'true';\n allHeaders[HEADER_STATUS] = 'streaming';\n allHeaders[HEADER_STREAM_ID] = streamId;\n\n const clientId = this._resolveClientId(opts);\n const msg: Ably.Message = {\n name: payload.name,\n data: payload.data,\n extras: { headers: allHeaders },\n ...(clientId ? { clientId } : {}),\n };\n\n this._invokeOnMessage(msg);\n const result = await this._writer.publish(msg);\n const serial = result.serials[0];\n\n // Spec: AIT-CD2a\n if (!serial) {\n throw new Ably.ErrorInfo(\n `unable to start stream; no serial returned for stream '${payload.name}' (streamId: ${streamId})`,\n ErrorCode.BadRequest,\n 400,\n );\n }\n\n this._trackers.set(streamId, {\n serial,\n name: payload.name,\n streamId,\n accumulated: payload.data,\n persistentHeaders: allHeaders,\n aborted: false,\n });\n\n this._logger?.debug('DefaultEncoderCore.startStream(); stream started', {\n name: payload.name,\n streamId,\n serial,\n });\n }\n\n // Spec: AIT-CD3\n appendStream(streamId: string, data: string): void {\n this._assertNotClosed();\n // Spec: AIT-CD3a\n const tracker = this._trackers.get(streamId);\n if (!tracker) {\n throw new Ably.ErrorInfo(\n `unable to append to stream; no active stream for streamId '${streamId}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n\n tracker.accumulated += data;\n\n const appendMsg: Ably.Message = {\n serial: tracker.serial,\n data,\n extras: { headers: { ...tracker.persistentHeaders } },\n };\n\n this._invokeOnMessage(appendMsg);\n const p = this._writer.appendMessage(appendMsg);\n this._pending.push({ promise: p, streamId });\n }\n\n // Spec: AIT-CD4, AIT-CD4a\n async closeStream(streamId: string, payload: StreamPayload): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.closeStream();', { streamId });\n\n const tracker = this._trackers.get(streamId);\n if (!tracker) {\n throw new Ably.ErrorInfo(\n `unable to close stream; no active stream for streamId '${streamId}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n\n // Accumulate closing data so recovery has the full content\n tracker.accumulated += payload.data;\n\n const allHeaders = this._buildClosingHeaders(tracker, payload.headers ?? {});\n allHeaders[HEADER_STATUS] = 'finished';\n\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: payload.data,\n extras: { headers: allHeaders },\n };\n\n this._invokeOnMessage(msg);\n const p = this._writer.appendMessage(msg);\n this._pending.push({ promise: p, streamId });\n\n await this._flushPending();\n\n this._logger?.debug('DefaultEncoderCore.closeStream(); stream closed', { streamId });\n }\n\n // Spec: AIT-CD5, AIT-CD5b\n async abortStream(streamId: string, opts?: WriteOptions): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.abortStream();', { streamId });\n\n const tracker = this._trackers.get(streamId);\n if (!tracker) {\n throw new Ably.ErrorInfo(\n `unable to abort stream; no active stream for streamId '${streamId}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n\n tracker.aborted = true;\n\n const allHeaders = this._buildClosingHeaders(tracker, {}, opts);\n allHeaders[HEADER_STATUS] = 'aborted';\n\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: '',\n extras: { headers: allHeaders },\n };\n\n this._invokeOnMessage(msg);\n const p = this._writer.appendMessage(msg);\n this._pending.push({ promise: p, streamId });\n\n await this._flushPending();\n\n this._logger?.debug('DefaultEncoderCore.abortStream(); stream aborted', { streamId });\n }\n\n // Spec: AIT-CD5a\n async abortAllStreams(opts?: WriteOptions): Promise<void> {\n this._assertNotClosed();\n this._logger?.trace('DefaultEncoderCore.abortAllStreams();', { streamCount: this._trackers.size });\n\n for (const tracker of this._trackers.values()) {\n tracker.aborted = true;\n\n const allHeaders = this._buildClosingHeaders(tracker, {}, opts);\n allHeaders[HEADER_STATUS] = 'aborted';\n\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: '',\n extras: { headers: allHeaders },\n };\n\n this._invokeOnMessage(msg);\n const p = this._writer.appendMessage(msg);\n this._pending.push({ promise: p, streamId: tracker.streamId });\n }\n\n await this._flushPending();\n }\n\n // Spec: AIT-CD6\n private async _flushPending(): Promise<void> {\n // Re-entrancy guard: if a flush is already in progress, await it instead of starting a new one.\n if (this._flushPromise) {\n return this._flushPromise;\n }\n\n const snapshot = this._pending;\n this._pending = [];\n\n if (snapshot.length === 0) return;\n\n this._logger?.trace('DefaultEncoderCore._flushPending();', { count: snapshot.length });\n\n this._flushPromise = this._doFlush(snapshot);\n try {\n await this._flushPromise;\n } finally {\n this._flushPromise = undefined;\n }\n }\n\n private async _doFlush(snapshot: PendingAppend[]): Promise<void> {\n const results = await Promise.allSettled(snapshot.map(async (p) => p.promise));\n const failures = new Set<string>();\n\n for (const [i, result] of results.entries()) {\n const entry = snapshot[i];\n if (entry && result.status === 'rejected') {\n failures.add(entry.streamId);\n }\n }\n\n if (failures.size === 0) {\n this._logger?.debug('DefaultEncoderCore._flushPending(); all appends succeeded');\n return;\n }\n\n this._logger?.warn('DefaultEncoderCore._flushPending(); recovering failed appends', {\n failedStreams: [...failures],\n });\n\n const recoveryErrors: { streamId: string; error: unknown }[] = [];\n\n for (const streamId of failures) {\n const tracker = this._trackers.get(streamId);\n if (!tracker) continue;\n\n const recoveryStatus = tracker.aborted ? 'aborted' : 'finished';\n const msg: Ably.Message = {\n serial: tracker.serial,\n data: tracker.accumulated,\n extras: { headers: { ...tracker.persistentHeaders, [HEADER_STATUS]: recoveryStatus } },\n };\n\n try {\n await this._writer.updateMessage(msg);\n } catch (error) {\n recoveryErrors.push({ streamId, error });\n }\n }\n\n if (recoveryErrors.length > 0) {\n const ids = recoveryErrors.map((e) => e.streamId).join(', ');\n this._logger?.error('DefaultEncoderCore._flushPending(); recovery failed', { failedStreams: ids });\n throw new Ably.ErrorInfo(\n `unable to flush pending appends; recovery failed for stream(s): ${ids}`,\n ErrorCode.EncoderRecoveryFailed,\n 500,\n );\n }\n }\n\n // Spec: AIT-CD12\n async close(): Promise<void> {\n if (this._closed) return;\n this._logger?.trace('DefaultEncoderCore.close();');\n this._closed = true;\n try {\n await this._flushPending();\n } finally {\n this._trackers.clear();\n }\n this._logger?.debug('DefaultEncoderCore.close(); encoder closed');\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n // Spec: AIT-CD14\n private _invokeOnMessage(msg: Ably.Message): void {\n try {\n this._onMessageHook(msg);\n } catch (error) {\n this._logger?.error('DefaultEncoderCore._invokeOnMessage(); hook threw', { error });\n }\n }\n\n private _assertNotClosed(): void {\n if (this._closed) {\n throw new Ably.ErrorInfo('unable to write to encoder; encoder has been closed', ErrorCode.InvalidArgument, 400);\n }\n }\n\n private _resolveClientId(opts?: WriteOptions): string | undefined {\n return opts?.clientId ?? this._defaultClientId;\n }\n\n private _buildHeaders(codecHeaders: Record<string, string>, opts?: WriteOptions): Record<string, string> {\n const callerHeaders = mergeHeaders(this._defaultExtras?.headers, opts?.extras?.headers);\n const merged = { ...callerHeaders, ...codecHeaders };\n if (opts?.messageId !== undefined) {\n merged[HEADER_MSG_ID] = opts.messageId;\n }\n return merged;\n }\n\n private _buildDiscreteMessage(payload: MessagePayload, opts?: WriteOptions): Ably.Message {\n const headers = this._buildHeaders(payload.headers ?? {}, opts);\n headers[HEADER_STREAM] = 'false';\n const clientId = this._resolveClientId(opts);\n\n const msg: Ably.Message = {\n name: payload.name,\n data: payload.data,\n extras: {\n headers,\n ...(payload.ephemeral ? { ephemeral: true } : {}),\n },\n ...(clientId ? { clientId } : {}),\n };\n\n this._invokeOnMessage(msg);\n return msg;\n }\n\n /**\n * Build headers for a closing append. Closing appends must repeat ALL\n * persistent headers (Ably replaces the entire extras object on append).\n * Then layer caller and codec overrides.\n * @param tracker - The stream tracker with persistent headers.\n * @param codecHeaders - Codec-layer headers to merge.\n * @param opts - Optional per-write overrides.\n * @returns Merged headers for the closing append.\n */\n private _buildClosingHeaders(\n tracker: StreamState,\n codecHeaders: Record<string, string>,\n opts?: WriteOptions,\n ): Record<string, string> {\n const h = { ...tracker.persistentHeaders };\n const callerHeaders = mergeHeaders(this._defaultExtras?.headers, opts?.extras?.headers);\n Object.assign(h, callerHeaders);\n Object.assign(h, codecHeaders);\n return h;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create an encoder core bound to the given channel writer.\n * @param writer - The channel writer to publish messages through.\n * @param options - Encoder configuration (clientId, extras, hooks, logger).\n * @returns A new {@link EncoderCore} instance.\n */\nexport const createEncoderCore = (writer: ChannelWriter, options: EncoderCoreOptions = {}): EncoderCore =>\n new DefaultEncoderCore(writer, options);\n","/**\n * Vercel AI SDK Encoder\n *\n * Maps UIMessageChunk events and complete UIMessage objects to Ably channel\n * operations (publish, appendMessage, updateMessage).\n *\n * Delegates the message append lifecycle (publish, append, close, abort,\n * flush/recover) to the encoder core. This file contains only the\n * Vercel-specific event-to-operation mapping.\n *\n * Domain-specific headers use the `x-domain-` prefix to distinguish them\n * from transport-level `x-ably-` headers.\n *\n * ## Core operations and domain headers\n *\n * Each UIMessageChunk maps to exactly one encoder core operation. Domain\n * headers are passed to every operation that accepts them — the core handles\n * merging, persistence, and deduplication:\n *\n * - **`startStream`**: Opens a message stream. Domain headers become\n * \"persistent headers\" — the core repeats them on every subsequent append.\n * - **`appendStream`**: Appends a text delta. Data only, no headers parameter.\n * The core automatically carries persistent headers from start.\n * - **`closeStream`**: Closes the stream. Pass all domain headers from the\n * chunk — the core merges them on top of persistent headers, so changed\n * values (e.g. updated providerMetadata) are picked up and unchanged\n * values are harmlessly deduplicated.\n * - **`publishDiscrete`**: Publishes a standalone message. All domain headers\n * for the chunk are passed directly.\n */\n\nimport * as Ably from 'ably';\nimport type * as AI from 'ai';\nimport { isDataUIPart } from 'ai';\n\nimport { HEADER_STATUS } from '../../constants.js';\nimport type { EncoderCore, EncoderCoreOptions } from '../../core/codec/encoder.js';\nimport { createEncoderCore } from '../../core/codec/encoder.js';\nimport type { ChannelWriter, MessagePayload, StreamEncoder, WriteOptions } from '../../core/codec/types.js';\nimport { ErrorCode, errorInfoIs } from '../../errors.js';\nimport { headerWriter } from '../../utils.js';\n\n// ---------------------------------------------------------------------------\n// Discrete event payload builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a MessagePayload for discrete (non-streaming) event types.\n * Used by both `writeEvent` and `appendEvent` for tool output events,\n * content parts, and data-* custom chunks.\n * @param chunk - The UI message chunk to encode.\n * @returns The message payload for publishing to the channel.\n */\nconst buildDiscretePayload = (chunk: AI.UIMessageChunk): MessagePayload => {\n switch (chunk.type) {\n case 'tool-output-available': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .bool('dynamic', chunk.dynamic)\n .bool('providerExecuted', chunk.providerExecuted)\n .bool('preliminary', chunk.preliminary)\n .build();\n return { name: 'tool-output-available', data: { output: chunk.output }, headers: h };\n }\n\n case 'tool-output-error': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .bool('dynamic', chunk.dynamic)\n .bool('providerExecuted', chunk.providerExecuted)\n .build();\n return { name: 'tool-output-error', data: { errorText: chunk.errorText }, headers: h };\n }\n\n case 'tool-approval-request': {\n const h = headerWriter().str('toolCallId', chunk.toolCallId).str('approvalId', chunk.approvalId).build();\n return { name: 'tool-approval-request', data: '', headers: h };\n }\n\n case 'tool-output-denied': {\n const h = headerWriter().str('toolCallId', chunk.toolCallId).build();\n return { name: 'tool-output-denied', data: '', headers: h };\n }\n\n default: {\n if (chunk.type.startsWith('data-')) {\n // CAST: data-* chunks always have id, transient, and data fields per AI SDK types.\n // TypeScript can't narrow the template literal union in a default case.\n const dataChunk = chunk as Extract<AI.UIMessageChunk, { type: `data-${string}` }>;\n const h = headerWriter().str('id', dataChunk.id).bool('transient', dataChunk.transient).build();\n const ephemeral = dataChunk.transient === true;\n return { name: chunk.type, data: dataChunk.data, headers: h, ephemeral };\n }\n throw new Ably.ErrorInfo(\n `unable to write event; unsupported chunk type '${chunk.type}'`,\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n }\n};\n\n// ---------------------------------------------------------------------------\n// Default implementation\n// ---------------------------------------------------------------------------\n\nclass DefaultUIMessageEncoder implements StreamEncoder<AI.UIMessageChunk, AI.UIMessage> {\n private readonly _core: EncoderCore;\n private readonly _messageId: string | undefined;\n private _aborted = false;\n\n constructor(writer: ChannelWriter, options: EncoderCoreOptions = {}) {\n this._core = createEncoderCore(writer, options);\n this._messageId = options.messageId;\n }\n\n async appendEvent(chunk: AI.UIMessageChunk, perWrite?: WriteOptions): Promise<void> {\n switch (chunk.type) {\n // -- Stream start: open a message stream with persistent headers -------\n\n case 'text-start': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.startStream(chunk.id, { name: 'text', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'reasoning-start': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.startStream(chunk.id, { name: 'reasoning', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'tool-input-start': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .bool('dynamic', chunk.dynamic)\n .str('title', chunk.title)\n .bool('providerExecuted', chunk.providerExecuted)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.startStream(chunk.toolCallId, { name: 'tool-input', data: '', headers: h }, perWrite);\n break;\n }\n\n // -- Stream append: data only, core carries persistent headers --------\n\n case 'text-delta': {\n this._core.appendStream(chunk.id, chunk.delta);\n break;\n }\n\n case 'reasoning-delta': {\n this._core.appendStream(chunk.id, chunk.delta);\n break;\n }\n\n case 'tool-input-delta': {\n this._core.appendStream(chunk.toolCallId, chunk.inputTextDelta);\n break;\n }\n\n // -- Stream close: pass all chunk headers, core merges with persistent\n\n case 'text-end': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.closeStream(chunk.id, { name: 'text', data: '', headers: h });\n break;\n }\n\n case 'reasoning-end': {\n const h = headerWriter().str('id', chunk.id).json('providerMetadata', chunk.providerMetadata).build();\n await this._core.closeStream(chunk.id, { name: 'reasoning', data: '', headers: h });\n break;\n }\n\n case 'tool-input-available': {\n // If a stream tracker exists, this tool call was streamed — close it.\n // Otherwise it's a non-streaming tool call — publish discrete.\n try {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.closeStream(chunk.toolCallId, { name: 'tool-input', data: '', headers: h });\n } catch (error: unknown) {\n // Only fall through to discrete for \"no active stream\" — rethrow real failures\n if (!(error instanceof Ably.ErrorInfo && errorInfoIs(error, ErrorCode.InvalidArgument))) {\n throw error;\n }\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .bool('dynamic', chunk.dynamic)\n .str('title', chunk.title)\n .bool('providerExecuted', chunk.providerExecuted)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'tool-input', data: chunk.input, headers: h });\n }\n break;\n }\n\n // -- Discrete: lifecycle events ---------------------------------------\n\n case 'start': {\n const h = headerWriter()\n .str('messageId', chunk.messageId ?? this._messageId)\n .json('messageMetadata', chunk.messageMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'start', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'start-step': {\n await this._core.publishDiscrete({ name: 'start-step', data: '' }, perWrite);\n break;\n }\n\n case 'finish-step': {\n await this._core.publishDiscrete({ name: 'finish-step', data: '' }, perWrite);\n break;\n }\n\n case 'finish': {\n const h = headerWriter()\n .str('finishReason', chunk.finishReason)\n .json('messageMetadata', chunk.messageMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'finish', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'error': {\n await this._core.publishDiscrete({ name: 'error', data: chunk.errorText }, perWrite);\n break;\n }\n\n case 'abort': {\n this._aborted = true;\n await this._core.abortAllStreams(perWrite);\n await this._core.publishDiscrete(\n { name: 'abort', data: chunk.reason ?? '', headers: { [HEADER_STATUS]: 'aborted' } },\n perWrite,\n );\n break;\n }\n\n // -- Discrete: tool lifecycle events ----------------------------------\n\n case 'tool-input-error': {\n const h = headerWriter()\n .str('toolCallId', chunk.toolCallId)\n .str('toolName', chunk.toolName)\n .bool('dynamic', chunk.dynamic)\n .str('title', chunk.title)\n .bool('providerExecuted', chunk.providerExecuted)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({\n name: 'tool-input-error',\n data: { errorText: chunk.errorText, input: chunk.input },\n headers: h,\n });\n break;\n }\n\n case 'tool-output-available':\n case 'tool-output-error':\n case 'tool-approval-request':\n case 'tool-output-denied': {\n await this._core.publishDiscrete(buildDiscretePayload(chunk), perWrite);\n break;\n }\n\n // -- Discrete: content parts ------------------------------------------\n\n case 'file': {\n const h = headerWriter()\n .str('mediaType', chunk.mediaType)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'file', data: chunk.url, headers: h }, perWrite);\n break;\n }\n\n case 'source-url': {\n const h = headerWriter()\n .str('sourceId', chunk.sourceId)\n .str('title', chunk.title)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'source-url', data: chunk.url, headers: h }, perWrite);\n break;\n }\n\n case 'source-document': {\n const h = headerWriter()\n .str('sourceId', chunk.sourceId)\n .str('mediaType', chunk.mediaType)\n .str('title', chunk.title)\n .str('filename', chunk.filename)\n .json('providerMetadata', chunk.providerMetadata)\n .build();\n await this._core.publishDiscrete({ name: 'source-document', data: '', headers: h }, perWrite);\n break;\n }\n\n case 'message-metadata': {\n const h = headerWriter().json('messageMetadata', chunk.messageMetadata).build();\n await this._core.publishDiscrete({ name: 'message-metadata', data: '', headers: h }, perWrite);\n break;\n }\n\n // -- Discrete: data-* custom chunks -----------------------------------\n\n default: {\n if (chunk.type.startsWith('data-')) {\n const h = headerWriter().str('id', chunk.id).bool('transient', chunk.transient).build();\n const ephemeral = chunk.transient === true;\n await this._core.publishDiscrete({ name: chunk.type, data: chunk.data, headers: h, ephemeral }, perWrite);\n }\n break;\n }\n }\n }\n\n async writeEvent(chunk: AI.UIMessageChunk, perWrite?: WriteOptions): Promise<Ably.PublishResult> {\n return this._core.publishDiscrete(buildDiscretePayload(chunk), perWrite);\n }\n\n async writeMessages(messages: AI.UIMessage[], perWrite?: WriteOptions): Promise<Ably.PublishResult> {\n const payloads = messages.flatMap((msg) => encodeMessagePayloads(msg));\n return this._core.publishDiscreteBatch(payloads, perWrite);\n }\n\n async abort(reason?: string): Promise<void> {\n if (this._aborted) return;\n this._aborted = true;\n await this._core.abortAllStreams();\n await this._core.publishDiscrete({\n name: 'abort',\n data: reason ?? '',\n headers: { [HEADER_STATUS]: 'aborted' },\n });\n }\n\n async close(): Promise<void> {\n await this._core.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message payload encoding (stateless helper)\n// ---------------------------------------------------------------------------\n\nconst encodeMessagePayloads = (message: AI.UIMessage): MessagePayload[] => {\n const messageId = message.id;\n const payloads: MessagePayload[] = [];\n\n for (const part of message.parts) {\n switch (part.type) {\n case 'text': {\n payloads.push({ name: 'text', data: part.text, headers: headerWriter().str('messageId', messageId).build() });\n break;\n }\n case 'file': {\n payloads.push({\n name: 'file',\n data: part.url,\n headers: headerWriter().str('messageId', messageId).str('mediaType', part.mediaType).build(),\n });\n break;\n }\n default: {\n if (isDataUIPart(part)) {\n payloads.push({\n name: part.type,\n data: part.data,\n headers: headerWriter().str('messageId', messageId).str('id', part.id).build(),\n });\n }\n break;\n }\n }\n }\n\n if (payloads.length === 0) {\n payloads.push({ name: 'text', data: '', headers: headerWriter().str('messageId', messageId).build() });\n }\n\n return payloads;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel AI SDK encoder that maps UIMessageChunk events to Ably\n * channel operations via the encoder core.\n * @param writer - The channel writer to publish messages through.\n * @param options - Encoder configuration (clientId, extras, hooks, logger).\n * @returns A {@link StreamEncoder} for UIMessageChunk/UIMessage.\n */\nexport const createEncoder = (\n writer: ChannelWriter,\n options: EncoderCoreOptions = {},\n): StreamEncoder<AI.UIMessageChunk, AI.UIMessage> => new DefaultUIMessageEncoder(writer, options);\n","/**\n * Vercel AI SDK codec — maps UIMessageChunk events and UIMessage objects\n * to/from native Ably message primitives (publish, append, update, delete).\n *\n * ```ts\n * import { UIMessageCodec } from '@ably/ai-transport/vercel';\n *\n * const encoder = UIMessageCodec.createEncoder(writer, options);\n * const decoder = UIMessageCodec.createDecoder();\n * const accumulator = UIMessageCodec.createAccumulator();\n * ```\n */\n\nimport type * as AI from 'ai';\n\nimport type { Codec } from '../../core/codec/types.js';\nimport { createAccumulator } from './accumulator.js';\nimport { createDecoder } from './decoder.js';\nimport { createEncoder } from './encoder.js';\n\n/**\n * Vercel AI SDK codec implementing `Codec<UIMessageChunk, UIMessage>`.\n *\n * Provides factory methods for creating encoders, decoders, and accumulators\n * that map between Vercel's UIMessageChunk/UIMessage types and Ably's native\n * message primitives.\n */\nexport const UIMessageCodec: Codec<AI.UIMessageChunk, AI.UIMessage> = {\n createEncoder,\n createDecoder,\n createAccumulator,\n\n isTerminal: (event: AI.UIMessageChunk): boolean =>\n event.type === 'finish' || event.type === 'error' || event.type === 'abort',\n};\n","/**\n * Vercel chat transport: wraps a core ClientTransport to satisfy the\n * ChatTransport interface that useChat expects.\n *\n * This is a thin adapter — the real logic lives in the core transport.\n * The chat transport maps Vercel's sendMessages/reconnectToStream contract\n * to the core transport's send/cancel methods.\n *\n * useChat manages message state before calling sendMessages:\n * - submit-message (new): appends the new user message, passes the full array\n * - submit-message (edit): truncates after the edited message, replaces it,\n * passes the truncated array with messageId set\n * - regenerate-message: truncates after the target, passes the truncated array\n *\n * The adapter uses `trigger` to determine the history/messages split:\n * - submit-message: last message is new (publish to channel), rest is history\n * - regenerate-message: no new messages, entire array is history\n *\n * When messageId is set (edit or regeneration), the adapter computes fork\n * metadata (forkOf/parent) from the conversation tree so the server can\n * place the response on the correct branch.\n */\n\nimport * as Ably from 'ably';\nimport type * as AI from 'ai';\n\nimport type { ClientTransport, CloseOptions, SendOptions } from '../../core/transport/types.js';\nimport { ErrorCode } from '../../errors.js';\n\n// ---------------------------------------------------------------------------\n// ChatTransport options\n// ---------------------------------------------------------------------------\n\n/**\n * Context passed to {@link ChatTransportOptions.prepareSendMessagesRequest} for\n * customizing the HTTP POST body and headers.\n */\nexport interface SendMessagesRequestContext {\n /** Chat session ID (from useChat's id). */\n chatId?: string;\n /** What triggered the request: user sent a message, or requested regeneration. */\n trigger: 'submit-message' | 'regenerate-message';\n /**\n * The message ID for edit or regeneration requests. For regeneration,\n * identifies the assistant message to regenerate. For edits (submit-message\n * with messageId), identifies the user message being replaced. Undefined\n * when submitting a new message.\n */\n messageId?: string;\n /** Previous messages in the conversation (context for the LLM). */\n history: AI.UIMessage[];\n /** The new message(s) being sent (to publish to the channel). Empty for regeneration. */\n messages: AI.UIMessage[];\n /** The msg-id of the message being forked (regenerated or edited). */\n forkOf?: string;\n /** The msg-id of the predecessor in the conversation thread. */\n parent?: string;\n}\n\n/** Options for customizing the ChatTransport behavior. */\nexport interface ChatTransportOptions {\n /**\n * Customize the POST body before sending. Called by sendMessages()\n * with the conversation context. Return the body and headers for\n * the HTTP POST.\n *\n * Default: sends all previous messages as `history` in the body.\n * @param context - The conversation context for the current request.\n * @returns The body and headers to use for the HTTP POST.\n */\n prepareSendMessagesRequest?: (context: SendMessagesRequestContext) => {\n body?: Record<string, unknown>;\n headers?: Record<string, string>;\n };\n}\n\n// ---------------------------------------------------------------------------\n// ChatTransport interface\n// ---------------------------------------------------------------------------\n\n/**\n * Additional options passed through from useChat alongside the core\n * sendMessages/reconnectToStream parameters.\n *\n * Mirrors the AI SDK's internal ChatRequestOptions type, which is not\n * exported from the `ai` package.\n */\ninterface ChatRequestOptions {\n /** Additional headers for the request. */\n headers?: Record<string, string> | Headers;\n /** Additional JSON body properties for the request. */\n body?: object;\n /** Custom metadata to attach to the request. */\n metadata?: unknown;\n}\n\n/**\n * Transport interface for Vercel AI SDK's useChat hook.\n *\n * Structurally compatible with the AI SDK's internal `ChatTransport<UIMessage>`\n * interface. Extended with `close()` for releasing the underlying Ably transport\n * resources and `streaming` / `onStreamingChange` for coordinating with\n * useMessageSync.\n */\nexport interface ChatTransport {\n /** Send messages and return a streaming response of UIMessageChunk events. */\n sendMessages: (\n options: {\n /** The type of message submission — new message or regeneration. */\n trigger: 'submit-message' | 'regenerate-message';\n /** Unique identifier for the chat session. */\n chatId: string;\n /** ID of the message to regenerate, or undefined for new messages. */\n messageId: string | undefined;\n /** Array of UI messages representing the conversation history. */\n messages: AI.UIMessage[];\n /** Signal to abort the request if needed. */\n abortSignal: AbortSignal | undefined;\n } & ChatRequestOptions,\n ) => Promise<ReadableStream<AI.UIMessageChunk>>;\n\n /**\n * Reconnect to an existing streaming response. Returns null if no active\n * stream exists for the specified chat session.\n */\n reconnectToStream: (\n options: {\n /** Unique identifier for the chat session to reconnect to. */\n chatId: string;\n } & ChatRequestOptions,\n ) => Promise<ReadableStream<AI.UIMessageChunk> | null>;\n\n /** Close the underlying transport, releasing all resources. */\n close(options?: CloseOptions): Promise<void>;\n\n /** Whether an own-turn stream is currently being consumed by useChat. */\n readonly streaming: boolean;\n\n /**\n * Subscribe to streaming state changes. The callback fires when the\n * ChatTransport transitions between streaming and idle. Used by\n * useMessageSync to gate setMessages calls during active streams.\n * @param callback - Called with `true` when a stream starts, `false` when it ends.\n * @returns Unsubscribe function.\n */\n onStreamingChange(callback: (streaming: boolean) => void): () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Stream wrapper — passthrough that signals completion via a promise\n// ---------------------------------------------------------------------------\n\n/**\n * Wrap a ReadableStream in a passthrough TransformStream that resolves a\n * promise when the stream completes or errors. The returned stream passes\n * all chunks through unchanged.\n * @param source - The original stream to wrap.\n * @returns The wrapped stream and a `done` promise that resolves when the stream closes.\n */\nconst wrapStreamWithDone = <T>(source: ReadableStream<T>): { stream: ReadableStream<T>; done: Promise<void> } => {\n let resolveDone: () => void;\n const done = new Promise<void>((resolve) => {\n resolveDone = resolve;\n });\n\n const passthrough = new TransformStream<T, T>({\n flush: () => {\n resolveDone();\n },\n });\n\n // Pipe in the background. If the source errors or is cancelled, resolve\n // done so the serialization queue advances.\n // Fire-and-forget: the pipe runs independently; errors surface through\n // the readable side that useChat consumes.\n source.pipeTo(passthrough.writable).catch(() => {\n resolveDone();\n });\n\n return { stream: passthrough.readable, done };\n};\n\n// ---------------------------------------------------------------------------\n// Unresolved tool call detection\n// ---------------------------------------------------------------------------\n\n/**\n * Whether an assistant message has a `dynamic-tool` part that can't resolve\n * without further user action. Matches:\n * - `input-streaming` / `input-available` — tool call emitted, not yet run.\n * - `approval-requested` — waiting for the user.\n *\n * Excludes `approval-responded` (streamText will run the tool this turn)\n * and all terminal `output-*` states.\n * @param msg - The UIMessage to inspect.\n * @returns True when a fork-on-send is warranted to avoid shipping a\n * dangling tool call to the LLM.\n */\nconst hasUnresolvedToolCall = (msg: AI.UIMessage): boolean =>\n msg.role === 'assistant' &&\n msg.parts.some(\n (p) =>\n p.type === 'dynamic-tool' &&\n (p.state === 'input-streaming' || p.state === 'input-available' || p.state === 'approval-requested'),\n );\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Vercel ChatTransport from a core ClientTransport.\n *\n * Exposes a `streaming` flag and `onStreamingChange` callback so that\n * `useMessageSync` can gate `setMessages` calls during active own-turn\n * streams, preventing the push/replace ID mismatch in useChat's `write()`.\n *\n * Note: concurrent `sendMessage` calls from the same user are a useChat\n * limitation that cannot be fixed from the transport layer. The\n * developer must respect useChat's `status` and only call `sendMessage`\n * when status is `'ready'`.\n * @param transport - The core client transport to wrap.\n * @param chatOptions - Optional hooks for customizing request construction.\n * @returns A {@link ChatTransport} compatible with Vercel's useChat hook.\n */\nexport const createChatTransport = (\n transport: ClientTransport<AI.UIMessageChunk, AI.UIMessage>,\n chatOptions?: ChatTransportOptions,\n): ChatTransport => {\n // -- Streaming state -------------------------------------------------------\n let _streaming = false;\n const streamingCallbacks = new Set<(streaming: boolean) => void>();\n\n const setStreaming = (value: boolean): void => {\n _streaming = value;\n for (const cb of streamingCallbacks) {\n try {\n cb(value);\n } catch {\n // Isolate subscriber errors so one bad handler doesn't prevent\n // other subscribers from being notified or block the streaming\n // state transition.\n }\n }\n };\n\n // -- sendMessages implementation -------------------------------------------\n\n const sendMessages: ChatTransport['sendMessages'] = async (opts) => {\n const { messages, abortSignal, trigger, messageId } = opts;\n const allNodes = transport.view.flattenNodes();\n\n // useChat calls sendMessages in three distinct modes. We disambiguate\n // by (trigger, last-message role) so each mode dispatches correctly:\n //\n // - 'regenerate-message' → fork an assistant\n // - 'submit-message' + last message is assistant → continuation\n // (auto-submit after\n // addToolResult, or\n // multi-step tool use)\n // - 'submit-message' + last message is user → new user message\n // (or edit if\n // messageId is set)\n //\n // Continuation mode must NOT publish the assistant as a new message or\n // treat messageId as a fork target — useChat v6's sendAutomaticallyWhen\n // path always sets messageId to the last message id regardless.\n //\n // Client-side tool outputs are expected to be staged on the transport\n // via transport.stageEvents() before this runs; the core transport\n // flushes staged events into the POST body automatically.\n const lastMessage = messages.at(-1);\n const lastMessageNode = lastMessage ? allNodes.find((n) => n.message.id === lastMessage.id) : undefined;\n const isContinuation = trigger === 'submit-message' && lastMessage?.role === 'assistant' && !!lastMessageNode;\n\n // Fork-on-unresolved-tool: user sent a new message while the preceding\n // assistant has an unresolved tool call (approval-requested, input-*).\n // Fork the new message off the preceding assistant so the unresolved\n // tool call stays dormant on a sibling branch. Inference this turn runs\n // on the clean fork — the LLM never sees the dangling tool_use.\n //\n // Only applies to fresh user-message submits (not continuations, not\n // regenerates, not edits-with-messageId).\n const precedingMessage =\n trigger === 'submit-message' && !messageId && lastMessage?.role === 'user' ? messages.at(-2) : undefined;\n const forkSource =\n precedingMessage && hasUnresolvedToolCall(precedingMessage)\n ? allNodes.find((n) => n.message.id === precedingMessage.id)\n : undefined;\n\n // Determine the history/messages split based on mode.\n let newMessages: AI.UIMessage[];\n let history: AI.UIMessage[];\n\n if (trigger === 'regenerate-message' || isContinuation) {\n newMessages = [];\n history = messages;\n } else {\n if (messages.length === 0) {\n throw new Ably.ErrorInfo(\n 'unable to send messages; messages array is empty for submit-message trigger',\n ErrorCode.InvalidArgument,\n 400,\n );\n }\n // CAST: length check above guarantees at least one element; .at(-1) cannot be undefined.\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style -- prefer `as` over `!` per TYPES.md\n newMessages = [messages.at(-1) as AI.UIMessage];\n // When forking off an unresolved tool call, drop the unresolved\n // assistant from history too — it belongs on the sibling branch, not\n // the ancestor chain of the new message.\n history = forkSource ? messages.slice(0, -2) : messages.slice(0, -1);\n }\n\n // Compute fork metadata. Only set in regenerate or edit modes — in\n // continuation mode we do NOT fork, we continue the branch.\n let forkOf: string | undefined;\n let parent: string | undefined;\n\n if (messageId && !isContinuation) {\n // Regeneration: messageId = assistant to regenerate.\n // Edit (submit-message with user message and messageId): messageId = user being replaced.\n // In both cases forkOf = the x-ably-msg-id, parent = that message's parent.\n forkOf = messageId;\n const node = allNodes.find((n) => n.message.id === messageId);\n if (node) {\n forkOf = node.msgId;\n parent = node.parentId;\n }\n } else if (isContinuation) {\n // Continuation: the server's next assistant message is a child of the\n // last assistant (no fork). Pass parent so the server places the new\n // message correctly in the tree. isContinuation narrows lastMessageNode\n // to defined.\n parent = lastMessageNode.msgId;\n } else if (forkSource) {\n // Fork off the preceding assistant — the new user message becomes a\n // sibling of the unresolved tool call assistant, rooted at its parent.\n forkOf = forkSource.msgId;\n parent = forkSource.parentId;\n }\n\n let sendBody: Record<string, unknown>;\n let sendHeaders: Record<string, string> | undefined;\n\n if (chatOptions?.prepareSendMessagesRequest) {\n const prepared = chatOptions.prepareSendMessagesRequest({\n chatId: opts.chatId,\n trigger,\n messageId,\n history,\n messages: newMessages,\n forkOf,\n parent,\n });\n sendBody = prepared.body ?? {};\n sendHeaders = prepared.headers;\n } else {\n const historyIds = new Set(history.map((m) => m.id));\n const historyNodes = allNodes.filter((n) => historyIds.has(n.message.id));\n sendBody = {\n history: historyNodes,\n chatId: opts.chatId,\n trigger,\n ...(messageId !== undefined && { messageId }),\n ...(forkOf !== undefined && { forkOf }),\n ...(parent !== undefined && { parent }),\n };\n sendHeaders = undefined;\n }\n\n const sendOpts: SendOptions = { body: sendBody, headers: sendHeaders };\n if (forkOf !== undefined) sendOpts.forkOf = forkOf;\n if (parent !== undefined) sendOpts.parent = parent;\n\n // A single dispatch path: view.send with the (possibly empty)\n // newMessages array. Any events staged via transport.stageEvents()\n // flow automatically through _internalSend into the POST body.\n const turn = await transport.view.send(newMessages, sendOpts);\n\n if (abortSignal) {\n abortSignal.addEventListener('abort', () => void transport.cancel({ all: true }), {\n once: true,\n });\n }\n\n // Wrap the stream to detect completion. The streaming flag gates\n // useMessageSync so that setMessages doesn't interfere with\n // useChat's internal write() during active streams.\n const { stream, done } = wrapStreamWithDone(turn.stream);\n setStreaming(true);\n\n // Fire-and-forget: clear the streaming flag when the stream ends.\n void done.then(() => {\n setStreaming(false);\n });\n\n return stream;\n };\n\n return {\n sendMessages,\n\n // Observer mode handles in-progress streams automatically.\n // The transport subscribes before attach — on the next server append,\n // observer accumulation emits lifecycle events that useMessageSync\n // upserts into React state.\n // eslint-disable-next-line unicorn/no-null, @typescript-eslint/promise-function-async -- null is required by the AI SDK ChatTransport contract; no await needed\n reconnectToStream: () => Promise.resolve(null),\n\n close: async (options?: CloseOptions) => transport.close(options),\n\n get streaming(): boolean {\n return _streaming;\n },\n\n onStreamingChange: (callback: (streaming: boolean) => void): (() => void) => {\n streamingCallbacks.add(callback);\n return () => {\n streamingCallbacks.delete(callback);\n };\n },\n };\n};\n","/**\n * Vercel AI SDK transport wrappers that pre-bind the UIMessageCodec.\n *\n * These are convenience factories so consumers don't need to pass the codec\n * explicitly when using the Vercel AI SDK integration.\n *\n * ```ts\n * import { createClientTransport } from '@ably/ai-transport/vercel';\n *\n * const transport = createClientTransport({ channel });\n * ```\n */\n\n// Chat transport adapter\nexport type { ChatTransport, ChatTransportOptions, SendMessagesRequestContext } from './chat-transport.js';\nexport { createChatTransport } from './chat-transport.js';\n\nimport type * as AI from 'ai';\n\nimport { createClientTransport as createCoreClientTransport } from '../../core/transport/client-transport.js';\nimport { createServerTransport as createCoreServerTransport } from '../../core/transport/server-transport.js';\nimport type {\n ClientTransport,\n ClientTransportOptions,\n ServerTransport,\n ServerTransportOptions,\n} from '../../core/transport/types.js';\nimport { UIMessageCodec } from '../codec/index.js';\n\n/** Core client transport options with Vercel AI SDK types pre-applied. */\ntype CoreClientOpts = ClientTransportOptions<AI.UIMessageChunk, AI.UIMessage>;\n\n/** Options for creating a Vercel client transport. Same as core options but without the codec field, and with `api` optional (defaults to `\"/api/chat\"`). */\nexport type VercelClientTransportOptions = Omit<CoreClientOpts, 'codec' | 'api'> & Partial<Pick<CoreClientOpts, 'api'>>;\n\n/** Options for creating a Vercel server transport. Same as core options but without the codec field. */\nexport type VercelServerTransportOptions = Omit<ServerTransportOptions<AI.UIMessageChunk, AI.UIMessage>, 'codec'>;\n\nexport const DEFAULT_VERCEL_API = '/api/chat';\n\n/**\n * Create a client-side transport pre-configured with the Vercel AI SDK codec.\n *\n * Equivalent to calling the core `createClientTransport` with `codec: UIMessageCodec`.\n * @param options - Configuration for the client transport (codec is provided automatically).\n * @returns A new {@link ClientTransport} for Vercel AI SDK UIMessage/UIMessageChunk types.\n */\nexport const createClientTransport = (\n options: VercelClientTransportOptions,\n): ClientTransport<AI.UIMessageChunk, AI.UIMessage> =>\n createCoreClientTransport({\n ...options,\n codec: UIMessageCodec,\n // Mirrors the Vercel AI SDK's DefaultChatTransport default.\n api: options.api ?? DEFAULT_VERCEL_API,\n });\n\n/**\n * Create a server-side transport pre-configured with the Vercel AI SDK codec.\n *\n * Equivalent to calling the core `createServerTransport` with `codec: UIMessageCodec`.\n * @param options - Configuration for the server transport (codec is provided automatically).\n * @returns A new {@link ServerTransport} for Vercel AI SDK UIMessage/UIMessageChunk types.\n */\nexport const createServerTransport = (\n options: VercelServerTransportOptions,\n): ServerTransport<AI.UIMessageChunk, AI.UIMessage> => createCoreServerTransport({ ...options, codec: UIMessageCodec });\n","import type * as Ably from 'ably';\nimport type * as AI from 'ai';\nimport { createContext } from 'react';\n\nimport type { ClientTransport } from '../../../core/transport/types.js';\nimport type { ChatTransport } from '../../transport/chat-transport.js';\n\n/**\n * A single entry in the chat transport registry, holding both the\n * underlying {@link ClientTransport} and the {@link ChatTransport} wrapping it.\n */\nexport interface ChatTransportSlot {\n /** The underlying client transport used to create the chat transport. */\n readonly transport: ClientTransport<AI.UIMessageChunk, AI.UIMessage>;\n /** Construction error from the underlying {@link ClientTransport}, or `undefined` on success. */\n readonly transportError: Ably.ErrorInfo | undefined;\n /** The chat transport adapter for use with Vercel's useChat hook. */\n readonly chatTransport: ChatTransport;\n}\n\n/**\n * The shape of the single {@link ChatTransportContext} value.\n * Combines the nearest slot with the full registry in one context object.\n */\nexport interface ChatTransportContextValue {\n /** The slot from the nearest {@link ChatTransportProvider} in the tree. */\n readonly nearest: ChatTransportSlot | undefined;\n /** All registered slots, keyed by channelName. */\n readonly providers: Readonly<Record<string, ChatTransportSlot>>;\n}\n\n/**\n * Context that carries both the nearest {@link ChatTransportSlot} and the full registry of\n * registered slots keyed by channelName. Populated by {@link ChatTransportProvider};\n * read by {@link useChatTransport}.\n */\nexport const ChatTransportContext = createContext<ChatTransportContextValue>({\n nearest: undefined,\n providers: {},\n});\n","/**\n * ChatTransportProvider: creates a ChatTransport from a ClientTransport and makes it\n * available to descendants via ChatTransportContext.\n *\n * Wraps children with TransportProvider (using UIMessageCodec) so the Ably channel\n * lifecycle is managed in one place. An inner component reads the ClientTransport\n * from NearestTransportContext and creates the ChatTransport once on first render\n * (via useRef).\n *\n * The ChatTransport is NOT closed on unmount — the underlying ClientTransport\n * lifecycle is managed by the wrapping TransportProvider. Auto-closing would break\n * React Strict Mode, and ChatTransport.close() delegates to ClientTransport.close()\n * which TransportProvider already calls.\n *\n * Multiple ChatTransportProviders can be nested using distinct channelNames.\n * Each provider merges its transport into the parent registry, so descendants\n * can access all registered transports via useChatTransport({ channelName }).\n */\n\nimport type * as AI from 'ai';\nimport { type PropsWithChildren, type ReactNode, useContext, useMemo } from 'react';\n\nimport { createTransportHooks, type TransportProviderProps } from '../../../react/index.js';\nimport { UIMessageCodec } from '../../codec/index.js';\nimport { type ChatTransportOptions, DEFAULT_VERCEL_API } from '../../transport/index.js';\nimport { createChatTransport } from '../../transport/index.js';\nimport type { ChatTransportSlot } from './chat-transport-context.js';\nimport { ChatTransportContext } from './chat-transport-context.js';\n\nexport const {\n TransportProvider,\n useAblyMessages,\n useActiveTurns,\n useClientTransport,\n useCreateView,\n useTree,\n useView,\n} = createTransportHooks<AI.UIMessageChunk, AI.UIMessage>();\n\ntype CoreTransportProviderProps = Omit<TransportProviderProps<AI.UIMessageChunk, AI.UIMessage>, 'codec' | 'api'> &\n Partial<Pick<TransportProviderProps<AI.UIMessageChunk, AI.UIMessage>, 'api'>>;\n\n/**\n * Props for {@link ChatTransportProvider}.\n *\n * All {@link TransportProviderProps} for Vercel types except `codec` (baked as UIMessageCodec),\n * plus `chatOptions` for customizing chat request construction.\n */\nexport interface ChatTransportProviderProps extends CoreTransportProviderProps {\n /**\n * Optional hooks for customizing chat request construction (e.g. prepareSendMessagesRequest).\n * Must be stable across renders — wrap in `useMemo` or define outside the component.\n * A new object reference triggers ChatTransport recreation.\n */\n chatOptions?: ChatTransportOptions;\n}\n\nconst ChatTransportProviderInner = ({\n channelName,\n chatOptions,\n children,\n}: {\n channelName: string;\n chatOptions?: ChatTransportOptions;\n children: ReactNode;\n}) => {\n const { transport, transportError } = useClientTransport();\n const { providers: parentProviders } = useContext(ChatTransportContext);\n const chatTransport = useMemo(() => createChatTransport(transport, chatOptions), [transport, chatOptions]);\n const contextValue = useMemo(() => {\n const slot: ChatTransportSlot = { transport, transportError, chatTransport };\n return {\n nearest: slot,\n providers: { ...parentProviders, [channelName]: slot },\n };\n }, [channelName, parentProviders, chatTransport, transport, transportError]);\n\n return <ChatTransportContext.Provider value={contextValue}>{children}</ChatTransportContext.Provider>;\n};\n\n/**\n * Provide a {@link ChatTransport} and its underlying {@link ClientTransport} to descendant components.\n *\n * Wraps children with Ably's `ChannelProvider` (via `TransportProvider`) using `channelName`,\n * creates a {@link ClientTransport} with UIMessageCodec, wraps it in a {@link ChatTransport},\n * and registers the full slot in `ChatTransportContext` under `channelName`. Descendants call\n * {@link useChatTransport} with the same `channelName` to access both transports.\n *\n * `useClientTransport` is also available inside this provider's subtree.\n *\n * ```tsx\n * <ChatTransportProvider channelName=\"ai:demo\">\n * <Chat />\n * </ChatTransportProvider>\n *\n * // Inside Chat:\n * const { chatTransport, transport } = useChatTransport();\n * const { transport } = useClientTransport(); // also available\n * ```\n * @param props - Provider configuration including `channelName`, optional `chatOptions`, and all other transport options.\n * @param props.chatOptions - Optional hooks for customizing chat request construction. Must be stable (memoized) — a new reference recreates the ChatTransport.\n * @param props.children - Descendant components that consume the transport via hooks.\n * @returns A React element wrapping children with ChannelProvider, TransportContext, and ChatTransportContext.\n */\nexport const ChatTransportProvider = ({\n chatOptions,\n children,\n ...transportProps\n}: ChatTransportProviderProps & PropsWithChildren): ReactNode => (\n <TransportProvider\n {...transportProps}\n api={transportProps.api ?? DEFAULT_VERCEL_API}\n codec={UIMessageCodec}\n >\n <ChatTransportProviderInner\n channelName={transportProps.channelName}\n chatOptions={chatOptions}\n >\n {children}\n </ChatTransportProviderInner>\n </TransportProvider>\n);\n","/**\n * useChatTransport: reads a ChatTransport and its underlying ClientTransport from\n * the nearest ChatTransportProvider.\n *\n * The transport is created by ChatTransportProvider, which also wraps the subtree\n * with TransportProvider and Ably's ChannelProvider. This hook is a thin context\n * reader — it does not create or manage any transport state.\n *\n * Pass `channelName` to look up a specific provider by name. Omit to use the nearest\n * provider in the tree. Pass `skip: true` to defer (e.g. when auth is not yet resolved)\n * — returns stub transports whose properties throw with a descriptive error.\n */\n\nimport * as Ably from 'ably';\nimport type * as AI from 'ai';\nimport { useContext } from 'react';\n\nimport type { ClientTransport, Tree, View } from '../../core/transport/types.js';\nimport { ErrorCode } from '../../errors.js';\nimport type { ChatTransport } from '../transport/index.js';\nimport { ChatTransportContext } from './contexts/chat-transport-context.js';\n\nconst SKIPPED_CLIENT_TRANSPORT: ClientTransport<AI.UIMessageChunk, AI.UIMessage> = {\n get tree(): Tree<AI.UIMessage> {\n throw new Ably.ErrorInfo('unable to access tree; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n get view(): View<AI.UIMessageChunk, AI.UIMessage> {\n throw new Ably.ErrorInfo('unable to access view; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n createView: (): View<AI.UIMessageChunk, AI.UIMessage> => {\n throw new Ably.ErrorInfo('unable to create view; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n cancel: () => {\n throw new Ably.ErrorInfo('unable to cancel; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n stageEvents: () => {\n throw new Ably.ErrorInfo('unable to stage events; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n stageMessage: () => {\n throw new Ably.ErrorInfo('unable to stage message; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n waitForTurn: () => {\n throw new Ably.ErrorInfo('unable to wait for turn; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n on: () => {\n throw new Ably.ErrorInfo('unable to subscribe; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n close: () => {\n throw new Ably.ErrorInfo('unable to close; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n};\n\nconst SKIPPED_CHAT_TRANSPORT: ChatTransport = {\n sendMessages: (): never => {\n throw new Ably.ErrorInfo('unable to send messages; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n reconnectToStream: (): never => {\n throw new Ably.ErrorInfo('unable to reconnect to stream; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n close: (): never => {\n throw new Ably.ErrorInfo('unable to close; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n get streaming(): never {\n throw new Ably.ErrorInfo('unable to access streaming; hook is skipped', ErrorCode.InvalidArgument, 400);\n },\n onStreamingChange: (): never => {\n throw new Ably.ErrorInfo(\n 'unable to subscribe to streaming changes; hook is skipped',\n ErrorCode.InvalidArgument,\n 400,\n );\n },\n};\n\n/** Options for {@link useChatTransport}. */\nexport interface UseChatTransportOptions {\n /** Channel name to look up; omit to use the nearest {@link ChatTransportProvider}. */\n channelName?: string;\n /** When `true`, return stub transports that throw on any access. */\n skip?: boolean;\n}\n\n/**\n * The value returned by {@link useChatTransport}.\n * Provides both the underlying {@link ClientTransport} and the {@link ChatTransport}\n * adapter for Vercel's useChat hook.\n */\nexport interface ChatTransportHandle {\n /**\n * The underlying client transport, also available via {@link useClientTransport}.\n * A throwing stub when `skip` is `true`, when no matching {@link TransportProvider}\n * was found in the tree, or when transport construction failed. Check `transportError` before use.\n */\n transport: ClientTransport<AI.UIMessageChunk, AI.UIMessage>;\n\n /**\n * The chat transport adapter for use with Vercel's `useChat` hook.\n *\n * A throwing stub when `skip` is `true`, when no matching\n * {@link ChatTransportProvider} was found in the tree, or when the underlying\n * {@link ClientTransport} construction failed. Check both `chatTransportError`\n * and `transportError` before use.\n */\n chatTransport: ChatTransport;\n\n /**\n * Set when no matching {@link TransportProvider} was found, when transport\n * construction failed, and `skip` is `false`.\n * `undefined` when the transport resolved successfully or when `skip` is `true`.\n */\n transportError?: Ably.ErrorInfo | undefined;\n /**\n * Set when no matching {@link ChatTransportProvider} was found or when transport\n * construction failed, and `skip` is `false`.\n * `undefined` when the transport resolved successfully or when `skip` is `true`.\n */\n chatTransportError?: Ably.ErrorInfo | undefined;\n}\n\n/**\n * Access a {@link ChatTransport} and {@link ClientTransport} from the nearest {@link ChatTransportProvider}.\n *\n * When `channelName` is omitted, the innermost `ChatTransportProvider` in the tree is used.\n * When `skip` is `true`, returns stub transports whose every property and method throws\n * an {@link Ably.ErrorInfo} — safe to hold in state before conditions are ready.\n * When no provider is found, returns stubs with `chatTransportError` set instead of throwing.\n * @param props - Options for selecting the transport.\n * @param props.channelName - The channel name passed to the enclosing `ChatTransportProvider`. Omit to use the nearest.\n * @param props.skip - When `true`, return stubs that throw on any access instead of reading from context.\n * @returns The `ChatTransportHandle` containing both the chat transport adapter and the underlying client transport.\n */\nexport const useChatTransport = ({ channelName, skip }: UseChatTransportOptions = {}): ChatTransportHandle => {\n const { nearest, providers } = useContext(ChatTransportContext);\n\n if (skip) {\n return { transport: SKIPPED_CLIENT_TRANSPORT, chatTransport: SKIPPED_CHAT_TRANSPORT };\n }\n\n if (channelName !== undefined) {\n const slot = providers[channelName];\n if (slot) {\n return { transport: slot.transport, chatTransport: slot.chatTransport, transportError: slot.transportError };\n }\n return {\n transport: SKIPPED_CLIENT_TRANSPORT,\n chatTransport: SKIPPED_CHAT_TRANSPORT,\n transportError: new Ably.ErrorInfo(\n `unable to use client transport; no TransportProvider found for channelName \"${channelName}\"`,\n ErrorCode.BadRequest,\n 400,\n ),\n chatTransportError: new Ably.ErrorInfo(\n `unable to use chat transport; no ChatTransportProvider found for channelName \"${channelName}\"`,\n ErrorCode.BadRequest,\n 400,\n ),\n };\n }\n\n if (nearest) {\n return {\n transport: nearest.transport,\n chatTransport: nearest.chatTransport,\n transportError: nearest.transportError,\n };\n }\n\n return {\n transport: SKIPPED_CLIENT_TRANSPORT,\n chatTransport: SKIPPED_CHAT_TRANSPORT,\n transportError: new Ably.ErrorInfo(\n 'unable to use transport; no TransportProvider found in the tree',\n ErrorCode.BadRequest,\n 400,\n ),\n chatTransportError: new Ably.ErrorInfo(\n 'unable to use chat transport; no ChatTransportProvider found in the tree',\n ErrorCode.BadRequest,\n 400,\n ),\n };\n};\n","/**\n * useMessageSync: wires transport message lifecycle events into useChat's setMessages.\n *\n * Subscribes to the transport view's 'update' event and replaces messages state\n * with the view's authoritative message list.\n *\n * When a ChatTransport is provided (resolved from the nearest ChatTransportProvider),\n * setMessages calls are gated during active own-turn streams. This prevents the\n * push/replace ID mismatch in useChat's write() function. When the stream finishes,\n * the gate opens and an immediate sync fires to pick up any observer messages that\n * arrived during the stream.\n *\n * All dependencies are resolved from the nearest ChatTransportProvider via\n * useChatTransport(). Pass channelName to select a specific provider; omit to use\n * the nearest. Pass skip: true to pause all subscriptions.\n *\n * Returns the unsubscribe function in the useEffect cleanup so handlers\n * are removed on unmount or when dependencies change.\n */\n\nimport type * as AI from 'ai';\nimport { useEffect, useState } from 'react';\n\nimport { useChatTransport } from './use-chat-transport.js';\n\n/** Options for {@link useMessageSync}. */\nexport interface UseMessageSyncOptions {\n /**\n * The `setMessages` updater function from `useChat()`. Required.\n * Called with a function that replaces the previous message list with the\n * transport's current authoritative message list.\n */\n setMessages: (updater: (prev: AI.UIMessage[]) => AI.UIMessage[]) => void;\n /**\n * Channel name of the {@link ChatTransportProvider} to observe.\n * Omit to use the nearest provider in the tree.\n */\n channelName?: string;\n /**\n * When `true`, skip all subscriptions and do nothing.\n * Use when the hook's dependencies are not yet resolved (e.g. auth pending).\n */\n skip?: boolean;\n}\n\n/**\n * Wire transport message updates into `useChat()`'s `setMessages` updater.\n *\n * Resolves both the transport view and the streaming gate from the nearest\n * `ChatTransportProvider`. Pass `channelName` to target a specific provider.\n * Pass `skip: true` to pause all subscriptions.\n * @param options - Hook options.\n * @param options.setMessages - The `setMessages` function from `useChat()`. Required.\n * @param options.channelName - Channel name of the provider to observe; defaults to nearest.\n * @param options.skip - When `true`, skip all subscriptions.\n */\nexport const useMessageSync = ({ setMessages, channelName, skip }: UseMessageSyncOptions): void => {\n const { transport, chatTransport, chatTransportError } = useChatTransport({ channelName, skip });\n\n // Only use resolved values when a provider was found and skip is false.\n const resolved = !skip && !chatTransportError;\n const view = resolved ? transport.view : undefined;\n const resolvedChatTransport = resolved ? chatTransport : undefined;\n\n const [gated, setGated] = useState(false);\n\n // Subscribe to the ChatTransport's streaming state to gate setMessages.\n // Reset gated to the new instance's current state so a stale `true`\n // from a previous instance doesn't permanently suppress syncs.\n useEffect(() => {\n if (!resolvedChatTransport) {\n setGated(false);\n return;\n }\n setGated(resolvedChatTransport.streaming);\n return resolvedChatTransport.onStreamingChange(setGated);\n }, [resolvedChatTransport]);\n\n // Subscribe to view updates and sync messages, unless gated.\n useEffect(() => {\n if (!view || gated) return;\n\n const sync = (): void => {\n setMessages(() => view.flattenNodes().map((n) => n.message));\n };\n\n // Sync immediately when the effect runs (covers gate-open and initial mount).\n sync();\n\n return view.on('update', sync);\n }, [view, setMessages, gated]);\n};\n","/**\n * useStagedAddToolApprovalResponse — wrap useChat's `addToolApprovalResponse`\n * so the approval response is also applied to the transport tree\n * synchronously at click time.\n *\n * Patching the tree at click time eliminates the useChat↔tree divergence\n * the ChatTransport would otherwise have to reconcile via a history\n * overlay, and closes the observer-turn race that could wipe the\n * approval state between `addToolApprovalResponse` and\n * `sendAutomaticallyWhen`'s evaluation.\n *\n * Use this in place of useChat's raw `addToolApprovalResponse` wherever\n * you wire Approve / Deny buttons.\n */\n\nimport type * as AI from 'ai';\nimport type { ChatAddToolApproveResponseFunction } from 'ai';\nimport { useCallback } from 'react';\n\nimport type { ClientTransport } from '../../core/transport/types.js';\n\n/**\n * Returns a function with the same signature as useChat's\n * `addToolApprovalResponse`, but additionally applies the approval\n * response to the transport tree via `stageMessage` before delegating.\n *\n * If the tool call identified by `opts.id` isn't found in the tree,\n * the tree update is skipped and the raw function is still called —\n * matches useChat's tolerant behavior for stale approval ids.\n * @param transport - The client transport whose tree to patch.\n * @param addToolApprovalResponse - The raw function from `useChat()`.\n * @returns A drop-in replacement that patches the tree then delegates.\n */\nexport const useStagedAddToolApprovalResponse = (\n transport: ClientTransport<AI.UIMessageChunk, AI.UIMessage>,\n addToolApprovalResponse: ChatAddToolApproveResponseFunction,\n): ChatAddToolApproveResponseFunction =>\n useCallback<ChatAddToolApproveResponseFunction>(\n (opts) => {\n stageApprovalResponseOnTree(transport, opts);\n return addToolApprovalResponse(opts);\n },\n [transport, addToolApprovalResponse],\n );\n\n/**\n * Locate the assistant message whose `dynamic-tool` part carries the\n * given `approval.id`, build a patched copy with the part transitioned\n * to `approval-responded`, and stage the patched message on the tree.\n * @param transport - The transport whose tree to patch.\n * @param opts - The approval response being applied.\n * @param opts.id - The approval id matching a dynamic-tool part in the tree.\n * @param opts.approved - Whether the user approved or denied.\n * @param opts.reason - Optional reason accompanying the response.\n */\nconst stageApprovalResponseOnTree = (\n transport: ClientTransport<AI.UIMessageChunk, AI.UIMessage>,\n opts: { id: string; approved: boolean; reason?: string },\n): void => {\n const nodes = transport.view.flattenNodes();\n for (const node of nodes) {\n const partIndex = node.message.parts.findIndex((p) => p.type === 'dynamic-tool' && p.approval?.id === opts.id);\n if (partIndex === -1) continue;\n\n // CAST: findIndex predicate above narrows this to a dynamic-tool part\n // with a non-undefined approval.\n const part = node.message.parts[partIndex] as AI.DynamicToolUIPart;\n\n // Build the approval-responded variant directly rather than spreading\n // `part`, which TypeScript narrows to whichever source-state variant\n // the union discriminator inferred and then rejects when we change\n // `state` to a variant with different approval/output constraints.\n const patchedPart: AI.DynamicToolUIPart = {\n type: 'dynamic-tool',\n toolName: part.toolName,\n toolCallId: part.toolCallId,\n state: 'approval-responded',\n input: part.input,\n approval: { id: opts.id, approved: opts.approved, reason: opts.reason },\n };\n\n const patchedParts = [...node.message.parts];\n patchedParts[partIndex] = patchedPart;\n transport.stageMessage(node.msgId, { ...node.message, parts: patchedParts });\n return;\n }\n};\n"],"x_google_ignoreList":[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"mappings":";;;;;AA2BA,IAAa,IAAmB,EAAqC,EAAE,CAAC,EAS3D,IAA0B,EAAyC,KAAA,EAAU,ECpB7E,IAAgB,iBAGhB,IAAgB,iBAGhB,IAAmB,oBAGnB,IAAkB,mBAOlB,IAAiB,kBAGjB,IAAgB,iBAGhB,KAAwB,yBAGxB,KAAc,eAGd,KAAe,gBAOf,KAAwB,yBAGxB,KAAoB,qBAGpB,KAAoB,qBAGpB,KAA0B,2BAO1B,KAAgB,iBAGhB,KAAiB,kBAcjB,KAAe,iBAGf,KAAmB,qBAGnB,KAAiB,mBAajB,KAAuB,aClGxB,IAAL,yBAAA,GAAA;QAIL,EAAA,EAAA,aAAA,OAAA,cAKA,EAAA,EAAA,kBAAA,SAAA,mBAQA,EAAA,EAAA,wBAAA,SAAA,yBAKA,EAAA,EAAA,6BAAA,UAAA,8BAKA,EAAA,EAAA,sBAAA,UAAA,uBAKA,EAAA,EAAA,qBAAA,UAAA,sBAKA,EAAA,EAAA,kBAAA,UAAA,mBAKA,EAAA,EAAA,sBAAA,UAAA,uBAOA,EAAA,EAAA,wBAAA,UAAA,yBAMA,EAAA,EAAA,kBAAA,UAAA,mBAOA,EAAA,EAAA,cAAA,UAAA;KACD,EASY,MAAe,GAA2B,MAA8B,EAAU,SAAS,GCPlG,MAAgB,OAA6B;CACjD,YAAY,GAAgB,GAAgB,MAAqB;AAC/D,IAAO,MAAM,GAAQ,EAAE,QAAQ,GAAS,CAAC;;CAE3C,iBAAiB;CAClB,GAKK,KACJ,EAAK,SACL,cAYW,KAAb,cAA6C,GAAgC;CAK3E,YAAY,GAAgB;AAC1B,QAAM,GAAa,EAAO,CAAC;;GC5CnB,IAAL,yBAAA,GAAA;QAKL,EAAA,QAAA,SAMA,EAAA,QAAA,SAKA,EAAA,OAAA,QAMA,EAAA,OAAA,QAMA,EAAA,QAAA,SAKA,EAAA,SAAA;KACD,EAuBY,MAAiB,GAAiB,GAAiB,MAAyB;CACvF,IAAM,IAAgB,IAAU,cAAc,KAAK,UAAU,EAAQ,KAAK,IACpE,IAAmB,qBAAI,IAAI,MAAM,EAAC,aAAa,CAAC,IAAI,EAAM,SAAS,CAAC,aAAa,CAAC,sBAAsB,IAAU;AAExH,SAAQ,GAAR;EACE,KAAK,EAAS;EACd,KAAK,EAAS;AACZ,WAAQ,IAAI,EAAiB;AAC7B;EAEF,KAAK,EAAS;AACZ,WAAQ,KAAK,EAAiB;AAC9B;EAEF,KAAK,EAAS;AACZ,WAAQ,KAAK,EAAiB;AAC9B;EAEF,KAAK,EAAS;AACZ,WAAQ,MAAM,EAAiB;AAC/B;EAEF,KAAK,EAAS,OACZ;;GAaO,MAAc,MAGlB,IAAI,GAFQ,EAAQ,cAAc,IAEJ,EAAQ,SAAS,EAMnD,KAAL,yBAAA,GAAA;QACE,EAAA,EAAA,QAAA,KAAA,SACA,EAAA,EAAA,QAAA,KAAA,SACA,EAAA,EAAA,OAAA,KAAA,QACA,EAAA,EAAA,OAAA,KAAA,QACA,EAAA,EAAA,QAAA,KAAA,SACA,EAAA,EAAA,SAAA,KAAA;EANG,MAAA,EAAA,CAOJ,EAKK,KAAoB,IAAI,IAA8B;CAC1D,CAAC,EAAS,OAAO,GAAe,MAAM;CACtC,CAAC,EAAS,OAAO,GAAe,MAAM;CACtC,CAAC,EAAS,MAAM,GAAe,KAAK;CACpC,CAAC,EAAS,MAAM,GAAe,KAAK;CACpC,CAAC,EAAS,OAAO,GAAe,MAAM;CACtC,CAAC,EAAS,QAAQ,GAAe,OAAO;CACzC,CAAC,EAKI,KAAN,MAAM,EAAgC;CAKpC,YAAY,GAAqB,GAAiB,GAAsB;AAEtE,EADA,KAAK,WAAW,GAChB,KAAK,WAAW;EAEhB,IAAM,IAAc,GAAkB,IAAI,EAAM;AAChD,MAAI,MAAgB,KAAA,EAClB,OAAM,IAAI,EAAK,UAAU,+CAA+C,KAAS,EAAU,iBAAiB,IAAI;AAGlH,OAAK,eAAe;;CAGtB,MAAM,GAAiB,GAA4B;AACjD,OAAK,OAAO,GAAS,EAAS,OAAO,GAAe,OAAO,EAAQ;;CAGrE,MAAM,GAAiB,GAA4B;AACjD,OAAK,OAAO,GAAS,EAAS,OAAO,GAAe,OAAO,EAAQ;;CAGrE,KAAK,GAAiB,GAA4B;AAChD,OAAK,OAAO,GAAS,EAAS,MAAM,GAAe,MAAM,EAAQ;;CAGnE,KAAK,GAAiB,GAA4B;AAChD,OAAK,OAAO,GAAS,EAAS,MAAM,GAAe,MAAM,EAAQ;;CAGnE,MAAM,GAAiB,GAA4B;AACjD,OAAK,OAAO,GAAS,EAAS,OAAO,GAAe,OAAO,EAAQ;;CAGrE,YAAY,GAA6B;EAEvC,IAAM,IACJ,CAAC,GAAG,GAAkB,SAAS,CAAC,CAAC,MAAM,GAAG,OAAW,MAAU,KAAK,aAAa,GAAG,MAAM,EAAS;AAErG,SAAO,IAAI,EAAc,KAAK,UAAU,GAAe,KAAK,cAAc,EAAQ,CAAC;;CAGrF,OAAe,GAAiB,GAAiB,GAA6B,GAA4B;AACxG,EAAI,KAAe,KAAK,gBACtB,KAAK,SAAS,GAAS,GAAO,KAAK,cAAc,EAAQ,CAAC;;CAI9D,cAAsB,GAA8C;AAKlE,SAJK,KAAK,WAIH,IAAU;GAAE,GAAG,KAAK;GAAU,GAAG;GAAS,GAAG,KAAK,WAHhD,KAAW,KAAA;;GC1NX,MAAc,MAAyD;CAElF,IAAM,IAAS,EAAQ;AACvB,KAAI,CAAC,KAAU,OAAO,KAAW,SAAU,QAAO,EAAE;CACpD,IAAM,IAAW,EAAiC;AAIlD,QAHI,CAAC,KAAW,OAAO,KAAY,WAAiB,EAAE,GAG/C;GAQI,MAAa,MAAuC;AAC3D,WAAU,KAAA,EACd,KAAI;AACF,SAAO,KAAK,MAAM,EAAM;SAClB;AACN;;GAyCS,MACX,GACA,OAC4B;CAC5B,GAAG;CACH,GAAG;CACJ,GAOY,MAAa,MAAmD;AACvE,WAAU,KAAA,EACd,QAAO,MAAU;GAyBN,MAAmB,GAAiC,MAC/D,EAAQ,KAAuB,IAwBpB,KAAqD,MAAwB;CACxF,IAAM,IAAS,EAAE;AACjB,MAAK,IAAM,KAAO,EAChB,CAAI,OAAO,UAAU,eAAe,KAAK,GAAK,EAAI,IAAI,EAAI,OAAS,KAAA,MACjE,EAAO,KAAO,EAAI;AAKtB,QAAO;GA2BI,MAAgB,OAAyD;CACpF,MAAM,MAAgB,GAAgB,GAAS,EAAI;CACnD,QAAQ,GAAa,MAAqB,GAAgB,GAAS,EAAI,IAAI;CAC3E,OAAO,MAAgB,GAAU,GAAgB,GAAS,EAAI,CAAC;CAC/D,OAAO,MAAgB,GAAU,GAAgB,GAAS,EAAI,CAAC;CAChE,GA0BY,UAAyC;CACpD,IAAM,IAA4B,EAAE,EAC9B,IAA6B;EACjC,MAAM,GAAa,OACb,MAAU,KAAA,MAAW,EAAE,KAAuB,KAAO,IAClD;EAET,OAAO,GAAa,OACd,MAAU,KAAA,MAAW,EAAE,KAAuB,KAAO,OAAO,EAAM,GAC/D;EAET,OAAO,GAAa,OACd,KAAiC,SAAM,EAAE,KAAuB,KAAO,KAAK,UAAU,EAAM,GACzF;EAET,aAAa;EACd;AACD,QAAO;GCtMI,MAAyB,MAQR;CAC5B,IAAM,IAA4B;GAC/B,KAAc,EAAK;GACnB,IAAiB,EAAK;GACtB,IAAgB,EAAK;EACvB;AAKD,QAJI,EAAK,iBAAiB,KAAA,MAAW,EAAE,MAAyB,EAAK,eACjE,EAAK,WAAQ,EAAE,MAAiB,EAAK,SACrC,EAAK,WAAQ,EAAE,MAAkB,EAAK,SACtC,EAAK,UAAO,EAAE,MAAgB,EAAK,QAChC;GCXH,KAAN,MAAkE;CAKhE,YAAY,GAAwC,GAAgB;AAElE,gCANwB,IAAI,KAAgC,EAK5D,KAAK,cAAc,GACnB,KAAK,UAAU;;CAGjB,aAAa,GAAwC;AACnD,OAAK,QAAQ,MAAM,gCAAgC,EAAE,WAAQ,CAAC;EAI9D,IAAM,IAAkE,EAAE,EACpE,IAAS,IAAI,eAAuB,EACxC,MAAM,GAAY;AAChB,KAAM,aAAa;KAEtB,CAAC;AACF,MAAI,CAAC,EAAM,WACT,OAAM,IAAI,EAAK,UACb,gFACA,EAAU,4BACV,IACD;AAGH,SADA,KAAK,OAAO,IAAI,GAAQ;GAAE,YAAY,EAAM;GAAY;GAAQ,CAAC,EAC1D;;CAIT,YAAY,GAAyB;EACnC,IAAM,IAAO,KAAK,OAAO,IAAI,EAAO;AACpC,MAAI,CAAC,EAAM,QAAO;AAElB,OAAK,QAAQ,MAAM,8CAA8C,EAAE,WAAQ,CAAC;AAC5E,MAAI;AACF,KAAK,WAAW,OAAO;UACjB;AAIR,SADA,KAAK,OAAO,OAAO,EAAO,EACnB;;CAIT,YAAY,GAAgB,GAAgC;EAC1D,IAAM,IAAO,KAAK,OAAO,IAAI,EAAO;AACpC,MAAI,CAAC,EAAM,QAAO;AAElB,OAAK,QAAQ,MAAM,+CAA+C,EAAE,WAAQ,CAAC;AAC7E,MAAI;AACF,KAAK,WAAW,MAAM,EAAM;UACtB;AAIR,SADA,KAAK,OAAO,OAAO,EAAO,EACnB;;CAIT,MAAM,GAAgB,GAAwB;EAC5C,IAAM,IAAO,KAAK,OAAO,IAAI,EAAO;AACpC,MAAI,CAAC,EAAM,QAAO;AAElB,MAAI;AACF,KAAK,WAAW,QAAQ,EAAM;UACxB;AAEN,UADA,KAAK,OAAO,OAAO,EAAO,EACnB;;AAMT,SAHI,KAAK,YAAY,EAAM,IACzB,KAAK,YAAY,EAAO,EAEnB;;CAGT,IAAI,GAAyB;AAC3B,SAAO,KAAK,OAAO,IAAI,EAAO;;GAcrB,MACX,GACA,MACyB,IAAI,GAAoB,GAAY,EAAO,EC3CzD,KAAb,MAAqE;CA6BnE,IAAI,oBAA4B;AAC9B,SAAO,KAAK;;CAGd,YAAY,GAAgB;AAE1B,oCAjC4B,IAAI,KAAqC,qBAOd,EAAE,sCAM3B,IAAI,KAAsC,wCAMxC,IAAI,KAAqB,qBAGrC,6BAGO,GAO3B,KAAK,UAAU,GACf,KAAK,WAAW,IAAI,GAA4B,EAAO;;CAiBzD,cAAsB,GAA2B,GAAmC;EAClF,IAAM,IAAK,EAAE,KAAK,QACZ,IAAK,EAAE,KAAK;AAMlB,SALI,MAAO,KAAA,KAAa,MAAO,KAAA,IAAkB,EAAE,YAAY,EAAE,YAC7D,MAAO,KAAA,IAAkB,IACzB,MAAO,KAAA,KACP,IAAK,IAAW,KAChB,IAAK,IAAW,IACb,EAAE,YAAY,EAAE;;CAOzB,cAAsB,GAAwC;AAI5D,MAHe,EAAS,KAAK,WAGd,KAAA,GAAW;AACxB,QAAK,YAAY,KAAK,EAAS;AAC/B;;EAIF,IAAI,IAAK,GACL,IAAK,KAAK,YAAY;AAC1B,SAAO,IAAK,IAAI;GACd,IAAM,IAAO,IAAK,MAAQ,GACpB,IAAU,KAAK,YAAY;AACjC,OAAI,CAAC,EAAS;AACd,GAAI,KAAK,cAAc,GAAS,EAAS,IAAI,IAC3C,IAAK,IAAM,IAEX,IAAK;;AAGT,OAAK,YAAY,OAAO,GAAI,GAAG,EAAS;;CAO1C,cAAsB,GAAwC;EAC5D,IAAM,IAAM,KAAK,YAAY,QAAQ,EAAS;AAC9C,EAAI,MAAQ,MAAI,KAAK,YAAY,OAAO,GAAK,EAAE;;CAOjD,kBAA0B,GAA8B,GAAqB;EAC3E,IAAI,IAAM,KAAK,aAAa,IAAI,EAAS;AAKzC,EAJK,MACH,oBAAM,IAAI,KAAK,EACf,KAAK,aAAa,IAAI,GAAU,EAAI,GAEtC,EAAI,IAAI,EAAM;;CAGhB,uBAA+B,GAA8B,GAAqB;EAChF,IAAM,IAAM,KAAK,aAAa,IAAI,EAAS;AAC3C,EAAI,MACF,EAAI,OAAO,EAAM,EACb,EAAI,SAAS,KAAG,KAAK,aAAa,OAAO,EAAS;;CAmB1D,iBAAyB,GAAwC;EAC/D,IAAM,IAAQ,KAAK,WAAW,IAAI,EAAM;AACxC,MAAI,CAAC,EAAO,QAAO,EAAE;EAIrB,IAAI,IAAW,EAAM,MACf,IAAe,IAAI,IAAY,CAAC,EAAS,MAAM,CAAC;AACtD,SAAO,EAAS,UACV,GAAa,IAAI,EAAS,OAAO,GADf;GAEtB,IAAM,IAAa,KAAK,WAAW,IAAI,EAAS,OAAO;AACvD,OAAI,CAAC,KAAc,EAAW,KAAK,aAAa,EAAS,SAAU;AAEnE,GADA,IAAW,EAAW,MACtB,EAAa,IAAI,EAAS,MAAM;;EAKlC,IAAM,IAAW,EAAS,UACpB,IAAa,EAAS,OACtB,IAAqC,EAAE,EAEvC,IAAe,KAAK,aAAa,IAAI,EAAS;AACpD,MAAI,EACF,MAAK,IAAM,KAAW,GAAc;GAClC,IAAM,IAAa,KAAK,WAAW,IAAI,EAAQ;AAC/C,GAAI,KAAc,KAAK,aAAa,EAAW,MAAM,EAAW,IAC9D,EAAS,KAAK,EAAW;;AAS/B,SADA,EAAS,MAAM,GAAG,MAAM,KAAK,cAAc,GAAG,EAAE,CAAC,EAC1C,EAAS,KAAK,MAAM,EAAE,KAAK;;CAWpC,aAAqB,GAA6B,GAA6B;AAC7E,MAAI,EAAK,UAAU,EAAY,QAAO;EACtC,IAAI,IAAU,GACR,IAAU,IAAI,IAAY,CAAC,EAAQ,MAAM,CAAC;AAChD,SAAO,EAAQ,SAAQ;AACrB,OAAI,EAAQ,WAAW,EAAY,QAAO;AAC1C,OAAI,EAAQ,IAAI,EAAQ,OAAO,CAAE;GACjC,IAAM,IAAS,KAAK,WAAW,IAAI,EAAQ,OAAO;AAClD,OAAI,CAAC,EAAQ;AAEb,GADA,IAAU,EAAO,MACjB,EAAQ,IAAI,EAAQ,MAAM;;AAE5B,SAAO;;CAST,aAAa,GAAuB;EAClC,IAAM,IAAQ,KAAK,WAAW,IAAI,EAAM;AACxC,MAAI,CAAC,EAAO,QAAO;EAEnB,IAAI,IAAU,EAAM,MACd,IAAU,IAAI,IAAY,CAAC,EAAQ,MAAM,CAAC;AAChD,SAAO,EAAQ,UACT,GAAQ,IAAI,EAAQ,OAAO,GADV;GAErB,IAAM,IAAa,KAAK,WAAW,IAAI,EAAQ,OAAO;AACtD,OAAI,CAAC,KAAc,EAAW,KAAK,aAAa,EAAQ,SAAU;AAElE,GADA,IAAU,EAAW,MACrB,EAAQ,IAAI,EAAQ,MAAM;;AAE5B,SAAO,EAAQ;;CAOjB,aAAa,GAA0D;AACrE,OAAK,QAAQ,MAAM,8BAA8B;EACjD,IAAM,IAAkC,EAAE,EACpC,oBAAc,IAAI,KAAa,EAG/B,oBAAiB,IAAI,KAAqB;AAEhD,OAAK,IAAM,KAAY,KAAK,aAAa;GACvC,IAAM,IAAO,EAAS,MAChB,EAAE,UAAO,gBAAa;AAG5B,OAAI,MAAa,KAAA,KAAa,CAAC,EAAY,IAAI,EAAS,CACtD;GAIF,IAAM,IAAQ,KAAK,iBAAiB,EAAM;AAC1C,OAAI,EAAM,SAAS,GAAG;IACpB,IAAM,IAAc,KAAK,aAAa,EAAM,EACxC,IAAa,EAAe,IAAI,EAAY;AAChD,QAAI,MAAe,KAAA,GAAW;KAC5B,IAAM,IAAc,EAAW,IAAI,EAAY;AAE/C,SAAI,KAAe,EAAM,MAAM,MAAM,EAAE,UAAU,EAAY,CAC3D,KAAa;UACR;MACL,IAAM,IAAS,EAAM,GAAG,GAAG;AAC3B,UAAI,CAAC,EAAQ;AACb,UAAa,EAAO;;AAEtB,OAAe,IAAI,GAAa,EAAW;;AAE7C,QAAI,MAAU,EACZ;;AAKJ,GADA,EAAY,IAAI,EAAM,EACtB,EAAO,KAAK,EAAK;;AAGnB,SAAO;;CAGT,YAAY,GAA2B;AAErC,SADA,KAAK,QAAQ,MAAM,8BAA8B,EAAE,UAAO,CAAC,EACpD,KAAK,iBAAiB,EAAM,CAAC,KAAK,MAAM,EAAE,QAAQ;;CAG3D,gBAAgB,GAAwC;AACtD,SAAO,KAAK,iBAAiB,EAAM;;CAGrC,YAAY,GAAwB;AAClC,SAAO,KAAK,iBAAiB,EAAM,CAAC,SAAS;;CAG/C,QAAQ,GAAkD;AAExD,SADA,KAAK,QAAQ,MAAM,0BAA0B,EAAE,UAAO,CAAC,EAChD,KAAK,WAAW,IAAI,EAAM,EAAE;;CAGrC,WAAW,GAAmD;AAE5D,SADA,KAAK,QAAQ,MAAM,6BAA6B,EAAE,UAAO,CAAC,EACnD,KAAK,WAAW,IAAI,EAAM,EAAE,KAAK;;CAO1C,OAAO,GAAe,GAAmB,GAAiC,GAAuB;EAC/F,IAAM,IAAW,EAAA,oBAA0B,KAAA,GACrC,IAAS,EAAA,qBAA2B,KAAA,GAEpC,IAAW,KAAK,WAAW,IAAI,EAAM;AAC3C,MAAI,GAAU;AAkBZ,GAdA,EAAS,KAAK,UAAU,GACpB,OAAO,KAAK,EAAQ,CAAC,SAAS,MAChC,EAAS,KAAK,UAAU,EAAE,GAAG,GAAS,GAIpC,KAAU,CAAC,EAAS,KAAK,WAC3B,KAAK,QAAQ,MAAM,mCAAmC;IAAE;IAAO;IAAQ,CAAC,EACxE,EAAS,KAAK,SAAS,GAEvB,KAAK,cAAc,EAAS,EAC5B,KAAK,cAAc,EAAS,EAC5B,KAAK,uBAEP,KAAK,SAAS,KAAK,SAAS;AAC5B;;AAGF,OAAK,QAAQ,MAAM,qCAAqC;GAAE;GAAO;GAAU;GAAQ,CAAC;EAYpF,IAAM,IAAmC;GAAE,MAVP;IAClC,MAAM;IACN;IACA;IACA;IACA;IACA,SAAS,EAAE,GAAG,GAAS;IACvB;IACD;GAEgD,WAAW,KAAK;GAAe;AAKhF,EAJA,KAAK,WAAW,IAAI,GAAO,EAAS,EACpC,KAAK,kBAAkB,GAAU,EAAM,EACvC,KAAK,cAAc,EAAS,EAC5B,KAAK,sBACL,KAAK,SAAS,KAAK,SAAS;;CAG9B,OAAO,GAAqB;EAC1B,IAAM,IAAQ,KAAK,WAAW,IAAI,EAAM;AACxC,MAAI,CAAC,EAAO;AAEZ,OAAK,QAAQ,MAAM,kBAAkB,EAAE,UAAO,CAAC;EAE/C,IAAM,EAAE,YAAS;AAcjB,EAXA,KAAK,uBAAuB,EAAK,UAAU,EAAM,EAGjD,KAAK,cAAc,EAAM,EAGzB,KAAK,WAAW,OAAO,EAAM,EAI7B,KAAK,sBACL,KAAK,SAAS,KAAK,SAAS;;CAQ9B,mBAA6C;AAC3C,OAAK,QAAQ,MAAM,kCAAkC;EACrD,IAAM,oBAAS,IAAI,KAA0B;AAC7C,OAAK,IAAM,CAAC,GAAQ,MAAa,KAAK,gBAAgB;GACpD,IAAI,IAAM,EAAO,IAAI,EAAS;AAK9B,GAJK,MACH,oBAAM,IAAI,KAAa,EACvB,EAAO,IAAI,GAAU,EAAI,GAE3B,EAAI,IAAI,EAAO;;AAEjB,SAAO;;CAOT,GACE,GACA,GACY;EAEZ,IAAM,IAAK;AAEX,SADA,KAAK,SAAS,GAAG,GAAO,EAAG,QACd;AACX,QAAK,SAAS,IAAI,GAAO,EAAG;;;CAYhC,gBAAgB,GAAgC;AAE9C,EADA,KAAK,QAAQ,MAAM,iCAAiC,EACpD,KAAK,SAAS,KAAK,gBAAgB,EAAI;;CAOzC,SAAS,GAAiC;AAExC,EADA,KAAK,QAAQ,MAAM,2BAA2B,EAAE,QAAQ,EAAM,QAAQ,CAAC,EACvE,KAAK,SAAS,KAAK,QAAQ,EAAM;;CAQnC,UAAU,GAAgB,GAAwB;AAEhD,EADA,KAAK,QAAQ,MAAM,4BAA4B;GAAE;GAAQ;GAAU,CAAC,EACpE,KAAK,eAAe,IAAI,GAAQ,EAAS;;CAO3C,YAAY,GAAsB;AAEhC,EADA,KAAK,QAAQ,MAAM,8BAA8B,EAAE,WAAQ,CAAC,EAC5D,KAAK,eAAe,OAAO,EAAO;;GAezB,MAAwB,MAA0C,IAAI,GAAY,EAAO,EC7bhG,MAA+B,MAAmE;CAEtG,IAAM,IAAgB,CAAC,GAAG,EAAM,YAAY,CAAC,YAAY,EAGnD,IAAU,EAAM,MAAM,eAAe,EACrC,oBAAQ,IAAI,KAUf,EACG,IAAqB,EAAM,MAAM,mBAAmB,EACtD,IAAe,GAGb,oBAAkB,IAAI,KAAqC,EAC3D,oBAAkB,IAAI,KAAqB,EAE3C,IAA2B,EAAE,EAK7B,IAAkG,EAAE;AAE1G,MAAK,IAAM,KAAO,GAAe;EAC/B,IAAM,IAA6C,EAAQ,OAAO,EAAI,EAChE,IAAU,GAAW,EAAI,EACzB,IAAS,EAAQ,IACjB,IAAQ,EAAQ,IAChB,IAAS,EAAI,QACb,IAAc,EAAQ;AAI5B,MAAI,GAAa;AACf,QAAK,IAAM,KAAQ,EAAM,QAAQ,CAC/B,KAAI,EAAK,WAAW,IAAI,EAAY,EAAE;IAEpC,IAAM,IADa,CAAC,GAAG,EAAK,WAAW,MAAM,CAAC,CAClB,QAAQ,EAAY,EAC1C,IAAa,MAAa,KAAK,KAAA,IAAY,EAAK,YAAY,SAAS;AAK3E,IAJI,KACF,EAAK,YAAY,YAAY,GAAa,EAAW,EAEvD,EAAK,YAAY,eAAe,EAAQ,EACxC,EAAoB,KAAK;KAAE,aAAa,EAAK;KAAa,WAAW;KAAa,CAAC;AACnF;;AAGJ;;AAGF,MAAI,GAAQ;GACV,IAAI,IAAO,EAAM,IAAI,EAAO;AAc5B,OAbK,MACH,IAAO;IACL,aAAa,EAAM,MAAM,mBAAmB;IAC5C,WAAW;IACX,4BAAY,IAAI,KAAK;IACrB,4BAAY,IAAI,KAAK;IACtB,EACD,EAAM,IAAI,GAAQ,EAAK,GAMrB,GAAO;IACT,IAAM,IAAW,EAAK,WAAW,IAAI,EAAM;AAC3C,IAAK,IAGM,OAAO,KAAK,EAAQ,CAAC,SAAS,KACvC,OAAO,OAAO,GAAU,EAAQ,IAHhC,EAAK,WAAW,IAAI,GAAO,EAAE,GAAG,GAAS,CAAC,EACtC,KAAQ,EAAK,WAAW,IAAI,GAAO,EAAO;;AAKlD,KAAK,YAAY,eAAe,EAAQ;SACnC;AACL,KAAmB,eAAe,EAAQ;AAG1C,QAAK,IAAM,KAAU,EACnB,KAAI,EAAO,SAAS,aAAa,GAAO;AACtC,MAAe,KAAK,EAAM;IAC1B,IAAM,IAAmB,EAAgB,IAAI,EAAM;AACnD,IAAK,IAGM,OAAO,KAAK,EAAQ,CAAC,SAAS,KACvC,OAAO,OAAO,GAAkB,EAAQ,IAHxC,EAAgB,IAAI,GAAO,EAAE,GAAG,GAAS,CAAC,EACtC,KAAQ,EAAgB,IAAI,GAAO,EAAO;;;;AAYxD,MAAK,IAAM,EAAE,gBAAa,kBAAe,EACvC,GAAY,gBAAgB,EAAU;CAIxC,IAAM,IAAqC,EAAE;AAG7C,MAAK,IAAM,CAAC,GAAG,MAAQ,EAAmB,kBAAkB,SAAS,EAAE;EACrE,IAAM,IAAM,EAAe;AAC3B,IAAU,KAAK;GACb,SAAS;GACT,SAAS,IAAO,EAAgB,IAAI,EAAI,IAAI,EAAE,GAAI,EAAE;GACpD,QAAQ,IAAO,EAAgB,IAAI,EAAI,IAAI,KAAM;GAClD,CAAC;;CAGJ,IAAM,IAAS,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,UAAU,GAAG,MAAM,EAAE,YAAY,EAAE,UAAU;AAChF,MAAK,IAAM,KAAQ,GAAQ;EAIzB,IAAM,IAAgB,CAAC,GAAG,EAAK,WAAW,SAAS,CAAC,EAChD,IAAY;AAEhB,OAAK,IAAM,KAAO,EAAK,YAAY,mBAAmB;GACpD,IAAM,IAAQ,EAAc;AAC5B,OAAI,GAAO;IACT,IAAM,CAAC,GAAK,KAAQ;AAMpB,IALA,EAAU,KAAK;KACb,SAAS;KACT,SAAS;KACT,QAAQ,EAAK,WAAW,IAAI,EAAI,IAAI;KACrC,CAAC,EACF;SAEA,GAAU,KAAK;IAAE,SAAS;IAAK,SAAS,EAAE;IAAE,QAAQ;IAAI,CAAC;;;AAO/D,QAAO,EAAU,YAAY;GAWzB,MAAqC,MAAmE;AAC5G,KAAI,EAAM,gBAAgB,EAAM,sBAAsB,EAAM,YAAY,OACtE,QAAO,EAAM;CAEf,IAAM,IAAS,GAAU,EAAM;AAG/B,QAFA,EAAM,eAAe,GACrB,EAAM,oBAAoB,EAAM,YAAY,QACrC;GAgDH,MACJ,GACA,MACS;AACT,MAAK,IAAM,KAAO,GAAa;EAC7B,IAAM,IAAU,GAAW,EAAI,EACzB,IAAQ,EAAQ;AAKtB,MAJI,CAAC,KAID,EAAA,gBAAuB;EAE3B,IAAM,IAAS,EAAI,QACb,IAAmB,MAAW,oBAAA,qBAAuC,GAKrE,IACJ,EAAA,qBAA2B,WAC1B,MAAW,oBAAoB,MAAW,oBAAoB,MAAW,mBACtE,IAAS,EAAQ,IACjB,IAAa,MAAW,cAAc,MAAW;AAIvD,GAFI,KAAoB,MAAkB,EAAM,cAAc,IAAI,EAAM,GACpE,KAAoB,MAAY,EAAM,iBAAiB,IAAI,EAAM,EACjE,EAAM,cAAc,IAAI,EAAM,IAAI,EAAM,iBAAiB,IAAI,EAAM,IACrE,EAAM,gBAAgB,IAAI,EAAM;;GAoBhC,KAAkB,OACtB,GACA,GACA,MACkB;AAGlB,CAFA,EAAM,YAAY,KAAK,GAAG,EAAS,MAAM,EACzC,EAAM,eAAe,GACrB,GAAoB,GAAO,EAAS,MAAM;CAE1C,IAAM,IAAS,EAAM,gBAAgB;AACrC,QAAO,EAAM,gBAAgB,OAAO,KAAU,EAAS,SAAS,GAAE;AAChE,IAAM,OAAO,MAAM,uDAAuD;GACxE,WAAW,EAAM,YAAY;GAC7B,WAAW,EAAM,gBAAgB;GAClC,CAAC;EACF,IAAM,IAAW,MAAM,EAAS,MAAM;AACtC,MAAI,CAAC,EAAU;AAIf,EAHA,IAAW,GACX,EAAM,YAAY,KAAK,GAAG,EAAS,MAAM,EACzC,EAAM,eAAe,GACrB,GAAoB,GAAO,EAAS,MAAM;;GAcxC,MAAiC,GAAuC,MAAyC;CAGrH,IAAM,IAAe,GAAgB,EAAM,EAErC,IAAY,EAAa,MAAM,EAAM,eAAe,EAAM,gBAAgB,EAAM,EAChF,IAAa,CAAC,GAAG,EAAU,CAAC,YAAY;AAC9C,GAAM,iBAAiB,EAAU;CAEjC,IAAM,IAAgB,EAAa,SAAS,EAAM,eAC5C,IAAgB,EAAM,cAAc,SAAS,IAAI,IAIjD,IADc,EAAM,YAAY,SAAS,EAAM,mBACtB,IAAI,EAAM,YAAY,MAAM,EAAM,iBAAiB,CAAC,YAAY,GAAG,EAAE;AAGpG,QAFA,EAAM,mBAAmB,EAAM,YAAY,QAEpC;EACL,OAAO,EAAW,KAAK,OAAO;GAAE,SAAS,EAAE;GAAS,SAAS,EAAE;GAAS,QAAQ,EAAE;GAAQ,EAAE;EAC5F,aAAa;EACb,eAAe,KAAiB;EAChC,MAAM,YAAY;AAChB,OAAI,EACF,QAAO,GAAY,GAAO,EAAM;AAElC,OAAI,CAAC,KAAiB,CAAC,EAAM,aAAc;GAC3C,IAAM,IAAW,MAAM,EAAM,aAAa,MAAM;AAC3C,SAEL,QADA,MAAM,GAAgB,GAAO,GAAU,EAAM,EACtC,GAAY,GAAO,EAAM;;EAEnC;GAuBU,KAAgB,OAC3B,GACA,GACA,GACA,MACmC;CACnC,IAAM,IAAQ,GAAS,SAAS,KAC1B,IAAwC;EAC5C;EACA,aAAa,EAAE;EACf,eAAe;EACf,kBAAkB;EAClB,cAAc,KAAA;EACd,cAAc,KAAA;EACd,mBAAmB;EACnB,+BAAe,IAAI,KAAa;EAChC,kCAAkB,IAAI,KAAa;EACnC,iCAAiB,IAAI,KAAa;EAClC;EACD;AAED,GAAO,MAAM,oBAAoB,EAAE,UAAO,CAAC;CAI3C,IAAM,IAAY,IAAQ;AAK1B,QAHA,MAAM,EAAQ,QAAQ,EAEtB,MAAM,GAAgB,GADL,MAAM,EAAQ,QAAQ;EAAE,aAAa;EAAM,OAAO;EAAW,CAAC,EACxC,EAAM,EACtC,GAAY,GAAO,EAAM;GC1XrB,KAAb,MAA6E;CAwD3E,YAAY,GAAwC;AAgBlD,2CAxDmC,IAAI,KAA8B,yCAGpC,IAAI,KAAa,yBAGhB,EAAE,8BAGK,EAAE,6CAGf,IAAI,KAAa,yBAGrB,2BAMkC,EAAE,iBAGnB,EAAE,sBAOG,EAAE,gCAGjB,yBAET,8BACK,mBACX,IAGhB,KAAK,QAAQ,EAAQ,MACrB,KAAK,WAAW,EAAQ,SACxB,KAAK,SAAS,EAAQ,OACtB,KAAK,gBAAgB,EAAQ,cAC7B,KAAK,WAAW,EAAQ,SACxB,KAAK,UAAU,EAAQ,OAAO,YAAY,EAAE,WAAW,QAAQ,CAAC,EAChE,KAAK,QAAQ,MAAM,iBAAiB,EACpC,KAAK,WAAW,IAAI,GAA4B,KAAK,QAAQ,EAG7D,KAAK,eAAe,KAAK,mBAAmB,EAC5C,KAAK,yBAAyB,KAAK,MAAM,mBACzC,KAAK,uBAAuB,KAAK,aAAa,EAG9C,KAAK,QAAQ,KACX,KAAK,MAAM,GAAG,gBAAgB;AAC5B,QAAK,eAAe;IACpB,EACF,KAAK,MAAM,GAAG,iBAAiB,MAAQ;AACrC,QAAK,mBAAmB,EAAI;IAC5B,EACF,KAAK,MAAM,GAAG,SAAS,MAAU;AAC/B,QAAK,YAAY,EAAM;IACvB,CACH;;CAOH,cAA0B;AACxB,SAAO,KAAK,cAAc,CAAC,KAAK,MAAM,EAAE,QAAQ;;CAIlD,eAAwC;AACtC,SAAO,KAAK;;CAUd,oBAAqD;EACnD,IAAM,IAAQ,KAAK,MAAM,aAAa,KAAK,oBAAoB,CAAC;AAEhE,SADI,KAAK,gBAAgB,SAAS,IAAU,IACrC,EAAM,QAAQ,MAAM,CAAC,KAAK,gBAAgB,IAAI,EAAE,MAAM,CAAC;;CAGhE,WAAoB;AAClB,SAAO,KAAK,gBAAgB,SAAS,KAAK,KAAK;;CAGjD,MAAM,UAAU,IAAQ,KAAoB;AACtC,aAAK,WAAW,KAAK,gBAEzB;GADA,KAAK,gBAAgB,IACrB,KAAK,QAAQ,MAAM,4BAA4B,EAAE,UAAO,CAAC;AAEzD,OAAI;AAEF,QAAI,KAAK,gBAAgB,SAAS,GAAG;KACnC,IAAM,IAAQ,KAAK,gBAAgB,OAAO,CAAC,GAAO,EAAM;AACxD,UAAK,iBAAiB,EAAM;AAC5B;;AAIF,QAAI,CAAC,KAAK,mBAAmB,CAAC,KAAK,kBAAkB;AAEnD,WAAM,KAAK,eAAe,EAAM;AAChC;;AAGF,QAAI,CAAC,KAAK,gBAAiB;AAG3B,QAAI,CAAC,KAAK,kBAAkB,SAAS,EAAE;AACrC,UAAK,kBAAkB;AACvB;;IAGF,IAAM,IAAW,MAAM,KAAK,iBAAiB,MAAM;AAGnD,QAAI,KAAK,WAAW,CAAC,GAAU;AAC7B,KAAK,MAAU,KAAK,kBAAkB;AACtC;;AAGF,UAAM,KAAK,eAAe,GAAU,EAAM;YACnC,GAAO;AAEd,UADA,KAAK,QAAQ,MAAM,mCAAmC,EAAE,UAAO,CAAC,EAC1D;aACE;AACR,SAAK,gBAAgB;;;;CASzB,OAAO,GAAe,GAAqB;AACzC,OAAK,QAAQ,MAAM,yBAAyB;GAAE;GAAO;GAAO,CAAC;EAC7D,IAAM,IAAQ,KAAK,MAAM,gBAAgB,EAAM;AAC/C,MAAI,EAAM,UAAU,EAAG;EACvB,IAAM,IAAc,KAAK,MAAM,aAAa,EAAM,EAC5C,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAO,EAAM,SAAS,EAAE,CAAC,EACxD,IAAW,EAAM;AAClB,QACL,KAAK,kBAAkB,IAAI,GAAa;GAAE,MAAM;GAAQ,YAAY,EAAS;GAAO,CAAC,EACrF,KAAK,QAAQ,MAAM,yBAAyB;GAAE;GAAO,OAAO;GAAS,YAAY,EAAS;GAAO,CAAC,EAClG,KAAK,eAAe,KAAK,mBAAmB,EAC5C,KAAK,uBAAuB,KAAK,aAAa,EAC9C,KAAK,SAAS,KAAK,SAAS;;CAG9B,iBAAiB,GAAuB;AACtC,OAAK,QAAQ,MAAM,mCAAmC,EAAE,UAAO,CAAC;EAChE,IAAM,IAAQ,KAAK,MAAM,gBAAgB,EAAM;AAC/C,MAAI,EAAM,UAAU,EAAG,QAAO;EAC9B,IAAM,IAAc,KAAK,MAAM,aAAa,EAAM,EAC5C,IAAM,KAAK,kBAAkB,IAAI,EAAY;AACnD,MAAI,CAAC,KAAO,EAAI,SAAS,UAAW,QAAO,EAAM,SAAS;EAC1D,IAAM,IAAM,EAAM,WAAW,MAAM,EAAE,UAAU,EAAI,WAAW;AAE9D,SADI,MAAQ,KAAW,EAAM,SAAS,IAC/B;;CAGT,YAAY,GAA2B;AACrC,SAAO,KAAK,MAAM,YAAY,EAAM;;CAGtC,YAAY,GAAwB;AAClC,SAAO,KAAK,MAAM,YAAY,EAAM;;CAGtC,QAAQ,GAAkD;AACxD,SAAO,KAAK,MAAM,QAAQ,EAAM;;CAQlC,MAAM,KAAK,GAA8B,GAAoD;AAE3F,MADA,KAAK,QAAQ,MAAM,sBAAsB,EACrC,KAAK,QACP,OAAM,IAAI,EAAK,UAAU,kCAAkC,EAAU,iBAAiB,IAAI;EAK5F,IAAM,IAAU,KAAK,cAAc,EAC7B,IAAS,MAAM,KAAK,cAAc,GAAO,GAAS,EAAQ;AAIhE,MAAI,GAAS,QAAQ;GACnB,IAAM,IAAY,KAAK,MAAM,aAAa,EAAQ,OAAO;AAEzD,OAAI,EAAO,iBAAiB,SAAS,GAAG;IAItC,IAAM,IAAY,EAAO,iBAAiB,GAAG,GAAG;AAChD,IAAI,MACF,KAAK,kBAAkB,IAAI,GAAW;KAAE,MAAM;KAAQ,YAAY;KAAW,CAAC,EAC9E,KAAK,eAAe,KAAK,mBAAmB,EAC5C,KAAK,uBAAuB,KAAK,aAAa,EAC9C,KAAK,SAAS,KAAK,SAAS;UAEzB;AAML,IADA,KAAK,kBAAkB,IAAI,GAAW;KAAE,MAAM;KAAW,QAAQ,EAAO;KAAQ,CAAC,EACjF,KAAK,QAAQ,MAAM,qDAAqD;KACtE,QAAQ,EAAQ;KAChB;KACA,QAAQ,EAAO;KAChB,CAAC;IAGF,IAAM,IAAY,KAAK,MAAM,GAAG,SAAS,MAAQ;AAC/C,SAAI,EAAI,SAAA,qBAA2B,EAAI,WAAW,EAAO,OAAQ;KACjE,IAAM,IAAM,KAAK,kBAAkB,IAAI,EAAU;AAIjD,KAHI,GAAK,SAAS,aAAa,EAAI,WAAW,EAAO,UACnD,KAAK,kBAAkB,OAAO,EAAU,EAE1C,GAAW;KACX,IAAM,IAAM,KAAK,QAAQ,QAAQ,EAAU;AAC3C,KAAI,MAAQ,MAAI,KAAK,QAAQ,OAAO,GAAK,EAAE;MAC3C;AACF,SAAK,QAAQ,KAAK,EAAU;;;AAIhC,SAAO;;CAIT,MAAM,WAAW,GAAmB,GAAoD;AACtF,OAAK,QAAQ,MAAM,6BAA6B,EAAE,cAAW,CAAC;EAE9D,IAAM,IAAO,KAAK,MAAM,QAAQ,EAAU;AAC1C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,oDAAoD,KACpD,EAAU,iBACV,IACD;EAEH,IAAM,IAAW,EAAK;AAEtB,SAAO,KAAK,KAAK,EAAE,EAAE;GACnB,GAAG;GACH,MAAM;IACJ,SAAS,KAAK,kBAAkB,EAAU;IAC1C,GAAG,GAAS;IACb;GACD,QAAQ;GACR,QAAQ;GACT,CAAC;;CAIJ,MAAM,KACJ,GACA,GACA,GAC6B;AAC7B,OAAK,QAAQ,MAAM,uBAAuB,EAAE,cAAW,CAAC;EAExD,IAAM,IAAO,KAAK,MAAM,QAAQ,EAAU;AAC1C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,8CAA8C,KAC9C,EAAU,iBACV,IACD;EAEH,IAAM,IAAW,EAAK;AAEtB,SAAO,KAAK,KAAK,GAAa;GAC5B,GAAG;GACH,MAAM;IACJ,SAAS,KAAK,kBAAkB,EAAU;IAC1C,GAAG,GAAS;IACb;GACD,QAAQ;GACR,QAAQ;GACT,CAAC;;CAGJ,MAAM,OAAO,GAAe,GAAkB,GAAoD;AAChG,MAAI,KAAK,QACP,OAAM,IAAI,EAAK,UAAU,oCAAoC,EAAU,iBAAiB,IAAI;AAE9F,OAAK,QAAQ,MAAM,yBAAyB;GAAE;GAAO,YAAY,EAAO;GAAQ,CAAC;EACjF,IAAM,IAAmC,CAAC;GAAE,MAAM;GAAS;GAAO;GAAQ,CAAC;AAC3E,SAAO,KAAK,cAAc,EAAE,EAAE,GAAS,KAAK,cAAc,EAAE,EAAW;;CAGzE,kBAA0B,GAA4C;AACpE,OAAK,QAAQ,MAAM,oCAAoC,EAAE,cAAW,CAAC;EACrE,IAAM,IAAM,KAAK,cAAc,EACzB,IAAM,EAAI,WAAW,MAAM,EAAE,UAAU,EAAU;AAOvD,SANI,MAAQ,MACV,KAAK,QAAQ,KAAK,qFAAqF,EACrG,cACD,CAAC,EACK,KAEF,EAAI,MAAM,GAAG,EAAI;;CAQ1B,mBAA6C;AAC3C,OAAK,QAAQ,MAAM,kCAAkC;EACrD,IAAM,IAAW,KAAK,MAAM,kBAAkB;AAC9C,MAAI,KAAK,gBAAgB,SAAS,EAAG,QAAO;EAG5C,IAAM,oBAAS,IAAI,KAA0B;AAC7C,OAAK,IAAM,CAAC,GAAU,MAAY,GAAU;GAC1C,IAAM,oBAAW,IAAI,KAAa;AAClC,QAAK,IAAM,KAAU,EACnB,CAAI,KAAK,oBAAoB,IAAI,EAAO,IAAE,EAAS,IAAI,EAAO;AAEhE,GAAI,EAAS,OAAO,KAAG,EAAO,IAAI,GAAU,EAAS;;AAEvD,SAAO;;CAWT,GACE,GACA,GACY;EAEZ,IAAM,IAAK;AAEX,SADA,KAAK,SAAS,GAAG,GAAO,EAAG,QACd;AACX,QAAK,SAAS,IAAI,GAAO,EAAG;;;CAWhC,QAAc;AAGZ,EAFA,KAAK,QAAQ,KAAK,uBAAuB,EACzC,KAAK,UAAU,IACf,KAAK,gBAAgB;AACrB,OAAK,IAAM,KAAS,KAAK,QAAS,IAAO;AAMzC,EALA,KAAK,QAAQ,SAAS,GACtB,KAAK,SAAS,KAAK,EACnB,KAAK,kBAAkB,OAAO,EAC9B,KAAK,gBAAgB,OAAO,EAC5B,KAAK,gBAAgB,SAAS,GAC9B,KAAK,YAAY;;CAOnB,MAAc,eAAe,GAA8B;EAEzD,IAAM,IAAe,IAAI,IAAI,KAAK,MAAM,aAAa,KAAK,oBAAoB,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,EAE9F,IAAY,MAAM,GAAc,KAAK,UAAU,KAAK,QAAQ,EAAE,UAAO,EAAE,KAAK,QAAQ;AAC1F,MAAI,KAAK,QAAS;EAClB,IAAM,EAAE,eAAY,gBAAa,MAAM,KAAK,kBAAkB,GAAW,GAAO,EAAa;AAE7F,MAAI,KAAK,QAAS;AAGlB,EADA,KAAK,mBAAmB,GACxB,KAAK,kBAAkB,EAAS,SAAS;EAMzC,IAAM,IAAW,EAAW,MAAM,CAAC,EAAM,EACnC,IAAW,EAAW,MAAM,GAAG,CAAC,EAAM;AAC5C,OAAK,IAAM,KAAK,EACd,MAAK,gBAAgB,IAAI,EAAE,MAAM;AAGnC,EADA,KAAK,gBAAgB,KAAK,GAAG,EAAS,EACtC,KAAK,iBAAiB,EAAS;;CAGjC,MAAc,eAAe,GAA6B,GAA8B;EAEtF,IAAM,IAAe,IAAI,IAAI,KAAK,MAAM,aAAa,KAAK,oBAAoB,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,EAE9F,EAAE,eAAY,gBAAa,MAAM,KAAK,kBAAkB,GAAM,GAAO,EAAa;AACxF,MAAI,KAAK,QAAS;AAElB,EADA,KAAK,mBAAmB,GACxB,KAAK,kBAAkB,EAAS,SAAS;EAMzC,IAAM,IAAQ,EAAW,MAAM,CAAC,EAAM,EAChC,IAAW,EAAW,MAAM,GAAG,CAAC,EAAM;AAC5C,OAAK,IAAM,KAAK,EACd,MAAK,gBAAgB,IAAI,EAAE,MAAM;AAGnC,EADA,KAAK,gBAAgB,KAAK,GAAG,EAAS,EACtC,KAAK,iBAAiB,EAAM;;CAG9B,oBAA4B,GAAmC;AAC7D,OAAK,qBAAqB;AAC1B,MAAI;AACF,QAAK,IAAM,KAAQ,EAAK,OAAO;IAC7B,IAAM,IAAQ,EAAK,QAAQ;AACtB,SACL,KAAK,MAAM,OAAO,GAAO,EAAK,SAAS,EAAK,SAAS,EAAK,OAAO;;AAGnE,QAAK,IAAM,KAAO,EAAK,YACrB,MAAK,MAAM,gBAAgB,EAAI;YAEzB;AACR,QAAK,qBAAqB;;;CAI9B,MAAc,kBACZ,GACA,GACA,GACmF;AACnF,OAAK,oBAAoB,EAAU;EACnC,IAAI,IAAO,GAEL,UAAgC;GACpC,IAAI,IAAQ;AACZ,QAAK,IAAM,KAAK,KAAK,MAAM,aAAa,KAAK,oBAAoB,CAAC,CAChE,CAAK,EAAa,IAAI,EAAE,MAAM,IAAE;AAElC,UAAO;;AAGT,SAAO,GAAiB,GAAG,KAAU,EAAK,SAAS,GAAE;GACnD,IAAM,IAAW,MAAM,EAAK,MAAM;AAClC,OAAI,CAAC,KAAY,KAAK,QAAS;AAE/B,GADA,KAAK,oBAAoB,EAAS,EAClC,IAAO;;AAIT,SAAO;GAAE,YADU,KAAK,MAAM,aAAa,KAAK,oBAAoB,CAAC,CAAC,QAAQ,MAAM,CAAC,EAAa,IAAI,EAAE,MAAM,CAAC;GAC1F,UAAU;GAAM;;CAIvC,iBAAyB,GAAsC;AAC7D,OAAK,IAAM,KAAK,EACd,MAAK,gBAAgB,OAAO,EAAE,MAAM;AAEtC,EAAI,EAAM,SAAS,MACjB,KAAK,eAAe,KAAK,mBAAmB,EAC5C,KAAK,uBAAuB,KAAK,aAAa,EAC9C,KAAK,SAAS,KAAK,SAAS;;CAQhC,uBAA+B,GAAuC;EACpE,IAAM,IAAW,KAAS,KAAK,cAAc;AAG7C,EAFA,KAAK,kBAAkB,EAAS,KAAK,MAAM,EAAE,MAAM,EACnD,KAAK,uBAAuB,EAAS,KAAK,MAAM,EAAE,QAAQ,EAC1D,KAAK,sCAAsB,IAAI,KAAa;AAC5C,OAAK,IAAM,KAAK,GAAU;GACxB,IAAM,IAAS,EAAE,QAAQ;AACzB,GAAI,KAAQ,KAAK,oBAAoB,IAAI,EAAO;;;CAIpD,gBAA8B;AAS5B,MAAI,KAAK,mBAAoB;EAE7B,IAAM,IAAiB,KAAK,MAAM;AAQlC,MAAI,MAAmB,KAAK,wBAAwB;AAElD,GADgB,KAAK,aAAa,MAAM,GAAM,MAAM,EAAK,YAAY,KAAK,qBAAqB,GAAG,KAEhG,KAAK,uBAAuB,KAAK,aAAa,KAAK,MAAM,EAAE,QAAQ,EACnE,KAAK,eAAe,CAAC,GAAG,KAAK,aAAa,EAC1C,KAAK,SAAS,KAAK,SAAS;AAE9B;;AAUF,EANA,KAAK,yBAAyB,GAK9B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B;EAEhC,IAAM,IAAQ,KAAK,mBAAmB,EAChC,IAAS,EAAM,KAAK,MAAM,EAAE,MAAM,EAClC,IAAc,EAAM,KAAK,MAAM,EAAE,QAAQ;AAC/C,EAAI,KAAK,gBAAgB,GAAQ,EAAY,KAC3C,KAAK,eAAe,GACpB,KAAK,uBAAuB,EAAM,EAClC,KAAK,SAAS,KAAK,SAAS;;CAUhC,qBAAkD;EAChD,IAAM,oBAAW,IAAI,KAAqB;AAC1C,OAAK,IAAM,CAAC,GAAW,MAAQ,KAAK,kBAC9B,GAAI,SAAS,aACjB,EAAS,IAAI,GAAW,EAAI,WAAW;AAEzC,SAAO;;CAcT,uBAAqC;AACnC,OAAK,IAAM,KAAS,KAAK,iBAAiB;AACxC,OAAI,CAAC,KAAK,MAAM,YAAY,EAAM,CAAE;GACpC,IAAM,IAAY,KAAK,MAAM,aAAa,EAAM,EAC1C,IAAW,KAAK,kBAAkB,IAAI,EAAU;AAOtD,OAAI,GAAU,SAAS,WAAW;IAEhC,IAAM,IADQ,KAAK,MAAM,gBAAgB,EAAM,CAC1B,GAAG,GAAG;AAC3B,IAAI,KAAU,EAAO,UAAU,KACR,EAAO,QAAA,sBACP,EAAS,WAC5B,KAAK,QAAQ,MAAM,mEAAmE;KACpF;KACA,UAAU,EAAO;KACjB,QAAQ,EAAS;KAClB,CAAC,EACF,KAAK,kBAAkB,IAAI,GAAW;KAAE,MAAM;KAAQ,YAAY,EAAO;KAAO,CAAC;AAGrF;;AAKE,QACJ,KAAK,kBAAkB,IAAI,GAAW;IAAE,MAAM;IAAU,YAAY;IAAO,CAAC;;;CAUhF,4BAA0C;AACxC,OAAK,IAAM,CAAC,GAAW,MAAQ,KAAK,mBAAmB;AACrD,OAAI,EAAI,SAAS,UAAW;GAC5B,IAAM,IAAQ,KAAK,MAAM,gBAAgB,EAAU;AACnD,OAAI,EAAM,UAAU,EAAG;GACvB,IAAM,IAAS,EAAM,GAAG,GAAG;AACvB,IAAC,KAAU,EAAO,UAAU,KACX,EAAO,QAAA,sBACP,EAAI,WACvB,KAAK,QAAQ,MAAM,yEAAyE;IAC1F;IACA,UAAU,EAAO;IACjB,QAAQ,EAAI;IACb,CAAC,EACF,KAAK,kBAAkB,IAAI,GAAW;IAAE,MAAM;IAAQ,YAAY,EAAO;IAAO,CAAC;;;CAKvF,mBAA2B,GAAgC;EAGzD,IAAM,IADU,GAAW,EAAI,CACT;AACtB,MAAI,CAAC,GAAO;AAEV,QAAK,SAAS,KAAK,gBAAgB,EAAI;AACvC;;AAGF,EAAI,KAAK,gBAAgB,SAAS,EAAM,IACtC,KAAK,SAAS,KAAK,gBAAgB,EAAI;;CAI3C,YAAoB,GAAiC;AAEnD,MAAI,KAAK,oBAAoB,IAAI,EAAM,OAAO,EAAE;AAC9C,QAAK,SAAS,KAAK,QAAQ,EAAM;AACjC;;AAMF,EAAI,EAAM,SAAA,uBAA6B,KAAK,oBAAoB,EAAM,KAGpE,KAAK,oBAAoB,IAAI,EAAM,OAAO,EAC1C,KAAK,SAAS,KAAK,QAAQ,EAAM;;CAUrC,oBAA4B,GAAwE;EAClG,IAAM,EAAE,cAAW;AAOnB,SAHI,MAAW,KAAA,IAAkB,KAG1B,KAAK,gBAAgB,SAAS,EAAO;;CAG9C,gBAAwB,GAAkB,GAAkC;AAC1E,MAAI,EAAO,WAAW,KAAK,gBAAgB,OAAQ,QAAO;AAC1D,OAAK,IAAM,CAAC,GAAG,MAAU,EAAO,SAAS,CACvC,KAAI,MAAU,KAAK,gBAAgB,GAAI,QAAO;AAGhD,OAAK,IAAM,CAAC,GAAG,MAAQ,EAAY,SAAS,CAC1C,KAAI,MAAQ,KAAK,qBAAqB,GAAI,QAAO;AAEnD,SAAO;;GAaE,MAAgC,MAC3C,IAAI,GAAY,EAAQ,ECzwBpB,WAA8B,IAM/B,IAAL,yBAAA,GAAA;QACE,EAAA,QAAA,SACA,EAAA,SAAA;EAFG,KAAA,EAAA,CAGJ,EAyBK,KAAN,MAA4F;CAmD1F,YAAY,GAAmD;AAgD7D,wCApF4B,IAAI,KAAa,qCAChB,IAAI,KAAa,qCAGjB,IAAI,KAA0B,wCAI3B,IAAI,KAAkD,yBAGrC,EAAE,gCAK3B,IAAI,KAAoC,gBAYjD,EAAqB,kCAMc,EAAE,EAGpD,KAAK,WAAW,EAAQ,SACxB,KAAK,SAAS,EAAQ,OACtB,KAAK,YAAY,EAAQ,UACzB,KAAK,OAAO,EAAQ,KACpB,KAAK,eAAe,EAAQ,aAG5B,KAAK,aACH,OAAO,EAAQ,WAAY,aACvB,EAAQ,UACR,EAAQ,gBACA,EAAQ,UACd,KAAA,GACR,KAAK,UACH,OAAO,EAAQ,QAAS,aACpB,EAAQ,OACR,EAAQ,aACA,EAAQ,OACd,KAAA,GACR,KAAK,WAAW,EAAQ,SAAS,WAAW,MAAM,KAAK,WAAW,EAClE,KAAK,WAAW,EAAQ,UAAU,GAAW,EAAE,UAAU,EAAS,QAAQ,CAAC,EAAE,YAAY,EACvF,WAAW,mBACZ,CAAC,EAEF,KAAK,WAAW,IAAI,GAAuC,KAAK,QAAQ,EACxE,KAAK,mBAAmB,KAAK,SAAS,UAAU,YAGhD,KAAK,QAAQ,GAAqB,KAAK,QAAQ,EAC/C,KAAK,QAAQ,GAA6B;GACxC,MAAM,KAAK;GACX,SAAS,KAAK;GACd,OAAO,KAAK;GACZ,cAAc,KAAK,cAAc,KAAK,KAAK;GAC3C,QAAQ,KAAK;GACb,eAAe,KAAK,OAAO,OAAO,KAAK,MAAM;GAC9C,CAAC,EACF,KAAK,UAAU,GAA2B,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,EAAE,KAAK,QAAQ,EACjG,KAAK,WAAW,KAAK,OAAO,eAAe,EAE3C,KAAK,OAAO,IAAI,KAAK,MAAM,EAG3B,KAAK,OAAO,KAAK,OACjB,KAAK,OAAO,KAAK,OAGb,EAAQ,UAAU;GACpB,IAAI;AACJ,QAAK,IAAM,KAAO,EAAQ,UAAU;IAClC,IAAM,IAAQ,OAAO,YAAY,EAC3B,IAAsC,GAAG,IAAgB,GAAO;AAGtE,IAFI,MAAW,EAAY,MAAiB,IAC5C,KAAK,MAAM,OAAO,GAAO,GAAK,EAAY,EAC1C,IAAY;;;AAkBhB,EAZA,KAAK,cAAc,MAAqC;AACtD,QAAK,eAAe,EAAY;KAElC,KAAK,iBAAiB,KAAK,SAAS,UAAU,KAAK,WAAW,EAM9D,KAAK,yBAAyB,MAAyC;AACrE,QAAK,0BAA0B,EAAY;KAE7C,KAAK,SAAS,GAAG,KAAK,sBAAsB;;CAO9C,eAAuB,GAAwC;AACzD,WAAK,WAAW,EAAqB,OAEzC,KAAI;AAGF,OAAI,EAAY,SAAA,qBAA2B;IACzC,IAAM,IAAU,GAAW,EAAY,EACjC,IAAS,EAAQ,IACjB,IAAU,EAAA,4BAAkC;AAClD,QAAI,GAAQ;AACV,UAAK,MAAM,UAAU,GAAQ,EAAQ;KACrC,IAAM,IAAY,EAAQ,KACpB,IAAS,EAAQ;AACvB,UAAK,MAAM,SAAS;MAClB,MAAM;MACN;MACA,UAAU;MACV,GAAI,MAAc,KAAA,KAAa,EAAE,QAAQ,GAAW;MACpD,GAAI,MAAW,KAAA,KAAa,EAAE,WAAQ;MACvC,CAAC;;AAEJ,SAAK,MAAM,gBAAgB,EAAY;AACvC;;AAGF,OAAI,EAAY,SAAA,mBAAyB;IACvC,IAAM,IAAU,GAAW,EAAY,EACjC,IAAS,EAAQ,IACjB,IAAU,EAAA,4BAAkC,IAE5C,IAAU,EAAA,yBAA+B;AAC/C,QAAI,GAAQ;AAGV,KAFA,KAAK,QAAQ,YAAY,EAAO,EAChC,KAAK,eAAe,OAAO,EAAO,EAClC,KAAK,MAAM,YAAY,EAAO;KAE9B,IAAM,IAAS,KAAK,YAAY,IAAI,EAAO;AAC3C,SAAI,GAAQ;AACV,WAAK,IAAM,KAAO,EAAQ,MAAK,WAAW,OAAO,EAAI;AACrD,WAAK,YAAY,OAAO,EAAO;;AAGjC,KADA,KAAK,YAAY,OAAO,EAAO,EAC/B,KAAK,MAAM,SAAS;MAAE,MAAM;MAAgB;MAAQ,UAAU;MAAS;MAAQ,CAAC;;AAElF,SAAK,MAAM,gBAAgB,EAAY;AACvC;;GAIF,IAAM,IAAU,KAAK,SAAS,OAAO,EAAY,EAC3C,IAAU,GAAW,EAAY,EACjC,IAAS,EAAY,QAIrB,IAAc,EAAQ;AAC5B,OAAI,GAAa;AACf,SAAK,IAAM,KAAU,EACnB,CAAI,EAAO,SAAS,WAClB,KAAK,sBAAsB,GAAa,EAAO;AAGnD;;GAOF,IAAM,IAAS,EAAQ;AACvB,GAAI,KACF,KAAK,2BAA2B,GAAQ,GAAS,EAAO;AAG1D,QAAK,IAAM,KAAU,EACnB,CAAI,EAAO,SAAS,YAClB,KAAK,qBAAqB,EAAO,SAAS,GAAS,GAAQ,EAAY,OAAO,GAE9E,KAAK,mBAAmB,GAAQ,EAAQ;AAO5C,QAAK,MAAM,gBAAgB,EAAY;WAChC,GAAO;GACd,IAAM,IAAQ,aAAiB,EAAK,YAAY,IAAQ,KAAA;AACxD,QAAK,SAAS,KACZ,SACA,IAAI,EAAK,UACP,sCAAsC,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM,IAC5F,EAAU,4BACV,KACA,EACD,CACF;;;CAWL,qBACE,GACA,GACA,GACA,GACM;EAEN,IAAM,IAAQ,EAAQ;AACtB,MAAI,KAAS,KAAK,WAAW,IAAI,EAAM,EAAE;AAEvC,QAAK,iBAAiB,GAAS,GAAS,EAAO;AAC/C;;AAGF,EAAI,MAAW,oBACb,KAAK,iBAAiB,GAAS,GAAS,EAAO;;CASnD,mBAA2B,GAAyC,GAAuC;AACzG,MAAI,EAAO,SAAS,QAAS;EAC7B,IAAM,IAAQ,EAAO,OACf,IAAS,EAAQ;AAClB,SAOL;OAAI,KAAK,QAAQ,MAAM,GAAQ,EAAM,EAAE;AAErC,IADA,KAAK,mBAAmB,GAAQ,EAAO,EACnC,KAAK,OAAO,WAAW,EAAM,IAAE,KAAK,eAAe,OAAO,EAAO;AACrE;;AAIE,QAAK,YAAY,IAAI,EAAO,IAAI,CAAC,KAAK,eAAe,IAAI,EAAO,KAIpE,KAAK,mBAAmB,GAAQ,EAAO,EACnC,KAAK,OAAO,WAAW,EAAM,IAAE,KAAK,eAAe,OAAO,EAAO;;;CAUvE,sBAA8B,GAAqB,GAA+C;AAChG,OAAK,QAAQ,MAAM,4CAA4C,EAAE,gBAAa,CAAC;EAE/E,IAAM,IAAe,KAAK,MAAM,QAAQ,EAAY;AACpD,MAAI,CAAC,GAAc;AACjB,QAAK,QAAQ,MAAM,uEAAuE,EAAE,gBAAa,CAAC;AAC1G;;EAGF,IAAM,IAAc,KAAK,OAAO,mBAAmB;AAEnD,EADA,EAAY,YAAY,GAAa,EAAa,QAAQ,EAC1D,EAAY,eAAe,CAAC,EAAO,CAAC;EAEpC,IAAM,IAAa,EAAY,SAAS,GAAG,GAAG;AAC9C,EAAI,KACF,KAAK,MAAM,OAAO,GAAa,GAAY,EAAa,SAAS,EAAa,OAAO;;CASzF,0BAAkC,GAA4C;AAC5E,MAAI,KAAK,WAAW,EAAqB,OAAQ;EAEjD,IAAM,EAAE,YAAS,eAAY;AAG7B,MAAI,MAAY,cAAc,CAAC,KAAK,kBAAkB;AACpD,QAAK,mBAAmB;AACxB;;AASF,MAAI,EAFF,MAAY,YAAY,MAAY,eAAe,MAAY,cAAe,MAAY,cAAc,CAAC,GAEtF;AAErB,OAAK,QAAQ,MAAM,wEAAwE;GACzF;GACA;GACA,UAAU,EAAY;GACvB,CAAC;EAEF,IAAM,IAAM,IAAI,EAAK,UACnB,sDAAsD,IAAU,MAAY,aAAa,qBAAqB,GAAG,IACjH,EAAU,uBACV,KACA,EAAY,OACb;AAKD,OAAK,IAAM,KAAU,KAAK,YACxB,MAAK,QAAQ,YAAY,GAAQ,EAAI;AAGvC,OAAK,SAAS,KAAK,SAAS,EAAI;;CAalC,iBAAyB,GAAmB,GAAiC,GAAuB;EAClG,IAAM,IAAQ,EAAQ;AACjB,OACL,KAAK,MAAM,OAAO,GAAO,GAAS,GAAS,EAAO;;CAapD,2BACE,GACA,GACA,GACM;EACN,IAAM,IAAW,KAAK,eAAe,IAAI,EAAO;AAChD,EAAI,KACE,OAAO,KAAK,EAAQ,CAAC,SAAS,KAChC,OAAO,OAAO,EAAS,SAAS,EAAQ,EAKtC,MAAW,KAAA,MACb,EAAS,SAAS,MAGpB,KAAK,eAAe,IAAI,GAAQ;GAC9B,SAAS,EAAE,GAAG,GAAS;GACvB;GACA,aAAa,KAAK,OAAO,mBAAmB;GAC7C,CAAC;;CASN,mBAA2B,GAAgB,GAA+C;EACxF,IAAM,IAAW,KAAK,eAAe,IAAI,EAAO;AAChD,MAAI,CAAC,EAAU;EAMf,IAAM,IAAQ,EAAS,QAAQ;AAC/B,MAAI,GAAO;GACT,IAAM,IAAW,KAAK,MAAM,QAAQ,EAAM;AAC1C,GAAI,KACF,EAAS,YAAY,YAAY,GAAO,EAAS,QAAQ;;AAI7D,IAAS,YAAY,eAAe,CAAC,EAAO,CAAC;EAE7C,IAAM,IAAW,EAAS,YAAY;AACtC,MAAI,EAAS,WAAW,EAAG;EAE3B,IAAI;AACJ,MAAI;AACF,OAAU,gBAAgB,EAAS,GAAG,GAAG,CAAC;UACpC;AAMN,OAAU,EAAS,GAAG,GAAG;;AAG3B,MAAI,GAAS;GACX,IAAM,IAAQ,EAAS,QAAQ;AAC/B,GAAI,KACF,KAAK,MAAM,OAAO,GAAO,GAAS,EAAE,GAAG,EAAS,SAAS,EAAE,EAAS,OAAO;;;CASjF,MAAc,eAAe,GAAqC;AAChE,OAAK,QAAQ,MAAM,qCAAqC,EAAE,WAAQ,CAAC;EAEnE,IAAM,IAAkC,EAAE;AAW1C,EAVI,EAAO,SACT,EAAQ,MAAyB,EAAO,SAC/B,EAAO,MAChB,EAAQ,MAAqB,SACpB,EAAO,WAChB,EAAQ,MAA2B,EAAO,WACjC,EAAO,QAChB,EAAQ,MAAqB,SAG/B,MAAM,KAAK,SAAS,QAAQ;GAC1B,MAAM;GACN,QAAQ,EAAE,YAAS;GACpB,CAAC;;CAGJ,0BAAkC,GAA4B;AAK5D,OAAK,IAAM,KAAU,KAAK,oBAAoB,EAAO,CACnD,MAAK,QAAQ,YAAY,EAAO;;CAIpC,oBAA4B,GAAmC;EAC7D,IAAM,oBAAU,IAAI,KAAa,EAC3B,IAAc,KAAK,MAAM,kBAAkB;AAEjD,MAAI,EAAO,IACT,MAAK,IAAM,KAAW,EAAY,QAAQ,CACxC,MAAK,IAAM,KAAU,EAAS,GAAQ,IAAI,EAAO;WAE1C,EAAO,KAAK;GACrB,IAAM,IAAW,EAAY,IAAI,KAAK,aAAa,GAAG;AACtD,OAAI,EACF,MAAK,IAAM,KAAU,EAAU,GAAQ,IAAI,EAAO;aAE3C,EAAO,UAAU;GAC1B,IAAM,IAAc,EAAY,IAAI,EAAO,SAAS;AACpD,OAAI,EACF,MAAK,IAAM,KAAU,EAAa,GAAQ,IAAI,EAAO;aAE9C,EAAO;QAEX,IAAM,KAAW,EAAY,QAAQ,CACxC,KAAI,EAAQ,IAAI,EAAO,OAAO,EAAE;AAC9B,MAAQ,IAAI,EAAO,OAAO;AAC1B;;;AAIN,SAAO;;CAYT,aAAqC;AACnC,MAAI,KAAK,WAAW,EAAqB,OACvC,OAAM,IAAI,EAAK,UAAU,8CAA8C,EAAU,iBAAiB,IAAI;AAExG,OAAK,QAAQ,MAAM,uCAAuC;EAC1D,IAAM,IAAO,GAA6B;GACxC,MAAM,KAAK;GACX,SAAS,KAAK;GACd,OAAO,KAAK;GACZ,cAAc,KAAK,cAAc,KAAK,KAAK;GAC3C,QAAQ,KAAK;GACb,eAAe,KAAK,OAAO,OAAO,EAAK;GACxC,CAAC;AAEF,SADA,KAAK,OAAO,IAAI,EAAK,EACd;;CAIT,MAAc,cACZ,GACA,GACA,GACA,GAC6B;AAQ7B,MAPI,KAAK,WAAW,EAAqB,WAGzC,MAAM,KAAK,gBAIN,KAAK,WAAoC,EAAqB,QACjE,OAAM,IAAI,EAAK,UAAU,uCAAuC,EAAU,iBAAiB,IAAI;EAIjG,IAAM,IAAQ,KAAK,SAAS;AAC5B,MAAI,MAAU,cAAc,MAAU,YACpC,OAAM,IAAI,EAAK,UAAU,8BAA8B,KAAS,EAAU,iBAAiB,IAAI;AAGjG,OAAK,QAAQ,MAAM,mCAAmC;EAEtD,IAAM,IAAO,MAAM,QAAQ,EAAM,GAAG,IAAQ,CAAC,EAAM,EAC7C,IAAS,OAAO,YAAY;AAElC,EADA,KAAK,YAAY,IAAI,EAAO,EAC5B,KAAK,MAAM,UAAU,GAAQ,KAAK,aAAa,GAAG;EAMlD,IAAM,IAAgB,KAAK;AAM3B,EALA,KAAK,sBAAsB,EAAE,EAKzB,KAAc,EAAW,SAAS,KACpC,KAAK,mBAAmB,EAAW;EAGrC,IAAM,IAAsC,CAAC,GAAG,GAAe,GAAI,KAAc,EAAE,CAAE,EAE/E,oBAAS,IAAI,KAAa,EAC1B,IAAwC,EAAE,EAI1C,IAAmB,GAIrB;AACJ,MAAI,GAAa,WAAW,KAAA,KAAa,CAAC,GAAa,QAAQ;GAC7D,IAAM,IAAW,EAAiB,GAAG,GAAG;AACxC,GAAI,MACF,IAAa,EAAS;;EAK1B,IAAM,IAAa,GAAa,WAAW,KAAA,IAAY,IAAa,EAAY;AAEhF,OAAK,IAAM,KAAW,GAAM;GAC1B,IAAM,IAAQ,OAAO,YAAY;AAEjC,GADA,KAAK,WAAW,IAAI,EAAM,EAC1B,EAAO,IAAI,EAAM;GAEjB,IAAM,IAAiB,GAAa,WAAW,KAAA,IAAY,IAAa,EAAY,QAE9E,IAAoB,GAAsB;IAC9C,MAAM;IACN;IACA;IACA,cAAc,KAAK;IACnB,QAAQ;IACR,QAAQ,GAAa;IACtB,CAAC;AAmBF,GAhBA,KAAK,iBAAiB,GAAS,EAAkB,EAGjD,EAAa,KAAK;IAChB,MAAM;IACN;IACA;IACA,UAAU;IACV,QAAQ,GAAa;IACrB,SAAS;IACT,QAAQ,KAAA;IACT,CAAC,EAKE,GAAa,WAAW,KAAA,KAAa,CAAC,GAAa,WACrD,IAAa;;AAIjB,OAAK,YAAY,IAAI,GAAQ,EAAO;EAGpC,IAAM,IAAS,KAAK,QAAQ,aAAa,EAAO,EAG1C,IAAkB,KAAK,cAAc,IAAI,EAAE,EAG3C,IAAoC;GACxC,GAHmB,KAAK,WAAW,IAAI,EAAE;GAIzC,SAAS;GACT,GAAG,GAAa;GAChB;GACA,UAAU,KAAK;GACf,UAAU;GACV,GAAI,GAAa,WAAW,KAAA,KAAa,EAAE,QAAQ,EAAY,QAAQ;GACvE,GAAI,MAAe,KAAA,KAAa,EAAE,QAAQ,GAAY;GACtD,GAAI,EAAc,SAAS,KAAK,EAAE,QAAQ,GAAe;GAC1D,EAEK,IAAsC;GAC1C,GAAG;GACH,GAAG,GAAa;GACjB;AAqCD,SAhCA,KAAK,SAAS,KAAK,MAAM;GACvB,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAG;IACJ;GACD,MAAM,KAAK,UAAU,EAAS;GAC9B,GAAI,KAAK,eAAe,EAAE,aAAa,KAAK,cAAc,GAAG,EAAE;GAChE,CAAC,CACC,MAAM,MAAa;AAClB,OAAI,CAAC,EAAS,IAAI;IAChB,IAAM,IAAM,IAAI,EAAK,UACnB,gCAAgC,KAAK,KAAK,YAAY,OAAO,EAAS,OAAO,CAAC,GAAG,EAAS,cAC1F,EAAU,qBACV,EAAS,OACV;AAED,IADA,KAAK,SAAS,KAAK,SAAS,EAAI,EAChC,KAAK,QAAQ,YAAY,GAAQ,EAAI;;IAEvC,CACD,OAAO,MAAmB;GACzB,IAAM,IAAQ,aAAiB,EAAK,YAAY,IAAQ,KAAA,GAClD,IAAM,IAAI,EAAK,UACnB,gCAAgC,KAAK,KAAK,WAAW,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM,IAC3G,EAAU,qBACV,KACA,EACD;AAED,GADA,KAAK,SAAS,KAAK,SAAS,EAAI,EAChC,KAAK,QAAQ,YAAY,GAAQ,EAAI;IACrC,EAEG;GACL;GACA;GACA,QAAQ,YAAY,KAAK,OAAO,EAAE,WAAQ,CAAC;GAC3C,kBAAkB,CAAC,GAAG,EAAO;GAC9B;;CAIH,MAAM,OAAO,GAAsC;AACjD,MAAI,KAAK,WAAW,EAAqB,OAAQ;EACjD,IAAM,IAAW,KAAU,EAAE,KAAK,IAAM;AAGxC,EAFA,KAAK,QAAQ,MAAM,6BAA6B,EAAE,QAAQ,GAAU,CAAC,EACrE,MAAM,KAAK,eAAe,EAAS,EACnC,KAAK,0BAA0B,EAAS;;CAG1C,YAAY,GAAe,GAAwB;AAEjD,MADA,KAAK,QAAQ,MAAM,kCAAkC;GAAE;GAAO,YAAY,EAAO;GAAQ,CAAC,EACtF,KAAK,WAAW,EAAqB,QAAQ;AAC/C,QAAK,QAAQ,KAAK,sDAAsD,EAAE,UAAO,CAAC;AAClF;;AAEF,MAAI,CAAC,KAAK,MAAM,QAAQ,EAAM,EAAE;AAC9B,QAAK,QAAQ,KAAK,0DAA0D,EAAE,UAAO,CAAC;AACtF;;AAEF,MAAI,EAAO,WAAW,EAAG;EACzB,IAAM,IAA2B;GAAE,MAAM;GAAS;GAAO;GAAQ;AAKjE,EADA,KAAK,mBAAmB,CAAC,EAAK,CAAC,EAC/B,KAAK,oBAAoB,KAAK,EAAK;;CAGrC,aAAa,GAAe,GAAyB;AAEnD,MADA,KAAK,QAAQ,MAAM,mCAAmC,EAAE,UAAO,CAAC,EAC5D,KAAK,WAAW,EAAqB,QAAQ;AAC/C,QAAK,QAAQ,KAAK,uDAAuD,EAAE,UAAO,CAAC;AACnF;;EAEF,IAAM,IAAW,KAAK,MAAM,QAAQ,EAAM;AAC1C,MAAI,CAAC,GAAU;AACb,QAAK,QAAQ,KAAK,2DAA2D,EAAE,UAAO,CAAC;AACvF;;AAGF,OAAK,MAAM,OAAO,GAAO,GAAS,EAAS,SAAS,EAAS,OAAO;;CAMtE,mBAA2B,GAAwC;AACjE,OAAK,IAAM,KAAQ,GAAY;GAC7B,IAAM,IAAe,KAAK,MAAM,QAAQ,EAAK,MAAM;AACnD,OAAI,CAAC,EAAc;GACnB,IAAM,IAAU,EAAK,OAAO,KAAK,OAAW;IAC1C,MAAM;IACN;IACA,WAAW,EAAK;IACjB,EAAE,EACG,IAAc,KAAK,OAAO,mBAAmB;AAEnD,GADA,EAAY,YAAY,EAAK,OAAO,EAAa,QAAQ,EACzD,EAAY,eAAe,EAAQ;GACnC,IAAM,IAAa,EAAY,SAAS,GAAG,GAAG;AAC9C,GAAI,KACF,KAAK,MAAM,OAAO,EAAK,OAAO,GAAY,EAAa,SAAS,EAAa,OAAO;;;CAM1F,MAAM,YAAY,GAAsC;AACtD,MAAI,KAAK,WAAW,EAAqB,OAAQ;EACjD,IAAM,IAAW,KAAU,EAAE,KAAK,IAAM,EAClC,IAAY,KAAK,oBAAoB,EAAS;AAChD,QAAU,SAAS,EAIvB,QAFA,KAAK,QAAQ,MAAM,kCAAkC,EAAE,SAAS,CAAC,GAAG,EAAU,EAAE,CAAC,EAE1E,IAAI,SAAe,MAAY;GACpC,IAAI,IAAW,IACT,UAAmB;AACvB,QAAI,EAAU;AAEd,IADA,IAAW,IACX,GAAO;IACP,IAAM,IAAM,KAAK,gBAAgB,QAAQ,EAAK;AAE9C,IADI,MAAQ,MAAI,KAAK,gBAAgB,OAAO,GAAK,EAAE,EACnD,GAAS;MAGL,IAAQ,KAAK,MAAM,GAAG,SAAS,MAA8B;AAC7D,MAAM,SAAA,sBACV,EAAU,OAAO,EAAM,OAAO,EAC1B,EAAU,SAAS,KAAG,GAAM;KAChC;AAGF,QAAK,gBAAgB,KAAK,EAAK;IAC/B;;CAIJ,GAAG,GAAgB,GAAsD;AACvE,MAAI,KAAK,WAAW,EAAqB,OAAQ,QAAO;EAExD,IAAM,IAAK;AAEX,SADA,KAAK,SAAS,GAAG,GAAO,EAAG,QACd;AACX,QAAK,SAAS,IAAI,GAAO,EAAG;;;CAKhC,MAAM,MAAM,GAAuC;AAC7C,WAAK,WAAW,EAAqB,QAKzC;OAJA,KAAK,SAAS,EAAqB,QACnC,KAAK,QAAQ,KAAK,2BAA2B,EAGzC,GAAS,QAAQ;AACnB,QAAI;AACF,WAAM,KAAK,eAAe,EAAQ,OAAO;YACnC;AAGR,SAAK,0BAA0B,EAAQ,OAAO;;AAIhD,GADA,KAAK,SAAS,YAAY,KAAK,WAAW,EAC1C,KAAK,SAAS,IAAI,KAAK,sBAAsB;AAG7C,QAAK,IAAM,KAAU,KAAK,YACxB,MAAK,QAAQ,YAAY,EAAO;AAIlC,GADA,KAAK,eAAe,OAAO,EAC3B,KAAK,SAAS,KAAK;AACnB,QAAK,IAAM,KAAK,KAAK,OAAQ,GAAE,OAAO;AACtC,QAAK,OAAO,OAAO;AACnB,QAAK,IAAM,KAAW,KAAK,gBAAiB,IAAS;AAIrD,GAHA,KAAK,gBAAgB,SAAS,GAC9B,KAAK,YAAY,OAAO,EACxB,KAAK,WAAW,OAAO,EACvB,KAAK,YAAY,OAAO;;;GAgBf,MACX,MACsC,IAAI,GAAuB,EAAQ,ECl6BrE,MAA4C,EAChD,gBACA,aACA,GAAG,QAC2C;CAC9C,IAAM,EAAE,eAAY,EAAW,EAAE,gBAAa,CAAC,EACzC,IAAe,EAAsD,KAAA,EAAU,EAC/E,IAAsB,EAAe,EAAY,EACjD,IAAyB,EAA4C,EAAE,CAAC,EACxE,IAAkB,EAAO,GAAM,EAC/B,IAAuB,EAAmC,KAAA,EAAU;AAI1E,KAAI,EAF6B,EAAa,WAAa,EAAqB,YAEjD,EAAoB,YAAY,GAAa;AAE1E,EADA,EAAoB,UAAU,GAC1B,EAAa,WAAS,EAAuB,QAAQ,KAAK,EAAa,QAAQ;AACnF,MAAI;AAEF,GADA,EAAa,UAAU,GAAsB;IAAE,GAAG;IAAkB;IAAS,CAAC,EAC9E,EAAqB,UAAU,KAAA;WACxB,GAAO;AAEd,GADA,EAAa,UAAU,KAAA,GACvB,EAAqB,UACnB,aAAiB,EAAK,YAClB,IACA,IAAI,EAAK,UAAU,0CAA0C,EAAU,YAAY,IAAI;;;CAIjG,IAAM,IAAY,EAAW,EAAiB,EAKxC,KAAmB,EAAa,SAChC,KAAe,EAAqB,SAEpC,KAAO,SACJ;EAAE,WAAW;EAAkB,OAAO;EAAc,GAC3D,CAAC,IAAkB,GAAa,CACjC,EAEK,KAAe,SAAe;EAAE,GAAG;GAAY,IAAc;EAAM,GAAG;EAAC;EAAa;EAAW;EAAK,CAAC;AA2B3G,QAzBA,cACc;AACV,OAAK,IAAM,KAAa,EAAuB,QAAc,GAAU,OAAO;IAEhF,CAAC,EAAY,CACd,EAQD,SACE,EAAgB,UAAU,UACb;AAEN,EADL,EAAgB,UAAU,IACrB,QAAQ,SAAS,CAAC,WAAW;AAChC,GAAI,EAAgB,WACb,EAAa,SAAS,OAAO;IAEpC;KAEH,EAAE,CAAC,EAGJ,kBAAC,EAAiB,UAAlB;EAA2B,OAAO;YAChC,kBAAC,EAAwB,UAAzB;GAAkC,OAAO;GAAO;GAA4C,CAAA;EAClE,CAAA;GAyCnB,MAAuC,MAClD,kBAAC,GAAD;CAAiB,aAAa,EAAM;WAClC,kBAAC,IAAD,EAAwB,GAAI,GAAS,CAAA;CACrB,CAAA,ECzIP,MAAqC,EAChD,cACA,YACqE,EAAE,KAA4B;CACnG,IAAM,IAAc,EAAW,EAAwB,EAEjD,IAAW,IACb,KAAA,IACE,KAAa,GAAa,WAE1B,CAAC,GAAU,KAAe,EAAgC,EAAE,CAAC,EAC7D,IAAc,EAA8B,EAAE,CAAC;AAiBrD,QAfA,QAAgB;AAEd,QAAY,UAAU,EAAE,EACxB,EAAY,EAAE,CAAC,EAEV,EAOL,QALc,EAAS,KAAK,GAAG,iBAAiB,MAA6B;GAC3E,IAAM,IAAO,CAAC,GAAG,EAAY,SAAS,EAAI;AAE1C,GADA,EAAY,UAAU,GACtB,EAAY,EAAK;IACjB;IAED,CAAC,EAAS,CAAC,EAEP;GC1BI,MAAoC,EAC/C,iBAC4D,EAAE,KAA+B;CAC7F,IAAM,IAAc,EAAW,EAAwB,EAEjD,IAAY,KAAa,GAAa,WAEtC,CAAC,GAAO,KAAY,wBAAyC,IAAI,KAAK,CAAC;AAoC7E,QAlCA,QAAgB;AACT,QA8BL,QA3BA,EAAS,EAAS,KAAK,kBAAkB,CAAC,EAEtB,EAAS,KAAK,GAAG,SAAS,MAA8B;AAC1E,MAAU,MAAS;IACjB,IAAM,IAAO,IAAI,IAAI,EAAK;AAE1B,QAAI,EAAM,SAAA,qBAA2B;KACnC,IAAM,IAAM,IAAI,IAAI,EAAK,IAAI,EAAM,SAAS,CAAC;AAE7C,KADA,EAAI,IAAI,EAAM,OAAO,EACrB,EAAK,IAAI,EAAM,UAAU,EAAI;WACxB;KACL,IAAM,IAAW,EAAK,IAAI,EAAM,SAAS;AACzC,SAAI,GAAU;MACZ,IAAM,IAAU,IAAI,IAAI,EAAS;AAEjC,MADA,EAAQ,OAAO,EAAM,OAAO,EACxB,EAAQ,SAAS,IACnB,EAAK,OAAO,EAAM,SAAS,GAE3B,EAAK,IAAI,EAAM,UAAU,EAAQ;;;AAKvC,WAAO;KACP;IACF;IAGD,CAAC,EAAS,CAAC,EAEP;GC1CH,KAAuD;CAC3D,IAAI,OAAsB;AACxB,QAAM,IAAI,EAAK,UAAU,0CAA0C,EAAU,iBAAiB,IAAI;;CAEpG,IAAI,OAA+B;AACjC,QAAM,IAAI,EAAK,UAAU,0CAA0C,EAAU,iBAAiB,IAAI;;CAEpG,kBAA0C;AACxC,QAAM,IAAI,EAAK,UAAU,0CAA0C,EAAU,iBAAiB,IAAI;;CAEpG,cAAc;AACZ,QAAM,IAAI,EAAK,UAAU,qCAAqC,EAAU,iBAAiB,IAAI;;CAE/F,mBAAmB;AACjB,QAAM,IAAI,EAAK,UAAU,2CAA2C,EAAU,iBAAiB,IAAI;;CAErG,oBAAoB;AAClB,QAAM,IAAI,EAAK,UAAU,4CAA4C,EAAU,iBAAiB,IAAI;;CAEtG,mBAAmB;AACjB,QAAM,IAAI,EAAK,UAAU,4CAA4C,EAAU,iBAAiB,IAAI;;CAEtG,UAAU;AACR,QAAM,IAAI,EAAK,UAAU,wCAAwC,EAAU,iBAAiB,IAAI;;CAElG,aAAa;AACX,QAAM,IAAI,EAAK,UAAU,oCAAoC,EAAU,iBAAiB,IAAI;;CAE/F,EA2CY,MAAwC,EACnD,gBACA,SACA,eAkBE,EAAE,KAA8C;CAClD,IAAM,IAAW,EAAW,EAAiB,EACvC,IAAc,EAAW,EAAwB,EACjD,IAAmB,EAAO,EAAQ;AACxC,GAAiB,UAAU;CAK3B,IAAM,IAAmE,IACrE,KAAA,IACA,MAAgB,KAAA,IACd,GAAa,YACb,EAAS,IAAc;AAS7B,KAPA,QAAgB;AACT,QACL,QAAO,EAAkB,GAAG,UAAU,MAAc;AAClD,KAAiB,UAAU,EAAU;IACrC;IACD,CAAC,EAAkB,CAAC,EAEnB,EACF,QAAO,EACL,WAAW,IACZ;AAGH,KAAI,MAAgB,KAAA,GAAW;EAC7B,IAAM,IAAO,EAAS;AAetB,SAdI,IACE,EAAK,YAGA,EACL,WAAW,EAAK,WACjB,GAGI;GACL,WAAW;GACX,gBAAgB,EAAK;GACtB,GAEI;GACL,WAAW;GACX,gBAAgB,IAAI,EAAK,UACvB,wEAAwE,EAAY,IACpF,EAAU,YACV,IACD;GACF;;AAiBH,QAdI,IACE,EAAY,YAEP,EACL,WAAW,EAAY,WACxB,GAGI;EACL,WAAW;EACX,gBAAgB,EAAY;EAC7B,GAGI;EACL,WAAW;EACX,gBAAgB,IAAI,EAAK,UACvB,mEACA,EAAU,YACV,IACD;EACF;GCtHU,MAA6B,EACxC,cACA,SACA,UACA,YAUE,EAAE,KAAmC;CACvC,IAAM,IAAc,EAAW,EAAwB,EAEjD,IAAoB,IACtB,KAAA,IACC,KAAc,GAAa,WAC1B,IAAe,IAAO,KAAA,IAAa,KAAQ,GAAmB,MAE9D,CAAC,GAAO,KAAY,QAAwC,GAAc,cAAc,IAAI,EAAE,CAAC,EAC/F,CAAC,GAAU,KAAe,QAAe,GAAc,UAAU,IAAI,GAAM,EAC3E,CAAC,IAAS,MAAc,EAAS,GAAM,EACvC,CAAC,IAAW,MAAgB,GAAsC,EAClE,KAAa,EAAO,GAAM,EAK1B,KAAW,MAAU,KAAA,GACrB,KAAgB,EAAO,GAAM;AAGnC,SAAgB;AACd,MAAI,CAAC,GAAc;AAGjB,GAFA,EAAS,EAAE,CAAC,EACZ,EAAY,GAAM,EAClB,GAAa,KAAA,EAAU;AACvB;;AAeF,SAXA,GAAc,UAAU,IAGxB,EAAS,EAAa,cAAc,CAAC,EACrC,EAAY,EAAa,UAAU,CAAC,EACpC,GAAa,KAAA,EAAU,EAET,EAAa,GAAG,gBAAgB;AAE5C,GADA,EAAS,EAAa,cAAc,CAAC,EACrC,EAAY,EAAa,UAAU,CAAC;IACpC;IAED,CAAC,EAAa,CAAC;CAElB,IAAM,KAAY,EAAY,YAAY;AACpC,SAAC,KAAgB,GAAW,UAEhC;GADA,GAAW,UAAU,IACrB,GAAW,GAAK;AAChB,OAAI;AAEF,IADA,MAAM,EAAa,UAAU,EAAM,EACnC,GAAa,KAAA,EAAU;YAChB,GAAO;AACd,IAAI,aAAiB,EAAK,YACxB,GAAa,EAAM,GAEnB,GAAa,IAAI,EAAK,UAAU,wCAAwC,EAAU,YAAY,IAAI,CAAC;aAE7F;AAER,IADA,GAAW,UAAU,IACrB,GAAW,GAAM;;;IAElB,CAAC,GAAc,EAAM,CAAC;AA+DzB,QA7DA,QAAgB;AACV,GAAC,MAAY,GAAc,WAAW,CAAC,MAC3C,GAAc,UAAU,IACnB,IAAW;IACf;EAAC;EAAU;EAAc;EAAU,CAAC,EAyDhC;EACL,UAxDe,QAAc,EAAM,KAAK,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAM,CAAC;EAyDlE;EACA;EACA;EACA;EACA;EACA,QA3Da,GACZ,GAAe,MAAkB;AAChC,MAAc,OAAO,GAAO,EAAM;KAEpC,CAAC,EAAa,CACf;EAuDC,kBArDuB,GAAa,MAAkB,GAAc,iBAAiB,EAAM,IAAI,GAAG,CAAC,EAAa,CAAC;EAsDjH,aApDkB,GAAa,MAAkB,GAAc,YAAY,EAAM,IAAI,EAAE,EAAE,CAAC,EAAa,CAAC;EAqDxG,aAnDkB,GAAa,MAAkB,GAAc,YAAY,EAAM,IAAI,IAAO,CAAC,EAAa,CAAC;EAoD3G,SAlDc,GAAa,MAAkB,GAAc,QAAQ,EAAM,EAAE,CAAC,EAAa,CAAC;EAmD1F,MAhDW,EACX,OAAO,GAA6B,MAAuB;AACzD,OAAI,CAAC,EACH,OAAM,IAAI,EAAK,UAAU,yCAAyC,EAAU,iBAAiB,IAAI;AACnG,UAAO,EAAa,KAAK,GAAM,EAAK;KAEtC,CAAC,EAAa,CACf;EA0CC,YAxCiB,EACjB,OAAO,GAAmB,MAAuB;AAC/C,OAAI,CAAC,EACH,OAAM,IAAI,EAAK,UAAU,+CAA+C,EAAU,iBAAiB,IAAI;AACzG,UAAO,EAAa,WAAW,GAAW,EAAK;KAEjD,CAAC,EAAa,CACf;EAkCC,MAhCW,EACX,OAAO,GAAmB,GAAoC,MAAuB;AACnF,OAAI,CAAC,EACH,OAAM,IAAI,EAAK,UAAU,yCAAyC,EAAU,iBAAiB,IAAI;AACnG,UAAO,EAAa,KAAK,GAAW,GAAa,EAAK;KAExD,CAAC,EAAa,CACf;EA0BC,QAxBa,EACb,OAAO,GAAe,GAAkB,MAAuB;AAC7D,OAAI,CAAC,EACH,OAAM,IAAI,EAAK,UAAU,2CAA2C,EAAU,iBAAiB,IAAI;AACrG,UAAO,EAAa,OAAO,GAAO,GAAQ,EAAK;KAEjD,CAAC,EAAa,CACf;EAkBA;GCrMU,MAAmC,EAC9C,cACA,UACA,YAQE,EAAE,KAAmC;CACvC,IAAM,IAAc,EAAW,EAAwB,EAEjD,IAAW,IACb,KAAA,IACE,KAAa,GAAa,WAE1B,CAAC,GAAM,KAAW,GAA8C;AActE,QAZA,QAAgB;AACd,MAAI,CAAC,GAAU;AACb,KAAQ,KAAA,EAAU;AAClB;;EAEF,IAAM,IAAI,EAAS,YAAY;AAE/B,SADA,EAAQ,EAAE,QACG;AACX,KAAE,OAAO;;IAEV,CAAC,EAAS,CAAC,EAEP,GAAQ;EAAE;EAAM;EAAO;EAAM,CAAC;GChC1B,MAA6B,EACxC,iBACqD,EAAE,KAA2B;CAClF,IAAM,IAAc,EAAW,EAAwB,EAEjD,IAAY,KAAa,GAAa;AAQ5C,QAAO;EACL,aAPkB,GAAa,MAAkB,GAAU,KAAK,YAAY,EAAM,IAAI,EAAE,EAAE,CAAC,EAAS,CAAC;EAQrG,aANkB,GAAa,MAAkB,GAAU,KAAK,YAAY,EAAM,IAAI,IAAO,CAAC,EAAS,CAAC;EAOxG,SALc,GAAa,MAAkB,GAAU,KAAK,QAAQ,EAAM,EAAE,CAAC,EAAS,CAAC;EAMxF;GCmFU,YAAkF;CAE7F,mBAAmB;CACnB,qBAAqB,MAAU,GAAsC,KAAS,EAAE,CAAC;CACjF,UAAU,MAAU,GAA2B,KAAS,EAAE,CAAC;CAC3D,iBAAiB,MAAU,GAAkC,KAAS,EAAE,CAAC;CACzE,UAAU,MAAU,GAA2B,KAAS,EAAE,CAAC;CAC3D,kBAAkB,MAAU,GAAmC,KAAS,EAAE,CAAC;CAC3E,gBAAgB,MAAU,GAAiC,KAAS,EAAE,CAAC;CACxE,GCxFY,MAAY,MAMvB,EAAe;CACb,MAAM;CACN,YAAY,EAAO;CACnB,UAAU,EAAO;CACjB,OAAO,EAAO;CACd,kBAAkB,EAAO;CAC1B,CAAC,EAaS,MAAsB,GAA4B,MAAiD;CAC9G,IAAM,IAAO,GAAS,EAAK;AAE3B,SAAQ,EAAM,MAAd;EACE,KAAK,wBACH,QAAO,EAAe;GACpB,GAAG;GACH,OAAO;GACP,OAAO,EAAK;GACZ,QAAQ,EAAM;GACd,aAAa,EAAM;GACpB,CAAC;EAGJ,KAAK,oBACH,QAAO;GACL,GAAG;GACH,OAAO;GACP,OAAO,EAAK;GACZ,WAAW,EAAM;GAClB;EAGH,KAAK,qBACH,QAAO;GACL,GAAG;GACH,OAAO;GACP,OAAO,EAAK;GACZ,UAAU;IAAE,IAAI;IAAI,UAAU;IAAO;GACtC;EAGH,KAAK,wBACH,QAAO;GACL,GAAG;GACH,OAAO;GACP,OAAO,EAAK;GACZ,UAAU,EAAE,IAAI,EAAM,YAAY;GACnC;;GC3DD,KAAN,MAAyB;CAIvB,YAAY,GAAgC;AAC1C,sCAHqB,IAAI,KAAqB,EAG9C,KAAK,YAAY;;CAGnB,MAAM,GAAY,GAAmB,GAA+C;AAGlF,EAFA,KAAK,aAAa,IAAI,GAAI,EAAI,MAAM,OAAO,EAC3C,EAAI,MAAM,KAAK;GAAE,MAAM,KAAK;GAAW,MAAM;GAAI,CAAC,EAClD,EAAa,IAAI,GAAI,YAAY;;CAGnC,MAAM,GAAY,GAAmB,GAAoB;EACvD,IAAM,IAAM,KAAK,aAAa,IAAI,EAAG;AACrC,MAAI,MAAQ,KAAA,EAAW;EACvB,IAAM,IAAO,EAAI,MAAM;AACvB,EAAI,GAAM,SAAS,KAAK,cACtB,EAAK,QAAQ;;CAIjB,IAAI,GAAY,GAA+C;AAE7D,EADA,EAAa,IAAI,GAAI,WAAW,EAChC,KAAK,aAAa,OAAO,EAAG;;CAG9B,QAAc;AACZ,OAAK,+BAAe,IAAI,KAAK;;GAQ3B,KAAN,MAAiG;;sBAC/C,EAAE,yCACf,IAAI,KAAiC;;CAExE,IAAI,WAA2B;AAC7B,SAAO,KAAK;;CAGd,IAAI,oBAAoC;EACtC,IAAM,oBAAY,IAAI,KAAmB;AACzC,OAAK,IAAM,KAAS,KAAK,gBAAgB,QAAQ,CAC/C,GAAU,IAAI,EAAM,QAAQ;AAE9B,SAAO,KAAK,aAAa,QAAQ,MAAQ,CAAC,EAAU,IAAI,EAAI,CAAC;;CAG/D,IAAI,kBAA2B;AAC7B,OAAK,IAAM,KAAS,KAAK,gBAAgB,QAAQ,CAC/C,MAAK,IAAM,KAAU,EAAM,aAAa,QAAQ,CAC9C,KAAI,MAAW,YAAa,QAAO;AAGvC,SAAO;;CAGT,eAAe,GAAiE;AAC9E,OAAK,IAAM,KAAU,EACnB,CAAI,EAAO,SAAS,YAClB,KAAK,aAAa,KAAK,EAAO,QAAQ,GAC7B,EAAO,cAAc,KAAA,KAC9B,KAAK,cAAc,EAAO,OAAO,EAAO,UAAU;;CAKxD,cAAc,GAA6B;EACzC,IAAM,IAAM,KAAK,aAAa,WAAW,MAAM,EAAE,OAAO,EAAQ,GAAG;AACnE,EAAI,MAAQ,OACV,KAAK,aAAa,KAAO;;CAI7B,YAAY,GAAmB,GAA6B;EAC1D,IAAM,IAAW,KAAK,gBAAgB,IAAI,EAAU;AAEpD,MAAI,GAAU;GAKZ,IAAM,IAAS,gBAAgB,EAAQ,EACjC,IAAU,KAAK,aAAa,QAAQ,EAAS,QAAQ;AAK3D,GAJA,EAAS,UAAU,GACf,MAAY,OACd,KAAK,aAAa,KAAW,IAE/B,EAAS,eAAe,EAAE;AAC1B,QAAK,IAAI,IAAI,GAAG,IAAI,EAAO,MAAM,QAAQ,KAAK;IAC5C,IAAM,IAAO,EAAO,MAAM;AAC1B,IAAI,GAAM,SAAS,mBACjB,EAAS,aAAa,EAAK,cAAc;KAAE,WAAW;KAAG,WAAW;KAAI,EACxE,EAAS,aAAa,IAAI,EAAK,YAAY,WAAW;;AAG1D;;EAIF,IAAM,IAAS,gBAAgB,EAAQ,EACjC,IAAgD,EAAE,EAClD,oBAAe,IAAI,KAA2B;AAEpD,OAAK,IAAI,IAAI,GAAG,IAAI,EAAO,MAAM,QAAQ,KAAK;GAC5C,IAAM,IAAO,EAAO,MAAM;AAC1B,GAAI,GAAM,SAAS,mBACjB,EAAa,EAAK,cAAc;IAAE,WAAW;IAAG,WAAW;IAAI,EAC/D,EAAa,IAAI,EAAK,YAAY,WAAW;;EAIjD,IAAM,IAA4B;GAChC,SAAS;GACT,aAAa,IAAI,GAAmB,OAAO;GAC3C,kBAAkB,IAAI,GAAmB,YAAY;GACrD;GACA;GACD;AAED,OAAK,gBAAgB,IAAI,GAAW,EAAM;EAI1C,IAAM,IAAc,KAAK,aAAa,WAAW,MAAM,EAAE,OAAO,EAAQ,GAAG;AAC3E,EAAI,MAAgB,KAClB,KAAK,aAAa,KAAK,EAAM,QAAQ,GAErC,KAAK,aAAa,KAAe,EAAM;;CAI3C,gBAAgB,GAAyB;AACvC,OAAK,gBAAgB,OAAO,EAAU;;CAOxC,qBAA6B,GAAuC;EAClE,IAAM,IAAW,KAAK,gBAAgB,IAAI,EAAU;AACpD,MAAI,EAAU,QAAO;EAErB,IAAM,IAA4B;GAChC,SAAS;IAAE,IAAI;IAAW,MAAM;IAAa,OAAO,EAAE;IAAE;GACxD,aAAa,IAAI,GAAmB,OAAO;GAC3C,kBAAkB,IAAI,GAAmB,YAAY;GACrD,cAAc,EAAE;GAChB,8BAAc,IAAI,KAAK;GACxB;AAGD,SAFA,KAAK,gBAAgB,IAAI,GAAW,EAAM,EAC1C,KAAK,aAAa,KAAK,EAAM,QAAQ,EAC9B;;CAST,aACE,GACA,GACsE;EACtE,IAAM,IAAU,EAAM,aAAa;AACnC,MAAI,CAAC,EAAS;EAEd,IAAM,IAAW,EAAM,QAAQ,MAAM,EAAQ;AACzC,SAAU,SAAS,eAEvB,QAAO;GAAE;GAAS,MAAM;GAAU;;CAOpC,cAAsB,GAA0B,GAAyB;AACvE,UAAQ,EAAM,MAAd;GACE,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,kBAAkB,GAAO,EAAU;AACxC;GAGF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,wBAAwB,GAAO,EAAU;AAC9C;GAGF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,kBAAkB,GAAO,EAAU;AACxC;GAGF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,mBAAmB,GAAO,EAAU;AACzC;GAGF,KAAK;GACL,KAAK;GACL,KAAK;AACH,SAAK,oBAAoB,GAAO,EAAU;AAC1C;GAGF;AACE,QAAI,EAAM,KAAK,WAAW,QAAQ,EAAE;AAClC,SAAI,EAAM,UAAW;KAErB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAK5C,IAAW,EAAe;MAC9B,MAAM,EAAM;MACZ,IAAI,EAAM;MACV,MAAM,EAAM;MACb,CAAC;AAEF,SAAI,EAAM,OAAO,KAAA,GAAW;MAC1B,IAAM,IAAM,EAAM,QAAQ,MAAM,WAAW,MAAM,EAAE,SAAS,EAAM,QAAQ,QAAQ,KAAK,EAAE,OAAO,EAAM,GAAG;AACzG,UAAI,MAAQ,IAAI;AACd,SAAM,QAAQ,MAAM,KAAO;AAC3B;;;AAIJ,OAAM,QAAQ,MAAM,KAAK,EAAS;;AAEpC;;;CASN,kBACE,GAIA,GACM;AACN,UAAQ,EAAM,MAAd;GACE,KAAK,SAAS;IACZ,IAAM,IAAQ,KAAK,qBAAqB,EAAU;AAElD,IADI,EAAM,cAAW,EAAM,QAAQ,KAAK,EAAM,YAC1C,EAAM,oBAAoB,KAAA,MAC5B,EAAM,QAAQ,WAAW,EAAM;AAEjC;;GAGF,KAAK;AACW,SAAK,qBAAqB,EAAU,CAC5C,QAAQ,MAAM,KAAK,EAAE,MAAM,cAAc,CAAC;AAChD;GAGF,KAAK,eAAe;IAClB,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AACjD,IAAI,MACF,EAAM,YAAY,OAAO,EACzB,EAAM,iBAAiB,OAAO;AAEhC;;GAGF,KAAK,UAAU;IACb,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AAIjD,IAHI,KAAS,EAAM,oBAAoB,KAAA,MACrC,EAAM,QAAQ,WAAW,EAAM,kBAEjC,KAAK,gBAAgB,OAAO,EAAU;AACtC;;GAGF,KAAK,SAAS;IACZ,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AACjD,QAAI,QACG,IAAM,CAAC,GAAI,MAAW,EAAM,aAC/B,CAAI,MAAW,eACb,EAAM,aAAa,IAAI,GAAI,UAAU;AAI3C,SAAK,gBAAgB,OAAO,EAAU;AACtC;;GAGF,KAAK,QACH;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,gBAAgB,IAAI,EAAU;AACjD,IAAI,KAAS,EAAM,oBAAoB,KAAA,MACrC,EAAM,QAAQ,WAAW,EAAM;AAEjC;;;;CASN,wBACE,GAIA,GACM;EACN,IAAM,IAAQ,KAAK,qBAAqB,EAAU;AAElD,UAAQ,EAAM,MAAd;GACE,KAAK;AACH,MAAM,YAAY,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,aAAa;AACpE;GAEF,KAAK;AACH,MAAM,YAAY,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,MAAM;AAC7D;GAEF,KAAK;AACH,MAAM,YAAY,IAAI,EAAM,IAAI,EAAM,aAAa;AACnD;GAEF,KAAK;AACH,MAAM,iBAAiB,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,aAAa;AACzE;GAEF,KAAK;AACH,MAAM,iBAAiB,MAAM,EAAM,IAAI,EAAM,SAAS,EAAM,MAAM;AAClE;GAEF,KAAK;AACH,MAAM,iBAAiB,IAAI,EAAM,IAAI,EAAM,aAAa;AACxD;;;CASN,kBACE,GAIA,GACM;AACN,UAAQ,EAAM,MAAd;GACE,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAY,EAAM,QAAQ,MAAM;AAGtC,IAFA,EAAM,QAAQ,MAAM,KAAK;KAAE,GAAG,GAAS,EAAM;KAAE,OAAO;KAAmB,OAAO,KAAA;KAAW,CAAC,EAC5F,EAAM,aAAa,EAAM,cAAc;KAAE;KAAW,WAAW;KAAI,EACnE,EAAM,aAAa,IAAI,EAAM,YAAY,YAAY;AACrD;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAU,EAAM,aAAa,EAAM;AACzC,QAAI,CAAC,EAAS;AACd,MAAQ,aAAa,EAAM;IAE3B,IAAI;AACJ,QAAI;AAEF,SAAc,KAAK,MAAM,EAAQ,UAAU;YACrC;AACN,SAAc,KAAA;;IAGhB,IAAM,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACxD,QAAI,CAAC,EAAO;AACZ,MAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,GAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO;KACR;AACD;;GAGF,KAAK,wBAAwB;IAC3B,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACxD,QAAI,CAAC,EAAO;AAMZ,IALA,EAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,GAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM;KACd,EACD,EAAM,aAAa,IAAI,EAAM,YAAY,WAAW;AACpD;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACxD,QAAI,EACF,GAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa;KAC7C,GAAG,GAAS,EAAM,KAAK;KACvB,OAAO;KACP,OAAO,EAAM;KACb,WAAW,EAAM;KAClB;SACI;KACL,IAAM,IAAY,EAAM,QAAQ,MAAM;AAOtC,KANA,EAAM,QAAQ,MAAM,KAAK;MACvB,GAAG,GAAS,EAAM;MAClB,OAAO;MACP,OAAO,EAAM;MACb,WAAW,EAAM;MAClB,CAAC,EACF,EAAM,aAAa,EAAM,cAAc;MAAE;MAAW,WAAW;MAAI;;AAErE,MAAM,aAAa,IAAI,EAAM,YAAY,WAAW;AACpD;;;;CASN,mBACE,GAIA,GACM;EACN,IAAM,IAAQ,KAAK,qBAAqB,EAAU,EAC5C,IAAQ,KAAK,aAAa,EAAM,YAAY,EAAM;AACnD,QAEL,EAAM,QAAQ,MAAM,EAAM,QAAQ,aAAa,GAAmB,EAAM,MAAM,EAAM;;CAOtF,oBACE,GACA,GACM;EACN,IAAM,IAAQ,KAAK,qBAAqB,EAAU;AAElD,UAAQ,EAAM,MAAd;GACE,KAAK;AACH,MAAM,QAAQ,MAAM,KAAK;KAAE,MAAM;KAAQ,WAAW,EAAM;KAAW,KAAK,EAAM;KAAK,CAAC;AACtF;GAGF,KAAK;AACH,MAAM,QAAQ,MAAM,KAClB,EAAe;KACb,MAAM;KACN,UAAU,EAAM;KAChB,KAAK,EAAM;KACX,OAAO,EAAM;KACd,CAAC,CACH;AACD;GAGF,KAAK;AACH,MAAM,QAAQ,MAAM,KAClB,EAAe;KACb,MAAM;KACN,UAAU,EAAM;KAChB,WAAW,EAAM;KACjB,OAAO,EAAM;KACb,UAAU,EAAM;KACjB,CAAC,CACH;AACD;;;GAcK,WACX,IAAI,IAA6B,ECpjBtB,MAAiC,MAAqD,CACjG;CAAE,MAAM;CAAS;CAAO,CACzB,EAgEK,KAAN,MAAoF;CAOlF,YAAY,GAA2C,IAA8B,EAAE,EAAE;AAIvF,sCAN8B,IAAI,KAAiC,EAGnE,KAAK,SAAS,GACd,KAAK,kBAAkB,EAAQ,gBAC/B,KAAK,kBAAkB,EAAQ,gBAC/B,KAAK,UAAU,EAAQ,QAAQ,YAAY,EAAE,WAAW,eAAe,CAAC;;CAG1E,OAAO,GAAiE;EACtE,IAAM,IAAS,EAAQ;AAEvB,OAAK,SAAS,MAAM,gCAAgC;GAAE;GAAQ,QAAQ,EAAQ;GAAQ,MAAM,EAAQ;GAAM,CAAC;EAE3G,IAAI;AAEJ,UAAQ,GAAR;GAEE,KAAK,kBAAkB;IACrB,IAAM,IAAU,KAAK,WAAW,EAAQ;AAExC,QACE,EAAQ,UAAA,qBAA6B,SACjC,KAAK,sBAAsB,GAAS,EAAQ,OAAO,GACnD,KAAK,OAAO,eAAe,EAAQ;AACzC;;GAGF,KAAK;AACH,QAAU,KAAK,cAAc,EAAQ;AACrC;GAGF,KAAK;AACH,QAAU,KAAK,cAAc,EAAQ;AACrC;GAGF,KAAK;AACH,QAAU,KAAK,cAAc,EAAQ;AACrC;GAGF,QACE,QAAO,EAAE;;EAKb,IAAM,IAAY,GAAW,EAAQ,CAAC;AACtC,MAAI,QACG,IAAM,KAAU,EACnB,CAAI,EAAO,SAAS,YAClB,EAAO,YAAY;AAKzB,SAAO;;CAOT,WAAmB,GAA8C;AAC/D,SAAO;GACL,MAAM,EAAQ,QAAQ;GAEtB,MAAM,EAAQ;GACd,SAAS,GAAW,EAAQ;GAC7B;;CAQH,YAAoB,GAAsC;AACxD,SAAO,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO;;CAO3D,sBAA8B,GAAmC;AAC1D,WAAK,gBACV,KAAI;AACF,QAAK,gBAAgB,EAAQ;WACtB,GAAO;AACd,QAAK,SAAS,MAAM,8DAA8D,EAAE,UAAO,CAAC;;;CAIhG,sBAA8B,GAAgB,GAA+C;AACtF,WAAK,gBACV,KAAI;AACF,QAAK,gBAAgB,GAAQ,EAAQ;WAC9B,GAAO;AACd,QAAK,SAAS,MAAM,8DAA8D,EAAE,UAAO,CAAC;;;CAQhG,sBACE,GACA,GACmC;AACnC,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAW,EAAQ,UAAA,uBAA+B,IAClD,IAAI,EAAQ,WAAW,EAAE,EAEzB,IAA8B;GAClC,MAAM,EAAQ;GACd;GACA,aAAa;GACb,SAAS,EAAE,GAAG,GAAG;GACjB,QAAQ;GACT;AASD,SARA,KAAK,aAAa,IAAI,GAAQ,EAAQ,EAEtC,KAAK,SAAS,MAAM,0DAA0D;GAC5E,MAAM,EAAQ;GACd;GACA;GACD,CAAC,EAEK,KAAK,OAAO,iBAAiB,EAAQ;;CAQ9C,cAAsB,GAAiE;EACrF,IAAM,IAAS,EAAQ;AACvB,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAU,KAAK,aAAa,IAAI,EAAO;AAC7C,MAAI,CAAC,EAEH,QAAO,KAAK,cAAc,EAAQ;EAGpC,IAAM,IAAI,GAAW,EAAQ,EACvB,IAAQ,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO,IAC1D,IAAS,EAAE,IACX,IAA6C,EAAE;AAgBrD,SAdI,EAAM,SAAS,MACjB,EAAQ,eAAe,GACvB,EAAQ,KAAK,GAAG,KAAK,OAAO,iBAAiB,GAAS,EAAM,CAAC,GAG3D,MAAW,cAAc,CAAC,EAAQ,UACpC,EAAQ,SAAS,IACjB,EAAQ,KAAK,GAAG,KAAK,OAAO,eAAe,GAAS,EAAE,CAAC,EACvD,KAAK,SAAS,MAAM,uDAAuD,EAAE,UAAU,EAAQ,UAAU,CAAC,IACjG,MAAW,aAAa,CAAC,EAAQ,WAC1C,EAAQ,SAAS,IACjB,KAAK,SAAS,MAAM,sDAAsD,EAAE,UAAU,EAAQ,UAAU,CAAC,GAGpG;;CAQT,cAAsB,GAAiE;EACrF,IAAM,IAAS,EAAQ;AACvB,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAU,KAAK,WAAW,EAAQ,EAClC,IAAI,EAAQ,WAAW,EAAE,EACzB,IAAa,EAAE,OAAmB,QAClC,IAAS,EAAE,IAEX,IAAU,KAAK,aAAa,IAAI,EAAO;AAE7C,MAAI,CAAC,EACH,QAAO,KAAK,oBAAoB,GAAS,GAAY,GAAQ,EAAO;EAItE,IAAM,IAAO,KAAK,YAAY,EAAQ;AAGtC,MAAI,EAAK,WAAW,EAAQ,YAAY,EAAE;GACxC,IAAM,IAAQ,EAAK,MAAM,EAAQ,YAAY,OAAO,EAC9C,IAA6C,EAAE;AAcrD,UAZI,EAAM,SAAS,MACjB,EAAQ,cAAc,GACtB,EAAQ,KAAK,GAAG,KAAK,OAAO,iBAAiB,GAAS,EAAM,CAAC,GAG3D,MAAW,cAAc,CAAC,EAAQ,UACpC,EAAQ,SAAS,IACjB,EAAQ,KAAK,GAAG,KAAK,OAAO,eAAe,GAAS,EAAE,CAAC,IAC9C,MAAW,aAAa,CAAC,EAAQ,WAC1C,EAAQ,SAAS,KAGZ;;AAST,SALA,EAAQ,cAAc,GACtB,EAAQ,UAAU,EAAE,GAAG,GAAG,EAE1B,KAAK,sBAAsB,EAAQ,EAE5B,EAAE;;CAGX,oBACE,GACA,GACA,GACA,GACmC;AAEnC,MAAI,CAAC,EACH,QAAO,KAAK,OAAO,eAAe,EAAQ;EAG5C,IAAM,IAAW,EAAQ,UAAA,uBAA+B,IAClD,IAAI,EAAQ,WAAW,EAAE,EACzB,IAAO,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO;AAE/D,OAAK,SAAS,MAAM,kEAAkE;GACpF,MAAM,EAAQ;GACd;GACA;GACD,CAAC;EAGF,IAAM,IAAiC;GACrC,MAAM,EAAQ;GACd;GACA,aAAa;GACb,SAAS,EAAE,GAAG,GAAG;GACjB,QAAQ,MAAW,cAAc,MAAW;GAC7C;AACD,OAAK,aAAa,IAAI,GAAQ,EAAW;EAGzC,IAAM,IAAU,KAAK,OAAO,iBAAiB,EAAW;AAUxD,SARI,EAAK,SAAS,KAChB,EAAQ,KAAK,GAAG,KAAK,OAAO,iBAAiB,GAAY,EAAK,CAAC,EAG7D,MAAW,cACb,EAAQ,KAAK,GAAG,KAAK,OAAO,eAAe,GAAY,EAAE,CAAC,EAGrD;;CAQT,cAAsB,GAAiE;EACrF,IAAM,IAAS,EAAQ;AACvB,MAAI,CAAC,EAAQ,QAAO,EAAE;EAEtB,IAAM,IAAU,KAAK,aAAa,IAAI,EAAO;AAW7C,SATA,KAAK,sBAAsB,GAAQ,EAAQ,EAEvC,MACF,EAAQ,cAAc,IACtB,EAAQ,SAAS,KAGnB,KAAK,SAAS,MAAM,uCAAuC,EAAE,WAAQ,CAAC,EAE/D,EAAE;;GAcA,MACX,GACA,IAA8B,EAAE,KACE,IAAI,GAAmB,GAAO,EAAQ,EC3TpE,KAAN,MAA0E;CAIxE,YAAY,GAA+B;AACzC,kCAH0B,IAAI,KAA0B,EAGxD,KAAK,UAAU;;CAGjB,aAAa,GAAiB,GAAuD;EACnF,IAAM,IAAU,KAAK,aAAa,EAAQ,EACpC,IAAmB,EAAE;AAC3B,OAAK,IAAM,KAAS,KAAK,QACvB,CAAK,EAAQ,IAAI,EAAM,IAAI,KACzB,EAAQ,IAAI,EAAM,IAAI,EACtB,EAAO,KAAK,GAAG,EAAM,MAAM,EAAQ,CAAC;AAGxC,SAAO;;CAGT,YAAY,GAAiB,GAAwB;AACnD,OAAK,aAAa,EAAQ,CAAC,IAAI,EAAS;;CAG1C,WAAW,GAAiB,GAAwB;AAClD,OAAK,SAAS,IAAI,EAAQ,EAAE,OAAO,EAAS;;CAG9C,WAAW,GAAuB;AAChC,OAAK,SAAS,OAAO,EAAQ;;CAG/B,aAAqB,GAA8B;EACjD,IAAI,IAAM,KAAK,SAAS,IAAI,EAAQ;AAKpC,SAJK,MACH,oBAAM,IAAI,KAAK,EACf,KAAK,SAAS,IAAI,GAAS,EAAI,GAE1B;;GAcE,MAAkC,MAC7C,IAAI,GAAwB,EAAO,ECrG/B,MAAgB,MAAwD;CAC5E,IAAM,IAAO,GAAgB,EAAQ;AACrC,QAAO;EACL,GAAG;EAEH,wBAAwB,EAAK,KAAK,mBAAmB;EACtD;GAkCG,KAAS,MAAoC,GAA6C,EAAM,EAYhG,MAAqB,GAA2B,MAElD,MAAU,UACV,MAAU,YACV,MAAU,oBACV,MAAU,gBACV,MAAU,WACV,MAAU,UAEH,IAEF,GAQH,MAAmB,MAA2C,EAAK,WAAW,QAAQ,EAQtF,MAAqB,MAA2B;AAC/C,OACL,KAAI;AAEF,SAAO,KAAK,MAAM,EAAM;SAClB;AACN,SAAO;;GAQL,MAAmB,MAAmD;CAC1E,IAAM,IAAI,GAAa,EAAQ,QAAQ;AACvC,SAAQ,EAAQ,MAAhB;EACE,KAAK,OACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,YACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,aACH,QAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAQ;GACpB,UAAU,EAAE,MAAM,YAAY,GAAG;GACjC,SAAS,EAAE,KAAK,UAAU;GAC1B,OAAO,EAAE,IAAI,QAAQ;GACrB,kBAAkB,EAAE,KAAK,mBAAmB;GAC5C,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,QACE,QAAO;GAAE,MAAM;GAAc,IAAI,EAAQ;GAAU;;GAKnD,MAAmB,GAA6B,MAAqC;AACzF,SAAQ,EAAQ,MAAhB;EACE,KAAK,OACH,QAAO;GAAE,MAAM;GAAc,IAAI,EAAQ;GAAU;GAAO;EAE5D,KAAK,YACH,QAAO;GAAE,MAAM;GAAmB,IAAI,EAAQ;GAAU;GAAO;EAEjE,KAAK,aACH,QAAO;GAAE,MAAM;GAAoB,YAAY,EAAQ;GAAU,gBAAgB;GAAO;EAE1F,QACE,QAAO;GAAE,MAAM;GAAc,IAAI,EAAQ;GAAU;GAAO;;GAK1D,MAAiB,GAA6B,MAA8D;CAChH,IAAM,IAAI,GAAa,EAAe;AACtC,SAAQ,EAAQ,MAAhB;EACE,KAAK,OACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,YACH,QAAO,EAAe;GACpB,MAAM;GACN,IAAI,EAAQ;GACZ,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,KAAK,aACH,QAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAQ;GACpB,UAAU,EAAE,MAAM,YAAY,GAAa,EAAQ,QAAQ,CAAC,MAAM,YAAY,GAAG,CAAC;GAClF,OAAO,GAAkB,EAAQ,YAAY;GAC7C,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EAEJ,QACE,QAAO;GAAE,MAAM;GAAY,IAAI,EAAQ;GAAU;;GASjD,WACJ,GAA0C,CACxC;CACE,KAAK;CACL,QAAQ,MAAQ,CAAC,EAAe;EAAE,MAAM;EAAkB,WAAW,EAAI;EAAW,CAAC,CAAC;CACvF,EACD;CACE,KAAK;CACL,aAAa,CAAC,EAAE,MAAM,cAAuB,CAAC;CAC/C,CACF,CAAC,EASE,MACJ,GACA,GACA,MACU,EAAU,aAAa,GAAQ,EAAQ,CAAC,KAAK,OAAO;CAAE,MAAM;CAAS,OAAO;CAAG,EAAE,EAMvF,MAAe,GAAuB,GAAgB,OAC1D,EAAU,YAAY,GAAQ,QAAQ,EAC/B,EACL,EAAe;CACb,MAAM;CACN,WAAW,EAAE,IAAI,YAAY;CAC7B,iBAAiB,EAAE,KAAK,kBAAkB;CAC3C,CAAC,CACH,GAGG,MAAmB,GAAgB,OACvC,EAAU,YAAY,GAAQ,aAAa,EACpC,EAAM,EAAE,MAAM,cAAc,CAAC,GAGhC,MAAoB,GAAgB,OACxC,EAAU,WAAW,GAAQ,aAAa,EACnC,EAAM,EAAE,MAAM,eAAe,CAAC,GAGjC,MAAgB,GAAuB,GAAgB,OAC3D,EAAU,WAAW,EAAO,EACrB,EACL,EAAe;CACb,MAAM;CACN,cAAc,GAAkB,EAAE,IAAI,eAAe,EAAE,OAAO;CAC9D,iBAAiB,EAAE,KAAK,kBAAkB;CAC3C,CAAC,CACH,GAGG,MAAe,GAAe,GAAgB,OAClD,EAAU,WAAW,EAAO,EAErB,EAAM;CAAE,MAAM;CAAS,WADZ,OAAO,KAAS,WAAW,IAAO;CACX,CAAC,GAGtC,MAAe,GAAe,GAAgB,OAClD,EAAU,WAAW,EAAO,EAErB,EAAM,EAAe;CAAE,MAAM;CAAkB,QADvC,OAAO,KAAS,YAAY,IAAO,IAAO,KAAA;CACK,CAAC,CAAC,GAG5D,MAAyB,MAC7B,EAAM;CAAE,MAAM;CAAoB,iBAAiB,EAAE,KAAK,kBAAkB;CAAE,CAAC,EAE3E,MAAc,GAAuB,MACzC,EACE,EAAe;CACb,MAAM;CACN,KAAK,OAAO,KAAS,WAAW,IAAO;CACvC,WAAW,EAAE,MAAM,aAAa,GAAG;CACnC,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,CACH,EAEG,MAAmB,GAAuB,MAC9C,EACE,EAAe;CACb,MAAM;CACN,UAAU,EAAE,MAAM,YAAY,GAAG;CACjC,KAAK,OAAO,KAAS,WAAW,IAAO;CACvC,OAAO,EAAE,IAAI,QAAQ;CACrB,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,CACH,EAEG,MAAwB,MAC5B,EACE,EAAe;CACb,MAAM;CACN,UAAU,EAAE,MAAM,YAAY,GAAG;CACjC,WAAW,EAAE,MAAM,aAAa,GAAG;CACnC,OAAO,EAAE,MAAM,SAAS,GAAG;CAC3B,UAAU,EAAE,IAAI,WAAW;CAC3B,kBAAkB,EAAE,kBAAkB;CACvC,CAAC,CACH,EAEG,MAAwB,GAAuB,MAAyB;CAE5E,IAAM,IAAS;AACf,QAAO,EACL,EAAe;EACb,MAAM;EACN,YAAY,EAAE,MAAM,cAAc,GAAG;EACrC,UAAU,EAAE,MAAM,YAAY,GAAG;EACjC,WAAW,GAAQ,aAAa;EAChC,OAAO,GAAQ;EACf,SAAS,EAAE,KAAK,UAAU;EAC1B,OAAO,EAAE,IAAI,QAAQ;EACrB,kBAAkB,EAAE,KAAK,mBAAmB;EAC5C,kBAAkB,EAAE,kBAAkB;EACvC,CAAC,CACH;GAGG,MAA6B,GAAuB,MAAyB;CAEjF,IAAM,IAAS;AACf,QAAO,EACL,EAAe;EACb,MAAM;EACN,YAAY,EAAE,MAAM,cAAc,GAAG;EACrC,QAAQ,GAAQ;EAChB,SAAS,EAAE,KAAK,UAAU;EAC1B,kBAAkB,EAAE,KAAK,mBAAmB;EAC5C,aAAa,EAAE,KAAK,cAAc;EACnC,CAAC,CACH;GAGG,MAAyB,GAAuB,MAAyB;CAE7E,IAAM,IAAS;AACf,QAAO,EACL,EAAe;EACb,MAAM;EACN,YAAY,EAAE,MAAM,cAAc,GAAG;EACrC,WAAW,GAAQ,aAAa;EAChC,SAAS,EAAE,KAAK,UAAU;EAC1B,kBAAkB,EAAE,KAAK,mBAAmB;EAC7C,CAAC,CACH;GAGG,MAA6B,MACjC,EAAM;CACJ,MAAM;CACN,YAAY,EAAE,MAAM,cAAc,GAAG;CACrC,YAAY,EAAE,MAAM,cAAc,GAAG;CACtC,CAAC,EAEE,MAA0B,MAC9B,EAAM;CAAE,MAAM;CAAsB,YAAY,EAAE,MAAM,cAAc,GAAG;CAAE,CAAC,EAExE,MAAmB,GAAwB,GAAuB,MACtE,EACE,EAAe;CACb,MAAM;CACN;CACA,IAAI,EAAE,IAAI,KAAK;CACf,WAAW,EAAE,KAAK,YAAY;CAC/B,CAAC,CACH,EAMG,MACJ,GACA,GACA,GACA,MACU;CACV,IAAM,IAAU,GAAa,GAAW,GAAQ,EAAE,WAAW,EAAE,IAAI,YAAY,EAAE,CAAC;AA2BlF,QAzBA,EAAQ,KACN;EACE,MAAM;EACN,OAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAE,MAAM,cAAc,GAAG;GACrC,UAAU,EAAE,MAAM,YAAY,GAAG;GACjC,SAAS,EAAE,KAAK,UAAU;GAC1B,OAAO,EAAE,IAAI,QAAQ;GACrB,kBAAkB,EAAE,KAAK,mBAAmB;GAC5C,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EACH,EACD;EACE,MAAM;EACN,OAAO,EAAe;GACpB,MAAM;GACN,YAAY,EAAE,MAAM,cAAc,GAAG;GACrC,UAAU,EAAE,MAAM,YAAY,GAAG;GACjC,OAAO;GACP,kBAAkB,EAAE,kBAAkB;GACvC,CAAC;EACH,CACF,EAEM;GAiBH,MAAyB,MAAiC;CAC9D,IAAM,IAAI,EAAM,WAAW,EAAE,EACvB,IAAI,GAAa,EAAE,EACnB,IAAQ,EAAA,kBAAkB,QAC1B,IAAY,EAAE,IAAI,YAAY,IAAI,IAEpC;AAEJ,SAAQ,EAAM,MAAd;EACE,KAAK;AACH,OAAO;IAAE,MAAM;IAAQ,MAAM,OAAO,EAAM,QAAS,WAAW,EAAM,OAAO;IAAI;AAC/E;EAEF,KAAK;AACH,OAAO;IACL,MAAM;IACN,WAAW,EAAE,MAAM,aAAa,GAAG;IACnC,KAAK,OAAO,EAAM,QAAS,WAAW,EAAM,OAAO;IACpD;AACD;EAEF;AACE,GAAI,GAAgB,EAAM,KAAK,KAE7B,IAAO,EAAe;IAAE,MAAM,EAAM;IAAM,IAAI,EAAE,IAAI,KAAK;IAAE,MAAM,EAAM;IAAM,CAAC;AAEhF;;AAOJ,QAHK,IAGE,CAAC;EAAE,MAAM;EAAW,SADG;GAAE,IAAI;GAAW;GAAM,OAAO,CAAC,EAAK;GAAE;EAChC,CAAC,GAHnB,EAAE;GAgBhB,MAAyB,GAAc,OAC1C,MAAS,UAAU,MAAS,UAAU,GAAgB,EAAK,KAAA,qBAAwB,GAEhF,MAAyB,GAAuB,MAA0D;CAC9G,IAAM,IAAI,EAAM,WAAW,EAAE,EACvB,IAAI,GAAa,EAAE,EACnB,IAAS,EAAA,qBAAqB;AAIpC,KAAI,GAAsB,EAAM,MAAM,EAAE,CACtC,QAAO,GAAsB,EAAM;AAGrC,KAAI,EAAM,SAAS,aACjB,QAAO,GAA4B,GAAG,EAAM,MAAM,GAAQ,EAAU;AAGtE,SAAQ,EAAM,MAAd;EACE,KAAK,QACH,QAAO,GAAY,GAAG,GAAQ,EAAU;EAE1C,KAAK,aACH,QAAO,GAAgB,GAAQ,EAAU;EAE3C,KAAK,cACH,QAAO,GAAiB,GAAQ,EAAU;EAE5C,KAAK,SACH,QAAO,GAAa,GAAG,GAAQ,EAAU;EAE3C,KAAK,QACH,QAAO,GAAY,EAAM,MAAM,GAAQ,EAAU;EAEnD,KAAK,QACH,QAAO,GAAY,EAAM,MAAM,GAAQ,EAAU;EAEnD,KAAK,mBACH,QAAO,GAAsB,EAAE;EAEjC,KAAK,OACH,QAAO,GAAW,GAAG,EAAM,KAAK;EAElC,KAAK,aACH,QAAO,GAAgB,GAAG,EAAM,KAAK;EAEvC,KAAK,kBACH,QAAO,GAAqB,EAAE;EAEhC,KAAK,mBACH,QAAO,GAAqB,GAAG,EAAM,KAAK;EAE5C,KAAK,wBACH,QAAO,GAA0B,GAAG,EAAM,KAAK;EAEjD,KAAK,oBACH,QAAO,GAAsB,GAAG,EAAM,KAAK;EAE7C,KAAK,wBACH,QAAO,GAA0B,EAAE;EAErC,KAAK,qBACH,QAAO,GAAuB,EAAE;EAElC,QACE,QAAO,GAAgB,EAAM,KAAK,GAAG,GAAgB,EAAM,MAAM,GAAG,EAAM,KAAK,GAAG,EAAE;;GASpF,MACJ,OACuD;CACvD,mBAAmB,MAAuC;EAGxD,IAAM,IAAU,GAAa,GAFd,EAAQ,QAAA,qBAA2B,IAEF,EAAE,WADhC,GAAa,EAAQ,QAAQ,CAAC,IAAI,YAAY,EACH,CAAC;AAE9D,SADA,EAAQ,KAAK;GAAE,MAAM;GAAS,OAAO,GAAgB,EAAQ;GAAE,CAAC,EACzD;;CAGT,mBAAmB,GAA6B,MAAyB,EAAM,GAAgB,GAAS,EAAM,CAAC;CAE/G,iBAAiB,GAA6B,MAC5C,EAAM,GAAc,GAAS,EAAe,CAAC;CAE/C,iBAAiB,MAAmC,GAAsB,GAAS,EAAU;CAC9F,GAMK,KAAN,MAAwF;CAGtF,YAAY,IAA8B,EAAE,EAAE;AAC5C,OAAK,QAAQ,GACX,GAAY,IAA8B,CAAC,EAC3C,EACD;;CAGH,OAAO,GAAqC;AAC1C,SAAO,KAAK,MAAM,OAAO,EAAQ;;GAcxB,MAAiB,IAA8B,EAAE,KAC5D,IAAI,GAAwB,EAAQ,ECxmBlCA,KAAS,mBACTC,KAAS,OAAO,IAAID,GAAO,EAC3BE,IAAIC,IACJ,KAAa,MAAM,WAAqB,KAAK,OAAO,KAAKF,IAAQE,IAAI;CASvE,YAAY,EACV,MAAM,GACN,YACA,YACC;AAID,EAHA,MAAM,EAAQ,EACd,KAAKD,MAAM,IACX,KAAK,OAAO,GACZ,KAAK,QAAQ;;CAOf,OAAO,WAAW,GAAO;AACvB,SAAO,EAAY,UAAU,GAAOF,GAAO;;CAE7C,OAAO,UAAU,GAAO,GAAU;EAChC,IAAM,IAAe,OAAO,IAAI,EAAS;AACzC,SAAwB,OAAO,KAAU,cAAlC,KAA8C,KAAgB,KAAS,OAAO,EAAM,MAAkB,aAAa,EAAM,OAAkB;;;AAyDtJ,SAAS,GAAgB,GAAO;AAU9B,QATI,KAAS,OACJ,kBAEL,OAAO,KAAU,WACZ,IAEL,aAAiB,QACZ,EAAM,UAER,KAAK,UAAU,EAAM;;AAI9B,IAAIY,KAAQ,2BACRC,KAAU,mBAAmBD,MAC7BE,KAAU,OAAO,IAAID,GAAQ,EAC7BE,IAAK,IACL,KAAuB,eAAe,KAAM,IAAY,KAAMD,IAAS,IAAK;CAC9E,YAAY,EACV,YACA,UACA,eACC;AAGD,EAFA,MAAM;GAAE,MAAMF;GAAO;GAAS;GAAO,CAAC,EACtC,KAAKG,MAAO,IACZ,KAAK,WAAW;;CAElB,OAAO,WAAW,GAAO;AACvB,SAAO,GAAW,UAAU,GAAOF,GAAQ;;GA4C3CW,KAAQ,qBACRC,KAAU,mBAAmBD,MAC7BE,KAAU,OAAO,IAAID,GAAQ,EAC7BE,IAAK,IACL,KAAiB,eAAe,KAAM,IAAY,KAAMD,IAAS,IAAK;CACxE,YAAY,EAAE,SAAM,YAAS;AAQ3B,EAPA,MAAM;GACJ,MAAMF;GACN,SAAS,8BAA8B,EAAK;iBACjC,GAAgB,EAAM;GACjC;GACD,CAAC,EACF,KAAKG,MAAO,IACZ,KAAK,OAAO;;CAEd,OAAO,WAAW,GAAO;AACvB,SAAO,GAAW,UAAU,GAAOF,GAAQ;;GAmG3CuB,KAAS,0BACTC,KAAW,mBAAmBD,MAC9BE,KAAW,OAAO,IAAID,GAAS,EAC/BE,IAAM,IACN,KAAsB,MAAM,WAA8B,KAAO,IAAY,KAAOD,IAAU,IAAM;CACtG,YAAY,EACV,UACA,UACA,cACC;EACD,IAAI,IAAgB;AAIpB,MAHI,GAAmC,UACrC,KAAiB,QAAQ,EAAQ,UAE9B,GAAmC,cAAgB,GAAmC,UAAW;AACpG,QAAiB;GACjB,IAAM,IAAQ,EAAE;AAQhB,GAPI,EAAQ,cACV,EAAM,KAAK,EAAQ,WAAW,EAE5B,EAAQ,YACV,EAAM,KAAK,QAAQ,EAAQ,SAAS,GAAG,EAEzC,KAAiB,EAAM,KAAK,KAAK,EACjC,KAAiB;;AAUnB,EARA,MAAM;GACJ,MAAMF;GACN,SAAS,GAAG,EAAc,WAAW,KAAK,UAAU,EAAM,CAAC;iBAChD,GAAgB,EAAM;GACjC;GACD,CAAC,EACF,KAAKG,MAAQ,IACb,KAAK,QAAQ,GACb,KAAK,UAAU;;CAEjB,OAAO,WAAW,GAAO;AACvB,SAAO,GAAW,UAAU,GAAOF,GAAS;;CAa9C,OAAO,KAAK,EACV,UACA,UACA,cACC;AAKD,SAHI,EAAqB,WAAW,EAAM,IAAI,EAAM,UAAU,KAAkB,EAAM,SAAiC,UAAY,GAAmC,SAAmB,EAAM,SAAiC,eAAiB,GAAmC,cAAsB,EAAM,SAA+B,aAAe,GAAmC,WACxX,IAEF,IAAI,EAAqB;GAAE;GAAO;GAAO;GAAS,CAAC;;;AChVzC,OAAO,OAAO,EAC/B,QAAQ,WACX,CAAC;AACF,SAAyC,EAAa,GAAM,GAAa,GAAQ;CAC7E,SAAS,EAAK,GAAM,GAAK;AAWrB,MAVK,EAAK,QACN,OAAO,eAAe,GAAM,QAAQ;GAChC,OAAO;IACH;IACA,QAAQ;IACR,wBAAQ,IAAI,KAAK;IACpB;GACD,YAAY;GACf,CAAC,EAEF,EAAK,KAAK,OAAO,IAAI,EAAK,CAC1B;AAGJ,EADA,EAAK,KAAK,OAAO,IAAI,EAAK,EAC1B,EAAY,GAAM,EAAI;EAEtB,IAAM,IAAQ,EAAE,WACV,IAAO,OAAO,KAAK,EAAM;AAC/B,OAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;GAClC,IAAM,IAAI,EAAK;AACf,GAAM,KAAK,MACP,EAAK,KAAK,EAAM,GAAG,KAAK,EAAK;;;CAKzC,IAAM,IAAS,GAAQ,UAAU;CACjC,MAAM,UAAmB,EAAO;AAEhC,QAAO,eAAe,GAAY,QAAQ,EAAE,OAAO,GAAM,CAAC;CAC1D,SAAS,EAAE,GAAK;EACZ,IAAI;EACJ,IAAM,IAAO,GAAQ,SAAS,IAAI,GAAY,GAAG;AAEjD,EADA,EAAK,GAAM,EAAI,GACd,IAAK,EAAK,MAAM,aAAa,EAAG,WAAW,EAAE;AAC9C,OAAK,IAAM,KAAM,EAAK,KAAK,SACvB,IAAI;AAER,SAAO;;AAWX,QATA,OAAO,eAAe,GAAG,QAAQ,EAAE,OAAO,GAAM,CAAC,EACjD,OAAO,eAAe,GAAG,OAAO,aAAa,EACzC,QAAQ,MACA,GAAQ,UAAU,aAAgB,EAAO,SAClC,KACJ,GAAM,MAAM,QAAQ,IAAI,EAAK,EAE3C,CAAC,EACF,OAAO,eAAe,GAAG,QAAQ,EAAE,OAAO,GAAM,CAAC,EAC1C;;AAIX,IAAa,KAAb,cAAoC,MAAM;CACtC,cAAc;AACV,QAAM,2EAA2E;;GAG5E,KAAb,cAAqC,MAAM;CACvC,YAAY,GAAM;AAEd,EADA,MAAM,uDAAuD,IAAO,EACpE,KAAK,OAAO;;GAGP,KAAe,EAAE;AAC9B,SAAgB,GAAO,GAAW;AAG9B,QAFI,KACA,OAAO,OAAO,IAAc,EAAU,EACnC;;;;AC9DX,SAAgB,GAAc,GAAS;CACnC,IAAM,IAAgB,OAAO,OAAO,EAAQ,CAAC,QAAQ,MAAM,OAAO,KAAM,SAAS;AAIjF,QAHe,OAAO,QAAQ,EAAQ,CACjC,QAAQ,CAAC,GAAG,OAAO,EAAc,QAAQ,CAAC,EAAE,KAAK,GAAG,CACpD,KAAK,CAAC,GAAG,OAAO,EAAE;;AAM3B,SAAgB,GAAsB,GAAG,GAAO;AAG5C,QAFI,OAAO,KAAU,WACV,EAAM,UAAU,GACpB;;AAEX,SAAgB,GAAO,GAAQ;AAE3B,QAAO,EACH,IAAI,QAAQ;EACE;GACN,IAAM,IAAQ,GAAQ;AAEtB,UADA,OAAO,eAAe,MAAM,SAAS,EAAE,UAAO,CAAC,EACxC;;AAEX,QAAU,MAAM,2BAA2B;IAElD;;AAEL,SAAgB,GAAQ,GAAO;AAC3B,QAAO,KAAU;;AAErB,SAAgB,GAAW,GAAQ;CAC/B,IAAM,IAAQ,KAAO,WAAW,IAAI,EAC9B,IAAM,EAAO,SAAS,IAAI,GAAG,EAAO,SAAS,IAAI,EAAO;AAC9D,QAAO,EAAO,MAAM,GAAO,EAAI;;AAEnC,SAAgBO,GAAmB,GAAK,GAAM;CAC1C,IAAM,KAAe,EAAI,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,QACnD,IAAa,EAAK,UAAU,EAC9B,KAAgB,EAAW,MAAM,IAAI,CAAC,MAAM,IAAI;AACpD,KAAI,MAAiB,KAAK,WAAW,KAAK,EAAW,EAAE;EACnD,IAAM,IAAQ,EAAW,MAAM,aAAa;AAC5C,EAAI,IAAQ,OACR,IAAe,OAAO,SAAS,EAAM,GAAG;;CAGhD,IAAM,IAAW,IAAc,IAAe,IAAc;AAG5D,QAFe,OAAO,SAAS,EAAI,QAAQ,EAAS,CAAC,QAAQ,KAAK,GAAG,CAAC,GACtD,OAAO,SAAS,EAAK,QAAQ,EAAS,CAAC,QAAQ,KAAK,GAAG,CAAC,GAC5C,MAAM;;AAEtC,IAAM,KAAa,OAAO,aAAa;AACvC,SAAgB,EAAW,GAAQ,GAAK,GAAQ;CAC5C,IAAI;AACJ,QAAO,eAAe,GAAQ,GAAK;EAC/B,MAAM;AACE,aAAU,GAQd,QAJI,MAAU,KAAA,MACV,IAAQ,IACR,IAAQ,GAAQ,GAEb;;EAEX,IAAI,GAAG;AACH,UAAO,eAAe,GAAQ,GAAK,EAC/B,OAAO,GAEV,CAAC;;EAGN,cAAc;EACjB,CAAC;;AAKN,SAAgB,GAAW,GAAQ,GAAM,GAAO;AAC5C,QAAO,eAAe,GAAQ,GAAM;EAChC;EACA,UAAU;EACV,YAAY;EACZ,cAAc;EACjB,CAAC;;AAEN,SAAgB,GAAU,GAAG,GAAM;CAC/B,IAAM,IAAoB,EAAE;AAC5B,MAAK,IAAM,KAAO,EAEd,QAAO,OAAO,GADM,OAAO,0BAA0B,EAAI,CACZ;AAEjD,QAAO,OAAO,iBAAiB,EAAE,EAAE,EAAkB;;AA6BzD,SAAgB,GAAI,GAAK;AACrB,QAAO,KAAK,UAAU,EAAI;;AAE9B,SAAgB,GAAQ,GAAO;AAC3B,QAAO,EACF,aAAa,CACb,MAAM,CACN,QAAQ,aAAa,GAAG,CACxB,QAAQ,YAAY,IAAI,CACxB,QAAQ,YAAY,GAAG;;AAEhC,IAAa,KAAqB,uBAAuB,QAAQ,MAAM,qBAAqB,GAAG,MAAU;AACzG,SAAgB,GAAS,GAAM;AAC3B,QAAO,OAAO,KAAS,cAAY,KAAiB,CAAC,MAAM,QAAQ,EAAK;;AAE5E,IAAa,KAAa,SAAa;AAEnC,KAAI,OAAO,YAAc,OAAe,WAAW,WAAW,SAAS,aAAa,CAChF,QAAO;AAEX,KAAI;AAGA,SAFU,SACJ,GAAG,EACF;SAED;AACN,SAAO;;EAEb;AACF,SAAgB,GAAc,GAAG;AAC7B,KAAI,GAAS,EAAE,KAAK,GAChB,QAAO;CAEX,IAAM,IAAO,EAAE;AAGf,KAFI,MAAS,KAAA,KAET,OAAO,KAAS,WAChB,QAAO;CAEX,IAAM,IAAO,EAAK;AAOlB,QAHA,EAHI,GAAS,EAAK,KAAK,MAGnB,OAAO,UAAU,eAAe,KAAK,GAAM,gBAAgB,KAAK;;AAKxE,SAAgB,GAAa,GAAG;AAK5B,QAJI,GAAc,EAAE,GACT,EAAE,GAAG,GAAG,GACf,MAAM,QAAQ,EAAE,GACT,CAAC,GAAG,EAAE,GACV;;AAwDX,IAAa,KAAmB,IAAI,IAAI;CAAC;CAAU;CAAU;CAAS,CAAC;AAEvE,SAAgB,GAAY,GAAK;AAC7B,QAAO,EAAI,QAAQ,uBAAuB,OAAO;;AAGrD,SAAgB,GAAM,GAAM,GAAK,GAAQ;CACrC,IAAM,IAAK,IAAI,EAAK,KAAK,OAAO,KAAO,EAAK,KAAK,IAAI;AAGrD,SAFI,CAAC,KAAO,GAAQ,YAChB,EAAG,KAAK,SAAS,IACd;;AAEX,SAAgB,EAAgB,GAAS;CACrC,IAAM,IAAS;AACf,KAAI,CAAC,EACD,QAAO,EAAE;AACb,KAAI,OAAO,KAAW,SAClB,QAAO,EAAE,aAAa,GAAQ;AAClC,KAAI,GAAQ,YAAY,KAAA,GAAW;AAC/B,MAAI,GAAQ,UAAU,KAAA,EAClB,OAAU,MAAM,mDAAmD;AACvE,IAAO,QAAQ,EAAO;;AAK1B,QAHA,OAAO,EAAO,SACV,OAAO,EAAO,SAAU,WACjB;EAAE,GAAG;EAAQ,aAAa,EAAO;EAAO,GAC5C;;AA0CX,SAAgB,GAAa,GAAO;AAChC,QAAO,OAAO,KAAK,EAAM,CAAC,QAAQ,MACvB,EAAM,GAAG,KAAK,UAAU,cAAc,EAAM,GAAG,KAAK,WAAW,WACxE;;AAEN,IAAa,KAAuB;CAChC,SAAS,CAAC,4BAAiD;CAC3D,OAAO,CAAC,aAAa,WAAW;CAChC,QAAQ,CAAC,GAAG,WAAW;CACvB,SAAS,CAAC,uBAAwB,qBAAsB;CACxD,SAAS,CAAC,CAAC,OAAO,WAAW,OAAO,UAAU;CACjD;AAKD,SAAgB,GAAK,GAAQ,GAAM;CAC/B,IAAM,IAAU,EAAO,KAAK,KACtB,IAAS,EAAQ;AAEvB,KADkB,KAAU,EAAO,SAAS,EAExC,OAAU,MAAM,kEAAkE;AAkBtF,QAAO,GAAM,GAhBD,GAAU,EAAO,KAAK,KAAK;EACnC,IAAI,QAAQ;GACR,IAAM,IAAW,EAAE;AACnB,QAAK,IAAM,KAAO,GAAM;AACpB,QAAI,EAAE,KAAO,EAAQ,OACjB,OAAU,MAAM,sBAAsB,EAAI,GAAG;AAE5C,MAAK,OAEV,EAAS,KAAO,EAAQ,MAAM;;AAGlC,UADA,GAAW,MAAM,SAAS,EAAS,EAC5B;;EAEX,QAAQ,EAAE;EACb,CAAC,CACuB;;AAE7B,SAAgB,GAAK,GAAQ,GAAM;CAC/B,IAAM,IAAU,EAAO,KAAK,KACtB,IAAS,EAAQ;AAEvB,KADkB,KAAU,EAAO,SAAS,EAExC,OAAU,MAAM,kEAAkE;AAkBtF,QAAO,GAAM,GAhBD,GAAU,EAAO,KAAK,KAAK;EACnC,IAAI,QAAQ;GACR,IAAM,IAAW,EAAE,GAAG,EAAO,KAAK,IAAI,OAAO;AAC7C,QAAK,IAAM,KAAO,GAAM;AACpB,QAAI,EAAE,KAAO,EAAQ,OACjB,OAAU,MAAM,sBAAsB,EAAI,GAAG;AAE5C,MAAK,MAEV,OAAO,EAAS;;AAGpB,UADA,GAAW,MAAM,SAAS,EAAS,EAC5B;;EAEX,QAAQ,EAAE;EACb,CAAC,CACuB;;AAE7B,SAAgB,GAAO,GAAQ,GAAO;AAClC,KAAI,CAAC,GAAc,EAAM,CACrB,OAAU,MAAM,mDAAmD;CAEvE,IAAM,IAAS,EAAO,KAAK,IAAI;AAE/B,KADkB,KAAU,EAAO,SAAS,GAC7B;EAGX,IAAM,IAAgB,EAAO,KAAK,IAAI;AACtC,OAAK,IAAM,KAAO,EACd,KAAI,OAAO,yBAAyB,GAAe,EAAI,KAAK,KAAA,EACxD,OAAU,MAAM,+FAA+F;;AAW3H,QAAO,GAAM,GAPD,GAAU,EAAO,KAAK,KAAK,EACnC,IAAI,QAAQ;EACR,IAAM,IAAS;GAAE,GAAG,EAAO,KAAK,IAAI;GAAO,GAAG;GAAO;AAErD,SADA,GAAW,MAAM,SAAS,EAAO,EAC1B;IAEd,CAAC,CACuB;;AAE7B,SAAgB,GAAW,GAAQ,GAAO;AACtC,KAAI,CAAC,GAAc,EAAM,CACrB,OAAU,MAAM,uDAAuD;AAS3E,QAAO,GAAM,GAPD,GAAU,EAAO,KAAK,KAAK,EACnC,IAAI,QAAQ;EACR,IAAM,IAAS;GAAE,GAAG,EAAO,KAAK,IAAI;GAAO,GAAG;GAAO;AAErD,SADA,GAAW,MAAM,SAAS,EAAO,EAC1B;IAEd,CAAC,CACuB;;AAE7B,SAAgB,GAAM,GAAG,GAAG;AAYxB,QAAO,GAAM,GAXD,GAAU,EAAE,KAAK,KAAK;EAC9B,IAAI,QAAQ;GACR,IAAM,IAAS;IAAE,GAAG,EAAE,KAAK,IAAI;IAAO,GAAG,EAAE,KAAK,IAAI;IAAO;AAE3D,UADA,GAAW,MAAM,SAAS,EAAO,EAC1B;;EAEX,IAAI,WAAW;AACX,UAAO,EAAE,KAAK,IAAI;;EAEtB,QAAQ,EAAE;EACb,CAAC,CACkB;;AAExB,SAAgB,GAAQ,GAAO,GAAQ,GAAM;CAEzC,IAAM,IADU,EAAO,KAAK,IACL;AAEvB,KADkB,KAAU,EAAO,SAAS,EAExC,OAAU,MAAM,qEAAqE;AAsCzF,QAAO,GAAM,GApCD,GAAU,EAAO,KAAK,KAAK;EACnC,IAAI,QAAQ;GACR,IAAM,IAAW,EAAO,KAAK,IAAI,OAC3B,IAAQ,EAAE,GAAG,GAAU;AAC7B,OAAI,EACA,MAAK,IAAM,KAAO,GAAM;AACpB,QAAI,EAAE,KAAO,GACT,OAAU,MAAM,sBAAsB,EAAI,GAAG;AAE5C,MAAK,OAGV,EAAM,KAAO,IACP,IAAI,EAAM;KACR,MAAM;KACN,WAAW,EAAS;KACvB,CAAC,GACA,EAAS;;OAInB,MAAK,IAAM,KAAO,EAEd,GAAM,KAAO,IACP,IAAI,EAAM;IACR,MAAM;IACN,WAAW,EAAS;IACvB,CAAC,GACA,EAAS;AAIvB,UADA,GAAW,MAAM,SAAS,EAAM,EACzB;;EAEX,QAAQ,EAAE;EACb,CAAC,CACuB;;AAE7B,SAAgB,GAAS,GAAO,GAAQ,GAAM;AAgC1C,QAAO,GAAM,GA/BD,GAAU,EAAO,KAAK,KAAK,EACnC,IAAI,QAAQ;EACR,IAAM,IAAW,EAAO,KAAK,IAAI,OAC3B,IAAQ,EAAE,GAAG,GAAU;AAC7B,MAAI,EACA,MAAK,IAAM,KAAO,GAAM;AACpB,OAAI,EAAE,KAAO,GACT,OAAU,MAAM,sBAAsB,EAAI,GAAG;AAE5C,KAAK,OAGV,EAAM,KAAO,IAAI,EAAM;IACnB,MAAM;IACN,WAAW,EAAS;IACvB,CAAC;;MAIN,MAAK,IAAM,KAAO,EAEd,GAAM,KAAO,IAAI,EAAM;GACnB,MAAM;GACN,WAAW,EAAS;GACvB,CAAC;AAIV,SADA,GAAW,MAAM,SAAS,EAAM,EACzB;IAEd,CAAC,CACuB;;AAG7B,SAAgB,GAAQ,GAAG,IAAa,GAAG;AACvC,KAAI,EAAE,YAAY,GACd,QAAO;AACX,MAAK,IAAI,IAAI,GAAY,IAAI,EAAE,OAAO,QAAQ,IAC1C,KAAI,EAAE,OAAO,IAAI,aAAa,GAC1B,QAAO;AAGf,QAAO;;AAEX,SAAgB,GAAa,GAAM,GAAQ;AACvC,QAAO,EAAO,KAAK,MAAQ;EACvB,IAAI;AAGJ,UAFC,IAAK,GAAK,SAAS,EAAG,OAAO,EAAE,GAChC,EAAI,KAAK,QAAQ,EAAK,EACf;GACT;;AAEN,SAAgB,GAAc,GAAS;AACnC,QAAO,OAAO,KAAY,WAAW,IAAU,GAAS;;AAE5D,SAAgB,GAAc,GAAK,GAAK,GAAQ;CAC5C,IAAM,IAAO;EAAE,GAAG;EAAK,MAAM,EAAI,QAAQ,EAAE;EAAE;AAgB7C,QAdK,EAAI,YAML,EAAK,UALW,GAAc,EAAI,MAAM,KAAK,KAAK,QAAQ,EAAI,CAAC,IAC3D,GAAc,GAAK,QAAQ,EAAI,CAAC,IAChC,GAAc,EAAO,cAAc,EAAI,CAAC,IACxC,GAAc,EAAO,cAAc,EAAI,CAAC,IACxC,kBAIR,OAAO,EAAK,MACZ,OAAO,EAAK,UACP,GAAK,eACN,OAAO,EAAK,OAET;;AAYX,SAAgB,GAAoB,GAAO;AAKvC,QAJI,MAAM,QAAQ,EAAM,GACb,UACP,OAAO,KAAU,WACV,WACJ;;AAuBX,SAAgB,GAAM,GAAG,GAAM;CAC3B,IAAM,CAAC,GAAK,GAAO,KAAQ;AAS3B,QARI,OAAO,KAAQ,WACR;EACH,SAAS;EACT,MAAM;EACN;EACA;EACH,GAEE,EAAE,GAAG,GAAK;;;;ACnlBrB,IAAMC,MAAe,GAAM,MAAQ;AAW/B,CAVA,EAAK,OAAO,aACZ,OAAO,eAAe,GAAM,QAAQ;EAChC,OAAO,EAAK;EACZ,YAAY;EACf,CAAC,EACF,OAAO,eAAe,GAAM,UAAU;EAClC,OAAO;EACP,YAAY;EACf,CAAC,EACF,EAAK,UAAU,KAAK,UAAU,GAAKC,IAA4B,EAAE,EACjE,OAAO,eAAe,GAAM,YAAY;EACpC,aAAa,EAAK;EAClB,YAAY;EACf,CAAC;GAEO,KAAY,EAAa,aAAaD,GAAY,EAClD,KAAgB,EAAa,aAAaA,IAAa,EAAE,QAAQ,OAAO,CAAC;AACtF,SAAgB,GAAa,GAAO,KAAU,MAAU,EAAM,SAAS;CACnE,IAAM,IAAc,EAAE,EAChB,IAAa,EAAE;AACrB,MAAK,IAAM,KAAO,EAAM,OACpB,CAAI,EAAI,KAAK,SAAS,KAClB,EAAY,EAAI,KAAK,MAAM,EAAY,EAAI,KAAK,OAAO,EAAE,EACzD,EAAY,EAAI,KAAK,IAAI,KAAK,EAAO,EAAI,CAAC,IAG1C,EAAW,KAAK,EAAO,EAAI,CAAC;AAGpC,QAAO;EAAE;EAAY;EAAa;;AAEtC,SAAgB,GAAY,GAAO,KAAU,MAAU,EAAM,SAAS;CAClE,IAAM,IAAc,EAAE,SAAS,EAAE,EAAE,EAC7B,KAAgB,MAAU;AAC5B,OAAK,IAAM,KAAS,EAAM,OACtB,KAAI,EAAM,SAAS,mBAAmB,EAAM,OAAO,OAC/C,GAAM,OAAO,KAAK,MAAW,EAAa,EAAE,WAAQ,CAAC,CAAC;WAEjD,EAAM,SAAS,cACpB,GAAa,EAAE,QAAQ,EAAM,QAAQ,CAAC;WAEjC,EAAM,SAAS,kBACpB,GAAa,EAAE,QAAQ,EAAM,QAAQ,CAAC;WAEjC,EAAM,KAAK,WAAW,EAC3B,GAAY,QAAQ,KAAK,EAAO,EAAM,CAAC;OAEtC;GACD,IAAI,IAAO,GACP,IAAI;AACR,UAAO,IAAI,EAAM,KAAK,SAAQ;IAC1B,IAAM,IAAK,EAAM,KAAK;AAUtB,IATiB,MAAM,EAAM,KAAK,SAAS,KAKvC,EAAK,KAAM,EAAK,MAAO,EAAE,SAAS,EAAE,EAAE,EACtC,EAAK,GAAI,QAAQ,KAAK,EAAO,EAAM,CAAC,IAJpC,EAAK,KAAM,EAAK,MAAO,EAAE,SAAS,EAAE,EAAE,EAM1C,IAAO,EAAK,IACZ;;;;AAMhB,QADA,EAAa,EAAM,EACZ;;;;ACnEX,IAAaE,MAAU,OAAU,GAAQ,GAAO,GAAM,MAAY;CAC9D,IAAM,IAAM,IAAO,OAAO,OAAO,GAAM,EAAE,OAAO,IAAO,CAAC,GAAG,EAAE,OAAO,IAAO,EACrE,IAAS,EAAO,KAAK,IAAI;EAAE;EAAO,QAAQ,EAAE;EAAE,EAAE,EAAI;AAC1D,KAAI,aAAkB,QAClB,OAAM,IAAIC,IAAqB;AAEnC,KAAI,EAAO,OAAO,QAAQ;EACtB,IAAM,IAAI,KAAK,GAAS,OAAO,GAAM,EAAO,OAAO,KAAK,MAAQC,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC,CAAC;AAE7G,QADA,GAAuB,GAAG,GAAS,OAAO,EACpC;;AAEV,QAAO,EAAO;GAGL,MAAe,MAAS,OAAO,GAAQ,GAAO,GAAM,MAAW;CACxE,IAAM,IAAM,IAAO,OAAO,OAAO,GAAM,EAAE,OAAO,IAAM,CAAC,GAAG,EAAE,OAAO,IAAM,EACrE,IAAS,EAAO,KAAK,IAAI;EAAE;EAAO,QAAQ,EAAE;EAAE,EAAE,EAAI;AAGxD,KAFI,aAAkB,YAClB,IAAS,MAAM,IACf,EAAO,OAAO,QAAQ;EACtB,IAAM,IAAI,KAAK,GAAQ,OAAO,GAAM,EAAO,OAAO,KAAK,MAAQD,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC,CAAC;AAE5G,QADA,GAAuB,GAAG,GAAQ,OAAO,EACnC;;AAEV,QAAO,EAAO;GAGL,MAAc,OAAU,GAAQ,GAAO,MAAS;CACzD,IAAM,IAAM,IAAO;EAAE,GAAG;EAAM,OAAO;EAAO,GAAG,EAAE,OAAO,IAAO,EACzD,IAAS,EAAO,KAAK,IAAI;EAAE;EAAO,QAAQ,EAAE;EAAE,EAAE,EAAI;AAC1D,KAAI,aAAkB,QAClB,OAAM,IAAIF,IAAqB;AAEnC,QAAO,EAAO,OAAO,SACf;EACE,SAAS;EACT,OAAO,KAAK,KAAQM,IAAkB,EAAO,OAAO,KAAK,MAAQL,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC,CAAC;EACjH,GACC;EAAE,SAAS;EAAM,MAAM,EAAO;EAAO;GAElCK,KAA2B,mBAAWH,GAAqB,EAC3D,MAAmB,MAAS,OAAO,GAAQ,GAAO,MAAS;CACpE,IAAM,IAAM,IAAO,OAAO,OAAO,GAAM,EAAE,OAAO,IAAM,CAAC,GAAG,EAAE,OAAO,IAAM,EACrE,IAAS,EAAO,KAAK,IAAI;EAAE;EAAO,QAAQ,EAAE;EAAE,EAAE,EAAI;AAGxD,QAFI,aAAkB,YAClB,IAAS,MAAM,IACZ,EAAO,OAAO,SACf;EACE,SAAS;EACT,OAAO,IAAI,EAAK,EAAO,OAAO,KAAK,MAAQH,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC,CAAC;EAC3F,GACC;EAAE,SAAS;EAAM,MAAM,EAAO;EAAO;GAElCM,KAAgC,mBAAgBJ,GAAqB,EACrE,MAAW,OAAU,GAAQ,GAAO,MAAS;CACtD,IAAM,IAAM,IAAO,OAAO,OAAO,GAAM,EAAE,WAAW,YAAY,CAAC,GAAG,EAAE,WAAW,YAAY;AAC7F,QAAOL,GAAO,EAAK,CAAC,GAAQ,GAAO,EAAI;GAG9B,MAAW,OAAU,GAAQ,GAAO,MACtCA,GAAO,EAAK,CAAC,GAAQ,GAAO,EAAK,EAG/B,MAAgB,MAAS,OAAO,GAAQ,GAAO,MAAS;CACjE,IAAM,IAAM,IAAO,OAAO,OAAO,GAAM,EAAE,WAAW,YAAY,CAAC,GAAG,EAAE,WAAW,YAAY;AAC7F,QAAO,GAAY,EAAK,CAAC,GAAQ,GAAO,EAAI;GAGnC,MAAgB,MAAS,OAAO,GAAQ,GAAO,MACjD,GAAY,EAAK,CAAC,GAAQ,GAAO,EAAK,EAGpC,MAAe,OAAU,GAAQ,GAAO,MAAS;CAC1D,IAAM,IAAM,IAAO,OAAO,OAAO,GAAM,EAAE,WAAW,YAAY,CAAC,GAAG,EAAE,WAAW,YAAY;AAC7F,QAAO,GAAW,EAAK,CAAC,GAAQ,GAAO,EAAI;GAGlC,MAAe,OAAU,GAAQ,GAAO,MAC1C,GAAW,EAAK,CAAC,GAAQ,GAAO,EAAK,EAGnC,MAAoB,MAAS,OAAO,GAAQ,GAAO,MAAS;CACrE,IAAM,IAAM,IAAO,OAAO,OAAO,GAAM,EAAE,WAAW,YAAY,CAAC,GAAG,EAAE,WAAW,YAAY;AAC7F,QAAO,GAAgB,EAAK,CAAC,GAAQ,GAAO,EAAI;GAGvC,MAAoB,MAAS,OAAO,GAAQ,GAAO,MACrD,GAAgB,EAAK,CAAC,GAAQ,GAAO,EAAK,ECzFxC,KAAO,oBACP,KAAQ,eACR,KAAO,yCACP,KAAM,qBACN,KAAQ,qBACR,KAAS,uBAETkB,KAAW,iGAIX,KAAO,mFAIP,MAAQ,MACZ,IAEM,OAAO,mCAAmC,EAAQ,yDAAyD,GAD3G,0KAOF,KAAQ,oGAUfC,KAAS;AACf,SAAgB,KAAQ;AACpB,QAAO,IAAI,OAAOA,IAAQ,IAAI;;AAElC,IAAa,KAAO,uHACP,KAAO,gYAKP,KAAS,4IACT,KAAS,kIAET,KAAS,+EACT,KAAY,oBAOZ,KAAO,qBAEd,KAAa,uNACNC,KAAqB,gBAAI,OAAO,IAAI,GAAW,GAAG;AAC/D,SAAS,GAAW,GAAM;CACtB,IAAM,IAAO;AAQb,QAPc,OAAO,EAAK,aAAc,WAClC,EAAK,cAAc,KACf,GAAG,MACH,EAAK,cAAc,IACf,GAAG,EAAK,aACR,GAAG,EAAK,kBAAkB,EAAK,UAAU,KACjD,GAAG,EAAK;;AAGlB,SAAgBC,GAAK,GAAM;AACvB,QAAW,OAAO,IAAI,GAAW,EAAK,CAAC,GAAG;;AAG9C,SAAgBC,GAAS,GAAM;CAC3B,IAAM,IAAO,GAAW,EAAE,WAAW,EAAK,WAAW,CAAC,EAChD,IAAO,CAAC,IAAI;AAIlB,CAHI,EAAK,SACL,EAAK,KAAK,GAAG,EAEb,EAAK,UACL,EAAK,KAAK,oCAAoC;CAClD,IAAM,IAAY,GAAG,EAAK,KAAK,EAAK,KAAK,IAAI,CAAC;AAC9C,QAAW,OAAO,IAAI,GAAW,MAAM,EAAU,IAAI;;AAEzD,IAAaC,MAAU,MAAW;CAC9B,IAAM,IAAQ,IAAS,YAAY,GAAQ,WAAW,EAAE,GAAG,GAAQ,WAAW,GAAG,KAAK;AACtF,QAAW,OAAO,IAAI,EAAM,GAAG;GAGtB,KAAU,WACVC,KAAS,qBACTC,KAAU,qBACjBC,KAAQ,WAKD,KAAY,aAEZ,KAAY,aCjGZ,IAA0B,kBAAkB,cAAc,GAAM,MAAQ;CACjF,IAAI;AAGJ,CAFA,AAAc,EAAK,SAAO,EAAE,EAC5B,EAAK,KAAK,MAAM,IACf,IAAK,EAAK,MAAM,aAAa,EAAG,WAAW,EAAE;EAChD,EACI,KAAmB;CACrB,QAAQ;CACR,QAAQ;CACR,QAAQ;CACX,EACY,KAAkC,kBAAkB,sBAAsB,GAAM,MAAQ;AACjG,GAAU,KAAK,GAAM,EAAI;CACzB,IAAM,IAAS,GAAiB,OAAO,EAAI;AAW3C,CAVA,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK,KAChB,KAAQ,EAAI,YAAY,EAAI,UAAU,EAAI,qBAAqB;AACrE,EAAI,EAAI,QAAQ,MACR,EAAI,YACJ,EAAI,UAAU,EAAI,QAElB,EAAI,mBAAmB,EAAI;GAErC,EACF,EAAK,KAAK,SAAS,MAAY;AACvB,KAAI,YAAY,EAAQ,SAAS,EAAI,QAAQ,EAAQ,QAAQ,EAAI,UAGrE,EAAQ,OAAO,KAAK;GAChB;GACA,MAAM;GACN,SAAS,OAAO,EAAI,SAAU,WAAW,EAAI,MAAM,SAAS,GAAG,EAAI;GACnE,OAAO,EAAQ;GACf,WAAW,EAAI;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAqC,kBAAkB,yBAAyB,GAAM,MAAQ;AACvG,GAAU,KAAK,GAAM,EAAI;CACzB,IAAM,IAAS,GAAiB,OAAO,EAAI;AAW3C,CAVA,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK,KAChB,KAAQ,EAAI,YAAY,EAAI,UAAU,EAAI,qBAAqB;AACrE,EAAI,EAAI,QAAQ,MACR,EAAI,YACJ,EAAI,UAAU,EAAI,QAElB,EAAI,mBAAmB,EAAI;GAErC,EACF,EAAK,KAAK,SAAS,MAAY;AACvB,KAAI,YAAY,EAAQ,SAAS,EAAI,QAAQ,EAAQ,QAAQ,EAAI,UAGrE,EAAQ,OAAO,KAAK;GAChB;GACA,MAAM;GACN,SAAS,OAAO,EAAI,SAAU,WAAW,EAAI,MAAM,SAAS,GAAG,EAAI;GACnE,OAAO,EAAQ;GACf,WAAW,EAAI;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KACC,kBAAkB,wBAAwB,GAAM,MAAQ;AAMlE,CALA,EAAU,KAAK,GAAM,EAAI,EACzB,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAI;AACJ,GAAC,IAAK,EAAK,KAAK,KAAK,eAAe,EAAG,aAAa,EAAI;GAC1D,EACF,EAAK,KAAK,SAAS,MAAY;AAC3B,MAAI,OAAO,EAAQ,SAAU,OAAO,EAAI,MACpC,OAAU,MAAM,qDAAqD;AACtD,UAAO,EAAQ,SAAU,WACtC,EAAQ,QAAQ,EAAI,UAAU,OAAO,EAAE,GACvCC,GAAwB,EAAQ,OAAO,EAAI,MAAM,KAAK,MAG5D,EAAQ,OAAO,KAAK;GAChB,QAAQ,OAAO,EAAQ;GACvB,MAAM;GACN,SAAS,EAAI;GACb,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAsC,kBAAkB,0BAA0B,GAAM,MAAQ;AAEzG,CADA,EAAU,KAAK,GAAM,EAAI,EACzB,EAAI,SAAS,EAAI,UAAU;CAC3B,IAAM,IAAQ,EAAI,QAAQ,SAAS,MAAM,EACnC,IAAS,IAAQ,QAAQ,UACzB,CAAC,GAAS,KAAWC,GAA0B,EAAI;AASzD,CARA,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK;AAItB,EAHA,EAAI,SAAS,EAAI,QACjB,EAAI,UAAU,GACd,EAAI,UAAU,GACV,MACA,EAAI,UAAUC;GACpB,EACF,EAAK,KAAK,SAAS,MAAY;EAC3B,IAAM,IAAQ,EAAQ;AACtB,MAAI,GAAO;AACP,OAAI,CAAC,OAAO,UAAU,EAAM,EAAE;AAU1B,MAAQ,OAAO,KAAK;KAChB,UAAU;KACV,QAAQ,EAAI;KACZ,MAAM;KACN,UAAU;KACV;KACA;KACH,CAAC;AACF;;AAUJ,OAAI,CAAC,OAAO,cAAc,EAAM,EAAE;AAC9B,IAAI,IAAQ,IAER,EAAQ,OAAO,KAAK;KAChB;KACA,MAAM;KACN;KACA,MAAM;KACN;KACA;KACA,WAAW;KACX,UAAU,CAAC,EAAI;KAClB,CAAC,GAIF,EAAQ,OAAO,KAAK;KAChB;KACA,MAAM;KACN,SAAS;KACT,MAAM;KACN;KACA;KACA,WAAW;KACX,UAAU,CAAC,EAAI;KAClB,CAAC;AAEN;;;AAcR,EAXI,IAAQ,KACR,EAAQ,OAAO,KAAK;GAChB,QAAQ;GACR;GACA,MAAM;GACN;GACA,WAAW;GACX;GACA,UAAU,CAAC,EAAI;GAClB,CAAC,EAEF,IAAQ,KACR,EAAQ,OAAO,KAAK;GAChB,QAAQ;GACR;GACA,MAAM;GACN;GACA,WAAW;GACX;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAGZ,EA0HW,KAAmC,kBAAkB,uBAAuB,GAAM,MAAQ;CACnG,IAAI;AAWJ,CAVA,EAAU,KAAK,GAAM,EAAI,GACxB,IAAK,EAAK,KAAK,KAAK,SAAS,EAAG,QAAQ,MAAY;EACjD,IAAM,IAAM,EAAQ;AACpB,SAAO,CAACC,GAAa,EAAI,IAAI,EAAI,WAAW,KAAA;KAEhD,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAQ,EAAK,KAAK,IAAI,WAAW;AACvC,EAAI,EAAI,UAAU,MACd,EAAK,KAAK,IAAI,UAAU,EAAI;GAClC,EACF,EAAK,KAAK,SAAS,MAAY;EAC3B,IAAM,IAAQ,EAAQ;AAEtB,MADe,EAAM,UACP,EAAI,QACd;EACJ,IAAM,IAASC,GAAyB,EAAM;AAC9C,IAAQ,OAAO,KAAK;GAChB;GACA,MAAM;GACN,SAAS,EAAI;GACb,WAAW;GACX;GACA;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAmC,kBAAkB,uBAAuB,GAAM,MAAQ;CACnG,IAAI;AAWJ,CAVA,EAAU,KAAK,GAAM,EAAI,GACxB,IAAK,EAAK,KAAK,KAAK,SAAS,EAAG,QAAQ,MAAY;EACjD,IAAM,IAAM,EAAQ;AACpB,SAAO,CAACD,GAAa,EAAI,IAAI,EAAI,WAAW,KAAA;KAEhD,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAQ,EAAK,KAAK,IAAI,WAAW;AACvC,EAAI,EAAI,UAAU,MACd,EAAK,KAAK,IAAI,UAAU,EAAI;GAClC,EACF,EAAK,KAAK,SAAS,MAAY;EAC3B,IAAM,IAAQ,EAAQ;AAEtB,MADe,EAAM,UACP,EAAI,QACd;EACJ,IAAM,IAASC,GAAyB,EAAM;AAC9C,IAAQ,OAAO,KAAK;GAChB;GACA,MAAM;GACN,SAAS,EAAI;GACb,WAAW;GACX;GACA;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAsC,kBAAkB,0BAA0B,GAAM,MAAQ;CACzG,IAAI;AAYJ,CAXA,EAAU,KAAK,GAAM,EAAI,GACxB,IAAK,EAAK,KAAK,KAAK,SAAS,EAAG,QAAQ,MAAY;EACjD,IAAM,IAAM,EAAQ;AACpB,SAAO,CAACD,GAAa,EAAI,IAAI,EAAI,WAAW,KAAA;KAEhD,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK;AAGtB,EAFA,EAAI,UAAU,EAAI,QAClB,EAAI,UAAU,EAAI,QAClB,EAAI,SAAS,EAAI;GACnB,EACF,EAAK,KAAK,SAAS,MAAY;EAC3B,IAAM,IAAQ,EAAQ,OAChB,IAAS,EAAM;AACrB,MAAI,MAAW,EAAI,OACf;EACJ,IAAM,IAASC,GAAyB,EAAM,EACxC,IAAS,IAAS,EAAI;AAC5B,IAAQ,OAAO,KAAK;GAChB;GACA,GAAI,IAAS;IAAE,MAAM;IAAW,SAAS,EAAI;IAAQ,GAAG;IAAE,MAAM;IAAa,SAAS,EAAI;IAAQ;GAClG,WAAW;GACX,OAAO;GACP,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAsC,kBAAkB,0BAA0B,GAAM,MAAQ;CACzG,IAAI,GAAI;AAUR,CATA,EAAU,KAAK,GAAM,EAAI,EACzB,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK;AAEtB,EADA,EAAI,SAAS,EAAI,QACb,EAAI,YACJ,AAAiB,EAAI,6BAAW,IAAI,KAAK,EACzC,EAAI,SAAS,IAAI,EAAI,QAAQ;GAEnC,EACE,EAAI,WACH,IAAK,EAAK,MAAM,UAAU,EAAG,SAAS,MAAY;AAC/C,IAAI,QAAQ,YAAY,GACpB,GAAI,QAAQ,KAAK,EAAQ,MAAM,IAEnC,EAAQ,OAAO,KAAK;GAChB,QAAQ;GACR,MAAM;GACN,QAAQ,EAAI;GACZ,OAAO,EAAQ;GACf,GAAI,EAAI,UAAU,EAAE,SAAS,EAAI,QAAQ,UAAU,EAAE,GAAG,EAAE;GAC1D;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;OAGL,IAAK,EAAK,MAAM,UAAU,EAAG,cAAc;EAClD,EACW,KAA+B,kBAAkB,mBAAmB,GAAM,MAAQ;AAE3F,CADA,GAAsB,KAAK,GAAM,EAAI,EACrC,EAAK,KAAK,SAAS,MAAY;AAC3B,IAAI,QAAQ,YAAY,GACpB,GAAI,QAAQ,KAAK,EAAQ,MAAM,IAEnC,EAAQ,OAAO,KAAK;GAChB,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,OAAO,EAAQ;GACf,SAAS,EAAI,QAAQ,UAAU;GAC/B;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAmC,kBAAkB,uBAAuB,GAAM,MAAQ;AAEnG,CADA,AAAgB,EAAI,YAAUC,IAC9B,GAAsB,KAAK,GAAM,EAAI;EACvC,EACW,KAAmC,kBAAkB,uBAAuB,GAAM,MAAQ;AAEnG,CADA,AAAgB,EAAI,YAAUC,IAC9B,GAAsB,KAAK,GAAM,EAAI;EACvC,EACW,KAAkC,kBAAkB,sBAAsB,GAAM,MAAQ;AACjG,GAAU,KAAK,GAAM,EAAI;CACzB,IAAM,IAAeC,GAAiB,EAAI,SAAS,EAC7C,IAAU,IAAI,OAAO,OAAO,EAAI,YAAa,WAAW,MAAM,EAAI,SAAS,GAAG,MAAiB,EAAa;AAOlH,CANA,EAAI,UAAU,GACd,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK;AAEtB,EADA,AAAiB,EAAI,6BAAW,IAAI,KAAK,EACzC,EAAI,SAAS,IAAI,EAAQ;GAC3B,EACF,EAAK,KAAK,SAAS,MAAY;AACvB,IAAQ,MAAM,SAAS,EAAI,UAAU,EAAI,SAAS,IAEtD,EAAQ,OAAO,KAAK;GAChB,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,UAAU,EAAI;GACd,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAoC,kBAAkB,wBAAwB,GAAM,MAAQ;AACrG,GAAU,KAAK,GAAM,EAAI;CACzB,IAAM,IAAc,OAAO,IAAIA,GAAiB,EAAI,OAAO,CAAC,IAAI;AAOhE,CANA,AAAgB,EAAI,YAAU,GAC9B,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK;AAEtB,EADA,AAAiB,EAAI,6BAAW,IAAI,KAAK,EACzC,EAAI,SAAS,IAAI,EAAQ;GAC3B,EACF,EAAK,KAAK,SAAS,MAAY;AACvB,IAAQ,MAAM,WAAW,EAAI,OAAO,IAExC,EAAQ,OAAO,KAAK;GAChB,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,QAAQ,EAAI;GACZ,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAkC,kBAAkB,sBAAsB,GAAM,MAAQ;AACjG,GAAU,KAAK,GAAM,EAAI;CACzB,IAAM,IAAc,OAAO,KAAKA,GAAiB,EAAI,OAAO,CAAC,GAAG;AAOhE,CANA,AAAgB,EAAI,YAAU,GAC9B,EAAK,KAAK,SAAS,MAAM,MAAS;EAC9B,IAAM,IAAM,EAAK,KAAK;AAEtB,EADA,AAAiB,EAAI,6BAAW,IAAI,KAAK,EACzC,EAAI,SAAS,IAAI,EAAQ;GAC3B,EACF,EAAK,KAAK,SAAS,MAAY;AACvB,IAAQ,MAAM,SAAS,EAAI,OAAO,IAEtC,EAAQ,OAAO,KAAK;GAChB,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,QAAQ,EAAI;GACZ,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EAyCW,KAAmC,kBAAkB,uBAAuB,GAAM,MAAQ;AAEnG,CADA,EAAU,KAAK,GAAM,EAAI,EACzB,EAAK,KAAK,SAAS,MAAY;AAC3B,IAAQ,QAAQ,EAAI,GAAG,EAAQ,MAAM;;EAE3C,EC9jBW,KAAb,MAAiB;CACb,YAAY,IAAO,EAAE,EAAE;AAGnB,EAFA,KAAK,UAAU,EAAE,EACjB,KAAK,SAAS,GACV,SACA,KAAK,OAAO;;CAEpB,SAAS,GAAI;AAGT,EAFA,KAAK,UAAU,GACf,EAAG,KAAK,EACR,OAAK;;CAET,MAAM,GAAK;AACP,MAAI,OAAO,KAAQ,YAAY;AAE3B,GADA,EAAI,MAAM,EAAE,WAAW,QAAQ,CAAC,EAChC,EAAI,MAAM,EAAE,WAAW,SAAS,CAAC;AACjC;;EAGJ,IAAM,IADU,EACM,MAAM,KAAK,CAAC,QAAQ,MAAM,EAAE,EAC5C,IAAY,KAAK,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,EAC1E,IAAW,EAAM,KAAK,MAAM,EAAE,MAAM,EAAU,CAAC,CAAC,KAAK,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE,GAAG,EAAE;AACjG,OAAK,IAAM,KAAQ,EACf,MAAK,QAAQ,KAAK,EAAK;;CAG/B,UAAU;EACN,IAAM,IAAI,UACJ,IAAO,MAAM,MAEb,IAAQ,CAAC,IADC,MAAM,WAAW,CAAC,GAAG,EACX,KAAK,MAAM,KAAK,IAAI,CAAC;AAE/C,SAAO,IAAI,EAAE,GAAG,GAAM,EAAM,KAAK,KAAK,CAAC;;GChClC,KAAU;CACnB,OAAO;CACP,OAAO;CACP,OAAO;CACV,ECGY,IAAyB,kBAAkB,aAAa,GAAM,MAAQ;CAC/E,IAAI;AAIJ,CAHA,AAAS,MAAO,EAAE,EAClB,EAAK,KAAK,MAAM,GAChB,EAAK,KAAK,MAAM,EAAK,KAAK,OAAO,EAAE,EACnC,EAAK,KAAK,UAAU;CACpB,IAAM,IAAS,CAAC,GAAI,EAAK,KAAK,IAAI,UAAU,EAAE,CAAE;AAEhD,CAAI,EAAK,KAAK,OAAO,IAAI,YAAY,IACjC,EAAO,QAAQ,EAAK;AAExB,MAAK,IAAM,KAAM,EACb,MAAK,IAAM,KAAM,EAAG,KAAK,SACrB,GAAG,EAAK;AAGhB,KAAI,EAAO,WAAW,EAIlB,EADC,IAAK,EAAK,MAAM,aAAa,EAAG,WAAW,EAAE,GAC9C,EAAK,KAAK,UAAU,WAAW;AAC3B,IAAK,KAAK,MAAM,EAAK,KAAK;GAC5B;MAED;EACD,IAAM,KAAa,GAAS,GAAQ,MAAQ;GACxC,IAAI,IAAYC,GAAa,EAAQ,EACjC;AACJ,QAAK,IAAM,KAAM,GAAQ;AACrB,QAAI,EAAG,KAAK,IAAI;SAER,CADc,EAAG,KAAK,IAAI,KAAK,EAAQ,CAEvC;eAEC,EACL;IAEJ,IAAM,IAAU,EAAQ,OAAO,QACzB,IAAI,EAAG,KAAK,MAAM,EAAQ;AAChC,QAAI,aAAa,WAAW,GAAK,UAAU,GACvC,OAAM,IAAIC,IAAqB;AAEnC,QAAI,KAAe,aAAa,QAC5B,MAAe,KAAe,QAAQ,SAAS,EAAE,KAAK,YAAY;AAC9D,WAAM,GACU,EAAQ,OAAO,WACf,MAEhB,AACI,MAAYD,GAAa,GAAS,EAAQ;MAChD;SAED;AAED,SADgB,EAAQ,OAAO,WACf,EACZ;AACJ,KACI,MAAYA,GAAa,GAAS,EAAQ;;;AAQtD,UALI,IACO,EAAY,WACR,EACT,GAEC;KAEL,KAAsB,GAAQ,GAAS,MAAQ;AAEjD,OAAIA,GAAa,EAAO,CAEpB,QADA,EAAO,UAAU,IACV;GAGX,IAAM,IAAc,EAAU,GAAS,GAAQ,EAAI;AACnD,OAAI,aAAuB,SAAS;AAChC,QAAI,EAAI,UAAU,GACd,OAAM,IAAIC,IAAqB;AACnC,WAAO,EAAY,MAAM,MAAgB,EAAK,KAAK,MAAM,GAAa,EAAI,CAAC;;AAE/E,UAAO,EAAK,KAAK,MAAM,GAAa,EAAI;;AAE5C,IAAK,KAAK,OAAO,GAAS,MAAQ;AAC9B,OAAI,EAAI,WACJ,QAAO,EAAK,KAAK,MAAM,GAAS,EAAI;AAExC,OAAI,EAAI,cAAc,YAAY;IAG9B,IAAM,IAAS,EAAK,KAAK,MAAM;KAAE,OAAO,EAAQ;KAAO,QAAQ,EAAE;KAAE,EAAE;KAAE,GAAG;KAAK,YAAY;KAAM,CAAC;AAMlG,WALI,aAAkB,UACX,EAAO,MAAM,MACT,EAAmB,GAAQ,GAAS,EAAI,CACjD,GAEC,EAAmB,GAAQ,GAAS,EAAI;;GAGnD,IAAM,IAAS,EAAK,KAAK,MAAM,GAAS,EAAI;AAC5C,OAAI,aAAkB,SAAS;AAC3B,QAAI,EAAI,UAAU,GACd,OAAM,IAAIA,IAAqB;AACnC,WAAO,EAAO,MAAM,MAAW,EAAU,GAAQ,GAAQ,EAAI,CAAC;;AAElE,UAAO,EAAU,GAAQ,GAAQ,EAAI;;;AAI7C,GAAgB,GAAM,oBAAoB;EACtC,WAAW,MAAU;AACjB,OAAI;IACA,IAAM,IAAIC,GAAU,GAAM,EAAM;AAChC,WAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,QAAQ;WAE5D;AACN,WAAOC,GAAe,GAAM,EAAM,CAAC,MAAM,MAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,QAAQ,CAAE;;;EAGrH,QAAQ;EACR,SAAS;EACZ,EAAE;EACL,EAEW,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAGnF,CAFA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,UAAU,CAAC,GAAI,GAAM,KAAK,KAAK,YAAY,EAAE,CAAE,CAAC,KAAK,IAAIC,GAAe,EAAK,KAAK,IAAI,EAChG,EAAK,KAAK,SAAS,GAAS,MAAM;AAC9B,MAAI,EAAI,OACJ,KAAI;AACA,KAAQ,QAAQ,OAAO,EAAQ,MAAM;UAE/B;AASd,SARI,OAAO,EAAQ,SAAU,YAE7B,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN,OAAO,EAAQ;GACf;GACH,CAAC,EANS;;EASjB,EACW,IAAiC,kBAAkB,qBAAqB,GAAM,MAAQ;AAG/F,CADA,GAA6B,KAAK,GAAM,EAAI,EAC5C,GAAW,KAAK,GAAM,EAAI;EAC5B,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAE/E,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAC/E,KAAI,EAAI,SAAS;EAWb,IAAM,IAVa;GACf,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACP,CACoB,EAAI;AACzB,MAAI,MAAM,KAAA,EACN,OAAU,MAAM,0BAA0B,EAAI,QAAQ,GAAG;AAC7D,EAAgB,EAAI,YAAUC,GAAa,EAAE;OAG7C,CAAgB,EAAI,YAAUA,IAAc;AAChD,GAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAE7E,CADA,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAK,KAAK,SAAS,MAAY;AAC3B,MAAI;GAEA,IAAM,IAAU,EAAQ,MAAM,MAAM,EAE9B,IAAM,IAAI,IAAI,EAAQ;AA8B5B,GA7BI,EAAI,aACJ,EAAI,SAAS,YAAY,GACpB,EAAI,SAAS,KAAK,EAAI,SAAS,IAChC,EAAQ,OAAO,KAAK;IAChB,MAAM;IACN,QAAQ;IACR,MAAM;IACN,SAAS,EAAI,SAAS;IACtB,OAAO,EAAQ;IACf;IACA,UAAU,CAAC,EAAI;IAClB,CAAC,GAGN,EAAI,aACJ,EAAI,SAAS,YAAY,GACpB,EAAI,SAAS,KAAK,EAAI,SAAS,SAAS,IAAI,GAAG,EAAI,SAAS,MAAM,GAAG,GAAG,GAAG,EAAI,SAAS,IACzF,EAAQ,OAAO,KAAK;IAChB,MAAM;IACN,QAAQ;IACR,MAAM;IACN,SAAS,EAAI,SAAS;IACtB,OAAO,EAAQ;IACf;IACA,UAAU,CAAC,EAAI;IAClB,CAAC,GAIN,EAAI,YAEJ,EAAQ,QAAQ,EAAI,OAIpB,EAAQ,QAAQ;AAEpB;UAEM;AACN,KAAQ,OAAO,KAAK;IAChB,MAAM;IACN,QAAQ;IACR,OAAO,EAAQ;IACf;IACA,UAAU,CAAC,EAAI;IAClB,CAAC;;;EAGZ,EACW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,AAAgB,EAAI,YAAUC,IAAe,EAC7C,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAEnF,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAE/E,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAE/E,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAE7E,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAgC,kBAAkB,oBAAoB,GAAM,MAAQ;AAE7F,CADA,AAAgB,EAAI,YAAUC,GAAiB,EAAI,EACnD,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAErF,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAErF,CADA,AAAgB,EAAI,YAAUC,GAAa,EAAI,EAC/C,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAgC,kBAAkB,oBAAoB,GAAM,MAAQ;AAE7F,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAG/E,CAFA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAK,KAAK,IAAI,SAAS;EACzB,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAI/E,CAHA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAK,KAAK,IAAI,SAAS,QACvB,EAAK,KAAK,SAAS,MAAY;AAC3B,MAAI;AAEA,OAAI,IAAI,WAAW,EAAQ,MAAM,GAAG;UAGlC;AACF,KAAQ,OAAO,KAAK;IAChB,MAAM;IACN,QAAQ;IACR,OAAO,EAAQ;IACf;IACA,UAAU,CAAC,EAAI;IAClB,CAAC;;;EAGZ,EAMW,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAEnF,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC,EACW,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAGnF,CAFA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAK,KAAK,SAAS,MAAY;EAC3B,IAAM,IAAQ,EAAQ,MAAM,MAAM,IAAI;AACtC,MAAI;AACA,OAAI,EAAM,WAAW,EACjB,OAAU,OAAO;GACrB,IAAM,CAAC,GAAS,KAAU;AAC1B,OAAI,CAAC,EACD,OAAU,OAAO;GACrB,IAAM,IAAY,OAAO,EAAO;AAGhC,OAFI,GAAG,QAAgB,KAEnB,IAAY,KAAK,IAAY,IAC7B,OAAU,OAAO;AAErB,OAAI,IAAI,WAAW,EAAQ,GAAG;UAE5B;AACF,KAAQ,OAAO,KAAK;IAChB,MAAM;IACN,QAAQ;IACR,OAAO,EAAQ;IACf;IACA,UAAU,CAAC,EAAI;IAClB,CAAC;;;EAGZ;AAEF,SAAgB,GAAc,GAAM;AAChC,KAAI,MAAS,GACT,QAAO;AACX,KAAI,EAAK,SAAS,KAAM,EACpB,QAAO;AACX,KAAI;AAGA,SADA,KAAK,EAAK,EACH;SAEL;AACF,SAAO;;;AAGf,IAAa,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAInF,CAHA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAK,KAAK,IAAI,kBAAkB,UAChC,EAAK,KAAK,SAAS,MAAY;AACvB,KAAc,EAAQ,MAAM,IAEhC,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN,QAAQ;GACR,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER;AAEF,SAAgB,GAAiB,GAAM;AACnC,KAAI,CAAA,GAAmB,KAAK,EAAK,CAC7B,QAAO;CACX,IAAM,IAAS,EAAK,QAAQ,UAAU,MAAO,MAAM,MAAM,MAAM,IAAK;AAEpE,QAAO,GADQ,EAAO,OAAO,KAAK,KAAK,EAAO,SAAS,EAAE,GAAG,GAAG,IAAI,CACvC;;AAEhC,IAAa,KAA8B,kBAAkB,kBAAkB,GAAM,MAAQ;AAIzF,CAHA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAK,KAAK,IAAI,kBAAkB,aAChC,EAAK,KAAK,SAAS,MAAY;AACvB,KAAiB,EAAQ,MAAM,IAEnC,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN,QAAQ;GACR,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAE/E,CADA,AAAgB,EAAI,YAAUC,IAC9B,EAAiB,KAAK,GAAM,EAAI;EAClC;AAEF,SAAgBC,GAAW,GAAO,IAAY,MAAM;AAChD,KAAI;EACA,IAAM,IAAc,EAAM,MAAM,IAAI;AACpC,MAAI,EAAY,WAAW,EACvB,QAAO;EACX,IAAM,CAAC,KAAU;AACjB,MAAI,CAAC,EACD,QAAO;EAEX,IAAM,IAAe,KAAK,MAAM,KAAK,EAAO,CAAC;AAO7C,SAFA,EAJI,SAAS,KAAgB,GAAc,QAAQ,SAE/C,CAAC,EAAa,OAEd,MAAc,EAAE,SAAS,MAAiB,EAAa,QAAQ;SAIjE;AACF,SAAO;;;AAGf,IAAa,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAE7E,CADA,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAK,KAAK,SAAS,MAAY;AACvBA,KAAW,EAAQ,OAAO,EAAI,IAAI,IAEtC,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN,QAAQ;GACR,OAAO,EAAQ;GACf;GACA,UAAU,CAAC,EAAI;GAClB,CAAC;;EAER,EAeW,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAGnF,CAFA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,UAAU,EAAK,KAAK,IAAI,WAAWC,IAC7C,EAAK,KAAK,SAAS,GAAS,MAAS;AACjC,MAAI,EAAI,OACJ,KAAI;AACA,KAAQ,QAAQ,OAAO,EAAQ,MAAM;UAE/B;EACd,IAAM,IAAQ,EAAQ;AACtB,MAAI,OAAO,KAAU,YAAY,CAAC,OAAO,MAAM,EAAM,IAAI,OAAO,SAAS,EAAM,CAC3E,QAAO;EAEX,IAAM,IAAW,OAAO,KAAU,WAC5B,OAAO,MAAM,EAAM,GACf,QACC,OAAO,SAAS,EAAM,GAEnB,KAAA,IADA,aAER,KAAA;AAQN,SAPA,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN;GACA;GACA,GAAI,IAAW,EAAE,aAAU,GAAG,EAAE;GACnC,CAAC,EACK;;EAEb,EACW,KAAiC,kBAAkB,qBAAqB,GAAM,MAAQ;AAE/F,CADA,GAA6B,KAAK,GAAM,EAAI,EAC5C,GAAW,KAAK,GAAM,EAAI;EAC5B,EACW,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAGrF,CAFA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,UAAUC,IACpB,EAAK,KAAK,SAAS,GAAS,MAAS;AACjC,MAAI,EAAI,OACJ,KAAI;AACA,KAAQ,QAAQ,EAAQ,EAAQ;UAE1B;EACd,IAAM,IAAQ,EAAQ;AAStB,SARI,OAAO,KAAU,aAErB,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN;GACA;GACH,CAAC,EANS;;EASjB,EA2DW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAI/E,CAHA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,UAAUC,IACpB,EAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,EAClC,EAAK,KAAK,SAAS,GAAS,MAAS;EACjC,IAAM,IAAQ,EAAQ;AAStB,SARI,MAAU,QAEd,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN;GACA;GACH,CAAC,EANS;;EASjB,EAKW,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAErF,CADA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,SAAS,MAAY;EACjC,EACW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,SAAS,GAAS,OACxB,EAAQ,OAAO,KAAK;EAChB,UAAU;EACV,MAAM;EACN,OAAO,EAAQ;EACf;EACH,CAAC,EACK;EAEb;AAwCF,SAAS,GAAkB,GAAQ,GAAO,GAAO;AAI7C,CAHI,EAAO,OAAO,UACd,EAAM,OAAO,KAAK,GAAGC,GAAkB,GAAO,EAAO,OAAO,CAAC,EAEjE,EAAM,MAAM,KAAS,EAAO;;AAEhC,IAAa,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,SAAS,GAAS,MAAQ;EAChC,IAAM,IAAQ,EAAQ;AACtB,MAAI,CAAC,MAAM,QAAQ,EAAM,CAOrB,QANA,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN;GACA;GACH,CAAC,EACK;AAEX,IAAQ,QAAQ,MAAM,EAAM,OAAO;EACnC,IAAM,IAAQ,EAAE;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;GACnC,IAAM,IAAO,EAAM,IACb,IAAS,EAAI,QAAQ,KAAK,IAAI;IAChC,OAAO;IACP,QAAQ,EAAE;IACb,EAAE,EAAI;AACP,GAAI,aAAkB,UAClB,EAAM,KAAK,EAAO,MAAM,MAAW,GAAkB,GAAQ,GAAS,EAAE,CAAC,CAAC,GAG1E,GAAkB,GAAQ,GAAS,EAAE;;AAM7C,SAHI,EAAM,SACC,QAAQ,IAAI,EAAM,CAAC,WAAW,EAAQ,GAE1C;;EAEb;AACF,SAAS,GAAqB,GAAQ,GAAO,GAAK,GAAO,GAAe;AACpE,KAAI,EAAO,OAAO,QAAQ;AAEtB,MAAI,KAAiB,EAAE,KAAO,GAC1B;AAEJ,IAAM,OAAO,KAAK,GAAGA,GAAkB,GAAK,EAAO,OAAO,CAAC;;AAE/D,CAAI,EAAO,UAAU,KAAA,IACb,KAAO,MACP,EAAM,MAAM,KAAO,KAAA,KAIvB,EAAM,MAAM,KAAO,EAAO;;AAGlC,SAAS,GAAa,GAAK;CACvB,IAAM,IAAO,OAAO,KAAK,EAAI,MAAM;AACnC,MAAK,IAAM,KAAK,EACZ,KAAI,CAAC,EAAI,QAAQ,IAAI,MAAM,QAAQ,IAAI,WAAW,CAC9C,OAAU,MAAM,2BAA2B,EAAE,0BAA0B;CAG/E,IAAM,IAAQC,GAAkB,EAAI,MAAM;AAC1C,QAAO;EACH,GAAG;EACH;EACA,QAAQ,IAAI,IAAI,EAAK;EACrB,SAAS,EAAK;EACd,cAAc,IAAI,IAAI,EAAM;EAC/B;;AAEL,SAAS,GAAe,GAAO,GAAO,GAAS,GAAK,GAAK,GAAM;CAC3D,IAAM,IAAe,EAAE,EAEjB,IAAS,EAAI,QACb,IAAY,EAAI,SAAS,MACzB,IAAI,EAAU,IAAI,MAClB,IAAgB,EAAU,WAAW;AAC3C,MAAK,IAAM,KAAO,GAAO;AACrB,MAAI,EAAO,IAAI,EAAI,CACf;AACJ,MAAI,MAAM,SAAS;AACf,KAAa,KAAK,EAAI;AACtB;;EAEJ,IAAM,IAAI,EAAU,IAAI;GAAE,OAAO,EAAM;GAAM,QAAQ,EAAE;GAAE,EAAE,EAAI;AAC/D,EAAI,aAAa,UACb,EAAM,KAAK,EAAE,MAAM,MAAM,GAAqB,GAAG,GAAS,GAAK,GAAO,EAAc,CAAC,CAAC,GAGtF,GAAqB,GAAG,GAAS,GAAK,GAAO,EAAc;;AAanE,QAVI,EAAa,UACb,EAAQ,OAAO,KAAK;EAChB,MAAM;EACN,MAAM;EACN;EACA;EACH,CAAC,EAED,EAAM,SAEJ,QAAQ,IAAI,EAAM,CAAC,WACf,EACT,GAHS;;AAKf,IAAa,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAKnF,KAHA,EAAS,KAAK,GAAM,EAAI,EAGpB,CADS,OAAO,yBAAyB,GAAK,QAAQ,EAC/C,KAAK;EACZ,IAAM,IAAK,EAAI;AACf,SAAO,eAAe,GAAK,SAAS,EAChC,WAAW;GACP,IAAM,IAAQ,EAAE,GAAG,GAAI;AAIvB,UAHA,OAAO,eAAe,GAAK,SAAS,EAChC,OAAO,GACV,CAAC,EACK;KAEd,CAAC;;CAEN,IAAM,IAAcC,SAAkB,GAAa,EAAI,CAAC;AACxD,GAAgB,EAAK,MAAM,oBAAoB;EAC3C,IAAM,IAAQ,EAAI,OACZ,IAAa,EAAE;AACrB,OAAK,IAAM,KAAO,GAAO;GACrB,IAAM,IAAQ,EAAM,GAAK;AACzB,OAAI,EAAM,QAAQ;AACd,MAAW,OAAS,EAAW,qBAAO,IAAI,KAAK;AAC/C,SAAK,IAAM,KAAK,EAAM,OAClB,GAAW,GAAK,IAAI,EAAE;;;AAGlC,SAAO;GACT;CACF,IAAMC,IAAWC,IACX,IAAW,EAAI,UACjB;AACJ,GAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,EAAU,MAAQ,EAAY;EAC9B,IAAM,IAAQ,EAAQ;AACtB,MAAI,CAACD,EAAS,EAAM,CAOhB,QANA,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN;GACA;GACH,CAAC,EACK;AAEX,IAAQ,QAAQ,EAAE;EAClB,IAAM,IAAQ,EAAE,EACV,IAAQ,EAAM;AACpB,OAAK,IAAM,KAAO,EAAM,MAAM;GAC1B,IAAM,IAAK,EAAM,IACX,IAAgB,EAAG,KAAK,WAAW,YACnC,IAAI,EAAG,KAAK,IAAI;IAAE,OAAO,EAAM;IAAM,QAAQ,EAAE;IAAE,EAAE,EAAI;AAC7D,GAAI,aAAa,UACb,EAAM,KAAK,EAAE,MAAM,MAAM,GAAqB,GAAG,GAAS,GAAK,GAAO,EAAc,CAAC,CAAC,GAGtF,GAAqB,GAAG,GAAS,GAAK,GAAO,EAAc;;AAMnE,SAHK,IAGE,GAAe,GAAO,GAAO,GAAS,GAAK,EAAY,OAAO,EAAK,GAF/D,EAAM,SAAS,QAAQ,IAAI,EAAM,CAAC,WAAW,EAAQ,GAAG;;EAIzE,EACW,KAA8B,kBAAkB,kBAAkB,GAAM,MAAQ;AAEzF,IAAW,KAAK,GAAM,EAAI;CAC1B,IAAM,IAAa,EAAK,KAAK,OACvB,IAAcD,SAAkB,GAAa,EAAI,CAAC,EAClD,KAAoB,MAAU;EAChC,IAAM,IAAM,IAAI,GAAI;GAAC;GAAS;GAAW;GAAM,CAAC,EAC1C,IAAa,EAAY,OACzB,KAAY,MAAQ;GACtB,IAAM,IAAIG,GAAS,EAAI;AACvB,UAAO,SAAS,EAAE,4BAA4B,EAAE;;AAEpD,IAAI,MAAM,+BAA+B;EACzC,IAAM,IAAM,OAAO,OAAO,KAAK,EAC3B,IAAU;AACd,OAAK,IAAM,KAAO,EAAW,KACzB,GAAI,KAAO,OAAO;AAGtB,IAAI,MAAM,wBAAwB;AAClC,OAAK,IAAM,KAAO,EAAW,MAAM;GAC/B,IAAM,IAAK,EAAI,IACT,IAAIA,GAAS,EAAI,EAEjB,IADS,EAAM,IACS,MAAM,WAAW;AAE/C,GADA,EAAI,MAAM,SAAS,EAAG,KAAK,EAAS,EAAI,CAAC,GAAG,EACxC,IAEA,EAAI,MAAM;cACZ,EAAG;gBACD,EAAE;qDACmC,EAAG;;kCAEtB,EAAE,oBAAoB,EAAE;;;;;cAK5C,EAAG;gBACD,EAAE;wBACM,EAAE;;;sBAGJ,EAAE,MAAM,EAAG;;;QAGzB,GAGQ,EAAI,MAAM;cACZ,EAAG;mDACkC,EAAG;;gCAEtB,EAAE,oBAAoB,EAAE;;;;cAI1C,EAAG;gBACD,EAAE;wBACM,EAAE;;;sBAGJ,EAAE,MAAM,EAAG;;;QAGzB;;AAIA,EADA,EAAI,MAAM,6BAA6B,EACvC,EAAI,MAAM,kBAAkB;EAC5B,IAAM,IAAK,EAAI,SAAS;AACxB,UAAQ,GAAS,MAAQ,EAAG,GAAO,GAAS,EAAI;IAEhD,GACEF,IAAWC,IACX,IAAM,CAAA,GAAmB,SAEzB,IAAc,KADDG,GACmB,OAChC,IAAW,EAAI,UACjB;AACJ,GAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,EAAU,MAAQ,EAAY;EAC9B,IAAM,IAAQ,EAAQ;AAmBtB,SAlBKJ,EAAS,EAAM,GAShB,KAAO,KAAe,GAAK,UAAU,MAAS,EAAI,YAAY,MAE9D,AACI,MAAW,EAAiB,EAAI,MAAM,EAC1C,IAAU,EAAS,GAAS,EAAI,EAC3B,IAEE,GAAe,EAAE,EAAE,GAAO,GAAS,GAAK,GAAO,EAAK,GADhD,KAGR,EAAW,GAAS,EAAI,IAjB3B,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN;GACA;GACH,CAAC,EACK;;EAajB;AACF,SAAS,GAAmB,GAAS,GAAO,GAAM,GAAK;AACnD,MAAK,IAAM,KAAU,EACjB,KAAI,EAAO,OAAO,WAAW,EAEzB,QADA,EAAM,QAAQ,EAAO,OACd;CAGf,IAAM,IAAa,EAAQ,QAAQ,MAAM,CAACjC,GAAa,EAAE,CAAC;AAW1D,QAVI,EAAW,WAAW,KACtB,EAAM,QAAQ,EAAW,GAAG,OACrB,EAAW,OAEtB,EAAM,OAAO,KAAK;EACd,MAAM;EACN,OAAO,EAAM;EACb;EACA,QAAQ,EAAQ,KAAK,MAAW,EAAO,OAAO,KAAK,MAAQsC,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC,CAAC;EAC3G,CAAC,EACK;;AAEX,IAAa,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAUjF,CATA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAgB,EAAK,MAAM,eAAe,EAAI,QAAQ,MAAM,MAAM,EAAE,KAAK,UAAU,WAAW,GAAG,aAAa,KAAA,EAAU,EACxH,EAAgB,EAAK,MAAM,gBAAgB,EAAI,QAAQ,MAAM,MAAM,EAAE,KAAK,WAAW,WAAW,GAAG,aAAa,KAAA,EAAU,EAC1H,EAAgB,EAAK,MAAM,gBAAgB;AACvC,MAAI,EAAI,QAAQ,OAAO,MAAM,EAAE,KAAK,OAAO,CACvC,QAAO,IAAI,IAAI,EAAI,QAAQ,SAAS,MAAW,MAAM,KAAK,EAAO,KAAK,OAAO,CAAC,CAAC;GAGrF,EACF,EAAgB,EAAK,MAAM,iBAAiB;AACxC,MAAI,EAAI,QAAQ,OAAO,MAAM,EAAE,KAAK,QAAQ,EAAE;GAC1C,IAAM,IAAW,EAAI,QAAQ,KAAK,MAAM,EAAE,KAAK,QAAQ;AACvD,UAAW,OAAO,KAAK,EAAS,KAAK,MAAMC,GAAgB,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI;;GAG1F;CACF,IAAM,IAAS,EAAI,QAAQ,WAAW,GAChC,IAAQ,EAAI,QAAQ,GAAG,KAAK;AAClC,GAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,MAAI,EACA,QAAO,EAAM,GAAS,EAAI;EAE9B,IAAI,IAAQ,IACN,IAAU,EAAE;AAClB,OAAK,IAAM,KAAU,EAAI,SAAS;GAC9B,IAAM,IAAS,EAAO,KAAK,IAAI;IAC3B,OAAO,EAAQ;IACf,QAAQ,EAAE;IACb,EAAE,EAAI;AACP,OAAI,aAAkB,QAElB,CADA,EAAQ,KAAK,EAAO,EACpB,IAAQ;QAEP;AACD,QAAI,EAAO,OAAO,WAAW,EACzB,QAAO;AACX,MAAQ,KAAK,EAAO;;;AAK5B,SAFK,IAEE,QAAQ,IAAI,EAAQ,CAAC,MAAM,MACvB,GAAmB,GAAS,GAAS,GAAM,EAAI,CACxD,GAHS,GAAmB,GAAS,GAAS,GAAM,EAAI;;EAKhE,EA2DW,KAEb,kBAAkB,2BAA2B,GAAM,MAAQ;AAEvD,CADA,EAAI,YAAY,IAChB,GAAU,KAAK,GAAM,EAAI;CACzB,IAAM,IAAS,EAAK,KAAK;AACzB,GAAgB,EAAK,MAAM,oBAAoB;EAC3C,IAAM,IAAa,EAAE;AACrB,OAAK,IAAM,KAAU,EAAI,SAAS;GAC9B,IAAM,IAAK,EAAO,KAAK;AACvB,OAAI,CAAC,KAAM,OAAO,KAAK,EAAG,CAAC,WAAW,EAClC,OAAU,MAAM,gDAAgD,EAAI,QAAQ,QAAQ,EAAO,CAAC,GAAG;AACnG,QAAK,IAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,EAAG,EAAE;AACrC,IAAK,EAAW,OACZ,EAAW,qBAAK,IAAI,KAAK;AAC7B,SAAK,IAAM,KAAO,EACd,GAAW,GAAG,IAAI,EAAI;;;AAIlC,SAAO;GACT;CACF,IAAM,IAAOR,SAAkB;EAC3B,IAAM,IAAO,EAAI,SACX,oBAAM,IAAI,KAAK;AACrB,OAAK,IAAM,KAAK,GAAM;GAClB,IAAM,IAAS,EAAE,KAAK,aAAa,EAAI;AACvC,OAAI,CAAC,KAAU,EAAO,SAAS,EAC3B,OAAU,MAAM,gDAAgD,EAAI,QAAQ,QAAQ,EAAE,CAAC,GAAG;AAC9F,QAAK,IAAM,KAAK,GAAQ;AACpB,QAAI,EAAI,IAAI,EAAE,CACV,OAAU,MAAM,kCAAkC,OAAO,EAAE,CAAC,GAAG;AAEnE,MAAI,IAAI,GAAG,EAAE;;;AAGrB,SAAO;GACT;AACF,GAAK,KAAK,SAAS,GAAS,MAAQ;EAChC,IAAM,IAAQ,EAAQ;AACtB,MAAI,CAACE,GAAc,EAAM,CAOrB,QANA,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN,UAAU;GACV;GACA;GACH,CAAC,EACK;EAEX,IAAM,IAAM,EAAK,MAAM,IAAI,IAAQ,EAAI,eAAe;AAiBtD,SAhBI,IACO,EAAI,KAAK,IAAI,GAAS,EAAI,GAEjC,EAAI,gBACG,EAAO,GAAS,EAAI,IAG/B,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN,QAAQ,EAAE;GACV,MAAM;GACN,eAAe,EAAI;GACnB;GACA,MAAM,CAAC,EAAI,cAAc;GACzB;GACH,CAAC,EACK;;EAEb,EACW,KAAiC,kBAAkB,qBAAqB,GAAM,MAAQ;AAE/F,CADA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,SAAS,GAAS,MAAQ;EAChC,IAAM,IAAQ,EAAQ,OAChB,IAAO,EAAI,KAAK,KAAK,IAAI;GAAE,OAAO;GAAO,QAAQ,EAAE;GAAE,EAAE,EAAI,EAC3D,IAAQ,EAAI,MAAM,KAAK,IAAI;GAAE,OAAO;GAAO,QAAQ,EAAE;GAAE,EAAE,EAAI;AAOnE,SANc,aAAgB,WAAW,aAAiB,UAE/C,QAAQ,IAAI,CAAC,GAAM,EAAM,CAAC,CAAC,MAAM,CAAC,GAAM,OACpC,GAA0B,GAAS,GAAM,EAAM,CACxD,GAEC,GAA0B,GAAS,GAAM,EAAM;;EAE5D;AACF,SAASO,GAAY,GAAG,GAAG;AAMvB,KAHI,MAAM,KAGN,aAAa,QAAQ,aAAa,QAAQ,CAAC,KAAM,CAAC,EAClD,QAAO;EAAE,OAAO;EAAM,MAAM;EAAG;AAEnC,KAAIC,GAAmB,EAAE,IAAIA,GAAmB,EAAE,EAAE;EAChD,IAAM,IAAQ,OAAO,KAAK,EAAE,EACtB,IAAa,OAAO,KAAK,EAAE,CAAC,QAAQ,MAAQ,EAAM,QAAQ,EAAI,KAAK,GAAG,EACtE,IAAS;GAAE,GAAG;GAAG,GAAG;GAAG;AAC7B,OAAK,IAAM,KAAO,GAAY;GAC1B,IAAM,IAAcD,GAAY,EAAE,IAAM,EAAE,GAAK;AAC/C,OAAI,CAAC,EAAY,MACb,QAAO;IACH,OAAO;IACP,gBAAgB,CAAC,GAAK,GAAG,EAAY,eAAe;IACvD;AAEL,KAAO,KAAO,EAAY;;AAE9B,SAAO;GAAE,OAAO;GAAM,MAAM;GAAQ;;AAExC,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACtC,MAAI,EAAE,WAAW,EAAE,OACf,QAAO;GAAE,OAAO;GAAO,gBAAgB,EAAE;GAAE;EAE/C,IAAM,IAAW,EAAE;AACnB,OAAK,IAAI,IAAQ,GAAG,IAAQ,EAAE,QAAQ,KAAS;GAC3C,IAAM,IAAQ,EAAE,IACV,IAAQ,EAAE,IACV,IAAcA,GAAY,GAAO,EAAM;AAC7C,OAAI,CAAC,EAAY,MACb,QAAO;IACH,OAAO;IACP,gBAAgB,CAAC,GAAO,GAAG,EAAY,eAAe;IACzD;AAEL,KAAS,KAAK,EAAY,KAAK;;AAEnC,SAAO;GAAE,OAAO;GAAM,MAAM;GAAU;;AAE1C,QAAO;EAAE,OAAO;EAAO,gBAAgB,EAAE;EAAE;;AAE/C,SAAS,GAA0B,GAAQ,GAAM,GAAO;CAEpD,IAAM,oBAAY,IAAI,KAAK,EACvB;AACJ,MAAK,IAAM,KAAO,EAAK,OACnB,KAAI,EAAI,SAAS,qBAAqB;AAClC,EAAe,MAAa;AAC5B,OAAK,IAAM,KAAK,EAAI,KAGhB,CAFK,EAAU,IAAI,EAAE,IACjB,EAAU,IAAI,GAAG,EAAE,CAAC,EACxB,EAAU,IAAI,EAAE,CAAC,IAAI;OAIzB,GAAO,OAAO,KAAK,EAAI;AAG/B,MAAK,IAAM,KAAO,EAAM,OACpB,KAAI,EAAI,SAAS,oBACb,MAAK,IAAM,KAAK,EAAI,KAGhB,CAFK,EAAU,IAAI,EAAE,IACjB,EAAU,IAAI,GAAG,EAAE,CAAC,EACxB,EAAU,IAAI,EAAE,CAAC,IAAI;KAIzB,GAAO,OAAO,KAAK,EAAI;CAI/B,IAAM,IAAW,CAAC,GAAG,EAAU,CAAC,QAAQ,GAAG,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;AAI7E,KAHI,EAAS,UAAU,KACnB,EAAO,OAAO,KAAK;EAAE,GAAG;EAAY,MAAM;EAAU,CAAC,EAErDzC,GAAa,EAAO,CACpB,QAAO;CACX,IAAM,IAASyC,GAAY,EAAK,OAAO,EAAM,MAAM;AACnD,KAAI,CAAC,EAAO,MACR,OAAU,MAAM,wCAA6C,KAAK,UAAU,EAAO,eAAe,GAAG;AAGzG,QADA,EAAO,QAAQ,EAAO,MACf;;AA+EX,IAAa,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAEnF,CADA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,SAAS,GAAS,MAAQ;EAChC,IAAM,IAAQ,EAAQ;AACtB,MAAI,CAACC,GAAmB,EAAM,CAO1B,QANA,EAAQ,OAAO,KAAK;GAChB,UAAU;GACV,MAAM;GACN;GACA;GACH,CAAC,EACK;EAEX,IAAM,IAAQ,EAAE,EACV,IAAS,EAAI,QAAQ,KAAK;AAChC,MAAI,GAAQ;AACR,KAAQ,QAAQ,EAAE;GAClB,IAAM,oBAAa,IAAI,KAAK;AAC5B,QAAK,IAAM,KAAO,EACd,KAAI,OAAO,KAAQ,YAAY,OAAO,KAAQ,YAAY,OAAO,KAAQ,UAAU;AAC/E,MAAW,IAAI,OAAO,KAAQ,WAAW,EAAI,UAAU,GAAG,EAAI;IAC9D,IAAM,IAAS,EAAI,UAAU,KAAK,IAAI;KAAE,OAAO,EAAM;KAAM,QAAQ,EAAE;KAAE,EAAE,EAAI;AAC7E,IAAI,aAAkB,UAClB,EAAM,KAAK,EAAO,MAAM,MAAW;AAI/B,KAHI,EAAO,OAAO,UACd,EAAQ,OAAO,KAAK,GAAGZ,GAAkB,GAAK,EAAO,OAAO,CAAC,EAEjE,EAAQ,MAAM,KAAO,EAAO;MAC9B,CAAC,IAGC,EAAO,OAAO,UACd,EAAQ,OAAO,KAAK,GAAGA,GAAkB,GAAK,EAAO,OAAO,CAAC,EAEjE,EAAQ,MAAM,KAAO,EAAO;;GAIxC,IAAI;AACJ,QAAK,IAAM,KAAO,EACd,CAAK,EAAW,IAAI,EAAI,KACpB,MAA+B,EAAE,EACjC,EAAa,KAAK,EAAI;AAG9B,GAAI,KAAgB,EAAa,SAAS,KACtC,EAAQ,OAAO,KAAK;IAChB,MAAM;IACN;IACA;IACA,MAAM;IACT,CAAC;SAGL;AACD,KAAQ,QAAQ,EAAE;AAClB,QAAK,IAAM,KAAO,QAAQ,QAAQ,EAAM,EAAE;AACtC,QAAI,MAAQ,YACR;IACJ,IAAI,IAAY,EAAI,QAAQ,KAAK,IAAI;KAAE,OAAO;KAAK,QAAQ,EAAE;KAAE,EAAE,EAAI;AACrE,QAAI,aAAqB,QACrB,OAAU,MAAM,uDAAuD;AAK3E,QADwB,OAAO,KAAQ,YAAA,GAA2B,KAAK,EAAI,IAAI,EAAU,OAAO,QAC3E;KACjB,IAAM,IAAc,EAAI,QAAQ,KAAK,IAAI;MAAE,OAAO,OAAO,EAAI;MAAE,QAAQ,EAAE;MAAE,EAAE,EAAI;AACjF,SAAI,aAAuB,QACvB,OAAU,MAAM,uDAAuD;AAE3E,KAAI,EAAY,OAAO,WAAW,MAC9B,IAAY;;AAGpB,QAAI,EAAU,OAAO,QAAQ;AACzB,KAAI,EAAI,SAAS,UAEb,EAAQ,MAAM,KAAO,EAAM,KAI3B,EAAQ,OAAO,KAAK;MAChB,MAAM;MACN,QAAQ;MACR,QAAQ,EAAU,OAAO,KAAK,MAAQQ,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC;MAClF,OAAO;MACP,MAAM,CAAC,EAAI;MACX;MACH,CAAC;AAEN;;IAEJ,IAAM,IAAS,EAAI,UAAU,KAAK,IAAI;KAAE,OAAO,EAAM;KAAM,QAAQ,EAAE;KAAE,EAAE,EAAI;AAC7E,IAAI,aAAkB,UAClB,EAAM,KAAK,EAAO,MAAM,MAAW;AAI/B,KAHI,EAAO,OAAO,UACd,EAAQ,OAAO,KAAK,GAAGT,GAAkB,GAAK,EAAO,OAAO,CAAC,EAEjE,EAAQ,MAAM,EAAU,SAAS,EAAO;MAC1C,CAAC,IAGC,EAAO,OAAO,UACd,EAAQ,OAAO,KAAK,GAAGA,GAAkB,GAAK,EAAO,OAAO,CAAC,EAEjE,EAAQ,MAAM,EAAU,SAAS,EAAO;;;AAOpD,SAHI,EAAM,SACC,QAAQ,IAAI,EAAM,CAAC,WAAW,EAAQ,GAE1C;;EAEb,EAmGW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAC/E,GAAS,KAAK,GAAM,EAAI;CACxB,IAAM,IAASa,GAAmB,EAAI,QAAQ,EACxC,IAAY,IAAI,IAAI,EAAO;AAMjC,CALA,EAAK,KAAK,SAAS,GACnB,EAAK,KAAK,UAAc,OAAO,KAAK,EAC/B,QAAQ,MAAA,GAA4B,IAAI,OAAO,EAAE,CAAC,CAClD,KAAK,MAAO,OAAO,KAAM,WAAWC,GAAiB,EAAE,GAAG,EAAE,UAAU,CAAE,CACxE,KAAK,IAAI,CAAC,IAAI,EACnB,EAAK,KAAK,SAAS,GAAS,MAAS;EACjC,IAAM,IAAQ,EAAQ;AAUtB,SATI,EAAU,IAAI,EAAM,IAGxB,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN;GACA;GACA;GACH,CAAC,EAPS;;EAUjB,EACW,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAErF,KADA,EAAS,KAAK,GAAM,EAAI,EACpB,EAAI,OAAO,WAAW,EACtB,OAAU,MAAM,oDAAoD;CAExE,IAAM,IAAS,IAAI,IAAI,EAAI,OAAO;AAKlC,CAJA,EAAK,KAAK,SAAS,GACnB,EAAK,KAAK,UAAc,OAAO,KAAK,EAAI,OACnC,KAAK,MAAO,OAAO,KAAM,WAAWA,GAAiB,EAAE,GAAG,IAAIA,GAAiB,EAAE,UAAU,CAAC,GAAG,OAAO,EAAE,CAAE,CAC1G,KAAK,IAAI,CAAC,IAAI,EACnB,EAAK,KAAK,SAAS,GAAS,MAAS;EACjC,IAAM,IAAQ,EAAQ;AAUtB,SATI,EAAO,IAAI,EAAM,IAGrB,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN,QAAQ,EAAI;GACZ;GACA;GACH,CAAC,EAPS;;EAUjB,EAiBW,KAA8B,kBAAkB,kBAAkB,GAAM,MAAQ;AAEzF,CADA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,MAAI,EAAI,cAAc,WAClB,OAAM,IAAIC,GAAqB,EAAK,YAAY,KAAK;EAEzD,IAAM,IAAO,EAAI,UAAU,EAAQ,OAAO,EAAQ;AAClD,MAAI,EAAI,MAEJ,SADe,aAAgB,UAAU,IAAO,QAAQ,QAAQ,EAAK,EACvD,MAAM,OAChB,EAAQ,QAAQ,GACT,GACT;AAEN,MAAI,aAAgB,QAChB,OAAM,IAAI5C,IAAqB;AAGnC,SADA,EAAQ,QAAQ,GACT;;EAEb;AACF,SAAS,GAAqB,GAAQ,GAAO;AAIzC,QAHI,EAAO,OAAO,UAAU,MAAU,KAAA,IAC3B;EAAE,QAAQ,EAAE;EAAE,OAAO,KAAA;EAAW,GAEpC;;AAEX,IAAa,KAA6B,kBAAkB,iBAAiB,GAAM,MAAQ;AAWvF,CAVA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,QAAQ,YAClB,EAAK,KAAK,SAAS,YACnB,EAAgB,EAAK,MAAM,gBAChB,EAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAI,UAAU,KAAK,QAAQ,KAAA,EAAU,CAAC,GAAG,KAAA,EAC1F,EACF,EAAgB,EAAK,MAAM,iBAAiB;EACxC,IAAM,IAAU,EAAI,UAAU,KAAK;AACnC,SAAO,IAAc,OAAO,KAAKuC,GAAgB,EAAQ,OAAO,CAAC,KAAK,GAAG,KAAA;GAC3E,EACF,EAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,MAAI,EAAI,UAAU,KAAK,UAAU,YAAY;GACzC,IAAM,IAAS,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;AAGnD,UAFI,aAAkB,UACX,EAAO,MAAM,MAAM,GAAqB,GAAG,EAAQ,MAAM,CAAC,GAC9D,GAAqB,GAAQ,EAAQ,MAAM;;AAKtD,SAHI,EAAQ,UAAU,KAAA,IACX,IAEJ,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;;EAEjD,EACW,KAAkC,kBAAkB,sBAAsB,GAAM,MAAQ;AAOjG,CALA,GAAa,KAAK,GAAM,EAAI,EAE5B,EAAgB,EAAK,MAAM,gBAAgB,EAAI,UAAU,KAAK,OAAO,EACrE,EAAgB,EAAK,MAAM,iBAAiB,EAAI,UAAU,KAAK,QAAQ,EAEvE,EAAK,KAAK,SAAS,GAAS,MACjB,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;EAEjD,EACW,KAA6B,kBAAkB,iBAAiB,GAAM,MAAQ;AAWvF,CAVA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAgB,EAAK,MAAM,eAAe,EAAI,UAAU,KAAK,MAAM,EACnE,EAAgB,EAAK,MAAM,gBAAgB,EAAI,UAAU,KAAK,OAAO,EACrE,EAAgB,EAAK,MAAM,iBAAiB;EACxC,IAAM,IAAU,EAAI,UAAU,KAAK;AACnC,SAAO,IAAc,OAAO,KAAKA,GAAgB,EAAQ,OAAO,CAAC,SAAS,GAAG,KAAA;GAC/E,EACF,EAAgB,EAAK,MAAM,gBAChB,EAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAI,UAAU,KAAK,QAAQ,KAAK,CAAC,GAAG,KAAA,EACrF,EACF,EAAK,KAAK,SAAS,GAAS,MAEpB,EAAQ,UAAU,OACX,IACJ,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;EAEjD,EACW,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAKrF,CAJA,EAAS,KAAK,GAAM,EAAI,EAExB,EAAK,KAAK,QAAQ,YAClB,EAAgB,EAAK,MAAM,gBAAgB,EAAI,UAAU,KAAK,OAAO,EACrE,EAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,MAAI,EAAI,cAAc,WAClB,QAAO,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;AAG/C,MAAI,EAAQ,UAAU,KAAA,EAKlB,QAJA,EAAQ,QAAQ,EAAI,cAIb;EAGX,IAAM,IAAS,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;AAInD,SAHI,aAAkB,UACX,EAAO,MAAM,MAAW,GAAoB,GAAQ,EAAI,CAAC,GAE7D,GAAoB,GAAQ,EAAI;;EAE7C;AACF,SAAS,GAAoB,GAAS,GAAK;AAIvC,QAHI,EAAQ,UAAU,KAAA,MAClB,EAAQ,QAAQ,EAAI,eAEjB;;AAEX,IAAa,KAA6B,kBAAkB,iBAAiB,GAAM,MAAQ;AAIvF,CAHA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,QAAQ,YAClB,EAAgB,EAAK,MAAM,gBAAgB,EAAI,UAAU,KAAK,OAAO,EACrE,EAAK,KAAK,SAAS,GAAS,OACpB,EAAI,cAAc,cAIlB,EAAQ,UAAU,KAAA,MAClB,EAAQ,QAAQ,EAAI,eAJb,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;EAQrD,EACW,KAAgC,kBAAkB,oBAAoB,GAAM,MAAQ;AAM7F,CALA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAgB,EAAK,MAAM,gBAAgB;EACvC,IAAM,IAAI,EAAI,UAAU,KAAK;AAC7B,SAAO,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,MAAM,MAAM,KAAA,EAAU,CAAC,GAAG,KAAA;GAC9D,EACF,EAAK,KAAK,SAAS,GAAS,MAAQ;EAChC,IAAM,IAAS,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;AAInD,SAHI,aAAkB,UACX,EAAO,MAAM,MAAW,GAAwB,GAAQ,EAAK,CAAC,GAElE,GAAwB,GAAQ,EAAK;;EAElD;AACF,SAAS,GAAwB,GAAS,GAAM;AAS5C,QARI,CAAC,EAAQ,OAAO,UAAU,EAAQ,UAAU,KAAA,KAC5C,EAAQ,OAAO,KAAK;EAChB,MAAM;EACN,UAAU;EACV,OAAO,EAAQ;EACf;EACH,CAAC,EAEC;;AAmBX,IAAa,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAKjF,CAJA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAgB,EAAK,MAAM,eAAe,EAAI,UAAU,KAAK,MAAM,EACnE,EAAgB,EAAK,MAAM,gBAAgB,EAAI,UAAU,KAAK,OAAO,EACrE,EAAgB,EAAK,MAAM,gBAAgB,EAAI,UAAU,KAAK,OAAO,EACrE,EAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,MAAI,EAAI,cAAc,WAClB,QAAO,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;EAG/C,IAAM,IAAS,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;AA4BnD,SA3BI,aAAkB,UACX,EAAO,MAAM,OAChB,EAAQ,QAAQ,EAAO,OACnB,EAAO,OAAO,WACd,EAAQ,QAAQ,EAAI,WAAW;GAC3B,GAAG;GACH,OAAO,EACH,QAAQ,EAAO,OAAO,KAAK,MAAQF,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC,EAClF;GACD,OAAO,EAAQ;GAClB,CAAC,EACF,EAAQ,SAAS,EAAE,GAEhB,GACT,IAEN,EAAQ,QAAQ,EAAO,OACnB,EAAO,OAAO,WACd,EAAQ,QAAQ,EAAI,WAAW;GAC3B,GAAG;GACH,OAAO,EACH,QAAQ,EAAO,OAAO,KAAK,MAAQD,GAAmB,GAAK,GAAKC,IAAa,CAAC,CAAC,EAClF;GACD,OAAO,EAAQ;GAClB,CAAC,EACF,EAAQ,SAAS,EAAE,GAEhB;;EAEb,EAgBW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAM/E,CALA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAgB,EAAK,MAAM,gBAAgB,EAAI,GAAG,KAAK,OAAO,EAC9D,EAAgB,EAAK,MAAM,eAAe,EAAI,GAAG,KAAK,MAAM,EAC5D,EAAgB,EAAK,MAAM,gBAAgB,EAAI,IAAI,KAAK,OAAO,EAC/D,EAAgB,EAAK,MAAM,oBAAoB,EAAI,GAAG,KAAK,WAAW,EACtE,EAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,MAAI,EAAI,cAAc,YAAY;GAC9B,IAAM,IAAQ,EAAI,IAAI,KAAK,IAAI,GAAS,EAAI;AAI5C,UAHI,aAAiB,UACV,EAAM,MAAM,MAAU,GAAiB,GAAO,EAAI,IAAI,EAAI,CAAC,GAE/D,GAAiB,GAAO,EAAI,IAAI,EAAI;;EAE/C,IAAM,IAAO,EAAI,GAAG,KAAK,IAAI,GAAS,EAAI;AAI1C,SAHI,aAAgB,UACT,EAAK,MAAM,MAAS,GAAiB,GAAM,EAAI,KAAK,EAAI,CAAC,GAE7D,GAAiB,GAAM,EAAI,KAAK,EAAI;;EAEjD;AACF,SAAS,GAAiB,GAAM,GAAM,GAAK;AAMvC,QALI,EAAK,OAAO,UAEZ,EAAK,UAAU,IACR,KAEJ,EAAK,KAAK,IAAI;EAAE,OAAO,EAAK;EAAO,QAAQ,EAAK;EAAQ,EAAE,EAAI;;AAwDzE,IAAa,KAA6B,kBAAkB,iBAAiB,GAAM,MAAQ;AAMvF,CALA,EAAS,KAAK,GAAM,EAAI,EACxB,EAAgB,EAAK,MAAM,oBAAoB,EAAI,UAAU,KAAK,WAAW,EAC7E,EAAgB,EAAK,MAAM,gBAAgB,EAAI,UAAU,KAAK,OAAO,EACrE,EAAgB,EAAK,MAAM,eAAe,EAAI,WAAW,MAAM,MAAM,EACrE,EAAgB,EAAK,MAAM,gBAAgB,EAAI,WAAW,MAAM,OAAO,EACvE,EAAK,KAAK,SAAS,GAAS,MAAQ;AAChC,MAAI,EAAI,cAAc,WAClB,QAAO,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;EAE/C,IAAM,IAAS,EAAI,UAAU,KAAK,IAAI,GAAS,EAAI;AAInD,SAHI,aAAkB,UACX,EAAO,KAAK,GAAqB,GAErC,GAAqB,EAAO;;EAEzC;AACF,SAAS,GAAqB,GAAS;AAEnC,QADA,EAAQ,QAAQ,OAAO,OAAO,EAAQ,MAAM,EACrC;;AAwIX,IAAa,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAc/E,CAbA,EAAS,KAAK,GAAM,EAAI,EAQxB,EAAgB,EAAK,MAAM,mBAAmB,EAAI,QAAQ,CAAC,EAC3D,EAAgB,EAAK,MAAM,iBAAiB,EAAK,KAAK,WAAW,MAAM,QAAQ,EAC/E,EAAgB,EAAK,MAAM,oBAAoB,EAAK,KAAK,WAAW,MAAM,WAAW,EACrF,EAAgB,EAAK,MAAM,eAAe,EAAK,KAAK,WAAW,MAAM,SAAS,KAAA,EAAU,EACxF,EAAgB,EAAK,MAAM,gBAAgB,EAAK,KAAK,WAAW,MAAM,UAAU,KAAA,EAAU,EAC1F,EAAK,KAAK,SAAS,GAAS,MACV,EAAK,KAAK,UACX,KAAK,IAAI,GAAS,EAAI;EAEzC,EACW,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAMnF,CALA,EAAiB,KAAK,GAAM,EAAI,EAChC,EAAS,KAAK,GAAM,EAAI,EACxB,EAAK,KAAK,SAAS,GAAS,MACjB,GAEX,EAAK,KAAK,SAAS,MAAY;EAC3B,IAAM,IAAQ,EAAQ,OAChB,IAAI,EAAI,GAAG,EAAM;AACvB,MAAI,aAAa,QACb,QAAO,EAAE,MAAM,MAAM,GAAmB,GAAG,GAAS,GAAO,EAAK,CAAC;AAErE,KAAmB,GAAG,GAAS,GAAO,EAAK;;EAGjD;AACF,SAAS,GAAmB,GAAQ,GAAS,GAAO,GAAM;AACtD,KAAI,CAAC,GAAQ;EACT,IAAM,IAAO;GACT,MAAM;GACN;GACA;GACA,MAAM,CAAC,GAAI,EAAK,KAAK,IAAI,QAAQ,EAAE,CAAE;GACrC,UAAU,CAAC,EAAK,KAAK,IAAI;GAE5B;AAGD,EAFI,EAAK,KAAK,IAAI,WACd,EAAK,SAAS,EAAK,KAAK,IAAI,SAChC,EAAQ,OAAO,KAAKO,GAAW,EAAK,CAAC;;;;;AC1iE7C,IAAIC,IAGS,KAAb,MAA0B;CACtB,cAAc;AAEV,EADA,KAAK,uBAAO,IAAI,SAAS,EACzB,KAAK,yBAAS,IAAI,KAAK;;CAE3B,IAAI,GAAQ,GAAG,GAAO;EAClB,IAAM,IAAO,EAAM;AAKnB,SAJA,KAAK,KAAK,IAAI,GAAQ,EAAK,EACvB,KAAQ,OAAO,KAAS,YAAY,QAAQ,KAC5C,KAAK,OAAO,IAAI,EAAK,IAAI,EAAO,EAE7B;;CAEX,QAAQ;AAGJ,SAFA,KAAK,uBAAO,IAAI,SAAS,EACzB,KAAK,yBAAS,IAAI,KAAK,EAChB;;CAEX,OAAO,GAAQ;EACX,IAAM,IAAO,KAAK,KAAK,IAAI,EAAO;AAKlC,SAJI,KAAQ,OAAO,KAAS,YAAY,QAAQ,KAC5C,KAAK,OAAO,OAAO,EAAK,GAAG,EAE/B,KAAK,KAAK,OAAO,EAAO,EACjB;;CAEX,IAAI,GAAQ;EAGR,IAAM,IAAI,EAAO,KAAK;AACtB,MAAI,GAAG;GACH,IAAM,IAAK,EAAE,GAAI,KAAK,IAAI,EAAE,IAAI,EAAE,EAAG;AACrC,UAAO,EAAG;GACV,IAAM,IAAI;IAAE,GAAG;IAAI,GAAG,KAAK,KAAK,IAAI,EAAO;IAAE;AAC7C,UAAO,OAAO,KAAK,EAAE,CAAC,SAAS,IAAI,KAAA;;AAEvC,SAAO,KAAK,KAAK,IAAI,EAAO;;CAEhC,IAAI,GAAQ;AACR,SAAO,KAAK,KAAK,IAAI,EAAO;;;AAIpC,SAAgB,KAAW;AACvB,QAAO,IAAI,IAAc;;CAE5B,KAAK,YAAY,yBAAyB,GAAG,uBAAuB,IAAU;AAC/E,IAAa,KAAiB,WAAW;;;;AC7CzC,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,GAAGC,EAAqB,EAAO;EAClC,CAAC;;;AAWN,SAAgB,GAAO,GAAO,GAAQ;AAClC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,SAAS;EACT,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,SAAS;EACT,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,SAAS;EACT,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAK,GAAO,GAAQ;AAChC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAO,GAAO,GAAQ;AAClC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAO,GAAO,GAAQ;AAClC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAK,GAAO,GAAQ;AAChC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAO,GAAO,GAAQ;AAClC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAaN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAW,GAAO,GAAQ;AACtC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAK,GAAO,GAAQ;AAChC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAUN,SAAgB,GAAa,GAAO,GAAQ;AACxC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,OAAO;EACP,WAAW;EACX,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAS,GAAO,GAAQ;AACpC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAS,GAAO,GAAQ;AACpC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,WAAW;EACX,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAa,GAAO,GAAQ;AACxC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAQ,GAAO,GAAQ;AACnC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,QAAQ,EAAE;EACV,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAYN,SAAgB,GAAK,GAAO,GAAQ;AAChC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,OAAO;EACP,OAAO;EACP,QAAQ;EACR,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AA2CN,SAAgB,GAAS,GAAO,GAAQ;AACpC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AA4DN,SAAgBC,GAAM,GAAO,GAAQ;AACjC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,GAAGD,EAAqB,EAAO;EAClC,CAAC;;;AASN,SAAgB,GAAS,GAAO;AAC5B,QAAO,IAAI,EAAM,EACb,MAAM,WACT,CAAC;;;AAGN,SAAgB,GAAO,GAAO,GAAQ;AAClC,QAAO,IAAI,EAAM;EACb,MAAM;EACN,GAAGA,EAAqB,EAAO;EAClC,CAAC;;;AAgCN,SAAgB,GAAI,GAAO,GAAQ;AAC/B,QAAO,IAAIE,GAAyB;EAChC,OAAO;EACP,GAAGF,EAAqB,EAAO;EAC/B;EACA,WAAW;EACd,CAAC;;;AAGN,SAAgB,GAAK,GAAO,GAAQ;AAChC,QAAO,IAAIE,GAAyB;EAChC,OAAO;EACP,GAAGF,EAAqB,EAAO;EAC/B;EACA,WAAW;EACd,CAAC;;;AAMN,SAAgB,GAAI,GAAO,GAAQ;AAC/B,QAAO,IAAIG,GAA4B;EACnC,OAAO;EACP,GAAGH,EAAqB,EAAO;EAC/B;EACA,WAAW;EACd,CAAC;;;AAGN,SAAgB,GAAK,GAAO,GAAQ;AAChC,QAAO,IAAIG,GAA4B;EACnC,OAAO;EACP,GAAGH,EAAqB,EAAO;EAC/B;EACA,WAAW;EACd,CAAC;;;AAyBN,SAAgB,GAAY,GAAO,GAAQ;AACvC,QAAO,IAAII,GAA2B;EAClC,OAAO;EACP,GAAGJ,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AA2BN,SAAgB,GAAW,GAAS,GAAQ;AAMxC,QALW,IAAIK,GAA0B;EACrC,OAAO;EACP,GAAGL,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AAIN,SAAgB,GAAW,GAAS,GAAQ;AACxC,QAAO,IAAIM,GAA0B;EACjC,OAAO;EACP,GAAGN,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AAGN,SAAgB,GAAQ,GAAQ,GAAQ;AACpC,QAAO,IAAIO,GAA6B;EACpC,OAAO;EACP,GAAGP,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AAGN,SAAgB,GAAO,GAAS,GAAQ;AACpC,QAAO,IAAIQ,GAAsB;EAC7B,OAAO;EACP,QAAQ;EACR,GAAGR,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AAGN,SAAgB,GAAW,GAAQ;AAC/B,QAAO,IAAIS,GAA0B;EACjC,OAAO;EACP,QAAQ;EACR,GAAGT,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAW,GAAQ;AAC/B,QAAO,IAAIU,GAA0B;EACjC,OAAO;EACP,QAAQ;EACR,GAAGV,EAAqB,EAAO;EAClC,CAAC;;;AAGN,SAAgB,GAAU,GAAU,GAAQ;AACxC,QAAO,IAAIW,GAAyB;EAChC,OAAO;EACP,QAAQ;EACR,GAAGX,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AAGN,SAAgB,GAAY,GAAQ,GAAQ;AACxC,QAAO,IAAIY,GAA2B;EAClC,OAAO;EACP,QAAQ;EACR,GAAGZ,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AAGN,SAAgB,GAAU,GAAQ,GAAQ;AACtC,QAAO,IAAIa,GAAyB;EAChC,OAAO;EACP,QAAQ;EACR,GAAGb,EAAqB,EAAO;EAC/B;EACH,CAAC;;;AAoBN,SAAgB,GAAW,GAAI;AAC3B,QAAO,IAAIc,GAA0B;EACjC,OAAO;EACP;EACH,CAAC;;;AAIN,SAAgB,GAAW,GAAM;AAC7B,QAAO,oBAAY,MAAU,EAAM,UAAU,EAAK,CAAC;;;AAIvD,SAAgB,KAAQ;AACpB,QAAO,oBAAY,MAAU,EAAM,MAAM,CAAC;;;AAI9C,SAAgB,KAAe;AAC3B,QAAO,oBAAY,MAAU,EAAM,aAAa,CAAC;;;AAIrD,SAAgB,KAAe;AAC3B,QAAO,oBAAY,MAAU,EAAM,aAAa,CAAC;;;AAIrD,SAAgB,KAAW;AACvB,QAAO,oBAAY,MAAUC,GAAa,EAAM,CAAC;;;AAGrD,SAAgB,GAAO,GAAO,GAAS,GAAQ;AAC3C,QAAO,IAAI,EAAM;EACb,MAAM;EACN;EAIA,GAAGf,EAAqB,EAAO;EAClC,CAAC;;;AA4NN,SAAgB,GAAQ,GAAO,GAAI,GAAS;CACxC,IAAM,IAAOA,EAAqB,EAAQ;AAQ1C,QAPA,AAAe,EAAK,UAAQ,IACb,IAAI,EAAM;EACrB,MAAM;EACN,OAAO;EACH;EACJ,GAAG;EACN,CAAC;;;AAKN,SAAgB,GAAQ,GAAO,GAAI,GAAS;AAOxC,QANe,IAAI,EAAM;EACrB,MAAM;EACN,OAAO;EACH;EACJ,GAAGA,EAAqB,EAAQ;EACnC,CAAC;;;AAIN,SAAgB,GAAa,GAAI;CAC7B,IAAM,IAAK,oBAAQ,OACf,EAAQ,YAAY,MAAU;AAC1B,MAAI,OAAOgB,KAAU,SACjB,GAAQ,OAAO,KAAKC,GAAWD,GAAO,EAAQ,OAAO,EAAG,KAAK,IAAI,CAAC;OAEjE;GAED,IAAM,IAASA;AAOf,GANI,EAAO,UACP,EAAO,WAAW,KACtB,AAAgB,EAAO,SAAO,UAC9B,AAAiB,EAAO,UAAQ,EAAQ,OACxC,AAAgB,EAAO,SAAO,GAC9B,AAAoB,EAAO,aAAW,CAAC,EAAG,KAAK,IAAI,OACnD,EAAQ,OAAO,KAAKC,GAAW,EAAO,CAAC;;IAGxC,EAAG,EAAQ,OAAO,EAAQ,EACnC;AACF,QAAO;;;AAGX,SAAgB,GAAO,GAAI,GAAQ;CAC/B,IAAM,IAAK,IAAIC,EAAiB;EAC5B,OAAO;EACP,GAAGlB,EAAqB,EAAO;EAClC,CAAC;AAEF,QADA,EAAG,KAAK,QAAQ,GACT;;;;ACh9BX,SAAgB,GAAkB,GAAQ;CAEtC,IAAI,IAAS,GAAQ,UAAU;AAK/B,QAJI,MAAW,cACX,IAAS,aACT,MAAW,cACX,IAAS,aACN;EACH,YAAY,EAAO,cAAc,EAAE;EACnC,kBAAkB,GAAQ,YAAY;EACtC;EACA,iBAAiB,GAAQ,mBAAmB;EAC5C,UAAU,GAAQ,mBAAmB;EACrC,IAAI,GAAQ,MAAM;EAClB,SAAS;EACT,sBAAM,IAAI,KAAK;EACf,QAAQ,GAAQ,UAAU;EAC1B,QAAQ,GAAQ,UAAU;EAC1B,UAAU,GAAQ,YAAY,KAAA;EACjC;;AAEL,SAAgBqB,EAAQ,GAAQ,GAAK,IAAU;CAAE,MAAM,EAAE;CAAE,YAAY,EAAE;CAAE,EAAE;CACzE,IAAI;CACJ,IAAM,IAAM,EAAO,KAAK,KAElB,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,KAAI,EAOA,QANA,EAAK,SAEW,EAAQ,WAAW,SAAS,EAAO,KAE/C,EAAK,QAAQ,EAAQ,OAElB,EAAK;CAGhB,IAAM,IAAS;EAAE,QAAQ,EAAE;EAAE,OAAO;EAAG,OAAO,KAAA;EAAW,MAAM,EAAQ;EAAM;AAC7E,GAAI,KAAK,IAAI,GAAQ,EAAO;CAE5B,IAAM,IAAiB,EAAO,KAAK,gBAAgB;AACnD,KAAI,EACA,GAAO,SAAS;MAEf;EACD,IAAM,IAAS;GACX,GAAG;GACH,YAAY,CAAC,GAAG,EAAQ,YAAY,EAAO;GAC3C,MAAM,EAAQ;GACjB;AACD,MAAI,EAAO,KAAK,kBACZ,GAAO,KAAK,kBAAkB,GAAK,EAAO,QAAQ,EAAO;OAExD;GACD,IAAM,IAAQ,EAAO,QACf,IAAY,EAAI,WAAW,EAAI;AACrC,OAAI,CAAC,EACD,OAAU,MAAM,uDAAuD,EAAI,OAAO;AAEtF,KAAU,GAAQ,GAAK,GAAO,EAAO;;EAEzC,IAAM,IAAS,EAAO,KAAK;AAC3B,EAAI,MAEA,AACI,EAAO,QAAM,GACjB,EAAQ,GAAQ,GAAK,EAAO,EAC5B,EAAI,KAAK,IAAI,EAAO,CAAC,WAAW;;CAIxC,IAAM,IAAO,EAAI,iBAAiB,IAAI,EAAO;AAc7C,QAbI,KACA,OAAO,OAAO,EAAO,QAAQ,EAAK,EAClC,EAAI,OAAO,WAAW,EAAe,EAAO,KAE5C,OAAO,EAAO,OAAO,UACrB,OAAO,EAAO,OAAO,UAGrB,EAAI,OAAO,WAAW,EAAO,OAAO,eACnC,IAAK,EAAO,QAAQ,YAAY,EAAG,UAAU,EAAO,OAAO,aAChE,OAAO,EAAO,OAAO,WAEL,EAAI,KAAK,IAAI,EAAO,CACrB;;AAEnB,SAAgB,GAAY,GAAK,GAE/B;CAEE,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,KAAI,CAAC,EACD,OAAU,MAAM,4CAA4C;CAEhE,IAAM,oBAAa,IAAI,KAAK;AAC5B,MAAK,IAAM,KAAS,EAAI,KAAK,SAAS,EAAE;EACpC,IAAM,IAAK,EAAI,iBAAiB,IAAI,EAAM,GAAG,EAAE;AAC/C,MAAI,GAAI;GACJ,IAAM,IAAW,EAAW,IAAI,EAAG;AACnC,OAAI,KAAY,MAAa,EAAM,GAC/B,OAAU,MAAM,wBAAwB,EAAG,mHAAmH;AAElK,KAAW,IAAI,GAAI,EAAM,GAAG;;;CAKpC,IAAM,KAAW,MAAU;EAKvB,IAAM,IAAc,EAAI,WAAW,kBAAkB,UAAU;AAC/D,MAAI,EAAI,UAAU;GACd,IAAM,IAAa,EAAI,SAAS,SAAS,IAAI,EAAM,GAAG,EAAE,IAElD,IAAe,EAAI,SAAS,SAAS,MAAO;AAClD,OAAI,EACA,QAAO,EAAE,KAAK,EAAa,EAAW,EAAE;GAG5C,IAAM,IAAK,EAAM,GAAG,SAAS,EAAM,GAAG,OAAO,MAAM,SAAS,EAAI;AAEhE,UADA,EAAM,GAAG,QAAQ,GACV;IAAE,OAAO;IAAI,KAAK,GAAG,EAAa,WAAW,CAAC,IAAI,EAAY,GAAG;IAAM;;AAElF,MAAI,EAAM,OAAO,EACb,QAAO,EAAE,KAAK,KAAK;EAIvB,IAAM,IAAe,KAAgB,EAAY,IAC3C,IAAQ,EAAM,GAAG,OAAO,MAAM,WAAW,EAAI;AACnD,SAAO;GAAE;GAAO,KAAK,IAAe;GAAO;IAIzC,KAAgB,MAAU;AAE5B,MAAI,EAAM,GAAG,OAAO,KAChB;EAEJ,IAAM,IAAO,EAAM,IACb,EAAE,QAAK,aAAU,EAAQ,EAAM;AAIrC,EAHA,EAAK,MAAM,EAAE,GAAG,EAAK,QAAQ,EAGzB,MACA,EAAK,QAAQ;EAEjB,IAAM,IAAS,EAAK;AACpB,OAAK,IAAM,KAAO,EACd,QAAO,EAAO;AAElB,IAAO,OAAO;;AAIlB,KAAI,EAAI,WAAW,QACf,MAAK,IAAM,KAAS,EAAI,KAAK,SAAS,EAAE;EACpC,IAAM,IAAO,EAAM;AACnB,MAAI,EAAK,MACL,OAAU,MAAM,qBACP,EAAK,OAAO,KAAK,IAAI,CAAC;;kFACwD;;AAKnG,MAAK,IAAM,KAAS,EAAI,KAAK,SAAS,EAAE;EACpC,IAAM,IAAO,EAAM;AAEnB,MAAI,MAAW,EAAM,IAAI;AACrB,KAAa,EAAM;AACnB;;AAGJ,MAAI,EAAI,UAAU;GACd,IAAM,IAAM,EAAI,SAAS,SAAS,IAAI,EAAM,GAAG,EAAE;AACjD,OAAI,MAAW,EAAM,MAAM,GAAK;AAC5B,MAAa,EAAM;AACnB;;;AAKR,MADW,EAAI,iBAAiB,IAAI,EAAM,GAAG,EAAE,IACvC;AACJ,KAAa,EAAM;AACnB;;AAGJ,MAAI,EAAK,OAAO;AAEZ,KAAa,EAAM;AACnB;;AAGJ,MAAI,EAAK,QAAQ,KACT,EAAI,WAAW,OAAO;AACtB,KAAa,EAAM;AAEnB;;;;AAKhB,SAAgB,GAAS,GAAK,GAAQ;CAClC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,KAAI,CAAC,EACD,OAAU,MAAM,4CAA4C;CAEhE,IAAM,KAAc,MAAc;EAC9B,IAAM,IAAO,EAAI,KAAK,IAAI,EAAU;AAEpC,MAAI,EAAK,QAAQ,KACb;EACJ,IAAM,IAAS,EAAK,OAAO,EAAK,QAC1B,IAAU,EAAE,GAAG,GAAQ,EACvB,IAAM,EAAK;AAEjB,MADA,EAAK,MAAM,MACP,GAAK;AACL,KAAW,EAAI;GACf,IAAM,IAAU,EAAI,KAAK,IAAI,EAAI,EAC3B,IAAY,EAAQ;AAc1B,OAZI,EAAU,SAAS,EAAI,WAAW,cAAc,EAAI,WAAW,cAAc,EAAI,WAAW,kBAE5F,EAAO,QAAQ,EAAO,SAAS,EAAE,EACjC,EAAO,MAAM,KAAK,EAAU,IAG5B,OAAO,OAAO,GAAQ,EAAU,EAGpC,OAAO,OAAO,GAAQ,EAAQ,EACV,EAAU,KAAK,WAAW,EAG1C,MAAK,IAAM,KAAO,EACV,OAAQ,UAAU,MAAQ,WAExB,KAAO,KACT,OAAO,EAAO;AAK1B,OAAI,EAAU,QAAQ,EAAQ,IAC1B,MAAK,IAAM,KAAO,EACV,OAAQ,UAAU,MAAQ,WAE1B,KAAO,EAAQ,OAAO,KAAK,UAAU,EAAO,GAAK,KAAK,KAAK,UAAU,EAAQ,IAAI,GAAK,IACtF,OAAO,EAAO;;EAQ9B,IAAM,IAAS,EAAU,KAAK;AAC9B,MAAI,KAAU,MAAW,GAAK;AAE1B,KAAW,EAAO;GAClB,IAAM,IAAa,EAAI,KAAK,IAAI,EAAO;AACvC,OAAI,GAAY,OAAO,SACnB,EAAO,OAAO,EAAW,OAAO,MAE5B,EAAW,KACX,MAAK,IAAM,KAAO,EACV,OAAQ,UAAU,MAAQ,WAE1B,KAAO,EAAW,OAAO,KAAK,UAAU,EAAO,GAAK,KAAK,KAAK,UAAU,EAAW,IAAI,GAAK,IAC5F,OAAO,EAAO;;AAOlC,IAAI,SAAS;GACE;GACX,YAAY;GACZ,MAAM,EAAK,QAAQ,EAAE;GACxB,CAAC;;AAEN,MAAK,IAAM,KAAS,CAAC,GAAG,EAAI,KAAK,SAAS,CAAC,CAAC,SAAS,CACjD,GAAW,EAAM,GAAG;CAExB,IAAM,IAAS,EAAE;AAgBjB,KAfI,EAAI,WAAW,kBACf,EAAO,UAAU,iDAEZ,EAAI,WAAW,aACpB,EAAO,UAAU,4CAEZ,EAAI,WAAW,aACpB,EAAO,UAAU,4CAEZ,EAAI,QAMT,EAAI,UAAU,KAAK;EACnB,IAAM,IAAK,EAAI,SAAS,SAAS,IAAI,EAAO,EAAE;AAC9C,MAAI,CAAC,EACD,OAAU,MAAM,qCAAqC;AACzD,IAAO,MAAM,EAAI,SAAS,IAAI,EAAG;;AAErC,QAAO,OAAO,GAAQ,EAAK,OAAO,EAAK,OAAO;CAE9C,IAAM,IAAO,EAAI,UAAU,QAAQ,EAAE;AACrC,MAAK,IAAM,KAAS,EAAI,KAAK,SAAS,EAAE;EACpC,IAAM,IAAO,EAAM;AACnB,EAAI,EAAK,OAAO,EAAK,UACjB,EAAK,EAAK,SAAS,EAAK;;AAIhC,CAAI,EAAI,YAGA,OAAO,KAAK,EAAK,CAAC,SAAS,MACvB,EAAI,WAAW,kBACf,EAAO,QAAQ,IAGf,EAAO,cAAc;AAIjC,KAAI;EAIA,IAAM,IAAY,KAAK,MAAM,KAAK,UAAU,EAAO,CAAC;AAYpD,SAXA,OAAO,eAAe,GAAW,aAAa;GAC1C,OAAO;IACH,GAAG,EAAO;IACV,YAAY;KACR,OAAO,GAA+B,GAAQ,SAAS,EAAI,WAAW;KACtE,QAAQ,GAA+B,GAAQ,UAAU,EAAI,WAAW;KAC3E;IACJ;GACD,YAAY;GACZ,UAAU;GACb,CAAC,EACK;SAEE;AACT,QAAU,MAAM,mCAAmC;;;AAG3D,SAAS,EAAe,GAAS,GAAM;CACnC,IAAM,IAAM,KAAQ,EAAE,sBAAM,IAAI,KAAK,EAAE;AACvC,KAAI,EAAI,KAAK,IAAI,EAAQ,CACrB,QAAO;AACX,GAAI,KAAK,IAAI,EAAQ;CACrB,IAAM,IAAM,EAAQ,KAAK;AACzB,KAAI,EAAI,SAAS,YACb,QAAO;AACX,KAAI,EAAI,SAAS,QACb,QAAO,EAAe,EAAI,SAAS,EAAI;AAC3C,KAAI,EAAI,SAAS,MACb,QAAO,EAAe,EAAI,WAAW,EAAI;AAC7C,KAAI,EAAI,SAAS,OACb,QAAO,EAAe,EAAI,QAAQ,EAAE,EAAI;AAC5C,KAAI,EAAI,SAAS,aACb,EAAI,SAAS,cACb,EAAI,SAAS,iBACb,EAAI,SAAS,cACb,EAAI,SAAS,cACb,EAAI,SAAS,aACb,EAAI,SAAS,WACb,QAAO,EAAe,EAAI,WAAW,EAAI;AAE7C,KAAI,EAAI,SAAS,eACb,QAAO,EAAe,EAAI,MAAM,EAAI,IAAI,EAAe,EAAI,OAAO,EAAI;AAE1E,KAAI,EAAI,SAAS,YAAY,EAAI,SAAS,MACtC,QAAO,EAAe,EAAI,SAAS,EAAI,IAAI,EAAe,EAAI,WAAW,EAAI;AAEjF,KAAI,EAAI,SAAS,OACb,QAAO,EAAe,EAAI,IAAI,EAAI,IAAI,EAAe,EAAI,KAAK,EAAI;AAEtE,KAAI,EAAI,SAAS,UAAU;AACvB,OAAK,IAAM,KAAO,EAAI,MAClB,KAAI,EAAe,EAAI,MAAM,IAAM,EAAI,CACnC,QAAO;AAEf,SAAO;;AAEX,KAAI,EAAI,SAAS,SAAS;AACtB,OAAK,IAAM,KAAU,EAAI,QACrB,KAAI,EAAe,GAAQ,EAAI,CAC3B,QAAO;AAEf,SAAO;;AAEX,KAAI,EAAI,SAAS,SAAS;AACtB,OAAK,IAAM,KAAQ,EAAI,MACnB,KAAI,EAAe,GAAM,EAAI,CACzB,QAAO;AAIf,SAFA,GAAI,EAAI,QAAQ,EAAe,EAAI,MAAM,EAAI;;AAIjD,QAAO;;AAMX,IAAa,MAA4B,GAAQ,IAAa,EAAE,MAAM,MAAW;CAC7E,IAAM,IAAM,GAAkB;EAAE,GAAG;EAAQ;EAAY,CAAC;AAGxD,QAFA,EAAQ,GAAQ,EAAI,EACpB,GAAY,GAAK,EAAO,EACjB,GAAS,GAAK,EAAO;GAEnB,MAAkC,GAAQ,GAAI,IAAa,EAAE,MAAM,MAAW;CACvF,IAAM,EAAE,mBAAgB,cAAW,KAAU,EAAE,EACzC,IAAM,GAAkB;EAAE,GAAI,KAAkB,EAAE;EAAG;EAAQ;EAAI;EAAY,CAAC;AAGpF,QAFA,EAAQ,GAAQ,EAAI,EACpB,GAAY,GAAK,EAAO,EACjB,GAAS,GAAK,EAAO;GCjb1B,KAAY;CACd,MAAM;CACN,KAAK;CACL,UAAU;CACV,aAAa;CACb,OAAO;CACV,EAEY,MAAmB,GAAQ,GAAK,GAAO,MAAY;CAC5D,IAAM,IAAO;AACb,GAAK,OAAO;CACZ,IAAM,EAAE,YAAS,YAAS,WAAQ,aAAU,uBAAoB,EAAO,KAClE;AAkBL,KAjBI,OAAO,KAAY,aACnB,EAAK,YAAY,IACjB,OAAO,KAAY,aACnB,EAAK,YAAY,IAEjB,MACA,EAAK,SAAS,GAAU,MAAW,GAC/B,EAAK,WAAW,MAChB,OAAO,EAAK,QAGZ,MAAW,UACX,OAAO,EAAK,SAGhB,MACA,EAAK,kBAAkB,IACvB,KAAY,EAAS,OAAO,GAAG;EAC/B,IAAM,IAAU,CAAC,GAAG,EAAS;AAC7B,EAAI,EAAQ,WAAW,IACnB,EAAK,UAAU,EAAQ,GAAG,SACrB,EAAQ,SAAS,MACtB,EAAK,QAAQ,CACT,GAAG,EAAQ,KAAK,OAAW;GACvB,GAAI,EAAI,WAAW,cAAc,EAAI,WAAW,cAAc,EAAI,WAAW,gBACvE,EAAE,MAAM,UAAU,GAClB,EAAE;GACR,SAAS,EAAM;GAClB,EAAE,CACN;;GAIA,MAAmB,GAAQ,GAAK,GAAO,MAAY;CAC5D,IAAM,IAAO,GACP,EAAE,YAAS,YAAS,WAAQ,eAAY,qBAAkB,wBAAqB,EAAO,KAAK;AAyCjG,CAxCI,OAAO,KAAW,YAAY,EAAO,SAAS,MAAM,GACpD,EAAK,OAAO,YAEZ,EAAK,OAAO,UACZ,OAAO,KAAqB,aACxB,EAAI,WAAW,cAAc,EAAI,WAAW,iBAC5C,EAAK,UAAU,GACf,EAAK,mBAAmB,MAGxB,EAAK,mBAAmB,IAG5B,OAAO,KAAY,aACnB,EAAK,UAAU,GACX,OAAO,KAAqB,YAAY,EAAI,WAAW,eACnD,KAAoB,IACpB,OAAO,EAAK,UAEZ,OAAO,EAAK,oBAGpB,OAAO,KAAqB,aACxB,EAAI,WAAW,cAAc,EAAI,WAAW,iBAC5C,EAAK,UAAU,GACf,EAAK,mBAAmB,MAGxB,EAAK,mBAAmB,IAG5B,OAAO,KAAY,aACnB,EAAK,UAAU,GACX,OAAO,KAAqB,YAAY,EAAI,WAAW,eACnD,KAAoB,IACpB,OAAO,EAAK,UAEZ,OAAO,EAAK,oBAGpB,OAAO,KAAe,aACtB,EAAK,aAAa;GAEb,MAAoB,GAAS,GAAM,GAAM,MAAY;AAC9D,GAAK,OAAO;GAEH,MAAmB,GAAS,GAAK,GAAO,MAAY;AAC7D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,8CAA8C;GAGzD,MAAmB,GAAS,GAAK,GAAO,MAAY;AAC7D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,+CAA+C;GAG1D,MAAiB,GAAS,GAAK,GAAM,MAAY;AAC1D,CAAI,EAAI,WAAW,iBACf,EAAK,OAAO,UACZ,EAAK,WAAW,IAChB,EAAK,OAAO,CAAC,KAAK,IAGlB,EAAK,OAAO;GAGP,MAAsB,GAAS,GAAK,GAAO,MAAY;AAChE,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,iDAAiD;GAG5D,MAAiB,GAAS,GAAK,GAAO,MAAY;AAC3D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,4CAA4C;GAGvD,MAAkB,GAAS,GAAM,GAAM,MAAY;AAC5D,GAAK,MAAM,EAAE;GAEJ,MAAgB,GAAS,GAAM,GAAO,MAAY,IAGlD,MAAoB,GAAS,GAAM,GAAO,MAAY,IAGtD,MAAiB,GAAS,GAAK,GAAO,MAAY;AAC3D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,4CAA4C;GAGvD,MAAiB,GAAQ,GAAM,GAAM,MAAY;CAC1D,IAAM,IAAM,EAAO,KAAK,KAClB,IAAS,GAAc,EAAI,QAAQ;AAMzC,CAJI,EAAO,OAAO,MAAM,OAAO,KAAM,SAAS,KAC1C,EAAK,OAAO,WACZ,EAAO,OAAO,MAAM,OAAO,KAAM,SAAS,KAC1C,EAAK,OAAO,WAChB,EAAK,OAAO;GAEH,MAAoB,GAAQ,GAAK,GAAM,MAAY;CAC5D,IAAM,IAAM,EAAO,KAAK,KAClB,IAAO,EAAE;AACf,MAAK,IAAM,KAAO,EAAI,OAClB,KAAI,MAAQ,KAAA;MACJ,EAAI,oBAAoB,QACxB,OAAU,MAAM,2DAA2D;YAM1E,OAAO,KAAQ,UACpB;MAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,uDAAuD;AAGvE,IAAK,KAAK,OAAO,EAAI,CAAC;OAI1B,GAAK,KAAK,EAAI;AAGtB,KAAI,EAAK,WAAW,EAAG,KAGd,EAAK,WAAW,GAAG;EACxB,IAAM,IAAM,EAAK;AAEjB,EADA,EAAK,OAAO,MAAQ,OAAO,SAAS,OAAO,GACvC,EAAI,WAAW,cAAc,EAAI,WAAW,gBAC5C,EAAK,OAAO,CAAC,EAAI,GAGjB,EAAK,QAAQ;OAYjB,CARI,EAAK,OAAO,MAAM,OAAO,KAAM,SAAS,KACxC,EAAK,OAAO,WACZ,EAAK,OAAO,MAAM,OAAO,KAAM,SAAS,KACxC,EAAK,OAAO,WACZ,EAAK,OAAO,MAAM,OAAO,KAAM,UAAU,KACzC,EAAK,OAAO,YACZ,EAAK,OAAO,MAAM,MAAM,KAAK,KAC7B,EAAK,OAAO,SAChB,EAAK,OAAO;GAGP,MAAgB,GAAS,GAAK,GAAO,MAAY;AAC1D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,2CAA2C;GAGtD,MAA4B,GAAQ,GAAM,GAAM,MAAY;CACrE,IAAM,IAAQ,GACR,IAAU,EAAO,KAAK;AAC5B,KAAI,CAAC,EACD,OAAU,MAAM,wCAAwC;AAE5D,CADA,EAAM,OAAO,UACb,EAAM,UAAU,EAAQ;GAEf,MAAiB,GAAQ,GAAM,GAAM,MAAY;CAC1D,IAAM,IAAQ,GACR,IAAO;EACT,MAAM;EACN,QAAQ;EACR,iBAAiB;EACpB,EACK,EAAE,YAAS,YAAS,YAAS,EAAO,KAAK;AAK/C,CAJI,MAAY,KAAA,MACZ,EAAK,YAAY,IACjB,MAAY,KAAA,MACZ,EAAK,YAAY,IACjB,IACI,EAAK,WAAW,KAChB,EAAK,mBAAmB,EAAK,IAC7B,OAAO,OAAO,GAAO,EAAK,KAG1B,OAAO,OAAO,GAAO,EAAK,EAC1B,EAAM,QAAQ,EAAK,KAAK,OAAO,EAAE,kBAAkB,GAAG,EAAE,IAI5D,OAAO,OAAO,GAAO,EAAK;GAGrB,MAAoB,GAAS,GAAM,GAAM,MAAY;AAC9D,GAAK,OAAO;GAEH,MAAmB,GAAS,GAAK,GAAO,MAAY;AAC7D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,oDAAoD;GAG/D,MAAqB,GAAS,GAAK,GAAO,MAAY;AAC/D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,sDAAsD;GAGjE,MAAsB,GAAS,GAAK,GAAO,MAAY;AAChE,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,kDAAkD;GAG7D,MAAgB,GAAS,GAAK,GAAO,MAAY;AAC1D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,2CAA2C;GAGtD,MAAgB,GAAS,GAAK,GAAO,MAAY;AAC1D,KAAI,EAAI,oBAAoB,QACxB,OAAU,MAAM,2CAA2C;GAItD,MAAkB,GAAQ,GAAK,GAAO,MAAW;CAC1D,IAAM,IAAO,GACP,IAAM,EAAO,KAAK,KAClB,EAAE,YAAS,eAAY,EAAO,KAAK;AAMzC,CALI,OAAO,KAAY,aACnB,EAAK,WAAW,IAChB,OAAO,KAAY,aACnB,EAAK,WAAW,IACpB,EAAK,OAAO,SACZ,EAAK,QAAQC,EAAQ,EAAI,SAAS,GAAK;EAAE,GAAG;EAAQ,MAAM,CAAC,GAAG,EAAO,MAAM,QAAQ;EAAE,CAAC;GAE7E,MAAmB,GAAQ,GAAK,GAAO,MAAW;CAC3D,IAAM,IAAO,GACP,IAAM,EAAO,KAAK;AAExB,CADA,EAAK,OAAO,UACZ,EAAK,aAAa,EAAE;CACpB,IAAM,IAAQ,EAAI;AAClB,MAAK,IAAM,KAAO,EACd,GAAK,WAAW,KAAOA,EAAQ,EAAM,IAAM,GAAK;EAC5C,GAAG;EACH,MAAM;GAAC,GAAG,EAAO;GAAM;GAAc;GAAI;EAC5C,CAAC;CAGN,IAAM,IAAU,IAAI,IAAI,OAAO,KAAK,EAAM,CAAC,EACrC,IAAe,IAAI,IAAI,CAAC,GAAG,EAAQ,CAAC,QAAQ,MAAQ;EACtD,IAAM,IAAI,EAAI,MAAM,GAAK;AAKrB,SAJA,EAAI,OAAO,UACJ,EAAE,UAAU,KAAA,IAGZ,EAAE,WAAW,KAAA;GAE1B,CAAC;AAKH,CAJI,EAAa,OAAO,MACpB,EAAK,WAAW,MAAM,KAAK,EAAa,GAGxC,EAAI,UAAU,KAAK,IAAI,SAAS,UAEhC,EAAK,uBAAuB,KAEtB,EAAI,WAKL,EAAI,aACT,EAAK,uBAAuBA,EAAQ,EAAI,UAAU,GAAK;EACnD,GAAG;EACH,MAAM,CAAC,GAAG,EAAO,MAAM,uBAAuB;EACjD,CAAC,IAPE,EAAI,OAAO,aACX,EAAK,uBAAuB;GAS3B,MAAkB,GAAQ,GAAK,GAAM,MAAW;CACzD,IAAM,IAAM,EAAO,KAAK,KAGlB,IAAc,EAAI,cAAc,IAChC,IAAU,EAAI,QAAQ,KAAK,GAAG,MAAMA,EAAQ,GAAG,GAAK;EACtD,GAAG;EACH,MAAM;GAAC,GAAG,EAAO;GAAM,IAAc,UAAU;GAAS;GAAE;EAC7D,CAAC,CAAC;AACH,CAAI,IACA,EAAK,QAAQ,IAGb,EAAK,QAAQ;GAGR,MAAyB,GAAQ,GAAK,GAAM,MAAW;CAChE,IAAM,IAAM,EAAO,KAAK,KAClB,IAAIA,EAAQ,EAAI,MAAM,GAAK;EAC7B,GAAG;EACH,MAAM;GAAC,GAAG,EAAO;GAAM;GAAS;GAAE;EACrC,CAAC,EACI,IAAIA,EAAQ,EAAI,OAAO,GAAK;EAC9B,GAAG;EACH,MAAM;GAAC,GAAG,EAAO;GAAM;GAAS;GAAE;EACrC,CAAC,EACI,KAAwB,MAAQ,WAAW,KAAO,OAAO,KAAK,EAAI,CAAC,WAAW;AAKpF,GAAK,QAJS,CACV,GAAI,EAAqB,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,EAC3C,GAAI,EAAqB,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAC9C;GAGQ,MAAkB,GAAQ,GAAK,GAAO,MAAW;CAC1D,IAAM,IAAO,GACP,IAAM,EAAO,KAAK;AACxB,GAAK,OAAO;CACZ,IAAM,IAAa,EAAI,WAAW,kBAAkB,gBAAgB,SAC9D,IAAW,EAAI,WAAW,mBAA4B,EAAI,WAAW,gBAAzB,UAAmD,mBAC/F,IAAc,EAAI,MAAM,KAAK,GAAG,MAAMA,EAAQ,GAAG,GAAK;EACxD,GAAG;EACH,MAAM;GAAC,GAAG,EAAO;GAAM;GAAY;GAAE;EACxC,CAAC,CAAC,EACG,IAAO,EAAI,OACXA,EAAQ,EAAI,MAAM,GAAK;EACrB,GAAG;EACH,MAAM;GAAC,GAAG,EAAO;GAAM;GAAU,GAAI,EAAI,WAAW,gBAAgB,CAAC,EAAI,MAAM,OAAO,GAAG,EAAE;GAAE;EAChG,CAAC,GACA;AACN,CAAI,EAAI,WAAW,mBACf,EAAK,cAAc,GACf,MACA,EAAK,QAAQ,MAGZ,EAAI,WAAW,iBACpB,EAAK,QAAQ,EACT,OAAO,GACV,EACG,KACA,EAAK,MAAM,MAAM,KAAK,EAAK,EAE/B,EAAK,WAAW,EAAY,QACvB,MACD,EAAK,WAAW,EAAY,YAIhC,EAAK,QAAQ,GACT,MACA,EAAK,kBAAkB;CAI/B,IAAM,EAAE,YAAS,eAAY,EAAO,KAAK;AAGzC,CAFI,OAAO,KAAY,aACnB,EAAK,WAAW,IAChB,OAAO,KAAY,aACnB,EAAK,WAAW;GAEX,MAAmB,GAAQ,GAAK,GAAO,MAAW;CAC3D,IAAM,IAAO,GACP,IAAM,EAAO,KAAK;AACxB,GAAK,OAAO;CAIZ,IAAM,IAAU,EAAI,SAEd,IADS,EAAQ,KAAK,KACH;AACzB,KAAI,EAAI,SAAS,WAAW,KAAY,EAAS,OAAO,GAAG;EAEvD,IAAM,IAAcA,EAAQ,EAAI,WAAW,GAAK;GAC5C,GAAG;GACH,MAAM;IAAC,GAAG,EAAO;IAAM;IAAqB;IAAI;GACnD,CAAC;AACF,IAAK,oBAAoB,EAAE;AAC3B,OAAK,IAAM,KAAW,EAClB,GAAK,kBAAkB,EAAQ,UAAU;OAW7C,EANI,EAAI,WAAW,cAAc,EAAI,WAAW,qBAC5C,EAAK,gBAAgBA,EAAQ,EAAI,SAAS,GAAK;EAC3C,GAAG;EACH,MAAM,CAAC,GAAG,EAAO,MAAM,gBAAgB;EAC1C,CAAC,GAEN,EAAK,uBAAuBA,EAAQ,EAAI,WAAW,GAAK;EACpD,GAAG;EACH,MAAM,CAAC,GAAG,EAAO,MAAM,uBAAuB;EACjD,CAAC;CAGN,IAAM,IAAY,EAAQ,KAAK;AAC/B,KAAI,GAAW;EACX,IAAM,IAAiB,CAAC,GAAG,EAAU,CAAC,QAAQ,MAAM,OAAO,KAAM,YAAY,OAAO,KAAM,SAAS;AACnG,EAAI,EAAe,SAAS,MACxB,EAAK,WAAW;;GAIf,MAAqB,GAAQ,GAAK,GAAM,MAAW;CAC5D,IAAM,IAAM,EAAO,KAAK,KAClB,IAAQA,EAAQ,EAAI,WAAW,GAAK,EAAO,EAC3C,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,CAAI,EAAI,WAAW,iBACf,EAAK,MAAM,EAAI,WACf,EAAK,WAAW,MAGhB,EAAK,QAAQ,CAAC,GAAO,EAAE,MAAM,QAAQ,CAAC;GAGjC,MAAwB,GAAQ,GAAK,GAAO,MAAW;CAChE,IAAM,IAAM,EAAO,KAAK;AACxB,GAAQ,EAAI,WAAW,GAAK,EAAO;CACnC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,GAAK,MAAM,EAAI;GAEN,MAAoB,GAAQ,GAAK,GAAM,MAAW;CAC3D,IAAM,IAAM,EAAO,KAAK;AACxB,GAAQ,EAAI,WAAW,GAAK,EAAO;CACnC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AAEjC,CADA,EAAK,MAAM,EAAI,WACf,EAAK,UAAU,KAAK,MAAM,KAAK,UAAU,EAAI,aAAa,CAAC;GAElD,MAAqB,GAAQ,GAAK,GAAM,MAAW;CAC5D,IAAM,IAAM,EAAO,KAAK;AACxB,GAAQ,EAAI,WAAW,GAAK,EAAO;CACnC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AAEjC,CADA,EAAK,MAAM,EAAI,WACX,EAAI,OAAO,YACX,EAAK,YAAY,KAAK,MAAM,KAAK,UAAU,EAAI,aAAa,CAAC;GAExD,MAAkB,GAAQ,GAAK,GAAM,MAAW;CACzD,IAAM,IAAM,EAAO,KAAK;AACxB,GAAQ,EAAI,WAAW,GAAK,EAAO;CACnC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,GAAK,MAAM,EAAI;CACf,IAAI;AACJ,KAAI;AACA,MAAa,EAAI,WAAW,KAAA,EAAU;SAEpC;AACF,QAAU,MAAM,wDAAwD;;AAE5E,GAAK,UAAU;GAEN,MAAiB,GAAQ,GAAK,GAAO,MAAW;CACzD,IAAM,IAAM,EAAO,KAAK,KAClB,IAAY,EAAI,OAAO,UAAW,EAAI,GAAG,KAAK,IAAI,SAAS,cAAc,EAAI,MAAM,EAAI,KAAM,EAAI;AACvG,GAAQ,GAAW,GAAK,EAAO;CAC/B,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,GAAK,MAAM;GAEF,MAAqB,GAAQ,GAAK,GAAM,MAAW;CAC5D,IAAM,IAAM,EAAO,KAAK;AACxB,GAAQ,EAAI,WAAW,GAAK,EAAO;CACnC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AAEjC,CADA,EAAK,MAAM,EAAI,WACf,EAAK,WAAW;GAEP,MAAoB,GAAQ,GAAK,GAAO,MAAW;CAC5D,IAAM,IAAM,EAAO,KAAK;AACxB,GAAQ,EAAI,WAAW,GAAK,EAAO;CACnC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,GAAK,MAAM,EAAI;GAEN,MAAqB,GAAQ,GAAK,GAAO,MAAW;CAC7D,IAAM,IAAM,EAAO,KAAK;AACxB,GAAQ,EAAI,WAAW,GAAK,EAAO;CACnC,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,GAAK,MAAM,EAAI;GAEN,MAAiB,GAAQ,GAAK,GAAO,MAAW;CACzD,IAAM,IAAY,EAAO,KAAK;AAC9B,GAAQ,GAAW,GAAK,EAAO;CAC/B,IAAM,IAAO,EAAI,KAAK,IAAI,EAAO;AACjC,GAAK,MAAM;GAGF,KAAgB;CACzB,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,WAAW;CACX,MAAM;CACN,OAAO;CACP,KAAK;CACL,SAAS;CACT,MAAM;CACN,MAAM;CACN,SAAS;CACT,KAAK;CACL,kBAAkB;CAClB,MAAM;CACN,SAAS;CACT,QAAQ;CACR,UAAU;CACV,WAAW;CACX,KAAK;CACL,KAAK;CACL,OAAO;CACP,QAAQ;CACR,OAAO;CACP,cAAc;CACd,OAAO;CACP,QAAQ;CACR,UAAU;CACV,aAAa;CACb,SAAS;CACT,UAAU;CACV,OAAO;CACP,MAAM;CACN,UAAU;CACV,SAAS;CACT,UAAU;CACV,MAAM;CACT;AACD,SAAgB,GAAa,GAAO,GAAQ;AACxC,KAAI,YAAY,GAAO;EAEnB,IAAM,IAAW,GACX,IAAM,GAAkB;GAAE,GAAG;GAAQ,YAAY;GAAe,CAAC,EACjE,IAAO,EAAE;AAEf,OAAK,IAAM,KAAS,EAAS,OAAO,SAAS,EAAE;GAC3C,IAAM,CAAC,GAAG,KAAU;AACpB,KAAQ,GAAQ,EAAI;;EAExB,IAAM,IAAU,EAAE;AAOlB,IAAI,WANa;GACb;GACA,KAAK,GAAQ;GACb;GACH;AAID,OAAK,IAAM,KAAS,EAAS,OAAO,SAAS,EAAE;GAC3C,IAAM,CAAC,GAAK,KAAU;AAEtB,GADA,GAAY,GAAK,EAAO,EACxB,EAAQ,KAAO,GAAS,GAAK,EAAO;;AAQxC,SANI,OAAO,KAAK,EAAK,CAAC,SAAS,MAE3B,EAAQ,WAAW,GADC,EAAI,WAAW,kBAAkB,UAAU,gBAE5C,GAClB,GAEE,EAAE,YAAS;;CAGtB,IAAM,IAAM,GAAkB;EAAE,GAAG;EAAQ,YAAY;EAAe,CAAC;AAGvE,QAFA,EAAQ,GAAO,EAAI,EACnB,GAAY,GAAK,EAAM,EAChB,GAAS,GAAK,EAAM;;;;ACzlB/B,IAAa,KAA+B,kBAAkB,mBAAmB,GAAM,MAAQ;AAE3F,CADA,GAAqB,KAAK,GAAM,EAAI,EACpC,EAAwB,KAAK,GAAM,EAAI;EACzC;AACF,SAAgB,GAAS,GAAQ;AAC7B,QAAOC,mBAAkB,IAAgB,EAAO;;AAEpD,IAAa,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAEnF,CADA,GAAiB,KAAK,GAAM,EAAI,EAChC,EAAwB,KAAK,GAAM,EAAI;EACzC;AACF,SAAgB,GAAK,GAAQ;AACzB,QAAOC,mBAAc,IAAY,EAAO;;AAE5C,IAAa,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAEnF,CADA,GAAiB,KAAK,GAAM,EAAI,EAChC,EAAwB,KAAK,GAAM,EAAI;EACzC;AACF,SAAgB,GAAK,GAAQ;AACzB,QAAOC,mBAAc,IAAY,EAAO;;AAE5C,IAAa,KAA+B,kBAAkB,mBAAmB,GAAM,MAAQ;AAE3F,CADA,GAAqB,KAAK,GAAM,EAAI,EACpC,EAAwB,KAAK,GAAM,EAAI;EACzC;AACF,SAAgB,GAAS,GAAQ;AAC7B,QAAOC,mBAAkB,IAAgB,EAAO;;;;ACzBpD,IAAM,MAAe,GAAM,MAAW;AAGlC,CAFA,GAAU,KAAK,GAAM,EAAO,EAC5B,EAAK,OAAO,YACZ,OAAO,iBAAiB,GAAM;EAC1B,QAAQ,EACJ,QAAQ,MAAWC,GAAiB,GAAM,EAAO,EAEpD;EACD,SAAS,EACL,QAAQ,MAAWC,GAAkB,GAAM,EAAO,EAErD;EACD,UAAU,EACN,QAAQ,MAAU;AAEd,GADA,EAAK,OAAO,KAAK,EAAM,EACvB,EAAK,UAAU,KAAK,UAAU,EAAK,QAAQC,IAA4B,EAAE;KAGhF;EACD,WAAW,EACP,QAAQ,MAAW;AAEf,GADA,EAAK,OAAO,KAAK,GAAG,EAAO,EAC3B,EAAK,UAAU,KAAK,UAAU,EAAK,QAAQA,IAA4B,EAAE;KAGhF;EACD,SAAS,EACL,MAAM;AACF,UAAO,EAAK,OAAO,WAAW;KAGrC;EACJ,CAAC;;AAOkBE,EAAkB,YAAY,GAAY;AAClE,IAAa,KAAeA,EAAkB,YAAY,IAAa,EACnE,QAAQ,OACX,CAAC,EC3CW,KAAwB,mBAAY,GAAa,EACjD,KAA6B,mBAAiB,GAAa,EAC3D,KAA4B,mBAAgB,GAAa,EACzD,KAAiC,mBAAqB,GAAa,EAEnE,KAAyB,mBAAa,GAAa,EACnD,KAAyB,mBAAa,GAAa,EACnD,KAA8B,mBAAkB,GAAa,EAC7D,KAA8B,mBAAkB,GAAa,EAC7D,KAA6B,mBAAiB,GAAa,EAC3D,KAA6B,mBAAiB,GAAa,EAC3D,KAAkC,mBAAsB,GAAa,EACrE,KAAkC,mBAAsB,GAAa,ECPrEC,IAAwB,kBAAkB,YAAY,GAAM,OACrE,EAAc,KAAK,GAAM,EAAI,EAC7B,OAAO,OAAO,EAAK,cAAc,EAC7B,YAAY;CACR,OAAO,GAA+B,GAAM,QAAQ;CACpD,QAAQ,GAA+B,GAAM,SAAS;CACzD,EACJ,CAAC,EACF,EAAK,eAAe,GAAyB,GAAM,EAAE,CAAC,EACtD,EAAK,MAAM,GACX,EAAK,OAAO,EAAI,MAChB,OAAO,eAAe,GAAM,QAAQ,EAAE,OAAO,GAAK,CAAC,EAEnD,EAAK,SAAS,GAAG,MACN,EAAK,MAAMC,GAAe,GAAK,EAClC,QAAQ,CACJ,GAAI,EAAI,UAAU,EAAE,EACpB,GAAG,EAAO,KAAK,MAAO,OAAO,KAAO,aAAa,EAAE,MAAM;CAAE,OAAO;CAAI,KAAK,EAAE,OAAO,UAAU;CAAE,UAAU,EAAE;CAAE,EAAE,GAAG,EAAG,CACzH,EACJ,CAAC,EAAE,EACA,QAAQ,IACX,CAAC,EAEN,EAAK,OAAO,EAAK,OACjB,EAAK,SAAS,GAAK,MAAWC,GAAW,GAAM,GAAK,EAAO,EAC3D,EAAK,cAAc,GACnB,EAAK,aAAa,GAAK,OACnB,EAAI,IAAI,GAAM,EAAK,EACZ,KAGX,EAAK,SAAS,GAAM,MAAWC,GAAY,GAAM,GAAM,GAAQ,EAAE,QAAQ,EAAK,OAAO,CAAC,EACtF,EAAK,aAAa,GAAM,MAAWC,GAAgB,GAAM,GAAM,EAAO,EACtE,EAAK,aAAa,OAAO,GAAM,MAAWC,GAAiB,GAAM,GAAM,GAAQ,EAAE,QAAQ,EAAK,YAAY,CAAC,EAC3G,EAAK,iBAAiB,OAAO,GAAM,MAAWC,GAAqB,GAAM,GAAM,EAAO,EACtF,EAAK,MAAM,EAAK,gBAEhB,EAAK,UAAU,GAAM,MAAWC,GAAa,GAAM,GAAM,EAAO,EAChE,EAAK,UAAU,GAAM,MAAWC,GAAa,GAAM,GAAM,EAAO,EAChE,EAAK,cAAc,OAAO,GAAM,MAAWC,GAAkB,GAAM,GAAM,EAAO,EAChF,EAAK,cAAc,OAAO,GAAM,MAAWC,GAAkB,GAAM,GAAM,EAAO,EAChF,EAAK,cAAc,GAAM,MAAWC,GAAiB,GAAM,GAAM,EAAO,EACxE,EAAK,cAAc,GAAM,MAAWC,GAAiB,GAAM,GAAM,EAAO,EACxE,EAAK,kBAAkB,OAAO,GAAM,MAAWC,GAAsB,GAAM,GAAM,EAAO,EACxF,EAAK,kBAAkB,OAAO,GAAM,MAAWC,GAAsB,GAAM,GAAM,EAAO,EAExF,EAAK,UAAU,GAAO,MAAW,EAAK,MAAM,GAAO,GAAO,EAAO,CAAC,EAClE,EAAK,eAAe,MAAe,EAAK,MAAM,GAAY,EAAW,CAAC,EACtE,EAAK,aAAa,MAAO,EAAK,MAAMC,mBAAiB,EAAG,CAAC,EAEzD,EAAK,iBAAiB,GAAS,EAAK,EACpC,EAAK,sBAAsB,GAAc,EAAK,EAC9C,EAAK,iBAAiB,GAAS,EAAK,EACpC,EAAK,gBAAgB,GAAS,GAAS,EAAK,CAAC,EAC7C,EAAK,eAAe,MAAW,GAAY,GAAM,EAAO,EACxD,EAAK,cAAcC,GAAM,EAAK,EAC9B,EAAK,MAAM,MAAQ,EAAM,CAAC,GAAM,EAAI,CAAC,EACrC,EAAK,OAAO,MAAQ,GAAa,GAAM,EAAI,EAC3C,EAAK,aAAa,MAAO,GAAK,GAAM,GAAU,EAAG,CAAC,EAClD,EAAK,WAAW,MAAQ,GAAS,GAAM,EAAI,EAC3C,EAAK,YAAY,MAAQ,GAAS,GAAM,EAAI,EAE5C,EAAK,SAAS,MAAW,GAAO,GAAM,EAAO,EAC7C,EAAK,QAAQ,MAAW,GAAK,GAAM,EAAO,EAC1C,EAAK,iBAAiB,GAAS,EAAK,EAEpC,EAAK,YAAY,MAAgB;CAC7B,IAAM,IAAK,EAAK,OAAO;AAEvB,QADA,GAAoB,IAAI,GAAI,EAAE,gBAAa,CAAC,EACrC;GAEX,OAAO,eAAe,GAAM,eAAe;CACvC,MAAM;AACF,SAAA,GAA2B,IAAI,EAAK,EAAE;;CAE1C,cAAc;CACjB,CAAC,EACF,EAAK,QAAQ,GAAG,MAAS;AACrB,KAAI,EAAK,WAAW,EAChB,QAAA,GAA2B,IAAI,EAAK;CAExC,IAAM,IAAK,EAAK,OAAO;AAEvB,QADA,GAAoB,IAAI,GAAI,EAAK,GAAG,EAC7B;GAGX,EAAK,mBAAmB,EAAK,UAAU,KAAA,EAAU,CAAC,SAClD,EAAK,mBAAmB,EAAK,UAAU,KAAK,CAAC,SAC7C,EAAK,SAAS,MAAO,EAAG,EAAK,EACtB,GACT,EAEW,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAGnF,CAFA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA2B,GAAM,GAAK,GAAM,EAAO;CACxG,IAAM,IAAM,EAAK,KAAK;AAoBtB,CAnBA,EAAK,SAAS,EAAI,UAAU,MAC5B,EAAK,YAAY,EAAI,WAAW,MAChC,EAAK,YAAY,EAAI,WAAW,MAEhC,EAAK,SAAS,GAAG,MAAS,EAAK,MAAMC,mBAAa,GAAG,EAAK,CAAC,EAC3D,EAAK,YAAY,GAAG,MAAS,EAAK,MAAMC,mBAAgB,GAAG,EAAK,CAAC,EACjE,EAAK,cAAc,GAAG,MAAS,EAAK,MAAMC,mBAAkB,GAAG,EAAK,CAAC,EACrE,EAAK,YAAY,GAAG,MAAS,EAAK,MAAMC,mBAAgB,GAAG,EAAK,CAAC,EACjE,EAAK,OAAO,GAAG,MAAS,EAAK,MAAMC,mBAAiB,GAAG,EAAK,CAAC,EAC7D,EAAK,OAAO,GAAG,MAAS,EAAK,MAAMC,mBAAiB,GAAG,EAAK,CAAC,EAC7D,EAAK,UAAU,GAAG,MAAS,EAAK,MAAMC,mBAAc,GAAG,EAAK,CAAC,EAC7D,EAAK,YAAY,GAAG,MAAS,EAAK,MAAMF,mBAAiB,GAAG,GAAG,EAAK,CAAC,EACrE,EAAK,aAAa,MAAW,EAAK,MAAMG,mBAAiB,EAAO,CAAC,EACjE,EAAK,aAAa,MAAW,EAAK,MAAMC,mBAAiB,EAAO,CAAC,EAEjE,EAAK,aAAa,EAAK,MAAMC,oBAAa,CAAC,EAC3C,EAAK,aAAa,GAAG,MAAS,EAAK,MAAMC,mBAAiB,GAAG,EAAK,CAAC,EACnE,EAAK,oBAAoB,EAAK,MAAMC,oBAAoB,CAAC,EACzD,EAAK,oBAAoB,EAAK,MAAMC,oBAAoB,CAAC,EACzD,EAAK,gBAAgB,EAAK,MAAMC,oBAAgB,CAAC;EACnD,EACWC,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AA8BjF,CA7BA,GAAgB,KAAK,GAAM,EAAI,EAC/B,GAAW,KAAK,GAAM,EAAI,EAC1B,EAAK,SAAS,MAAW,EAAK,MAAMC,mBAAY,IAAU,EAAO,CAAC,EAClE,EAAK,OAAO,MAAW,EAAK,MAAMC,mBAAU,IAAQ,EAAO,CAAC,EAC5D,EAAK,OAAO,MAAW,EAAK,MAAMC,mBAAU,IAAQ,EAAO,CAAC,EAC5D,EAAK,SAAS,MAAW,EAAK,MAAMC,mBAAY,IAAU,EAAO,CAAC,EAClE,EAAK,QAAQ,MAAW,EAAK,MAAMC,mBAAW,IAAS,EAAO,CAAC,EAC/D,EAAK,QAAQ,MAAW,EAAK,MAAMC,mBAAW,IAAS,EAAO,CAAC,EAC/D,EAAK,UAAU,MAAW,EAAK,MAAMC,mBAAa,IAAS,EAAO,CAAC,EACnE,EAAK,UAAU,MAAW,EAAK,MAAMC,mBAAa,IAAS,EAAO,CAAC,EACnE,EAAK,UAAU,MAAW,EAAK,MAAMC,mBAAa,IAAS,EAAO,CAAC,EACnE,EAAK,UAAU,MAAW,EAAK,MAAMC,mBAAa,IAAW,EAAO,CAAC,EACrE,EAAK,QAAQ,MAAW,EAAK,MAAML,mBAAW,IAAS,EAAO,CAAC,EAC/D,EAAK,QAAQ,MAAW,EAAK,MAAMM,mBAAW,IAAS,EAAO,CAAC,EAC/D,EAAK,SAAS,MAAW,EAAK,MAAMC,mBAAY,IAAU,EAAO,CAAC,EAClE,EAAK,QAAQ,MAAW,EAAK,MAAMC,mBAAW,IAAS,EAAO,CAAC,EAC/D,EAAK,UAAU,MAAW,EAAK,MAAMC,mBAAa,IAAW,EAAO,CAAC,EACrE,EAAK,aAAa,MAAW,EAAK,MAAMC,mBAAgB,IAAc,EAAO,CAAC,EAC9E,EAAK,OAAO,MAAW,EAAK,MAAMC,mBAAU,IAAQ,EAAO,CAAC,EAC5D,EAAK,SAAS,MAAW,EAAK,MAAMC,mBAAY,IAAU,EAAO,CAAC,EAClE,EAAK,QAAQ,MAAW,EAAK,MAAMC,mBAAW,IAAS,EAAO,CAAC,EAC/D,EAAK,QAAQ,MAAW,EAAK,MAAMC,mBAAW,IAAS,EAAO,CAAC,EAC/D,EAAK,UAAU,MAAW,EAAK,MAAMC,mBAAa,IAAW,EAAO,CAAC,EACrE,EAAK,UAAU,MAAW,EAAK,MAAMC,mBAAa,IAAW,EAAO,CAAC,EACrE,EAAK,QAAQ,MAAW,EAAK,MAAMC,mBAAW,IAAS,EAAO,CAAC,EAE/D,EAAK,YAAY,MAAW,EAAK,MAAMC,GAAa,EAAO,CAAC,EAC5D,EAAK,QAAQ,MAAW,EAAK,MAAMC,GAAS,EAAO,CAAC,EACpD,EAAK,QAAQ,MAAW,EAAK,MAAMC,GAAS,EAAO,CAAC,EACpD,EAAK,YAAY,MAAW,EAAK,MAAMC,GAAa,EAAO,CAAC;EAC9D;AACF,SAAgB,EAAO,GAAQ;AAC3B,QAAOC,mBAAa3B,IAAW,EAAO;;AAE1C,IAAa,IAAgC,kBAAkB,oBAAoB,GAAM,MAAQ;AAE7F,CADA,EAAsB,KAAK,GAAM,EAAI,EACrC,GAAW,KAAK,GAAM,EAAI;EAC5B,EACW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAG/E,CADA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CADA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CADA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAeW,KAAuB,kBAAkB,WAAW,GAAM,MAAQ;AAG3E,CADA,GAAa,KAAK,GAAM,EAAI,EAC5B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAWW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAG/E,CADA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAGjF,CADA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CADA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAG/E,CADA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CADA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAuB,kBAAkB,WAAW,GAAM,MAAQ;AAG3E,CADA,GAAa,KAAK,GAAM,EAAI,EAC5B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAG/E,CADA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CADA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAYW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CADA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAEjF,CADA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAGjF,CADA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAA6B,kBAAkB,iBAAiB,GAAM,MAAQ;AAGvF,CADA,GAAmB,KAAK,GAAM,EAAI,EAClC,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CADA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAgB,KAAK,GAAM,EAAI;EACjC,EAIW,KAAuB,kBAAkB,WAAW,GAAM,MAAQ;AAG3E,CADA,GAAa,KAAK,GAAM,EAAI,EAC5B,EAAgB,KAAK,GAAM,EAAI;EACjC,EA0BW4B,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAmBjF,CAlBA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA2B,GAAM,GAAK,GAAM,EAAO,EACxG,EAAK,MAAM,GAAO,MAAW,EAAK,MAAMC,mBAAU,GAAO,EAAO,CAAC,EACjE,EAAK,OAAO,GAAO,MAAW,EAAK,MAAMC,mBAAW,GAAO,EAAO,CAAC,EACnE,EAAK,OAAO,GAAO,MAAW,EAAK,MAAMA,mBAAW,GAAO,EAAO,CAAC,EACnE,EAAK,MAAM,GAAO,MAAW,EAAK,MAAMC,mBAAU,GAAO,EAAO,CAAC,EACjE,EAAK,OAAO,GAAO,MAAW,EAAK,MAAMC,mBAAW,GAAO,EAAO,CAAC,EACnE,EAAK,OAAO,GAAO,MAAW,EAAK,MAAMA,mBAAW,GAAO,EAAO,CAAC,EACnE,EAAK,OAAO,MAAW,EAAK,MAAM,GAAI,EAAO,CAAC,EAC9C,EAAK,QAAQ,MAAW,EAAK,MAAM,GAAI,EAAO,CAAC,EAC/C,EAAK,YAAY,MAAW,EAAK,MAAMH,mBAAU,GAAG,EAAO,CAAC,EAC5D,EAAK,eAAe,MAAW,EAAK,MAAMC,mBAAW,GAAG,EAAO,CAAC,EAChE,EAAK,YAAY,MAAW,EAAK,MAAMC,mBAAU,GAAG,EAAO,CAAC,EAC5D,EAAK,eAAe,MAAW,EAAK,MAAMC,mBAAW,GAAG,EAAO,CAAC,EAChE,EAAK,cAAc,GAAO,MAAW,EAAK,MAAMC,mBAAkB,GAAO,EAAO,CAAC,EACjF,EAAK,QAAQ,GAAO,MAAW,EAAK,MAAMA,mBAAkB,GAAO,EAAO,CAAC,EAE3E,EAAK,eAAe;CACpB,IAAM,IAAM,EAAK,KAAK;AAOtB,CANA,EAAK,WACD,KAAK,IAAI,EAAI,WAAW,WAA0B,EAAI,oBAAoB,UAAyB,IAAI,MAC3G,EAAK,WACD,KAAK,IAAI,EAAI,WAAW,UAA0B,EAAI,oBAAoB,SAAyB,IAAI,MAC3G,EAAK,SAAS,EAAI,UAAU,IAAI,SAAS,MAAM,IAAI,OAAO,cAAc,EAAI,cAAc,GAAI,EAC9F,EAAK,WAAW,IAChB,EAAK,SAAS,EAAI,UAAU;EAC9B;AACF,SAAgB,GAAO,GAAQ;AAC3B,QAAOC,mBAAaP,IAAW,EAAO;;AAE1C,IAAa,KAAgC,kBAAkB,oBAAoB,GAAM,MAAQ;AAE7F,CADA,GAAsB,KAAK,GAAM,EAAI,EACrC,GAAU,KAAK,GAAM,EAAI;EAC3B;AACF,SAAgB,GAAI,GAAQ;AACxB,QAAOQ,mBAAU,IAAiB,EAAO;;AAc7C,IAAaC,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAGnF,CAFA,GAAiB,KAAK,GAAM,EAAI,EAChC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA4B,GAAM,GAAK,GAAM,EAAO;EAC3G;AACF,SAAgB,GAAQ,GAAQ;AAC5B,QAAOC,mBAAcF,IAAY,EAAO;;AAwD5C,IAAaG,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAG7E,CAFA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAAyB,GAAM,GAAK,GAAM,EAAO;EACxG;AACF,SAAS,GAAM,GAAQ;AACnB,QAAOC,mBAAWF,IAAS,EAAO;;AAWtC,IAAaG,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAGnF,CAFA,GAAiB,KAAK,GAAM,EAAI,EAChC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC;EACvD;AACF,SAAgB,KAAU;AACtB,QAAOC,mBAAcF,GAAW;;AAEpC,IAAaG,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAG/E,CAFA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA0B,GAAM,GAAK,GAAM,EAAO;EACzG;AACF,SAAgB,GAAM,GAAQ;AAC1B,QAAOC,mBAAYF,IAAU,EAAO;;AAwBxC,IAAaG,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAS/E,CARA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA0B,GAAM,GAAK,GAAM,EAAO,EACvG,EAAK,UAAU,EAAI,SACnB,EAAK,OAAO,GAAW,MAAW,EAAK,MAAM5D,mBAAiB,GAAW,EAAO,CAAC,EACjF,EAAK,YAAY,MAAW,EAAK,MAAMA,mBAAiB,GAAG,EAAO,CAAC,EACnE,EAAK,OAAO,GAAW,MAAW,EAAK,MAAMC,mBAAiB,GAAW,EAAO,CAAC,EACjF,EAAK,UAAU,GAAK,MAAW,EAAK,MAAMC,mBAAc,GAAK,EAAO,CAAC,EACrE,EAAK,eAAe,EAAK;EAC3B;AACF,SAAgBR,GAAM,GAAS,GAAQ;AACnC,QAAOmE,mBAAYF,IAAU,GAAS,EAAO;;AAOjD,IAAaG,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAuBjF,CAtBA,GAAmB,KAAK,GAAM,EAAI,EAClC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA2B,GAAM,GAAK,GAAM,EAAO,EACxG,EAAgB,GAAM,eACX,EAAI,MACb,EACF,EAAK,cAAc,GAAM,OAAO,KAAK,EAAK,KAAK,IAAI,MAAM,CAAC,EAC1D,EAAK,YAAY,MAAa,EAAK,MAAM;EAAE,GAAG,EAAK,KAAK;EAAe;EAAU,CAAC,EAClF,EAAK,oBAAoB,EAAK,MAAM;EAAE,GAAG,EAAK,KAAK;EAAK,UAAU,IAAS;EAAE,CAAC,EAC9E,EAAK,cAAc,EAAK,MAAM;EAAE,GAAG,EAAK,KAAK;EAAK,UAAU,IAAS;EAAE,CAAC,EACxE,EAAK,eAAe,EAAK,MAAM;EAAE,GAAG,EAAK,KAAK;EAAK,UAAU,IAAO;EAAE,CAAC,EACvE,EAAK,cAAc,EAAK,MAAM;EAAE,GAAG,EAAK,KAAK;EAAK,UAAU,KAAA;EAAW,CAAC,EACxE,EAAK,UAAU,MACJC,GAAY,GAAM,EAAS,EAEtC,EAAK,cAAc,MACRC,GAAgB,GAAM,EAAS,EAE1C,EAAK,SAAS,MAAUC,GAAW,GAAM,EAAM,EAC/C,EAAK,QAAQ,MAASC,GAAU,GAAM,EAAK,EAC3C,EAAK,QAAQ,MAASC,GAAU,GAAM,EAAK,EAC3C,EAAK,WAAW,GAAG,MAASC,GAAaC,IAAa,GAAM,EAAK,GAAG,EACpE,EAAK,YAAY,GAAG,MAASC,GAAc,IAAgB,GAAM,EAAK,GAAG;EAC3E;AACF,SAAgBC,EAAO,GAAO,GAAQ;AAMlC,QAAO,IAAIV,GALC;EACR,MAAM;EACN,OAAO,KAAS,EAAE;EAClB,GAAGW,EAAqB,EAAO;EAClC,CACwB;;AAoB7B,IAAaC,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAI/E,CAHA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA0B,GAAM,GAAK,GAAM,EAAO,EACvG,EAAK,UAAU,EAAI;EACrB;AACF,SAAgB,EAAM,GAAS,GAAQ;AACnC,QAAO,IAAID,GAAS;EAChB,MAAM;EACG;EACT,GAAGD,EAAqB,EAAO;EAClC,CAAC;;AAmBN,IAAaG,KAAsC,kBAAkB,0BAA0B,GAAM,MAAQ;AAEzG,CADA,GAAS,KAAK,GAAM,EAAI,EACxB,GAA4B,KAAK,GAAM,EAAI;EAC7C;AACF,SAAgB,GAAmB,GAAe,GAAS,GAAQ;AAE/D,QAAO,IAAIA,GAAsB;EAC7B,MAAM;EACN;EACA;EACA,GAAGH,EAAqB,EAAO;EAClC,CAAC;;AAEN,IAAaI,KAAgC,kBAAkB,oBAAoB,GAAM,MAAQ;AAG7F,CAFA,GAAsB,KAAK,GAAM,EAAI,EACrC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAAiC,GAAM,GAAK,GAAM,EAAO;EAChH;AACF,SAAgB,GAAa,GAAM,GAAO;AACtC,QAAO,IAAID,GAAgB;EACvB,MAAM;EACA;EACC;EACV,CAAC;;AAsBN,IAAaE,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAKjF,CAJA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA2B,GAAM,GAAK,GAAM,EAAO,EACxG,EAAK,UAAU,EAAI,SACnB,EAAK,YAAY,EAAI;EACvB;AACF,SAAgB,GAAO,GAAS,GAAW,GAAQ;AAC/C,QAAO,IAAID,GAAU;EACjB,MAAM;EACN;EACW;EACX,GAAGN,EAAqB,EAAO;EAClC,CAAC;;AAyDN,IAAaQ,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAK7E,CAJA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAAyB,GAAM,GAAK,GAAM,EAAO,EACtG,EAAK,OAAO,EAAI,SAChB,EAAK,UAAU,OAAO,OAAO,EAAI,QAAQ;CACzC,IAAM,IAAO,IAAI,IAAI,OAAO,KAAK,EAAI,QAAQ,CAAC;AAiB9C,CAhBA,EAAK,WAAW,GAAQ,MAAW;EAC/B,IAAM,IAAa,EAAE;AACrB,OAAK,IAAM,KAAS,EAChB,KAAI,EAAK,IAAI,EAAM,CACf,GAAW,KAAS,EAAI,QAAQ;MAGhC,OAAU,MAAM,OAAO,EAAM,oBAAoB;AAEzD,SAAO,IAAID,GAAQ;GACf,GAAG;GACH,QAAQ,EAAE;GACV,GAAGR,EAAqB,EAAO;GAC/B,SAAS;GACZ,CAAC;IAEN,EAAK,WAAW,GAAQ,MAAW;EAC/B,IAAM,IAAa,EAAE,GAAG,EAAI,SAAS;AACrC,OAAK,IAAM,KAAS,EAChB,KAAI,EAAK,IAAI,EAAM,CACf,QAAO,EAAW;MAGlB,OAAU,MAAM,OAAO,EAAM,oBAAoB;AAEzD,SAAO,IAAIQ,GAAQ;GACf,GAAG;GACH,QAAQ,EAAE;GACV,GAAGR,EAAqB,EAAO;GAC/B,SAAS;GACZ,CAAC;;EAER;AACF,SAAS,GAAM,GAAQ,GAAQ;AAE3B,QAAO,IAAIQ,GAAQ;EACf,MAAM;EACN,SAHY,MAAM,QAAQ,EAAO,GAAG,OAAO,YAAY,EAAO,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG;EAIpF,GAAGR,EAAqB,EAAO;EAClC,CAAC;;AAiBN,IAAaU,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAKnF,CAJA,GAAiB,KAAK,GAAM,EAAI,EAChC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA4B,GAAM,GAAK,GAAM,EAAO,EACzG,EAAK,SAAS,IAAI,IAAI,EAAI,OAAO,EACjC,OAAO,eAAe,GAAM,SAAS,EACjC,MAAM;AACF,MAAI,EAAI,OAAO,SAAS,EACpB,OAAU,MAAM,6EAA6E;AAEjG,SAAO,EAAI,OAAO;IAEzB,CAAC;EACJ;AACF,SAAgB,EAAQ,GAAO,GAAQ;AACnC,QAAO,IAAID,GAAW;EAClB,MAAM;EACN,QAAQ,MAAM,QAAQ,EAAM,GAAG,IAAQ,CAAC,EAAM;EAC9C,GAAGV,EAAqB,EAAO;EAClC,CAAC;;AAaN,IAAa,KAA6B,kBAAkB,iBAAiB,GAAM,MAAQ;AAIvF,CAHA,GAAmB,KAAK,GAAM,EAAI,EAClC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWY,GAA8B,GAAM,GAAK,GAAM,EAAO,EAC3G,EAAK,KAAK,SAAS,GAAS,MAAS;AACjC,MAAI,EAAK,cAAc,WACnB,OAAM,IAAIC,GAAqB,EAAK,YAAY,KAAK;AAEzD,IAAQ,YAAY,MAAU;AAC1B,OAAI,OAAOC,KAAU,SACjB,GAAQ,OAAO,KAAKC,GAAWD,GAAO,EAAQ,OAAO,EAAI,CAAC;QAEzD;IAED,IAAM,IAASA;AAOf,IANI,EAAO,UACP,EAAO,WAAW,KACtB,AAAgB,EAAO,SAAO,UAC9B,AAAiB,EAAO,UAAQ,EAAQ,OACxC,AAAgB,EAAO,SAAO,GAE9B,EAAQ,OAAO,KAAKC,GAAW,EAAO,CAAC;;;EAG/C,IAAM,IAAS,EAAI,UAAU,EAAQ,OAAO,EAAQ;AAQpD,SAPI,aAAkB,UACX,EAAO,MAAM,OAChB,EAAQ,QAAQ,GACT,GACT,IAEN,EAAQ,QAAQ,GACT;;EAEb;AACF,SAAgB,GAAU,GAAI;AAC1B,QAAO,IAAI,GAAa;EACpB,MAAM;EACN,WAAW;EACd,CAAC;;AAEN,IAAalB,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAIrF,CAHA,GAAkB,KAAK,GAAM,EAAI,EACjC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWmB,GAA6B,GAAM,GAAK,GAAM,EAAO,EAC1G,EAAK,eAAe,EAAK,KAAK,IAAI;EACpC;AACF,SAAgB,GAAS,GAAW;AAChC,QAAO,IAAInB,GAAY;EACnB,MAAM;EACK;EACd,CAAC;;AAEN,IAAa,KAAiC,kBAAkB,qBAAqB,GAAM,MAAQ;AAI/F,CAHA,GAAuB,KAAK,GAAM,EAAI,EACtC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWmB,GAA6B,GAAM,GAAK,GAAM,EAAO,EAC1G,EAAK,eAAe,EAAK,KAAK,IAAI;EACpC;AACF,SAAgB,GAAc,GAAW;AACrC,QAAO,IAAI,GAAiB;EACxB,MAAM;EACK;EACd,CAAC;;AAEN,IAAaC,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAIrF,CAHA,GAAkB,KAAK,GAAM,EAAI,EACjC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA6B,GAAM,GAAK,GAAM,EAAO,EAC1G,EAAK,eAAe,EAAK,KAAK,IAAI;EACpC;AACF,SAAgB,GAAS,GAAW;AAChC,QAAO,IAAID,GAAY;EACnB,MAAM;EACK;EACd,CAAC;;AAMN,IAAaE,KAA2B,kBAAkB,eAAe,GAAM,MAAQ;AAKnF,CAJA,GAAiB,KAAK,GAAM,EAAI,EAChC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA4B,GAAM,GAAK,GAAM,EAAO,EACzG,EAAK,eAAe,EAAK,KAAK,IAAI,WAClC,EAAK,gBAAgB,EAAK;EAC5B;AACF,SAAgB,GAAS,GAAW,GAAc;AAC9C,QAAO,IAAID,GAAW;EAClB,MAAM;EACK;EACX,IAAI,eAAe;AACf,UAAO,OAAO,KAAiB,aAAa,GAAc,GAAGE,GAAkB,EAAa;;EAEnG,CAAC;;AAEN,IAAa,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAIrF,CAHA,GAAkB,KAAK,GAAM,EAAI,EACjC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA6B,GAAM,GAAK,GAAM,EAAO,EAC1G,EAAK,eAAe,EAAK,KAAK,IAAI;EACpC;AACF,SAAgB,GAAS,GAAW,GAAc;AAC9C,QAAO,IAAI,GAAY;EACnB,MAAM;EACK;EACX,IAAI,eAAe;AACf,UAAO,OAAO,KAAiB,aAAa,GAAc,GAAGD,GAAkB,EAAa;;EAEnG,CAAC;;AAEN,IAAa,KAA+B,kBAAkB,mBAAmB,GAAM,MAAQ;AAI3F,CAHA,GAAqB,KAAK,GAAM,EAAI,EACpC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWE,GAAgC,GAAM,GAAK,GAAM,EAAO,EAC7G,EAAK,eAAe,EAAK,KAAK,IAAI;EACpC;AACF,SAAgB,GAAY,GAAW,GAAQ;AAC3C,QAAO,IAAI,GAAe;EACtB,MAAM;EACK;EACX,GAAGvB,EAAqB,EAAO;EAClC,CAAC;;AAcN,IAAawB,KAAyB,kBAAkB,aAAa,GAAM,MAAQ;AAK/E,CAJA,GAAe,KAAK,GAAM,EAAI,EAC9B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA0B,GAAM,GAAK,GAAM,EAAO,EACvG,EAAK,eAAe,EAAK,KAAK,IAAI,WAClC,EAAK,cAAc,EAAK;EAC1B;AACF,SAAS,GAAO,GAAW,GAAY;AACnC,QAAO,IAAID,GAAS;EAChB,MAAM;EACK;EACX,YAAa,OAAO,KAAe,aAAa,UAAmB;EACtE,CAAC;;AAWN,IAAa,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAK7E,CAJA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWE,GAAyB,GAAM,GAAK,GAAM,EAAO,EACtG,EAAK,KAAK,EAAI,IACd,EAAK,MAAM,EAAI;EACjB;AACF,SAAgB,GAAK,GAAK,GAAK;AAC3B,QAAO,IAAI,GAAQ;EACf,MAAM;EACN,IAAI;EACC;EAER,CAAC;;AAeN,IAAaC,KAA4B,kBAAkB,gBAAgB,GAAM,MAAQ;AAIrF,CAHA,GAAkB,KAAK,GAAM,EAAI,EACjC,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAA6B,GAAM,GAAK,GAAM,EAAO,EAC1G,EAAK,eAAe,EAAK,KAAK,IAAI;EACpC;AACF,SAAgB,GAAS,GAAW;AAChC,QAAO,IAAID,GAAY;EACnB,MAAM;EACK;EACd,CAAC;;AAcN,IAAaE,KAAwB,kBAAkB,YAAY,GAAM,MAAQ;AAI7E,CAHA,GAAc,KAAK,GAAM,EAAI,EAC7B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWC,GAAyB,GAAM,GAAK,GAAM,EAAO,EACtG,EAAK,eAAe,EAAK,KAAK,IAAI,QAAQ;EAC5C;AACF,SAAgB,GAAK,GAAQ;AACzB,QAAO,IAAID,GAAQ;EACf,MAAM;EACE;EACX,CAAC;;AA2BN,IAAa,KAA0B,kBAAkB,cAAc,GAAM,MAAQ;AAGjF,CAFA,GAAgB,KAAK,GAAM,EAAI,EAC/B,EAAQ,KAAK,GAAM,EAAI,EACvB,EAAK,KAAK,qBAAqB,GAAK,GAAM,MAAWE,GAA2B,GAAM,GAAK,GAAM,EAAO;EAC1G;AAUF,SAAgB,GAAO,GAAI,GAAS;AAChC,QAAOC,mBAAa,IAAW,YAAa,KAAO,EAAQ;;AAE/D,SAAgB,GAAO,GAAI,IAAU,EAAE,EAAE;AACrC,QAAOC,mBAAa,IAAW,GAAI,EAAQ;;AAG/C,SAAgB,GAAY,GAAI;AAC5B,QAAOC,mBAAkB,EAAG;;AAKhC,SAAS,GAAY,GAAK,IAAS,EAAE,EAAE;CACnC,IAAM,IAAO,IAAI,GAAU;EACvB,MAAM;EACN,OAAO;EACP,KAAK,MAAS,aAAgB;EAC9B,OAAO;EACP,GAAGlC,EAAqB,EAAO;EAClC,CAAC;AAcF,QAbA,EAAK,KAAK,IAAI,QAAQ,GAEtB,EAAK,KAAK,SAAS,MAAY;AAC3B,EAAM,EAAQ,iBAAiB,KAC3B,EAAQ,OAAO,KAAK;GAChB,MAAM;GACN,UAAU,EAAI;GACd,OAAO,EAAQ;GACf;GACA,MAAM,CAAC,GAAI,EAAK,KAAK,IAAI,QAAQ,EAAE,CAAE;GACxC,CAAC;IAGH;;;;ACjnCX,IAAW;CACV,SAAU,GAAM;AACb,GAAK,eAAe,MAAM;CAC1B,SAAS,EAAS,GAAM;AACxB,GAAK,WAAW;CAChB,SAAS,EAAY,GAAI;AACrB,QAAU,OAAO;;AAyCrB,CAvCA,EAAK,cAAc,GACnB,EAAK,eAAe,MAAU;EAC1B,IAAM,IAAM,EAAE;AACd,OAAK,IAAM,KAAQ,EACf,GAAI,KAAQ;AAEhB,SAAO;IAEX,EAAK,sBAAsB,MAAQ;EAC/B,IAAM,IAAY,EAAK,WAAW,EAAI,CAAC,QAAQ,MAAM,OAAO,EAAI,EAAI,OAAQ,SAAS,EAC/E,IAAW,EAAE;AACnB,OAAK,IAAM,KAAK,EACZ,GAAS,KAAK,EAAI;AAEtB,SAAO,EAAK,aAAa,EAAS;IAEtC,EAAK,gBAAgB,MACV,EAAK,WAAW,EAAI,CAAC,IAAI,SAAU,GAAG;AACzC,SAAO,EAAI;GACb,EAEN,EAAK,aAAa,OAAO,OAAO,QAAS,cAClC,MAAQ,OAAO,KAAK,EAAI,IACxB,MAAW;EACV,IAAM,IAAO,EAAE;AACf,OAAK,IAAM,KAAO,EACd,CAAI,OAAO,UAAU,eAAe,KAAK,GAAQ,EAAI,IACjD,EAAK,KAAK,EAAI;AAGtB,SAAO;IAEf,EAAK,QAAQ,GAAK,MAAY;AAC1B,OAAK,IAAM,KAAQ,EACf,KAAI,EAAQ,EAAK,CACb,QAAO;IAInB,EAAK,YAAY,OAAO,OAAO,aAAc,cACtC,MAAQ,OAAO,UAAU,EAAI,IAC7B,MAAQ,OAAO,KAAQ,YAAY,OAAO,SAAS,EAAI,IAAI,KAAK,MAAM,EAAI,KAAK;CACtF,SAAS,EAAW,GAAO,IAAY,OAAO;AAC1C,SAAO,EAAM,KAAK,MAAS,OAAO,KAAQ,WAAW,IAAI,EAAI,KAAK,EAAK,CAAC,KAAK,EAAU;;AAG3F,CADA,EAAK,aAAa,GAClB,EAAK,yBAAyB,GAAG,MACzB,OAAO,KAAU,WACV,EAAM,UAAU,GAEpB;GAEZ,AAAS,MAAO,EAAE,CAAE;AACvB,IAAW;CACV,SAAU,GAAY;AACnB,GAAW,eAAe,GAAO,OACtB;EACH,GAAG;EACH,GAAG;EACN;GAEN,AAAe,OAAa,EAAE,CAAE;AACnC,IAAa,IAAgB,EAAK,YAAY;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACH,CAAC,EACW,MAAiB,MAAS;AAEnC,SADU,OAAO,GACjB;EACI,KAAK,YACD,QAAO,EAAc;EACzB,KAAK,SACD,QAAO,EAAc;EACzB,KAAK,SACD,QAAO,OAAO,MAAM,EAAK,GAAG,EAAc,MAAM,EAAc;EAClE,KAAK,UACD,QAAO,EAAc;EACzB,KAAK,WACD,QAAO,EAAc;EACzB,KAAK,SACD,QAAO,EAAc;EACzB,KAAK,SACD,QAAO,EAAc;EACzB,KAAK,SAmBD,QAlBI,MAAM,QAAQ,EAAK,GACZ,EAAc,QAErB,MAAS,OACF,EAAc,OAErB,EAAK,QAAQ,OAAO,EAAK,QAAS,cAAc,EAAK,SAAS,OAAO,EAAK,SAAU,aAC7E,EAAc,UAErB,OAAO,MAAQ,OAAe,aAAgB,MACvC,EAAc,MAErB,OAAO,MAAQ,OAAe,aAAgB,MACvC,EAAc,MAErB,OAAO,OAAS,OAAe,aAAgB,OACxC,EAAc,OAElB,EAAc;EACzB,QACI,QAAO,EAAc;;GCjIpB,IAAe,EAAK,YAAY;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACH,CAAC,EAKW,KAAb,MAAa,UAAiB,MAAM;CAChC,IAAI,SAAS;AACT,SAAO,KAAK;;CAEhB,YAAY,GAAQ;AAMhB,EALA,OAAO,EACP,KAAK,SAAS,EAAE,EAChB,KAAK,YAAY,MAAQ;AACrB,QAAK,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAI;KAEvC,KAAK,aAAa,IAAO,EAAE,KAAK;AAC5B,QAAK,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG,EAAK;;EAE3C,IAAM,IAAc,IAAI,OAAO;AAS/B,EARI,OAAO,iBAEP,OAAO,eAAe,MAAM,EAAY,GAGxC,KAAK,YAAY,GAErB,KAAK,OAAO,YACZ,KAAK,SAAS;;CAElB,OAAO,GAAS;EACZ,IAAM,IAAS,KACX,SAAU,GAAO;AACb,UAAO,EAAM;KAEf,IAAc,EAAE,SAAS,EAAE,EAAE,EAC7B,KAAgB,MAAU;AAC5B,QAAK,IAAM,KAAS,EAAM,OACtB,KAAI,EAAM,SAAS,gBACf,GAAM,YAAY,IAAI,EAAa;YAE9B,EAAM,SAAS,sBACpB,GAAa,EAAM,gBAAgB;YAE9B,EAAM,SAAS,oBACpB,GAAa,EAAM,eAAe;YAE7B,EAAM,KAAK,WAAW,EAC3B,GAAY,QAAQ,KAAK,EAAO,EAAM,CAAC;QAEtC;IACD,IAAI,IAAO,GACP,IAAI;AACR,WAAO,IAAI,EAAM,KAAK,SAAQ;KAC1B,IAAM,IAAK,EAAM,KAAK;AAiBtB,KAhBiB,MAAM,EAAM,KAAK,SAAS,KAYvC,EAAK,KAAM,EAAK,MAAO,EAAE,SAAS,EAAE,EAAE,EACtC,EAAK,GAAI,QAAQ,KAAK,EAAO,EAAM,CAAC,IAXpC,EAAK,KAAM,EAAK,MAAO,EAAE,SAAS,EAAE,EAAE,EAa1C,IAAO,EAAK,IACZ;;;;AAMhB,SADA,EAAa,KAAK,EACX;;CAEX,OAAO,OAAO,GAAO;AACjB,MAAI,EAAE,aAAiB,GACnB,OAAU,MAAM,mBAAmB,IAAQ;;CAGnD,WAAW;AACP,SAAO,KAAK;;CAEhB,IAAI,UAAU;AACV,SAAO,KAAK,UAAU,KAAK,QAAQ,EAAK,uBAAuB,EAAE;;CAErE,IAAI,UAAU;AACV,SAAO,KAAK,OAAO,WAAW;;CAElC,QAAQ,KAAU,MAAU,EAAM,SAAS;EACvC,IAAM,IAAc,OAAO,OAAO,KAAK,EACjC,IAAa,EAAE;AACrB,OAAK,IAAM,KAAO,KAAK,OACnB,KAAI,EAAI,KAAK,SAAS,GAAG;GACrB,IAAM,IAAU,EAAI,KAAK;AAEzB,GADA,EAAY,KAAW,EAAY,MAAY,EAAE,EACjD,EAAY,GAAS,KAAK,EAAO,EAAI,CAAC;QAGtC,GAAW,KAAK,EAAO,EAAI,CAAC;AAGpC,SAAO;GAAE;GAAY;GAAa;;CAEtC,IAAI,aAAa;AACb,SAAO,KAAK,SAAS;;;AAG7B,GAAS,UAAU,MACD,IAAI,GAAS,EAAO;;;AChItC,IAAM,MAAY,GAAO,MAAS;CAC9B,IAAI;AACJ,SAAQ,EAAM,MAAd;EACI,KAAK,EAAa;AACd,GAII,IAJA,EAAM,aAAa,EAAc,YACvB,aAGA,YAAY,EAAM,SAAS,aAAa,EAAM;AAE5D;EACJ,KAAK,EAAa;AACd,OAAU,mCAAmC,KAAK,UAAU,EAAM,UAAU,EAAK,sBAAsB;AACvG;EACJ,KAAK,EAAa;AACd,OAAU,kCAAkC,EAAK,WAAW,EAAM,MAAM,KAAK;AAC7E;EACJ,KAAK,EAAa;AACd,OAAU;AACV;EACJ,KAAK,EAAa;AACd,OAAU,yCAAyC,EAAK,WAAW,EAAM,QAAQ;AACjF;EACJ,KAAK,EAAa;AACd,OAAU,gCAAgC,EAAK,WAAW,EAAM,QAAQ,CAAC,cAAc,EAAM,SAAS;AACtG;EACJ,KAAK,EAAa;AACd,OAAU;AACV;EACJ,KAAK,EAAa;AACd,OAAU;AACV;EACJ,KAAK,EAAa;AACd,OAAU;AACV;EACJ,KAAK,EAAa;AACd,GAAI,OAAO,EAAM,cAAe,WACxB,cAAc,EAAM,cACpB,IAAU,gCAAgC,EAAM,WAAW,SAAS,IAChE,OAAO,EAAM,WAAW,YAAa,aACrC,IAAU,GAAG,EAAQ,qDAAqD,EAAM,WAAW,eAG1F,gBAAgB,EAAM,aAC3B,IAAU,mCAAmC,EAAM,WAAW,WAAW,KAEpE,cAAc,EAAM,aACzB,IAAU,iCAAiC,EAAM,WAAW,SAAS,KAGrE,EAAK,YAAY,EAAM,WAAW,GAItC,IADK,EAAM,eAAe,UAIhB,YAHA,WAAW,EAAM;AAK/B;EACJ,KAAK,EAAa;AACd,GAWI,IAXA,EAAM,SAAS,UACL,sBAAsB,EAAM,QAAQ,YAAY,EAAM,YAAY,aAAa,YAAY,GAAG,EAAM,QAAQ,eACjH,EAAM,SAAS,WACV,uBAAuB,EAAM,QAAQ,YAAY,EAAM,YAAY,aAAa,OAAO,GAAG,EAAM,QAAQ,iBAC7G,EAAM,SAAS,YAEf,EAAM,SAAS,WADV,kBAAkB,EAAM,QAAQ,sBAAsB,EAAM,YAAY,8BAA8B,kBAAkB,EAAM,YAGnI,EAAM,SAAS,SACV,gBAAgB,EAAM,QAAQ,sBAAsB,EAAM,YAAY,8BAA8B,kBAAkB,IAAI,KAAK,OAAO,EAAM,QAAQ,CAAC,KAErJ;AACd;EACJ,KAAK,EAAa;AACd,GAWI,IAXA,EAAM,SAAS,UACL,sBAAsB,EAAM,QAAQ,YAAY,EAAM,YAAY,YAAY,YAAY,GAAG,EAAM,QAAQ,eAChH,EAAM,SAAS,WACV,uBAAuB,EAAM,QAAQ,YAAY,EAAM,YAAY,YAAY,QAAQ,GAAG,EAAM,QAAQ,iBAC7G,EAAM,SAAS,WACV,kBAAkB,EAAM,QAAQ,YAAY,EAAM,YAAY,0BAA0B,YAAY,GAAG,EAAM,YAClH,EAAM,SAAS,WACV,kBAAkB,EAAM,QAAQ,YAAY,EAAM,YAAY,0BAA0B,YAAY,GAAG,EAAM,YAClH,EAAM,SAAS,SACV,gBAAgB,EAAM,QAAQ,YAAY,EAAM,YAAY,6BAA6B,eAAe,GAAG,IAAI,KAAK,OAAO,EAAM,QAAQ,CAAC,KAE1I;AACd;EACJ,KAAK,EAAa;AACd,OAAU;AACV;EACJ,KAAK,EAAa;AACd,OAAU;AACV;EACJ,KAAK,EAAa;AACd,OAAU,gCAAgC,EAAM;AAChD;EACJ,KAAK,EAAa;AACd,OAAU;AACV;EACJ,QAEI,CADA,IAAU,EAAK,cACf,EAAK,YAAY,EAAM;;AAE/B,QAAO,EAAE,YAAS;GCzGlB,KAAmBqC;AAKvB,SAAgB,KAAc;AAC1B,QAAO;;;;ACLX,IAAa,MAAa,MAAW;CACjC,IAAM,EAAE,SAAM,SAAM,cAAW,iBAAc,GACvC,IAAW,CAAC,GAAG,GAAM,GAAI,EAAU,QAAQ,EAAE,CAAE,EAC/C,IAAY;EACd,GAAG;EACH,MAAM;EACT;AACD,KAAI,EAAU,YAAY,KAAA,EACtB,QAAO;EACH,GAAG;EACH,MAAM;EACN,SAAS,EAAU;EACtB;CAEL,IAAI,IAAe,IACb,IAAO,EACR,QAAQ,MAAM,CAAC,CAAC,EAAE,CAClB,OAAO,CACP,SAAS;AACd,MAAK,IAAM,KAAO,EACd,KAAe,EAAI,GAAW;EAAE;EAAM,cAAc;EAAc,CAAC,CAAC;AAExE,QAAO;EACH,GAAG;EACH,MAAM;EACN,SAAS;EACZ;;AAGL,SAAgB,EAAkB,GAAK,GAAW;CAC9C,IAAM,IAAc,IAAa,EAC3B,IAAQ,GAAU;EACT;EACX,MAAM,EAAI;EACV,MAAM,EAAI;EACV,WAAW;GACP,EAAI,OAAO;GACX,EAAI;GACJ;GACA,MAAgBC,KAAkB,KAAA,IAAYA;GACjD,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE;EACvB,CAAC;AACF,GAAI,OAAO,OAAO,KAAK,EAAM;;AAEjC,IAAa,IAAb,MAAa,EAAY;CACrB,cAAc;AACV,OAAK,QAAQ;;CAEjB,QAAQ;AACJ,EAAI,KAAK,UAAU,YACf,KAAK,QAAQ;;CAErB,QAAQ;AACJ,EAAI,KAAK,UAAU,cACf,KAAK,QAAQ;;CAErB,OAAO,WAAW,GAAQ,GAAS;EAC/B,IAAM,IAAa,EAAE;AACrB,OAAK,IAAM,KAAK,GAAS;AACrB,OAAI,EAAE,WAAW,UACb,QAAO;AAGX,GAFI,EAAE,WAAW,WACb,EAAO,OAAO,EAClB,EAAW,KAAK,EAAE,MAAM;;AAE5B,SAAO;GAAE,QAAQ,EAAO;GAAO,OAAO;GAAY;;CAEtD,aAAa,iBAAiB,GAAQ,GAAO;EACzC,IAAM,IAAY,EAAE;AACpB,OAAK,IAAM,KAAQ,GAAO;GACtB,IAAM,IAAM,MAAM,EAAK,KACjB,IAAQ,MAAM,EAAK;AACzB,KAAU,KAAK;IACX;IACA;IACH,CAAC;;AAEN,SAAO,EAAY,gBAAgB,GAAQ,EAAU;;CAEzD,OAAO,gBAAgB,GAAQ,GAAO;EAClC,IAAM,IAAc,EAAE;AACtB,OAAK,IAAM,KAAQ,GAAO;GACtB,IAAM,EAAE,QAAK,aAAU;AAGvB,OAFI,EAAI,WAAW,aAEf,EAAM,WAAW,UACjB,QAAO;AAKX,GAJI,EAAI,WAAW,WACf,EAAO,OAAO,EACd,EAAM,WAAW,WACjB,EAAO,OAAO,EACd,EAAI,UAAU,gBAAuB,EAAM,UAAU,UAAe,EAAK,eACzE,EAAY,EAAI,SAAS,EAAM;;AAGvC,SAAO;GAAE,QAAQ,EAAO;GAAO,OAAO;GAAa;;GAG9C,IAAU,OAAO,OAAO,EACjC,QAAQ,WACX,CAAC,EACW,MAAS,OAAW;CAAE,QAAQ;CAAS;CAAO,GAC9C,KAAM,OAAW;CAAE,QAAQ;CAAS;CAAO,GAC3C,MAAa,MAAM,EAAE,WAAW,WAChC,MAAW,MAAM,EAAE,WAAW,SAC9B,MAAW,MAAM,EAAE,WAAW,SAC9B,MAAW,MAAM,OAAO,UAAY,OAAe,aAAa,SC5GlE;CACV,SAAU,GAAW;AAGlB,CAFA,EAAU,YAAY,MAAY,OAAO,KAAY,WAAW,EAAE,YAAS,GAAG,KAAW,EAAE,EAE3F,EAAU,YAAY,MAAY,OAAO,KAAY,WAAW,IAAU,GAAS;GACpF,AAAc,MAAY,EAAE,CAAE;;;ACAjC,IAAM,KAAN,MAAyB;CACrB,YAAY,GAAQ,GAAO,GAAM,GAAK;AAKlC,EAJA,KAAK,cAAc,EAAE,EACrB,KAAK,SAAS,GACd,KAAK,OAAO,GACZ,KAAK,QAAQ,GACb,KAAK,OAAO;;CAEhB,IAAI,OAAO;AASP,SARK,KAAK,YAAY,WACd,MAAM,QAAQ,KAAK,KAAK,GACxB,KAAK,YAAY,KAAK,GAAG,KAAK,OAAO,GAAG,KAAK,KAAK,GAGlD,KAAK,YAAY,KAAK,GAAG,KAAK,OAAO,KAAK,KAAK,GAGhD,KAAK;;GAGd,MAAgB,GAAK,MAAW;AAClC,KAAI,GAAQ,EAAO,CACf,QAAO;EAAE,SAAS;EAAM,MAAM,EAAO;EAAO;AAG5C,KAAI,CAAC,EAAI,OAAO,OAAO,OACnB,OAAU,MAAM,4CAA4C;AAEhE,QAAO;EACH,SAAS;EACT,IAAI,QAAQ;AAKR,UAJI,AAGJ,KAAK,WADS,IAAI,GAAS,EAAI,OAAO,OAAO,EADlC,KAAK;;EAKvB;;AAGT,SAAS,EAAoB,GAAQ;AACjC,KAAI,CAAC,EACD,QAAO,EAAE;CACb,IAAM,EAAE,aAAU,uBAAoB,mBAAgB,mBAAgB;AACtE,KAAI,MAAa,KAAsB,GACnC,OAAU,MAAM,+FAA2F;AAgB/G,QAdI,IACO;EAAY;EAAU;EAAa,GAavC;EAAE,WAZU,GAAK,MAAQ;GAC5B,IAAM,EAAE,eAAY;AASpB,UARI,EAAI,SAAS,uBACN,EAAE,SAAS,KAAW,EAAI,cAAc,GAExC,EAAI,SAAS,SACb,EAAE,SAAS,KAAW,KAAkB,EAAI,cAAc,GAEjE,EAAI,SAAS,iBAEV,EAAE,SAAS,KAAW,KAAsB,EAAI,cAAc,GAD1D,EAAE,SAAS,EAAI,cAAc;;EAGd;EAAa;;AAE/C,IAAa,IAAb,MAAqB;CACjB,IAAI,cAAc;AACd,SAAO,KAAK,KAAK;;CAErB,SAAS,GAAO;AACZ,SAAO,GAAc,EAAM,KAAK;;CAEpC,gBAAgB,GAAO,GAAK;AACxB,SAAQ,KAAO;GACX,QAAQ,EAAM,OAAO;GACrB,MAAM,EAAM;GACZ,YAAY,GAAc,EAAM,KAAK;GACrC,gBAAgB,KAAK,KAAK;GAC1B,MAAM,EAAM;GACZ,QAAQ,EAAM;GACjB;;CAEL,oBAAoB,GAAO;AACvB,SAAO;GACH,QAAQ,IAAI,GAAa;GACzB,KAAK;IACD,QAAQ,EAAM,OAAO;IACrB,MAAM,EAAM;IACZ,YAAY,GAAc,EAAM,KAAK;IACrC,gBAAgB,KAAK,KAAK;IAC1B,MAAM,EAAM;IACZ,QAAQ,EAAM;IACjB;GACJ;;CAEL,WAAW,GAAO;EACd,IAAM,IAAS,KAAK,OAAO,EAAM;AACjC,MAAI,GAAQ,EAAO,CACf,OAAU,MAAM,yCAAyC;AAE7D,SAAO;;CAEX,YAAY,GAAO;EACf,IAAM,IAAS,KAAK,OAAO,EAAM;AACjC,SAAO,QAAQ,QAAQ,EAAO;;CAElC,MAAM,GAAM,GAAQ;EAChB,IAAM,IAAS,KAAK,UAAU,GAAM,EAAO;AAC3C,MAAI,EAAO,QACP,QAAO,EAAO;AAClB,QAAM,EAAO;;CAEjB,UAAU,GAAM,GAAQ;EACpB,IAAM,IAAM;GACR,QAAQ;IACJ,QAAQ,EAAE;IACV,OAAO,GAAQ,SAAS;IACxB,oBAAoB,GAAQ;IAC/B;GACD,MAAM,GAAQ,QAAQ,EAAE;GACxB,gBAAgB,KAAK,KAAK;GAC1B,QAAQ;GACR;GACA,YAAY,GAAc,EAAK;GAClC;AAED,SAAO,GAAa,GADL,KAAK,WAAW;GAAE;GAAM,MAAM,EAAI;GAAM,QAAQ;GAAK,CAAC,CACrC;;CAEpC,YAAY,GAAM;EACd,IAAM,IAAM;GACR,QAAQ;IACJ,QAAQ,EAAE;IACV,OAAO,CAAC,CAAC,KAAK,aAAa;IAC9B;GACD,MAAM,EAAE;GACR,gBAAgB,KAAK,KAAK;GAC1B,QAAQ;GACR;GACA,YAAY,GAAc,EAAK;GAClC;AACD,MAAI,CAAC,KAAK,aAAa,MACnB,KAAI;GACA,IAAM,IAAS,KAAK,WAAW;IAAE;IAAM,MAAM,EAAE;IAAE,QAAQ;IAAK,CAAC;AAC/D,UAAO,GAAQ,EAAO,GAChB,EACE,OAAO,EAAO,OACjB,GACC,EACE,QAAQ,EAAI,OAAO,QACtB;WAEF,GAAK;AAIR,GAHI,GAAK,SAAS,aAAa,EAAE,SAAS,cAAc,KACpD,KAAK,aAAa,QAAQ,KAE9B,EAAI,SAAS;IACT,QAAQ,EAAE;IACV,OAAO;IACV;;AAGT,SAAO,KAAK,YAAY;GAAE;GAAM,MAAM,EAAE;GAAE,QAAQ;GAAK,CAAC,CAAC,MAAM,MAAW,GAAQ,EAAO,GACnF,EACE,OAAO,EAAO,OACjB,GACC,EACE,QAAQ,EAAI,OAAO,QACtB,CAAC;;CAEV,MAAM,WAAW,GAAM,GAAQ;EAC3B,IAAM,IAAS,MAAM,KAAK,eAAe,GAAM,EAAO;AACtD,MAAI,EAAO,QACP,QAAO,EAAO;AAClB,QAAM,EAAO;;CAEjB,MAAM,eAAe,GAAM,GAAQ;EAC/B,IAAM,IAAM;GACR,QAAQ;IACJ,QAAQ,EAAE;IACV,oBAAoB,GAAQ;IAC5B,OAAO;IACV;GACD,MAAM,GAAQ,QAAQ,EAAE;GACxB,gBAAgB,KAAK,KAAK;GAC1B,QAAQ;GACR;GACA,YAAY,GAAc,EAAK;GAClC,EACK,IAAmB,KAAK,OAAO;GAAE;GAAM,MAAM,EAAI;GAAM,QAAQ;GAAK,CAAC;AAE3E,SAAO,GAAa,GADL,OAAO,GAAQ,EAAiB,GAAG,IAAmB,QAAQ,QAAQ,EAAiB,EACtE;;CAEpC,OAAO,GAAO,GAAS;EACnB,IAAM,KAAsB,MACpB,OAAO,KAAY,YAAmB,MAAY,SAC3C,EAAE,YAAS,GAEb,OAAO,KAAY,aACjB,EAAQ,EAAI,GAGZ;AAGf,SAAO,KAAK,aAAa,GAAK,MAAQ;GAClC,IAAM,IAAS,EAAM,EAAI,EACnB,UAAiB,EAAI,SAAS;IAChC,MAAM,EAAa;IACnB,GAAG,EAAmB,EAAI;IAC7B,CAAC;AAcE,UAbA,OAAO,UAAY,OAAe,aAAkB,UAC7C,EAAO,MAAM,MACX,IAKM,MAJP,GAAU,EACH,IAKb,GAED,IAKM,MAJP,GAAU,EACH;IAKb;;CAEN,WAAW,GAAO,GAAgB;AAC9B,SAAO,KAAK,aAAa,GAAK,MACrB,EAAM,EAAI,GAKJ,MAJP,EAAI,SAAS,OAAO,KAAmB,aAAa,EAAe,GAAK,EAAI,GAAG,EAAe,EACvF,IAKb;;CAEN,YAAY,GAAY;AACpB,SAAO,IAAI,GAAW;GAClB,QAAQ;GACR,UAAU,EAAsB;GAChC,QAAQ;IAAE,MAAM;IAAc;IAAY;GAC7C,CAAC;;CAEN,YAAY,GAAY;AACpB,SAAO,KAAK,YAAY,EAAW;;CAEvC,YAAY,GAAK;AA4Bb,EA1BA,KAAK,MAAM,KAAK,gBAChB,KAAK,OAAO,GACZ,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK,EAClC,KAAK,YAAY,KAAK,UAAU,KAAK,KAAK,EAC1C,KAAK,aAAa,KAAK,WAAW,KAAK,KAAK,EAC5C,KAAK,iBAAiB,KAAK,eAAe,KAAK,KAAK,EACpD,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,EAC9B,KAAK,SAAS,KAAK,OAAO,KAAK,KAAK,EACpC,KAAK,aAAa,KAAK,WAAW,KAAK,KAAK,EAC5C,KAAK,cAAc,KAAK,YAAY,KAAK,KAAK,EAC9C,KAAK,WAAW,KAAK,SAAS,KAAK,KAAK,EACxC,KAAK,WAAW,KAAK,SAAS,KAAK,KAAK,EACxC,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,EACtC,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK,EAClC,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,EACtC,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,EAC5B,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,EAC9B,KAAK,YAAY,KAAK,UAAU,KAAK,KAAK,EAC1C,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK,EAClC,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,EACtC,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK,EAClC,KAAK,WAAW,KAAK,SAAS,KAAK,KAAK,EACxC,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,EAChC,KAAK,WAAW,KAAK,SAAS,KAAK,KAAK,EACxC,KAAK,aAAa,KAAK,WAAW,KAAK,KAAK,EAC5C,KAAK,aAAa,KAAK,WAAW,KAAK,KAAK,EAC5C,KAAK,eAAe;GAChB,SAAS;GACT,QAAQ;GACR,WAAW,MAAS,KAAK,aAAa,EAAK;GAC9C;;CAEL,WAAW;AACP,SAAO,GAAY,OAAO,MAAM,KAAK,KAAK;;CAE9C,WAAW;AACP,SAAO,GAAY,OAAO,MAAM,KAAK,KAAK;;CAE9C,UAAU;AACN,SAAO,KAAK,UAAU,CAAC,UAAU;;CAErC,QAAQ;AACJ,SAAO,GAAS,OAAO,KAAK;;CAEhC,UAAU;AACN,SAAO,GAAW,OAAO,MAAM,KAAK,KAAK;;CAE7C,GAAG,GAAQ;AACP,SAAO,GAAS,OAAO,CAAC,MAAM,EAAO,EAAE,KAAK,KAAK;;CAErD,IAAI,GAAU;AACV,SAAO,GAAgB,OAAO,MAAM,GAAU,KAAK,KAAK;;CAE5D,UAAU,GAAW;AACjB,SAAO,IAAI,GAAW;GAClB,GAAG,EAAoB,KAAK,KAAK;GACjC,QAAQ;GACR,UAAU,EAAsB;GAChC,QAAQ;IAAE,MAAM;IAAa;IAAW;GAC3C,CAAC;;CAEN,QAAQ,GAAK;EACT,IAAM,IAAmB,OAAO,KAAQ,aAAa,UAAY;AACjE,SAAO,IAAI,GAAW;GAClB,GAAG,EAAoB,KAAK,KAAK;GACjC,WAAW;GACX,cAAc;GACd,UAAU,EAAsB;GACnC,CAAC;;CAEN,QAAQ;AACJ,SAAO,IAAI,GAAW;GAClB,UAAU,EAAsB;GAChC,MAAM;GACN,GAAG,EAAoB,KAAK,KAAK;GACpC,CAAC;;CAEN,MAAM,GAAK;EACP,IAAM,IAAiB,OAAO,KAAQ,aAAa,UAAY;AAC/D,SAAO,IAAI,GAAS;GAChB,GAAG,EAAoB,KAAK,KAAK;GACjC,WAAW;GACX,YAAY;GACZ,UAAU,EAAsB;GACnC,CAAC;;CAEN,SAAS,GAAa;EAClB,IAAM,IAAO,KAAK;AAClB,SAAO,IAAI,EAAK;GACZ,GAAG,KAAK;GACR;GACH,CAAC;;CAEN,KAAK,GAAQ;AACT,SAAO,GAAY,OAAO,MAAM,EAAO;;CAE3C,WAAW;AACP,SAAO,GAAY,OAAO,KAAK;;CAEnC,aAAa;AACT,SAAO,KAAK,UAAU,KAAA,EAAU,CAAC;;CAErC,aAAa;AACT,SAAO,KAAK,UAAU,KAAK,CAAC;;GAG9B,KAAY,kBACZ,KAAa,eACb,KAAY,6BAGZ,KAAY,0FACZ,KAAc,qBACd,KAAW,oDACX,KAAgB,4SAahB,KAAa,sFAIb,KAAc,wDAChBC,IAEE,KAAY,uHACZ,KAAgB,4IAGhB,KAAY,ypBACZ,KAAgB,2rBAEhB,KAAc,oEAEd,KAAiB,0EAMjB,KAAkB,qMAClB,KAAgB,OAAO,IAAI,GAAgB,GAAG;AACpD,SAAS,GAAgB,GAAM;CAC3B,IAAI,IAAqB;AACzB,CAAI,EAAK,YACL,IAAqB,GAAG,EAAmB,SAAS,EAAK,UAAU,KAE9D,EAAK,cACV,IAAqB,GAAG,EAAmB;CAE/C,IAAM,IAAoB,EAAK,YAAY,MAAM;AACjD,QAAO,8BAA8B,EAAmB,GAAG;;AAE/D,SAAS,GAAU,GAAM;AACrB,QAAW,OAAO,IAAI,GAAgB,EAAK,CAAC,GAAG;;AAGnD,SAAgB,GAAc,GAAM;CAChC,IAAI,IAAQ,GAAG,GAAgB,GAAG,GAAgB,EAAK,IACjD,IAAO,EAAE;AAKf,QAJA,EAAK,KAAK,EAAK,QAAQ,OAAO,IAAI,EAC9B,EAAK,UACL,EAAK,KAAK,uBAAuB,EACrC,IAAQ,GAAG,EAAM,GAAG,EAAK,KAAK,IAAI,CAAC,IACxB,OAAO,IAAI,EAAM,GAAG;;AAEnC,SAAS,GAAU,GAAI,GAAS;AAO5B,QAHA,IAHK,MAAY,QAAQ,CAAC,MAAY,GAAU,KAAK,EAAG,KAGnD,MAAY,QAAQ,CAAC,MAAY,GAAU,KAAK,EAAG;;AAK5D,SAAS,GAAW,GAAK,GAAK;AAC1B,KAAI,CAAC,GAAS,KAAK,EAAI,CACnB,QAAO;AACX,KAAI;EACA,IAAM,CAAC,KAAU,EAAI,MAAM,IAAI;AAC/B,MAAI,CAAC,EACD,QAAO;EAEX,IAAM,IAAS,EACV,QAAQ,MAAM,IAAI,CAClB,QAAQ,MAAM,IAAI,CAClB,OAAO,EAAO,UAAW,IAAK,EAAO,SAAS,KAAM,GAAI,IAAI,EAE3D,IAAU,KAAK,MAAM,KAAK,EAAO,CAAC;AASxC,SAFA,EANI,OAAO,KAAY,aAAY,KAE/B,SAAS,KAAW,GAAS,QAAQ,SAErC,CAAC,EAAQ,OAET,KAAO,EAAQ,QAAQ;SAIzB;AACF,SAAO;;;AAGf,SAAS,GAAY,GAAI,GAAS;AAO9B,QAHA,IAHK,MAAY,QAAQ,CAAC,MAAY,GAAc,KAAK,EAAG,KAGvD,MAAY,QAAQ,CAAC,MAAY,GAAc,KAAK,EAAG;;AAKhE,IAAa,KAAb,MAAa,UAAkB,EAAQ;CACnC,OAAO,GAAO;AAKV,MAJI,KAAK,KAAK,WACV,EAAM,OAAO,OAAO,EAAM,KAAK,GAEhB,KAAK,SAAS,EAAM,KACpB,EAAc,QAAQ;GACrC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;EAEX,IAAM,IAAS,IAAI,GAAa,EAC5B;AACJ,OAAK,IAAM,KAAS,KAAK,KAAK,OAC1B,KAAI,EAAM,SAAS,OACX,EAAM,KAAK,SAAS,EAAM,UAC1B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAM;GACf,MAAM;GACN,WAAW;GACX,OAAO;GACP,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,OAChB,EAAM,KAAK,SAAS,EAAM,UAC1B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAM;GACf,MAAM;GACN,WAAW;GACX,OAAO;GACP,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,UAAU;GAC9B,IAAM,IAAS,EAAM,KAAK,SAAS,EAAM,OACnC,IAAW,EAAM,KAAK,SAAS,EAAM;AAC3C,IAAI,KAAU,OACV,IAAM,KAAK,gBAAgB,GAAO,EAAI,EAClC,IACA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,SAAS,EAAM;IACf,MAAM;IACN,WAAW;IACX,OAAO;IACP,SAAS,EAAM;IAClB,CAAC,GAEG,KACL,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,SAAS,EAAM;IACf,MAAM;IACN,WAAW;IACX,OAAO;IACP,SAAS,EAAM;IAClB,CAAC,EAEN,EAAO,OAAO;aAGb,EAAM,SAAS,SACf,GAAW,KAAK,EAAM,KAAK,KAC5B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,QAIpB,CAHA,AACI,OAAa,IAAI,OAAO,IAAa,IAAI,EAExCA,GAAW,KAAK,EAAM,KAAK,KAC5B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,QACf,GAAU,KAAK,EAAM,KAAK,KAC3B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,UACf,GAAY,KAAK,EAAM,KAAK,KAC7B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,QACf,GAAU,KAAK,EAAM,KAAK,KAC3B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,SACf,GAAW,KAAK,EAAM,KAAK,KAC5B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,QACf,GAAU,KAAK,EAAM,KAAK,KAC3B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO;WAGb,EAAM,SAAS,MACpB,KAAI;AAEA,OAAI,IAAI,EAAM,KAAK;UAEjB;AAOF,GANA,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;IACnB,YAAY;IACZ,MAAM,EAAa;IACnB,SAAS,EAAM;IAClB,CAAC,EACF,EAAO,OAAO;;OAGb,EAAM,SAAS,WACpB,EAAM,MAAM,YAAY,GACL,EAAM,MAAM,KAAK,EAAM,KAAK,KAE3C,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,KAGb,EAAM,SAAS,SACpB,EAAM,OAAO,EAAM,KAAK,MAAM,GAEzB,EAAM,SAAS,aACf,EAAM,KAAK,SAAS,EAAM,OAAO,EAAM,SAAS,KACjD,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY;IAAE,UAAU,EAAM;IAAO,UAAU,EAAM;IAAU;GAC/D,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,gBACpB,EAAM,OAAO,EAAM,KAAK,aAAa,GAEhC,EAAM,SAAS,gBACpB,EAAM,OAAO,EAAM,KAAK,aAAa,GAEhC,EAAM,SAAS,eACf,EAAM,KAAK,WAAW,EAAM,MAAM,KACnC,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY,EAAE,YAAY,EAAM,OAAO;GACvC,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,aACf,EAAM,KAAK,SAAS,EAAM,MAAM,KACjC,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY,EAAE,UAAU,EAAM,OAAO;GACrC,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,aACN,GAAc,EAAM,CACvB,KAAK,EAAM,KAAK,KACvB,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY;GACZ,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,SACN,GACH,KAAK,EAAM,KAAK,KACvB,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY;GACZ,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,SACN,GAAU,EAAM,CACnB,KAAK,EAAM,KAAK,KACvB,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY;GACZ,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,aACf,GAAc,KAAK,EAAM,KAAK,KAC/B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,OACf,GAAU,EAAM,MAAM,EAAM,QAAQ,KACrC,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,QACf,GAAW,EAAM,MAAM,EAAM,IAAI,KAClC,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,SACf,GAAY,EAAM,MAAM,EAAM,QAAQ,KACvC,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,WACf,GAAY,KAAK,EAAM,KAAK,KAC7B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,cACf,GAAe,KAAK,EAAM,KAAK,KAChC,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,YAAY;GACZ,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAIlB,EAAK,YAAY,EAAM;AAG/B,SAAO;GAAE,QAAQ,EAAO;GAAO,OAAO,EAAM;GAAM;;CAEtD,OAAO,GAAO,GAAY,GAAS;AAC/B,SAAO,KAAK,YAAY,MAAS,EAAM,KAAK,EAAK,EAAE;GAC/C;GACA,MAAM,EAAa;GACnB,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAEN,UAAU,GAAO;AACb,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAM;GACvC,CAAC;;CAEN,MAAM,GAAS;AACX,SAAO,KAAK,UAAU;GAAE,MAAM;GAAS,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE5E,IAAI,GAAS;AACT,SAAO,KAAK,UAAU;GAAE,MAAM;GAAO,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE1E,MAAM,GAAS;AACX,SAAO,KAAK,UAAU;GAAE,MAAM;GAAS,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE5E,KAAK,GAAS;AACV,SAAO,KAAK,UAAU;GAAE,MAAM;GAAQ,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE3E,OAAO,GAAS;AACZ,SAAO,KAAK,UAAU;GAAE,MAAM;GAAU,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE7E,KAAK,GAAS;AACV,SAAO,KAAK,UAAU;GAAE,MAAM;GAAQ,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE3E,MAAM,GAAS;AACX,SAAO,KAAK,UAAU;GAAE,MAAM;GAAS,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE5E,KAAK,GAAS;AACV,SAAO,KAAK,UAAU;GAAE,MAAM;GAAQ,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE3E,OAAO,GAAS;AACZ,SAAO,KAAK,UAAU;GAAE,MAAM;GAAU,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE7E,UAAU,GAAS;AAEf,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAEN,IAAI,GAAS;AACT,SAAO,KAAK,UAAU;GAAE,MAAM;GAAO,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE1E,GAAG,GAAS;AACR,SAAO,KAAK,UAAU;GAAE,MAAM;GAAM,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAEzE,KAAK,GAAS;AACV,SAAO,KAAK,UAAU;GAAE,MAAM;GAAQ,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE3E,SAAS,GAAS;AAUd,SATI,OAAO,KAAY,WACZ,KAAK,UAAU;GAClB,MAAM;GACN,WAAW;GACX,QAAQ;GACR,OAAO;GACP,SAAS;GACZ,CAAC,GAEC,KAAK,UAAU;GAClB,MAAM;GACN,WAAkB,GAAS,cAAc,SAAc,OAAO,GAAS;GACvE,QAAQ,GAAS,UAAU;GAC3B,OAAO,GAAS,SAAS;GACzB,GAAG,EAAU,SAAS,GAAS,QAAQ;GAC1C,CAAC;;CAEN,KAAK,GAAS;AACV,SAAO,KAAK,UAAU;GAAE,MAAM;GAAQ;GAAS,CAAC;;CAEpD,KAAK,GAAS;AAQV,SAPI,OAAO,KAAY,WACZ,KAAK,UAAU;GAClB,MAAM;GACN,WAAW;GACX,SAAS;GACZ,CAAC,GAEC,KAAK,UAAU;GAClB,MAAM;GACN,WAAkB,GAAS,cAAc,SAAc,OAAO,GAAS;GACvE,GAAG,EAAU,SAAS,GAAS,QAAQ;GAC1C,CAAC;;CAEN,SAAS,GAAS;AACd,SAAO,KAAK,UAAU;GAAE,MAAM;GAAY,GAAG,EAAU,SAAS,EAAQ;GAAE,CAAC;;CAE/E,MAAM,GAAO,GAAS;AAClB,SAAO,KAAK,UAAU;GAClB,MAAM;GACC;GACP,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAEN,SAAS,GAAO,GAAS;AACrB,SAAO,KAAK,UAAU;GAClB,MAAM;GACC;GACP,UAAU,GAAS;GACnB,GAAG,EAAU,SAAS,GAAS,QAAQ;GAC1C,CAAC;;CAEN,WAAW,GAAO,GAAS;AACvB,SAAO,KAAK,UAAU;GAClB,MAAM;GACC;GACP,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAEN,SAAS,GAAO,GAAS;AACrB,SAAO,KAAK,UAAU;GAClB,MAAM;GACC;GACP,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAEN,IAAI,GAAW,GAAS;AACpB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO;GACP,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAEN,IAAI,GAAW,GAAS;AACpB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO;GACP,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAEN,OAAO,GAAK,GAAS;AACjB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO;GACP,GAAG,EAAU,SAAS,EAAQ;GACjC,CAAC;;CAKN,SAAS,GAAS;AACd,SAAO,KAAK,IAAI,GAAG,EAAU,SAAS,EAAQ,CAAC;;CAEnD,OAAO;AACH,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;GAClD,CAAC;;CAEN,cAAc;AACV,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;GACzD,CAAC;;CAEN,cAAc;AACV,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;GACzD,CAAC;;CAEN,IAAI,aAAa;AACb,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,WAAW;;CAElE,IAAI,SAAS;AACT,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,OAAO;;CAE9D,IAAI,SAAS;AACT,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,OAAO;;CAE9D,IAAI,aAAa;AACb,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,WAAW;;CAElE,IAAI,UAAU;AACV,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,QAAQ;;CAE/D,IAAI,QAAQ;AACR,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,MAAM;;CAE7D,IAAI,UAAU;AACV,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,QAAQ;;CAE/D,IAAI,SAAS;AACT,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,OAAO;;CAE9D,IAAI,WAAW;AACX,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,SAAS;;CAEhE,IAAI,SAAS;AACT,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,OAAO;;CAE9D,IAAI,UAAU;AACV,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,QAAQ;;CAE/D,IAAI,SAAS;AACT,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,OAAO;;CAE9D,IAAI,OAAO;AACP,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,KAAK;;CAE5D,IAAI,SAAS;AACT,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,OAAO;;CAE9D,IAAI,WAAW;AACX,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,SAAS;;CAEhE,IAAI,cAAc;AAEd,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,YAAY;;CAEnE,IAAI,YAAY;EACZ,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO;;CAEX,IAAI,YAAY;EACZ,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO;;;AAGf,GAAU,UAAU,MACT,IAAI,GAAU;CACjB,QAAQ,EAAE;CACV,UAAU,EAAsB;CAChC,QAAQ,GAAQ,UAAU;CAC1B,GAAG,EAAoB,EAAO;CACjC,CAAC;AAGN,SAAS,GAAmB,GAAK,GAAM;CACnC,IAAM,KAAe,EAAI,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,QACnD,KAAgB,EAAK,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,QACrD,IAAW,IAAc,IAAe,IAAc;AAG5D,QAFe,OAAO,SAAS,EAAI,QAAQ,EAAS,CAAC,QAAQ,KAAK,GAAG,CAAC,GACtD,OAAO,SAAS,EAAK,QAAQ,EAAS,CAAC,QAAQ,KAAK,GAAG,CAAC,GAC5C,MAAM;;AAEtC,IAAa,KAAb,MAAa,UAAkB,EAAQ;CACnC,cAAc;AAIV,EAHA,MAAM,GAAG,UAAU,EACnB,KAAK,MAAM,KAAK,KAChB,KAAK,MAAM,KAAK,KAChB,KAAK,OAAO,KAAK;;CAErB,OAAO,GAAO;AAKV,MAJI,KAAK,KAAK,WACV,EAAM,OAAO,OAAO,EAAM,KAAK,GAEhB,KAAK,SAAS,EAAM,KACpB,EAAc,QAAQ;GACrC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;EAEX,IAAI,GACE,IAAS,IAAI,GAAa;AAChC,OAAK,IAAM,KAAS,KAAK,KAAK,OAC1B,CAAI,EAAM,SAAS,QACV,EAAK,UAAU,EAAM,KAAK,KAC3B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU;GACV,UAAU;GACV,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,SACH,EAAM,YAAY,EAAM,OAAO,EAAM,QAAQ,EAAM,QAAQ,EAAM,WAE9E,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAM;GACf,MAAM;GACN,WAAW,EAAM;GACjB,OAAO;GACP,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,SACL,EAAM,YAAY,EAAM,OAAO,EAAM,QAAQ,EAAM,QAAQ,EAAM,WAE5E,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAM;GACf,MAAM;GACN,WAAW,EAAM;GACjB,OAAO;GACP,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,eAChB,GAAmB,EAAM,MAAM,EAAM,MAAM,KAAK,MAChD,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY,EAAM;GAClB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,WACf,OAAO,SAAS,EAAM,KAAK,KAC5B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAIlB,EAAK,YAAY,EAAM;AAG/B,SAAO;GAAE,QAAQ,EAAO;GAAO,OAAO,EAAM;GAAM;;CAEtD,IAAI,GAAO,GAAS;AAChB,SAAO,KAAK,SAAS,OAAO,GAAO,IAAM,EAAU,SAAS,EAAQ,CAAC;;CAEzE,GAAG,GAAO,GAAS;AACf,SAAO,KAAK,SAAS,OAAO,GAAO,IAAO,EAAU,SAAS,EAAQ,CAAC;;CAE1E,IAAI,GAAO,GAAS;AAChB,SAAO,KAAK,SAAS,OAAO,GAAO,IAAM,EAAU,SAAS,EAAQ,CAAC;;CAEzE,GAAG,GAAO,GAAS;AACf,SAAO,KAAK,SAAS,OAAO,GAAO,IAAO,EAAU,SAAS,EAAQ,CAAC;;CAE1E,SAAS,GAAM,GAAO,GAAW,GAAS;AACtC,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CACJ,GAAG,KAAK,KAAK,QACb;IACI;IACA;IACA;IACA,SAAS,EAAU,SAAS,EAAQ;IACvC,CACJ;GACJ,CAAC;;CAEN,UAAU,GAAO;AACb,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAM;GACvC,CAAC;;CAEN,IAAI,GAAS;AACT,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,SAAS,GAAS;AACd,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO;GACP,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,SAAS,GAAS;AACd,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO;GACP,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,YAAY,GAAS;AACjB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO;GACP,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,YAAY,GAAS;AACjB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO;GACP,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,WAAW,GAAO,GAAS;AACvB,SAAO,KAAK,UAAU;GAClB,MAAM;GACC;GACP,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,OAAO,GAAS;AACZ,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,KAAK,GAAS;AACV,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,WAAW;GACX,OAAO;GACP,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC,CAAC,UAAU;GACT,MAAM;GACN,WAAW;GACX;GACA,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,IAAI,WAAW;EACX,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO;;CAEX,IAAI,WAAW;EACX,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO;;CAEX,IAAI,QAAQ;AACR,SAAO,CAAC,CAAC,KAAK,KAAK,OAAO,MAAM,MAAO,EAAG,SAAS,SAAU,EAAG,SAAS,gBAAgB,EAAK,UAAU,EAAG,MAAM,CAAE;;CAEvH,IAAI,WAAW;EACX,IAAI,IAAM,MACN,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,KAAI,EAAG,SAAS,YAAY,EAAG,SAAS,SAAS,EAAG,SAAS,aACzD,QAAO;OAEF,EAAG,SAAS,SACb,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG,SAER,EAAG,SAAS,UACb,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO,OAAO,SAAS,EAAI,IAAI,OAAO,SAAS,EAAI;;;AAG3D,GAAU,UAAU,MACT,IAAI,GAAU;CACjB,QAAQ,EAAE;CACV,UAAU,EAAsB;CAChC,QAAQ,GAAQ,UAAU;CAC1B,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,MAAa,UAAkB,EAAQ;CACnC,cAAc;AAGV,EAFA,MAAM,GAAG,UAAU,EACnB,KAAK,MAAM,KAAK,KAChB,KAAK,MAAM,KAAK;;CAEpB,OAAO,GAAO;AACV,MAAI,KAAK,KAAK,OACV,KAAI;AACA,KAAM,OAAO,OAAO,EAAM,KAAK;UAE7B;AACF,UAAO,KAAK,iBAAiB,EAAM;;AAI3C,MADmB,KAAK,SAAS,EAAM,KACpB,EAAc,OAC7B,QAAO,KAAK,iBAAiB,EAAM;EAEvC,IAAI,GACE,IAAS,IAAI,GAAa;AAChC,OAAK,IAAM,KAAS,KAAK,KAAK,OAC1B,CAAI,EAAM,SAAS,SACE,EAAM,YAAY,EAAM,OAAO,EAAM,QAAQ,EAAM,QAAQ,EAAM,WAE9E,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,MAAM;GACN,SAAS,EAAM;GACf,WAAW,EAAM;GACjB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,SACL,EAAM,YAAY,EAAM,OAAO,EAAM,QAAQ,EAAM,QAAQ,EAAM,WAE5E,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,MAAM;GACN,SAAS,EAAM;GACf,WAAW,EAAM;GACjB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,eAChB,EAAM,OAAO,EAAM,UAAU,OAAO,EAAE,KACtC,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,YAAY,EAAM;GAClB,SAAS,EAAM;GAClB,CAAC,EACF,EAAO,OAAO,IAIlB,EAAK,YAAY,EAAM;AAG/B,SAAO;GAAE,QAAQ,EAAO;GAAO,OAAO,EAAM;GAAM;;CAEtD,iBAAiB,GAAO;EACpB,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,SALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;;CAEX,IAAI,GAAO,GAAS;AAChB,SAAO,KAAK,SAAS,OAAO,GAAO,IAAM,EAAU,SAAS,EAAQ,CAAC;;CAEzE,GAAG,GAAO,GAAS;AACf,SAAO,KAAK,SAAS,OAAO,GAAO,IAAO,EAAU,SAAS,EAAQ,CAAC;;CAE1E,IAAI,GAAO,GAAS;AAChB,SAAO,KAAK,SAAS,OAAO,GAAO,IAAM,EAAU,SAAS,EAAQ,CAAC;;CAEzE,GAAG,GAAO,GAAS;AACf,SAAO,KAAK,SAAS,OAAO,GAAO,IAAO,EAAU,SAAS,EAAQ,CAAC;;CAE1E,SAAS,GAAM,GAAO,GAAW,GAAS;AACtC,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CACJ,GAAG,KAAK,KAAK,QACb;IACI;IACA;IACA;IACA,SAAS,EAAU,SAAS,EAAQ;IACvC,CACJ;GACJ,CAAC;;CAEN,UAAU,GAAO;AACb,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAM;GACvC,CAAC;;CAEN,SAAS,GAAS;AACd,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO,OAAO,EAAE;GAChB,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,SAAS,GAAS;AACd,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO,OAAO,EAAE;GAChB,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,YAAY,GAAS;AACjB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO,OAAO,EAAE;GAChB,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,YAAY,GAAS;AACjB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO,OAAO,EAAE;GAChB,WAAW;GACX,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,WAAW,GAAO,GAAS;AACvB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN;GACA,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,IAAI,WAAW;EACX,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO;;CAEX,IAAI,WAAW;EACX,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO;;;AAGf,GAAU,UAAU,MACT,IAAI,GAAU;CACjB,QAAQ,EAAE;CACV,UAAU,EAAsB;CAChC,QAAQ,GAAQ,UAAU;CAC1B,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAgC,EAAQ;CACpC,OAAO,GAAO;AAKV,MAJI,KAAK,KAAK,WACV,EAAM,OAAO,EAAQ,EAAM,OAEZ,KAAK,SAAS,EAAM,KACpB,EAAc,SAAS;GACtC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;AAEX,SAAO,EAAG,EAAM,KAAK;;;AAG7B,GAAW,UAAU,MACV,IAAI,GAAW;CAClB,UAAU,EAAsB;CAChC,QAAQ,GAAQ,UAAU;CAC1B,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,MAAa,UAAgB,EAAQ;CACjC,OAAO,GAAO;AAKV,MAJI,KAAK,KAAK,WACV,EAAM,OAAO,IAAI,KAAK,EAAM,KAAK,GAElB,KAAK,SAAS,EAAM,KACpB,EAAc,MAAM;GACnC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;AAEX,MAAI,OAAO,MAAM,EAAM,KAAK,SAAS,CAAC,CAKlC,QAHA,EADY,KAAK,gBAAgB,EAAM,EAChB,EACnB,MAAM,EAAa,cACtB,CAAC,EACK;EAEX,IAAM,IAAS,IAAI,GAAa,EAC5B;AACJ,OAAK,IAAM,KAAS,KAAK,KAAK,OAC1B,CAAI,EAAM,SAAS,QACX,EAAM,KAAK,SAAS,GAAG,EAAM,UAC7B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAM;GACf,WAAW;GACX,OAAO;GACP,SAAS,EAAM;GACf,MAAM;GACT,CAAC,EACF,EAAO,OAAO,IAGb,EAAM,SAAS,QAChB,EAAM,KAAK,SAAS,GAAG,EAAM,UAC7B,IAAM,KAAK,gBAAgB,GAAO,EAAI,EACtC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAM;GACf,WAAW;GACX,OAAO;GACP,SAAS,EAAM;GACf,MAAM;GACT,CAAC,EACF,EAAO,OAAO,IAIlB,EAAK,YAAY,EAAM;AAG/B,SAAO;GACH,QAAQ,EAAO;GACf,OAAO,IAAI,KAAK,EAAM,KAAK,SAAS,CAAC;GACxC;;CAEL,UAAU,GAAO;AACb,SAAO,IAAI,EAAQ;GACf,GAAG,KAAK;GACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAM;GACvC,CAAC;;CAEN,IAAI,GAAS,GAAS;AAClB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO,EAAQ,SAAS;GACxB,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,IAAI,GAAS,GAAS;AAClB,SAAO,KAAK,UAAU;GAClB,MAAM;GACN,OAAO,EAAQ,SAAS;GACxB,SAAS,EAAU,SAAS,EAAQ;GACvC,CAAC;;CAEN,IAAI,UAAU;EACV,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO,KAAO,OAAuB,OAAhB,IAAI,KAAK,EAAI;;CAEtC,IAAI,UAAU;EACV,IAAI,IAAM;AACV,OAAK,IAAM,KAAM,KAAK,KAAK,OACvB,CAAI,EAAG,SAAS,UACR,MAAQ,QAAQ,EAAG,QAAQ,OAC3B,IAAM,EAAG;AAGrB,SAAO,KAAO,OAAuB,OAAhB,IAAI,KAAK,EAAI;;;AAG1C,GAAQ,UAAU,MACP,IAAI,GAAQ;CACf,QAAQ,EAAE;CACV,QAAQ,GAAQ,UAAU;CAC1B,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA+B,EAAQ;CACnC,OAAO,GAAO;AAEV,MADmB,KAAK,SAAS,EAAM,KACpB,EAAc,QAAQ;GACrC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;AAEX,SAAO,EAAG,EAAM,KAAK;;;AAG7B,GAAU,UAAU,MACT,IAAI,GAAU;CACjB,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAkC,EAAQ;CACtC,OAAO,GAAO;AAEV,MADmB,KAAK,SAAS,EAAM,KACpB,EAAc,WAAW;GACxC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;AAEX,SAAO,EAAG,EAAM,KAAK;;;AAG7B,GAAa,UAAU,MACZ,IAAI,GAAa;CACpB,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA6B,EAAQ;CACjC,OAAO,GAAO;AAEV,MADmB,KAAK,SAAS,EAAM,KACpB,EAAc,MAAM;GACnC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;AAEX,SAAO,EAAG,EAAM,KAAK;;;AAG7B,GAAQ,UAAU,MACP,IAAI,GAAQ;CACf,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA4B,EAAQ;CAChC,cAAc;AAGV,EAFA,MAAM,GAAG,UAAU,EAEnB,KAAK,OAAO;;CAEhB,OAAO,GAAO;AACV,SAAO,EAAG,EAAM,KAAK;;;AAG7B,GAAO,UAAU,MACN,IAAI,GAAO;CACd,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAgC,EAAQ;CACpC,cAAc;AAGV,EAFA,MAAM,GAAG,UAAU,EAEnB,KAAK,WAAW;;CAEpB,OAAO,GAAO;AACV,SAAO,EAAG,EAAM,KAAK;;;AAG7B,GAAW,UAAU,MACV,IAAI,GAAW;CAClB,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA8B,EAAQ;CAClC,OAAO,GAAO;EACV,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,SALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;;;AAGf,GAAS,UAAU,MACR,IAAI,GAAS;CAChB,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA6B,EAAQ;CACjC,OAAO,GAAO;AAEV,MADmB,KAAK,SAAS,EAAM,KACpB,EAAc,WAAW;GACxC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;AAEX,SAAO,EAAG,EAAM,KAAK;;;AAG7B,GAAQ,UAAU,MACP,IAAI,GAAQ;CACf,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,MAAa,UAAiB,EAAQ;CAClC,OAAO,GAAO;EACV,IAAM,EAAE,QAAK,cAAW,KAAK,oBAAoB,EAAM,EACjD,IAAM,KAAK;AACjB,MAAI,EAAI,eAAe,EAAc,MAMjC,QALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;AAEX,MAAI,EAAI,gBAAgB,MAAM;GAC1B,IAAM,IAAS,EAAI,KAAK,SAAS,EAAI,YAAY,OAC3C,IAAW,EAAI,KAAK,SAAS,EAAI,YAAY;AACnD,IAAI,KAAU,OACV,EAAkB,GAAK;IACnB,MAAM,IAAS,EAAa,UAAU,EAAa;IACnD,SAAU,IAAW,EAAI,YAAY,QAAQ,KAAA;IAC7C,SAAU,IAAS,EAAI,YAAY,QAAQ,KAAA;IAC3C,MAAM;IACN,WAAW;IACX,OAAO;IACP,SAAS,EAAI,YAAY;IAC5B,CAAC,EACF,EAAO,OAAO;;AA6BtB,MA1BI,EAAI,cAAc,QACd,EAAI,KAAK,SAAS,EAAI,UAAU,UAChC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAI,UAAU;GACvB,MAAM;GACN,WAAW;GACX,OAAO;GACP,SAAS,EAAI,UAAU;GAC1B,CAAC,EACF,EAAO,OAAO,GAGlB,EAAI,cAAc,QACd,EAAI,KAAK,SAAS,EAAI,UAAU,UAChC,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAI,UAAU;GACvB,MAAM;GACN,WAAW;GACX,OAAO;GACP,SAAS,EAAI,UAAU;GAC1B,CAAC,EACF,EAAO,OAAO,GAGlB,EAAI,OAAO,MACX,QAAO,QAAQ,IAAI,CAAC,GAAG,EAAI,KAAK,CAAC,KAAK,GAAM,MACjC,EAAI,KAAK,YAAY,IAAI,GAAmB,GAAK,GAAM,EAAI,MAAM,EAAE,CAAC,CAC7E,CAAC,CAAC,MAAM,MACC,EAAY,WAAW,GAAQ,EAAO,CAC/C;EAEN,IAAM,IAAS,CAAC,GAAG,EAAI,KAAK,CAAC,KAAK,GAAM,MAC7B,EAAI,KAAK,WAAW,IAAI,GAAmB,GAAK,GAAM,EAAI,MAAM,EAAE,CAAC,CAC5E;AACF,SAAO,EAAY,WAAW,GAAQ,EAAO;;CAEjD,IAAI,UAAU;AACV,SAAO,KAAK,KAAK;;CAErB,IAAI,GAAW,GAAS;AACpB,SAAO,IAAI,EAAS;GAChB,GAAG,KAAK;GACR,WAAW;IAAE,OAAO;IAAW,SAAS,EAAU,SAAS,EAAQ;IAAE;GACxE,CAAC;;CAEN,IAAI,GAAW,GAAS;AACpB,SAAO,IAAI,EAAS;GAChB,GAAG,KAAK;GACR,WAAW;IAAE,OAAO;IAAW,SAAS,EAAU,SAAS,EAAQ;IAAE;GACxE,CAAC;;CAEN,OAAO,GAAK,GAAS;AACjB,SAAO,IAAI,EAAS;GAChB,GAAG,KAAK;GACR,aAAa;IAAE,OAAO;IAAK,SAAS,EAAU,SAAS,EAAQ;IAAE;GACpE,CAAC;;CAEN,SAAS,GAAS;AACd,SAAO,KAAK,IAAI,GAAG,EAAQ;;;AAGnC,GAAS,UAAU,GAAQ,MAChB,IAAI,GAAS;CAChB,MAAM;CACN,WAAW;CACX,WAAW;CACX,aAAa;CACb,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,SAAS,GAAe,GAAQ;AAC5B,KAAI,aAAkB,IAAW;EAC7B,IAAM,IAAW,EAAE;AACnB,OAAK,IAAM,KAAO,EAAO,OAAO;GAC5B,IAAM,IAAc,EAAO,MAAM;AACjC,KAAS,KAAO,GAAY,OAAO,GAAe,EAAY,CAAC;;AAEnE,SAAO,IAAI,GAAU;GACjB,GAAG,EAAO;GACV,aAAa;GAChB,CAAC;YAEG,aAAkB,GACvB,QAAO,IAAI,GAAS;EAChB,GAAG,EAAO;EACV,MAAM,GAAe,EAAO,QAAQ;EACvC,CAAC;UAEG,aAAkB,GACvB,QAAO,GAAY,OAAO,GAAe,EAAO,QAAQ,CAAC,CAAC;UAErD,aAAkB,GACvB,QAAO,GAAY,OAAO,GAAe,EAAO,QAAQ,CAAC,CAAC;UAErD,aAAkB,GACvB,QAAO,GAAS,OAAO,EAAO,MAAM,KAAK,MAAS,GAAe,EAAK,CAAC,CAAC;KAGxE,QAAO;;AAGf,IAAa,KAAb,MAAa,UAAkB,EAAQ;CACnC,cAAc;AA4CV,EA3CA,MAAM,GAAG,UAAU,EACnB,KAAK,UAAU,MAKf,KAAK,YAAY,KAAK,aAqCtB,KAAK,UAAU,KAAK;;CAExB,aAAa;AACT,MAAI,KAAK,YAAY,KACjB,QAAO,KAAK;EAChB,IAAM,IAAQ,KAAK,KAAK,OAAO;AAG/B,SADA,KAAK,UAAU;GAAE;GAAO,MADX,EAAK,WAAW,EAAM;GACL,EACvB,KAAK;;CAEhB,OAAO,GAAO;AAEV,MADmB,KAAK,SAAS,EAAM,KACpB,EAAc,QAAQ;GACrC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;EAEX,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM,EACjD,EAAE,UAAO,MAAM,MAAc,KAAK,YAAY,EAC9C,IAAY,EAAE;AACpB,MAAI,EAAE,KAAK,KAAK,oBAAoB,MAAY,KAAK,KAAK,gBAAgB,eACjE,IAAM,KAAO,EAAI,KAClB,CAAK,EAAU,SAAS,EAAI,IACxB,EAAU,KAAK,EAAI;EAI/B,IAAM,IAAQ,EAAE;AAChB,OAAK,IAAM,KAAO,GAAW;GACzB,IAAM,IAAe,EAAM,IACrB,IAAQ,EAAI,KAAK;AACvB,KAAM,KAAK;IACP,KAAK;KAAE,QAAQ;KAAS,OAAO;KAAK;IACpC,OAAO,EAAa,OAAO,IAAI,GAAmB,GAAK,GAAO,EAAI,MAAM,EAAI,CAAC;IAC7E,WAAW,KAAO,EAAI;IACzB,CAAC;;AAEN,MAAI,KAAK,KAAK,oBAAoB,IAAU;GACxC,IAAM,IAAc,KAAK,KAAK;AAC9B,OAAI,MAAgB,cAChB,MAAK,IAAM,KAAO,EACd,GAAM,KAAK;IACP,KAAK;KAAE,QAAQ;KAAS,OAAO;KAAK;IACpC,OAAO;KAAE,QAAQ;KAAS,OAAO,EAAI,KAAK;KAAM;IACnD,CAAC;YAGD,MAAgB,UACjB,EAAU,SAAS,MACnB,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,MAAM;IACT,CAAC,EACF,EAAO,OAAO;YAGb,MAAgB,QAGrB,OAAU,MAAM,uDAAuD;SAG1E;GAED,IAAM,IAAW,KAAK,KAAK;AAC3B,QAAK,IAAM,KAAO,GAAW;IACzB,IAAM,IAAQ,EAAI,KAAK;AACvB,MAAM,KAAK;KACP,KAAK;MAAE,QAAQ;MAAS,OAAO;MAAK;KACpC,OAAO,EAAS,OAAO,IAAI,GAAmB,GAAK,GAAO,EAAI,MAAM,EAAI,CACvE;KACD,WAAW,KAAO,EAAI;KACzB,CAAC;;;AAuBN,SApBA,EAAI,OAAO,QACJ,QAAQ,SAAS,CACnB,KAAK,YAAY;GAClB,IAAM,IAAY,EAAE;AACpB,QAAK,IAAM,KAAQ,GAAO;IACtB,IAAM,IAAM,MAAM,EAAK,KACjB,IAAQ,MAAM,EAAK;AACzB,MAAU,KAAK;KACX;KACA;KACA,WAAW,EAAK;KACnB,CAAC;;AAEN,UAAO;IACT,CACG,MAAM,MACA,EAAY,gBAAgB,GAAQ,EAAU,CACvD,GAGK,EAAY,gBAAgB,GAAQ,EAAM;;CAGzD,IAAI,QAAQ;AACR,SAAO,KAAK,KAAK,OAAO;;CAE5B,OAAO,GAAS;AAEZ,SADA,EAAU,UACH,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,aAAa;GACb,GAAI,MAAY,KAAA,IAaV,EAAE,GAZF,EACE,WAAW,GAAO,MAAQ;IACtB,IAAM,IAAe,KAAK,KAAK,WAAW,GAAO,EAAI,CAAC,WAAW,EAAI;AAKrE,WAJI,EAAM,SAAS,sBACR,EACH,SAAS,EAAU,SAAS,EAAQ,CAAC,WAAW,GACnD,GACE,EACH,SAAS,GACZ;MAER;GAER,CAAC;;CAEN,QAAQ;AACJ,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,aAAa;GAChB,CAAC;;CAEN,cAAc;AACV,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,aAAa;GAChB,CAAC;;CAmBN,OAAO,GAAc;AACjB,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,cAAc;IACV,GAAG,KAAK,KAAK,OAAO;IACpB,GAAG;IACN;GACJ,CAAC;;CAON,MAAM,GAAS;AAUX,SATe,IAAI,EAAU;GACzB,aAAa,EAAQ,KAAK;GAC1B,UAAU,EAAQ,KAAK;GACvB,cAAc;IACV,GAAG,KAAK,KAAK,OAAO;IACpB,GAAG,EAAQ,KAAK,OAAO;IAC1B;GACD,UAAU,EAAsB;GACnC,CAAC;;CAsCN,OAAO,GAAK,GAAQ;AAChB,SAAO,KAAK,QAAQ,GAAG,IAAM,GAAQ,CAAC;;CAuB1C,SAAS,GAAO;AACZ,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,UAAU;GACb,CAAC;;CAEN,KAAK,GAAM;EACP,IAAM,IAAQ,EAAE;AAChB,OAAK,IAAM,KAAO,EAAK,WAAW,EAAK,CACnC,CAAI,EAAK,MAAQ,KAAK,MAAM,OACxB,EAAM,KAAO,KAAK,MAAM;AAGhC,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,aAAa;GAChB,CAAC;;CAEN,KAAK,GAAM;EACP,IAAM,IAAQ,EAAE;AAChB,OAAK,IAAM,KAAO,EAAK,WAAW,KAAK,MAAM,CACzC,CAAK,EAAK,OACN,EAAM,KAAO,KAAK,MAAM;AAGhC,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,aAAa;GAChB,CAAC;;CAKN,cAAc;AACV,SAAO,GAAe,KAAK;;CAE/B,QAAQ,GAAM;EACV,IAAM,IAAW,EAAE;AACnB,OAAK,IAAM,KAAO,EAAK,WAAW,KAAK,MAAM,EAAE;GAC3C,IAAM,IAAc,KAAK,MAAM;AAC/B,GAAI,KAAQ,CAAC,EAAK,KACd,EAAS,KAAO,IAGhB,EAAS,KAAO,EAAY,UAAU;;AAG9C,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,aAAa;GAChB,CAAC;;CAEN,SAAS,GAAM;EACX,IAAM,IAAW,EAAE;AACnB,OAAK,IAAM,KAAO,EAAK,WAAW,KAAK,MAAM,CACzC,KAAI,KAAQ,CAAC,EAAK,GACd,GAAS,KAAO,KAAK,MAAM;OAE1B;GAED,IAAI,IADgB,KAAK,MAAM;AAE/B,UAAO,aAAoB,IACvB,KAAW,EAAS,KAAK;AAE7B,KAAS,KAAO;;AAGxB,SAAO,IAAI,EAAU;GACjB,GAAG,KAAK;GACR,aAAa;GAChB,CAAC;;CAEN,QAAQ;AACJ,SAAO,GAAc,EAAK,WAAW,KAAK,MAAM,CAAC;;;AAGzD,GAAU,UAAU,GAAO,MAChB,IAAI,GAAU;CACjB,aAAa;CACb,aAAa;CACb,UAAU,GAAS,QAAQ;CAC3B,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC,EAEN,GAAU,gBAAgB,GAAO,MACtB,IAAI,GAAU;CACjB,aAAa;CACb,aAAa;CACb,UAAU,GAAS,QAAQ;CAC3B,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC,EAEN,GAAU,cAAc,GAAO,MACpB,IAAI,GAAU;CACjB;CACA,aAAa;CACb,UAAU,GAAS,QAAQ;CAC3B,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA8B,EAAQ;CAClC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM,EACzC,IAAU,KAAK,KAAK;EAC1B,SAAS,EAAc,GAAS;AAE5B,QAAK,IAAM,KAAU,EACjB,KAAI,EAAO,OAAO,WAAW,QACzB,QAAO,EAAO;AAGtB,QAAK,IAAM,KAAU,EACjB,KAAI,EAAO,OAAO,WAAW,QAGzB,QADA,EAAI,OAAO,OAAO,KAAK,GAAG,EAAO,IAAI,OAAO,OAAO,EAC5C,EAAO;GAItB,IAAM,IAAc,EAAQ,KAAK,MAAW,IAAI,GAAS,EAAO,IAAI,OAAO,OAAO,CAAC;AAKnF,UAJA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB;IACH,CAAC,EACK;;AAEX,MAAI,EAAI,OAAO,MACX,QAAO,QAAQ,IAAI,EAAQ,IAAI,OAAO,MAAW;GAC7C,IAAM,IAAW;IACb,GAAG;IACH,QAAQ;KACJ,GAAG,EAAI;KACP,QAAQ,EAAE;KACb;IACD,QAAQ;IACX;AACD,UAAO;IACH,QAAQ,MAAM,EAAO,YAAY;KAC7B,MAAM,EAAI;KACV,MAAM,EAAI;KACV,QAAQ;KACX,CAAC;IACF,KAAK;IACR;IACH,CAAC,CAAC,KAAK,EAAc;EAEtB;GACD,IAAI,GACE,IAAS,EAAE;AACjB,QAAK,IAAM,KAAU,GAAS;IAC1B,IAAM,IAAW;KACb,GAAG;KACH,QAAQ;MACJ,GAAG,EAAI;MACP,QAAQ,EAAE;MACb;KACD,QAAQ;KACX,EACK,IAAS,EAAO,WAAW;KAC7B,MAAM,EAAI;KACV,MAAM,EAAI;KACV,QAAQ;KACX,CAAC;AACF,QAAI,EAAO,WAAW,QAClB,QAAO;AAKX,IAHS,EAAO,WAAW,WAAW,CAAC,MACnC,IAAQ;KAAE;KAAQ,KAAK;KAAU,GAEjC,EAAS,OAAO,OAAO,UACvB,EAAO,KAAK,EAAS,OAAO,OAAO;;AAG3C,OAAI,EAEA,QADA,EAAI,OAAO,OAAO,KAAK,GAAG,EAAM,IAAI,OAAO,OAAO,EAC3C,EAAM;GAEjB,IAAM,IAAc,EAAO,KAAK,MAAW,IAAI,GAAS,EAAO,CAAC;AAKhE,UAJA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB;IACH,CAAC,EACK;;;CAGf,IAAI,UAAU;AACV,SAAO,KAAK,KAAK;;;AAGzB,GAAS,UAAU,GAAO,MACf,IAAI,GAAS;CAChB,SAAS;CACT,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AASN,IAAM,MAAoB,MAClB,aAAgB,KACT,GAAiB,EAAK,OAAO,GAE/B,aAAgB,KACd,GAAiB,EAAK,WAAW,CAAC,GAEpC,aAAgB,KACd,CAAC,EAAK,MAAM,GAEd,aAAgB,KACd,EAAK,UAEP,aAAgB,KAEd,EAAK,aAAa,EAAK,KAAK,GAE9B,aAAgB,KACd,GAAiB,EAAK,KAAK,UAAU,GAEvC,aAAgB,KACd,CAAC,KAAA,EAAU,GAEb,aAAgB,KACd,CAAC,KAAK,GAER,aAAgB,KACd,CAAC,KAAA,GAAW,GAAG,GAAiB,EAAK,QAAQ,CAAC,CAAC,GAEjD,aAAgB,KACd,CAAC,MAAM,GAAG,GAAiB,EAAK,QAAQ,CAAC,CAAC,GAE5C,aAAgB,MAGhB,aAAgB,KAFd,GAAiB,EAAK,QAAQ,CAAC,GAKjC,aAAgB,KACd,GAAiB,EAAK,KAAK,UAAU,GAGrC,EAAE,EAGJ,KAAb,MAAa,UAA8B,EAAQ;CAC/C,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM;AAC/C,MAAI,EAAI,eAAe,EAAc,OAMjC,QALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;EAEX,IAAM,IAAgB,KAAK,eACrB,IAAqB,EAAI,KAAK,IAC9B,IAAS,KAAK,WAAW,IAAI,EAAmB;AAiBlD,SAhBC,IAQD,EAAI,OAAO,QACJ,EAAO,YAAY;GACtB,MAAM,EAAI;GACV,MAAM,EAAI;GACV,QAAQ;GACX,CAAC,GAGK,EAAO,WAAW;GACrB,MAAM,EAAI;GACV,MAAM,EAAI;GACV,QAAQ;GACX,CAAC,IAnBF,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,MAAM,KAAK,KAAK,WAAW,MAAM,CAAC;GAC3C,MAAM,CAAC,EAAc;GACxB,CAAC,EACK;;CAiBf,IAAI,gBAAgB;AAChB,SAAO,KAAK,KAAK;;CAErB,IAAI,UAAU;AACV,SAAO,KAAK,KAAK;;CAErB,IAAI,aAAa;AACb,SAAO,KAAK,KAAK;;CAUrB,OAAO,OAAO,GAAe,GAAS,GAAQ;EAE1C,IAAM,oBAAa,IAAI,KAAK;AAE5B,OAAK,IAAM,KAAQ,GAAS;GACxB,IAAM,IAAsB,GAAiB,EAAK,MAAM,GAAe;AACvE,OAAI,CAAC,EAAoB,OACrB,OAAU,MAAM,mCAAmC,EAAc,mDAAmD;AAExH,QAAK,IAAM,KAAS,GAAqB;AACrC,QAAI,EAAW,IAAI,EAAM,CACrB,OAAU,MAAM,0BAA0B,OAAO,EAAc,CAAC,uBAAuB,OAAO,EAAM,GAAG;AAE3G,MAAW,IAAI,GAAO,EAAK;;;AAGnC,SAAO,IAAI,EAAsB;GAC7B,UAAU,EAAsB;GAChC;GACA;GACA;GACA,GAAG,EAAoB,EAAO;GACjC,CAAC;;;AAGV,SAAS,GAAY,GAAG,GAAG;CACvB,IAAM,IAAQ,GAAc,EAAE,EACxB,IAAQ,GAAc,EAAE;AAC9B,KAAI,MAAM,EACN,QAAO;EAAE,OAAO;EAAM,MAAM;EAAG;KAE1B,MAAU,EAAc,UAAU,MAAU,EAAc,QAAQ;EACvE,IAAM,IAAQ,EAAK,WAAW,EAAE,EAC1B,IAAa,EAAK,WAAW,EAAE,CAAC,QAAQ,MAAQ,EAAM,QAAQ,EAAI,KAAK,GAAG,EAC1E,IAAS;GAAE,GAAG;GAAG,GAAG;GAAG;AAC7B,OAAK,IAAM,KAAO,GAAY;GAC1B,IAAM,IAAc,GAAY,EAAE,IAAM,EAAE,GAAK;AAC/C,OAAI,CAAC,EAAY,MACb,QAAO,EAAE,OAAO,IAAO;AAE3B,KAAO,KAAO,EAAY;;AAE9B,SAAO;GAAE,OAAO;GAAM,MAAM;GAAQ;YAE/B,MAAU,EAAc,SAAS,MAAU,EAAc,OAAO;AACrE,MAAI,EAAE,WAAW,EAAE,OACf,QAAO,EAAE,OAAO,IAAO;EAE3B,IAAM,IAAW,EAAE;AACnB,OAAK,IAAI,IAAQ,GAAG,IAAQ,EAAE,QAAQ,KAAS;GAC3C,IAAM,IAAQ,EAAE,IACV,IAAQ,EAAE,IACV,IAAc,GAAY,GAAO,EAAM;AAC7C,OAAI,CAAC,EAAY,MACb,QAAO,EAAE,OAAO,IAAO;AAE3B,KAAS,KAAK,EAAY,KAAK;;AAEnC,SAAO;GAAE,OAAO;GAAM,MAAM;GAAU;YAEjC,MAAU,EAAc,QAAQ,MAAU,EAAc,QAAQ,CAAC,KAAM,CAAC,EAC7E,QAAO;EAAE,OAAO;EAAM,MAAM;EAAG;KAG/B,QAAO,EAAE,OAAO,IAAO;;AAG/B,IAAa,KAAb,cAAqC,EAAQ;CACzC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM,EACjD,KAAgB,GAAY,MAAgB;AAC9C,OAAI,GAAU,EAAW,IAAI,GAAU,EAAY,CAC/C,QAAO;GAEX,IAAM,IAAS,GAAY,EAAW,OAAO,EAAY,MAAM;AAU/D,UATK,EAAO,UAMR,GAAQ,EAAW,IAAI,GAAQ,EAAY,KAC3C,EAAO,OAAO,EAEX;IAAE,QAAQ,EAAO;IAAO,OAAO,EAAO;IAAM,KAR/C,EAAkB,GAAK,EACnB,MAAM,EAAa,4BACtB,CAAC,EACK;;AAsBX,SAfA,EAAI,OAAO,QACJ,QAAQ,IAAI,CACf,KAAK,KAAK,KAAK,YAAY;GACvB,MAAM,EAAI;GACV,MAAM,EAAI;GACV,QAAQ;GACX,CAAC,EACF,KAAK,KAAK,MAAM,YAAY;GACxB,MAAM,EAAI;GACV,MAAM,EAAI;GACV,QAAQ;GACX,CAAC,CACL,CAAC,CAAC,MAAM,CAAC,GAAM,OAAW,EAAa,GAAM,EAAM,CAAC,GAG9C,EAAa,KAAK,KAAK,KAAK,WAAW;GAC1C,MAAM,EAAI;GACV,MAAM,EAAI;GACV,QAAQ;GACX,CAAC,EAAE,KAAK,KAAK,MAAM,WAAW;GAC3B,MAAM,EAAI;GACV,MAAM,EAAI;GACV,QAAQ;GACX,CAAC,CAAC;;;AAIf,GAAgB,UAAU,GAAM,GAAO,MAC5B,IAAI,GAAgB;CACjB;CACC;CACP,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAGN,IAAa,KAAb,MAAa,UAAiB,EAAQ;CAClC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM;AACvD,MAAI,EAAI,eAAe,EAAc,MAMjC,QALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;AAEX,MAAI,EAAI,KAAK,SAAS,KAAK,KAAK,MAAM,OAQlC,QAPA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,KAAK,KAAK,MAAM;GACzB,WAAW;GACX,OAAO;GACP,MAAM;GACT,CAAC,EACK;AAGX,EAAI,CADS,KAAK,KAAK,QACV,EAAI,KAAK,SAAS,KAAK,KAAK,MAAM,WAC3C,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,KAAK,KAAK,MAAM;GACzB,WAAW;GACX,OAAO;GACP,MAAM;GACT,CAAC,EACF,EAAO,OAAO;EAElB,IAAM,IAAQ,CAAC,GAAG,EAAI,KAAK,CACtB,KAAK,GAAM,MAAc;GAC1B,IAAM,IAAS,KAAK,KAAK,MAAM,MAAc,KAAK,KAAK;AAGvD,UAFK,IAEE,EAAO,OAAO,IAAI,GAAmB,GAAK,GAAM,EAAI,MAAM,EAAU,CAAC,GADjE;IAEb,CACG,QAAQ,MAAM,CAAC,CAAC,EAAE;AAOnB,SANA,EAAI,OAAO,QACJ,QAAQ,IAAI,EAAM,CAAC,MAAM,MACrB,EAAY,WAAW,GAAQ,EAAQ,CAChD,GAGK,EAAY,WAAW,GAAQ,EAAM;;CAGpD,IAAI,QAAQ;AACR,SAAO,KAAK,KAAK;;CAErB,KAAK,GAAM;AACP,SAAO,IAAI,EAAS;GAChB,GAAG,KAAK;GACR;GACH,CAAC;;;AAGV,GAAS,UAAU,GAAS,MAAW;AACnC,KAAI,CAAC,MAAM,QAAQ,EAAQ,CACvB,OAAU,MAAM,wDAAwD;AAE5E,QAAO,IAAI,GAAS;EAChB,OAAO;EACP,UAAU,EAAsB;EAChC,MAAM;EACN,GAAG,EAAoB,EAAO;EACjC,CAAC;;AAEN,IAAa,KAAb,MAAa,UAAkB,EAAQ;CACnC,IAAI,YAAY;AACZ,SAAO,KAAK,KAAK;;CAErB,IAAI,cAAc;AACd,SAAO,KAAK,KAAK;;CAErB,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM;AACvD,MAAI,EAAI,eAAe,EAAc,OAMjC,QALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;EAEX,IAAM,IAAQ,EAAE,EACV,IAAU,KAAK,KAAK,SACpB,IAAY,KAAK,KAAK;AAC5B,OAAK,IAAM,KAAO,EAAI,KAClB,GAAM,KAAK;GACP,KAAK,EAAQ,OAAO,IAAI,GAAmB,GAAK,GAAK,EAAI,MAAM,EAAI,CAAC;GACpE,OAAO,EAAU,OAAO,IAAI,GAAmB,GAAK,EAAI,KAAK,IAAM,EAAI,MAAM,EAAI,CAAC;GAClF,WAAW,KAAO,EAAI;GACzB,CAAC;AAMF,SAJA,EAAI,OAAO,QACJ,EAAY,iBAAiB,GAAQ,EAAM,GAG3C,EAAY,gBAAgB,GAAQ,EAAM;;CAGzD,IAAI,UAAU;AACV,SAAO,KAAK,KAAK;;CAErB,OAAO,OAAO,GAAO,GAAQ,GAAO;AAShC,SARI,aAAkB,IACX,IAAI,EAAU;GACjB,SAAS;GACT,WAAW;GACX,UAAU,EAAsB;GAChC,GAAG,EAAoB,EAAM;GAChC,CAAC,GAEC,IAAI,EAAU;GACjB,SAAS,GAAU,QAAQ;GAC3B,WAAW;GACX,UAAU,EAAsB;GAChC,GAAG,EAAoB,EAAO;GACjC,CAAC;;GAGG,KAAb,cAA4B,EAAQ;CAChC,IAAI,YAAY;AACZ,SAAO,KAAK,KAAK;;CAErB,IAAI,cAAc;AACd,SAAO,KAAK,KAAK;;CAErB,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM;AACvD,MAAI,EAAI,eAAe,EAAc,IAMjC,QALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;EAEX,IAAM,IAAU,KAAK,KAAK,SACpB,IAAY,KAAK,KAAK,WACtB,IAAQ,CAAC,GAAG,EAAI,KAAK,SAAS,CAAC,CAAC,KAAK,CAAC,GAAK,IAAQ,OAC9C;GACH,KAAK,EAAQ,OAAO,IAAI,GAAmB,GAAK,GAAK,EAAI,MAAM,CAAC,GAAO,MAAM,CAAC,CAAC;GAC/E,OAAO,EAAU,OAAO,IAAI,GAAmB,GAAK,GAAO,EAAI,MAAM,CAAC,GAAO,QAAQ,CAAC,CAAC;GAC1F,EACH;AACF,MAAI,EAAI,OAAO,OAAO;GAClB,IAAM,oBAAW,IAAI,KAAK;AAC1B,UAAO,QAAQ,SAAS,CAAC,KAAK,YAAY;AACtC,SAAK,IAAM,KAAQ,GAAO;KACtB,IAAM,IAAM,MAAM,EAAK,KACjB,IAAQ,MAAM,EAAK;AACzB,SAAI,EAAI,WAAW,aAAa,EAAM,WAAW,UAC7C,QAAO;AAKX,MAHI,EAAI,WAAW,WAAW,EAAM,WAAW,YAC3C,EAAO,OAAO,EAElB,EAAS,IAAI,EAAI,OAAO,EAAM,MAAM;;AAExC,WAAO;KAAE,QAAQ,EAAO;KAAO,OAAO;KAAU;KAClD;SAED;GACD,IAAM,oBAAW,IAAI,KAAK;AAC1B,QAAK,IAAM,KAAQ,GAAO;IACtB,IAAM,IAAM,EAAK,KACX,IAAQ,EAAK;AACnB,QAAI,EAAI,WAAW,aAAa,EAAM,WAAW,UAC7C,QAAO;AAKX,KAHI,EAAI,WAAW,WAAW,EAAM,WAAW,YAC3C,EAAO,OAAO,EAElB,EAAS,IAAI,EAAI,OAAO,EAAM,MAAM;;AAExC,UAAO;IAAE,QAAQ,EAAO;IAAO,OAAO;IAAU;;;;AAI5D,GAAO,UAAU,GAAS,GAAW,MAC1B,IAAI,GAAO;CACd;CACA;CACA,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,MAAa,UAAe,EAAQ;CAChC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM;AACvD,MAAI,EAAI,eAAe,EAAc,IAMjC,QALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;EAEX,IAAM,IAAM,KAAK;AAcjB,EAbI,EAAI,YAAY,QACZ,EAAI,KAAK,OAAO,EAAI,QAAQ,UAC5B,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAI,QAAQ;GACrB,MAAM;GACN,WAAW;GACX,OAAO;GACP,SAAS,EAAI,QAAQ;GACxB,CAAC,EACF,EAAO,OAAO,GAGlB,EAAI,YAAY,QACZ,EAAI,KAAK,OAAO,EAAI,QAAQ,UAC5B,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,SAAS,EAAI,QAAQ;GACrB,MAAM;GACN,WAAW;GACX,OAAO;GACP,SAAS,EAAI,QAAQ;GACxB,CAAC,EACF,EAAO,OAAO;EAGtB,IAAM,IAAY,KAAK,KAAK;EAC5B,SAAS,EAAY,GAAU;GAC3B,IAAM,oBAAY,IAAI,KAAK;AAC3B,QAAK,IAAM,KAAW,GAAU;AAC5B,QAAI,EAAQ,WAAW,UACnB,QAAO;AAGX,IAFI,EAAQ,WAAW,WACnB,EAAO,OAAO,EAClB,EAAU,IAAI,EAAQ,MAAM;;AAEhC,UAAO;IAAE,QAAQ,EAAO;IAAO,OAAO;IAAW;;EAErD,IAAM,IAAW,CAAC,GAAG,EAAI,KAAK,QAAQ,CAAC,CAAC,KAAK,GAAM,MAAM,EAAU,OAAO,IAAI,GAAmB,GAAK,GAAM,EAAI,MAAM,EAAE,CAAC,CAAC;AAKtH,SAJA,EAAI,OAAO,QACJ,QAAQ,IAAI,EAAS,CAAC,MAAM,MAAa,EAAY,EAAS,CAAC,GAG/D,EAAY,EAAS;;CAGpC,IAAI,GAAS,GAAS;AAClB,SAAO,IAAI,EAAO;GACd,GAAG,KAAK;GACR,SAAS;IAAE,OAAO;IAAS,SAAS,EAAU,SAAS,EAAQ;IAAE;GACpE,CAAC;;CAEN,IAAI,GAAS,GAAS;AAClB,SAAO,IAAI,EAAO;GACd,GAAG,KAAK;GACR,SAAS;IAAE,OAAO;IAAS,SAAS,EAAU,SAAS,EAAQ;IAAE;GACpE,CAAC;;CAEN,KAAK,GAAM,GAAS;AAChB,SAAO,KAAK,IAAI,GAAM,EAAQ,CAAC,IAAI,GAAM,EAAQ;;CAErD,SAAS,GAAS;AACd,SAAO,KAAK,IAAI,GAAG,EAAQ;;;AAGnC,GAAO,UAAU,GAAW,MACjB,IAAI,GAAO;CACd;CACA,SAAS;CACT,SAAS;CACT,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,MAAa,UAAoB,EAAQ;CACrC,cAAc;AAEV,EADA,MAAM,GAAG,UAAU,EACnB,KAAK,WAAW,KAAK;;CAEzB,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM;AAC/C,MAAI,EAAI,eAAe,EAAc,SAMjC,QALA,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK;EAEX,SAAS,EAAc,GAAM,GAAO;AAChC,UAAO,GAAU;IACb,MAAM;IACN,MAAM,EAAI;IACV,WAAW;KAAC,EAAI,OAAO;KAAoB,EAAI;KAAgB,IAAa;KAAEC;KAAgB,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE;IACjH,WAAW;KACP,MAAM,EAAa;KACnB,gBAAgB;KACnB;IACJ,CAAC;;EAEN,SAAS,EAAiB,GAAS,GAAO;AACtC,UAAO,GAAU;IACb,MAAM;IACN,MAAM,EAAI;IACV,WAAW;KAAC,EAAI,OAAO;KAAoB,EAAI;KAAgB,IAAa;KAAEA;KAAgB,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE;IACjH,WAAW;KACP,MAAM,EAAa;KACnB,iBAAiB;KACpB;IACJ,CAAC;;EAEN,IAAM,IAAS,EAAE,UAAU,EAAI,OAAO,oBAAoB,EACpD,IAAK,EAAI;AACf,MAAI,KAAK,KAAK,mBAAmB,IAAY;GAIzC,IAAM,IAAK;AACX,UAAO,EAAG,eAAgB,GAAG,GAAM;IAC/B,IAAM,IAAQ,IAAI,GAAS,EAAE,CAAC,EACxB,IAAa,MAAM,EAAG,KAAK,KAAK,WAAW,GAAM,EAAO,CAAC,OAAO,MAAM;AAExE,WADA,EAAM,SAAS,EAAc,GAAM,EAAE,CAAC,EAChC;MACR,EACI,IAAS,MAAM,QAAQ,MAAM,GAAI,MAAM,EAAW;AAOxD,WANsB,MAAM,EAAG,KAAK,QAAQ,KAAK,KAC5C,WAAW,GAAQ,EAAO,CAC1B,OAAO,MAAM;AAEd,WADA,EAAM,SAAS,EAAiB,GAAQ,EAAE,CAAC,EACrC;MACR;KAEJ;SAED;GAID,IAAM,IAAK;AACX,UAAO,EAAG,SAAU,GAAG,GAAM;IACzB,IAAM,IAAa,EAAG,KAAK,KAAK,UAAU,GAAM,EAAO;AACvD,QAAI,CAAC,EAAW,QACZ,OAAM,IAAI,GAAS,CAAC,EAAc,GAAM,EAAW,MAAM,CAAC,CAAC;IAE/D,IAAM,IAAS,QAAQ,MAAM,GAAI,MAAM,EAAW,KAAK,EACjD,IAAgB,EAAG,KAAK,QAAQ,UAAU,GAAQ,EAAO;AAC/D,QAAI,CAAC,EAAc,QACf,OAAM,IAAI,GAAS,CAAC,EAAiB,GAAQ,EAAc,MAAM,CAAC,CAAC;AAEvE,WAAO,EAAc;KACvB;;;CAGV,aAAa;AACT,SAAO,KAAK,KAAK;;CAErB,aAAa;AACT,SAAO,KAAK,KAAK;;CAErB,KAAK,GAAG,GAAO;AACX,SAAO,IAAI,EAAY;GACnB,GAAG,KAAK;GACR,MAAM,GAAS,OAAO,EAAM,CAAC,KAAK,GAAW,QAAQ,CAAC;GACzD,CAAC;;CAEN,QAAQ,GAAY;AAChB,SAAO,IAAI,EAAY;GACnB,GAAG,KAAK;GACR,SAAS;GACZ,CAAC;;CAEN,UAAU,GAAM;AAEZ,SADsB,KAAK,MAAM,EAAK;;CAG1C,gBAAgB,GAAM;AAElB,SADsB,KAAK,MAAM,EAAK;;CAG1C,OAAO,OAAO,GAAM,GAAS,GAAQ;AACjC,SAAO,IAAI,EAAY;GACnB,MAAO,KAAc,GAAS,OAAO,EAAE,CAAC,CAAC,KAAK,GAAW,QAAQ,CAAC;GAClE,SAAS,KAAW,GAAW,QAAQ;GACvC,UAAU,EAAsB;GAChC,GAAG,EAAoB,EAAO;GACjC,CAAC;;GAGG,KAAb,cAA6B,EAAQ;CACjC,IAAI,SAAS;AACT,SAAO,KAAK,KAAK,QAAQ;;CAE7B,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM;AAE/C,SADmB,KAAK,KAAK,QAAQ,CACnB,OAAO;GAAE,MAAM,EAAI;GAAM,MAAM,EAAI;GAAM,QAAQ;GAAK,CAAC;;;AAGjF,GAAQ,UAAU,GAAQ,MACf,IAAI,GAAQ;CACP;CACR,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAgC,EAAQ;CACpC,OAAO,GAAO;AACV,MAAI,EAAM,SAAS,KAAK,KAAK,OAAO;GAChC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,UAAU,EAAI;IACd,MAAM,EAAa;IACnB,UAAU,KAAK,KAAK;IACvB,CAAC,EACK;;AAEX,SAAO;GAAE,QAAQ;GAAS,OAAO,EAAM;GAAM;;CAEjD,IAAI,QAAQ;AACR,SAAO,KAAK,KAAK;;;AAGzB,GAAW,UAAU,GAAO,MACjB,IAAI,GAAW;CACX;CACP,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,SAAS,GAAc,GAAQ,GAAQ;AACnC,QAAO,IAAI,GAAQ;EACf;EACA,UAAU,EAAsB;EAChC,GAAG,EAAoB,EAAO;EACjC,CAAC;;AAEN,IAAa,KAAb,MAAa,UAAgB,EAAQ;CACjC,OAAO,GAAO;AACV,MAAI,OAAO,EAAM,QAAS,UAAU;GAChC,IAAM,IAAM,KAAK,gBAAgB,EAAM,EACjC,IAAiB,KAAK,KAAK;AAMjC,UALA,EAAkB,GAAK;IACnB,UAAU,EAAK,WAAW,EAAe;IACzC,UAAU,EAAI;IACd,MAAM,EAAa;IACtB,CAAC,EACK;;AAKX,MAHA,AACI,KAAK,WAAS,IAAI,IAAI,KAAK,KAAK,OAAO,EAEvC,CAAC,KAAK,OAAO,IAAI,EAAM,KAAK,EAAE;GAC9B,IAAM,IAAM,KAAK,gBAAgB,EAAM,EACjC,IAAiB,KAAK,KAAK;AAMjC,UALA,EAAkB,GAAK;IACnB,UAAU,EAAI;IACd,MAAM,EAAa;IACnB,SAAS;IACZ,CAAC,EACK;;AAEX,SAAO,EAAG,EAAM,KAAK;;CAEzB,IAAI,UAAU;AACV,SAAO,KAAK,KAAK;;CAErB,IAAI,OAAO;EACP,IAAM,IAAa,EAAE;AACrB,OAAK,IAAM,KAAO,KAAK,KAAK,OACxB,GAAW,KAAO;AAEtB,SAAO;;CAEX,IAAI,SAAS;EACT,IAAM,IAAa,EAAE;AACrB,OAAK,IAAM,KAAO,KAAK,KAAK,OACxB,GAAW,KAAO;AAEtB,SAAO;;CAEX,IAAI,OAAO;EACP,IAAM,IAAa,EAAE;AACrB,OAAK,IAAM,KAAO,KAAK,KAAK,OACxB,GAAW,KAAO;AAEtB,SAAO;;CAEX,QAAQ,GAAQ,IAAS,KAAK,MAAM;AAChC,SAAO,EAAQ,OAAO,GAAQ;GAC1B,GAAG,KAAK;GACR,GAAG;GACN,CAAC;;CAEN,QAAQ,GAAQ,IAAS,KAAK,MAAM;AAChC,SAAO,EAAQ,OAAO,KAAK,QAAQ,QAAQ,MAAQ,CAAC,EAAO,SAAS,EAAI,CAAC,EAAE;GACvE,GAAG,KAAK;GACR,GAAG;GACN,CAAC;;;AAGV,GAAQ,SAAS;AACjB,IAAa,KAAb,cAAmC,EAAQ;CACvC,OAAO,GAAO;EACV,IAAM,IAAmB,EAAK,mBAAmB,KAAK,KAAK,OAAO,EAC5D,IAAM,KAAK,gBAAgB,EAAM;AACvC,MAAI,EAAI,eAAe,EAAc,UAAU,EAAI,eAAe,EAAc,QAAQ;GACpF,IAAM,IAAiB,EAAK,aAAa,EAAiB;AAM1D,UALA,EAAkB,GAAK;IACnB,UAAU,EAAK,WAAW,EAAe;IACzC,UAAU,EAAI;IACd,MAAM,EAAa;IACtB,CAAC,EACK;;AAKX,MAHA,AACI,KAAK,WAAS,IAAI,IAAI,EAAK,mBAAmB,KAAK,KAAK,OAAO,CAAC,EAEhE,CAAC,KAAK,OAAO,IAAI,EAAM,KAAK,EAAE;GAC9B,IAAM,IAAiB,EAAK,aAAa,EAAiB;AAM1D,UALA,EAAkB,GAAK;IACnB,UAAU,EAAI;IACd,MAAM,EAAa;IACnB,SAAS;IACZ,CAAC,EACK;;AAEX,SAAO,EAAG,EAAM,KAAK;;CAEzB,IAAI,OAAO;AACP,SAAO,KAAK,KAAK;;;AAGzB,GAAc,UAAU,GAAQ,MACrB,IAAI,GAAc;CACb;CACR,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAgC,EAAQ;CACpC,SAAS;AACL,SAAO,KAAK,KAAK;;CAErB,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM;AAU/C,SATI,EAAI,eAAe,EAAc,WAAW,EAAI,OAAO,UAAU,MACjE,EAAkB,GAAK;GACnB,MAAM,EAAa;GACnB,UAAU,EAAc;GACxB,UAAU,EAAI;GACjB,CAAC,EACK,KAGJ,GADa,EAAI,eAAe,EAAc,UAAU,EAAI,OAAO,QAAQ,QAAQ,EAAI,KAAK,EAC7E,MAAM,MACjB,KAAK,KAAK,KAAK,WAAW,GAAM;GACnC,MAAM,EAAI;GACV,UAAU,EAAI,OAAO;GACxB,CAAC,CACJ,CAAC;;;AAGX,GAAW,UAAU,GAAQ,MAClB,IAAI,GAAW;CAClB,MAAM;CACN,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAgC,EAAQ;CACpC,YAAY;AACR,SAAO,KAAK,KAAK;;CAErB,aAAa;AACT,SAAO,KAAK,KAAK,OAAO,KAAK,aAAa,EAAsB,aAC1D,KAAK,KAAK,OAAO,YAAY,GAC7B,KAAK,KAAK;;CAEpB,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM,EACjD,IAAS,KAAK,KAAK,UAAU,MAC7B,IAAW;GACb,WAAW,MAAQ;AAEf,IADA,EAAkB,GAAK,EAAI,EACvB,EAAI,QACJ,EAAO,OAAO,GAGd,EAAO,OAAO;;GAGtB,IAAI,OAAO;AACP,WAAO,EAAI;;GAElB;AAED,MADA,EAAS,WAAW,EAAS,SAAS,KAAK,EAAS,EAChD,EAAO,SAAS,cAAc;GAC9B,IAAM,IAAY,EAAO,UAAU,EAAI,MAAM,EAAS;AACtD,OAAI,EAAI,OAAO,MACX,QAAO,QAAQ,QAAQ,EAAU,CAAC,KAAK,OAAO,MAAc;AACxD,QAAI,EAAO,UAAU,UACjB,QAAO;IACX,IAAM,IAAS,MAAM,KAAK,KAAK,OAAO,YAAY;KAC9C,MAAM;KACN,MAAM,EAAI;KACV,QAAQ;KACX,CAAC;AAOF,WANI,EAAO,WAAW,YACX,IACP,EAAO,WAAW,WAElB,EAAO,UAAU,UACV,GAAM,EAAO,MAAM,GACvB;KACT;GAED;AACD,QAAI,EAAO,UAAU,UACjB,QAAO;IACX,IAAM,IAAS,KAAK,KAAK,OAAO,WAAW;KACvC,MAAM;KACN,MAAM,EAAI;KACV,QAAQ;KACX,CAAC;AAOF,WANI,EAAO,WAAW,YACX,IACP,EAAO,WAAW,WAElB,EAAO,UAAU,UACV,GAAM,EAAO,MAAM,GACvB;;;AAGf,MAAI,EAAO,SAAS,cAAc;GAC9B,IAAM,KAAqB,MAAQ;IAC/B,IAAM,IAAS,EAAO,WAAW,GAAK,EAAS;AAC/C,QAAI,EAAI,OAAO,MACX,QAAO,QAAQ,QAAQ,EAAO;AAElC,QAAI,aAAkB,QAClB,OAAU,MAAM,4FAA4F;AAEhH,WAAO;;AAEX,OAAI,EAAI,OAAO,UAAU,IAAO;IAC5B,IAAM,IAAQ,KAAK,KAAK,OAAO,WAAW;KACtC,MAAM,EAAI;KACV,MAAM,EAAI;KACV,QAAQ;KACX,CAAC;AAOF,WANI,EAAM,WAAW,YACV,KACP,EAAM,WAAW,WACjB,EAAO,OAAO,EAElB,EAAkB,EAAM,MAAM,EACvB;KAAE,QAAQ,EAAO;KAAO,OAAO,EAAM;KAAO;SAGnD,QAAO,KAAK,KAAK,OAAO,YAAY;IAAE,MAAM,EAAI;IAAM,MAAM,EAAI;IAAM,QAAQ;IAAK,CAAC,CAAC,MAAM,MACnF,EAAM,WAAW,YACV,KACP,EAAM,WAAW,WACjB,EAAO,OAAO,EACX,EAAkB,EAAM,MAAM,CAAC,YAC3B;IAAE,QAAQ,EAAO;IAAO,OAAO,EAAM;IAAO,EACrD,EACJ;;AAGV,MAAI,EAAO,SAAS,YAChB,KAAI,EAAI,OAAO,UAAU,IAAO;GAC5B,IAAM,IAAO,KAAK,KAAK,OAAO,WAAW;IACrC,MAAM,EAAI;IACV,MAAM,EAAI;IACV,QAAQ;IACX,CAAC;AACF,OAAI,CAAC,GAAQ,EAAK,CACd,QAAO;GACX,IAAM,IAAS,EAAO,UAAU,EAAK,OAAO,EAAS;AACrD,OAAI,aAAkB,QAClB,OAAU,MAAM,kGAAkG;AAEtH,UAAO;IAAE,QAAQ,EAAO;IAAO,OAAO;IAAQ;QAG9C,QAAO,KAAK,KAAK,OAAO,YAAY;GAAE,MAAM,EAAI;GAAM,MAAM,EAAI;GAAM,QAAQ;GAAK,CAAC,CAAC,MAAM,MAClF,GAAQ,EAAK,GAEX,QAAQ,QAAQ,EAAO,UAAU,EAAK,OAAO,EAAS,CAAC,CAAC,MAAM,OAAY;GAC7E,QAAQ,EAAO;GACf,OAAO;GACV,EAAE,GAJQ,EAKb;AAGV,IAAK,YAAY,EAAO;;;AAGhC,GAAW,UAAU,GAAQ,GAAQ,MAC1B,IAAI,GAAW;CAClB;CACA,UAAU,EAAsB;CAChC;CACA,GAAG,EAAoB,EAAO;CACjC,CAAC,EAEN,GAAW,wBAAwB,GAAY,GAAQ,MAC5C,IAAI,GAAW;CAClB;CACA,QAAQ;EAAE,MAAM;EAAc,WAAW;EAAY;CACrD,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAGN,IAAa,KAAb,cAAiC,EAAQ;CACrC,OAAO,GAAO;AAKV,SAJmB,KAAK,SAAS,EAAM,KACpB,EAAc,YACtB,EAAG,KAAA,EAAU,GAEjB,KAAK,KAAK,UAAU,OAAO,EAAM;;CAE5C,SAAS;AACL,SAAO,KAAK,KAAK;;;AAGzB,GAAY,UAAU,GAAM,MACjB,IAAI,GAAY;CACnB,WAAW;CACX,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAiC,EAAQ;CACrC,OAAO,GAAO;AAKV,SAJmB,KAAK,SAAS,EAAM,KACpB,EAAc,OACtB,EAAG,KAAK,GAEZ,KAAK,KAAK,UAAU,OAAO,EAAM;;CAE5C,SAAS;AACL,SAAO,KAAK,KAAK;;;AAGzB,GAAY,UAAU,GAAM,MACjB,IAAI,GAAY;CACnB,WAAW;CACX,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAAgC,EAAQ;CACpC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM,EAC3C,IAAO,EAAI;AAIf,SAHI,EAAI,eAAe,EAAc,cACjC,IAAO,KAAK,KAAK,cAAc,GAE5B,KAAK,KAAK,UAAU,OAAO;GAC9B;GACA,MAAM,EAAI;GACV,QAAQ;GACX,CAAC;;CAEN,gBAAgB;AACZ,SAAO,KAAK,KAAK;;;AAGzB,GAAW,UAAU,GAAM,MAChB,IAAI,GAAW;CAClB,WAAW;CACX,UAAU,EAAsB;CAChC,cAAc,OAAO,EAAO,WAAY,aAAa,EAAO,gBAAgB,EAAO;CACnF,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA8B,EAAQ;CAClC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM,EAEzC,IAAS;GACX,GAAG;GACH,QAAQ;IACJ,GAAG,EAAI;IACP,QAAQ,EAAE;IACb;GACJ,EACK,IAAS,KAAK,KAAK,UAAU,OAAO;GACtC,MAAM,EAAO;GACb,MAAM,EAAO;GACb,QAAQ,EACJ,GAAG,GACN;GACJ,CAAC;AAiBE,SAhBA,GAAQ,EAAO,GACR,EAAO,MAAM,OACT;GACH,QAAQ;GACR,OAAO,EAAO,WAAW,UACnB,EAAO,QACP,KAAK,KAAK,WAAW;IACnB,IAAI,QAAQ;AACR,YAAO,IAAI,GAAS,EAAO,OAAO,OAAO;;IAE7C,OAAO,EAAO;IACjB,CAAC;GACT,EACH,GAGK;GACH,QAAQ;GACR,OAAO,EAAO,WAAW,UACnB,EAAO,QACP,KAAK,KAAK,WAAW;IACnB,IAAI,QAAQ;AACR,YAAO,IAAI,GAAS,EAAO,OAAO,OAAO;;IAE7C,OAAO,EAAO;IACjB,CAAC;GACT;;CAGT,cAAc;AACV,SAAO,KAAK,KAAK;;;AAGzB,GAAS,UAAU,GAAM,MACd,IAAI,GAAS;CAChB,WAAW;CACX,UAAU,EAAsB;CAChC,YAAY,OAAO,EAAO,SAAU,aAAa,EAAO,cAAc,EAAO;CAC7E,GAAG,EAAoB,EAAO;CACjC,CAAC;AAEN,IAAa,KAAb,cAA4B,EAAQ;CAChC,OAAO,GAAO;AAEV,MADmB,KAAK,SAAS,EAAM,KACpB,EAAc,KAAK;GAClC,IAAM,IAAM,KAAK,gBAAgB,EAAM;AAMvC,UALA,EAAkB,GAAK;IACnB,MAAM,EAAa;IACnB,UAAU,EAAc;IACxB,UAAU,EAAI;IACjB,CAAC,EACK;;AAEX,SAAO;GAAE,QAAQ;GAAS,OAAO,EAAM;GAAM;;;AAGrD,GAAO,UAAU,MACN,IAAI,GAAO;CACd,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC;AAGN,IAAa,KAAb,cAAgC,EAAQ;CACpC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,KAAK,oBAAoB,EAAM,EACzC,IAAO,EAAI;AACjB,SAAO,KAAK,KAAK,KAAK,OAAO;GACzB;GACA,MAAM,EAAI;GACV,QAAQ;GACX,CAAC;;CAEN,SAAS;AACL,SAAO,KAAK,KAAK;;GAGZ,KAAb,MAAa,UAAoB,EAAQ;CACrC,OAAO,GAAO;EACV,IAAM,EAAE,WAAQ,WAAQ,KAAK,oBAAoB,EAAM;AACvD,MAAI,EAAI,OAAO,MAqBX,SApBoB,YAAY;GAC5B,IAAM,IAAW,MAAM,KAAK,KAAK,GAAG,YAAY;IAC5C,MAAM,EAAI;IACV,MAAM,EAAI;IACV,QAAQ;IACX,CAAC;AAQE,UAPA,EAAS,WAAW,YACb,IACP,EAAS,WAAW,WACpB,EAAO,OAAO,EACP,GAAM,EAAS,MAAM,IAGrB,KAAK,KAAK,IAAI,YAAY;IAC7B,MAAM,EAAS;IACf,MAAM,EAAI;IACV,QAAQ;IACX,CAAC;MAGU;EAEnB;GACD,IAAM,IAAW,KAAK,KAAK,GAAG,WAAW;IACrC,MAAM,EAAI;IACV,MAAM,EAAI;IACV,QAAQ;IACX,CAAC;AAWE,UAVA,EAAS,WAAW,YACb,IACP,EAAS,WAAW,WACpB,EAAO,OAAO,EACP;IACH,QAAQ;IACR,OAAO,EAAS;IACnB,IAGM,KAAK,KAAK,IAAI,WAAW;IAC5B,MAAM,EAAS;IACf,MAAM,EAAI;IACV,QAAQ;IACX,CAAC;;;CAId,OAAO,OAAO,GAAG,GAAG;AAChB,SAAO,IAAI,EAAY;GACnB,IAAI;GACJ,KAAK;GACL,UAAU,EAAsB;GACnC,CAAC;;GAGG,KAAb,cAAiC,EAAQ;CACrC,OAAO,GAAO;EACV,IAAM,IAAS,KAAK,KAAK,UAAU,OAAO,EAAM,EAC1C,KAAU,OACR,GAAQ,EAAK,KACb,EAAK,QAAQ,OAAO,OAAO,EAAK,MAAM,GAEnC;AAEX,SAAO,GAAQ,EAAO,GAAG,EAAO,MAAM,MAAS,EAAO,EAAK,CAAC,GAAG,EAAO,EAAO;;CAEjF,SAAS;AACL,SAAO,KAAK,KAAK;;;AAGzB,GAAY,UAAU,GAAM,MACjB,IAAI,GAAY;CACnB,WAAW;CACX,UAAU,EAAsB;CAChC,GAAG,EAAoB,EAAO;CACjC,CAAC,EAiDM,GAAU;AAEtB,IAAW;CACV,SAAU,GAAuB;AAoC9B,CAnCA,EAAsB,YAAe,aACrC,EAAsB,YAAe,aACrC,EAAsB,SAAY,UAClC,EAAsB,YAAe,aACrC,EAAsB,aAAgB,cACtC,EAAsB,UAAa,WACnC,EAAsB,YAAe,aACrC,EAAsB,eAAkB,gBACxC,EAAsB,UAAa,WACnC,EAAsB,SAAY,UAClC,EAAsB,aAAgB,cACtC,EAAsB,WAAc,YACpC,EAAsB,UAAa,WACnC,EAAsB,WAAc,YACpC,EAAsB,YAAe,aACrC,EAAsB,WAAc,YACpC,EAAsB,wBAA2B,yBACjD,EAAsB,kBAAqB,mBAC3C,EAAsB,WAAc,YACpC,EAAsB,YAAe,aACrC,EAAsB,SAAY,UAClC,EAAsB,SAAY,UAClC,EAAsB,cAAiB,eACvC,EAAsB,UAAa,WACnC,EAAsB,aAAgB,cACtC,EAAsB,UAAa,WACnC,EAAsB,aAAgB,cACtC,EAAsB,gBAAmB,iBACzC,EAAsB,cAAiB,eACvC,EAAsB,cAAiB,eACvC,EAAsB,aAAgB,cACtC,EAAsB,WAAc,YACpC,EAAsB,aAAgB,cACtC,EAAsB,aAAgB,cACtC,EAAsB,cAAiB,eACvC,EAAsB,cAAiB;GACxC,AAA0B,MAAwB,EAAE,CAAE,EAUtC,GAAU,QACV,GAAU,QACb,GAAO,QACJ,GAAU,QACT,GAAW,QACd,GAAQ,QACN,GAAU,QACP,GAAa,QAClB,GAAQ,QACT,GAAO,QACH,GAAW,QACb,GAAS,QACV,GAAQ,QACP,GAAS,QACR,GAAU,QACJ,GAAU,cACjB,GAAS,QACI,GAAsB,QAC5B,GAAgB,QACvB,GAAS,QACR,GAAU,QACb,GAAO,QACP,GAAO,QACF,GAAY,QAChB,GAAQ,QACL,GAAW,QACd,GAAQ,QACF,GAAc,QACjB,GAAW,QACX,GAAW,QACV,GAAY,QACZ,GAAY,QACV,GAAW,sBACb,GAAY;;;AC57GjC,IAAI,EAAE,MAAA,IAAM,MAAA,OAAS,YAqQjB,MAAqB,EACvB,WACA,UAAO,IACP,cAAW,kEACX,eAAY,QACV,EAAE,KAAK;CACT,IAAM,UAAkB;EACtB,IAAM,IAAiB,EAAS,QAC1B,IAAY,MAAM,EAAK;AAC7B,OAAK,IAAI,IAAI,GAAG,IAAI,GAAM,IACxB,GAAM,KAAK,EAAS,KAAK,QAAQ,GAAG,IAAiB;AAEvD,SAAO,EAAM,KAAK,GAAG;;AAEvB,KAAI,KAAU,KACZ,QAAO;AAET,KAAI,EAAS,SAAS,EAAU,CAC9B,OAAM,IAAI,GAAqB;EAC7B,UAAU;EACV,SAAS,kBAAkB,EAAU,sCAAsC,EAAS;EACrF,CAAC;AAEJ,cAAa,GAAG,IAAS,IAAY,GAAW;;AAEjC,IAAmB;AAqXpC,IAAI,KAAiB,iJACjB,KAAuB;AAC3B,SAAS,GAAO,GAAM;CACpB,IAAM,IAAM,KAAK,MAAM,EAAK;AAO5B,QANoB,OAAO,KAAQ,aAA/B,KAGA,GAAe,KAAK,EAAK,KAAK,MAAS,GAAqB,KAAK,EAAK,KAAK,KACtE,IAEF,GAAO,EAAI;;AAEpB,SAAS,GAAO,GAAK;CACnB,IAAI,IAAO,CAAC,EAAI;AAChB,QAAO,EAAK,SAAQ;EAClB,IAAM,IAAQ;AACd,MAAO,EAAE;AACT,OAAK,IAAM,KAAQ,GAAO;AAIxB,OAHI,OAAO,UAAU,eAAe,KAAK,GAAM,YAAY,IAGvD,OAAO,UAAU,eAAe,KAAK,GAAM,cAAc,IAAI,EAAK,gBAAgB,QAAQ,OAAO,EAAK,eAAgB,YAAY,OAAO,UAAU,eAAe,KAAK,EAAK,aAAa,YAAY,CACvM,OAAU,YAAY,+CAA+C;AAEvE,QAAK,IAAM,KAAO,GAAM;IACtB,IAAM,IAAQ,EAAK;AACnB,IAAI,KAAS,OAAO,KAAU,YAC5B,EAAK,KAAK,EAAM;;;;AAKxB,QAAO;;AAET,SAAS,GAAgB,GAAM;CAC7B,IAAM,EAAE,uBAAoB;AAC5B,KAAI;AACF,QAAM,kBAAkB;SACd;AACV,SAAO,GAAO,EAAK;;AAErB,KAAI;AACF,SAAO,GAAO,EAAK;WACX;AACR,QAAM,kBAAkB;;;AAY5B,SAAS,GAAoC,GAAa;AACxD,KAAI,EAAY,SAAS,YAAY,MAAM,QAAQ,EAAY,KAAK,IAAI,EAAY,KAAK,SAAS,SAAS,EAAE;AAC3G,IAAY,uBAAuB;EACnC,IAAM,EAAE,kBAAe;AACvB,MAAI,KAAc,KAChB,MAAK,IAAM,KAAO,OAAO,KAAK,EAAW,CACvC,GAAW,KAAO,GAAM,EAAW,GAAK;;AAa9C,CATI,EAAY,SAAS,SACvB,EAAY,QAAQ,MAAM,QAAQ,EAAY,MAAM,GAAG,EAAY,MAAM,IAAI,GAAM,GAAG,GAAM,EAAY,MAAM,GAE5G,EAAY,SAAS,SACvB,EAAY,QAAQ,EAAY,MAAM,IAAI,GAAM,GAE9C,EAAY,SAAS,SACvB,EAAY,QAAQ,EAAY,MAAM,IAAI,GAAM,GAE9C,EAAY,SAAS,SACvB,EAAY,QAAQ,EAAY,MAAM,IAAI,GAAM;CAElD,IAAM,EAAE,mBAAgB;AACxB,KAAI,KAAe,KACjB,MAAK,IAAM,KAAO,OAAO,KAAK,EAAY,CACxC,GAAY,KAAO,GAAM,EAAY,GAAK;AAG9C,QAAO;;AAET,SAAS,GAAM,GAAK;AAElB,QADI,OAAO,KAAQ,YAAkB,IAC9B,GAAoC,EAAI;;AAIjD,IAAI,KAAiC,uBACnC,oDACD,EACG,KAAiB;CACnB,MAAM,KAAK;CACX,cAAc;CACd,UAAU,CAAC,IAAI;CACf,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,aAAa;CACb,0BAA0B;CAC1B,6BAA6B;CAC7B,8BAA8B;CAC9B,gBAAgB;CAChB,cAAc;CACd,aAAa,EAAE;CACf,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,eAAe;CACf,gBAAgB;CAChB,cAAc;CACf,EACG,MAAqB,MAAY,OAAO,KAAY,WAAW;CACjE,GAAG;CACH,MAAM;CACP,GAAG;CACF,GAAG;CACH,GAAG;CACJ;AAMD,SAAS,IAAc;AACrB,QAAO,EAAE;;AAKX,SAAS,GAAc,GAAK,GAAM;CAEhC,IAAM,IAAM,EACV,MAAM,SACP;AAiBD,QAhBY,EAAI,MAA6B,QAAuB,EAAI,MAA6B,MAA4B,aAAc,EAAsB,WACnK,EAAI,QAAQ,EAAS,EAAI,KAAK,MAAM;EAClC,GAAG;EACH,aAAa,CAAC,GAAG,EAAK,aAAa,QAAQ;EAC5C,CAAC,GAEA,EAAI,cACN,EAAI,WAAW,EAAI,UAAU,QAE3B,EAAI,cACN,EAAI,WAAW,EAAI,UAAU,QAE3B,EAAI,gBACN,EAAI,WAAW,EAAI,YAAY,OAC/B,EAAI,WAAW,EAAI,YAAY,QAE1B;;AAIT,SAAS,GAAe,GAAK;CAC3B,IAAM,IAAM;EACV,MAAM;EACN,QAAQ;EACT;AACD,KAAI,CAAC,EAAI,OAAQ,QAAO;AACxB,MAAK,IAAM,KAAS,EAAI,OACtB,SAAQ,EAAM,MAAd;EACE,KAAK;AACH,GAAI,EAAM,YACR,EAAI,UAAU,EAAM,QAEpB,EAAI,mBAAmB,EAAM;AAE/B;EACF,KAAK;AACH,GAAI,EAAM,YACR,EAAI,UAAU,EAAM,QAEpB,EAAI,mBAAmB,EAAM;AAE/B;EACF,KAAK;AACH,KAAI,aAAa,EAAM;AACvB;;AAGN,QAAO;;AAIT,SAAS,KAAkB;AACzB,QAAO,EAAE,MAAM,WAAW;;AAI5B,SAAS,GAAgB,GAAM,GAAM;AACnC,QAAO,EAAS,EAAK,KAAK,MAAM,EAAK;;AAIvC,IAAI,MAAiB,GAAK,MACjB,EAAS,EAAI,UAAU,MAAM,EAAK;AAI3C,SAAS,GAAa,GAAK,GAAM,GAAsB;CACrD,IAAM,IAAW,KAAsD,EAAK;AAC5E,KAAI,MAAM,QAAQ,EAAS,CACzB,QAAO,EACL,OAAO,EAAS,KAAK,GAAM,MAAM,GAAa,GAAK,GAAM,EAAK,CAAC,EAChE;AAEH,SAAQ,GAAR;EACE,KAAK;EACL,KAAK,mBACH,QAAO;GACL,MAAM;GACN,QAAQ;GACT;EACH,KAAK,cACH,QAAO;GACL,MAAM;GACN,QAAQ;GACT;EACH,KAAK,UACH,QAAO,GAAkB,EAAI;;;AAGnC,IAAI,MAAqB,MAAQ;CAC/B,IAAM,IAAM;EACV,MAAM;EACN,QAAQ;EACT;AACD,MAAK,IAAM,KAAS,EAAI,OACtB,SAAQ,EAAM,MAAd;EACE,KAAK;AACH,KAAI,UAAU,EAAM;AACpB;EACF,KAAK;AACH,KAAI,UAAU,EAAM;AACpB;;AAGN,QAAO;;AAIT,SAAS,GAAgB,GAAM,GAAM;AACnC,QAAO;EACL,GAAG,EAAS,EAAK,UAAU,MAAM,EAAK;EACtC,SAAS,EAAK,cAAc;EAC7B;;AAIH,SAAS,GAAgB,GAAM,GAAM;AACnC,QAAO,EAAK,mBAAmB,UAAU,EAAS,EAAK,OAAO,MAAM,EAAK,GAAG,GAAa;;AAI3F,SAAS,GAAa,GAAK;AACzB,QAAO;EACL,MAAM;EACN,MAAM,MAAM,KAAK,EAAI,OAAO;EAC7B;;AAIH,IAAI,MAA0B,MACxB,UAAU,KAAQ,EAAK,SAAS,WAAiB,KAC9C,WAAW;AAEpB,SAAS,GAAqB,GAAK,GAAM;CACvC,IAAM,IAAQ,CACZ,EAAS,EAAI,KAAK,MAAM;EACtB,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAa;GAAS;GAAI;EACjD,CAAC,EACF,EAAS,EAAI,MAAM,MAAM;EACvB,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAa;GAAS;GAAI;EACjD,CAAC,CACH,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,EACd,IAAc,EAAE;AAatB,QAZA,EAAM,SAAS,MAAW;AACxB,MAAI,GAAuB,EAAO,CAChC,GAAY,KAAK,GAAG,EAAO,MAAM;OAC5B;GACL,IAAI,IAAe;AACnB,OAAI,0BAA0B,KAAU,EAAO,yBAAyB,IAAO;IAC7E,IAAM,EAAE,yBAAsB,GAAG,MAAS;AAC1C,QAAe;;AAEjB,KAAY,KAAK,EAAa;;GAEhC,EACK,EAAY,SAAS,EAAE,OAAO,GAAa,GAAG,KAAK;;AAI5D,SAAS,GAAgB,GAAK;CAC5B,IAAM,IAAa,OAAO,EAAI;AAM9B,QALI,MAAe,YAAY,MAAe,YAAY,MAAe,aAAa,MAAe,WAC5F,EACL,MAAM,MAAM,QAAQ,EAAI,MAAM,GAAG,UAAU,UAC5C,GAEI;EACL,MAAM,MAAe,WAAW,YAAY;EAC5C,OAAO,EAAI;EACZ;;AASH,IAAI,KAAa,KAAK,GAClB,KAAc;CAIhB,MAAM;CACN,OAAO;CACP,MAAM;CAIN,OAAO;CAYP,cACM,OAAe,KAAK,MACtB,KAAa,OACX,wDACA,IACD,GAEI;CAKT,MAAM;CAIN,MAAM;CACN,UAAU;CAIV,MAAM;CACN,UAAU;CACV,QAAQ;CACR,WAAW;CACX,QAAQ;CACR,KAAK;CACN;AACD,SAAS,GAAe,GAAK,GAAM;CACjC,IAAM,IAAM,EACV,MAAM,UACP;AACD,KAAI,EAAI,OACN,MAAK,IAAM,KAAS,EAAI,OACtB,SAAQ,EAAM,MAAd;EACE,KAAK;AACH,KAAI,YAAY,OAAO,EAAI,aAAc,WAAW,KAAK,IAAI,EAAI,WAAW,EAAM,MAAM,GAAG,EAAM;AACjG;EACF,KAAK;AACH,KAAI,YAAY,OAAO,EAAI,aAAc,WAAW,KAAK,IAAI,EAAI,WAAW,EAAM,MAAM,GAAG,EAAM;AACjG;EACF,KAAK;AACH,WAAQ,EAAK,eAAb;IACE,KAAK;AACH,QAAU,GAAK,SAAS,EAAM,SAAS,EAAK;AAC5C;IACF,KAAK;AACH,QAAU,GAAK,aAAa,EAAM,SAAS,EAAK;AAChD;IACF,KAAK;AACH,OAAW,GAAK,GAAY,OAAO,EAAM,SAAS,EAAK;AACvD;;AAEJ;EACF,KAAK;AACH,MAAU,GAAK,OAAO,EAAM,SAAS,EAAK;AAC1C;EACF,KAAK;AACH,MAAU,GAAK,QAAQ,EAAM,SAAS,EAAK;AAC3C;EACF,KAAK;AACH,KAAW,GAAK,EAAM,OAAO,EAAM,SAAS,EAAK;AACjD;EACF,KAAK;AACH,KAAW,GAAK,GAAY,MAAM,EAAM,SAAS,EAAK;AACtD;EACF,KAAK;AACH,KAAW,GAAK,GAAY,OAAO,EAAM,SAAS,EAAK;AACvD;EACF,KAAK;AACH,KACE,GACA,OAAO,IAAI,GAAwB,EAAM,OAAO,EAAK,GAAG,EACxD,EAAM,SACN,EACD;AACD;EACF,KAAK;AACH,KACE,GACA,OAAO,GAAG,GAAwB,EAAM,OAAO,EAAK,CAAC,GAAG,EACxD,EAAM,SACN,EACD;AACD;EACF,KAAK;AACH,MAAU,GAAK,aAAa,EAAM,SAAS,EAAK;AAChD;EACF,KAAK;AACH,MAAU,GAAK,QAAQ,EAAM,SAAS,EAAK;AAC3C;EACF,KAAK;AACH,MAAU,GAAK,QAAQ,EAAM,SAAS,EAAK;AAC3C;EACF,KAAK;AACH,MAAU,GAAK,YAAY,EAAM,SAAS,EAAK;AAC/C;EACF,KAAK;AAEH,GADA,EAAI,YAAY,OAAO,EAAI,aAAc,WAAW,KAAK,IAAI,EAAI,WAAW,EAAM,MAAM,GAAG,EAAM,OACjG,EAAI,YAAY,OAAO,EAAI,aAAc,WAAW,KAAK,IAAI,EAAI,WAAW,EAAM,MAAM,GAAG,EAAM;AACjG;EACF,KAAK;AACH,KACE,GACA,OAAO,GAAwB,EAAM,OAAO,EAAK,CAAC,EAClD,EAAM,SACN,EACD;AACD;EAEF,KAAK;AAIH,GAHI,EAAM,YAAY,QACpB,GAAU,GAAK,QAAQ,EAAM,SAAS,EAAK,EAEzC,EAAM,YAAY,QACpB,GAAU,GAAK,QAAQ,EAAM,SAAS,EAAK;AAE7C;EAEF,KAAK;AACH,KAAW,GAAK,GAAY,WAAW,EAAM,SAAS,EAAK;AAC3D;EACF,KAAK;AACH,KAAW,GAAK,GAAY,KAAK,EAAM,SAAS,EAAK;AACrD;EACF,KAAK;AAIH,GAHI,EAAM,YAAY,QACpB,EAAW,GAAK,GAAY,UAAU,EAAM,SAAS,EAAK,EAExD,EAAM,YAAY,QACpB,EAAW,GAAK,GAAY,UAAU,EAAM,SAAS,EAAK;AAE5D;EAEF,KAAK;AACH,KAAW,GAAK,GAAY,OAAO,EAAE,EAAM,SAAS,EAAK;AACzD;EACF,KAAK;AACH,KAAW,GAAK,GAAY,MAAM,EAAM,SAAS,EAAK;AACtD;EAEF,KAAK;AACH,WAAQ,EAAK,gBAAb;IACE,KAAK;AACH,QAAU,GAAK,UAAU,EAAM,SAAS,EAAK;AAC7C;IAEF,KAAK;AACH,OAAI,kBAAkB;AACtB;IAEF,KAAK;AACH,OAAW,GAAK,GAAY,QAAQ,EAAM,SAAS,EAAK;AACxD;;AAGJ;EAEF,KAAK,SACH,GAAW,GAAK,GAAY,QAAQ,EAAM,SAAS,EAAK;EAE1D,KAAK;EACL,KAAK;EACL,KAAK,OACH;EACF;;AAMN,QAAO;;AAET,SAAS,GAAwB,GAAS,GAAM;AAC9C,QAAO,EAAK,oBAAoB,WAAW,GAAsB,EAAQ,GAAG;;AAE9E,IAAI,qBAAgB,IAAI,IACtB,+DACD;AACD,SAAS,GAAsB,GAAQ;CACrC,IAAI,IAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,IAIjC,CAHK,GAAc,IAAI,EAAO,GAAG,KAC/B,KAAU,OAEZ,KAAU,EAAO;AAEnB,QAAO;;AAET,SAAS,GAAU,GAAQ,GAAO,GAAS,GAAM;AAE/C,CAAI,EAAO,UAAkB,EAAO,OAA8B,MAAM,MAAM,EAAE,OAAO,IACrF,AACE,EAAO,UAAQ,EAAE,EAEf,EAAO,WACT,EAAO,MAAM,KAAK,EAChB,QAAQ,EAAO,QAChB,CAAC,EACF,OAAO,EAAO,SAEhB,EAAO,MAAM,KAAK;EAChB,QAAQ;EACR,GAAG,KAAW,EAAK,iBAAiB,EAAE,cAAc,EAAE,QAAQ,GAAS,EAAE;EAC1E,CAAC,IAEF,EAAO,SAAS;;AAGpB,SAAS,EAAW,GAAQ,GAAO,GAAS,GAAM;AAEhD,CAAI,EAAO,WAAmB,EAAO,OAA8B,MAAM,MAAM,EAAE,QAAQ,IACvF,AACE,EAAO,UAAQ,EAAE,EAEf,EAAO,YACT,EAAO,MAAM,KAAK,EAChB,SAAS,EAAO,SACjB,CAAC,EACF,OAAO,EAAO,UAEhB,EAAO,MAAM,KAAK;EAChB,SAAS,GAAyB,GAAO,EAAK;EAC9C,GAAG,KAAW,EAAK,iBAAiB,EAAE,cAAc,EAAE,SAAS,GAAS,EAAE;EAC3E,CAAC,IAEF,EAAO,UAAU,GAAyB,GAAO,EAAK;;AAG1D,SAAS,GAAyB,GAAO,GAAM;AAE7C,KAAI,CAAC,EAAK,mBAAmB,CAAC,EAAM,MAClC,QAAO,EAAM;CAEf,IAAM,IAAQ;EACZ,GAAG,EAAM,MAAM,SAAS,IAAI;EAE5B,GAAG,EAAM,MAAM,SAAS,IAAI;EAE5B,GAAG,EAAM,MAAM,SAAS,IAAI;EAE7B,EACK,IAAS,EAAM,IAAI,EAAM,OAAO,aAAa,GAAG,EAAM,QACxD,IAAU,IACV,IAAY,IACZ,IAAc,IACd,IAAc;AAClB,MAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK;AACtC,MAAI,GAAW;AAEb,GADA,KAAW,EAAO,IAClB,IAAY;AACZ;;AAEF,MAAI,EAAM;OACJ;QACE,EAAO,GAAG,MAAM,QAAQ,EAAE;AAC5B,KAAI,KACF,KAAW,EAAO,IAClB,KAAW,GAAG,EAAO,IAAI,GAAG,GAAG,EAAO,KAAK,aAAa,EACxD,IAAc,MACL,EAAO,IAAI,OAAO,OAAe,EAAO,IAAI,IAA2B,MAAM,QAAQ,IAC9F,KAAW,EAAO,IAClB,IAAc,MAEd,KAAW,GAAG,EAAO,KAAK,EAAO,GAAG,aAAa;AAEnD;;cAEO,EAAO,GAAG,MAAM,QAAQ,EAAE;AACnC,SAAW,IAAI,EAAO,KAAK,EAAO,GAAG,aAAa,CAAC;AACnD;;;AAGJ,MAAI,EAAM;OACJ,EAAO,OAAO,KAAK;AACrB,SAAW;AAEX;cACS,EAAO,OAAO,KAAK;AAC5B,SAAW;AAEX;;;AAGJ,MAAI,EAAM,KAAK,EAAO,OAAO,KAAK;AAChC,QAAW,IAAc,GAAG,EAAO,GAAG;IACxC,IAAI,EAAO,GAAG;;AAEZ;;AAGF,EADA,KAAW,EAAO,IACd,EAAO,OAAO,OAChB,IAAY,KACH,KAAe,EAAO,OAAO,MACtC,IAAc,KACL,CAAC,KAAe,EAAO,OAAO,QACvC,IAAc;;AAGlB,KAAI;AACF,MAAI,OAAO,EAAQ;SACT;AAMV,SALA,QAAQ,KACN,sCAAsC,EAAK,YAAY,KACrD,IACD,CAAC,uEACH,EACM,EAAM;;AAEf,QAAO;;AAIT,SAAS,GAAe,GAAK,GAAM;CAEjC,IAAM,IAAS;EACb,MAAM;EACN,sBAA6B,EAAS,EAAI,UAAU,MAAM;GACxD,GAAG;GACH,aAAa,CAAC,GAAG,EAAK,aAAa,uBAAuB;GAC3D,CAAC,IAAkB,EAAK;EAC1B;AACD,KAAY,EAAI,SAAgC,KAAK,aAAcK,EAAuB,aAAoB,EAAI,QAAQ,KAAK,QAA8B,QAAS;EACpK,IAAM,EAAE,SAAM,GAAG,MAAY,GAAe,EAAI,QAAQ,MAAM,EAAK;AACnE,SAAO;GACL,GAAG;GACH,eAAe;GAChB;YACe,EAAI,SAA+B,KAAK,aAAcA,EAAuB,QAC7F,QAAO;EACL,GAAG;EACH,eAAe,EACb,MAAM,EAAI,QAAQ,KAAK,QACxB;EACF;UACe,EAAI,SAA+B,KAAK,aAAcA,EAAuB,cAAc,EAAI,QAAQ,KAAK,KAAK,KAAK,aAAaA,EAAuB,aAAoB,EAAI,QAAQ,KAAK,KAAK,KAAK,QAA8B,QAAS;EAChQ,IAAM,EAAE,SAAM,GAAG,MAAY,GAC3B,EAAI,QAAQ,MACZ,EACD;AACD,SAAO;GACL,GAAG;GACH,eAAe;GAChB;;AAEH,QAAO;;AAIT,SAAS,GAAY,GAAK,GAAM;AAY9B,QAXI,EAAK,gBAAgB,WAChB,GAAe,GAAK,EAAK,GAU3B;EACL,MAAM;EACN,UAAU;EACV,OAAO;GACL,MAAM;GACN,OAAO,CAbE,EAAS,EAAI,QAAQ,MAAM;IACtC,GAAG;IACH,aAAa;KAAC,GAAG,EAAK;KAAa;KAAS;KAAS;KAAI;IAC1D,CAAC,IAAI,GAAa,EACJ,EAAS,EAAI,UAAU,MAAM;IAC1C,GAAG;IACH,aAAa;KAAC,GAAG,EAAK;KAAa;KAAS;KAAS;KAAI;IAC1D,CAAC,IAAI,GAAa,CAMM;GACrB,UAAU;GACV,UAAU;GACX;EACF;;AAIH,SAAS,GAAmB,GAAK;CAC/B,IAAM,IAAS,EAAI,QAIb,IAHa,OAAO,KAAK,EAAI,OAAO,CAAC,QAAQ,MAC1C,OAAO,EAAO,EAAO,OAAU,SACtC,CAC8B,KAAK,MAAQ,EAAO,GAAK,EACnD,IAAc,MAAM,KACxB,IAAI,IAAI,EAAa,KAAK,MAAW,OAAO,EAAO,CAAC,CACrD;AACD,QAAO;EACL,MAAM,EAAY,WAAW,IAAI,EAAY,OAAO,WAAW,WAAW,WAAW,CAAC,UAAU,SAAS;EACzG,MAAM;EACP;;AAIH,SAAS,KAAgB;AACvB,QAAO,EAAE,KAAK,GAAa,EAAE;;AAI/B,SAAS,KAAe;AACtB,QAAO,EACL,MAAM,QACP;;AAIH,IAAI,KAAoB;CACtB,WAAW;CACX,WAAW;CACX,WAAW;CACX,YAAY;CACZ,SAAS;CACV;AACD,SAAS,GAAc,GAAK,GAAM;CAChC,IAAM,IAAU,EAAI,mBAAmB,MAAM,MAAM,KAAK,EAAI,QAAQ,QAAQ,CAAC,GAAG,EAAI;AACpF,KAAI,EAAQ,OACT,MAAM,EAAE,KAAK,YAAY,OAAsB,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,KAAK,OAAO,QAClF,EAAE;EACD,IAAM,IAAQ,EAAQ,QAAQ,GAAQ,MAAM;GAC1C,IAAM,IAAO,GAAkB,EAAE,KAAK;AACtC,UAAO,KAAQ,CAAC,EAAO,SAAS,EAAK,GAAG,CAAC,GAAG,GAAQ,EAAK,GAAG;KAC3D,EAAE,CAAC;AACN,SAAO,EACL,MAAM,EAAM,SAAS,IAAI,IAAQ,EAAM,IACxC;YACQ,EAAQ,OAAO,MAAM,EAAE,KAAK,aAAa,gBAAgB,CAAC,EAAE,YAAY,EAAE;EACnF,IAAM,IAAQ,EAAQ,QACnB,GAAK,MAAM;GACV,IAAM,IAAO,OAAO,EAAE,KAAK;AAC3B,WAAQ,GAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK,UACH,QAAO,CAAC,GAAG,GAAK,EAAK;IACvB,KAAK,SACH,QAAO,CAAC,GAAG,GAAK,UAAU;IAC5B,KAAK,SACH,KAAI,EAAE,KAAK,UAAU,KAAM,QAAO,CAAC,GAAG,GAAK,OAAO;IAIpD,QACE,QAAO;;KAGb,EAAE,CACH;AACD,MAAI,EAAM,WAAW,EAAQ,QAAQ;GACnC,IAAM,IAAc,EAAM,QAAQ,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;AACjE,UAAO;IACL,MAAM,EAAY,SAAS,IAAI,IAAc,EAAY;IACzD,MAAM,EAAQ,QACX,GAAK,MACG,EAAI,SAAS,EAAE,KAAK,MAAM,GAAG,IAAM,CAAC,GAAG,GAAK,EAAE,KAAK,MAAM,EAElE,EAAE,CACH;IACF;;YAEM,EAAQ,OAAO,MAAM,EAAE,KAAK,aAAa,UAAU,CAC5D,QAAO;EACL,MAAM;EACN,MAAM,EAAQ,QACX,GAAK,MAAM,CACV,GAAG,GACH,GAAG,EAAE,KAAK,OAAO,QAAQ,MAAO,CAAC,EAAI,SAAS,EAAG,CAAC,CACnD,EACD,EAAE,CACH;EACF;AAEH,QAAO,GAAQ,GAAK,EAAK;;AAE3B,IAAI,MAAW,GAAK,MAAS;CAC3B,IAAM,KAAS,EAAI,mBAAmB,MAAM,MAAM,KAAK,EAAI,QAAQ,QAAQ,CAAC,GAAG,EAAI,SAAS,KACzF,GAAG,MAAM,EAAS,EAAE,MAAM;EACzB,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAa;GAAS,GAAG;GAAI;EACpD,CAAC,CACH,CAAC,QACC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAK,gBAAgB,OAAO,KAAM,YAAY,OAAO,KAAK,EAAE,CAAC,SAAS,GACvF;AACD,QAAO,EAAM,SAAS,EAAE,UAAO,GAAG,KAAK;;AAIzC,SAAS,GAAiB,GAAK,GAAM;AACnC,KAAI;EAAC;EAAa;EAAa;EAAa;EAAc;EAAU,CAAC,SACnE,EAAI,UAAU,KAAK,SACpB,KAAK,CAAC,EAAI,UAAU,KAAK,UAAU,CAAC,EAAI,UAAU,KAAK,OAAO,QAC7D,QAAO,EACL,MAAM,CACJ,GAAkB,EAAI,UAAU,KAAK,WACrC,OACD,EACF;CAEH,IAAM,IAAO,EAAS,EAAI,UAAU,MAAM;EACxC,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAa;GAAS;GAAI;EACjD,CAAC;AACF,QAAO,KAAQ,EAAE,OAAO,CAAC,GAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;;AAIpD,SAAS,GAAe,GAAK;CAC3B,IAAM,IAAM,EACV,MAAM,UACP;AACD,KAAI,CAAC,EAAI,OAAQ,QAAO;AACxB,MAAK,IAAM,KAAS,EAAI,OACtB,SAAQ,EAAM,MAAd;EACE,KAAK;AACH,KAAI,OAAO;AACX;EACF,KAAK;AACH,GAAI,EAAM,YACR,EAAI,UAAU,EAAM,QAEpB,EAAI,mBAAmB,EAAM;AAE/B;EACF,KAAK;AACH,GAAI,EAAM,YACR,EAAI,UAAU,EAAM,QAEpB,EAAI,mBAAmB,EAAM;AAE/B;EACF,KAAK;AACH,KAAI,aAAa,EAAM;AACvB;;AAGN,QAAO;;AAIT,SAAS,GAAe,GAAK,GAAM;CACjC,IAAM,IAAS;EACb,MAAM;EACN,YAAY,EAAE;EACf,EACK,IAAW,EAAE,EACb,IAAQ,EAAI,OAAO;AACzB,MAAK,IAAM,KAAY,GAAO;EAC5B,IAAI,IAAU,EAAM;AACpB,MAAI,MAAY,KAAK,KAAK,EAAQ,SAAS,KAAK,EAC9C;EAEF,IAAM,IAAe,GAAe,EAAQ,EACtC,IAAY,EAAS,EAAQ,MAAM;GACvC,GAAG;GACH,aAAa;IAAC,GAAG,EAAK;IAAa;IAAc;IAAS;GAC1D,cAAc;IAAC,GAAG,EAAK;IAAa;IAAc;IAAS;GAC5D,CAAC;AACE,QAAc,KAAK,MAGvB,EAAO,WAAW,KAAY,GACzB,KACH,EAAS,KAAK,EAAS;;AAG3B,CAAI,EAAS,WACX,EAAO,WAAW;CAEpB,IAAM,IAAuB,GAA2B,GAAK,EAAK;AAIlE,QAHI,MAAyB,KAAK,MAChC,EAAO,uBAAuB,IAEzB;;AAET,SAAS,GAA2B,GAAK,GAAM;AAC7C,KAAI,EAAI,SAAS,KAAK,aAAa,WACjC,QAAO,EAAS,EAAI,SAAS,MAAM;EACjC,GAAG;EACH,aAAa,CAAC,GAAG,EAAK,aAAa,uBAAuB;EAC3D,CAAC;AAEJ,SAAQ,EAAI,aAAZ;EACE,KAAK,cACH,QAAO,EAAK;EACd,KAAK,SACH,QAAO,EAAK;EACd,KAAK,QACH,QAAO,EAAK,6BAA6B,WAAW,EAAK,8BAA8B,EAAK;;;AAGlG,SAAS,GAAe,GAAQ;AAC9B,KAAI;AACF,SAAO,EAAO,YAAY;SAChB;AACV,SAAO;;;AAKX,IAAI,MAAoB,GAAK,MAAS;AAEpC,KAAI,EAAK,YAAY,UAAU,KAAa,EAAK,cAAqC,UAAU,CAC9F,QAAO,EAAS,EAAI,UAAU,MAAM,EAAK;CAE3C,IAAM,IAAc,EAAS,EAAI,UAAU,MAAM;EAC/C,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAa;GAAS;GAAI;EACjD,CAAC;AACF,QAAO,IAAc,EAAE,OAAO,CAAC,EAAE,KAAK,GAAa,EAAE,EAAE,EAAY,EAAE,GAAG,GAAa;GAInF,MAAoB,GAAK,MAAS;AACpC,KAAI,EAAK,iBAAiB,QACxB,QAAO,EAAS,EAAI,GAAG,MAAM,EAAK;KACzB,EAAK,iBAAiB,SAC/B,QAAO,EAAS,EAAI,IAAI,MAAM,EAAK;CAErC,IAAM,IAAI,EAAS,EAAI,GAAG,MAAM;EAC9B,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAa;GAAS;GAAI;EACjD,CAAC;AAKF,QAAO,EACL,OAAO,CAAC,GALA,EAAS,EAAI,IAAI,MAAM;EAC/B,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAa;GAAS,IAAI,MAAM;GAAI;EAC3D,CAAC,CAEa,CAAC,QAAQ,MAAM,MAAM,KAAK,EAAE,EAC1C;;AAIH,SAAS,GAAgB,GAAK,GAAM;AAClC,QAAO,EAAS,EAAI,KAAK,MAAM,EAAK;;AAItC,SAAS,GAAY,GAAK,GAAM;CAK9B,IAAM,IAAS;EACb,MAAM;EACN,aAAa;EACb,OAPY,EAAS,EAAI,UAAU,MAAM;GACzC,GAAG;GACH,aAAa,CAAC,GAAG,EAAK,aAAa,QAAQ;GAC5C,CAAC;EAKD;AAOD,QANI,EAAI,YACN,EAAO,WAAW,EAAI,QAAQ,QAE5B,EAAI,YACN,EAAO,WAAW,EAAI,QAAQ,QAEzB;;AAIT,SAAS,GAAc,GAAK,GAAM;AAoB9B,QAnBE,EAAI,OACC;EACL,MAAM;EACN,UAAU,EAAI,MAAM;EACpB,OAAO,EAAI,MAAM,KACd,GAAG,MAAM,EAAS,EAAE,MAAM;GACzB,GAAG;GACH,aAAa;IAAC,GAAG,EAAK;IAAa;IAAS,GAAG;IAAI;GACpD,CAAC,CACH,CAAC,QACC,GAAK,MAAM,MAAM,KAAK,IAAI,IAAM,CAAC,GAAG,GAAK,EAAE,EAC5C,EAAE,CACH;EACD,iBAAiB,EAAS,EAAI,KAAK,MAAM;GACvC,GAAG;GACH,aAAa,CAAC,GAAG,EAAK,aAAa,kBAAkB;GACtD,CAAC;EACH,GAEM;EACL,MAAM;EACN,UAAU,EAAI,MAAM;EACpB,UAAU,EAAI,MAAM;EACpB,OAAO,EAAI,MAAM,KACd,GAAG,MAAM,EAAS,EAAE,MAAM;GACzB,GAAG;GACH,aAAa;IAAC,GAAG,EAAK;IAAa;IAAS,GAAG;IAAI;GACpD,CAAC,CACH,CAAC,QACC,GAAK,MAAM,MAAM,KAAK,IAAI,IAAM,CAAC,GAAG,GAAK,EAAE,EAC5C,EAAE,CACH;EACF;;AAKL,SAAS,KAAoB;AAC3B,QAAO,EACL,KAAK,GAAa,EACnB;;AAIH,SAAS,KAAkB;AACzB,QAAO,GAAa;;AAItB,IAAI,MAAoB,GAAK,MACpB,EAAS,EAAI,UAAU,MAAM,EAAK,EAIvC,MAAgB,GAAK,GAAU,MAAS;AAC1C,SAAQ,GAAR;EACE,KAAKC,EAAuB,UAC1B,QAAO,GAAe,GAAK,EAAK;EAClC,KAAKA,EAAuB,UAC1B,QAAO,GAAe,EAAI;EAC5B,KAAKA,EAAuB,UAC1B,QAAO,GAAe,GAAK,EAAK;EAClC,KAAKA,EAAuB,UAC1B,QAAO,GAAe,EAAI;EAC5B,KAAKA,EAAuB,WAC1B,QAAO,IAAiB;EAC1B,KAAKA,EAAuB,QAC1B,QAAO,GAAa,GAAK,EAAK;EAChC,KAAKA,EAAuB,aAC1B,QAAO,IAAmB;EAC5B,KAAKA,EAAuB,QAC1B,QAAO,IAAc;EACvB,KAAKA,EAAuB,SAC1B,QAAO,GAAc,GAAK,EAAK;EACjC,KAAKA,EAAuB;EAC5B,KAAKA,EAAuB,sBAC1B,QAAO,GAAc,GAAK,EAAK;EACjC,KAAKA,EAAuB,gBAC1B,QAAO,GAAqB,GAAK,EAAK;EACxC,KAAKA,EAAuB,SAC1B,QAAO,GAAc,GAAK,EAAK;EACjC,KAAKA,EAAuB,UAC1B,QAAO,GAAe,GAAK,EAAK;EAClC,KAAKA,EAAuB,WAC1B,QAAO,GAAgB,EAAI;EAC7B,KAAKA,EAAuB,QAC1B,QAAO,GAAa,EAAI;EAC1B,KAAKA,EAAuB,cAC1B,QAAO,GAAmB,EAAI;EAChC,KAAKA,EAAuB,YAC1B,QAAO,GAAiB,GAAK,EAAK;EACpC,KAAKA,EAAuB,YAC1B,QAAO,GAAiB,GAAK,EAAK;EACpC,KAAKA,EAAuB,OAC1B,QAAO,GAAY,GAAK,EAAK;EAC/B,KAAKA,EAAuB,OAC1B,QAAO,GAAY,GAAK,EAAK;EAC/B,KAAKA,EAAuB,QAC1B,cAAa,EAAI,QAAQ,CAAC;EAC5B,KAAKA,EAAuB,WAC1B,QAAO,GAAgB,GAAK,EAAK;EACnC,KAAKA,EAAuB;EAC5B,KAAKA,EAAuB,SAC1B,QAAO,IAAe;EACxB,KAAKA,EAAuB,WAC1B,QAAO,GAAgB,GAAK,EAAK;EACnC,KAAKA,EAAuB,OAC1B,QAAO,GAAa;EACtB,KAAKA,EAAuB,WAC1B,QAAO,IAAiB;EAC1B,KAAKA,EAAuB,WAC1B,QAAO,GAAgB,GAAK,EAAK;EACnC,KAAKA,EAAuB,WAC1B,QAAO,GAAgB,GAAK,EAAK;EACnC,KAAKA,EAAuB,YAC1B,QAAO,GAAiB,GAAK,EAAK;EACpC,KAAKA,EAAuB,SAC1B,QAAO,GAAc,GAAK,EAAK;EACjC,KAAKA,EAAuB,YAC1B,QAAO,GAAiB,GAAK,EAAK;EACpC,KAAKA,EAAuB;EAC5B,KAAKA,EAAuB;EAC5B,KAAKA,EAAuB,UAC1B;EACF,QACE,QAAuB,kBAAE,MAAM,KAAK,GAAG,EAAS;;GAKlD,MAAmB,GAAO,MAAU;CACtC,IAAI,IAAI;AACR,QAAO,IAAI,EAAM,UAAU,IAAI,EAAM,UAC/B,EAAM,OAAO,EAAM,IADoB;AAG7C,QAAO,EAAE,EAAM,SAAS,GAAG,UAAU,EAAE,GAAG,EAAM,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI;;AAIrE,SAAS,EAAS,GAAK,GAAM,IAAkB,IAAO;CAEpD,IAAM,IAAW,EAAK,KAAK,IAAI,EAAI;AACnC,KAAI,EAAK,UAAU;EACjB,IAAM,IAAwB,EAAK,UAAiC,KAClE,GACA,GACA,GACA,GACA,EACD;AACD,MAAI,MAAmB,GACrB,QAAO;;AAGX,KAAI,KAAY,CAAC,GAAiB;EAChC,IAAM,IAAa,GAAQ,GAAU,EAAK;AAC1C,MAAI,MAAe,KAAK,EACtB,QAAO;;CAGX,IAAM,IAAU;EAAE;EAAK,MAAM,EAAK;EAAa,YAAY,KAAK;EAAG;AACnE,GAAK,KAAK,IAAI,GAAK,EAAQ;CAC3B,IAAM,IAAqB,GAAa,GAAK,EAAI,UAAU,EAAK,EAC1D,IAAc,OAAO,KAAuB,aAAa,EAAS,GAAoB,EAAE,EAAK,GAAG;AAItG,KAHI,KACF,GAAQ,GAAK,GAAM,EAAY,EAE7B,EAAK,aAAa;EACpB,IAAM,IAAoB,EAAK,YAAY,GAAa,GAAK,EAAK;AAElE,SADA,EAAQ,aAAa,GACd;;AAGT,QADA,EAAQ,aAAa,GACd;;AAET,IAAI,MAAW,GAAM,MAAS;AAC5B,SAAQ,EAAK,cAAb;EACE,KAAK,OACH,QAAO,EAAE,MAAM,EAAK,KAAK,KAAK,IAAI,EAAE;EACtC,KAAK,WACH,QAAO,EAAE,MAAM,GAAgB,EAAK,aAAa,EAAK,KAAK,EAAE;EAC/D,KAAK;EACL,KAAK,OASH,QARI,EAAK,KAAK,SAAS,EAAK,YAAY,UAAU,EAAK,KAAK,OAAO,GAAO,MAAU,EAAK,YAAY,OAAW,EAAM,IACpH,QAAQ,KACN,mCAAmC,EAAK,YAAY,KAClD,IACD,CAAC,qBACH,EACM,GAAa,IAEf,EAAK,iBAAiB,SAAS,GAAa,GAAG,KAAK;;GAI7D,MAAW,GAAK,GAAM,OACpB,EAAI,gBACN,EAAY,cAAc,EAAI,cAEzB,IAIL,MAAW,MAAY;CACzB,IAAM,IAAW,GAAkB,EAAQ,EACrC,IAAc,EAAS,SAAS,KAAK,IAAqE,EAAS,WAA1E;EAAC,GAAG,EAAS;EAAU,EAAS;EAAgB,EAAS;EAAK;AAC7G,QAAO;EACL,GAAG;EACH;EACA,cAAc,KAAK;EACnB,MAAM,IAAI,IACR,OAAO,QAAQ,EAAS,YAAY,CAAC,KAAK,CAAC,GAAO,OAAS,CACzD,EAAI,MACJ;GACE,KAAK,EAAI;GACT,MAAM;IAAC,GAAG,EAAS;IAAU,EAAS;IAAgB;IAAM;GAE5D,YAAY,KAAK;GAClB,CACF,CAAC,CACH;EACF;GAIC,MAAoB,GAAQ,MAAY;CAE1C,IAAM,IAAO,GAAQ,EAAQ,EACzB,IAAc,OAAO,KAAY,YAAY,EAAQ,cAAc,OAAO,QAAQ,EAAQ,YAAY,CAAC,QACxG,GAAK,CAAC,GAAO,QAEL;EACL,GAAG;GACF,IAAe,EACd,EAAQ,MACR;GACE,GAAG;GACH,aAAa;IAAC,GAAG,EAAK;IAAU,EAAK;IAAgB;IAAM;GAC5D,EACD,GACD,IAAkB,GAAa;EACjC,GAEH,EAAE,CACH,GAAG,KAAK,GACH,IAAQ,OAAO,KAAY,WAAW,IAAW,GAAmC,iBAAkB,UAAU,KAAK,IAAI,GAAmC,MAC5J,IAAc,EAClB,EAAO,MACP,MAAU,KAAK,IAAI,IAAO;EACxB,GAAG;EACH,aAAa;GAAC,GAAG,EAAK;GAAU,EAAK;GAAgB;GAAM;EAC5D,EACD,GACD,IAAkB,GAAa,EAC1B,IAAQ,OAAO,KAAY,YAAY,EAAQ,SAAS,KAAK,KAAK,EAAQ,iBAAiB,UAAU,EAAQ,OAAO,KAAK;AAC/H,CAAI,MAAU,KAAK,MACjB,EAAK,QAAQ;CAEf,IAAM,IAAW,MAAU,KAAK,IAAI,IAAc;EAChD,GAAG;GACF,EAAK,iBAAiB;EACxB,GAAG,IAAO;EACT,MAAM;GACJ,GAAG,EAAK,iBAAiB,aAAa,EAAE,GAAG,EAAK;GAChD,EAAK;GACL;GACD,CAAC,KAAK,IAAI;GACV,EAAK,iBAAiB;GACrB,GAAG;IACF,IAAQ;GACV;EACF;AAED,QADA,EAAS,UAAU,2CACZ;GAIL,KAA+B,uBAAO,IAAI,mBAAmB;AAUjE,SAAS,GAAW,GAAa,EAC/B,gBACE,EAAE,EAAE;AACN,QAAO;GACJ,KAAe;EAChB,OAAO,KAAK;EAEZ,IAAI,aAAa;AAIf,UAHI,OAAO,KAAgB,eACzB,IAAc,GAAa,GAEtB;;EAET;EACD;;AAEH,SAAS,GAAS,GAAO;AACvB,QAAO,OAAO,KAAU,cAAY,KAAkB,MAAgB,KAAS,EAAM,QAAkB,MAAQ,gBAAgB,KAAS,cAAc;;AAExJ,SAAS,GAAS,GAAQ;AACxB,QAAO,KAAU,OAAO,GAAW;EAAE,YAAY,EAAE;EAAE,sBAAsB;EAAO,CAAC,GAAG,GAAS,EAAO,GAAG,IAAS,eAAe,IAAS,EAAO,aAAa,WAAW,QAAQ,GAAU,EAAO,GAAG,GAAe,EAAO,GAAG,GAAQ;;AAExO,SAAS,GAAe,GAAiB;AACvC,QAAO,SACC,GACJ,EAAgB,aAAa,WAAW,MAAM,EAC5C,QAAQ,YACT,CAAC,CACH,EACD,EACE,UAAU,OAAO,MAAU;EACzB,IAAM,IAAS,MAAM,EAAgB,aAAa,SAAS,EAAM;AACjE,SAAO,WAAW,IAAS;GAAE,SAAS;GAAM,OAAO,EAAO;GAAO,GAAG;GAClE,SAAS;GACT,OAAO,IAAI,GAAoB;IAC7B;IACA,OAAO,EAAO;IACf,CAAC;GACH;IAEJ,CACF;;AAEH,SAAS,GAAW,GAAY,GAAS;CAEvC,IAAM,IAAuB,GAAmC,iBAA+B;AAC/F,QAAO,SAEC,GAAiB,GAAY,EACjC,cAAc,IAAgB,SAAS,QACxC,CAAC,EACF,EACE,UAAU,OAAO,MAAU;EACzB,IAAM,IAAS,MAAM,EAAW,eAAe,EAAM;AACrD,SAAO,EAAO,UAAU;GAAE,SAAS;GAAM,OAAO,EAAO;GAAM,GAAG;GAAE,SAAS;GAAO,OAAO,EAAO;GAAO;IAE1G,CACF;;AAEH,SAAS,GAAW,GAAY,GAAS;CAEvC,IAAM,IAAuB,GAAmC,iBAA+B;AAC/F,QAAO,SAEC,GACJC,GAAgB,GAAY;EAC1B,QAAQ;EACR,IAAI;EACJ,QAAQ,IAAgB,QAAQ;EACjC,CAAC,CACH,EACD,EACE,UAAU,OAAO,MAAU;EACzB,IAAM,IAAS,MAAMC,GAAkB,GAAY,EAAM;AACzD,SAAO,EAAO,UAAU;GAAE,SAAS;GAAM,OAAO,EAAO;GAAM,GAAG;GAAE,SAAS;GAAO,OAAO,EAAO;GAAO;IAE1G,CACF;;AAEH,SAAS,GAAa,GAAY;AAChC,QAAO,UAAU;;AAEnB,SAAS,GAAU,GAAY,GAAS;AAIpC,QAHE,GAAa,EAAW,GACnB,GAAW,GAAY,EAAQ,GAE/B,GAAW,GAAY,EAAQ;;AAgB1C,eAAe,GAAkB,EAC/B,UACA,WACA,cACC;CACD,IAAM,IAAe,GAAS,EAAO;AACrC,KAAI;AACF,MAAI,EAAa,YAAY,KAC3B,QAAO;GAAE,SAAS;GAAM;GAAO,UAAU;GAAO;EAElD,IAAM,IAAS,MAAM,EAAa,SAAS,EAAM;AAIjD,SAHI,EAAO,UACF;GAAE,SAAS;GAAM,OAAO,EAAO;GAAO,UAAU;GAAO,GAEzD;GACL,SAAS;GACT,OAAOC,GAAqB,KAAK;IAAE;IAAO,OAAO,EAAO;IAAO;IAAS,CAAC;GACzE,UAAU;GACX;UACM,GAAO;AACd,SAAO;GACL,SAAS;GACT,OAAOA,GAAqB,KAAK;IAAE;IAAO,OAAO;IAAO;IAAS,CAAC;GAClE,UAAU;GACX;;;AAsBL,eAAe,GAAc,EAC3B,SACA,aACC;AACD,KAAI;EACF,IAAM,IAAQ,GAAgB,EAAK;AAInC,SAHI,KAAU,OACL;GAAE,SAAS;GAAM;GAAO,UAAU;GAAO,GAE3C,MAAM,GAAkB;GAAE;GAAO;GAAQ,CAAC;UAC1C,GAAO;AACd,SAAO;GACL,SAAS;GACT,OAAO,GAAe,WAAW,EAAM,GAAG,IAAQ,IAAI,GAAe;IAAE;IAAM,OAAO;IAAO,CAAC;GAC5F,UAAU,KAAK;GAChB;;;AAsPL,eAAe,GAAQ,GAAO;AAI5B,QAHI,OAAO,KAAU,eACnB,IAAQ,GAAO,GAEV,QAAQ,QAAQ,EAAM;;;;ACr9E/B,IAAI,KAAY,OAAO,gBACnB,MAAY,GAAQ,MAAQ;AAC9B,MAAK,IAAI,KAAU,EACjB,IAAU,GAAQ,GAAQ;EAAE,KAAK,EAAI;EAAS,YAAY;EAAM,CAAC;GA4MjE,KAAQ,6BACR,KAAU,mBAAmB,MAC7B,KAAU,OAAO,IAAI,GAAQ,EAC7B,IACA,KAAyB,cAAcC,GAAY;CACrD,YAAY,EACV,aAAU,wBACV,UACA,MAAM,GACN,aACA,UACA,mBACC;AAMD,EALA,MAAM;GAAE,MAAM;GAAO;GAAS;GAAO,CAAC,EACtC,KAAK,MAAO,IACZ,KAAK,OAAO,GACZ,KAAK,WAAW,GAChB,KAAK,QAAQ,GACb,KAAK,eAAe;;CAEtB,OAAO,WAAW,GAAO;AACvB,SAAOA,GAAY,UAAU,GAAO,GAAQ;;;AAGhD,KAAM;AAKN,IA49BI,KAAoBE,EAAQ;CAC9BC,GAAU;CACVC,GAAa,WAAW;CACxBA,GAAa,YAAY;CACzBC,IAEG,MAEsB,WAAW,QAAgC,SAAS,EAAM,IAAiB,IAElG,EAAE,SAAS,oBAAoB,CAChC;CACF,CAAC,EA+lBE,KAAkBC,SACdC,EAAS;CACbC,IAAS;CACTC,GAAW;CACXC,IAAW;CACXC,IAAY;CACZC,GAAUH,GAAW,EAAE,GAAgB,UAAU,CAAC;CAClDI,GAAS,GAAgB;CAC1B,CAAC,CACH,EAGG,IAAyBC,GAC3BC,GAAW,EACXD,GAAUC,GAAW,EAAE,GAAgB,UAAU,CAAC,CACnD,EAIG,KAAiBC,EAAU;CAC7B,MAAMC,EAAW,OAAO;CACxB,MAAMC,GAAW;CACjB,iBAAiB,EAAuB,UAAU;CACnD,CAAC,EACE,KAAkBF,EAAU;CAC9B,MAAMC,EAAW,QAAQ;CACzB,OAAOE,EAAS,CAAC,IAAmBC,GAAc,IAAI,CAAC,CAAC;CACxD,WAAWF,GAAW,CAAC,UAAU;CACjC,iBAAiB,EAAuB,UAAU;CACnD,CAAC,EACE,KAAiBF,EAAU;CAC7B,MAAMC,EAAW,OAAO;CACxB,MAAME,EAAS,CAAC,IAAmBC,GAAc,IAAI,CAAC,CAAC;CACvD,UAAUF,GAAW,CAAC,UAAU;CAChC,WAAWA,GAAW;CACtB,iBAAiB,EAAuB,UAAU;CACnD,CAAC,EACE,KAAsBF,EAAU;CAClC,MAAMC,EAAW,YAAY;CAC7B,MAAMC,GAAW;CACjB,iBAAiB,EAAuB,UAAU;CACnD,CAAC,EACE,KAAqBF,EAAU;CACjC,MAAMC,EAAW,YAAY;CAC7B,YAAYC,GAAW;CACvB,UAAUA,GAAW;CACrB,OAAOG,IAAY;CACnB,iBAAiB,EAAuB,UAAU;CAClD,kBAAkBC,IAAY,CAAC,UAAU;CAC1C,CAAC,EACE,KAAeC,GACjB,QACA;CACEP,EAAU;EACR,MAAMC,EAAW,OAAO;EACxB,OAAOC,GAAW;EAClB,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CACFF,EAAU;EACR,MAAMC,EAAW,OAAO;EACxB,OAAO;EACP,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CACFD,EAAU;EACR,MAAMC,EAAW,mBAAmB;EACpC,QAAQC,GAAW,CAAC,UAAU;EAC9B,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CACFF,EAAU;EACR,MAAMC,EAAW,aAAa;EAC9B,OAAOC,GAAW;EAClB,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CACFF,EAAU;EACR,MAAMC,EAAW,aAAa;EAC9B,OAAO;EACP,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CACFD,EAAU;EACR,MAAMC,EAAW,UAAU;EAC3B,OAAOO,GACLL,EAAS;GACPH,EAAU;IACR,MAAMC,EAAW,OAAO;IACxB,MAAMC,GAAW;IACjB,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,QAAQ;IACzB,MAAMC,GAAW;IACjB,WAAWA,GAAW;IACvB,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,YAAY;IAC7B,MAAMC,GAAW;IACjB,WAAWA,GAAW;IACtB,UAAUA,GAAW,CAAC,UAAU;IAChC,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,WAAW;IAC5B,KAAKC,GAAW;IAChB,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,UAAU;IAC3B,QAAQE,EAAS,CAACD,GAAW,EAAEO,GAAUP,GAAW,EAAEA,GAAW,CAAC,CAAC,CAAC;IACpE,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,aAAa;IAC9B,MAAMC,GAAW;IACjB,WAAWA,GAAW;IACtB,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,YAAY;IAC7B,KAAKC,GAAW;IAChB,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,gBAAgB;IACjC,QAAQE,EAAS,CAACD,GAAW,EAAEO,GAAUP,GAAW,EAAEA,GAAW,CAAC,CAAC,CAAC;IACpE,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACFF,EAAU;IACR,MAAMC,EAAW,SAAS;IAC1B,iBAAiB,EAAuB,UAAU;IACnD,CAAC;GACH,CAAC,CACH;EACF,CAAC;CACH,CACF,EACG,KAAuBD,EAAU;CACnC,MAAMC,EAAW,cAAc;CAC/B,YAAYC,GAAW;CACvB,UAAUA,GAAW;CACrB,QAAQ;CACR,iBAAiB,EAAuB,UAAU;CACnD,CAAC,EACE,KAA4BF,EAAU;CACxC,MAAMC,EAAW,wBAAwB;CACzC,YAAYC,GAAW;CACvB,YAAYA,GAAW;CACxB,CAAC,EACE,KAA6BF,EAAU;CACzC,MAAMC,EAAW,yBAAyB;CAC1C,YAAYC,GAAW;CACvB,UAAUI,IAAY;CACtB,QAAQJ,GAAW,CAAC,UAAU;CAC/B,CAAC;AAwCuBW,EAAS;CArCHH,EAC7B;EACE,MAAMC,EAAW,SAAS;EAC1B,SAASC,GAAW;EACpB,iBAAiB,EAAuB,UAAU;EACnD,CACF;CAC4BF,EAAU;EACrC,MAAMC,EAAW,OAAO;EACxB,SAASE,EAAS,CAChBD,GAAW,EACXE,GAASD,EAAS;GAAC;GAAgB;GAAiB;GAAe,CAAC,CAAC,CACtE,CAAC;EACF,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CACgCH,EAAU;EAC1C,MAAMC,EAAW,YAAY;EAC7B,SAASE,EAAS,CAChBD,GAAW,EACXE,GACED,EAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,CACH,CACF,CAAC;EACF,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CAC2BH,EAAU;EACrC,MAAMC,EAAW,OAAO;EACxB,SAASG,GAASD,EAAS,CAAC,IAAsB,GAA2B,CAAC,CAAC;EAC/E,iBAAiB,EAAuB,UAAU;EACnD,CAAC;CAMD,CAAC,EAk6BF,GADqB,EAAE,EACE;CACvB,aAAa;CACb,cAAc;CACd,YAAY;CACZ,cAAc;CACd,YAAY;CACb,CAAC;AAeF,SAAS,GAAQ,GAAO;CACtB,IAAM,IAAQ,CAAC,OAAO,EAClB,IAAiB,IACjB,IAAe;CACnB,SAAS,EAAkB,GAAM,GAAG,GAAW;AAE3C,UAAQ,GAAR;GACE,KAAK;AAIH,IAHA,IAAiB,GACjB,EAAM,KAAK,EACX,EAAM,KAAK,EAAU,EACrB,EAAM,KAAK,gBAAgB;AAC3B;GAEF,KAAK;GACL,KAAK;GACL,KAAK;AAKH,IAJA,IAAiB,GACjB,IAAe,GACf,EAAM,KAAK,EACX,EAAM,KAAK,EAAU,EACrB,EAAM,KAAK,iBAAiB;AAC5B;GAEF,KAAK;AAGH,IAFA,EAAM,KAAK,EACX,EAAM,KAAK,EAAU,EACrB,EAAM,KAAK,gBAAgB;AAC3B;GAEF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AAIH,IAHA,IAAiB,GACjB,EAAM,KAAK,EACX,EAAM,KAAK,EAAU,EACrB,EAAM,KAAK,gBAAgB;AAC3B;GAEF,KAAK;AAIH,IAHA,IAAiB,GACjB,EAAM,KAAK,EACX,EAAM,KAAK,EAAU,EACrB,EAAM,KAAK,sBAAsB;AACjC;GAEF,KAAK;AAIH,IAHA,IAAiB,GACjB,EAAM,KAAK,EACX,EAAM,KAAK,EAAU,EACrB,EAAM,KAAK,qBAAqB;AAChC;;;CAKR,SAAS,EAAwB,GAAM,GAAG;AACxC,UAAQ,GAAR;GACE,KAAK;AAEH,IADA,EAAM,KAAK,EACX,EAAM,KAAK,4BAA4B;AACvC;GAEF,KAAK;AAEH,IADA,IAAiB,GACjB,EAAM,KAAK;AACX;;;CAIN,SAAS,EAAuB,GAAM,GAAG;AACvC,UAAQ,GAAR;GACE,KAAK;AAEH,IADA,EAAM,KAAK,EACX,EAAM,KAAK,2BAA2B;AACtC;GAEF,KAAK;AAEH,IADA,IAAiB,GACjB,EAAM,KAAK;AACX;;;AAIN,MAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAO,EAAM;AAEnB,UADqB,EAAM,EAAM,SAAS,IAC1C;GACE,KAAK;AACH,MAAkB,GAAM,GAAG,SAAS;AACpC;GACF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;AAEH,MADA,EAAM,KAAK,EACX,EAAM,KAAK,oBAAoB;AAC/B;KAEF,KAAK;AAEH,MADA,IAAiB,GACjB,EAAM,KAAK;AACX;;AAGJ;GAEF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;AAEH,MADA,EAAM,KAAK,EACX,EAAM,KAAK,oBAAoB;AAC/B;;AAGJ;GAEF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;AAEH,MADA,EAAM,KAAK,EACX,EAAM,KAAK,0BAA0B;AACrC;;AAGJ;GAEF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;AAEH,MADA,EAAM,KAAK,EACX,EAAM,KAAK,6BAA6B;AACxC;;AAGJ;GAEF,KAAK;AACH,MAAkB,GAAM,GAAG,4BAA4B;AACvD;GAEF,KAAK;AACH,MAAwB,GAAM,EAAE;AAChC;GAEF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;AAEH,MADA,EAAM,KAAK,EACX,IAAiB;AACjB;KAEF,KAAK;AACH,QAAM,KAAK,uBAAuB;AAClC;KAEF,QACE,KAAiB;;AAGrB;GAEF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;AAEH,MADA,IAAiB,GACjB,EAAM,KAAK;AACX;KAEF;AAEE,MADA,IAAiB,GACjB,EAAkB,GAAM,GAAG,2BAA2B;AACtD;;AAGJ;GAEF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;AAEH,MADA,EAAM,KAAK,EACX,EAAM,KAAK,2BAA2B;AACtC;KAEF,KAAK;AAEH,MADA,IAAiB,GACjB,EAAM,KAAK;AACX;KAEF;AACE,UAAiB;AACjB;;AAGJ;GAEF,KAAK;AACH,MAAkB,GAAM,GAAG,2BAA2B;AACtD;GAEF,KAAK;AAEH,IADA,EAAM,KAAK,EACX,IAAiB;AACjB;GAEF,KAAK;AACH,YAAQ,GAAR;KACE,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;AACH,UAAiB;AACjB;KAEF,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK,IACH;KAEF,KAAK;AAKH,MAJA,EAAM,KAAK,EACP,EAAM,EAAM,SAAS,OAAO,8BAC9B,EAAuB,GAAM,EAAE,EAE7B,EAAM,EAAM,SAAS,OAAO,+BAC9B,EAAwB,GAAM,EAAE;AAElC;KAEF,KAAK;AAEH,MADA,EAAM,KAAK,EACP,EAAM,EAAM,SAAS,OAAO,+BAC9B,EAAwB,GAAM,EAAE;AAElC;KAEF,KAAK;AAEH,MADA,EAAM,KAAK,EACP,EAAM,EAAM,SAAS,OAAO,8BAC9B,EAAuB,GAAM,EAAE;AAEjC;KAEF;AACE,QAAM,KAAK;AACX;;AAGJ;GAEF,KAAK,kBAAkB;IACrB,IAAM,IAAiB,EAAM,UAAU,GAAc,IAAI,EAAE;AAC3D,IAAI,CAAC,QAAQ,WAAW,EAAe,IAAI,CAAC,OAAO,WAAW,EAAe,IAAI,CAAC,OAAO,WAAW,EAAe,IACjH,EAAM,KAAK,EACP,EAAM,EAAM,SAAS,OAAO,8BAC9B,EAAwB,GAAM,EAAE,GACvB,EAAM,EAAM,SAAS,OAAO,8BACrC,EAAuB,GAAM,EAAE,IAGjC,IAAiB;AAEnB;;;;CAIN,IAAI,IAAS,EAAM,MAAM,GAAG,IAAiB,EAAE;AAC/C,MAAK,IAAI,IAAI,EAAM,SAAS,GAAG,KAAK,GAAG,IAErC,SADc,EAAM,IACpB;EACE,KAAK;AACH,QAAU;AACV;EAEF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;AACH,QAAU;AACV;EAEF,KAAK;EACL,KAAK;EACL,KAAK;AACH,QAAU;AACV;EAEF,KAAK,kBAAkB;GACrB,IAAM,IAAiB,EAAM,UAAU,GAAc,EAAM,OAAO;AAClE,GAAI,OAAO,WAAW,EAAe,GACnC,KAAU,OAAO,MAAM,EAAe,OAAO,GACpC,QAAQ,WAAW,EAAe,GAC3C,KAAU,QAAQ,MAAM,EAAe,OAAO,GACrC,OAAO,WAAW,EAAe,KAC1C,KAAU,OAAO,MAAM,EAAe,OAAO;;;AAKrD,QAAO;;AAIT,eAAe,GAAiB,GAAU;AACxC,KAAI,MAAa,KAAK,EACpB,QAAO;EAAE,OAAO,KAAK;EAAG,OAAO;EAAmB;CAEpD,IAAI,IAAS,MAAM,GAAc,EAAE,MAAM,GAAU,CAAC;AAQpD,QAPI,EAAO,UACF;EAAE,OAAO,EAAO;EAAO,OAAO;EAAoB,IAE3D,IAAS,MAAM,GAAc,EAAE,MAAM,GAAQ,EAAS,EAAE,CAAC,EACrD,EAAO,UACF;EAAE,OAAO,EAAO;EAAO,OAAO;EAAkB,GAElD;EAAE,OAAO,KAAK;EAAG,OAAO;EAAgB;;AAIjD,IAAI,YAAc;CAChB,MAAM;CACN,gBAAgB,QAAQ,QAAQ,EAAE,MAAM,QAAQ,CAAC;CACjD,MAAM,oBAAoB,EAAE,MAAM,KAAS;AACzC,SAAO;;CAET,MAAM,mBAAmB,EAAE,MAAM,KAAS;AACxC,SAAO,EAAE,SAAS,GAAO;;CAE3B,+BAA+B;CAGhC,GACG,MAAU,EACZ,QAAQ,GACR,MAAM,GACN,qBACI;CACJ,IAAM,IAASE,GAAU,EAAY;AACrC,QAAO;EACL,MAAM;EACN,gBAAgB,GAAQ,EAAO,WAAW,CAAC,MAAM,OAAiB;GAChE,MAAM;GACN,QAAQ;GACR,GAAG,KAAU,QAAQ,EAAE,MAAM,GAAQ;GACrC,GAAG,KAAe,QAAQ,EAAE,gBAAa;GAC1C,EAAE;EACH,MAAM,oBAAoB,EAAE,MAAM,KAAS,GAAU;GACnD,IAAM,IAAc,MAAMC,GAAe,EAAE,MAAM,GAAO,CAAC;AACzD,OAAI,CAAC,EAAY,QACf,OAAM,IAAI,GAAuB;IAC/B,SAAS;IACT,OAAO,EAAY;IACnB,MAAM;IACN,UAAU,EAAS;IACnB,OAAO,EAAS;IAChB,cAAc,EAAS;IACxB,CAAC;GAEJ,IAAM,IAAmB,MAAMC,GAAmB;IAChD,OAAO,EAAY;IACnB;IACD,CAAC;AACF,OAAI,CAAC,EAAiB,QACpB,OAAM,IAAI,GAAuB;IAC/B,SAAS;IACT,OAAO,EAAiB;IACxB,MAAM;IACN,UAAU,EAAS;IACnB,OAAO,EAAS;IAChB,cAAc,EAAS;IACxB,CAAC;AAEJ,UAAO,EAAiB;;EAE1B,MAAM,mBAAmB,EAAE,MAAM,KAAS;GACxC,IAAM,IAAS,MAAM,GAAiB,EAAM;AAC5C,WAAQ,EAAO,OAAf;IACE,KAAK;IACL,KAAK,kBACH;IAEF,KAAK;IACL,KAAK,mBACH,QAAO,EAEL,SAAS,EAAO,OACjB;;;EAIP,+BAA+B;EAGhC;GAEC,MAAS,EACX,SAAS,GACT,MAAM,GACN,qBACI;CACJ,IAAM,IAAgBF,GAAU,EAAmB;AACnD,QAAO;EACL,MAAM;EAEN,gBAAgB,GAAQ,EAAc,WAAW,CAAC,MAAM,MAAgB;GACtE,IAAM,EAAE,YAAS,GAAG,MAAe;AACnC,UAAO;IACL,MAAM;IACN,QAAQ;KACN,SAAS;KACT,MAAM;KACN,YAAY,EACV,UAAU;MAAE,MAAM;MAAS,OAAO;MAAY,EAC/C;KACD,UAAU,CAAC,WAAW;KACtB,sBAAsB;KACvB;IACD,GAAG,KAAU,QAAQ,EAAE,MAAM,GAAQ;IACrC,GAAG,KAAe,QAAQ,EAAE,gBAAa;IAC1C;IACD;EACF,MAAM,oBAAoB,EAAE,MAAM,KAAS,GAAU;GACnD,IAAM,IAAc,MAAMC,GAAe,EAAE,MAAM,GAAO,CAAC;AACzD,OAAI,CAAC,EAAY,QACf,OAAM,IAAI,GAAuB;IAC/B,SAAS;IACT,OAAO,EAAY;IACnB,MAAM;IACN,UAAU,EAAS;IACnB,OAAO,EAAS;IAChB,cAAc,EAAS;IACxB,CAAC;GAEJ,IAAM,IAAa,EAAY;AAC/B,OAA0B,OAAO,KAAe,aAA5C,KAAwD,EAAE,cAAc,MAAe,CAAC,MAAM,QAAQ,EAAW,SAAS,CAC5H,OAAM,IAAI,GAAuB;IAC/B,SAAS;IACT,OAAO,IAAIE,GAAqB;KAC9B,OAAO;KACP,OAAO;KACR,CAAC;IACF,MAAM;IACN,UAAU,EAAS;IACnB,OAAO,EAAS;IAChB,cAAc,EAAS;IACxB,CAAC;AAEJ,QAAK,IAAM,KAAW,EAAW,UAAU;IACzC,IAAM,IAAmB,MAAMD,GAAmB;KAChD,OAAO;KACP,QAAQ;KACT,CAAC;AACF,QAAI,CAAC,EAAiB,QACpB,OAAM,IAAI,GAAuB;KAC/B,SAAS;KACT,OAAO,EAAiB;KACxB,MAAM;KACN,UAAU,EAAS;KACnB,OAAO,EAAS;KAChB,cAAc,EAAS;KACxB,CAAC;;AAGN,UAAO,EAAW;;EAEpB,MAAM,mBAAmB,EAAE,MAAM,KAAS;GACxC,IAAM,IAAS,MAAM,GAAiB,EAAM;AAC5C,WAAQ,EAAO,OAAf;IACE,KAAK;IACL,KAAK,kBACH;IAEF,KAAK;IACL,KAAK,oBAAoB;KACvB,IAAM,IAAa,EAAO;AAC1B,SAA0B,OAAO,KAAe,aAA5C,KAAwD,EAAE,cAAc,MAAe,CAAC,MAAM,QAAQ,EAAW,SAAS,CAC5H;KAEF,IAAM,IAAc,EAAO,UAAU,oBAAoB,EAAW,SAAS,SAAS,IAAI,EAAW,SAAS,MAAM,GAAG,GAAG,GAAG,EAAW,UAClI,IAAiB,EAAE;AACzB,UAAK,IAAM,KAAc,GAAa;MACpC,IAAM,IAAmB,MAAMA,GAAmB;OAChD,OAAO;OACP,QAAQ;OACT,CAAC;AACF,MAAI,EAAiB,WACnB,EAAe,KAAK,EAAiB,MAAM;;AAG/C,YAAO,EAAE,SAAS,GAAgB;;;;EAIxC,+BAA+B;GAC7B,IAAI,IAAoB;AACxB,UAAO,IAAI,gBAAgB,EACzB,UAAU,EAAE,oBAAiB,GAAY;AACvC,QAAI,KAAiB,KACnB,QAAO,IAAoB,EAAc,QAAQ,IAC/C,GAAW,QAAQ,EAAc,GAAmB;MAI3D,CAAC;;EAEL;GAEC,MAAU,EACZ,SAAS,GACT,MAAM,GACN,sBAEO;CACL,MAAM;CAEN,gBAAgB,QAAQ,QAAQ;EAC9B,MAAM;EACN,QAAQ;GACN,SAAS;GACT,MAAM;GACN,YAAY,EACV,QAAQ;IAAE,MAAM;IAAU,MAAM;IAAe,EAChD;GACD,UAAU,CAAC,SAAS;GACpB,sBAAsB;GACvB;EACD,GAAG,KAAU,QAAQ,EAAE,MAAM,GAAQ;EACrC,GAAG,KAAe,QAAQ,EAAE,gBAAa;EAC1C,CAAC;CACF,MAAM,oBAAoB,EAAE,MAAM,KAAS,GAAU;EACnD,IAAM,IAAc,MAAMD,GAAe,EAAE,MAAM,GAAO,CAAC;AACzD,MAAI,CAAC,EAAY,QACf,OAAM,IAAI,GAAuB;GAC/B,SAAS;GACT,OAAO,EAAY;GACnB,MAAM;GACN,UAAU,EAAS;GACnB,OAAO,EAAS;GAChB,cAAc,EAAS;GACxB,CAAC;EAEJ,IAAM,IAAa,EAAY;AAC/B,MAA0B,OAAO,KAAe,aAA5C,KAAwD,EAAE,YAAY,MAAe,OAAO,EAAW,UAAW,YAAY,CAAC,EAAc,SAAS,EAAW,OAAO,CAC1K,OAAM,IAAI,GAAuB;GAC/B,SAAS;GACT,OAAO,IAAIE,GAAqB;IAC9B,OAAO;IACP,OAAO;IACR,CAAC;GACF,MAAM;GACN,UAAU,EAAS;GACnB,OAAO,EAAS;GAChB,cAAc,EAAS;GACxB,CAAC;AAEJ,SAAO,EAAW;;CAEpB,MAAM,mBAAmB,EAAE,MAAM,KAAS;EACxC,IAAM,IAAS,MAAM,GAAiB,EAAM;AAC5C,UAAQ,EAAO,OAAf;GACE,KAAK;GACL,KAAK,kBACH;GAEF,KAAK;GACL,KAAK,oBAAoB;IACvB,IAAM,IAAa,EAAO;AAC1B,QAA0B,OAAO,KAAe,aAA5C,KAAwD,EAAE,YAAY,MAAe,OAAO,EAAW,UAAW,SACpH;IAEF,IAAM,IAAmB,EAAc,QACpC,MAAiB,EAAa,WAAW,EAAW,OAAO,CAC7D;AAIC,WAHE,EAAO,UAAU,qBACZ,EAAiB,SAAS,EAAW,OAAO,GAAG,EAAE,SAAS,EAAW,QAAQ,GAAG,KAAK,IAErF,EAAiB,WAAW,IAAI,EAAE,SAAS,EAAiB,IAAI,GAAG,KAAK;;;;CAKvF,+BAA+B;CAGhC,GAEC,MAAQ,EACV,MAAM,GACN,mBACE,EAAE,MACG;CACL,MAAM;CACN,gBAAgB,QAAQ,QAAQ;EAC9B,MAAM;EACN,GAAG,KAAU,QAAQ,EAAE,MAAM,GAAQ;EACrC,GAAG,KAAe,QAAQ,EAAE,gBAAa;EAC1C,CAAC;CACF,MAAM,oBAAoB,EAAE,MAAM,KAAS,GAAU;EACnD,IAAM,IAAc,MAAMF,GAAe,EAAE,MAAM,GAAO,CAAC;AACzD,MAAI,CAAC,EAAY,QACf,OAAM,IAAI,GAAuB;GAC/B,SAAS;GACT,OAAO,EAAY;GACnB,MAAM;GACN,UAAU,EAAS;GACnB,OAAO,EAAS;GAChB,cAAc,EAAS;GACxB,CAAC;AAEJ,SAAO,EAAY;;CAErB,MAAM,mBAAmB,EAAE,MAAM,KAAS;EACxC,IAAM,IAAS,MAAM,GAAiB,EAAM;AAC5C,UAAQ,EAAO,OAAf;GACE,KAAK;GACL,KAAK,kBACH;GAEF,KAAK;GACL,KAAK,mBACH,QAAO,EAAO,UAAU,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS,EAAO,OAAO;;;CAIzE,+BAA+B;CAGhC;AAmYsB,GAAkB;CACzC,QAAQ;CACR,MAAM;CACP,CAAC,EAm9B2C;AAyO7C,SAAS,GAAa,GAAM;AAC1B,QAAO,EAAK,KAAK,WAAW,QAAQ;;AA0mCZW,GAAmB;CAC3C,QAAQ;CACR,MAAM;CACP,CAAC,EAqmHwBY,GAAmB;CAAE,QAAQ;CAAS,MAAM;CAAI,CAAC,EA4ZjDC,GAAmB;CAAE,QAAQ;CAAS,MAAM;CAAI,CAAC;;;ACloU3E,IAAM,KAAN,MAAgD;CAW9C,YAAY,GAAuB,IAA8B,EAAE,EAAE;AASnE,mCAd2B,IAAI,KAA0B,kBACvB,EAAE,iBAEpB,IAGhB,KAAK,UAAU,GACf,KAAK,mBAAmB,EAAQ,UAChC,KAAK,iBAAiB,EAAQ,QAC9B,KAAK,iBACH,EAAQ,oBACD,KAGT,KAAK,UAAU,EAAQ,QAAQ,YAAY,EAAE,WAAW,eAAe,CAAC;;CAI1E,MAAM,gBAAgB,GAAyB,GAAkD;AAE/F,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,yCAAyC,EAAE,MAAM,EAAQ,MAAM,CAAC;EACpF,IAAM,IAAM,KAAK,sBAAsB,GAAS,EAAK;AACrD,SAAO,KAAK,QAAQ,QAAQ,EAAI;;CAIlC,MAAM,qBAAqB,GAA4B,GAAkD;AAEvG,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,8CAA8C,EAAE,OAAO,EAAS,QAAQ,CAAC;EAC7F,IAAM,IAAO,EAAS,KAAK,MAAM,KAAK,sBAAsB,GAAG,EAAK,CAAC;AAIrE,OAAK,IAAM,KAAO,EAEf,GAAI,OAA+C,QAAQ,KAAmB;AAEjF,SAAO,KAAK,QAAQ,QAAQ,EAAK;;CAInC,MAAM,YAAY,GAAkB,GAAwB,GAAoC;AAE9F,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,qCAAqC;GAAE,MAAM,EAAQ;GAAM;GAAU,CAAC;EAE1F,IAAM,IAAa,KAAK,cAAc,EAAQ,WAAW,EAAE,EAAE,EAAK;AAGlE,EAFA,EAAW,KAAiB,QAC5B,EAAW,KAAiB,aAC5B,EAAW,KAAoB;EAE/B,IAAM,IAAW,KAAK,iBAAiB,EAAK,EACtC,IAAoB;GACxB,MAAM,EAAQ;GACd,MAAM,EAAQ;GACd,QAAQ,EAAE,SAAS,GAAY;GAC/B,GAAI,IAAW,EAAE,aAAU,GAAG,EAAE;GACjC;AAED,OAAK,iBAAiB,EAAI;EAE1B,IAAM,KADS,MAAM,KAAK,QAAQ,QAAQ,EAAI,EACxB,QAAQ;AAG9B,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,0DAA0D,EAAQ,KAAK,eAAe,EAAS,IAC/F,EAAU,YACV,IACD;AAYH,EATA,KAAK,UAAU,IAAI,GAAU;GAC3B;GACA,MAAM,EAAQ;GACd;GACA,aAAa,EAAQ;GACrB,mBAAmB;GACnB,SAAS;GACV,CAAC,EAEF,KAAK,SAAS,MAAM,oDAAoD;GACtE,MAAM,EAAQ;GACd;GACA;GACD,CAAC;;CAIJ,aAAa,GAAkB,GAAoB;AACjD,OAAK,kBAAkB;EAEvB,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,8DAA8D,EAAS,IACvE,EAAU,iBACV,IACD;AAGH,IAAQ,eAAe;EAEvB,IAAM,IAA0B;GAC9B,QAAQ,EAAQ;GAChB;GACA,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAQ,mBAAmB,EAAE;GACtD;AAED,OAAK,iBAAiB,EAAU;EAChC,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAU;AAC/C,OAAK,SAAS,KAAK;GAAE,SAAS;GAAG;GAAU,CAAC;;CAI9C,MAAM,YAAY,GAAkB,GAAuC;AAEzE,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,qCAAqC,EAAE,aAAU,CAAC;EAEtE,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,0DAA0D,EAAS,IACnE,EAAU,iBACV,IACD;AAIH,IAAQ,eAAe,EAAQ;EAE/B,IAAM,IAAa,KAAK,qBAAqB,GAAS,EAAQ,WAAW,EAAE,CAAC;AAC5E,IAAW,KAAiB;EAE5B,IAAM,IAAoB;GACxB,QAAQ,EAAQ;GAChB,MAAM,EAAQ;GACd,QAAQ,EAAE,SAAS,GAAY;GAChC;AAED,OAAK,iBAAiB,EAAI;EAC1B,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAI;AAKzC,EAJA,KAAK,SAAS,KAAK;GAAE,SAAS;GAAG;GAAU,CAAC,EAE5C,MAAM,KAAK,eAAe,EAE1B,KAAK,SAAS,MAAM,mDAAmD,EAAE,aAAU,CAAC;;CAItF,MAAM,YAAY,GAAkB,GAAoC;AAEtE,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,qCAAqC,EAAE,aAAU,CAAC;EAEtE,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,MAAI,CAAC,EACH,OAAM,IAAI,EAAK,UACb,0DAA0D,EAAS,IACnE,EAAU,iBACV,IACD;AAGH,IAAQ,UAAU;EAElB,IAAM,IAAa,KAAK,qBAAqB,GAAS,EAAE,EAAE,EAAK;AAC/D,IAAW,KAAiB;EAE5B,IAAM,IAAoB;GACxB,QAAQ,EAAQ;GAChB,MAAM;GACN,QAAQ,EAAE,SAAS,GAAY;GAChC;AAED,OAAK,iBAAiB,EAAI;EAC1B,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAI;AAKzC,EAJA,KAAK,SAAS,KAAK;GAAE,SAAS;GAAG;GAAU,CAAC,EAE5C,MAAM,KAAK,eAAe,EAE1B,KAAK,SAAS,MAAM,oDAAoD,EAAE,aAAU,CAAC;;CAIvF,MAAM,gBAAgB,GAAoC;AAExD,EADA,KAAK,kBAAkB,EACvB,KAAK,SAAS,MAAM,yCAAyC,EAAE,aAAa,KAAK,UAAU,MAAM,CAAC;AAElG,OAAK,IAAM,KAAW,KAAK,UAAU,QAAQ,EAAE;AAC7C,KAAQ,UAAU;GAElB,IAAM,IAAa,KAAK,qBAAqB,GAAS,EAAE,EAAE,EAAK;AAC/D,KAAW,KAAiB;GAE5B,IAAM,IAAoB;IACxB,QAAQ,EAAQ;IAChB,MAAM;IACN,QAAQ,EAAE,SAAS,GAAY;IAChC;AAED,QAAK,iBAAiB,EAAI;GAC1B,IAAM,IAAI,KAAK,QAAQ,cAAc,EAAI;AACzC,QAAK,SAAS,KAAK;IAAE,SAAS;IAAG,UAAU,EAAQ;IAAU,CAAC;;AAGhE,QAAM,KAAK,eAAe;;CAI5B,MAAc,gBAA+B;AAE3C,MAAI,KAAK,cACP,QAAO,KAAK;EAGd,IAAM,IAAW,KAAK;AACtB,WAAK,WAAW,EAAE,EAEd,EAAS,WAAW,GAIxB;GAFA,KAAK,SAAS,MAAM,uCAAuC,EAAE,OAAO,EAAS,QAAQ,CAAC,EAEtF,KAAK,gBAAgB,KAAK,SAAS,EAAS;AAC5C,OAAI;AACF,UAAM,KAAK;aACH;AACR,SAAK,gBAAgB,KAAA;;;;CAIzB,MAAc,SAAS,GAA0C;EAC/D,IAAM,IAAU,MAAM,QAAQ,WAAW,EAAS,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,EACxE,oBAAW,IAAI,KAAa;AAElC,OAAK,IAAM,CAAC,GAAG,MAAW,EAAQ,SAAS,EAAE;GAC3C,IAAM,IAAQ,EAAS;AACvB,GAAI,KAAS,EAAO,WAAW,cAC7B,EAAS,IAAI,EAAM,SAAS;;AAIhC,MAAI,EAAS,SAAS,GAAG;AACvB,QAAK,SAAS,MAAM,4DAA4D;AAChF;;AAGF,OAAK,SAAS,KAAK,iEAAiE,EAClF,eAAe,CAAC,GAAG,EAAS,EAC7B,CAAC;EAEF,IAAM,IAAyD,EAAE;AAEjE,OAAK,IAAM,KAAY,GAAU;GAC/B,IAAM,IAAU,KAAK,UAAU,IAAI,EAAS;AAC5C,OAAI,CAAC,EAAS;GAEd,IAAM,IAAiB,EAAQ,UAAU,YAAY,YAC/C,IAAoB;IACxB,QAAQ,EAAQ;IAChB,MAAM,EAAQ;IACd,QAAQ,EAAE,SAAS;KAAE,GAAG,EAAQ;MAAoB,IAAgB;KAAgB,EAAE;IACvF;AAED,OAAI;AACF,UAAM,KAAK,QAAQ,cAAc,EAAI;YAC9B,GAAO;AACd,MAAe,KAAK;KAAE;KAAU;KAAO,CAAC;;;AAI5C,MAAI,EAAe,SAAS,GAAG;GAC7B,IAAM,IAAM,EAAe,KAAK,MAAM,EAAE,SAAS,CAAC,KAAK,KAAK;AAE5D,SADA,KAAK,SAAS,MAAM,uDAAuD,EAAE,eAAe,GAAK,CAAC,EAC5F,IAAI,EAAK,UACb,mEAAmE,KACnE,EAAU,uBACV,IACD;;;CAKL,MAAM,QAAuB;AACvB,YAAK,SAET;GADA,KAAK,SAAS,MAAM,8BAA8B,EAClD,KAAK,UAAU;AACf,OAAI;AACF,UAAM,KAAK,eAAe;aAClB;AACR,SAAK,UAAU,OAAO;;AAExB,QAAK,SAAS,MAAM,6CAA6C;;;CAQnE,iBAAyB,GAAyB;AAChD,MAAI;AACF,QAAK,eAAe,EAAI;WACjB,GAAO;AACd,QAAK,SAAS,MAAM,qDAAqD,EAAE,UAAO,CAAC;;;CAIvF,mBAAiC;AAC/B,MAAI,KAAK,QACP,OAAM,IAAI,EAAK,UAAU,uDAAuD,EAAU,iBAAiB,IAAI;;CAInH,iBAAyB,GAAyC;AAChE,SAAO,GAAM,YAAY,KAAK;;CAGhC,cAAsB,GAAsC,GAA6C;EAEvG,IAAM,IAAS;GAAE,GADK,GAAa,KAAK,gBAAgB,SAAS,GAAM,QAAQ,QAAQ;GACpD,GAAG;GAAc;AAIpD,SAHI,GAAM,cAAc,KAAA,MACtB,EAAO,KAAiB,EAAK,YAExB;;CAGT,sBAA8B,GAAyB,GAAmC;EACxF,IAAM,IAAU,KAAK,cAAc,EAAQ,WAAW,EAAE,EAAE,EAAK;AAC/D,IAAQ,KAAiB;EACzB,IAAM,IAAW,KAAK,iBAAiB,EAAK,EAEtC,IAAoB;GACxB,MAAM,EAAQ;GACd,MAAM,EAAQ;GACd,QAAQ;IACN;IACA,GAAI,EAAQ,YAAY,EAAE,WAAW,IAAM,GAAG,EAAE;IACjD;GACD,GAAI,IAAW,EAAE,aAAU,GAAG,EAAE;GACjC;AAGD,SADA,KAAK,iBAAiB,EAAI,EACnB;;CAYT,qBACE,GACA,GACA,GACwB;EACxB,IAAM,IAAI,EAAE,GAAG,EAAQ,mBAAmB,EACpC,IAAgB,GAAa,KAAK,gBAAgB,SAAS,GAAM,QAAQ,QAAQ;AAGvF,SAFA,OAAO,OAAO,GAAG,EAAc,EAC/B,OAAO,OAAO,GAAG,EAAa,EACvB;;GAcE,MAAqB,GAAuB,IAA8B,EAAE,KACvF,IAAI,GAAmB,GAAQ,EAAQ,ECzanC,MAAwB,MAA6C;AACzE,SAAQ,EAAM,MAAd;EACE,KAAK,yBAAyB;GAC5B,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,KAAK,WAAW,EAAM,QAAQ,CAC9B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,eAAe,EAAM,YAAY,CACtC,OAAO;AACV,UAAO;IAAE,MAAM;IAAyB,MAAM,EAAE,QAAQ,EAAM,QAAQ;IAAE,SAAS;IAAG;;EAGtF,KAAK,qBAAqB;GACxB,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,KAAK,WAAW,EAAM,QAAQ,CAC9B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAO;IAAE,MAAM;IAAqB,MAAM,EAAE,WAAW,EAAM,WAAW;IAAE,SAAS;IAAG;;EAGxF,KAAK,wBAEH,QAAO;GAAE,MAAM;GAAyB,MAAM;GAAI,SADxC,GAAc,CAAC,IAAI,cAAc,EAAM,WAAW,CAAC,IAAI,cAAc,EAAM,WAAW,CAAC,OAAO;GAC1C;EAGhE,KAAK,qBAEH,QAAO;GAAE,MAAM;GAAsB,MAAM;GAAI,SADrC,GAAc,CAAC,IAAI,cAAc,EAAM,WAAW,CAAC,OAAO;GACT;EAG7D;AACE,OAAI,EAAM,KAAK,WAAW,QAAQ,EAAE;IAGlC,IAAM,IAAY,GACZ,IAAI,GAAc,CAAC,IAAI,MAAM,EAAU,GAAG,CAAC,KAAK,aAAa,EAAU,UAAU,CAAC,OAAO,EACzF,IAAY,EAAU,cAAc;AAC1C,WAAO;KAAE,MAAM,EAAM;KAAM,MAAM,EAAU;KAAM,SAAS;KAAG;KAAW;;AAE1E,SAAM,IAAI,EAAK,UACb,kDAAkD,EAAM,KAAK,IAC7D,EAAU,iBACV,IACD;;GASD,KAAN,MAAwF;CAKtF,YAAY,GAAuB,IAA8B,EAAE,EAAE;AAEnE,kBAJiB,IAGjB,KAAK,QAAQ,GAAkB,GAAQ,EAAQ,EAC/C,KAAK,aAAa,EAAQ;;CAG5B,MAAM,YAAY,GAA0B,GAAwC;AAClF,UAAQ,EAAM,MAAd;GAGE,KAAK,cAAc;IACjB,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAQ,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACxF;;GAGF,KAAK,mBAAmB;IACtB,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAa,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AAC7F;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,WAAW,EAAM,QAAQ,CAC9B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,YAAY,EAAM,YAAY;KAAE,MAAM;KAAc,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACtG;;GAKF,KAAK;AACH,SAAK,MAAM,aAAa,EAAM,IAAI,EAAM,MAAM;AAC9C;GAGF,KAAK;AACH,SAAK,MAAM,aAAa,EAAM,IAAI,EAAM,MAAM;AAC9C;GAGF,KAAK;AACH,SAAK,MAAM,aAAa,EAAM,YAAY,EAAM,eAAe;AAC/D;GAKF,KAAK,YAAY;IACf,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAQ,MAAM;KAAI,SAAS;KAAG,CAAC;AAC9E;;GAGF,KAAK,iBAAiB;IACpB,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,oBAAoB,EAAM,iBAAiB,CAAC,OAAO;AACrG,UAAM,KAAK,MAAM,YAAY,EAAM,IAAI;KAAE,MAAM;KAAa,MAAM;KAAI,SAAS;KAAG,CAAC;AACnF;;GAGF,KAAK;AAGH,QAAI;KACF,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,WAAM,KAAK,MAAM,YAAY,EAAM,YAAY;MAAE,MAAM;MAAc,MAAM;MAAI,SAAS;MAAG,CAAC;aACrF,GAAgB;AAEvB,SAAI,EAAE,aAAiB,EAAK,aAAa,GAAY,GAAO,EAAU,gBAAgB,EACpF,OAAM;KAER,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,WAAW,EAAM,QAAQ,CAC9B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,WAAM,KAAK,MAAM,gBAAgB;MAAE,MAAM;MAAc,MAAM,EAAM;MAAO,SAAS;MAAG,CAAC;;AAEzF;GAKF,KAAK,SAAS;IACZ,IAAM,IAAI,GAAc,CACrB,IAAI,aAAa,EAAM,aAAa,KAAK,WAAW,CACpD,KAAK,mBAAmB,EAAM,gBAAgB,CAC9C,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAS,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACnF;;GAGF,KAAK;AACH,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAc,MAAM;KAAI,EAAE,EAAS;AAC5E;GAGF,KAAK;AACH,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAe,MAAM;KAAI,EAAE,EAAS;AAC7E;GAGF,KAAK,UAAU;IACb,IAAM,IAAI,GAAc,CACrB,IAAI,gBAAgB,EAAM,aAAa,CACvC,KAAK,mBAAmB,EAAM,gBAAgB,CAC9C,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAU,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AACpF;;GAGF,KAAK;AACH,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAS,MAAM,EAAM;KAAW,EAAE,EAAS;AACpF;GAGF,KAAK;AAGH,IAFA,KAAK,WAAW,IAChB,MAAM,KAAK,MAAM,gBAAgB,EAAS,EAC1C,MAAM,KAAK,MAAM,gBACf;KAAE,MAAM;KAAS,MAAM,EAAM,UAAU;KAAI,SAAS,GAAG,IAAgB,WAAW;KAAE,EACpF,EACD;AACD;GAKF,KAAK,oBAAoB;IACvB,IAAM,IAAI,GAAc,CACrB,IAAI,cAAc,EAAM,WAAW,CACnC,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,WAAW,EAAM,QAAQ,CAC9B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAC/B,MAAM;KACN,MAAM;MAAE,WAAW,EAAM;MAAW,OAAO,EAAM;MAAO;KACxD,SAAS;KACV,CAAC;AACF;;GAGF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,UAAM,KAAK,MAAM,gBAAgB,GAAqB,EAAM,EAAE,EAAS;AACvE;GAKF,KAAK,QAAQ;IACX,IAAM,IAAI,GAAc,CACrB,IAAI,aAAa,EAAM,UAAU,CACjC,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAQ,MAAM,EAAM;KAAK,SAAS;KAAG,EAAE,EAAS;AACzF;;GAGF,KAAK,cAAc;IACjB,IAAM,IAAI,GAAc,CACrB,IAAI,YAAY,EAAM,SAAS,CAC/B,IAAI,SAAS,EAAM,MAAM,CACzB,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAc,MAAM,EAAM;KAAK,SAAS;KAAG,EAAE,EAAS;AAC/F;;GAGF,KAAK,mBAAmB;IACtB,IAAM,IAAI,GAAc,CACrB,IAAI,YAAY,EAAM,SAAS,CAC/B,IAAI,aAAa,EAAM,UAAU,CACjC,IAAI,SAAS,EAAM,MAAM,CACzB,IAAI,YAAY,EAAM,SAAS,CAC/B,KAAK,oBAAoB,EAAM,iBAAiB,CAChD,OAAO;AACV,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAmB,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AAC7F;;GAGF,KAAK,oBAAoB;IACvB,IAAM,IAAI,GAAc,CAAC,KAAK,mBAAmB,EAAM,gBAAgB,CAAC,OAAO;AAC/E,UAAM,KAAK,MAAM,gBAAgB;KAAE,MAAM;KAAoB,MAAM;KAAI,SAAS;KAAG,EAAE,EAAS;AAC9F;;GAKF;AACE,QAAI,EAAM,KAAK,WAAW,QAAQ,EAAE;KAClC,IAAM,IAAI,GAAc,CAAC,IAAI,MAAM,EAAM,GAAG,CAAC,KAAK,aAAa,EAAM,UAAU,CAAC,OAAO,EACjF,IAAY,EAAM,cAAc;AACtC,WAAM,KAAK,MAAM,gBAAgB;MAAE,MAAM,EAAM;MAAM,MAAM,EAAM;MAAM,SAAS;MAAG;MAAW,EAAE,EAAS;;AAE3G;;;CAKN,MAAM,WAAW,GAA0B,GAAsD;AAC/F,SAAO,KAAK,MAAM,gBAAgB,GAAqB,EAAM,EAAE,EAAS;;CAG1E,MAAM,cAAc,GAA0B,GAAsD;EAClG,IAAM,IAAW,EAAS,SAAS,MAAQ,GAAsB,EAAI,CAAC;AACtE,SAAO,KAAK,MAAM,qBAAqB,GAAU,EAAS;;CAG5D,MAAM,MAAM,GAAgC;AACtC,OAAK,aACT,KAAK,WAAW,IAChB,MAAM,KAAK,MAAM,iBAAiB,EAClC,MAAM,KAAK,MAAM,gBAAgB;GAC/B,MAAM;GACN,MAAM,KAAU;GAChB,SAAS,GAAG,IAAgB,WAAW;GACxC,CAAC;;CAGJ,MAAM,QAAuB;AAC3B,QAAM,KAAK,MAAM,OAAO;;GAQtB,MAAyB,MAA4C;CACzE,IAAM,IAAY,EAAQ,IACpB,IAA6B,EAAE;AAErC,MAAK,IAAM,KAAQ,EAAQ,MACzB,SAAQ,EAAK,MAAb;EACE,KAAK;AACH,KAAS,KAAK;IAAE,MAAM;IAAQ,MAAM,EAAK;IAAM,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,OAAO;IAAE,CAAC;AAC7G;EAEF,KAAK;AACH,KAAS,KAAK;IACZ,MAAM;IACN,MAAM,EAAK;IACX,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,IAAI,aAAa,EAAK,UAAU,CAAC,OAAO;IAC7F,CAAC;AACF;EAEF;AACE,GAAI,GAAa,EAAK,IACpB,EAAS,KAAK;IACZ,MAAM,EAAK;IACX,MAAM,EAAK;IACX,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,IAAI,MAAM,EAAK,GAAG,CAAC,OAAO;IAC/E,CAAC;AAEJ;;AASN,QAJI,EAAS,WAAW,KACtB,EAAS,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAI,SAAS,GAAc,CAAC,IAAI,aAAa,EAAU,CAAC,OAAO;EAAE,CAAC,EAGjG;GC7WI,KAAyD;CACpE,gBD2XA,GACA,IAA8B,EAAE,KACmB,IAAI,GAAwB,GAAQ,EAAQ;CC5X/F;CACA;CAEA,aAAa,MACX,EAAM,SAAS,YAAY,EAAM,SAAS,WAAW,EAAM,SAAS;CACvE,EC6HK,MAAyB,MAAkF;CAC/G,IAAI,GACE,IAAO,IAAI,SAAe,MAAY;AAC1C,MAAc;GACd,EAEI,IAAc,IAAI,gBAAsB,EAC5C,aAAa;AACX,KAAa;IAEhB,CAAC;AAUF,QAJA,EAAO,OAAO,EAAY,SAAS,CAAC,YAAY;AAC9C,KAAa;GACb,EAEK;EAAE,QAAQ,EAAY;EAAU;EAAM;GAmBzC,MAAyB,MAC7B,EAAI,SAAS,eACb,EAAI,MAAM,MACP,MACC,EAAE,SAAS,mBACV,EAAE,UAAU,qBAAqB,EAAE,UAAU,qBAAqB,EAAE,UAAU,sBAClF,EAqBU,MACX,GACA,MACkB;CAElB,IAAI,IAAa,IACX,oBAAqB,IAAI,KAAmC,EAE5D,KAAgB,MAAyB;AAC7C,MAAa;AACb,OAAK,IAAM,KAAM,EACf,KAAI;AACF,KAAG,EAAM;UACH;;AAkKZ,QAAO;EACL,cAzJkD,OAAO,MAAS;GAClE,IAAM,EAAE,aAAU,gBAAa,YAAS,iBAAc,GAChD,IAAW,EAAU,KAAK,cAAc,EAqBxC,IAAc,EAAS,GAAG,GAAG,EAC7B,IAAkB,IAAc,EAAS,MAAM,MAAM,EAAE,QAAQ,OAAO,EAAY,GAAG,GAAG,KAAA,GACxF,IAAiB,MAAY,oBAAoB,GAAa,SAAS,eAAe,CAAC,CAAC,GAUxF,IACJ,MAAY,oBAAoB,CAAC,KAAa,GAAa,SAAS,SAAS,EAAS,GAAG,GAAG,GAAG,KAAA,GAC3F,IACJ,KAAoB,GAAsB,EAAiB,GACvD,EAAS,MAAM,MAAM,EAAE,QAAQ,OAAO,EAAiB,GAAG,GAC1D,KAAA,GAGF,GACA;AAEJ,OAAI,MAAY,wBAAwB,EAEtC,CADA,IAAc,EAAE,EAChB,IAAU;QACL;AACL,QAAI,EAAS,WAAW,EACtB,OAAM,IAAI,EAAK,UACb,+EACA,EAAU,iBACV,IACD;AAQH,IAJA,IAAc,CAAC,EAAS,GAAG,GAAG,CAAiB,EAI/C,IAAU,IAAa,EAAS,MAAM,GAAG,GAAG,GAAG,EAAS,MAAM,GAAG,GAAG;;GAKtE,IAAI,GACA;AAEJ,OAAI,KAAa,CAAC,GAAgB;AAIhC,QAAS;IACT,IAAM,IAAO,EAAS,MAAM,MAAM,EAAE,QAAQ,OAAO,EAAU;AAC7D,IAAI,MACF,IAAS,EAAK,OACd,IAAS,EAAK;UAEP,IAKT,IAAS,EAAgB,QAChB,MAGT,IAAS,EAAW,OACpB,IAAS,EAAW;GAGtB,IAAI,IACA;AAEJ,OAAI,GAAa,4BAA4B;IAC3C,IAAM,IAAW,EAAY,2BAA2B;KACtD,QAAQ,EAAK;KACb;KACA;KACA;KACA,UAAU;KACV;KACA;KACD,CAAC;AAEF,IADA,KAAW,EAAS,QAAQ,EAAE,EAC9B,KAAc,EAAS;UAClB;IACL,IAAM,IAAa,IAAI,IAAI,EAAQ,KAAK,MAAM,EAAE,GAAG,CAAC;AAUpD,IARA,KAAW;KACT,SAFmB,EAAS,QAAQ,MAAM,EAAW,IAAI,EAAE,QAAQ,GAAG,CAAC;KAGvE,QAAQ,EAAK;KACb;KACA,GAAI,MAAc,KAAA,KAAa,EAAE,cAAW;KAC5C,GAAI,MAAW,KAAA,KAAa,EAAE,WAAQ;KACtC,GAAI,MAAW,KAAA,KAAa,EAAE,WAAQ;KACvC,EACD,KAAc,KAAA;;GAGhB,IAAM,KAAwB;IAAE,MAAM;IAAU,SAAS;IAAa;AAEtE,GADI,MAAW,KAAA,MAAW,GAAS,SAAS,IACxC,MAAW,KAAA,MAAW,GAAS,SAAS;GAK5C,IAAM,KAAO,MAAM,EAAU,KAAK,KAAK,GAAa,GAAS;AAE7D,GAAI,KACF,EAAY,iBAAiB,eAAe,KAAK,EAAU,OAAO,EAAE,KAAK,IAAM,CAAC,EAAE,EAChF,MAAM,IACP,CAAC;GAMJ,IAAM,EAAE,YAAQ,aAAS,GAAmB,GAAK,OAAO;AAQxD,UAPA,EAAa,GAAK,EAGb,GAAK,WAAW;AACnB,MAAa,GAAM;KACnB,EAEK;;EAWP,yBAAyB,QAAQ,QAAQ,KAAK;EAE9C,OAAO,OAAO,MAA2B,EAAU,MAAM,EAAQ;EAEjE,IAAI,YAAqB;AACvB,UAAO;;EAGT,oBAAoB,OAClB,EAAmB,IAAI,EAAS,QACnB;AACX,KAAmB,OAAO,EAAS;;EAGxC;GElYU,KAAuB,EAAyC;CAC3E,SAAS,KAAA;CACT,WAAW,EAAE;CACd,CAAC,ECVW,EACX,uBACA,qBACA,oBACA,wBACA,mBACA,aACA,gBACE,IAAuD,EAoBrD,MAA8B,EAClC,gBACA,gBACA,kBAKI;CACJ,IAAM,EAAE,cAAW,sBAAmB,IAAoB,EACpD,EAAE,WAAW,MAAoB,EAAW,GAAqB,EACjE,IAAgB,QAAc,GAAoB,GAAW,EAAY,EAAE,CAAC,GAAW,EAAY,CAAC,EACpG,IAAe,QAAc;EACjC,IAAM,IAA0B;GAAE;GAAW;GAAgB;GAAe;AAC5E,SAAO;GACL,SAAS;GACT,WAAW;IAAE,GAAG;KAAkB,IAAc;IAAM;GACvD;IACA;EAAC;EAAa;EAAiB;EAAe;EAAW;EAAe,CAAC;AAE5E,QAAO,kBAAC,GAAqB,UAAtB;EAA+B,OAAO;EAAe;EAAyC,CAAA;GA2B1F,MAAyB,EACpC,gBACA,aACA,GAAG,QAEH,kBAAC,IAAD;CACE,GAAI;CACJ,KAAK,EAAe,OAAA;CACpB,OAAO;WAEP,kBAAC,IAAD;EACE,aAAa,EAAe;EACf;EAEZ;EAC0B,CAAA;CACX,CAAA,EClGhB,KAA6E;CACjF,IAAI,OAA2B;AAC7B,QAAM,IAAI,EAAK,UAAU,0CAA0C,EAAU,iBAAiB,IAAI;;CAEpG,IAAI,OAA8C;AAChD,QAAM,IAAI,EAAK,UAAU,0CAA0C,EAAU,iBAAiB,IAAI;;CAEpG,kBAAyD;AACvD,QAAM,IAAI,EAAK,UAAU,0CAA0C,EAAU,iBAAiB,IAAI;;CAEpG,cAAc;AACZ,QAAM,IAAI,EAAK,UAAU,qCAAqC,EAAU,iBAAiB,IAAI;;CAE/F,mBAAmB;AACjB,QAAM,IAAI,EAAK,UAAU,2CAA2C,EAAU,iBAAiB,IAAI;;CAErG,oBAAoB;AAClB,QAAM,IAAI,EAAK,UAAU,4CAA4C,EAAU,iBAAiB,IAAI;;CAEtG,mBAAmB;AACjB,QAAM,IAAI,EAAK,UAAU,4CAA4C,EAAU,iBAAiB,IAAI;;CAEtG,UAAU;AACR,QAAM,IAAI,EAAK,UAAU,wCAAwC,EAAU,iBAAiB,IAAI;;CAElG,aAAa;AACX,QAAM,IAAI,EAAK,UAAU,oCAAoC,EAAU,iBAAiB,IAAI;;CAE/F,EAEK,KAAwC;CAC5C,oBAA2B;AACzB,QAAM,IAAI,EAAK,UAAU,4CAA4C,EAAU,iBAAiB,IAAI;;CAEtG,yBAAgC;AAC9B,QAAM,IAAI,EAAK,UAAU,kDAAkD,EAAU,iBAAiB,IAAI;;CAE5G,aAAoB;AAClB,QAAM,IAAI,EAAK,UAAU,oCAAoC,EAAU,iBAAiB,IAAI;;CAE9F,IAAI,YAAmB;AACrB,QAAM,IAAI,EAAK,UAAU,+CAA+C,EAAU,iBAAiB,IAAI;;CAEzG,yBAAgC;AAC9B,QAAM,IAAI,EAAK,UACb,6DACA,EAAU,iBACV,IACD;;CAEJ,EA2DY,MAAoB,EAAE,gBAAa,YAAkC,EAAE,KAA0B;CAC5G,IAAM,EAAE,YAAS,iBAAc,EAAW,GAAqB;AAE/D,KAAI,EACF,QAAO;EAAE,WAAW;EAA0B,eAAe;EAAwB;AAGvF,KAAI,MAAgB,KAAA,GAAW;EAC7B,IAAM,IAAO,EAAU;AAIvB,SAHI,IACK;GAAE,WAAW,EAAK;GAAW,eAAe,EAAK;GAAe,gBAAgB,EAAK;GAAgB,GAEvG;GACL,WAAW;GACX,eAAe;GACf,gBAAgB,IAAI,EAAK,UACvB,+EAA+E,EAAY,IAC3F,EAAU,YACV,IACD;GACD,oBAAoB,IAAI,EAAK,UAC3B,iFAAiF,EAAY,IAC7F,EAAU,YACV,IACD;GACF;;AAWH,QARI,IACK;EACL,WAAW,EAAQ;EACnB,eAAe,EAAQ;EACvB,gBAAgB,EAAQ;EACzB,GAGI;EACL,WAAW;EACX,eAAe;EACf,gBAAgB,IAAI,EAAK,UACvB,mEACA,EAAU,YACV,IACD;EACD,oBAAoB,IAAI,EAAK,UAC3B,4EACA,EAAU,YACV,IACD;EACF;GC5HU,MAAkB,EAAE,gBAAa,gBAAa,cAAwC;CACjG,IAAM,EAAE,cAAW,kBAAe,0BAAuB,GAAiB;EAAE;EAAa;EAAM,CAAC,EAG1F,IAAW,CAAC,KAAQ,CAAC,GACrB,IAAO,IAAW,EAAU,OAAO,KAAA,GACnC,IAAwB,IAAW,IAAgB,KAAA,GAEnD,CAAC,GAAO,KAAY,EAAS,GAAM;AAezC,CAVA,QAAgB;AACd,MAAI,CAAC,GAAuB;AAC1B,KAAS,GAAM;AACf;;AAGF,SADA,EAAS,EAAsB,UAAU,EAClC,EAAsB,kBAAkB,EAAS;IACvD,CAAC,EAAsB,CAAC,EAG3B,QAAgB;AACd,MAAI,CAAC,KAAQ,EAAO;EAEpB,IAAM,UAAmB;AACvB,WAAkB,EAAK,cAAc,CAAC,KAAK,MAAM,EAAE,QAAQ,CAAC;;AAM9D,SAFA,GAAM,EAEC,EAAK,GAAG,UAAU,EAAK;IAC7B;EAAC;EAAM;EAAa;EAAM,CAAC;GCzDnB,MACX,GACA,MAEA,GACG,OACC,GAA4B,GAAW,EAAK,EACrC,EAAwB,EAAK,GAEtC,CAAC,GAAW,EAAwB,CACrC,EAYG,MACJ,GACA,MACS;CACT,IAAM,IAAQ,EAAU,KAAK,cAAc;AAC3C,MAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAY,EAAK,QAAQ,MAAM,WAAW,MAAM,EAAE,SAAS,kBAAkB,EAAE,UAAU,OAAO,EAAK,GAAG;AAC9G,MAAI,MAAc,GAAI;EAItB,IAAM,IAAO,EAAK,QAAQ,MAAM,IAM1B,IAAoC;GACxC,MAAM;GACN,UAAU,EAAK;GACf,YAAY,EAAK;GACjB,OAAO;GACP,OAAO,EAAK;GACZ,UAAU;IAAE,IAAI,EAAK;IAAI,UAAU,EAAK;IAAU,QAAQ,EAAK;IAAQ;GACxE,EAEK,IAAe,CAAC,GAAG,EAAK,QAAQ,MAAM;AAE5C,EADA,EAAa,KAAa,GAC1B,EAAU,aAAa,EAAK,OAAO;GAAE,GAAG,EAAK;GAAS,OAAO;GAAc,CAAC;AAC5E"}