ngx-signal-hub
Version:
[](https://badge.fury.io/js/ngx-signal-hub) [](https://opensource.org/licenses/MIT) A lightweight, reactive signal hub service f
1 lines • 38.3 kB
Source Map (JSON)
{"version":3,"file":"ngx-signal-hub.mjs","sources":["../../../projects/ngx-signal-hub/src/lib/signal-hub.service.ts","../../../projects/ngx-signal-hub/src/public-api.ts","../../../projects/ngx-signal-hub/src/ngx-signal-hub.ts"],"sourcesContent":["import {\n DestroyRef,\n Injectable,\n Injector,\n effect,\n signal,\n computed,\n untracked,\n Signal,\n} from '@angular/core';\n\n/**\n * Represents an event in the signal hub with a key, data, and timestamp.\n */\nexport interface HubEvent<T = unknown> {\n key: string;\n data: T;\n timestamp: number;\n}\n\n/**\n * Represents the options for subscribing to a signal hub event.\n */\nexport interface HubEventOptions<T> {\n /** The key/query string to match events against (e.g., 'user:login', 'user:*'). */\n key: string;\n /** The callback function to execute when an event matches the query. */\n callback: (event: HubEvent<T>) => void | Promise<void>;\n /** Optional DestroyRef for auto-cleaning subscriptions. */\n destroyRef?: DestroyRef;\n /** If true, replays the latest event for the key on subscription. */\n replayLatest?: boolean;\n /** Optional error handler for callback errors. */\n onError?: (error: unknown, event: HubEvent<T>) => void;\n}\n\n/**\n * Represents a subscription to the signal hub.\n */\nexport interface HubSubscription {\n unsubscribe: () => void;\n}\n\n/**\n * A hybrid signal hub service for publishing and observing events using Signals and callbacks.\n * Supports pub/sub with key-based routing, pattern matching, and Signal-based event observation.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class MyComponent {\n * constructor(private signalHub: SignalHubService, private destroyRef: DestroyRef) {\n * // Synchronous subscription\n * this.signalHub.on({\n * key: 'user:*',\n * callback: (event) => console.log(event.data),\n * destroyRef: this.destroyRef,\n * replayLatest: true,\n * });\n *\n * // Asynchronous subscription\n * this.signalHub.onAsync({\n * key: 'user:login',\n * callback: async (event) => {\n * await fetch('/log', { method: 'POST', body: JSON.stringify(event.data) });\n * console.log(event.data);\n * },\n * replayLatest: true,\n * onError: (err) => console.error('Event error:', err),\n * });\n *\n * // Publish an event\n * this.signalHub.publish('user:login', { id: 123 });\n *\n * // Clear a specific event\n * this.signalHub.clearEvent('user:login');\n *\n * // Reset everything\n * this.signalHub.reset({ clearSubscribers: true });\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class SignalHubService {\n private readonly eventQueue = signal<HubEvent[]>([]);\n private readonly eventRegistry = signal<Map<string, HubEvent>>(new Map());\n private readonly subscribers = new Map<\n string,\n Array<{\n callback: (event: HubEvent<unknown>) => void | Promise<void>;\n onError?: (error: unknown, event: HubEvent<unknown>) => void;\n }>\n >();\n\n constructor(injector: Injector) {\n effect(\n () => {\n const queuedEvents = this.eventQueue();\n if (!queuedEvents.length) return;\n\n untracked(() => {\n const registry = this.eventRegistry();\n const updatedRegistry = new Map(registry);\n\n for (const event of queuedEvents) {\n updatedRegistry.set(event.key, event);\n this.notifySubscribers(event);\n }\n\n this.eventRegistry.set(updatedRegistry);\n this.eventQueue.set([]);\n });\n },\n { injector }\n );\n }\n\n /**\n * Publishes an event with the given key and data, triggering subscribers and updating the registry.\n *\n * @param key - The event key (e.g., 'user:login').\n * @param data - The event data (must not be null or undefined).\n * @throws Error if key is empty or data is null/undefined.\n *\n * @example\n * ```typescript\n * signalHub.publish('user:login', { id: 123 });\n * // Triggers subscribers to 'user:login' or 'user:*'\n * ```\n */\n publish<T>(key: string, data: T): void {\n if (!key) throw new Error('Key cannot be empty');\n if (data == null) throw new Error('Data cannot be null or undefined');\n\n const event: HubEvent<T> = { key, data, timestamp: Date.now() };\n this.eventQueue.update((queue) => [...queue, event]);\n }\n\n /**\n * Publishes an event with the given key, triggering subscribers and updating the registry.\n *\n * @param key - The event key (e.g., 'user:login').\n * @throws Error if key is empty.\n *\n * @example\n * ```typescript\n * signalHub.publish('user:login');\n * // Triggers subscribers to 'user:login' or 'user:*'\n * ```\n */\n publishNoData(key: string): void {\n if (!key) throw new Error('Key cannot be empty');\n const event: HubEvent<undefined> = { key, data: undefined, timestamp: Date.now() };\n this.eventQueue.update((queue) => [...queue, event]);\n }\n\n /**\n * Subscribes to events matching a query with a synchronous callback, optionally auto-cleaning with DestroyRef.\n * Supports pattern matching (e.g., 'user:*') and optional replay of the latest event.\n *\n * @param options - Subscription options including key, callback, and optional settings.\n * @returns A HubSubscription object with an unsubscribe method.\n * @throws Error if key is empty or callback is not a function.\n *\n * @example\n * ```typescript\n * signalHub.subscribe({\n * key: 'user:*',\n * callback: (event) => console.log(event.data),\n * replayLatest: true,\n * destroyRef: inject(DestroyRef),\n * onError: (err) => console.error('Error:', err),\n * });\n * ```\n */\n subscribe<T>({\n key,\n callback,\n destroyRef,\n replayLatest,\n onError,\n }: HubEventOptions<T>): HubSubscription {\n if (!key) throw new Error('Key cannot be empty');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n if (replayLatest) {\n const latestEvent = this.eventRegistry().get(key) as HubEvent<T> | undefined;\n if (latestEvent) {\n try {\n callback(latestEvent);\n } catch (error) {\n if (onError) {\n onError(error, latestEvent);\n } else {\n console.warn(`Replay error for query \"${key}\":`, error);\n }\n }\n }\n }\n return this.internalSubscribe(key, callback, destroyRef, onError);\n }\n\n /**\n * Subscribes to events matching a query with an asynchronous callback, optionally auto-cleaning with DestroyRef.\n * Supports pattern matching (e.g., 'user:*') and optional replay of the latest event.\n *\n * @param options - Subscription options including key, callback, and optional settings.\n * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n * @throws Error if key is empty or callback is not a function.\n *\n * @example\n * ```typescript\n * await signalHub.subscribeAsync({\n * key: 'user:*',\n * callback: async (event) => console.log(event.data),\n * replayLatest: true,\n * destroyRef: inject(DestroyRef),\n * onError: (err) => console.error('Error:', err),\n * });\n * ```\n */\n async subscribeAsync<T>({\n key,\n callback,\n destroyRef,\n replayLatest,\n onError,\n }: HubEventOptions<T>): Promise<HubSubscription> {\n if (!key) throw new Error('Key cannot be empty');\n if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n if (replayLatest) {\n const latestEvent = this.eventRegistry().get(key) as HubEvent<T> | undefined;\n if (latestEvent) {\n try {\n await callback(latestEvent);\n } catch (error) {\n if (onError) {\n onError(error, latestEvent);\n } else {\n console.warn(`Replay error for query \"${key}\":`, error);\n }\n }\n }\n }\n return this.internalSubscribe(key, callback, destroyRef, onError);\n }\n\n /**\n * A shorthand for subscribing to events with a synchronous callback, with optional replay and auto-cleanup.\n *\n * @param options - Options including key, callback, and optional replayLatest, destroyRef, and onError.\n * @returns A HubSubscription object with an unsubscribe method.\n *\n * @example\n * ```typescript\n * signalHub.on({\n * key: 'user:login',\n * callback: (event) => console.log(event.data),\n * replayLatest: true,\n * destroyRef: inject(DestroyRef),\n * onError: (err) => console.error('Error:', err),\n * });\n * ```\n */\n on<T>({ key, callback, replayLatest, destroyRef, onError }: HubEventOptions<T>): HubSubscription {\n return this.subscribe({ key, callback, replayLatest, destroyRef, onError });\n }\n\n /**\n * A shorthand for subscribing to events with an asynchronous callback, with optional replay and auto-cleanup.\n *\n * @param options - Options including key, callback, and optional replayLatest, destroyRef, and onError.\n * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n *\n * @example\n * ```typescript\n * await signalHub.onAsync({\n * key: 'user:login',\n * callback: async (event) => console.log(event.data),\n * replayLatest: true,\n * destroyRef: inject(DestroyRef),\n * onError: (err) => console.error('Error:', err),\n * });\n * ```\n */\n async onAsync<T>({\n key,\n callback,\n replayLatest,\n destroyRef,\n onError,\n }: HubEventOptions<T>): Promise<HubSubscription> {\n return this.subscribeAsync({ key, callback, replayLatest, destroyRef, onError });\n }\n\n /**\n * Subscribes to a single event matching the key with a synchronous callback, auto-unsubscribing after the first match.\n *\n * @param options - Options including key, callback, and optional replayLatest and onError.\n * @returns A HubSubscription object with an unsubscribe method.\n *\n * @example\n * ```typescript\n * signalHub.once({\n * key: 'user:login',\n * callback: (event) => console.log('Logged in:', event.data),\n * replayLatest: true,\n * onError: (err) => console.error('Error:', err),\n * });\n * ```\n */\n once<T>({ key, callback, replayLatest, onError }: HubEventOptions<T>): HubSubscription {\n let subscription: HubSubscription | null = null;\n // Guarantees the callback runs exactly once, even in the same `notifySubscribers` cycle.\n let hasRun = false;\n\n subscription = this.subscribe({\n key,\n callback: (event) => {\n if (hasRun) return; // Skip if already run.\n hasRun = true;\n subscription?.unsubscribe(); // Unsubscribe first\n callback(event as HubEvent<T>);\n },\n replayLatest,\n onError,\n });\n return subscription;\n }\n\n /**\n * Subscribes to a single event matching the key with an asynchronous callback, auto-unsubscribing after the first match.\n *\n * @param options - Options including key, callback, and optional replayLatest and onError.\n * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n *\n * @example\n * ```typescript\n * await signalHub.onceAsync({\n * key: 'user:login',\n * callback: async (event) => console.log('Logged in:', event.data),\n * replayLatest: true,\n * onError: (err) => console.error('Error:', err),\n * });\n * ```\n */\n async onceAsync<T>({\n key,\n callback,\n replayLatest,\n onError,\n }: HubEventOptions<T>): Promise<HubSubscription> {\n let subscription: HubSubscription | null = null;\n subscription = await this.subscribeAsync({\n key,\n callback: async (event) => {\n await callback(event as HubEvent<T>);\n subscription?.unsubscribe();\n },\n replayLatest,\n onError,\n });\n return subscription;\n }\n /**\n * Subscribes to the latest events from multiple keys, invoking the callback with an array of events\n * whenever any key emits a new event, provided all keys have emitted at least once.\n *\n * @param options - Options including keys, callback, and optional settings.\n * @returns A HubSubscription object with an unsubscribe method.\n * @throws Error if keys array is empty or contains invalid keys.\n *\n * @example\n * ```typescript\n * signalHub.onCombineLatest({\n * keys: ['user:login', 'user:logout'],\n * callback: (events) => console.log(events.map(e => e.data)),\n * replayLatest: true,\n * destroyRef: inject(DestroyRef),\n * onError: (err, events) => console.error('Error:', err, events),\n * });\n * ```\n */\n onCombineLatest<T>({\n keys,\n callback,\n destroyRef,\n replayLatest,\n onError,\n }: {\n keys: string[];\n callback: (events: HubEvent<T>[]) => void | Promise<void>;\n destroyRef?: DestroyRef;\n replayLatest?: boolean;\n onError?: (error: unknown, events: HubEvent<T>[]) => void;\n }): HubSubscription {\n if (!keys.length) throw new Error('Keys array cannot be empty');\n if (keys.some((key) => !key)) throw new Error('All keys must be non-empty');\n\n const safeCallback = callback as (events: HubEvent<unknown>[]) => void | Promise<void>;\n const safeOnError = onError as\n | ((error: unknown, events: HubEvent<unknown>[]) => void)\n | undefined;\n\n // Check if all keys have events for replay\n if (replayLatest) {\n const registry = this.eventRegistry();\n const latestEvents = keys.map((key) => registry.get(key) as HubEvent<T>).filter(Boolean);\n if (latestEvents.length === keys.length) {\n try {\n safeCallback(latestEvents);\n } catch (error) {\n if (safeOnError) {\n safeOnError(error, latestEvents);\n } else {\n console.warn(`Replay error for combineLatest:`, error);\n }\n }\n }\n }\n\n // Subscribe to each key\n const subscriptions = keys.map((key) =>\n this.on({\n key,\n callback: () => {\n // Check if all keys have events\n const registry = this.eventRegistry();\n const events = keys.map((k) => registry.get(k) as HubEvent<T>).filter(Boolean);\n if (events.length === keys.length) {\n try {\n safeCallback(events);\n } catch (error) {\n if (safeOnError) {\n safeOnError(error, events);\n } else {\n console.warn(`Callback error for combineLatest:`, error);\n }\n }\n }\n },\n // Adapt onError for single event\n onError: safeOnError\n ? (error, event) => safeOnError(error, [event]) // Wrap single event in array\n : undefined,\n })\n );\n\n // Handle unsubscribe\n let manualUnsubscribe = true;\n if (destroyRef) {\n manualUnsubscribe = false;\n destroyRef.onDestroy(() => subscriptions.forEach((sub) => sub.unsubscribe()));\n }\n\n return {\n unsubscribe: () => {\n if (manualUnsubscribe) {\n subscriptions.forEach((sub) => sub.unsubscribe());\n }\n },\n };\n }\n\n /**\n * Subscribes to the latest events from multiple keys with an asynchronous callback,\n * invoking the callback with an array of events whenever any key emits a new event,\n * provided all keys have emitted at least once.\n *\n * @param options - Options including keys, callback, and optional settings.\n * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n * @throws Error if keys array is empty or contains invalid keys.\n */\n async onCombineLatestAsync<T>({\n keys,\n callback,\n destroyRef,\n replayLatest,\n onError,\n }: {\n keys: string[];\n callback: (events: HubEvent<T>[]) => Promise<void>;\n destroyRef?: DestroyRef;\n replayLatest?: boolean;\n onError?: (error: unknown, events: HubEvent<T>[]) => void;\n }): Promise<HubSubscription> {\n if (!keys.length) throw new Error('Keys array cannot be empty');\n if (keys.some((key) => !key)) throw new Error('All keys must be non-empty');\n\n const safeCallback = callback as (events: HubEvent<unknown>[]) => Promise<void>;\n const safeOnError = onError as\n | ((error: unknown, events: HubEvent<unknown>[]) => void)\n | undefined;\n\n // Check if all keys have events for replay\n if (replayLatest) {\n const registry = this.eventRegistry();\n const latestEvents = keys.map((key) => registry.get(key) as HubEvent<T>).filter(Boolean);\n if (latestEvents.length === keys.length) {\n try {\n await safeCallback(latestEvents);\n } catch (error) {\n if (safeOnError) {\n safeOnError(error, latestEvents);\n } else {\n console.warn(`Replay error for combineLatestAsync:`, error);\n }\n }\n }\n }\n\n // Subscribe to each key\n const subscriptions = keys.map((key) =>\n this.on({\n key,\n callback: async () => {\n // Check if all keys have events\n const registry = this.eventRegistry();\n const events = keys.map((k) => registry.get(k) as HubEvent<T>).filter(Boolean);\n if (events.length === keys.length) {\n try {\n await safeCallback(events);\n } catch (error) {\n if (safeOnError) {\n safeOnError(error, events);\n } else {\n console.warn(`Callback error for combineLatestAsync:`, error);\n }\n }\n }\n },\n // Adapt onError for single event\n onError: safeOnError ? (error, event) => safeOnError(error, [event]) : undefined,\n })\n );\n\n // Handle unsubscribe\n let manualUnsubscribe = true;\n if (destroyRef) {\n manualUnsubscribe = false;\n destroyRef.onDestroy(() => subscriptions.forEach((sub) => sub.unsubscribe()));\n }\n\n return {\n unsubscribe: () => {\n if (manualUnsubscribe) {\n subscriptions.forEach((sub) => sub.unsubscribe());\n }\n },\n };\n }\n\n /**\n * Returns a Signal for observing the latest event for a specific key, or null if none exists.\n *\n * @param key - The event key to observe (e.g., 'user:login').\n * @returns A Signal emitting the latest HubEvent or null.\n * @throws Error if key is empty.\n *\n * @example\n * ```typescript\n * const userLogin = signalHub.toSignal('user:login');\n * effect(() => console.log(userLogin()?.data));\n * ```\n */\n toSignal<T>(key: string): Signal<HubEvent<T> | null> {\n if (!key) throw new Error('Key cannot be empty');\n return computed(() => this.eventRegistry().get(key) as HubEvent<T> | null);\n }\n\n /**\n * Returns a Signal for observing the latest events for multiple keys or wildcard patterns,\n * returning an array of matching events.\n *\n * @param keys - Array of event keys or wildcard patterns to observe (e.g., `['user:login', 'user:*']`).\n * @param options - Optional configuration for sorting the returned events.\n * @param options.sortBy - Sorts the events by `'timestamp'` (descending, latest first) or `'key'` (alphabetically).\n * @returns A Signal emitting an array of matching HubEvents, deduplicated by key.\n * @throws Error if the keys array is empty or contains invalid (empty) keys.\n *\n * @example\n * ```typescript\n * // Observe specific and wildcard keys\n * const events = signalHub.toSignalMultiple(['user:login', 'user:*'], { sortBy: 'timestamp' });\n * effect(() => console.log(events().map(e => `${e.key}: ${e.data}`)));\n *\n * // Publish events\n * signalHub.publish('user:login', { id: 123 });\n * signalHub.publish('user:logout', { id: 456 });\n *\n * // Output might be: [\"user:logout: {id: 456}\", \"user:login: {id: 123}\"] (sorted by timestamp)\n * ```\n */\n toSignalMultiple<T>(\n keys: string[],\n options: { sortBy?: 'timestamp' | 'key' } = {}\n ): Signal<HubEvent<T>[]> {\n if (!keys.length) throw new Error('Keys array cannot be empty');\n if (keys.some((key) => !key)) throw new Error('All keys must be non-empty');\n\n return computed(() => {\n const registry = this.eventRegistry();\n const matchingEvents: HubEvent<T>[] = [];\n\n // Track unique event keys to avoid duplicates\n const seenKeys = new Set<string>();\n\n for (const key of keys) {\n if (!key.includes('*')) {\n // Exact key match\n const event = registry.get(key) as HubEvent<T> | undefined;\n if (event && !seenKeys.has(event.key)) {\n matchingEvents.push(event);\n seenKeys.add(event.key);\n }\n } else {\n // Wildcard match\n for (const [eventKey, event] of registry) {\n if (this.matchQuery(eventKey, key) && !seenKeys.has(eventKey)) {\n matchingEvents.push(event as HubEvent<T>);\n seenKeys.add(eventKey);\n }\n }\n }\n }\n\n if (options.sortBy === 'timestamp') {\n return matchingEvents.sort((a, b) => b.timestamp - a.timestamp);\n } else if (options.sortBy === 'key') {\n return matchingEvents.sort((a, b) => a.key.localeCompare(b.key));\n }\n return matchingEvents;\n });\n }\n\n /**\n * Clears a specific event from the registry by its key.\n *\n * @param key - The event key to clear.\n * @throws Error if key is empty.\n *\n * @example\n * ```typescript\n * signalHub.clearEvent('user:login');\n * // Removes 'user:login' from the registry, affecting replayLatest and signals\n * ```\n */\n clearEvent(key: string): void {\n if (!key) throw new Error('Key cannot be empty');\n this.eventRegistry.update((registry) => {\n const updated = new Map(registry);\n updated.delete(key);\n return updated;\n });\n }\n\n /**\n * Resets the event registry, optionally clearing all subscribers.\n *\n * @param options - Optional settings for the reset operation.\n * @param options.clearSubscribers - If true, also clears all subscribers (default: false).\n *\n * @example\n * ```typescript\n * signalHub.reset(); // Clears event registry only\n * signalHub.reset({ clearSubscribers: true }); // Clears registry and subscribers\n * ```\n */\n reset(options: { clearSubscribers?: boolean } = {}): void {\n this.eventRegistry.set(new Map());\n if (options.clearSubscribers) {\n this.subscribers.clear();\n }\n }\n\n /**\n * Unsubscribes all callbacks for a specific key or all subscribers if no key is provided.\n *\n * @param key - Optional key to unsubscribe all callbacks for. If omitted, all subscribers are removed.\n *\n * @example\n * ```typescript\n * signalHub.unsubscribeAll('user:login'); // Remove all 'user:login' subscribers\n * signalHub.unsubscribeAll(); // Remove all subscribers\n * ```\n */\n unsubscribeAll(key?: string): void {\n if (key) {\n this.subscribers.delete(key);\n } else {\n this.subscribers.clear();\n }\n }\n\n private internalSubscribe<T>(\n query: string,\n callback: (event: HubEvent<T>) => void | Promise<void>,\n destroyRef?: DestroyRef,\n onError?: (error: unknown, event: HubEvent<T>) => void\n ): HubSubscription {\n const safeCallback = callback as (event: HubEvent<unknown>) => void | Promise<void>;\n const safeOnError = onError as ((error: unknown, event: HubEvent<unknown>) => void) | undefined;\n const callbacks = this.subscribers.get(query) ?? [];\n callbacks.push({ callback: safeCallback, onError: safeOnError });\n this.subscribers.set(query, callbacks);\n\n let manualUnsubscribe = true;\n if (destroyRef) {\n manualUnsubscribe = false;\n destroyRef.onDestroy(() => this.unsubscribe(query, safeCallback));\n }\n\n return {\n unsubscribe: () => {\n if (manualUnsubscribe) {\n this.unsubscribe(query, safeCallback);\n }\n },\n };\n }\n\n private async notifySubscribers(event: HubEvent): Promise<void> {\n const subscriberPromises: Promise<void>[] = [];\n\n this.subscribers.forEach((subscribers, query) => {\n if (this.matchQuery(event.key, query)) {\n subscribers.forEach(({ callback, onError }) => {\n const promise = Promise.resolve()\n .then(() => callback(event))\n .catch((error) => {\n if (onError) {\n onError(error, event);\n } else {\n console.warn(`Subscriber error for query \"${query}\":`, error);\n }\n });\n subscriberPromises.push(promise);\n });\n }\n });\n\n await Promise.all(subscriberPromises);\n }\n\n private unsubscribe<T>(\n query: string,\n callback: (event: HubEvent<T>) => void | Promise<void>\n ): void {\n const callbacks = this.subscribers.get(query);\n if (!callbacks) return;\n\n const updatedCallbacks = callbacks.filter(\n (sub) => sub.callback !== (callback as (event: HubEvent<unknown>) => void | Promise<void>)\n );\n if (updatedCallbacks.length) {\n this.subscribers.set(query, updatedCallbacks);\n } else {\n this.subscribers.delete(query);\n }\n }\n\n private matchQuery(key: string, query: string): boolean {\n if (key === query) return true;\n\n if (query === '*') return true;\n\n if (key.includes(':') && query.includes(':')) {\n const [keyPart1] = key.split(':');\n const [queryPart1, queryPart2] = query.split(':');\n\n if (keyPart1 === queryPart1 && queryPart2 === '*') return true;\n }\n\n return false;\n }\n}\n","/*\n * Public API Surface of ngx-signal-hub\n */\n\nexport * from './lib/signal-hub.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AA2CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;MAEU,gBAAgB,CAAA;AACV,IAAA,UAAU,GAAG,MAAM,CAAa,EAAE,CAAC;AACnC,IAAA,aAAa,GAAG,MAAM,CAAwB,IAAI,GAAG,EAAE,CAAC;AACxD,IAAA,WAAW,GAAG,IAAI,GAAG,EAMnC;AAEH,IAAA,WAAA,CAAY,QAAkB,EAAA;QAC5B,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE;YACtC,IAAI,CAAC,YAAY,CAAC,MAAM;gBAAE;YAE1B,SAAS,CAAC,MAAK;AACb,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AACrC,gBAAA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AAEzC,gBAAA,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE;oBAChC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC;AACrC,oBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;;AAG/B,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;AACvC,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,aAAC,CAAC;AACJ,SAAC,EACD,EAAE,QAAQ,EAAE,CACb;;AAGH;;;;;;;;;;;;AAYG;IACH,OAAO,CAAI,GAAW,EAAE,IAAO,EAAA;AAC7B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;QAChD,IAAI,IAAI,IAAI,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;AAErE,QAAA,MAAM,KAAK,GAAgB,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAC/D,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;;AAGtD;;;;;;;;;;;AAWG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AAChD,QAAA,MAAM,KAAK,GAAwB,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAClF,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;;AAGtD;;;;;;;;;;;;;;;;;;AAkBG;IACH,SAAS,CAAI,EACX,GAAG,EACH,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,OAAO,GACY,EAAA;AACnB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;QAChD,IAAI,OAAO,QAAQ,KAAK,UAAU;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;QAElF,IAAI,YAAY,EAAE;YAChB,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAA4B;YAC5E,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI;oBACF,QAAQ,CAAC,WAAW,CAAC;;gBACrB,OAAO,KAAK,EAAE;oBACd,IAAI,OAAO,EAAE;AACX,wBAAA,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;;yBACtB;wBACL,OAAO,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,GAAG,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC;;;;;AAK/D,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC;;AAGnE;;;;;;;;;;;;;;;;;;AAkBG;AACH,IAAA,MAAM,cAAc,CAAI,EACtB,GAAG,EACH,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,OAAO,GACY,EAAA;AACnB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;QAChD,IAAI,OAAO,QAAQ,KAAK,UAAU;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;QAElF,IAAI,YAAY,EAAE;YAChB,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAA4B;YAC5E,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI;AACF,oBAAA,MAAM,QAAQ,CAAC,WAAW,CAAC;;gBAC3B,OAAO,KAAK,EAAE;oBACd,IAAI,OAAO,EAAE;AACX,wBAAA,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;;yBACtB;wBACL,OAAO,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,GAAG,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC;;;;;AAK/D,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC;;AAGnE;;;;;;;;;;;;;;;;AAgBG;IACH,EAAE,CAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAsB,EAAA;AAC5E,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;AAG7E;;;;;;;;;;;;;;;;AAgBG;AACH,IAAA,MAAM,OAAO,CAAI,EACf,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,OAAO,GACY,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;AAGlF;;;;;;;;;;;;;;;AAeG;IACH,IAAI,CAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAsB,EAAA;QAClE,IAAI,YAAY,GAA2B,IAAI;;QAE/C,IAAI,MAAM,GAAG,KAAK;AAElB,QAAA,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5B,GAAG;AACH,YAAA,QAAQ,EAAE,CAAC,KAAK,KAAI;AAClB,gBAAA,IAAI,MAAM;AAAE,oBAAA,OAAO;gBACnB,MAAM,GAAG,IAAI;AACb,gBAAA,YAAY,EAAE,WAAW,EAAE,CAAC;gBAC5B,QAAQ,CAAC,KAAoB,CAAC;aAC/B;YACD,YAAY;YACZ,OAAO;AACR,SAAA,CAAC;AACF,QAAA,OAAO,YAAY;;AAGrB;;;;;;;;;;;;;;;AAeG;IACH,MAAM,SAAS,CAAI,EACjB,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,OAAO,GACY,EAAA;QACnB,IAAI,YAAY,GAA2B,IAAI;AAC/C,QAAA,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YACvC,GAAG;AACH,YAAA,QAAQ,EAAE,OAAO,KAAK,KAAI;AACxB,gBAAA,MAAM,QAAQ,CAAC,KAAoB,CAAC;gBACpC,YAAY,EAAE,WAAW,EAAE;aAC5B;YACD,YAAY;YACZ,OAAO;AACR,SAAA,CAAC;AACF,QAAA,OAAO,YAAY;;AAErB;;;;;;;;;;;;;;;;;;AAkBG;IACH,eAAe,CAAI,EACjB,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,OAAO,GAOR,EAAA;QACC,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QAC/D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QAE3E,MAAM,YAAY,GAAG,QAAiE;QACtF,MAAM,WAAW,GAAG,OAEP;;QAGb,IAAI,YAAY,EAAE;AAChB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACxF,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AACvC,gBAAA,IAAI;oBACF,YAAY,CAAC,YAAY,CAAC;;gBAC1B,OAAO,KAAK,EAAE;oBACd,IAAI,WAAW,EAAE;AACf,wBAAA,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;;yBAC3B;AACL,wBAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC;;;;;;AAO9D,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KACjC,IAAI,CAAC,EAAE,CAAC;YACN,GAAG;YACH,QAAQ,EAAE,MAAK;;AAEb,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AACjC,oBAAA,IAAI;wBACF,YAAY,CAAC,MAAM,CAAC;;oBACpB,OAAO,KAAK,EAAE;wBACd,IAAI,WAAW,EAAE;AACf,4BAAA,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;;6BACrB;AACL,4BAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC;;;;aAI/D;;AAED,YAAA,OAAO,EAAE;AACP,kBAAE,CAAC,KAAK,EAAE,KAAK,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;AAC/C,kBAAE,SAAS;AACd,SAAA,CAAC,CACH;;QAGD,IAAI,iBAAiB,GAAG,IAAI;QAC5B,IAAI,UAAU,EAAE;YACd,iBAAiB,GAAG,KAAK;YACzB,UAAU,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;;QAG/E,OAAO;YACL,WAAW,EAAE,MAAK;gBAChB,IAAI,iBAAiB,EAAE;AACrB,oBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;;aAEpD;SACF;;AAGH;;;;;;;;AAQG;AACH,IAAA,MAAM,oBAAoB,CAAI,EAC5B,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,OAAO,GAOR,EAAA;QACC,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QAC/D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QAE3E,MAAM,YAAY,GAAG,QAA0D;QAC/E,MAAM,WAAW,GAAG,OAEP;;QAGb,IAAI,YAAY,EAAE;AAChB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACxF,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AACvC,gBAAA,IAAI;AACF,oBAAA,MAAM,YAAY,CAAC,YAAY,CAAC;;gBAChC,OAAO,KAAK,EAAE;oBACd,IAAI,WAAW,EAAE;AACf,wBAAA,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;;yBAC3B;AACL,wBAAA,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,CAAC;;;;;;AAOnE,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KACjC,IAAI,CAAC,EAAE,CAAC;YACN,GAAG;YACH,QAAQ,EAAE,YAAW;;AAEnB,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AACjC,oBAAA,IAAI;AACF,wBAAA,MAAM,YAAY,CAAC,MAAM,CAAC;;oBAC1B,OAAO,KAAK,EAAE;wBACd,IAAI,WAAW,EAAE;AACf,4BAAA,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;;6BACrB;AACL,4BAAA,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,CAAC;;;;aAIpE;;YAED,OAAO,EAAE,WAAW,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS;AACjF,SAAA,CAAC,CACH;;QAGD,IAAI,iBAAiB,GAAG,IAAI;QAC5B,IAAI,UAAU,EAAE;YACd,iBAAiB,GAAG,KAAK;YACzB,UAAU,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;;QAG/E,OAAO;YACL,WAAW,EAAE,MAAK;gBAChB,IAAI,iBAAiB,EAAE;AACrB,oBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;;aAEpD;SACF;;AAGH;;;;;;;;;;;;AAYG;AACH,IAAA,QAAQ,CAAI,GAAW,EAAA;AACrB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AAChD,QAAA,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAuB,CAAC;;AAG5E;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACH,IAAA,gBAAgB,CACd,IAAc,EACd,OAAA,GAA4C,EAAE,EAAA;QAE9C,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QAC/D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QAE3E,OAAO,QAAQ,CAAC,MAAK;AACnB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;YACrC,MAAM,cAAc,GAAkB,EAAE;;AAGxC,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU;AAElC,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;;oBAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAA4B;AAC1D,oBAAA,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACrC,wBAAA,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1B,wBAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;;;qBAEpB;;oBAEL,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE;AACxC,wBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC7D,4BAAA,cAAc,CAAC,IAAI,CAAC,KAAoB,CAAC;AACzC,4BAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;;;;;AAM9B,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE;AAClC,gBAAA,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;;AAC1D,iBAAA,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE;gBACnC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;;AAElE,YAAA,OAAO,cAAc;AACvB,SAAC,CAAC;;AAGJ;;;;;;;;;;;AAWG;AACH,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;QAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;AACrC,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AACjC,YAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACnB,YAAA,OAAO,OAAO;AAChB,SAAC,CAAC;;AAGJ;;;;;;;;;;;AAWG;IACH,KAAK,CAAC,UAA0C,EAAE,EAAA;QAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,OAAO,CAAC,gBAAgB,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;;;AAI5B;;;;;;;;;;AAUG;AACH,IAAA,cAAc,CAAC,GAAY,EAAA;QACzB,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;;aACvB;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;;;AAIpB,IAAA,iBAAiB,CACvB,KAAa,EACb,QAAsD,EACtD,UAAuB,EACvB,OAAsD,EAAA;QAEtD,MAAM,YAAY,GAAG,QAA8D;QACnF,MAAM,WAAW,GAAG,OAA2E;AAC/F,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;AACnD,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAChE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;QAEtC,IAAI,iBAAiB,GAAG,IAAI;QAC5B,IAAI,UAAU,EAAE;YACd,iBAAiB,GAAG,KAAK;AACzB,YAAA,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;;QAGnE,OAAO;YACL,WAAW,EAAE,MAAK;gBAChB,IAAI,iBAAiB,EAAE;AACrB,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;;aAExC;SACF;;IAGK,MAAM,iBAAiB,CAAC,KAAe,EAAA;QAC7C,MAAM,kBAAkB,GAAoB,EAAE;QAE9C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,KAAI;YAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;gBACrC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAI;AAC5C,oBAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;yBAC5B,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC;AAC1B,yBAAA,KAAK,CAAC,CAAC,KAAK,KAAI;wBACf,IAAI,OAAO,EAAE;AACX,4BAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;;6BAChB;4BACL,OAAO,CAAC,IAAI,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC;;AAEjE,qBAAC,CAAC;AACJ,oBAAA,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;AAClC,iBAAC,CAAC;;AAEN,SAAC,CAAC;AAEF,QAAA,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;;IAG/B,WAAW,CACjB,KAAa,EACb,QAAsD,EAAA;QAEtD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CACvC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,KAAM,QAA+D,CAC3F;AACD,QAAA,IAAI,gBAAgB,CAAC,MAAM,EAAE;YAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC;;aACxC;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;;;IAI1B,UAAU,CAAC,GAAW,EAAE,KAAa,EAAA;QAC3C,IAAI,GAAG,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI;QAE9B,IAAI,KAAK,KAAK,GAAG;AAAE,YAAA,OAAO,IAAI;AAE9B,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AACjC,YAAA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAEjD,YAAA,IAAI,QAAQ,KAAK,UAAU,IAAI,UAAU,KAAK,GAAG;AAAE,gBAAA,OAAO,IAAI;;AAGhE,QAAA,OAAO,KAAK;;uGAnrBH,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;2FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACnFlC;;AAEG;;ACFH;;AAEG;;;;"}