UNPKG

life

Version:

Life.js is the first fullstack framework to build agentic web applications. It is minimal, extensible, and typesafe. Well, everything you love.

1 lines 23.3 kB
{"version":3,"sources":["../shared/deep-clone.ts","../telemetry/helpers/zod.ts","../agent/client/config.ts","../transport/providers/livekit/browser.ts","../transport/providers/base.ts","../transport/config/browser.ts","../shared/async-queue.ts"],"sourcesContent":["// @ts-nocheck\n\n// biome-ignore-start lint/style: reason\n// biome-ignore-start lint/suspicious: reason\n// biome-ignore-start lint/complexity: reason\n// biome-ignore-start lint/correctness: reason\n\n/**\n * This function deep copies a given object, with higher performances than the\n * native structuredClone() function, and more flexibility (e.g., supports objects\n * containing functions).\n *\n * Source: Klona (https://github.com/lukeed/klona/blob/master/src/full.js)\n */\nexport function deepClone<T>(x: T): T {\n if (typeof x !== \"object\") return x;\n\n var i = 0,\n k,\n list,\n tmp,\n str = Object.prototype.toString.call(x);\n\n if (str === \"[object Object]\") {\n tmp = Object.create(x.__proto__ || null);\n } else if (str === \"[object Array]\") {\n tmp = Array(x.length);\n } else if (str === \"[object Set]\") {\n tmp = new Set();\n x.forEach(function (val) {\n tmp.add(deepClone(val));\n });\n } else if (str === \"[object Map]\") {\n tmp = new Map();\n x.forEach(function (val, key) {\n tmp.set(deepClone(key), deepClone(val));\n });\n } else if (str === \"[object Date]\") {\n tmp = new Date(+x);\n } else if (str === \"[object RegExp]\") {\n tmp = new RegExp(x.source, x.flags);\n } else if (str === \"[object DataView]\") {\n tmp = new x.constructor(deepClone(x.buffer));\n } else if (str === \"[object ArrayBuffer]\") {\n tmp = x.slice(0);\n } else if (str.slice(-6) === \"Array]\") {\n // ArrayBuffer.isView(x)\n // ~> `new` bcuz `Buffer.slice` => ref\n tmp = new x.constructor(x);\n }\n\n if (tmp) {\n for (list = Object.getOwnPropertySymbols(x); i < list.length; i++) {\n set(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n }\n\n for (i = 0, list = Object.getOwnPropertyNames(x); i < list.length; i++) {\n if (Object.hasOwnProperty.call(tmp, (k = list[i])) && tmp[k] === x[k]) continue;\n set(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n }\n }\n\n return tmp || x;\n}\n\nfunction set(obj, key, val) {\n if (typeof val.value === \"object\") val.value = deepClone(val.value);\n if (\n !val.enumerable ||\n val.get ||\n val.set ||\n !val.configurable ||\n !val.writable ||\n key === \"__proto__\"\n ) {\n Object.defineProperty(obj, key, val);\n } else obj[key] = val.value;\n}\n\n// biome-ignore-end lint/style: reason\n// biome-ignore-end lint/suspicious: reason\n// biome-ignore-end lint/complexity: reason\n// biome-ignore-end lint/correctness: reason\n","import z from \"zod\";\n\ntype DeeplyEditable<T> = T extends Record<string, unknown>\n ? { [K in keyof T]: DeeplyEditable<T[K]> } & Record<string, unknown>\n : T;\n\n// Zod Object With Telemetry\nexport type ZodObjectWithTelemetry<Schema extends z.ZodObject, D extends \"input\" | \"output\"> = {\n schema: Schema;\n} & (D extends \"input\"\n ? {\n toTelemetry?: (data: DeeplyEditable<z.output<Schema>>) => Record<string, unknown>;\n }\n : {\n toTelemetry: (data: Record<string, unknown>) => Record<string, unknown>;\n });\n\n/**\n * Creates a ZodObject schema alongside a `toTelemetry()` function responsible for sanitizing\n * the data parsed by the schema when this data needs to be included into a telemetry signal.\n *\n * @param schema - The Zod schema\n * @param toTelemetry - The sanitizing function.\n * @returns The schema prepared for telemetry.\n */\nexport const zodObjectWithTelemetry = <const Schema extends z.ZodObject>({\n schema,\n toTelemetry,\n}: ZodObjectWithTelemetry<Schema, \"input\">): ZodObjectWithTelemetry<Schema, \"output\"> => ({\n schema,\n toTelemetry: (data: Record<string, unknown>) => (toTelemetry ? toTelemetry(data as never) : data),\n});\n\n// Zod Union With Telemetry\nexport interface ZodUnionWithTelemetry<\n Discriminator extends string,\n Objects extends readonly ZodObjectWithTelemetry<\n z.ZodObject<z.ZodRawShape & { [K in Discriminator]: z.ZodTypeAny }>,\n \"output\"\n >[],\n Schema = z.ZodDiscriminatedUnion<\n Objects[number] extends ZodObjectWithTelemetry<infer S extends z.ZodObject, \"output\">\n ? S[]\n : never,\n Discriminator\n >,\n> {\n schema: Schema;\n toTelemetry: (data: DeeplyEditable<z.output<Schema>>) => Record<string, unknown>;\n}\n\n/**\n * Creates a union of ZodObjectWithTelemetry instances discriminated by a given key.\n * The returned `toTelemetry()` function will apply the `toTelemetry()` function of\n * matched ZodObjectWithTelemetry instance.\n *\n * @param discriminator - The field to discriminate by.\n * @param objects - Array of ZodObjectWithTelemetry instances.\n * @returns A unified ZodObjectWithTelemetry with a discriminated union schema.\n */\nexport const zodUnionWithTelemetry = <\n const Discriminator extends string,\n const Objects extends readonly ZodObjectWithTelemetry<\n z.ZodObject<z.ZodRawShape & { [K in Discriminator]: z.ZodTypeAny }>,\n \"output\"\n >[],\n>(\n discriminator: Discriminator,\n objects: Objects,\n): ZodUnionWithTelemetry<Discriminator, Objects> => ({\n schema: z.discriminatedUnion(discriminator, objects.map((s) => s.schema) as never),\n toTelemetry: (data: Record<string, unknown>) => {\n // Find the schema that matches the discriminator\n const object = objects.find((s) => {\n const discriminatorSchema = s.schema.shape[discriminator];\n if (discriminatorSchema instanceof z.ZodLiteral)\n return discriminatorSchema.def.values[0] === data[discriminator];\n return false;\n });\n\n // Apply the telemetry transformation (if any)\n return object?.toTelemetry ? object.toTelemetry(data as never) : data;\n },\n});\n","import { z } from \"zod\";\nimport { zodObjectWithTelemetry } from \"@/telemetry/helpers/zod\";\nimport { transportBrowserConfig } from \"@/transport/config/browser\";\n\nexport const agentClientConfig = zodObjectWithTelemetry({\n schema: z.object({\n transport: transportBrowserConfig.schema.prefault({ provider: \"livekit\" }),\n experimental: z.object().prefault({}),\n }),\n toTelemetry: (config) => {\n config.transport = transportBrowserConfig.toTelemetry(config.transport) as never;\n return config;\n },\n});\n","import { type RemoteTrack, Room, RoomEvent } from \"livekit-client\";\nimport z from \"zod\";\nimport type { LifeError } from \"@/shared/error\";\nimport * as op from \"@/shared/operation\";\nimport type { MaybePromise } from \"@/shared/types\";\nimport { zodObjectWithTelemetry } from \"@/telemetry/helpers/zod\";\nimport { TransportProviderClientBase } from \"../base\";\n\n// Config\nexport const livekitBrowserConfig = zodObjectWithTelemetry({\n schema: z.object({\n provider: z.literal(\"livekit\"),\n serverUrl: z\n .url()\n .prefault(globalThis.process?.env?.LIVEKIT_SERVER_URL ?? \"ws://localhost:7880\"),\n }),\n toTelemetry: (config) => {\n // Remember if the server is a dev server\n config.isDevServer = Boolean(config.serverUrl?.includes(\"localhost\"));\n\n // Redact sensitive fields\n config.serverUrl = \"redacted\" as never;\n\n return config;\n },\n});\n\n// Client\nexport class LiveKitBrowserClient extends TransportProviderClientBase<\n typeof livekitBrowserConfig.schema\n> {\n isConnected = false;\n room: Room | null = null;\n\n constructor(config: z.input<typeof livekitBrowserConfig.schema>) {\n super(livekitBrowserConfig.schema, config);\n }\n\n ensureConnected(name: string, connector: LiveKitBrowserClient) {\n if (!(this.isConnected && this.room?.localParticipant))\n return op.failure({\n code: \"Conflict\",\n message: `Calling this code (${name}) requires a connected room. Call joinRoom() first.`,\n });\n return op.success(\n connector as LiveKitBrowserClient & {\n room: Room & { localParticipant: NonNullable<Room[\"localParticipant\"]> };\n },\n );\n }\n\n #initializeListeners(room: Room) {\n // audio-chunk\n room.on(RoomEvent.TrackSubscribed, (track) => {\n if (track.kind !== \"audio\") return;\n\n // Listen for unsubscribing\n let _isUnsubscribed = false;\n const unsubscribeHandler = (unsubscribedTrack: RemoteTrack) => {\n if (unsubscribedTrack.sid === track.sid) _isUnsubscribed = true;\n room.off(RoomEvent.TrackUnsubscribed, unsubscribeHandler);\n };\n room.on(RoomEvent.TrackUnsubscribed, unsubscribeHandler);\n\n // Stream audio chunks until the track is unsubscribed\n // TODO: Implement\n });\n }\n\n async joinRoom(roomName: string, token: string) {\n try {\n // If we are already connected to this room, do nothing\n if (roomName === this.room?.name) return op.success();\n // If we are already connected to a room, leave it before\n if (this.isConnected) {\n const [errLeave] = await this.leaveRoom();\n if (errLeave) return op.failure(errLeave);\n }\n\n // Create the room and set up event listeners\n this.room = new Room({\n adaptiveStream: true,\n dynacast: true,\n disconnectOnPageLeave: true,\n publishDefaults: {\n dtx: true,\n red: true,\n },\n });\n this.room.on(RoomEvent.TrackSubscribed, (track) => {\n const element = track.attach();\n document.body.appendChild(element);\n });\n\n // Initialize listeners\n this.#initializeListeners(this.room);\n\n // Connect to the room and auto-subscribe to tracks\n await this.room.connect(this.config.serverUrl, token, { autoSubscribe: true });\n this.isConnected = true;\n\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n async leaveRoom() {\n try {\n const [errEnsure, connector] = this.ensureConnected(\"leaveRoom\", this);\n if (errEnsure) return op.failure(errEnsure);\n await connector.room.disconnect();\n this.isConnected = false;\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n async streamText(topic: string) {\n try {\n const [errEnsure, connector] = this.ensureConnected(\"streamText\", this);\n if (errEnsure) return op.failure(errEnsure);\n return op.success(await connector.room.localParticipant.streamText({ topic }));\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n receiveStreamText(\n topic: string,\n callback: (iterator: AsyncIterable<string>, participantId: string) => MaybePromise<void>,\n onError?: (error: LifeError) => void,\n ) {\n try {\n const [errEnsure, connector] = this.ensureConnected(\"receiveText\", this);\n if (errEnsure) return op.failure(errEnsure);\n connector.room.registerTextStreamHandler(topic, async (iterator, participantInfo) => {\n const [err] = await op.attempt(async () => {\n await callback(iterator, participantInfo.identity);\n });\n if (err) onError?.(err);\n });\n return op.success(() => {\n connector.room.unregisterTextStreamHandler(topic);\n });\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n async enableMicrophone() {\n try {\n const [errEnsure, connector] = this.ensureConnected(\"enableMicrophone\", this);\n if (errEnsure) return op.failure(errEnsure);\n await connector.room.localParticipant.setMicrophoneEnabled(true, {\n echoCancellation: true,\n noiseSuppression: false,\n voiceIsolation: false,\n });\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n async playAudio() {\n try {\n const [errEnsure, connector] = this.ensureConnected(\"playAudio\", this);\n if (errEnsure) return op.failure(errEnsure);\n await connector.room.startAudio();\n return op.success();\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n async streamAudioChunk(chunk: Int16Array) {\n try {\n await chunk;\n throw new Error(\n \"streamAudioChunk() is not available for browser client, use enableMicrophone() instead.\",\n );\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n}\n","import type { z } from \"zod\";\nimport type { LifeError } from \"@/shared/error\";\nimport * as op from \"@/shared/operation\";\n\nexport type TransportEvent = {\n type: \"audio-chunk\";\n chunk: Int16Array;\n};\n\nexport abstract class TransportProviderClientBase<ConfigSchema extends z.ZodObject> {\n config: z.infer<ConfigSchema>;\n listeners: Partial<Record<TransportEvent[\"type\"], ((event: TransportEvent) => void)[]>> = {};\n\n constructor(configSchema: ConfigSchema, config: Partial<z.infer<ConfigSchema>>) {\n this.config = configSchema.parse({ ...config });\n }\n\n on<EventType extends TransportEvent[\"type\"]>(\n type: EventType,\n callback: (data: Extract<TransportEvent, { type: EventType }>) => void,\n ) {\n try {\n if (!this.listeners[type]) this.listeners[type] = [];\n this.listeners[type].push(callback as (event: TransportEvent) => void);\n return op.success(() => {\n this.listeners[type] = this.listeners[type]?.filter((listener) => listener !== callback);\n });\n } catch (error) {\n return op.failure({ code: \"Unknown\", cause: error });\n }\n }\n\n abstract joinRoom(roomName: string, token: string): Promise<op.OperationResult<void>>;\n abstract leaveRoom(): Promise<op.OperationResult<void>>;\n abstract streamText(\n topic: string,\n ): Promise<\n op.OperationResult<\n Omit<\n WritableStreamDefaultWriter<string>,\n \"desiredSize\" | \"closed\" | \"ready\" | \"abort\" | \"releaseLock\"\n >\n >\n >;\n abstract receiveStreamText(\n topic: string,\n callback: (iterator: AsyncIterable<string>, participantId: string) => void | Promise<void>,\n onError?: (error: LifeError) => void,\n ): op.OperationResult<() => void>;\n abstract enableMicrophone(): Promise<op.OperationResult<void>>;\n abstract playAudio(): Promise<op.OperationResult<void>>;\n abstract streamAudioChunk(chunk: Int16Array): Promise<op.OperationResult<void>>;\n}\n","import { zodUnionWithTelemetry } from \"@/telemetry/helpers/zod\";\nimport { livekitBrowserConfig } from \"../providers/livekit/browser\";\n\nexport const transportBrowserConfig = zodUnionWithTelemetry(\"provider\", [livekitBrowserConfig]);\n","export class AsyncQueue<T> implements AsyncIterator<T>, AsyncIterable<T> {\n readonly #buf: T[] = [];\n #wakeUp?: () => void;\n #closed = false;\n #totalLength = 0;\n\n push(v: T) {\n if (this.#closed) return;\n this.#buf.push(v);\n this.#totalLength++;\n this.#wakeUp?.();\n }\n\n pushFirst(v: T) {\n if (this.#closed) return;\n this.#buf.unshift(v);\n this.#totalLength++;\n this.#wakeUp?.();\n }\n\n stop() {\n if (this.#closed) return;\n this.#closed = true;\n this.#wakeUp?.();\n }\n\n some(predicate: (value: T) => boolean) {\n return this.#buf.some(predicate);\n }\n\n length() {\n return this.#buf.length;\n }\n\n totalLength() {\n return this.#totalLength;\n }\n\n async next(): Promise<IteratorResult<T>> {\n while (true) {\n const value = this.#buf.shift();\n if (value !== undefined) return { value, done: false };\n if (this.#closed) return { value: undefined, done: true };\n // biome-ignore lint/performance/noAwaitInLoops: sequential execution required here\n await new Promise<void>((res) => (this.#wakeUp = res)); // sleep until push/stop\n this.#wakeUp = undefined;\n }\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;AAcO,SAAS,UAAa,GAAS;AACpC,MAAI,OAAO,MAAM,SAAU,QAAO;AAElC,MAAI,IAAI,GACN,GACA,MACA,KACA,MAAM,OAAO,UAAU,SAAS,KAAK,CAAC;AAExC,MAAI,QAAQ,mBAAmB;AAC7B,UAAM,OAAO,OAAO,EAAE,aAAa,IAAI;AAAA,EACzC,WAAW,QAAQ,kBAAkB;AACnC,UAAM,MAAM,EAAE,MAAM;AAAA,EACtB,WAAW,QAAQ,gBAAgB;AACjC,UAAM,oBAAI,IAAI;AACd,MAAE,QAAQ,SAAU,KAAK;AACvB,UAAI,IAAI,UAAU,GAAG,CAAC;AAAA,IACxB,CAAC;AAAA,EACH,WAAW,QAAQ,gBAAgB;AACjC,UAAM,oBAAI,IAAI;AACd,MAAE,QAAQ,SAAU,KAAK,KAAK;AAC5B,UAAI,IAAI,UAAU,GAAG,GAAG,UAAU,GAAG,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,WAAW,QAAQ,iBAAiB;AAClC,UAAM,oBAAI,KAAK,CAAC,CAAC;AAAA,EACnB,WAAW,QAAQ,mBAAmB;AACpC,UAAM,IAAI,OAAO,EAAE,QAAQ,EAAE,KAAK;AAAA,EACpC,WAAW,QAAQ,qBAAqB;AACtC,UAAM,IAAI,EAAE,YAAY,UAAU,EAAE,MAAM,CAAC;AAAA,EAC7C,WAAW,QAAQ,wBAAwB;AACzC,UAAM,EAAE,MAAM,CAAC;AAAA,EACjB,WAAW,IAAI,MAAM,EAAE,MAAM,UAAU;AAGrC,UAAM,IAAI,EAAE,YAAY,CAAC;AAAA,EAC3B;AAEA,MAAI,KAAK;AACP,SAAK,OAAO,OAAO,sBAAsB,CAAC,GAAG,IAAI,KAAK,QAAQ,KAAK;AACjE,UAAI,KAAK,KAAK,CAAC,GAAG,OAAO,yBAAyB,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,IAC/D;AAEA,SAAK,IAAI,GAAG,OAAO,OAAO,oBAAoB,CAAC,GAAG,IAAI,KAAK,QAAQ,KAAK;AACtE,UAAI,OAAO,eAAe,KAAK,KAAM,IAAI,KAAK,CAAC,CAAE,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,EAAG;AACvE,UAAI,KAAK,GAAG,OAAO,yBAAyB,GAAG,CAAC,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAjDgB;AAmDhB,SAAS,IAAI,KAAK,KAAK,KAAK;AAC1B,MAAI,OAAO,IAAI,UAAU,SAAU,KAAI,QAAQ,UAAU,IAAI,KAAK;AAClE,MACE,CAAC,IAAI,cACL,IAAI,OACJ,IAAI,OACJ,CAAC,IAAI,gBACL,CAAC,IAAI,YACL,QAAQ,aACR;AACA,WAAO,eAAe,KAAK,KAAK,GAAG;AAAA,EACrC,MAAO,KAAI,GAAG,IAAI,IAAI;AACxB;AAZS;;;ACjET,OAAO,OAAO;AAyBP,IAAM,yBAAyB,wBAAmC;AAAA,EACvE;AAAA,EACA;AACF,OAA0F;AAAA,EACxF;AAAA,EACA,aAAa,wBAAC,SAAmC,cAAc,YAAY,IAAa,IAAI,MAA/E;AACf,IANsC;AAmC/B,IAAM,wBAAwB,wBAOnC,eACA,aACmD;AAAA,EACnD,QAAQ,EAAE,mBAAmB,eAAe,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,CAAU;AAAA,EACjF,aAAa,wBAAC,SAAkC;AAE9C,UAAM,SAAS,QAAQ,KAAK,CAAC,MAAM;AACjC,YAAM,sBAAsB,EAAE,OAAO,MAAM,aAAa;AACxD,UAAI,+BAA+B,EAAE;AACnC,eAAO,oBAAoB,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa;AACjE,aAAO;AAAA,IACT,CAAC;AAGD,WAAO,QAAQ,cAAc,OAAO,YAAY,IAAa,IAAI;AAAA,EACnE,GAXa;AAYf,IAvBqC;;;AC5DrC,SAAS,KAAAA,UAAS;;;ACAlB,SAA2B,MAAM,iBAAiB;AAClD,OAAOC,QAAO;;;ACQP,IAAe,8BAAf,MAA6E;AAAA,EATpF,OASoF;AAAA;AAAA;AAAA,EAClF;AAAA,EACA,YAA0F,CAAC;AAAA,EAE3F,YAAY,cAA4B,QAAwC;AAC9E,SAAK,SAAS,aAAa,MAAM,EAAE,GAAG,OAAO,CAAC;AAAA,EAChD;AAAA,EAEA,GACE,MACA,UACA;AACA,QAAI;AACF,UAAI,CAAC,KAAK,UAAU,IAAI,EAAG,MAAK,UAAU,IAAI,IAAI,CAAC;AACnD,WAAK,UAAU,IAAI,EAAE,KAAK,QAA2C;AACrE,aAAU,QAAQ,MAAM;AACtB,aAAK,UAAU,IAAI,IAAI,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,aAAa,aAAa,QAAQ;AAAA,MACzF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AAsBF;;;AD3CO,IAAM,uBAAuB,uBAAuB;AAAA,EACzD,QAAQC,GAAE,OAAO;AAAA,IACf,UAAUA,GAAE,QAAQ,SAAS;AAAA,IAC7B,WAAWA,GACR,IAAI,EACJ,SAAS,WAAW,SAAS,KAAK,sBAAsB,qBAAqB;AAAA,EAClF,CAAC;AAAA,EACD,aAAa,wBAAC,WAAW;AAEvB,WAAO,cAAc,QAAQ,OAAO,WAAW,SAAS,WAAW,CAAC;AAGpE,WAAO,YAAY;AAEnB,WAAO;AAAA,EACT,GARa;AASf,CAAC;AAGM,IAAM,uBAAN,cAAmC,4BAExC;AAAA,EA9BF,OA8BE;AAAA;AAAA;AAAA,EACA,cAAc;AAAA,EACd,OAAoB;AAAA,EAEpB,YAAY,QAAqD;AAC/D,UAAM,qBAAqB,QAAQ,MAAM;AAAA,EAC3C;AAAA,EAEA,gBAAgB,MAAc,WAAiC;AAC7D,QAAI,EAAE,KAAK,eAAe,KAAK,MAAM;AACnC,aAAU,QAAQ;AAAA,QAChB,MAAM;AAAA,QACN,SAAS,sBAAsB,IAAI;AAAA,MACrC,CAAC;AACH,WAAU;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAAA,EAEA,qBAAqB,MAAY;AAE/B,SAAK,GAAG,UAAU,iBAAiB,CAAC,UAAU;AAC5C,UAAI,MAAM,SAAS,QAAS;AAG5B,UAAI,kBAAkB;AACtB,YAAM,qBAAqB,wBAAC,sBAAmC;AAC7D,YAAI,kBAAkB,QAAQ,MAAM,IAAK,mBAAkB;AAC3D,aAAK,IAAI,UAAU,mBAAmB,kBAAkB;AAAA,MAC1D,GAH2B;AAI3B,WAAK,GAAG,UAAU,mBAAmB,kBAAkB;AAAA,IAIzD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,UAAkB,OAAe;AAC9C,QAAI;AAEF,UAAI,aAAa,KAAK,MAAM,KAAM,QAAU,QAAQ;AAEpD,UAAI,KAAK,aAAa;AACpB,cAAM,CAAC,QAAQ,IAAI,MAAM,KAAK,UAAU;AACxC,YAAI,SAAU,QAAU,QAAQ,QAAQ;AAAA,MAC1C;AAGA,WAAK,OAAO,IAAI,KAAK;AAAA,QACnB,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,uBAAuB;AAAA,QACvB,iBAAiB;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAAA,MACF,CAAC;AACD,WAAK,KAAK,GAAG,UAAU,iBAAiB,CAAC,UAAU;AACjD,cAAM,UAAU,MAAM,OAAO;AAC7B,iBAAS,KAAK,YAAY,OAAO;AAAA,MACnC,CAAC;AAGD,WAAK,qBAAqB,KAAK,IAAI;AAGnC,YAAM,KAAK,KAAK,QAAQ,KAAK,OAAO,WAAW,OAAO,EAAE,eAAe,KAAK,CAAC;AAC7E,WAAK,cAAc;AAEnB,aAAU,QAAQ;AAAA,IACpB,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,YAAY;AAChB,QAAI;AACF,YAAM,CAAC,WAAW,SAAS,IAAI,KAAK,gBAAgB,aAAa,IAAI;AACrE,UAAI,UAAW,QAAU,QAAQ,SAAS;AAC1C,YAAM,UAAU,KAAK,WAAW;AAChC,WAAK,cAAc;AACnB,aAAU,QAAQ;AAAA,IACpB,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,OAAe;AAC9B,QAAI;AACF,YAAM,CAAC,WAAW,SAAS,IAAI,KAAK,gBAAgB,cAAc,IAAI;AACtE,UAAI,UAAW,QAAU,QAAQ,SAAS;AAC1C,aAAU,QAAQ,MAAM,UAAU,KAAK,iBAAiB,WAAW,EAAE,MAAM,CAAC,CAAC;AAAA,IAC/E,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,kBACE,OACA,UACA,SACA;AACA,QAAI;AACF,YAAM,CAAC,WAAW,SAAS,IAAI,KAAK,gBAAgB,eAAe,IAAI;AACvE,UAAI,UAAW,QAAU,QAAQ,SAAS;AAC1C,gBAAU,KAAK,0BAA0B,OAAO,OAAO,UAAU,oBAAoB;AACnF,cAAM,CAAC,GAAG,IAAI,MAAS,QAAQ,YAAY;AACzC,gBAAM,SAAS,UAAU,gBAAgB,QAAQ;AAAA,QACnD,CAAC;AACD,YAAI,IAAK,WAAU,GAAG;AAAA,MACxB,CAAC;AACD,aAAU,QAAQ,MAAM;AACtB,kBAAU,KAAK,4BAA4B,KAAK;AAAA,MAClD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB;AACvB,QAAI;AACF,YAAM,CAAC,WAAW,SAAS,IAAI,KAAK,gBAAgB,oBAAoB,IAAI;AAC5E,UAAI,UAAW,QAAU,QAAQ,SAAS;AAC1C,YAAM,UAAU,KAAK,iBAAiB,qBAAqB,MAAM;AAAA,QAC/D,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAU,QAAQ;AAAA,IACpB,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,YAAY;AAChB,QAAI;AACF,YAAM,CAAC,WAAW,SAAS,IAAI,KAAK,gBAAgB,aAAa,IAAI;AACrE,UAAI,UAAW,QAAU,QAAQ,SAAS;AAC1C,YAAM,UAAU,KAAK,WAAW;AAChC,aAAU,QAAQ;AAAA,IACpB,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,OAAmB;AACxC,QAAI;AACF,YAAM;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAU,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AACF;;;AExLO,IAAM,yBAAyB,sBAAsB,YAAY,CAAC,oBAAoB,CAAC;;;AHCvF,IAAM,oBAAoB,uBAAuB;AAAA,EACtD,QAAQC,GAAE,OAAO;AAAA,IACf,WAAW,uBAAuB,OAAO,SAAS,EAAE,UAAU,UAAU,CAAC;AAAA,IACzE,cAAcA,GAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAAA,EACtC,CAAC;AAAA,EACD,aAAa,wBAAC,WAAW;AACvB,WAAO,YAAY,uBAAuB,YAAY,OAAO,SAAS;AACtE,WAAO;AAAA,EACT,GAHa;AAIf,CAAC;;;AIbM,IAAM,aAAN,MAAkE;AAAA,EAAzE,OAAyE;AAAA;AAAA;AAAA,EAC9D,OAAY,CAAC;AAAA,EACtB;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AAAA,EAEf,KAAK,GAAM;AACT,QAAI,KAAK,QAAS;AAClB,SAAK,KAAK,KAAK,CAAC;AAChB,SAAK;AACL,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,GAAM;AACd,QAAI,KAAK,QAAS;AAClB,SAAK,KAAK,QAAQ,CAAC;AACnB,SAAK;AACL,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO;AACL,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,KAAK,WAAkC;AACrC,WAAO,KAAK,KAAK,KAAK,SAAS;AAAA,EACjC;AAAA,EAEA,SAAS;AACP,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAmC;AACvC,WAAO,MAAM;AACX,YAAM,QAAQ,KAAK,KAAK,MAAM;AAC9B,UAAI,UAAU,OAAW,QAAO,EAAE,OAAO,MAAM,MAAM;AACrD,UAAI,KAAK,QAAS,QAAO,EAAE,OAAO,QAAW,MAAM,KAAK;AAExD,YAAM,IAAI,QAAc,CAAC,QAAS,KAAK,UAAU,GAAI;AACrD,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,CAAC,OAAO,aAAa,IAAI;AACvB,WAAO;AAAA,EACT;AACF;","names":["z","z","z","z"]}