@scarlett-player/embed 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/embed.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"embed.js","sources":["../../../node_modules/.pnpm/file+packages+core/node_modules/@scarlett-player/core/dist/index.js","../../../node_modules/.pnpm/file+packages+plugins+hls_@scarlett-player+core@0.1.0_hls.js@1.6.15/node_modules/@scarlett-player/hls/dist/index.js","../../../node_modules/.pnpm/file+packages+plugins+ui_@scarlett-player+core@0.1.0/node_modules/@scarlett-player/ui/dist/index.js","../src/parser.ts","../src/embed.ts","../src/index.ts"],"sourcesContent":["const effectContext = {\n current: null\n};\nlet currentEffect = null;\nfunction setCurrentEffect(effect2) {\n effectContext.current = effect2;\n currentEffect = effect2;\n}\nfunction getCurrentEffect() {\n return effectContext.current;\n}\nfunction effect(fn) {\n const execute = () => {\n setCurrentEffect(execute);\n try {\n fn();\n } catch (error) {\n console.error(\"[Scarlett Player] Error in effect:\", error);\n throw error;\n } finally {\n setCurrentEffect(null);\n }\n };\n execute();\n return () => {\n };\n}\nclass Signal {\n constructor(initialValue) {\n this.subscribers = /* @__PURE__ */ new Set();\n this.value = initialValue;\n }\n /**\n * Get the current value and track dependency if called within an effect.\n *\n * @returns Current value\n */\n get() {\n if (currentEffect) {\n this.subscribers.add(currentEffect);\n }\n return this.value;\n }\n /**\n * Set a new value and notify subscribers if changed.\n *\n * @param newValue - New value to set\n */\n set(newValue) {\n if (Object.is(this.value, newValue)) {\n return;\n }\n this.value = newValue;\n this.notify();\n }\n /**\n * Update the value using a function.\n *\n * @param updater - Function that receives current value and returns new value\n *\n * @example\n * ```ts\n * const count = new Signal(0);\n * count.update(n => n + 1); // Increments by 1\n * ```\n */\n update(updater) {\n this.set(updater(this.value));\n }\n /**\n * Subscribe to changes without automatic dependency tracking.\n *\n * @param callback - Function to call when value changes\n * @returns Unsubscribe function\n */\n subscribe(callback) {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n /**\n * Notify all subscribers of a change.\n * @internal\n */\n notify() {\n this.subscribers.forEach((subscriber) => {\n try {\n subscriber();\n } catch (error) {\n console.error(\"[Scarlett Player] Error in signal subscriber:\", error);\n }\n });\n }\n /**\n * Clean up all subscriptions.\n * Call this when destroying the signal.\n */\n destroy() {\n this.subscribers.clear();\n }\n /**\n * Get the current number of subscribers (for debugging).\n * @internal\n */\n getSubscriberCount() {\n return this.subscribers.size;\n }\n}\nfunction signal(initialValue) {\n return new Signal(initialValue);\n}\nclass Computed {\n constructor(computation) {\n this.dirty = true;\n this.subscribers = /* @__PURE__ */ new Set();\n this.dependencies = /* @__PURE__ */ new Set();\n this.computation = computation;\n this.invalidateCallback = () => this.invalidate();\n }\n /**\n * Get the computed value, tracking dependency if in effect context.\n *\n * Recomputes if dirty, otherwise returns cached value.\n *\n * @returns Computed value\n */\n get() {\n if (this.dirty) {\n const prevEffect = getCurrentEffect();\n setCurrentEffect(this.invalidateCallback);\n try {\n this.value = this.computation();\n this.dirty = false;\n } finally {\n setCurrentEffect(prevEffect);\n }\n }\n if (currentEffect) {\n this.subscribers.add(currentEffect);\n }\n return this.value;\n }\n /**\n * Mark the computed value as dirty (needs recomputation).\n *\n * Called when a dependency changes.\n * @internal\n */\n invalidate() {\n const wasDirty = this.dirty;\n this.dirty = true;\n if (!wasDirty || this.subscribers.size > 0) {\n this.notifySubscribers();\n }\n }\n /**\n * Subscribe to computed value changes.\n *\n * @param callback - Function to call when computed value may have changed\n * @returns Unsubscribe function\n */\n subscribe(callback) {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n /**\n * Notify subscribers that this computed value needs recomputation.\n * @internal\n */\n notifySubscribers() {\n this.subscribers.forEach((subscriber) => {\n try {\n subscriber();\n } catch (error) {\n console.error(\"[Scarlett Player] Error in computed subscriber:\", error);\n }\n });\n }\n /**\n * Clean up all subscriptions.\n */\n destroy() {\n this.dependencies.forEach((unsub) => unsub());\n this.dependencies.clear();\n this.subscribers.clear();\n this.value = void 0;\n this.dirty = true;\n }\n /**\n * Get the current number of subscribers (for debugging).\n * @internal\n */\n getSubscriberCount() {\n return this.subscribers.size;\n }\n}\nfunction computed(computation) {\n return new Computed(computation);\n}\nconst DEFAULT_STATE = {\n // Core Playback State\n playbackState: \"idle\",\n playing: false,\n paused: true,\n ended: false,\n buffering: false,\n waiting: false,\n seeking: false,\n // Time & Duration\n currentTime: 0,\n duration: NaN,\n buffered: null,\n bufferedAmount: 0,\n // Media Info\n mediaType: \"unknown\",\n source: null,\n title: \"\",\n poster: \"\",\n // Volume & Audio\n volume: 1,\n muted: false,\n // Playback Controls\n playbackRate: 1,\n fullscreen: false,\n pip: false,\n controlsVisible: true,\n // Quality & Tracks\n qualities: [],\n currentQuality: null,\n audioTracks: [],\n currentAudioTrack: null,\n textTracks: [],\n currentTextTrack: null,\n // Live/DVR State (TSP features)\n live: false,\n liveEdge: true,\n seekableRange: null,\n liveLatency: 0,\n lowLatencyMode: false,\n // Chapters (TSP features)\n chapters: [],\n currentChapter: null,\n // Error State\n error: null,\n // Network & Performance\n bandwidth: 0,\n autoplay: false,\n loop: false,\n // Casting State\n airplayAvailable: false,\n airplayActive: false,\n chromecastAvailable: false,\n chromecastActive: false,\n // UI State\n interacting: false,\n hovering: false,\n focused: false\n};\nclass StateManager {\n /**\n * Create a new StateManager with default initial state.\n *\n * @param initialState - Optional partial initial state (merged with defaults)\n */\n constructor(initialState) {\n this.signals = /* @__PURE__ */ new Map();\n this.changeSubscribers = /* @__PURE__ */ new Set();\n this.initializeSignals(initialState);\n }\n /**\n * Initialize all state signals with default or provided values.\n * @private\n */\n initializeSignals(overrides) {\n const initialState = { ...DEFAULT_STATE, ...overrides };\n for (const [key, value] of Object.entries(initialState)) {\n const stateKey = key;\n const stateSignal = signal(value);\n stateSignal.subscribe(() => {\n this.notifyChangeSubscribers(stateKey);\n });\n this.signals.set(stateKey, stateSignal);\n }\n }\n /**\n * Get the signal for a state property.\n *\n * @param key - State property key\n * @returns Signal for the property\n *\n * @example\n * ```ts\n * const playingSignal = state.get('playing');\n * playingSignal.get(); // false\n * playingSignal.set(true);\n * ```\n */\n get(key) {\n const stateSignal = this.signals.get(key);\n if (!stateSignal) {\n throw new Error(`[StateManager] Unknown state key: ${key}`);\n }\n return stateSignal;\n }\n /**\n * Get the current value of a state property (convenience method).\n *\n * @param key - State property key\n * @returns Current value\n *\n * @example\n * ```ts\n * state.getValue('playing'); // false\n * ```\n */\n getValue(key) {\n return this.get(key).get();\n }\n /**\n * Set the value of a state property.\n *\n * @param key - State property key\n * @param value - New value\n *\n * @example\n * ```ts\n * state.set('playing', true);\n * state.set('currentTime', 10.5);\n * ```\n */\n set(key, value) {\n this.get(key).set(value);\n }\n /**\n * Update multiple state properties at once (batch update).\n *\n * More efficient than calling set() multiple times.\n *\n * @param updates - Partial state object with updates\n *\n * @example\n * ```ts\n * state.update({\n * playing: true,\n * currentTime: 0,\n * volume: 1.0,\n * });\n * ```\n */\n update(updates) {\n for (const [key, value] of Object.entries(updates)) {\n const stateKey = key;\n if (this.signals.has(stateKey)) {\n this.set(stateKey, value);\n }\n }\n }\n /**\n * Subscribe to changes on a specific state property.\n *\n * @param key - State property key\n * @param callback - Callback function receiving new value\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = state.subscribe('playing', (value) => {\n * console.log('Playing:', value);\n * });\n * ```\n */\n subscribeToKey(key, callback) {\n const stateSignal = this.get(key);\n return stateSignal.subscribe(() => {\n callback(stateSignal.get());\n });\n }\n /**\n * Subscribe to all state changes.\n *\n * Receives a StateChangeEvent for every state property change.\n *\n * @param callback - Callback function receiving change events\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = state.subscribe((event) => {\n * console.log(`${event.key} changed:`, event.value);\n * });\n * ```\n */\n subscribe(callback) {\n this.changeSubscribers.add(callback);\n return () => this.changeSubscribers.delete(callback);\n }\n /**\n * Notify all global change subscribers.\n * @private\n */\n notifyChangeSubscribers(key) {\n const stateSignal = this.get(key);\n const value = stateSignal.get();\n const event = {\n key,\n value,\n previousValue: value\n // Note: We don't track previous values in this simple impl\n };\n this.changeSubscribers.forEach((subscriber) => {\n try {\n subscriber(event);\n } catch (error) {\n console.error(\"[StateManager] Error in change subscriber:\", error);\n }\n });\n }\n /**\n * Reset all state to default values.\n *\n * @example\n * ```ts\n * state.reset();\n * ```\n */\n reset() {\n this.update(DEFAULT_STATE);\n }\n /**\n * Reset a specific state property to its default value.\n *\n * @param key - State property key\n *\n * @example\n * ```ts\n * state.resetKey('playing');\n * ```\n */\n resetKey(key) {\n const defaultValue = DEFAULT_STATE[key];\n this.set(key, defaultValue);\n }\n /**\n * Get a snapshot of all current state values.\n *\n * @returns Frozen snapshot of current state\n *\n * @example\n * ```ts\n * const snapshot = state.snapshot();\n * console.log(snapshot.playing, snapshot.currentTime);\n * ```\n */\n snapshot() {\n const snapshot = {};\n for (const [key, stateSignal] of this.signals) {\n snapshot[key] = stateSignal.get();\n }\n return Object.freeze(snapshot);\n }\n /**\n * Get the number of subscribers for a state property (for debugging).\n *\n * @param key - State property key\n * @returns Number of subscribers\n * @internal\n */\n getSubscriberCount(key) {\n return this.signals.get(key)?.getSubscriberCount() ?? 0;\n }\n /**\n * Destroy the state manager and cleanup all signals.\n *\n * @example\n * ```ts\n * state.destroy();\n * ```\n */\n destroy() {\n this.signals.forEach((stateSignal) => stateSignal.destroy());\n this.signals.clear();\n this.changeSubscribers.clear();\n }\n}\nconst DEFAULT_OPTIONS = {\n maxListeners: 100,\n async: false,\n interceptors: true\n};\nclass EventBus {\n /**\n * Create a new EventBus.\n *\n * @param options - Optional configuration\n */\n constructor(options) {\n this.listeners = /* @__PURE__ */ new Map();\n this.onceListeners = /* @__PURE__ */ new Map();\n this.interceptors = /* @__PURE__ */ new Map();\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = events.on('playback:play', () => {\n * console.log('Playing!');\n * });\n *\n * // Later: unsubscribe\n * unsub();\n * ```\n */\n on(event, handler) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, /* @__PURE__ */ new Set());\n }\n const handlers = this.listeners.get(event);\n handlers.add(handler);\n this.checkMaxListeners(event);\n return () => this.off(event, handler);\n }\n /**\n * Subscribe to an event once (auto-unsubscribe after first call).\n *\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * events.once('player:ready', () => {\n * console.log('Player ready!');\n * });\n * ```\n */\n once(event, handler) {\n if (!this.onceListeners.has(event)) {\n this.onceListeners.set(event, /* @__PURE__ */ new Set());\n }\n const handlers = this.onceListeners.get(event);\n handlers.add(handler);\n if (!this.listeners.has(event)) {\n this.listeners.set(event, /* @__PURE__ */ new Set());\n }\n return () => {\n handlers.delete(handler);\n };\n }\n /**\n * Unsubscribe from an event.\n *\n * @param event - Event name\n * @param handler - Event handler function to remove\n *\n * @example\n * ```ts\n * const handler = () => console.log('Playing!');\n * events.on('playback:play', handler);\n * events.off('playback:play', handler);\n * ```\n */\n off(event, handler) {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.listeners.delete(event);\n }\n }\n const onceHandlers = this.onceListeners.get(event);\n if (onceHandlers) {\n onceHandlers.delete(handler);\n if (onceHandlers.size === 0) {\n this.onceListeners.delete(event);\n }\n }\n }\n /**\n * Emit an event synchronously.\n *\n * Runs interceptors first, then calls all handlers.\n *\n * @param event - Event name\n * @param payload - Event payload\n *\n * @example\n * ```ts\n * events.emit('playback:play', undefined);\n * events.emit('playback:timeupdate', { currentTime: 10.5 });\n * ```\n */\n emit(event, payload) {\n const interceptedPayload = this.runInterceptors(event, payload);\n if (interceptedPayload === null) {\n return;\n }\n const handlers = this.listeners.get(event);\n if (handlers) {\n const handlersArray = Array.from(handlers);\n handlersArray.forEach((handler) => {\n this.safeCallHandler(handler, interceptedPayload);\n });\n }\n const onceHandlers = this.onceListeners.get(event);\n if (onceHandlers) {\n const handlersArray = Array.from(onceHandlers);\n handlersArray.forEach((handler) => {\n this.safeCallHandler(handler, interceptedPayload);\n });\n this.onceListeners.delete(event);\n }\n }\n /**\n * Emit an event asynchronously (next tick).\n *\n * @param event - Event name\n * @param payload - Event payload\n * @returns Promise that resolves when all handlers complete\n *\n * @example\n * ```ts\n * await events.emitAsync('media:loaded', { src: 'video.mp4', type: 'video/mp4' });\n * ```\n */\n async emitAsync(event, payload) {\n const interceptedPayload = await this.runInterceptorsAsync(event, payload);\n if (interceptedPayload === null) {\n return;\n }\n const handlers = this.listeners.get(event);\n if (handlers) {\n const promises = Array.from(handlers).map(\n (handler) => this.safeCallHandlerAsync(handler, interceptedPayload)\n );\n await Promise.all(promises);\n }\n const onceHandlers = this.onceListeners.get(event);\n if (onceHandlers) {\n const handlersArray = Array.from(onceHandlers);\n const promises = handlersArray.map(\n (handler) => this.safeCallHandlerAsync(handler, interceptedPayload)\n );\n await Promise.all(promises);\n this.onceListeners.delete(event);\n }\n }\n /**\n * Add an event interceptor.\n *\n * Interceptors run before handlers and can modify or cancel events.\n *\n * @param event - Event name\n * @param interceptor - Interceptor function\n * @returns Remove interceptor function\n *\n * @example\n * ```ts\n * events.intercept('playback:timeupdate', (payload) => {\n * // Round time to 2 decimals\n * return { currentTime: Math.round(payload.currentTime * 100) / 100 };\n * });\n *\n * // Cancel events\n * events.intercept('playback:play', (payload) => {\n * if (notReady) return null; // Cancel event\n * return payload;\n * });\n * ```\n */\n intercept(event, interceptor) {\n if (!this.options.interceptors) {\n return () => {\n };\n }\n if (!this.interceptors.has(event)) {\n this.interceptors.set(event, /* @__PURE__ */ new Set());\n }\n const interceptorsSet = this.interceptors.get(event);\n interceptorsSet.add(interceptor);\n return () => {\n interceptorsSet.delete(interceptor);\n if (interceptorsSet.size === 0) {\n this.interceptors.delete(event);\n }\n };\n }\n /**\n * Remove all listeners for an event (or all events if no event specified).\n *\n * @param event - Optional event name\n *\n * @example\n * ```ts\n * events.removeAllListeners('playback:play'); // Remove all playback:play listeners\n * events.removeAllListeners(); // Remove ALL listeners\n * ```\n */\n removeAllListeners(event) {\n if (event) {\n this.listeners.delete(event);\n this.onceListeners.delete(event);\n } else {\n this.listeners.clear();\n this.onceListeners.clear();\n }\n }\n /**\n * Get the number of listeners for an event.\n *\n * @param event - Event name\n * @returns Number of listeners\n *\n * @example\n * ```ts\n * events.listenerCount('playback:play'); // 3\n * ```\n */\n listenerCount(event) {\n const regularCount = this.listeners.get(event)?.size ?? 0;\n const onceCount = this.onceListeners.get(event)?.size ?? 0;\n return regularCount + onceCount;\n }\n /**\n * Destroy event bus and cleanup all listeners/interceptors.\n *\n * @example\n * ```ts\n * events.destroy();\n * ```\n */\n destroy() {\n this.listeners.clear();\n this.onceListeners.clear();\n this.interceptors.clear();\n }\n /**\n * Run interceptors synchronously.\n * @private\n */\n runInterceptors(event, payload) {\n if (!this.options.interceptors) {\n return payload;\n }\n const interceptorsSet = this.interceptors.get(event);\n if (!interceptorsSet || interceptorsSet.size === 0) {\n return payload;\n }\n let currentPayload = payload;\n for (const interceptor of interceptorsSet) {\n try {\n currentPayload = interceptor(currentPayload);\n if (currentPayload === null) {\n return null;\n }\n } catch (error) {\n console.error(\"[EventBus] Error in interceptor:\", error);\n }\n }\n return currentPayload;\n }\n /**\n * Run interceptors asynchronously.\n * @private\n */\n async runInterceptorsAsync(event, payload) {\n if (!this.options.interceptors) {\n return payload;\n }\n const interceptorsSet = this.interceptors.get(event);\n if (!interceptorsSet || interceptorsSet.size === 0) {\n return payload;\n }\n let currentPayload = payload;\n for (const interceptor of interceptorsSet) {\n try {\n const result = interceptor(currentPayload);\n currentPayload = result instanceof Promise ? await result : result;\n if (currentPayload === null) {\n return null;\n }\n } catch (error) {\n console.error(\"[EventBus] Error in interceptor:\", error);\n }\n }\n return currentPayload;\n }\n /**\n * Safely call a handler with error handling.\n * @private\n */\n safeCallHandler(handler, payload) {\n try {\n handler(payload);\n } catch (error) {\n console.error(\"[EventBus] Error in event handler:\", error);\n }\n }\n /**\n * Safely call a handler asynchronously with error handling.\n * @private\n */\n async safeCallHandlerAsync(handler, payload) {\n try {\n const result = handler(payload);\n if (result instanceof Promise) {\n await result;\n }\n } catch (error) {\n console.error(\"[EventBus] Error in event handler:\", error);\n }\n }\n /**\n * Check if max listeners exceeded and warn.\n * @private\n */\n checkMaxListeners(event) {\n const count = this.listenerCount(event);\n if (count > this.options.maxListeners) {\n console.warn(\n `[EventBus] Max listeners (${this.options.maxListeners}) exceeded for event: ${event}. Current count: ${count}. This may indicate a memory leak.`\n );\n }\n }\n}\nconst LOG_LEVELS = [\"debug\", \"info\", \"warn\", \"error\"];\nconst defaultConsoleHandler = (entry) => {\n const prefix = entry.scope ? `[${entry.scope}]` : \"[ScarlettPlayer]\";\n const message = `${prefix} ${entry.message}`;\n const metadata = entry.metadata ?? \"\";\n switch (entry.level) {\n case \"debug\":\n console.debug(message, metadata);\n break;\n case \"info\":\n console.info(message, metadata);\n break;\n case \"warn\":\n console.warn(message, metadata);\n break;\n case \"error\":\n console.error(message, metadata);\n break;\n }\n};\nclass Logger {\n /**\n * Create a new Logger.\n *\n * @param options - Logger configuration\n */\n constructor(options) {\n this.level = options?.level ?? \"warn\";\n this.scope = options?.scope;\n this.enabled = options?.enabled ?? true;\n this.handlers = options?.handlers ?? [defaultConsoleHandler];\n }\n /**\n * Create a child logger with a scope.\n *\n * Child loggers inherit parent settings and chain scopes.\n *\n * @param scope - Child logger scope\n * @returns New child logger\n *\n * @example\n * ```ts\n * const logger = new Logger();\n * const hlsLogger = logger.child('hls-plugin');\n * hlsLogger.info('Loading manifest');\n * // Output: [ScarlettPlayer:hls-plugin] Loading manifest\n * ```\n */\n child(scope) {\n return new Logger({\n level: this.level,\n scope: this.scope ? `${this.scope}:${scope}` : scope,\n enabled: this.enabled,\n handlers: this.handlers\n });\n }\n /**\n * Log a debug message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.debug('Request sent', { url: '/api/video' });\n * ```\n */\n debug(message, metadata) {\n this.log(\"debug\", message, metadata);\n }\n /**\n * Log an info message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.info('Player ready');\n * ```\n */\n info(message, metadata) {\n this.log(\"info\", message, metadata);\n }\n /**\n * Log a warning message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.warn('Low buffer', { buffered: 2.5 });\n * ```\n */\n warn(message, metadata) {\n this.log(\"warn\", message, metadata);\n }\n /**\n * Log an error message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.error('Playback failed', { code: 'MEDIA_ERR_DECODE' });\n * ```\n */\n error(message, metadata) {\n this.log(\"error\", message, metadata);\n }\n /**\n * Set the minimum log level threshold.\n *\n * @param level - New log level\n *\n * @example\n * ```ts\n * logger.setLevel('debug'); // Show all logs\n * logger.setLevel('error'); // Show only errors\n * ```\n */\n setLevel(level) {\n this.level = level;\n }\n /**\n * Enable or disable logging.\n *\n * @param enabled - Enable flag\n *\n * @example\n * ```ts\n * logger.setEnabled(false); // Disable all logging\n * ```\n */\n setEnabled(enabled) {\n this.enabled = enabled;\n }\n /**\n * Add a custom log handler.\n *\n * @param handler - Log handler function\n *\n * @example\n * ```ts\n * logger.addHandler((entry) => {\n * if (entry.level === 'error') {\n * sendToAnalytics(entry);\n * }\n * });\n * ```\n */\n addHandler(handler) {\n this.handlers.push(handler);\n }\n /**\n * Remove a custom log handler.\n *\n * @param handler - Log handler function to remove\n *\n * @example\n * ```ts\n * logger.removeHandler(myHandler);\n * ```\n */\n removeHandler(handler) {\n const index = this.handlers.indexOf(handler);\n if (index !== -1) {\n this.handlers.splice(index, 1);\n }\n }\n /**\n * Core logging implementation.\n * @private\n */\n log(level, message, metadata) {\n if (!this.enabled || !this.shouldLog(level)) {\n return;\n }\n const entry = {\n level,\n message,\n timestamp: Date.now(),\n scope: this.scope,\n metadata\n };\n for (const handler of this.handlers) {\n try {\n handler(entry);\n } catch (error) {\n console.error(\"[Logger] Handler error:\", error);\n }\n }\n }\n /**\n * Check if a log level should be output.\n * @private\n */\n shouldLog(level) {\n return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(this.level);\n }\n}\nfunction createLogger(scope) {\n return new Logger({ scope });\n}\nvar ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {\n ErrorCode2[\"SOURCE_NOT_SUPPORTED\"] = \"SOURCE_NOT_SUPPORTED\";\n ErrorCode2[\"SOURCE_LOAD_FAILED\"] = \"SOURCE_LOAD_FAILED\";\n ErrorCode2[\"PROVIDER_NOT_FOUND\"] = \"PROVIDER_NOT_FOUND\";\n ErrorCode2[\"PROVIDER_SETUP_FAILED\"] = \"PROVIDER_SETUP_FAILED\";\n ErrorCode2[\"PLUGIN_SETUP_FAILED\"] = \"PLUGIN_SETUP_FAILED\";\n ErrorCode2[\"PLUGIN_NOT_FOUND\"] = \"PLUGIN_NOT_FOUND\";\n ErrorCode2[\"PLAYBACK_FAILED\"] = \"PLAYBACK_FAILED\";\n ErrorCode2[\"MEDIA_DECODE_ERROR\"] = \"MEDIA_DECODE_ERROR\";\n ErrorCode2[\"MEDIA_NETWORK_ERROR\"] = \"MEDIA_NETWORK_ERROR\";\n ErrorCode2[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n return ErrorCode2;\n})(ErrorCode || {});\nclass ErrorHandler {\n /**\n * Create a new ErrorHandler.\n *\n * @param eventBus - Event bus for error emission\n * @param logger - Logger for error logging\n * @param options - Optional configuration\n */\n constructor(eventBus, logger, options) {\n this.errors = [];\n this.eventBus = eventBus;\n this.logger = logger;\n this.maxHistory = options?.maxHistory ?? 10;\n }\n /**\n * Handle an error.\n *\n * Normalizes, logs, emits, and tracks the error.\n *\n * @param error - Error to handle (native or PlayerError)\n * @param context - Optional context (what was happening)\n * @returns Normalized PlayerError\n *\n * @example\n * ```ts\n * try {\n * loadVideo();\n * } catch (error) {\n * errorHandler.handle(error as Error, { src: 'video.mp4' });\n * }\n * ```\n */\n handle(error, context) {\n const playerError = this.normalizeError(error, context);\n this.addToHistory(playerError);\n this.logError(playerError);\n this.eventBus.emit(\"error\", playerError);\n return playerError;\n }\n /**\n * Create and handle an error from code.\n *\n * @param code - Error code\n * @param message - Error message\n * @param options - Optional error options\n * @returns Created PlayerError\n *\n * @example\n * ```ts\n * errorHandler.throw(\n * ErrorCode.SOURCE_NOT_SUPPORTED,\n * 'MP4 not supported',\n * { fatal: true, context: { type: 'video/mp4' } }\n * );\n * ```\n */\n throw(code, message, options) {\n const error = {\n code,\n message,\n fatal: options?.fatal ?? this.isFatalCode(code),\n timestamp: Date.now(),\n context: options?.context,\n originalError: options?.originalError\n };\n return this.handle(error, options?.context);\n }\n /**\n * Get error history.\n *\n * @returns Readonly copy of error history\n *\n * @example\n * ```ts\n * const history = errorHandler.getHistory();\n * console.log(`${history.length} errors occurred`);\n * ```\n */\n getHistory() {\n return [...this.errors];\n }\n /**\n * Get last error that occurred.\n *\n * @returns Last error or null if none\n *\n * @example\n * ```ts\n * const lastError = errorHandler.getLastError();\n * if (lastError?.fatal) {\n * showErrorMessage(lastError.message);\n * }\n * ```\n */\n getLastError() {\n return this.errors[this.errors.length - 1] ?? null;\n }\n /**\n * Clear error history.\n *\n * @example\n * ```ts\n * errorHandler.clearHistory();\n * ```\n */\n clearHistory() {\n this.errors = [];\n }\n /**\n * Check if any fatal errors occurred.\n *\n * @returns True if any fatal error in history\n *\n * @example\n * ```ts\n * if (errorHandler.hasFatalError()) {\n * player.reset();\n * }\n * ```\n */\n hasFatalError() {\n return this.errors.some((e) => e.fatal);\n }\n /**\n * Normalize error to PlayerError.\n * @private\n */\n normalizeError(error, context) {\n if (this.isPlayerError(error)) {\n return {\n ...error,\n context: { ...error.context, ...context }\n };\n }\n return {\n code: this.getErrorCode(error),\n message: error.message,\n fatal: this.isFatal(error),\n timestamp: Date.now(),\n context,\n originalError: error\n };\n }\n /**\n * Determine error code from native Error.\n * @private\n */\n getErrorCode(error) {\n const message = error.message.toLowerCase();\n if (message.includes(\"network\")) {\n return \"MEDIA_NETWORK_ERROR\";\n }\n if (message.includes(\"decode\")) {\n return \"MEDIA_DECODE_ERROR\";\n }\n if (message.includes(\"source\")) {\n return \"SOURCE_LOAD_FAILED\";\n }\n if (message.includes(\"plugin\")) {\n return \"PLUGIN_SETUP_FAILED\";\n }\n if (message.includes(\"provider\")) {\n return \"PROVIDER_SETUP_FAILED\";\n }\n return \"UNKNOWN_ERROR\";\n }\n /**\n * Determine if error is fatal.\n * @private\n */\n isFatal(error) {\n return this.isFatalCode(this.getErrorCode(error));\n }\n /**\n * Determine if error code is fatal.\n * @private\n */\n isFatalCode(code) {\n const fatalCodes = [\n \"SOURCE_NOT_SUPPORTED\",\n \"PROVIDER_NOT_FOUND\",\n \"MEDIA_DECODE_ERROR\"\n /* MEDIA_DECODE_ERROR */\n ];\n return fatalCodes.includes(code);\n }\n /**\n * Type guard for PlayerError.\n * @private\n */\n isPlayerError(error) {\n return typeof error === \"object\" && error !== null && \"code\" in error && \"message\" in error && \"fatal\" in error && \"timestamp\" in error;\n }\n /**\n * Add error to history.\n * @private\n */\n addToHistory(error) {\n this.errors.push(error);\n if (this.errors.length > this.maxHistory) {\n this.errors.shift();\n }\n }\n /**\n * Log error with appropriate level.\n * @private\n */\n logError(error) {\n const logMessage = `[${error.code}] ${error.message}`;\n if (error.fatal) {\n this.logger.error(logMessage, {\n code: error.code,\n context: error.context\n });\n } else {\n this.logger.warn(logMessage, {\n code: error.code,\n context: error.context\n });\n }\n }\n}\nclass PluginAPI {\n /**\n * Create a new PluginAPI.\n *\n * @param pluginId - ID of the plugin this API belongs to\n * @param deps - Dependencies (stateManager, eventBus, logger, container, getPlugin)\n */\n constructor(pluginId, deps) {\n this.cleanupFns = [];\n this.pluginId = pluginId;\n this.stateManager = deps.stateManager;\n this.eventBus = deps.eventBus;\n this.container = deps.container;\n this.getPluginFn = deps.getPlugin;\n this.logger = {\n debug: (msg, metadata) => deps.logger.debug(`[${pluginId}] ${msg}`, metadata),\n info: (msg, metadata) => deps.logger.info(`[${pluginId}] ${msg}`, metadata),\n warn: (msg, metadata) => deps.logger.warn(`[${pluginId}] ${msg}`, metadata),\n error: (msg, metadata) => deps.logger.error(`[${pluginId}] ${msg}`, metadata)\n };\n }\n /**\n * Get a state value.\n *\n * @param key - State property key\n * @returns Current state value\n */\n getState(key) {\n return this.stateManager.getValue(key);\n }\n /**\n * Set a state value.\n *\n * @param key - State property key\n * @param value - New state value\n */\n setState(key, value) {\n this.stateManager.set(key, value);\n }\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n on(event, handler) {\n return this.eventBus.on(event, handler);\n }\n /**\n * Unsubscribe from an event.\n *\n * @param event - Event name\n * @param handler - Event handler to remove\n */\n off(event, handler) {\n this.eventBus.off(event, handler);\n }\n /**\n * Emit an event.\n *\n * @param event - Event name\n * @param payload - Event payload\n */\n emit(event, payload) {\n this.eventBus.emit(event, payload);\n }\n /**\n * Get another plugin by ID (if ready).\n *\n * @param id - Plugin ID\n * @returns Plugin instance or null if not found/ready\n */\n getPlugin(id) {\n return this.getPluginFn(id);\n }\n /**\n * Register a cleanup function to run when plugin is destroyed.\n *\n * @param cleanup - Cleanup function\n */\n onDestroy(cleanup) {\n this.cleanupFns.push(cleanup);\n }\n /**\n * Subscribe to state changes.\n *\n * @param callback - Callback function called on any state change\n * @returns Unsubscribe function\n */\n subscribeToState(callback) {\n return this.stateManager.subscribe(callback);\n }\n /**\n * Run all registered cleanup functions.\n * Called by PluginManager when destroying the plugin.\n *\n * @internal\n */\n runCleanups() {\n for (const cleanup of this.cleanupFns) {\n try {\n cleanup();\n } catch (error) {\n this.logger.error(\"Cleanup function failed\", { error });\n }\n }\n this.cleanupFns = [];\n }\n /**\n * Get all registered cleanup functions.\n *\n * @returns Array of cleanup functions\n * @internal\n */\n getCleanupFns() {\n return this.cleanupFns;\n }\n}\nclass PluginManager {\n constructor(eventBus, stateManager, logger, options) {\n this.plugins = /* @__PURE__ */ new Map();\n this.eventBus = eventBus;\n this.stateManager = stateManager;\n this.logger = logger;\n this.container = options.container;\n }\n /** Register a plugin with optional configuration. */\n register(plugin, config) {\n if (this.plugins.has(plugin.id)) {\n throw new Error(`Plugin \"${plugin.id}\" is already registered`);\n }\n this.validatePlugin(plugin);\n const api = new PluginAPI(plugin.id, {\n stateManager: this.stateManager,\n eventBus: this.eventBus,\n logger: this.logger,\n container: this.container,\n getPlugin: (id) => this.getReadyPlugin(id)\n });\n this.plugins.set(plugin.id, {\n plugin,\n state: \"registered\",\n config,\n cleanupFns: [],\n api\n });\n this.logger.info(`Plugin registered: ${plugin.id}`);\n this.eventBus.emit(\"plugin:registered\", { name: plugin.id, type: plugin.type });\n }\n /** Unregister a plugin. Destroys it first if active. */\n async unregister(id) {\n const record = this.plugins.get(id);\n if (!record) return;\n if (record.state === \"ready\") {\n await this.destroyPlugin(id);\n }\n this.plugins.delete(id);\n this.logger.info(`Plugin unregistered: ${id}`);\n }\n /** Initialize all registered plugins in dependency order. */\n async initAll() {\n const order = this.resolveDependencyOrder();\n for (const id of order) {\n await this.initPlugin(id);\n }\n }\n /** Initialize a specific plugin. */\n async initPlugin(id) {\n const record = this.plugins.get(id);\n if (!record) {\n throw new Error(`Plugin \"${id}\" not found`);\n }\n if (record.state === \"ready\") return;\n if (record.state === \"initializing\") {\n throw new Error(`Plugin \"${id}\" is already initializing (possible circular dependency)`);\n }\n for (const depId of record.plugin.dependencies || []) {\n const dep = this.plugins.get(depId);\n if (!dep) {\n throw new Error(`Plugin \"${id}\" depends on missing plugin \"${depId}\"`);\n }\n if (dep.state !== \"ready\") {\n await this.initPlugin(depId);\n }\n }\n try {\n record.state = \"initializing\";\n if (record.plugin.onStateChange) {\n const unsub = this.stateManager.subscribe(record.plugin.onStateChange.bind(record.plugin));\n record.api.onDestroy(unsub);\n }\n if (record.plugin.onError) {\n const unsub = this.eventBus.on(\"error\", (err) => {\n record.plugin.onError?.(err.originalError || new Error(err.message));\n });\n record.api.onDestroy(unsub);\n }\n await record.plugin.init(record.api, record.config);\n record.state = \"ready\";\n this.logger.info(`Plugin ready: ${id}`);\n this.eventBus.emit(\"plugin:active\", { name: id });\n } catch (error) {\n record.state = \"error\";\n record.error = error;\n this.logger.error(`Plugin init failed: ${id}`, { error });\n this.eventBus.emit(\"plugin:error\", { name: id, error });\n throw error;\n }\n }\n /** Destroy all plugins in reverse dependency order. */\n async destroyAll() {\n const order = this.resolveDependencyOrder().reverse();\n for (const id of order) {\n await this.destroyPlugin(id);\n }\n }\n /** Destroy a specific plugin. */\n async destroyPlugin(id) {\n const record = this.plugins.get(id);\n if (!record || record.state !== \"ready\") return;\n try {\n await record.plugin.destroy();\n record.api.runCleanups();\n record.state = \"registered\";\n this.logger.info(`Plugin destroyed: ${id}`);\n this.eventBus.emit(\"plugin:destroyed\", { name: id });\n } catch (error) {\n this.logger.error(`Plugin destroy failed: ${id}`, { error });\n record.state = \"registered\";\n }\n }\n /** Get a plugin by ID (returns any registered plugin). */\n getPlugin(id) {\n const record = this.plugins.get(id);\n return record ? record.plugin : null;\n }\n /** Get a plugin by ID only if ready (used by PluginAPI). */\n getReadyPlugin(id) {\n const record = this.plugins.get(id);\n return record?.state === \"ready\" ? record.plugin : null;\n }\n /** Check if a plugin is registered. */\n hasPlugin(id) {\n return this.plugins.has(id);\n }\n /** Get plugin state. */\n getPluginState(id) {\n return this.plugins.get(id)?.state ?? null;\n }\n /** Get all registered plugin IDs. */\n getPluginIds() {\n return Array.from(this.plugins.keys());\n }\n /** Get all ready plugins. */\n getReadyPlugins() {\n return Array.from(this.plugins.values()).filter((r) => r.state === \"ready\").map((r) => r.plugin);\n }\n /** Get plugins by type. */\n getPluginsByType(type) {\n return Array.from(this.plugins.values()).filter((r) => r.plugin.type === type).map((r) => r.plugin);\n }\n /** Select a provider plugin that can play a source. */\n selectProvider(source) {\n const providers = this.getPluginsByType(\"provider\");\n for (const provider of providers) {\n const canPlay = provider.canPlay;\n if (typeof canPlay === \"function\" && canPlay(source)) {\n return provider;\n }\n }\n return null;\n }\n /** Resolve plugin initialization order using topological sort. */\n resolveDependencyOrder() {\n const visited = /* @__PURE__ */ new Set();\n const visiting = /* @__PURE__ */ new Set();\n const sorted = [];\n const visit = (id, path = []) => {\n if (visited.has(id)) return;\n if (visiting.has(id)) {\n const cycle = [...path, id].join(\" -> \");\n throw new Error(`Circular dependency detected: ${cycle}`);\n }\n const record = this.plugins.get(id);\n if (!record) return;\n visiting.add(id);\n for (const depId of record.plugin.dependencies || []) {\n if (this.plugins.has(depId)) {\n visit(depId, [...path, id]);\n }\n }\n visiting.delete(id);\n visited.add(id);\n sorted.push(id);\n };\n for (const id of this.plugins.keys()) {\n visit(id);\n }\n return sorted;\n }\n /** Validate plugin has required properties. */\n validatePlugin(plugin) {\n if (!plugin.id || typeof plugin.id !== \"string\") {\n throw new Error(\"Plugin must have a valid id\");\n }\n if (!plugin.name || typeof plugin.name !== \"string\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a valid name`);\n }\n if (!plugin.version || typeof plugin.version !== \"string\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a valid version`);\n }\n if (!plugin.type || typeof plugin.type !== \"string\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a valid type`);\n }\n if (typeof plugin.init !== \"function\") {\n throw new Error(`Plugin \"${plugin.id}\" must have an init() method`);\n }\n if (typeof plugin.destroy !== \"function\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a destroy() method`);\n }\n }\n}\nclass ScarlettPlayer {\n /**\n * Create a new ScarlettPlayer.\n *\n * @param options - Player configuration\n */\n constructor(options) {\n this._currentProvider = null;\n this.destroyed = false;\n this.seekingWhilePlaying = false;\n this.seekResumeTimeout = null;\n if (typeof options.container === \"string\") {\n const el = document.querySelector(options.container);\n if (!el || !(el instanceof HTMLElement)) {\n throw new Error(`ScarlettPlayer: container not found: ${options.container}`);\n }\n this.container = el;\n } else if (options.container instanceof HTMLElement) {\n this.container = options.container;\n } else {\n throw new Error(\"ScarlettPlayer requires a valid HTMLElement container or CSS selector\");\n }\n this.initialSrc = options.src;\n this.eventBus = new EventBus();\n this.stateManager = new StateManager({\n autoplay: options.autoplay ?? false,\n loop: options.loop ?? false,\n volume: options.volume ?? 1,\n muted: options.muted ?? false\n });\n this.logger = new Logger({\n level: options.logLevel ?? \"warn\",\n scope: \"ScarlettPlayer\"\n });\n this.errorHandler = new ErrorHandler(this.eventBus, this.logger);\n this.pluginManager = new PluginManager(\n this.eventBus,\n this.stateManager,\n this.logger,\n { container: this.container }\n );\n if (options.plugins) {\n for (const plugin of options.plugins) {\n this.pluginManager.register(plugin);\n }\n }\n this.logger.info(\"ScarlettPlayer initialized\", {\n autoplay: options.autoplay,\n plugins: options.plugins?.length ?? 0\n });\n this.eventBus.emit(\"player:ready\", void 0);\n }\n /**\n * Initialize the player asynchronously.\n * Initializes non-provider plugins and loads initial source if provided.\n */\n async init() {\n this.checkDestroyed();\n for (const [id, record] of this.pluginManager.plugins) {\n if (record.plugin.type !== \"provider\" && record.state === \"registered\") {\n await this.pluginManager.initPlugin(id);\n }\n }\n if (this.initialSrc) {\n await this.load(this.initialSrc);\n }\n return Promise.resolve();\n }\n /**\n * Load a media source.\n *\n * Selects appropriate provider plugin and loads the source.\n *\n * @param source - Media source URL\n * @returns Promise that resolves when source is loaded\n *\n * @example\n * ```ts\n * await player.load('video.m3u8');\n * ```\n */\n async load(source) {\n this.checkDestroyed();\n try {\n this.logger.info(\"Loading source\", { source });\n this.stateManager.update({\n playing: false,\n paused: true,\n ended: false,\n buffering: true,\n currentTime: 0,\n duration: 0,\n bufferedAmount: 0,\n playbackState: \"loading\"\n });\n if (this._currentProvider) {\n const previousProviderId = this._currentProvider.id;\n this.logger.info(\"Destroying previous provider\", { provider: previousProviderId });\n await this.pluginManager.destroyPlugin(previousProviderId);\n this._currentProvider = null;\n }\n const provider = this.pluginManager.selectProvider(source);\n if (!provider) {\n this.errorHandler.throw(\n ErrorCode.PROVIDER_NOT_FOUND,\n `No provider found for source: ${source}`,\n {\n fatal: true,\n context: { source }\n }\n );\n return;\n }\n this._currentProvider = provider;\n this.logger.info(\"Provider selected\", { provider: provider.id });\n await this.pluginManager.initPlugin(provider.id);\n this.stateManager.set(\"source\", { src: source, type: this.detectMimeType(source) });\n if (typeof provider.loadSource === \"function\") {\n await provider.loadSource(source);\n }\n if (this.stateManager.getValue(\"autoplay\")) {\n await this.play();\n }\n } catch (error) {\n this.errorHandler.handle(error, {\n operation: \"load\",\n source\n });\n }\n }\n /**\n * Start playback.\n *\n * @returns Promise that resolves when playback starts\n *\n * @example\n * ```ts\n * await player.play();\n * ```\n */\n async play() {\n this.checkDestroyed();\n try {\n this.logger.debug(\"Play requested\");\n this.stateManager.update({\n playing: true,\n paused: false,\n playbackState: \"playing\"\n });\n this.eventBus.emit(\"playback:play\", void 0);\n } catch (error) {\n this.errorHandler.handle(error, { operation: \"play\" });\n }\n }\n /**\n * Pause playback.\n *\n * @example\n * ```ts\n * player.pause();\n * ```\n */\n pause() {\n this.checkDestroyed();\n try {\n this.logger.debug(\"Pause requested\");\n this.seekingWhilePlaying = false;\n if (this.seekResumeTimeout !== null) {\n clearTimeout(this.seekResumeTimeout);\n this.seekResumeTimeout = null;\n }\n this.stateManager.update({\n playing: false,\n paused: true,\n playbackState: \"paused\"\n });\n this.eventBus.emit(\"playback:pause\", void 0);\n } catch (error) {\n this.errorHandler.handle(error, { operation: \"pause\" });\n }\n }\n /**\n * Seek to a specific time.\n *\n * @param time - Time in seconds\n *\n * @example\n * ```ts\n * player.seek(30); // Seek to 30 seconds\n * ```\n */\n seek(time) {\n this.checkDestroyed();\n try {\n this.logger.debug(\"Seek requested\", { time });\n const wasPlaying = this.stateManager.getValue(\"playing\");\n if (wasPlaying) {\n this.seekingWhilePlaying = true;\n }\n if (this.seekResumeTimeout !== null) {\n clearTimeout(this.seekResumeTimeout);\n this.seekResumeTimeout = null;\n }\n this.eventBus.emit(\"playback:seeking\", { time });\n this.stateManager.set(\"currentTime\", time);\n if (this.seekingWhilePlaying) {\n this.seekResumeTimeout = setTimeout(() => {\n if (this.seekingWhilePlaying && this.stateManager.getValue(\"playing\")) {\n this.logger.debug(\"Resuming playback after seek\");\n this.seekingWhilePlaying = false;\n this.eventBus.emit(\"playback:play\", void 0);\n }\n this.seekResumeTimeout = null;\n }, 300);\n }\n } catch (error) {\n this.errorHandler.handle(error, { operation: \"seek\", time });\n }\n }\n /**\n * Set volume.\n *\n * @param volume - Volume 0-1\n *\n * @example\n * ```ts\n * player.setVolume(0.5); // 50% volume\n * ```\n */\n setVolume(volume) {\n this.checkDestroyed();\n const clampedVolume = Math.max(0, Math.min(1, volume));\n this.stateManager.set(\"volume\", clampedVolume);\n this.eventBus.emit(\"volume:change\", {\n volume: clampedVolume,\n muted: this.stateManager.getValue(\"muted\")\n });\n }\n /**\n * Set muted state.\n *\n * @param muted - Mute flag\n *\n * @example\n * ```ts\n * player.setMuted(true);\n * ```\n */\n setMuted(muted) {\n this.checkDestroyed();\n this.stateManager.set(\"muted\", muted);\n this.eventBus.emit(\"volume:mute\", { muted });\n }\n /**\n * Set playback rate.\n *\n * @param rate - Playback rate (e.g., 1.0 = normal, 2.0 = 2x speed)\n *\n * @example\n * ```ts\n * player.setPlaybackRate(1.5); // 1.5x speed\n * ```\n */\n setPlaybackRate(rate) {\n this.checkDestroyed();\n this.stateManager.set(\"playbackRate\", rate);\n this.eventBus.emit(\"playback:ratechange\", { rate });\n }\n /**\n * Set autoplay state.\n *\n * When enabled, videos will automatically play after loading.\n *\n * @param autoplay - Autoplay flag\n *\n * @example\n * ```ts\n * player.setAutoplay(true);\n * await player.load('video.mp4'); // Will auto-play\n * ```\n */\n setAutoplay(autoplay) {\n this.checkDestroyed();\n this.stateManager.set(\"autoplay\", autoplay);\n this.logger.debug(\"Autoplay set\", { autoplay });\n }\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = player.on('playback:play', () => {\n * console.log('Playing!');\n * });\n *\n * // Later: unsubscribe\n * unsub();\n * ```\n */\n on(event, handler) {\n this.checkDestroyed();\n return this.eventBus.on(event, handler);\n }\n /**\n * Subscribe to an event once.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * player.once('player:ready', () => {\n * console.log('Player ready!');\n * });\n * ```\n */\n once(event, handler) {\n this.checkDestroyed();\n return this.eventBus.once(event, handler);\n }\n /**\n * Get a plugin by name.\n *\n * @param name - Plugin name\n * @returns Plugin instance or null\n *\n * @example\n * ```ts\n * const hls = player.getPlugin('hls-plugin');\n * ```\n */\n getPlugin(name) {\n this.checkDestroyed();\n return this.pluginManager.getPlugin(name);\n }\n /**\n * Register a plugin.\n *\n * @param plugin - Plugin to register\n *\n * @example\n * ```ts\n * player.registerPlugin(myPlugin);\n * ```\n */\n registerPlugin(plugin) {\n this.checkDestroyed();\n this.pluginManager.register(plugin);\n }\n /**\n * Get current state snapshot.\n *\n * @returns Readonly state snapshot\n *\n * @example\n * ```ts\n * const state = player.getState();\n * console.log(state.playing, state.currentTime);\n * ```\n */\n getState() {\n this.checkDestroyed();\n return this.stateManager.snapshot();\n }\n // ===== Quality Methods (proxied to provider) =====\n /**\n * Get available quality levels from the current provider.\n * @returns Array of quality levels or empty array if not available\n */\n getQualities() {\n this.checkDestroyed();\n if (!this._currentProvider) return [];\n const provider = this._currentProvider;\n if (typeof provider.getLevels === \"function\") {\n return provider.getLevels();\n }\n return [];\n }\n /**\n * Set quality level (-1 for auto).\n * @param index - Quality level index\n */\n setQuality(index) {\n this.checkDestroyed();\n if (!this._currentProvider) {\n this.logger.warn(\"No provider available for quality change\");\n return;\n }\n const provider = this._currentProvider;\n if (typeof provider.setLevel === \"function\") {\n provider.setLevel(index);\n this.eventBus.emit(\"quality:change\", {\n quality: index === -1 ? \"auto\" : `level-${index}`,\n auto: index === -1\n });\n }\n }\n /**\n * Get current quality level index (-1 = auto).\n */\n getCurrentQuality() {\n this.checkDestroyed();\n if (!this._currentProvider) return -1;\n const provider = this._currentProvider;\n if (typeof provider.getCurrentLevel === \"function\") {\n return provider.getCurrentLevel();\n }\n return -1;\n }\n // ===== Fullscreen Methods =====\n /**\n * Request fullscreen mode.\n */\n async requestFullscreen() {\n this.checkDestroyed();\n try {\n if (this.container.requestFullscreen) {\n await this.container.requestFullscreen();\n } else if (this.container.webkitRequestFullscreen) {\n await this.container.webkitRequestFullscreen();\n }\n this.stateManager.set(\"fullscreen\", true);\n this.eventBus.emit(\"fullscreen:change\", { fullscreen: true });\n } catch (error) {\n this.logger.error(\"Fullscreen request failed\", { error });\n }\n }\n /**\n * Exit fullscreen mode.\n */\n async exitFullscreen() {\n this.checkDestroyed();\n try {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n await document.webkitExitFullscreen();\n }\n this.stateManager.set(\"fullscreen\", false);\n this.eventBus.emit(\"fullscreen:change\", { fullscreen: false });\n } catch (error) {\n this.logger.error(\"Exit fullscreen failed\", { error });\n }\n }\n /**\n * Toggle fullscreen mode.\n */\n async toggleFullscreen() {\n if (this.fullscreen) {\n await this.exitFullscreen();\n } else {\n await this.requestFullscreen();\n }\n }\n // ===== Casting Methods (proxied to plugins) =====\n /**\n * Request AirPlay (proxied to airplay plugin).\n */\n requestAirPlay() {\n this.checkDestroyed();\n const airplay = this.pluginManager.getPlugin(\"airplay\");\n if (airplay && typeof airplay.showPicker === \"function\") {\n airplay.showPicker();\n } else {\n this.logger.warn(\"AirPlay plugin not available\");\n }\n }\n /**\n * Request Chromecast session (proxied to chromecast plugin).\n */\n async requestChromecast() {\n this.checkDestroyed();\n const chromecast = this.pluginManager.getPlugin(\"chromecast\");\n if (chromecast && typeof chromecast.requestSession === \"function\") {\n await chromecast.requestSession();\n } else {\n this.logger.warn(\"Chromecast plugin not available\");\n }\n }\n /**\n * Stop casting (AirPlay or Chromecast).\n */\n stopCasting() {\n this.checkDestroyed();\n const airplay = this.pluginManager.getPlugin(\"airplay\");\n if (airplay && typeof airplay.stop === \"function\") {\n airplay.stop();\n }\n const chromecast = this.pluginManager.getPlugin(\"chromecast\");\n if (chromecast && typeof chromecast.stopSession === \"function\") {\n chromecast.stopSession();\n }\n }\n // ===== Live Stream Methods =====\n /**\n * Seek to live edge (for live streams).\n */\n seekToLive() {\n this.checkDestroyed();\n const isLive = this.stateManager.getValue(\"live\");\n if (!isLive) {\n this.logger.warn(\"Not a live stream\");\n return;\n }\n if (this._currentProvider) {\n const provider = this._currentProvider;\n if (typeof provider.getLiveInfo === \"function\") {\n const liveInfo = provider.getLiveInfo();\n if (liveInfo?.liveSyncPosition !== void 0) {\n this.seek(liveInfo.liveSyncPosition);\n return;\n }\n }\n }\n const duration = this.stateManager.getValue(\"duration\");\n if (duration > 0) {\n this.seek(duration);\n }\n }\n /**\n * Destroy the player and cleanup all resources.\n *\n * @example\n * ```ts\n * player.destroy();\n * ```\n */\n destroy() {\n if (this.destroyed) {\n return;\n }\n this.logger.info(\"Destroying player\");\n if (this.seekResumeTimeout !== null) {\n clearTimeout(this.seekResumeTimeout);\n this.seekResumeTimeout = null;\n }\n this.eventBus.emit(\"player:destroy\", void 0);\n this.pluginManager.destroyAll();\n this.eventBus.destroy();\n this.stateManager.destroy();\n this.destroyed = true;\n this.logger.info(\"Player destroyed\");\n }\n // ===== State Getters =====\n /**\n * Get playing state.\n */\n get playing() {\n return this.stateManager.getValue(\"playing\");\n }\n /**\n * Get paused state.\n */\n get paused() {\n return this.stateManager.getValue(\"paused\");\n }\n /**\n * Get current time in seconds.\n */\n get currentTime() {\n return this.stateManager.getValue(\"currentTime\");\n }\n /**\n * Get duration in seconds.\n */\n get duration() {\n return this.stateManager.getValue(\"duration\");\n }\n /**\n * Get volume (0-1).\n */\n get volume() {\n return this.stateManager.getValue(\"volume\");\n }\n /**\n * Get muted state.\n */\n get muted() {\n return this.stateManager.getValue(\"muted\");\n }\n /**\n * Get playback rate.\n */\n get playbackRate() {\n return this.stateManager.getValue(\"playbackRate\");\n }\n /**\n * Get buffered amount (0-1).\n */\n get bufferedAmount() {\n return this.stateManager.getValue(\"bufferedAmount\");\n }\n /**\n * Get current provider plugin.\n */\n get currentProvider() {\n return this._currentProvider;\n }\n /**\n * Get fullscreen state.\n */\n get fullscreen() {\n return this.stateManager.getValue(\"fullscreen\");\n }\n /**\n * Get live stream state.\n */\n get live() {\n return this.stateManager.getValue(\"live\");\n }\n /**\n * Get autoplay state.\n */\n get autoplay() {\n return this.stateManager.getValue(\"autoplay\");\n }\n /**\n * Check if player is destroyed.\n * @private\n */\n checkDestroyed() {\n if (this.destroyed) {\n throw new Error(\"Cannot call methods on destroyed player\");\n }\n }\n /**\n * Detect MIME type from source URL.\n * @private\n */\n detectMimeType(source) {\n const ext = source.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"m3u8\":\n return \"application/x-mpegURL\";\n case \"mpd\":\n return \"application/dash+xml\";\n case \"mp4\":\n return \"video/mp4\";\n case \"webm\":\n return \"video/webm\";\n case \"ogg\":\n return \"video/ogg\";\n default:\n return \"video/mp4\";\n }\n }\n}\nasync function createPlayer(options) {\n const player = new ScarlettPlayer(options);\n await player.init();\n return player;\n}\nexport {\n Computed,\n ErrorCode,\n ErrorHandler,\n EventBus,\n Logger,\n PluginAPI,\n PluginManager,\n ScarlettPlayer,\n Signal,\n StateManager,\n computed,\n createLogger,\n createPlayer,\n currentEffect,\n effect,\n getCurrentEffect,\n setCurrentEffect,\n signal\n};\n//# sourceMappingURL=index.js.map\n","// src/hls-loader.ts\nvar hlsConstructor = null;\nvar loadingPromise = null;\nfunction supportsNativeHLS() {\n if (typeof document === \"undefined\") return false;\n const video = document.createElement(\"video\");\n return video.canPlayType(\"application/vnd.apple.mpegurl\") !== \"\";\n}\nfunction isHlsJsSupported() {\n if (hlsConstructor) {\n return hlsConstructor.isSupported();\n }\n if (typeof window === \"undefined\") return false;\n return !!(window.MediaSource || window.WebKitMediaSource);\n}\nfunction isHLSSupported() {\n return supportsNativeHLS() || isHlsJsSupported();\n}\nasync function loadHlsJs() {\n if (hlsConstructor) {\n return hlsConstructor;\n }\n if (loadingPromise) {\n return loadingPromise;\n }\n loadingPromise = (async () => {\n try {\n const hlsModule = await import(\"hls.js\");\n hlsConstructor = hlsModule.default;\n if (!hlsConstructor.isSupported()) {\n throw new Error(\"hls.js is not supported in this browser\");\n }\n return hlsConstructor;\n } catch (error) {\n loadingPromise = null;\n throw new Error(\n `Failed to load hls.js: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n })();\n return loadingPromise;\n}\nfunction createHlsInstance(config) {\n if (!hlsConstructor) {\n throw new Error(\"hls.js is not loaded. Call loadHlsJs() first.\");\n }\n return new hlsConstructor(config);\n}\nfunction getHlsConstructor() {\n return hlsConstructor;\n}\n\n// src/quality.ts\nfunction formatLevel(level) {\n if (level.name) {\n return level.name;\n }\n if (level.height) {\n const standardLabels = {\n 2160: \"4K\",\n 1440: \"1440p\",\n 1080: \"1080p\",\n 720: \"720p\",\n 480: \"480p\",\n 360: \"360p\",\n 240: \"240p\",\n 144: \"144p\"\n };\n const closest = Object.keys(standardLabels).map(Number).sort((a, b) => Math.abs(a - level.height) - Math.abs(b - level.height))[0];\n if (Math.abs(closest - level.height) <= 20) {\n return standardLabels[closest];\n }\n return `${level.height}p`;\n }\n if (level.bitrate) {\n return formatBitrate(level.bitrate);\n }\n return \"Unknown\";\n}\nfunction formatBitrate(bitrate) {\n if (bitrate >= 1e6) {\n return `${(bitrate / 1e6).toFixed(1)} Mbps`;\n }\n if (bitrate >= 1e3) {\n return `${Math.round(bitrate / 1e3)} Kbps`;\n }\n return `${bitrate} bps`;\n}\nfunction mapLevels(levels, currentLevel) {\n return levels.map((level, index) => ({\n index,\n width: level.width || 0,\n height: level.height || 0,\n bitrate: level.bitrate || 0,\n label: formatLevel(level),\n codec: level.codecSet\n }));\n}\n\n// src/event-map.ts\nvar HLS_ERROR_TYPES = {\n NETWORK_ERROR: \"networkError\",\n MEDIA_ERROR: \"mediaError\",\n KEY_SYSTEM_ERROR: \"keySystemError\",\n MUX_ERROR: \"muxError\",\n OTHER_ERROR: \"otherError\"\n};\nfunction mapErrorType(hlsType) {\n switch (hlsType) {\n case HLS_ERROR_TYPES.NETWORK_ERROR:\n return \"network\";\n case HLS_ERROR_TYPES.MEDIA_ERROR:\n return \"media\";\n case HLS_ERROR_TYPES.MUX_ERROR:\n return \"mux\";\n default:\n return \"other\";\n }\n}\nfunction parseHlsError(data) {\n return {\n type: mapErrorType(data.type),\n details: data.details || \"Unknown error\",\n fatal: data.fatal || false,\n url: data.url,\n reason: data.reason,\n response: data.response\n };\n}\nfunction setupHlsEventHandlers(hls, api, callbacks) {\n const handlers = [];\n const addHandler = (event, handler) => {\n hls.on(event, handler);\n handlers.push({ event, handler });\n };\n addHandler(\"hlsManifestParsed\", (_event, data) => {\n api.logger.debug(\"HLS manifest parsed\", { levels: data.levels.length });\n const levels = data.levels.map((level, index) => ({\n id: `level-${index}`,\n label: formatLevel(level),\n width: level.width,\n height: level.height,\n bitrate: level.bitrate,\n active: index === hls.currentLevel\n }));\n api.setState(\"qualities\", levels);\n api.emit(\"quality:levels\", {\n levels: levels.map((l) => ({ id: l.id, label: l.label }))\n });\n callbacks.onManifestParsed?.(data.levels);\n });\n addHandler(\"hlsLevelSwitched\", (_event, data) => {\n const level = hls.levels[data.level];\n const isAuto = callbacks.getIsAutoQuality?.() ?? hls.autoLevelEnabled;\n api.logger.debug(\"HLS level switched\", { level: data.level, height: level?.height, auto: isAuto });\n if (level) {\n const label = isAuto ? `Auto (${formatLevel(level)})` : formatLevel(level);\n api.setState(\"currentQuality\", {\n id: isAuto ? \"auto\" : `level-${data.level}`,\n label,\n width: level.width,\n height: level.height,\n bitrate: level.bitrate,\n active: true\n });\n }\n api.emit(\"quality:change\", {\n quality: level ? formatLevel(level) : \"auto\",\n auto: isAuto\n });\n callbacks.onLevelSwitched?.(data.level);\n });\n addHandler(\"hlsFragBuffered\", () => {\n api.setState(\"buffering\", false);\n callbacks.onBufferUpdate?.();\n });\n addHandler(\"hlsFragLoading\", () => {\n api.setState(\"buffering\", true);\n });\n addHandler(\"hlsLevelLoaded\", (_event, data) => {\n if (data.details?.live !== void 0) {\n api.setState(\"live\", data.details.live);\n callbacks.onLiveUpdate?.();\n }\n });\n addHandler(\"hlsError\", (_event, data) => {\n const error = parseHlsError(data);\n api.logger.warn(\"HLS error\", { error });\n callbacks.onError?.(error);\n });\n return () => {\n for (const { event, handler } of handlers) {\n hls.off(event, handler);\n }\n handlers.length = 0;\n };\n}\nfunction setupVideoEventHandlers(video, api) {\n const handlers = [];\n const addHandler = (event, handler) => {\n video.addEventListener(event, handler);\n handlers.push({ event, handler });\n };\n addHandler(\"playing\", () => {\n api.setState(\"playing\", true);\n api.setState(\"paused\", false);\n api.setState(\"playbackState\", \"playing\");\n });\n addHandler(\"pause\", () => {\n api.setState(\"playing\", false);\n api.setState(\"paused\", true);\n api.setState(\"playbackState\", \"paused\");\n });\n addHandler(\"ended\", () => {\n api.setState(\"playing\", false);\n api.setState(\"ended\", true);\n api.setState(\"playbackState\", \"ended\");\n api.emit(\"playback:ended\", void 0);\n });\n addHandler(\"timeupdate\", () => {\n api.setState(\"currentTime\", video.currentTime);\n api.emit(\"playback:timeupdate\", { currentTime: video.currentTime });\n });\n addHandler(\"durationchange\", () => {\n api.setState(\"duration\", video.duration || 0);\n api.emit(\"media:loadedmetadata\", { duration: video.duration || 0 });\n });\n addHandler(\"waiting\", () => {\n api.setState(\"waiting\", true);\n api.setState(\"buffering\", true);\n api.emit(\"media:waiting\", void 0);\n });\n addHandler(\"canplay\", () => {\n api.setState(\"waiting\", false);\n api.setState(\"playbackState\", \"ready\");\n api.emit(\"media:canplay\", void 0);\n });\n addHandler(\"canplaythrough\", () => {\n api.setState(\"buffering\", false);\n api.emit(\"media:canplaythrough\", void 0);\n });\n addHandler(\"progress\", () => {\n if (video.buffered.length > 0) {\n const bufferedEnd = video.buffered.end(video.buffered.length - 1);\n const bufferedAmount = video.duration > 0 ? bufferedEnd / video.duration : 0;\n api.setState(\"bufferedAmount\", bufferedAmount);\n api.setState(\"buffered\", video.buffered);\n api.emit(\"media:progress\", { buffered: bufferedAmount });\n }\n });\n addHandler(\"seeking\", () => {\n api.setState(\"seeking\", true);\n });\n addHandler(\"seeked\", () => {\n api.setState(\"seeking\", false);\n api.emit(\"playback:seeked\", { time: video.currentTime });\n });\n addHandler(\"volumechange\", () => {\n api.setState(\"volume\", video.volume);\n api.setState(\"muted\", video.muted);\n api.emit(\"volume:change\", { volume: video.volume, muted: video.muted });\n });\n addHandler(\"ratechange\", () => {\n api.setState(\"playbackRate\", video.playbackRate);\n api.emit(\"playback:ratechange\", { rate: video.playbackRate });\n });\n addHandler(\"loadedmetadata\", () => {\n api.setState(\"duration\", video.duration);\n api.setState(\"mediaType\", video.videoWidth > 0 ? \"video\" : \"audio\");\n });\n addHandler(\"error\", () => {\n const error = video.error;\n if (error) {\n api.logger.error(\"Video element error\", { code: error.code, message: error.message });\n api.emit(\"media:error\", { error: new Error(error.message || \"Video playback error\") });\n }\n });\n addHandler(\"enterpictureinpicture\", () => {\n api.setState(\"pip\", true);\n api.logger.debug(\"PiP: entered (standard)\");\n });\n addHandler(\"leavepictureinpicture\", () => {\n api.setState(\"pip\", false);\n api.logger.debug(\"PiP: exited (standard)\");\n if (!video.paused || api.getState(\"playing\")) {\n video.play().catch(() => {\n });\n }\n });\n const webkitVideo = video;\n if (\"webkitPresentationMode\" in video) {\n addHandler(\"webkitpresentationmodechanged\", () => {\n const mode = webkitVideo.webkitPresentationMode;\n const isInPip = mode === \"picture-in-picture\";\n api.setState(\"pip\", isInPip);\n api.logger.debug(`PiP: mode changed to ${mode} (webkit)`);\n if (mode === \"inline\" && video.paused) {\n video.play().catch(() => {\n });\n }\n });\n }\n return () => {\n for (const { event, handler } of handlers) {\n video.removeEventListener(event, handler);\n }\n handlers.length = 0;\n };\n}\n\n// src/index.ts\nvar DEFAULT_CONFIG = {\n debug: false,\n autoStartLoad: true,\n startPosition: -1,\n lowLatencyMode: false,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n backBufferLength: 30,\n enableWorker: true,\n // Error recovery settings\n maxNetworkRetries: 3,\n maxMediaRetries: 2,\n retryDelayMs: 1e3,\n retryBackoffFactor: 2\n};\nfunction createHLSPlugin(config) {\n const mergedConfig = { ...DEFAULT_CONFIG, ...config };\n let api = null;\n let hls = null;\n let video = null;\n let isNative = false;\n let currentSrc = null;\n let cleanupHlsEvents = null;\n let cleanupVideoEvents = null;\n let isAutoQuality = true;\n let networkRetryCount = 0;\n let mediaRetryCount = 0;\n let retryTimeout = null;\n let errorCount = 0;\n let errorWindowStart = 0;\n const MAX_ERRORS_IN_WINDOW = 10;\n const ERROR_WINDOW_MS = 5e3;\n const getOrCreateVideo = () => {\n if (video) return video;\n const existing = api?.container.querySelector(\"video\");\n if (existing) {\n video = existing;\n return video;\n }\n video = document.createElement(\"video\");\n video.style.cssText = \"width:100%;height:100%;display:block;object-fit:contain;background:#000\";\n video.preload = \"metadata\";\n video.controls = false;\n video.playsInline = true;\n api?.container.appendChild(video);\n return video;\n };\n const cleanup = () => {\n cleanupHlsEvents?.();\n cleanupHlsEvents = null;\n cleanupVideoEvents?.();\n cleanupVideoEvents = null;\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n retryTimeout = null;\n }\n if (hls) {\n hls.destroy();\n hls = null;\n }\n currentSrc = null;\n isNative = false;\n isAutoQuality = true;\n networkRetryCount = 0;\n mediaRetryCount = 0;\n errorCount = 0;\n errorWindowStart = 0;\n };\n const buildHlsConfig = () => ({\n debug: mergedConfig.debug,\n autoStartLoad: mergedConfig.autoStartLoad,\n startPosition: mergedConfig.startPosition,\n startLevel: -1,\n // Auto quality selection (ABR)\n lowLatencyMode: mergedConfig.lowLatencyMode,\n maxBufferLength: mergedConfig.maxBufferLength,\n maxMaxBufferLength: mergedConfig.maxMaxBufferLength,\n backBufferLength: mergedConfig.backBufferLength,\n enableWorker: mergedConfig.enableWorker,\n // Minimize hls.js internal retries - we handle retries ourselves\n fragLoadingMaxRetry: 1,\n manifestLoadingMaxRetry: 1,\n levelLoadingMaxRetry: 1,\n fragLoadingRetryDelay: 500,\n manifestLoadingRetryDelay: 500,\n levelLoadingRetryDelay: 500\n });\n const getRetryDelay = (retryCount) => {\n const baseDelay = mergedConfig.retryDelayMs ?? 1e3;\n const backoffFactor = mergedConfig.retryBackoffFactor ?? 2;\n return baseDelay * Math.pow(backoffFactor, retryCount);\n };\n const emitFatalError = (error, retriesExhausted) => {\n const message = retriesExhausted ? `HLS error: ${error.details} (max retries exceeded)` : `HLS error: ${error.details}`;\n api?.logger.error(message, { type: error.type, details: error.details });\n api?.setState(\"playbackState\", \"error\");\n api?.setState(\"buffering\", false);\n api?.emit(\"error\", {\n code: \"MEDIA_ERROR\",\n message,\n fatal: true,\n timestamp: Date.now()\n });\n };\n const handleHlsError = (error) => {\n const Hls = getHlsConstructor();\n if (!Hls || !hls) return;\n const now = Date.now();\n if (now - errorWindowStart > ERROR_WINDOW_MS) {\n errorCount = 1;\n errorWindowStart = now;\n } else {\n errorCount++;\n }\n if (errorCount >= MAX_ERRORS_IN_WINDOW) {\n api?.logger.error(`Too many errors (${errorCount} in ${ERROR_WINDOW_MS}ms), giving up`);\n emitFatalError(error, true);\n cleanupHlsEvents?.();\n cleanupHlsEvents = null;\n hls.destroy();\n hls = null;\n return;\n }\n if (error.fatal) {\n api?.logger.error(\"Fatal HLS error\", { type: error.type, details: error.details });\n switch (error.type) {\n case \"network\": {\n const maxRetries = mergedConfig.maxNetworkRetries ?? 3;\n if (networkRetryCount >= maxRetries) {\n api?.logger.error(`Network error recovery failed after ${networkRetryCount} attempts`);\n emitFatalError(error, true);\n return;\n }\n networkRetryCount++;\n const delay = getRetryDelay(networkRetryCount - 1);\n api?.logger.info(`Attempting network error recovery (attempt ${networkRetryCount}/${maxRetries}) in ${delay}ms`);\n api?.emit(\"error:network\", { error: new Error(error.details) });\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n }\n retryTimeout = setTimeout(() => {\n if (hls) {\n hls.startLoad();\n }\n }, delay);\n break;\n }\n case \"media\": {\n const maxRetries = mergedConfig.maxMediaRetries ?? 2;\n if (mediaRetryCount >= maxRetries) {\n api?.logger.error(`Media error recovery failed after ${mediaRetryCount} attempts`);\n emitFatalError(error, true);\n return;\n }\n mediaRetryCount++;\n const delay = getRetryDelay(mediaRetryCount - 1);\n api?.logger.info(`Attempting media error recovery (attempt ${mediaRetryCount}/${maxRetries}) in ${delay}ms`);\n api?.emit(\"error:media\", { error: new Error(error.details) });\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n }\n retryTimeout = setTimeout(() => {\n if (hls) {\n hls.recoverMediaError();\n }\n }, delay);\n break;\n }\n default:\n emitFatalError(error, false);\n break;\n }\n }\n };\n const loadNative = async (src) => {\n const videoEl = getOrCreateVideo();\n isNative = true;\n if (api) {\n cleanupVideoEvents = setupVideoEventHandlers(videoEl, api);\n }\n return new Promise((resolve, reject) => {\n const onLoaded = () => {\n videoEl.removeEventListener(\"loadedmetadata\", onLoaded);\n videoEl.removeEventListener(\"error\", onError);\n api?.setState(\"source\", { src, type: \"application/x-mpegURL\" });\n api?.emit(\"media:loaded\", { src, type: \"application/x-mpegURL\" });\n resolve();\n };\n const onError = () => {\n videoEl.removeEventListener(\"loadedmetadata\", onLoaded);\n videoEl.removeEventListener(\"error\", onError);\n const error = videoEl.error;\n reject(new Error(error?.message || \"Failed to load HLS source\"));\n };\n videoEl.addEventListener(\"loadedmetadata\", onLoaded);\n videoEl.addEventListener(\"error\", onError);\n videoEl.src = src;\n videoEl.load();\n });\n };\n const loadWithHlsJs = async (src) => {\n await loadHlsJs();\n const videoEl = getOrCreateVideo();\n isNative = false;\n hls = createHlsInstance(buildHlsConfig());\n if (api) {\n cleanupVideoEvents = setupVideoEventHandlers(videoEl, api);\n }\n return new Promise((resolve, reject) => {\n if (!hls || !api) {\n reject(new Error(\"HLS not initialized\"));\n return;\n }\n let resolved = false;\n cleanupHlsEvents = setupHlsEventHandlers(hls, api, {\n onManifestParsed: () => {\n if (!resolved) {\n resolved = true;\n api?.setState(\"source\", { src, type: \"application/x-mpegURL\" });\n api?.emit(\"media:loaded\", { src, type: \"application/x-mpegURL\" });\n resolve();\n }\n },\n onLevelSwitched: () => {\n },\n onError: (error) => {\n handleHlsError(error);\n if (error.fatal && !resolved && error.type !== \"network\" && error.type !== \"media\") {\n resolved = true;\n reject(new Error(error.details));\n }\n },\n getIsAutoQuality: () => isAutoQuality\n });\n hls.attachMedia(videoEl);\n hls.loadSource(src);\n });\n };\n const plugin = {\n id: \"hls-provider\",\n name: \"HLS Provider\",\n version: \"1.0.0\",\n type: \"provider\",\n description: \"HLS playback provider using hls.js\",\n canPlay(src) {\n if (!isHLSSupported()) return false;\n const url = src.toLowerCase();\n const urlWithoutQuery = url.split(\"?\")[0].split(\"#\")[0];\n if (urlWithoutQuery.endsWith(\".m3u8\")) return true;\n if (url.includes(\"application/x-mpegurl\")) return true;\n if (url.includes(\"application/vnd.apple.mpegurl\")) return true;\n return false;\n },\n async init(pluginApi) {\n api = pluginApi;\n api.logger.info(\"HLS plugin initialized\");\n const unsubPlay = api.on(\"playback:play\", async () => {\n if (!video) return;\n try {\n await video.play();\n } catch (e) {\n api?.logger.error(\"Play failed\", e);\n }\n });\n const unsubPause = api.on(\"playback:pause\", () => {\n video?.pause();\n });\n const unsubSeek = api.on(\"playback:seeking\", ({ time }) => {\n if (!video) return;\n const clampedTime = Math.max(0, Math.min(time, video.duration || 0));\n video.currentTime = clampedTime;\n });\n const unsubVolume = api.on(\"volume:change\", ({ volume }) => {\n if (video) video.volume = volume;\n });\n const unsubMute = api.on(\"volume:mute\", ({ muted }) => {\n if (video) video.muted = muted;\n });\n const unsubRate = api.on(\"playback:ratechange\", ({ rate }) => {\n if (video) video.playbackRate = rate;\n });\n const unsubQuality = api.on(\"quality:select\", ({ quality, auto }) => {\n if (!hls || isNative) {\n api?.logger.warn(\"Quality selection not available\");\n return;\n }\n if (auto || quality === \"auto\") {\n isAutoQuality = true;\n hls.currentLevel = -1;\n api?.logger.debug(\"Quality: auto selection enabled\");\n api?.setState(\"currentQuality\", {\n id: \"auto\",\n label: \"Auto\",\n width: 0,\n height: 0,\n bitrate: 0,\n active: true\n });\n } else {\n isAutoQuality = false;\n const levelIndex = parseInt(quality.replace(\"level-\", \"\"), 10);\n if (!isNaN(levelIndex) && levelIndex >= 0 && levelIndex < hls.levels.length) {\n hls.currentLevel = levelIndex;\n api?.logger.debug(`Quality: set to level ${levelIndex}`);\n }\n }\n });\n api.onDestroy(() => {\n unsubPlay();\n unsubPause();\n unsubSeek();\n unsubVolume();\n unsubMute();\n unsubRate();\n unsubQuality();\n });\n },\n async destroy() {\n api?.logger.info(\"HLS plugin destroying\");\n cleanup();\n if (video?.parentNode) {\n video.parentNode.removeChild(video);\n }\n video = null;\n api = null;\n },\n async loadSource(src) {\n if (!api) throw new Error(\"Plugin not initialized\");\n api.logger.info(\"Loading HLS source\", { src });\n cleanup();\n currentSrc = src;\n api.setState(\"playbackState\", \"loading\");\n api.setState(\"buffering\", true);\n if (isHlsJsSupported()) {\n api.logger.info(\"Using hls.js for HLS playback\");\n await loadWithHlsJs(src);\n } else if (supportsNativeHLS()) {\n api.logger.info(\"Using native HLS playback (hls.js not supported)\");\n await loadNative(src);\n } else {\n throw new Error(\"HLS playback not supported in this browser\");\n }\n api.setState(\"playbackState\", \"ready\");\n api.setState(\"buffering\", false);\n },\n getCurrentLevel() {\n if (isNative || !hls) return -1;\n return hls.currentLevel;\n },\n setLevel(index) {\n if (isNative || !hls) {\n api?.logger.warn(\"Quality selection not available in native HLS mode\");\n return;\n }\n hls.currentLevel = index;\n },\n getLevels() {\n if (isNative || !hls) return [];\n return mapLevels(hls.levels, hls.currentLevel);\n },\n getHlsInstance() {\n return hls;\n },\n isNativeHLS() {\n return isNative;\n },\n getLiveInfo() {\n if (isNative || !hls) return null;\n const live = api?.getState(\"live\") || false;\n if (!live) return null;\n return {\n isLive: true,\n latency: hls.latency || 0,\n targetLatency: hls.targetLatency || 3,\n drift: hls.drift || 0\n };\n },\n /**\n * Switch from hls.js to native HLS playback.\n * Used for AirPlay compatibility in Safari.\n * Preserves current playback position.\n */\n async switchToNative() {\n if (isNative) {\n api?.logger.debug(\"Already using native HLS\");\n return;\n }\n if (!supportsNativeHLS()) {\n api?.logger.warn(\"Native HLS not supported in this browser\");\n return;\n }\n if (!currentSrc) {\n api?.logger.warn(\"No source loaded\");\n return;\n }\n api?.logger.info(\"Switching to native HLS for AirPlay\");\n const wasPlaying = api?.getState(\"playing\") || false;\n const currentTime = video?.currentTime || 0;\n const savedSrc = currentSrc;\n cleanup();\n await loadNative(savedSrc);\n if (video && currentTime > 0) {\n video.currentTime = currentTime;\n }\n if (wasPlaying && video) {\n try {\n await video.play();\n } catch (e) {\n api?.logger.debug(\"Could not auto-resume after switch\");\n }\n }\n api?.logger.info(\"Switched to native HLS\");\n },\n /**\n * Switch from native HLS back to hls.js.\n * Restores quality control after AirPlay session ends.\n */\n async switchToHlsJs() {\n if (!isNative) {\n api?.logger.debug(\"Already using hls.js\");\n return;\n }\n if (!isHlsJsSupported()) {\n api?.logger.warn(\"hls.js not supported in this browser\");\n return;\n }\n if (!currentSrc) {\n api?.logger.warn(\"No source loaded\");\n return;\n }\n api?.logger.info(\"Switching back to hls.js\");\n const wasPlaying = api?.getState(\"playing\") || false;\n const currentTime = video?.currentTime || 0;\n const savedSrc = currentSrc;\n cleanup();\n await loadWithHlsJs(savedSrc);\n if (video && currentTime > 0) {\n video.currentTime = currentTime;\n }\n if (wasPlaying && video) {\n try {\n await video.play();\n } catch (e) {\n api?.logger.debug(\"Could not auto-resume after switch\");\n }\n }\n api?.logger.info(\"Switched to hls.js\");\n }\n };\n return plugin;\n}\nvar index_default = createHLSPlugin;\nexport {\n createHLSPlugin,\n index_default as default\n};\n","// src/styles.ts\nvar styles = `\n/* ============================================\n Container & Base\n ============================================ */\n.sp-container {\n position: relative;\n width: 100%;\n height: 100%;\n background: #000;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.sp-container video {\n width: 100%;\n height: 100%;\n display: block;\n object-fit: contain;\n}\n\n.sp-container:focus {\n outline: none;\n}\n\n/* ============================================\n Gradient Overlay\n ============================================ */\n.sp-gradient {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 160px;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.8) 0%,\n rgba(0, 0, 0, 0.4) 50%,\n transparent 100%\n );\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.25s ease;\n z-index: 5;\n}\n\n.sp-gradient--visible {\n opacity: 1;\n}\n\n/* ============================================\n Controls Container\n ============================================ */\n.sp-controls {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n align-items: center;\n padding: 0 12px 12px;\n gap: 4px;\n opacity: 0;\n transform: translateY(4px);\n transition: opacity 0.25s ease, transform 0.25s ease;\n z-index: 10;\n}\n\n.sp-controls--visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.sp-controls--hidden {\n opacity: 0;\n transform: translateY(4px);\n pointer-events: none;\n}\n\n/* ============================================\n Progress Bar (Above Controls)\n ============================================ */\n.sp-progress-wrapper {\n position: absolute;\n bottom: 48px;\n left: 12px;\n right: 12px;\n height: 20px;\n display: flex;\n align-items: center;\n cursor: pointer;\n z-index: 10;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.sp-progress-wrapper--visible {\n opacity: 1;\n}\n\n.sp-progress {\n position: relative;\n width: 100%;\n height: 3px;\n background: rgba(255, 255, 255, 0.3);\n border-radius: 1.5px;\n transition: height 0.15s ease;\n}\n\n.sp-progress-wrapper:hover .sp-progress,\n.sp-progress--dragging {\n height: 5px;\n}\n\n.sp-progress__track {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border-radius: inherit;\n overflow: hidden;\n}\n\n.sp-progress__buffered {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: rgba(255, 255, 255, 0.4);\n border-radius: inherit;\n transition: width 0.1s linear;\n}\n\n.sp-progress__filled {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: var(--sp-accent, #e50914);\n border-radius: inherit;\n}\n\n.sp-progress__handle {\n position: absolute;\n top: 50%;\n width: 14px;\n height: 14px;\n background: var(--sp-accent, #e50914);\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n transition: transform 0.15s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n}\n\n.sp-progress-wrapper:hover .sp-progress__handle,\n.sp-progress--dragging .sp-progress__handle {\n transform: translate(-50%, -50%) scale(1);\n}\n\n/* Progress Tooltip */\n.sp-progress__tooltip {\n position: absolute;\n bottom: calc(100% + 8px);\n padding: 6px 10px;\n background: rgba(20, 20, 20, 0.95);\n color: #fff;\n font-size: 12px;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n border-radius: 4px;\n white-space: nowrap;\n transform: translateX(-50%);\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s ease;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n.sp-progress-wrapper:hover .sp-progress__tooltip {\n opacity: 1;\n}\n\n/* ============================================\n Control Buttons\n ============================================ */\n.sp-control {\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: color 0.15s ease, transform 0.15s ease, background 0.15s ease;\n flex-shrink: 0;\n}\n\n.sp-control:hover {\n color: #fff;\n background: rgba(255, 255, 255, 0.1);\n}\n\n.sp-control:active {\n transform: scale(0.92);\n}\n\n.sp-control:focus-visible {\n outline: 2px solid var(--sp-accent, #e50914);\n outline-offset: 2px;\n}\n\n.sp-control:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n transform: none;\n}\n\n.sp-control:disabled:hover {\n background: none;\n}\n\n.sp-control svg {\n width: 24px;\n height: 24px;\n fill: currentColor;\n display: block;\n}\n\n.sp-control--small svg {\n width: 20px;\n height: 20px;\n}\n\n/* ============================================\n Spacer\n ============================================ */\n.sp-spacer {\n flex: 1;\n min-width: 0;\n}\n\n/* ============================================\n Time Display\n ============================================ */\n.sp-time {\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n color: rgba(255, 255, 255, 0.9);\n white-space: nowrap;\n padding: 0 4px;\n letter-spacing: 0.02em;\n}\n\n/* ============================================\n Volume Control\n ============================================ */\n.sp-volume {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.sp-volume__slider-wrap {\n width: 0;\n overflow: hidden;\n transition: width 0.2s ease;\n}\n\n.sp-volume:hover .sp-volume__slider-wrap,\n.sp-volume:focus-within .sp-volume__slider-wrap {\n width: 64px;\n}\n\n.sp-volume__slider {\n width: 64px;\n height: 3px;\n background: rgba(255, 255, 255, 0.3);\n border-radius: 1.5px;\n cursor: pointer;\n position: relative;\n margin: 0 8px 0 4px;\n}\n\n.sp-volume__level {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: #fff;\n border-radius: inherit;\n transition: width 0.1s ease;\n}\n\n/* ============================================\n Live Indicator\n ============================================ */\n.sp-live {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sp-accent, #e50914);\n cursor: pointer;\n padding: 6px 10px;\n border-radius: 4px;\n transition: background 0.15s ease, opacity 0.15s ease;\n}\n\n.sp-live:hover {\n background: rgba(255, 255, 255, 0.1);\n}\n\n.sp-live__dot {\n width: 8px;\n height: 8px;\n background: currentColor;\n border-radius: 50%;\n animation: sp-pulse 2s ease-in-out infinite;\n}\n\n.sp-live--behind {\n opacity: 0.6;\n}\n\n.sp-live--behind .sp-live__dot {\n animation: none;\n}\n\n@keyframes sp-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n\n/* ============================================\n Quality / Settings Menu\n ============================================ */\n.sp-quality {\n position: relative;\n}\n\n.sp-quality__btn {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.sp-quality__label {\n font-size: 12px;\n font-weight: 500;\n opacity: 0.9;\n}\n\n.sp-quality-menu {\n position: absolute;\n bottom: calc(100% + 8px);\n right: 0;\n background: rgba(20, 20, 20, 0.95);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border-radius: 8px;\n padding: 8px 0;\n min-width: 150px;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);\n opacity: 0;\n visibility: hidden;\n transform: translateY(8px);\n transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;\n z-index: 20;\n}\n\n.sp-quality-menu--open {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n}\n\n.sp-quality-menu__item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.8);\n cursor: pointer;\n transition: background 0.1s ease, color 0.1s ease;\n}\n\n.sp-quality-menu__item:hover {\n background: rgba(255, 255, 255, 0.1);\n color: #fff;\n}\n\n.sp-quality-menu__item--active {\n color: var(--sp-accent, #e50914);\n}\n\n.sp-quality-menu__check {\n width: 16px;\n height: 16px;\n fill: currentColor;\n margin-left: 8px;\n opacity: 0;\n}\n\n.sp-quality-menu__item--active .sp-quality-menu__check {\n opacity: 1;\n}\n\n/* ============================================\n Cast Button States\n ============================================ */\n.sp-cast--active {\n color: var(--sp-accent, #e50914);\n}\n\n.sp-cast--unavailable {\n opacity: 0.4;\n}\n\n/* ============================================\n Buffering Indicator\n ============================================ */\n.sp-buffering {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 15;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.sp-buffering--visible {\n opacity: 1;\n}\n\n.sp-buffering svg {\n width: 48px;\n height: 48px;\n fill: rgba(255, 255, 255, 0.9);\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));\n}\n\n@keyframes sp-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.sp-spin {\n animation: sp-spin 0.8s linear infinite;\n}\n\n/* ============================================\n Reduced Motion\n ============================================ */\n@media (prefers-reduced-motion: reduce) {\n .sp-gradient,\n .sp-controls,\n .sp-progress-wrapper,\n .sp-progress,\n .sp-progress__handle,\n .sp-progress__tooltip,\n .sp-control,\n .sp-volume__slider-wrap,\n .sp-quality-menu,\n .sp-buffering {\n transition: none;\n }\n\n .sp-live__dot,\n .sp-spin {\n animation: none;\n }\n}\n\n/* ============================================\n CSS Custom Properties (Theming)\n ============================================ */\n:root {\n --sp-accent: #e50914;\n --sp-color: #fff;\n --sp-bg: rgba(0, 0, 0, 0.8);\n --sp-control-height: 48px;\n --sp-icon-size: 24px;\n}\n`;\n\n// src/icons.ts\nvar icons = {\n play: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5v14l11-7z\"/></svg>`,\n pause: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\"/></svg>`,\n replay: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/></svg>`,\n volumeHigh: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/></svg>`,\n volumeLow: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z\"/></svg>`,\n volumeMute: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"/></svg>`,\n fullscreen: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/></svg>`,\n exitFullscreen: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"/></svg>`,\n pip: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z\"/></svg>`,\n exitPip: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14zM9 9h6v2H9z\"/></svg>`,\n settings: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z\"/></svg>`,\n chromecast: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></svg>`,\n chromecastConnected: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm18-7H5v1.63c3.96 1.28 7.09 4.41 8.37 8.37H19V7zM1 10v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></svg>`,\n airplay: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 22h12l-6-6-6 6zM21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V5h18v12h-4v2h4c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></svg>`,\n captions: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\"/></svg>`,\n captionsOff: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19.5 5.5v13h-15v-13h15zM19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2z\"/></svg>`,\n checkmark: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>`,\n chevronUp: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"/></svg>`,\n chevronDown: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\"/></svg>`,\n spinner: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"sp-spin\"><path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\"/></svg>`,\n skipForward: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\"/></svg>`,\n skipBack: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z\"/></svg>`,\n forward10: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M18 13c0 3.31-2.69 6-6 6s-6-2.69-6-6 2.69-6 6-6v4l5-5-5-5v4c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8h-2z\"/><text x=\"12\" y=\"15\" text-anchor=\"middle\" font-size=\"7\" font-weight=\"600\">10</text></svg>`,\n replay10: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/><text x=\"12\" y=\"15\" text-anchor=\"middle\" font-size=\"7\" font-weight=\"600\">10</text></svg>`\n};\n\n// src/utils/dom.ts\nfunction createElement(tag, attrs, children) {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (key === \"className\") {\n el.className = value;\n } else {\n el.setAttribute(key, value);\n }\n }\n }\n if (children) {\n for (const child of children) {\n if (typeof child === \"string\") {\n el.appendChild(document.createTextNode(child));\n } else {\n el.appendChild(child);\n }\n }\n }\n return el;\n}\nfunction createButton(className, label, icon) {\n const btn = createElement(\"button\", {\n className: `sp-control ${className}`,\n \"aria-label\": label,\n type: \"button\"\n });\n btn.innerHTML = icon;\n return btn;\n}\nfunction getVideo(container) {\n return container.querySelector(\"video\");\n}\n\n// src/utils/format.ts\nfunction formatTime(seconds) {\n if (!isFinite(seconds) || isNaN(seconds)) {\n return \"0:00\";\n }\n const absSeconds = Math.abs(seconds);\n const h = Math.floor(absSeconds / 3600);\n const m = Math.floor(absSeconds % 3600 / 60);\n const s = Math.floor(absSeconds % 60);\n const sign = seconds < 0 ? \"-\" : \"\";\n if (h > 0) {\n return `${sign}${h}:${pad(m)}:${pad(s)}`;\n }\n return `${sign}${m}:${pad(s)}`;\n}\nfunction pad(n) {\n return n < 10 ? `0${n}` : `${n}`;\n}\nfunction formatLiveTime(behindLive) {\n if (behindLive <= 0) {\n return \"LIVE\";\n }\n return `-${formatTime(behindLive)}`;\n}\n\n// src/controls/PlayButton.ts\nvar PlayButton = class {\n constructor(api) {\n this.clickHandler = () => {\n this.toggle();\n };\n this.api = api;\n this.el = createButton(\"sp-play\", \"Play\", icons.play);\n this.el.addEventListener(\"click\", this.clickHandler);\n }\n render() {\n return this.el;\n }\n update() {\n const playing = this.api.getState(\"playing\");\n const ended = this.api.getState(\"ended\");\n let icon;\n let label;\n if (ended) {\n icon = icons.replay;\n label = \"Replay\";\n } else if (playing) {\n icon = icons.pause;\n label = \"Pause\";\n } else {\n icon = icons.play;\n label = \"Play\";\n }\n this.el.innerHTML = icon;\n this.el.setAttribute(\"aria-label\", label);\n }\n toggle() {\n const video = getVideo(this.api.container);\n if (!video) return;\n const ended = this.api.getState(\"ended\");\n const playing = this.api.getState(\"playing\");\n if (ended) {\n video.currentTime = 0;\n video.play().catch(() => {\n });\n } else if (playing) {\n video.pause();\n } else {\n video.play().catch(() => {\n });\n }\n }\n destroy() {\n this.el.removeEventListener(\"click\", this.clickHandler);\n this.el.remove();\n }\n};\n\n// src/controls/ProgressBar.ts\nvar ProgressBar = class {\n constructor(api) {\n this.isDragging = false;\n this.lastSeekTime = 0;\n this.seekThrottleMs = 100;\n // Throttle seeks to max 10/sec\n this.wasPlayingBeforeDrag = false;\n this.onMouseDown = (e) => {\n e.preventDefault();\n const video = getVideo(this.api.container);\n this.wasPlayingBeforeDrag = video ? !video.paused : false;\n this.isDragging = true;\n this.el.classList.add(\"sp-progress--dragging\");\n this.lastSeekTime = 0;\n this.seek(e.clientX, true);\n };\n this.onDocMouseMove = (e) => {\n if (this.isDragging) {\n this.seek(e.clientX);\n this.updateVisualPosition(e.clientX);\n }\n };\n this.onMouseUp = (e) => {\n if (this.isDragging) {\n this.seek(e.clientX, true);\n this.isDragging = false;\n this.el.classList.remove(\"sp-progress--dragging\");\n if (this.wasPlayingBeforeDrag) {\n const video = getVideo(this.api.container);\n if (video && video.paused) {\n video.play().catch(() => {\n });\n }\n }\n }\n };\n this.onMouseMove = (e) => {\n this.updateTooltip(e.clientX);\n };\n this.onMouseLeave = () => {\n if (!this.isDragging) {\n this.tooltip.style.opacity = \"0\";\n }\n };\n this.onKeyDown = (e) => {\n const video = getVideo(this.api.container);\n if (!video) return;\n const step = 5;\n const duration = this.api.getState(\"duration\") || 0;\n switch (e.key) {\n case \"ArrowLeft\":\n e.preventDefault();\n video.currentTime = Math.max(0, video.currentTime - step);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n video.currentTime = Math.min(duration, video.currentTime + step);\n break;\n case \"Home\":\n e.preventDefault();\n video.currentTime = 0;\n break;\n case \"End\":\n e.preventDefault();\n video.currentTime = duration;\n break;\n }\n };\n this.api = api;\n this.wrapper = createElement(\"div\", { className: \"sp-progress-wrapper\" });\n this.el = createElement(\"div\", { className: \"sp-progress\" });\n const track = createElement(\"div\", { className: \"sp-progress__track\" });\n this.buffered = createElement(\"div\", { className: \"sp-progress__buffered\" });\n this.filled = createElement(\"div\", { className: \"sp-progress__filled\" });\n this.handle = createElement(\"div\", { className: \"sp-progress__handle\" });\n this.tooltip = createElement(\"div\", { className: \"sp-progress__tooltip\" });\n this.tooltip.textContent = \"0:00\";\n track.appendChild(this.buffered);\n track.appendChild(this.filled);\n track.appendChild(this.handle);\n this.el.appendChild(track);\n this.el.appendChild(this.tooltip);\n this.wrapper.appendChild(this.el);\n this.el.setAttribute(\"role\", \"slider\");\n this.el.setAttribute(\"aria-label\", \"Seek\");\n this.el.setAttribute(\"aria-valuemin\", \"0\");\n this.el.setAttribute(\"tabindex\", \"0\");\n this.wrapper.addEventListener(\"mousedown\", this.onMouseDown);\n this.wrapper.addEventListener(\"mousemove\", this.onMouseMove);\n this.wrapper.addEventListener(\"mouseleave\", this.onMouseLeave);\n this.el.addEventListener(\"keydown\", this.onKeyDown);\n document.addEventListener(\"mousemove\", this.onDocMouseMove);\n document.addEventListener(\"mouseup\", this.onMouseUp);\n }\n render() {\n return this.wrapper;\n }\n /** Show the progress bar */\n show() {\n this.wrapper.classList.add(\"sp-progress-wrapper--visible\");\n }\n /** Hide the progress bar */\n hide() {\n this.wrapper.classList.remove(\"sp-progress-wrapper--visible\");\n }\n update() {\n const currentTime = this.api.getState(\"currentTime\") || 0;\n const duration = this.api.getState(\"duration\") || 0;\n const bufferedRanges = this.api.getState(\"buffered\");\n if (duration > 0) {\n const progress = currentTime / duration * 100;\n this.filled.style.width = `${progress}%`;\n this.handle.style.left = `${progress}%`;\n if (bufferedRanges && bufferedRanges.length > 0) {\n const bufferedEnd = bufferedRanges.end(bufferedRanges.length - 1);\n const bufferedPercent = bufferedEnd / duration * 100;\n this.buffered.style.width = `${bufferedPercent}%`;\n }\n this.el.setAttribute(\"aria-valuemax\", String(Math.floor(duration)));\n this.el.setAttribute(\"aria-valuenow\", String(Math.floor(currentTime)));\n this.el.setAttribute(\"aria-valuetext\", formatTime(currentTime));\n }\n }\n getTimeFromPosition(clientX) {\n const rect = this.el.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const duration = this.api.getState(\"duration\") || 0;\n return percent * duration;\n }\n updateTooltip(clientX) {\n const rect = this.el.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const time = this.getTimeFromPosition(clientX);\n this.tooltip.textContent = formatTime(time);\n this.tooltip.style.left = `${percent * 100}%`;\n }\n updateVisualPosition(clientX) {\n const rect = this.el.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n this.filled.style.width = `${percent * 100}%`;\n this.handle.style.left = `${percent * 100}%`;\n }\n seek(clientX, force = false) {\n const video = getVideo(this.api.container);\n if (!video) return;\n const now = Date.now();\n if (!force && this.isDragging && now - this.lastSeekTime < this.seekThrottleMs) {\n return;\n }\n this.lastSeekTime = now;\n const time = this.getTimeFromPosition(clientX);\n video.currentTime = time;\n }\n destroy() {\n this.wrapper.removeEventListener(\"mousedown\", this.onMouseDown);\n this.wrapper.removeEventListener(\"mousemove\", this.onMouseMove);\n this.wrapper.removeEventListener(\"mouseleave\", this.onMouseLeave);\n document.removeEventListener(\"mousemove\", this.onDocMouseMove);\n document.removeEventListener(\"mouseup\", this.onMouseUp);\n this.wrapper.remove();\n }\n};\n\n// src/controls/TimeDisplay.ts\nvar TimeDisplay = class {\n constructor(api) {\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-time\" });\n this.el.setAttribute(\"aria-live\", \"off\");\n }\n render() {\n return this.el;\n }\n update() {\n const live = this.api.getState(\"live\");\n const currentTime = this.api.getState(\"currentTime\") || 0;\n const duration = this.api.getState(\"duration\") || 0;\n if (live) {\n const seekableRange = this.api.getState(\"seekableRange\");\n if (seekableRange) {\n const behindLive = seekableRange.end - currentTime;\n this.el.textContent = formatLiveTime(behindLive);\n } else {\n this.el.textContent = formatLiveTime(0);\n }\n } else {\n this.el.textContent = `${formatTime(currentTime)} / ${formatTime(duration)}`;\n }\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/controls/VolumeControl.ts\nvar VolumeControl = class {\n constructor(api) {\n this.isDragging = false;\n this.onMouseDown = (e) => {\n e.preventDefault();\n this.isDragging = true;\n this.setVolume(this.getVolumeFromPosition(e.clientX));\n };\n this.onDocMouseMove = (e) => {\n if (this.isDragging) {\n this.setVolume(this.getVolumeFromPosition(e.clientX));\n }\n };\n this.onMouseUp = () => {\n this.isDragging = false;\n };\n this.onKeyDown = (e) => {\n const video = getVideo(this.api.container);\n if (!video) return;\n const step = 0.1;\n switch (e.key) {\n case \"ArrowUp\":\n case \"ArrowRight\":\n e.preventDefault();\n this.setVolume(video.volume + step);\n break;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n e.preventDefault();\n this.setVolume(video.volume - step);\n break;\n }\n };\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-volume\" });\n this.btn = createElement(\"button\", {\n className: \"sp-control sp-volume__btn\",\n \"aria-label\": \"Mute\",\n type: \"button\"\n });\n this.btn.innerHTML = icons.volumeHigh;\n this.btn.onclick = () => this.toggleMute();\n const sliderWrap = createElement(\"div\", { className: \"sp-volume__slider-wrap\" });\n this.slider = createElement(\"div\", { className: \"sp-volume__slider\" });\n this.slider.setAttribute(\"role\", \"slider\");\n this.slider.setAttribute(\"aria-label\", \"Volume\");\n this.slider.setAttribute(\"aria-valuemin\", \"0\");\n this.slider.setAttribute(\"aria-valuemax\", \"100\");\n this.slider.setAttribute(\"tabindex\", \"0\");\n this.level = createElement(\"div\", { className: \"sp-volume__level\" });\n this.slider.appendChild(this.level);\n sliderWrap.appendChild(this.slider);\n this.el.appendChild(this.btn);\n this.el.appendChild(sliderWrap);\n this.slider.addEventListener(\"mousedown\", this.onMouseDown);\n this.slider.addEventListener(\"keydown\", this.onKeyDown);\n document.addEventListener(\"mousemove\", this.onDocMouseMove);\n document.addEventListener(\"mouseup\", this.onMouseUp);\n }\n render() {\n return this.el;\n }\n update() {\n const volume = this.api.getState(\"volume\") ?? 1;\n const muted = this.api.getState(\"muted\") ?? false;\n let icon;\n let label;\n if (muted || volume === 0) {\n icon = icons.volumeMute;\n label = \"Unmute\";\n } else if (volume < 0.5) {\n icon = icons.volumeLow;\n label = \"Mute\";\n } else {\n icon = icons.volumeHigh;\n label = \"Mute\";\n }\n this.btn.innerHTML = icon;\n this.btn.setAttribute(\"aria-label\", label);\n const displayVolume = muted ? 0 : volume;\n this.level.style.width = `${displayVolume * 100}%`;\n this.slider.setAttribute(\"aria-valuenow\", String(Math.round(displayVolume * 100)));\n }\n toggleMute() {\n const video = getVideo(this.api.container);\n if (!video) return;\n video.muted = !video.muted;\n }\n setVolume(percent) {\n const video = getVideo(this.api.container);\n if (!video) return;\n const vol = Math.max(0, Math.min(1, percent));\n video.volume = vol;\n if (vol > 0 && video.muted) {\n video.muted = false;\n }\n }\n getVolumeFromPosition(clientX) {\n const rect = this.slider.getBoundingClientRect();\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n }\n destroy() {\n document.removeEventListener(\"mousemove\", this.onDocMouseMove);\n document.removeEventListener(\"mouseup\", this.onMouseUp);\n this.el.remove();\n }\n};\n\n// src/controls/LiveIndicator.ts\nvar LiveIndicator = class {\n constructor(api) {\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-live\" });\n this.el.innerHTML = '<div class=\"sp-live__dot\"></div><span>LIVE</span>';\n this.el.setAttribute(\"role\", \"button\");\n this.el.setAttribute(\"aria-label\", \"Seek to live\");\n this.el.setAttribute(\"tabindex\", \"0\");\n this.el.onclick = () => this.seekToLive();\n this.el.onkeydown = (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this.seekToLive();\n }\n };\n }\n render() {\n return this.el;\n }\n update() {\n const live = this.api.getState(\"live\");\n const liveEdge = this.api.getState(\"liveEdge\");\n this.el.style.display = live ? \"\" : \"none\";\n if (liveEdge) {\n this.el.classList.remove(\"sp-live--behind\");\n } else {\n this.el.classList.add(\"sp-live--behind\");\n }\n }\n seekToLive() {\n const video = getVideo(this.api.container);\n if (!video) return;\n const seekableRange = this.api.getState(\"seekableRange\");\n if (seekableRange) {\n video.currentTime = seekableRange.end;\n }\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/controls/QualityMenu.ts\nvar QualityMenu = class {\n constructor(api) {\n this.isOpen = false;\n this.lastQualitiesJson = \"\";\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-quality\" });\n this.btn = createButton(\"sp-quality__btn\", \"Quality\", icons.settings);\n this.btnLabel = createElement(\"span\", { className: \"sp-quality__label\" });\n this.btnLabel.textContent = \"Auto\";\n this.btn.appendChild(this.btnLabel);\n this.btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.toggle();\n });\n this.menu = createElement(\"div\", { className: \"sp-quality-menu\" });\n this.menu.setAttribute(\"role\", \"menu\");\n this.menu.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n });\n this.el.appendChild(this.btn);\n this.el.appendChild(this.menu);\n this.closeHandler = (e) => {\n if (!this.el.contains(e.target)) {\n this.close();\n }\n };\n document.addEventListener(\"click\", this.closeHandler);\n }\n render() {\n return this.el;\n }\n update() {\n const qualities = this.api.getState(\"qualities\") || [];\n const currentQuality = this.api.getState(\"currentQuality\");\n this.el.style.display = qualities.length > 0 ? \"\" : \"none\";\n this.btnLabel.textContent = currentQuality?.label || \"Auto\";\n const qualitiesJson = JSON.stringify(qualities.map((q) => q.id));\n const currentId = currentQuality?.id || \"auto\";\n if (qualitiesJson !== this.lastQualitiesJson) {\n this.lastQualitiesJson = qualitiesJson;\n this.rebuildMenu(qualities);\n }\n this.updateActiveStates(currentId);\n }\n rebuildMenu(qualities) {\n this.menu.innerHTML = \"\";\n const autoItem = this.createMenuItem(\"Auto\", \"auto\");\n this.menu.appendChild(autoItem);\n const sorted = [...qualities].sort((a, b) => b.height - a.height);\n for (const q of sorted) {\n if (q.id === \"auto\") continue;\n const item = this.createMenuItem(q.label, q.id);\n this.menu.appendChild(item);\n }\n }\n updateActiveStates(activeId) {\n const items = this.menu.querySelectorAll(\".sp-quality-menu__item\");\n items.forEach((item) => {\n const id = item.getAttribute(\"data-quality-id\");\n const isActive = id === activeId;\n item.classList.toggle(\"sp-quality-menu__item--active\", isActive);\n });\n }\n createMenuItem(label, qualityId) {\n const item = createElement(\"div\", {\n className: \"sp-quality-menu__item\"\n });\n item.setAttribute(\"role\", \"menuitem\");\n item.setAttribute(\"data-quality-id\", qualityId);\n const labelSpan = createElement(\"span\", { className: \"sp-quality-menu__label\" });\n labelSpan.textContent = label;\n item.appendChild(labelSpan);\n item.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.selectQuality(qualityId);\n });\n return item;\n }\n selectQuality(qualityId) {\n this.api.emit(\"quality:select\", {\n quality: qualityId,\n auto: qualityId === \"auto\"\n });\n this.close();\n }\n toggle() {\n this.isOpen ? this.close() : this.open();\n }\n open() {\n this.isOpen = true;\n this.menu.classList.add(\"sp-quality-menu--open\");\n this.btn.setAttribute(\"aria-expanded\", \"true\");\n }\n close() {\n this.isOpen = false;\n this.menu.classList.remove(\"sp-quality-menu--open\");\n this.btn.setAttribute(\"aria-expanded\", \"false\");\n }\n destroy() {\n document.removeEventListener(\"click\", this.closeHandler);\n this.el.remove();\n }\n};\n\n// src/controls/CastButton.ts\nfunction isChromecastSupported() {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n return /Chrome/.test(ua) && !/Edge|Edg/.test(ua);\n}\nfunction isAirPlaySupported() {\n if (typeof HTMLVideoElement === \"undefined\") return false;\n return typeof HTMLVideoElement.prototype.webkitShowPlaybackTargetPicker === \"function\";\n}\nvar CastButton = class {\n constructor(api, type) {\n this.api = api;\n this.type = type;\n this.supported = type === \"chromecast\" ? isChromecastSupported() : isAirPlaySupported();\n const icon = type === \"chromecast\" ? icons.chromecast : icons.airplay;\n const label = type === \"chromecast\" ? \"Cast\" : \"AirPlay\";\n this.el = createButton(`sp-cast sp-cast--${type}`, label, icon);\n this.el.addEventListener(\"click\", () => this.handleClick());\n if (!this.supported) {\n this.el.style.display = \"none\";\n }\n }\n render() {\n return this.el;\n }\n update() {\n if (!this.supported) {\n this.el.style.display = \"none\";\n return;\n }\n if (this.type === \"chromecast\") {\n const available = this.api.getState(\"chromecastAvailable\");\n const active = this.api.getState(\"chromecastActive\");\n this.el.style.display = \"\";\n this.el.disabled = !available && !active;\n this.el.classList.toggle(\"sp-cast--active\", !!active);\n this.el.classList.toggle(\"sp-cast--unavailable\", !available && !active);\n if (active) {\n this.el.innerHTML = icons.chromecastConnected;\n this.el.setAttribute(\"aria-label\", \"Stop casting\");\n } else {\n this.el.innerHTML = icons.chromecast;\n this.el.setAttribute(\"aria-label\", available ? \"Cast\" : \"No Cast devices found\");\n }\n } else {\n const active = this.api.getState(\"airplayActive\");\n this.el.style.display = \"\";\n this.el.disabled = false;\n this.el.classList.toggle(\"sp-cast--active\", !!active);\n this.el.classList.remove(\"sp-cast--unavailable\");\n this.el.setAttribute(\"aria-label\", active ? \"Stop AirPlay\" : \"AirPlay\");\n }\n }\n handleClick() {\n if (this.type === \"chromecast\") {\n this.handleChromecast();\n } else {\n this.handleAirPlay();\n }\n }\n handleChromecast() {\n const chromecast = this.api.getPlugin(\"chromecast\");\n if (!chromecast) return;\n if (chromecast.isConnected()) {\n chromecast.endSession();\n } else {\n chromecast.requestSession().catch(() => {\n });\n }\n }\n async handleAirPlay() {\n const airplayPlugin = this.api.getPlugin(\"airplay\");\n if (airplayPlugin) {\n await airplayPlugin.showPicker();\n } else {\n const video = getVideo(this.api.container);\n video?.webkitShowPlaybackTargetPicker?.();\n }\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/controls/PipButton.ts\nvar PipButton = class {\n constructor(api) {\n this.clickHandler = () => {\n this.toggle();\n };\n this.api = api;\n const video = document.createElement(\"video\");\n this.supported = \"pictureInPictureEnabled\" in document || \"webkitSetPresentationMode\" in video;\n this.el = createButton(\"sp-pip\", \"Picture-in-Picture\", icons.pip);\n this.el.addEventListener(\"click\", this.clickHandler);\n if (!this.supported) {\n this.el.style.display = \"none\";\n }\n }\n render() {\n return this.el;\n }\n update() {\n if (!this.supported) return;\n const pip = this.api.getState(\"pip\");\n this.el.setAttribute(\"aria-label\", pip ? \"Exit Picture-in-Picture\" : \"Picture-in-Picture\");\n this.el.classList.toggle(\"sp-pip--active\", !!pip);\n }\n async toggle() {\n const video = getVideo(this.api.container);\n if (!video) {\n this.api.logger.warn(\"PiP: video element not found\");\n return;\n }\n try {\n const isInPip = document.pictureInPictureElement === video || video.webkitPresentationMode === \"picture-in-picture\";\n if (isInPip) {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else if (video.webkitSetPresentationMode) {\n video.webkitSetPresentationMode(\"inline\");\n }\n this.api.logger.debug(\"PiP: exited\");\n } else {\n if (video.requestPictureInPicture) {\n await video.requestPictureInPicture();\n } else if (video.webkitSetPresentationMode) {\n video.webkitSetPresentationMode(\"picture-in-picture\");\n }\n this.api.logger.debug(\"PiP: entered\");\n }\n } catch (e) {\n this.api.logger.warn(\"PiP: failed\", { error: e.message });\n }\n }\n destroy() {\n this.el.removeEventListener(\"click\", this.clickHandler);\n this.el.remove();\n }\n};\n\n// src/controls/FullscreenButton.ts\nvar FullscreenButton = class {\n constructor(api) {\n this.clickHandler = () => {\n this.toggle();\n };\n this.api = api;\n this.el = createButton(\"sp-fullscreen\", \"Fullscreen\", icons.fullscreen);\n this.el.addEventListener(\"click\", this.clickHandler);\n }\n render() {\n return this.el;\n }\n update() {\n const fullscreen = this.api.getState(\"fullscreen\");\n if (fullscreen) {\n this.el.innerHTML = icons.exitFullscreen;\n this.el.setAttribute(\"aria-label\", \"Exit fullscreen\");\n } else {\n this.el.innerHTML = icons.fullscreen;\n this.el.setAttribute(\"aria-label\", \"Fullscreen\");\n }\n }\n async toggle() {\n const container = this.api.container;\n const video = getVideo(container);\n try {\n if (document.fullscreenElement) {\n await document.exitFullscreen();\n } else if (container.requestFullscreen) {\n await container.requestFullscreen();\n } else if (video?.webkitEnterFullscreen) {\n video.webkitEnterFullscreen();\n }\n } catch {\n }\n }\n destroy() {\n this.el.removeEventListener(\"click\", this.clickHandler);\n this.el.remove();\n }\n};\n\n// src/controls/Spacer.ts\nvar Spacer = class {\n constructor() {\n this.el = createElement(\"div\", { className: \"sp-spacer\" });\n }\n render() {\n return this.el;\n }\n update() {\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/index.ts\nvar DEFAULT_LAYOUT = [\n \"play\",\n \"volume\",\n \"time\",\n \"live-indicator\",\n \"spacer\",\n \"quality\",\n \"chromecast\",\n \"airplay\",\n \"pip\",\n \"fullscreen\"\n];\nvar DEFAULT_HIDE_DELAY = 3e3;\nfunction uiPlugin(config = {}) {\n let api;\n let controlBar = null;\n let gradient = null;\n let progressBar = null;\n let bufferingIndicator = null;\n let styleEl = null;\n let controls = [];\n let hideTimeout = null;\n let stateUnsubscribe = null;\n let controlsVisible = true;\n const layout = config.controls || DEFAULT_LAYOUT;\n const hideDelay = config.hideDelay ?? DEFAULT_HIDE_DELAY;\n const createControl = (slot) => {\n switch (slot) {\n case \"play\":\n return new PlayButton(api);\n case \"volume\":\n return new VolumeControl(api);\n case \"progress\":\n return null;\n case \"time\":\n return new TimeDisplay(api);\n case \"live-indicator\":\n return new LiveIndicator(api);\n case \"quality\":\n return new QualityMenu(api);\n case \"chromecast\":\n return new CastButton(api, \"chromecast\");\n case \"airplay\":\n return new CastButton(api, \"airplay\");\n case \"pip\":\n return new PipButton(api);\n case \"fullscreen\":\n return new FullscreenButton(api);\n case \"spacer\":\n return new Spacer();\n default:\n return null;\n }\n };\n const updateControls = () => {\n controls.forEach((c) => c.update());\n progressBar?.update();\n const waiting = api?.getState(\"waiting\");\n const seeking = api?.getState(\"seeking\");\n const playbackState = api?.getState(\"playbackState\");\n const isLoading = playbackState === \"loading\";\n const showSpinner = waiting || seeking && !api?.getState(\"paused\") || isLoading;\n bufferingIndicator?.classList.toggle(\"sp-buffering--visible\", !!showSpinner);\n };\n const showControls = () => {\n if (controlsVisible) {\n resetHideTimer();\n return;\n }\n controlsVisible = true;\n controlBar?.classList.add(\"sp-controls--visible\");\n controlBar?.classList.remove(\"sp-controls--hidden\");\n gradient?.classList.add(\"sp-gradient--visible\");\n progressBar?.show();\n api?.setState(\"controlsVisible\", true);\n resetHideTimer();\n };\n const hideControls = () => {\n const paused = api?.getState(\"paused\");\n if (paused) return;\n controlsVisible = false;\n controlBar?.classList.remove(\"sp-controls--visible\");\n controlBar?.classList.add(\"sp-controls--hidden\");\n gradient?.classList.remove(\"sp-gradient--visible\");\n progressBar?.hide();\n api?.setState(\"controlsVisible\", false);\n };\n const resetHideTimer = () => {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n }\n hideTimeout = setTimeout(hideControls, hideDelay);\n };\n const handleInteraction = () => {\n showControls();\n };\n const handleMouseLeave = () => {\n hideControls();\n };\n const handleKeyDown = (e) => {\n if (!api.container.contains(document.activeElement)) return;\n const video = api.container.querySelector(\"video\");\n if (!video) return;\n switch (e.key) {\n case \" \":\n case \"k\":\n e.preventDefault();\n video.paused ? video.play() : video.pause();\n break;\n case \"m\":\n e.preventDefault();\n video.muted = !video.muted;\n break;\n case \"f\":\n e.preventDefault();\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n api.container.requestFullscreen?.();\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n video.currentTime = Math.max(0, video.currentTime - 5);\n showControls();\n break;\n case \"ArrowRight\":\n e.preventDefault();\n video.currentTime = Math.min(video.duration || 0, video.currentTime + 5);\n showControls();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n video.volume = Math.min(1, video.volume + 0.1);\n showControls();\n break;\n case \"ArrowDown\":\n e.preventDefault();\n video.volume = Math.max(0, video.volume - 0.1);\n showControls();\n break;\n }\n };\n return {\n id: \"ui-controls\",\n name: \"UI Controls\",\n type: \"ui\",\n version: \"1.0.0\",\n async init(pluginApi) {\n api = pluginApi;\n styleEl = document.createElement(\"style\");\n styleEl.textContent = styles;\n document.head.appendChild(styleEl);\n if (config.theme) {\n this.setTheme(config.theme);\n }\n const container = api.container;\n if (!container) {\n api.logger.error(\"UI plugin: container not found\");\n return;\n }\n const containerStyle = getComputedStyle(container);\n if (containerStyle.position === \"static\") {\n container.style.position = \"relative\";\n }\n gradient = document.createElement(\"div\");\n gradient.className = \"sp-gradient sp-gradient--visible\";\n container.appendChild(gradient);\n bufferingIndicator = document.createElement(\"div\");\n bufferingIndicator.className = \"sp-buffering\";\n bufferingIndicator.innerHTML = icons.spinner;\n bufferingIndicator.setAttribute(\"aria-hidden\", \"true\");\n container.appendChild(bufferingIndicator);\n progressBar = new ProgressBar(api);\n container.appendChild(progressBar.render());\n progressBar.show();\n controlBar = document.createElement(\"div\");\n controlBar.className = \"sp-controls sp-controls--visible\";\n controlBar.setAttribute(\"role\", \"toolbar\");\n controlBar.setAttribute(\"aria-label\", \"Video controls\");\n for (const slot of layout) {\n const control = createControl(slot);\n if (control) {\n controls.push(control);\n controlBar.appendChild(control.render());\n }\n }\n container.appendChild(controlBar);\n container.addEventListener(\"mousemove\", handleInteraction);\n container.addEventListener(\"mouseenter\", handleInteraction);\n container.addEventListener(\"mouseleave\", handleMouseLeave);\n container.addEventListener(\"touchstart\", handleInteraction, { passive: true });\n container.addEventListener(\"click\", handleInteraction);\n document.addEventListener(\"keydown\", handleKeyDown);\n stateUnsubscribe = api.subscribeToState(updateControls);\n document.addEventListener(\"fullscreenchange\", updateControls);\n updateControls();\n if (!container.hasAttribute(\"tabindex\")) {\n container.setAttribute(\"tabindex\", \"0\");\n }\n api.logger.debug(\"UI controls plugin initialized\");\n },\n async destroy() {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n hideTimeout = null;\n }\n stateUnsubscribe?.();\n stateUnsubscribe = null;\n if (api?.container) {\n api.container.removeEventListener(\"mousemove\", handleInteraction);\n api.container.removeEventListener(\"mouseenter\", handleInteraction);\n api.container.removeEventListener(\"mouseleave\", handleMouseLeave);\n api.container.removeEventListener(\"touchstart\", handleInteraction);\n api.container.removeEventListener(\"click\", handleInteraction);\n }\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"fullscreenchange\", updateControls);\n controls.forEach((c) => c.destroy());\n controls = [];\n progressBar?.destroy();\n progressBar = null;\n controlBar?.remove();\n controlBar = null;\n gradient?.remove();\n gradient = null;\n bufferingIndicator?.remove();\n bufferingIndicator = null;\n styleEl?.remove();\n styleEl = null;\n api?.logger.debug(\"UI controls plugin destroyed\");\n },\n // Public API\n show() {\n showControls();\n },\n hide() {\n controlsVisible = false;\n controlBar?.classList.remove(\"sp-controls--visible\");\n controlBar?.classList.add(\"sp-controls--hidden\");\n gradient?.classList.remove(\"sp-gradient--visible\");\n progressBar?.hide();\n api?.setState(\"controlsVisible\", false);\n },\n setTheme(theme) {\n const root = api?.container || document.documentElement;\n if (theme.primaryColor) {\n root.style.setProperty(\"--sp-color\", theme.primaryColor);\n }\n if (theme.accentColor) {\n root.style.setProperty(\"--sp-accent\", theme.accentColor);\n }\n if (theme.backgroundColor) {\n root.style.setProperty(\"--sp-bg\", theme.backgroundColor);\n }\n if (theme.controlBarHeight) {\n root.style.setProperty(\"--sp-control-height\", `${theme.controlBarHeight}px`);\n }\n if (theme.iconSize) {\n root.style.setProperty(\"--sp-icon-size\", `${theme.iconSize}px`);\n }\n },\n getControlBar() {\n return controlBar;\n }\n };\n}\nvar index_default = uiPlugin;\nexport {\n index_default as default,\n formatLiveTime,\n formatTime,\n icons,\n styles,\n uiPlugin\n};\n","import type { EmbedConfig } from './types';\n\n/**\n * Helper to get attribute with fallback aliases\n * Tries each name in order until one is found\n */\nfunction getAttr(element: HTMLElement, ...names: string[]): string | null {\n for (const name of names) {\n const value = element.getAttribute(name);\n if (value !== null) return value;\n }\n return null;\n}\n\n/**\n * Parse data attributes from an element into EmbedConfig\n * Supports multiple attribute naming conventions for flexibility:\n * - Full: data-src, data-autoplay, data-brand-color\n * - Short: src, autoplay, color\n */\nexport function parseDataAttributes(element: HTMLElement): Partial<EmbedConfig> {\n const config: Partial<EmbedConfig> = {};\n\n // Required: source URL (supports: data-src, src, href)\n const src = getAttr(element, 'data-src', 'src', 'href');\n if (src) {\n config.src = src;\n }\n\n // Boolean attributes (supports: data-autoplay or just autoplay)\n const autoplay = getAttr(element, 'data-autoplay', 'autoplay');\n if (autoplay !== null) {\n config.autoplay = autoplay !== 'false';\n }\n\n const muted = getAttr(element, 'data-muted', 'muted');\n if (muted !== null) {\n config.muted = muted !== 'false';\n }\n\n const controls = getAttr(element, 'data-controls', 'controls');\n if (controls !== null) {\n config.controls = controls !== 'false';\n }\n\n const keyboard = getAttr(element, 'data-keyboard', 'keyboard');\n if (keyboard !== null) {\n config.keyboard = keyboard !== 'false';\n }\n\n const loop = getAttr(element, 'data-loop', 'loop');\n if (loop !== null) {\n config.loop = loop !== 'false';\n }\n\n // String attributes (supports: data-poster or just poster)\n const poster = getAttr(element, 'data-poster', 'poster');\n if (poster) {\n config.poster = poster;\n }\n\n // Brand color (supports: data-brand-color, data-color, color)\n const brandColor = getAttr(element, 'data-brand-color', 'data-color', 'color');\n if (brandColor) {\n config.brandColor = brandColor;\n }\n\n const primaryColor = element.getAttribute('data-primary-color');\n if (primaryColor) {\n config.primaryColor = primaryColor;\n }\n\n const backgroundColor = element.getAttribute('data-background-color');\n if (backgroundColor) {\n config.backgroundColor = backgroundColor;\n }\n\n const width = element.getAttribute('data-width');\n if (width) {\n config.width = width;\n }\n\n const height = element.getAttribute('data-height');\n if (height) {\n config.height = height;\n }\n\n const aspectRatio = element.getAttribute('data-aspect-ratio');\n if (aspectRatio) {\n config.aspectRatio = aspectRatio;\n }\n\n const className = element.getAttribute('data-class');\n if (className) {\n config.className = className;\n }\n\n // Number attributes\n const hideDelay = element.getAttribute('data-hide-delay');\n if (hideDelay) {\n const parsed = parseInt(hideDelay, 10);\n if (!isNaN(parsed)) {\n config.hideDelay = parsed;\n }\n }\n\n const playbackRate = element.getAttribute('data-playback-rate');\n if (playbackRate) {\n const parsed = parseFloat(playbackRate);\n if (!isNaN(parsed)) {\n config.playbackRate = parsed;\n }\n }\n\n const startTime = element.getAttribute('data-start-time');\n if (startTime) {\n const parsed = parseFloat(startTime);\n if (!isNaN(parsed)) {\n config.startTime = parsed;\n }\n }\n\n return config;\n}\n\n/**\n * Convert aspect ratio string (e.g., \"16:9\") to percentage\n */\nexport function aspectRatioToPercent(ratio: string): number {\n const parts = ratio.split(':').map(Number);\n const width = parts[0];\n const height = parts[1];\n if (parts.length === 2 && width !== undefined && height !== undefined && !isNaN(width) && !isNaN(height) && width > 0) {\n return (height / width) * 100;\n }\n return 56.25; // Default 16:9\n}\n\n/**\n * Apply container styles based on config\n */\nexport function applyContainerStyles(\n container: HTMLElement,\n config: Partial<EmbedConfig>\n): void {\n // Apply custom class\n if (config.className) {\n container.classList.add(...config.className.split(' '));\n }\n\n // Apply width\n if (config.width) {\n container.style.width = config.width;\n }\n\n // Apply height or aspect ratio\n if (config.height) {\n container.style.height = config.height;\n } else if (config.aspectRatio) {\n // Use padding-bottom technique for aspect ratio\n container.style.position = 'relative';\n container.style.paddingBottom = `${aspectRatioToPercent(config.aspectRatio)}%`;\n container.style.height = '0';\n }\n}\n","import { ScarlettPlayer, createPlayer, type Plugin } from '@scarlett-player/core';\nimport { createHLSPlugin } from '@scarlett-player/hls';\nimport { uiPlugin } from '@scarlett-player/ui';\nimport type { EmbedConfig, EmbedPlayerOptions } from './types';\nimport { parseDataAttributes, applyContainerStyles } from './parser';\n\n/**\n * Create a player instance from configuration\n */\nexport async function createEmbedPlayer(\n container: HTMLElement,\n config: Partial<EmbedConfig>\n): Promise<ScarlettPlayer | null> {\n if (!config.src) {\n console.error('[Scarlett Player] No source URL provided');\n return null;\n }\n\n try {\n // Apply container styles\n applyContainerStyles(container, config);\n\n // Build theme config\n const theme: Record<string, string> = {};\n if (config.brandColor) {\n theme.accentColor = config.brandColor;\n }\n if (config.primaryColor) {\n theme.primaryColor = config.primaryColor;\n }\n if (config.backgroundColor) {\n theme.backgroundColor = config.backgroundColor;\n }\n\n // Build UI plugin config\n const uiConfig: Record<string, unknown> = {};\n if (Object.keys(theme).length > 0) {\n uiConfig.theme = theme;\n }\n if (config.hideDelay !== undefined) {\n uiConfig.hideDelay = config.hideDelay;\n }\n\n // Build plugins array\n const plugins: Plugin[] = [createHLSPlugin()];\n\n // Only add UI plugin if controls are enabled (default: true)\n if (config.controls !== false) {\n plugins.push(uiPlugin(uiConfig));\n }\n\n // Create player\n const player = await createPlayer({\n container,\n src: config.src,\n autoplay: config.autoplay || false,\n muted: config.muted || false,\n poster: config.poster,\n loop: config.loop || false,\n plugins,\n });\n\n // Apply post-initialization settings\n const video = container.querySelector('video');\n if (video) {\n if (config.playbackRate) {\n video.playbackRate = config.playbackRate;\n }\n if (config.startTime) {\n video.currentTime = config.startTime;\n }\n }\n\n return player;\n } catch (error) {\n console.error('[Scarlett Player] Failed to create player:', error);\n return null;\n }\n}\n\n/**\n * Initialize a player from a DOM element with data attributes\n */\nexport async function initElement(element: HTMLElement): Promise<ScarlettPlayer | null> {\n // Check if already initialized\n if (element.hasAttribute('data-scarlett-initialized')) {\n return null;\n }\n\n // Parse data attributes\n const config = parseDataAttributes(element);\n\n // Mark as initializing to prevent double-init\n element.setAttribute('data-scarlett-initialized', 'true');\n\n // Create player\n const player = await createEmbedPlayer(element, config);\n\n if (!player) {\n // Remove marker if initialization failed\n element.removeAttribute('data-scarlett-initialized');\n }\n\n return player;\n}\n\n/**\n * Selectors for auto-initialization (in order of preference)\n * Supports multiple patterns for simpler drop-in usage\n */\nconst PLAYER_SELECTORS = [\n '[data-scarlett-player]', // Full name: <div data-scarlett-player>\n '[data-sp]', // Short: <div data-sp>\n '[data-video-player]', // Generic: <div data-video-player>\n '.scarlett-player', // Class-based: <div class=\"scarlett-player\">\n];\n\n/**\n * Initialize all players on the page\n * Supports multiple selector patterns for flexibility\n */\nexport async function initAll(): Promise<void> {\n const selector = PLAYER_SELECTORS.join(', ');\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n const promises = Array.from(elements).map((element) => initElement(element));\n await Promise.all(promises);\n\n if (elements.length > 0) {\n console.log(`[Scarlett Player] Initialized ${elements.length} player(s)`);\n }\n}\n\n/**\n * Programmatic API for creating players\n */\nexport async function create(options: EmbedPlayerOptions): Promise<ScarlettPlayer | null> {\n // Resolve container\n let container: HTMLElement | null = null;\n\n if (typeof options.container === 'string') {\n container = document.querySelector<HTMLElement>(options.container);\n if (!container) {\n console.error(`[Scarlett Player] Container not found: ${options.container}`);\n return null;\n }\n } else {\n container = options.container;\n }\n\n // Build config from options\n const config: Partial<EmbedConfig> = { ...options };\n\n // Create player\n return createEmbedPlayer(container, config);\n}\n","/**\n * Scarlett Player Embed Package\n *\n * Standalone, CDN-ready player that can be used without npm/bundlers.\n * Supports both declarative (data attributes) and programmatic (JavaScript API) usage.\n *\n * @packageDocumentation\n */\n\nimport type { ScarlettPlayerGlobal } from './types';\nimport { initAll, create } from './embed';\n\n// Export types for TypeScript users\nexport type { EmbedConfig, EmbedPlayerOptions, ScarlettPlayerGlobal } from './types';\nexport { createEmbedPlayer, initElement, initAll, create } from './embed';\nexport { parseDataAttributes, applyContainerStyles, aspectRatioToPercent } from './parser';\n\n// Package version\nconst VERSION = '0.1.0';\n\n/**\n * Global API exposed as window.ScarlettPlayer\n */\nconst ScarlettPlayerAPI: ScarlettPlayerGlobal = {\n create,\n initAll,\n version: VERSION,\n};\n\n// Expose on window\nif (typeof window !== 'undefined') {\n window.ScarlettPlayer = ScarlettPlayerAPI;\n}\n\n/**\n * Auto-initialize on DOMContentLoaded\n */\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n initAll();\n });\n } else {\n // DOM already loaded, initialize immediately\n initAll();\n }\n}\n\nexport default ScarlettPlayerAPI;\n"],"names":[],"mappings":"AA2BA,MAAM,OAAO;AAAA,EACX,YAAY,cAAc;AACxB,SAAK,cAA8B,oBAAI,IAAG;AAC1C,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AAIJ,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAU;AACZ,QAAI,OAAO,GAAG,KAAK,OAAO,QAAQ,GAAG;AACnC;AAAA,IACF;AACA,SAAK,QAAQ;AACb,SAAK,OAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,SAAS;AACd,SAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,UAAU;AAClB,SAAK,YAAY,IAAI,QAAQ;AAC7B,WAAO,MAAM,KAAK,YAAY,OAAO,QAAQ;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,SAAK,YAAY,QAAQ,CAAC,eAAe;AACvC,UAAI;AACF,mBAAU;AAAA,MACZ,SAAS,OAAO;AACd,gBAAQ,MAAM,iDAAiD,KAAK;AAAA,MACtE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,YAAY,MAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB;AACnB,WAAO,KAAK,YAAY;AAAA,EAC1B;AACF;AACA,SAAS,OAAO,cAAc;AAC5B,SAAO,IAAI,OAAO,YAAY;AAChC;AAyFA,MAAM,gBAAgB;AAAA;AAAA,EAEpB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA;AAAA,EAET,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,gBAAgB;AAAA;AAAA,EAEhB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,OAAO;AAAA;AAAA,EAEP,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,iBAAiB;AAAA;AAAA,EAEjB,WAAW,CAAA;AAAA,EACX,gBAAgB;AAAA,EAChB,aAAa,CAAA;AAAA,EACb,mBAAmB;AAAA,EACnB,YAAY,CAAA;AAAA,EACZ,kBAAkB;AAAA;AAAA,EAElB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,eAAe;AAAA,EACf,aAAa;AAAA,EACb,gBAAgB;AAAA;AAAA,EAEhB,UAAU,CAAA;AAAA,EACV,gBAAgB;AAAA;AAAA,EAEhB,OAAO;AAAA;AAAA,EAEP,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA;AAAA,EAEN,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,kBAAkB;AAAA;AAAA,EAElB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AACX;AACA,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,YAAY,cAAc;AACxB,SAAK,UAA0B,oBAAI,IAAG;AACtC,SAAK,oBAAoC,oBAAI,IAAG;AAChD,SAAK,kBAAkB,YAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAW;AAC3B,UAAM,eAAe,EAAE,GAAG,eAAe,GAAG,UAAS;AACrD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,YAAM,WAAW;AACjB,YAAM,cAAc,OAAO,KAAK;AAChC,kBAAY,UAAU,MAAM;AAC1B,aAAK,wBAAwB,QAAQ;AAAA,MACvC,CAAC;AACD,WAAK,QAAQ,IAAI,UAAU,WAAW;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,KAAK;AACP,UAAM,cAAc,KAAK,QAAQ,IAAI,GAAG;AACxC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,qCAAqC,GAAG,EAAE;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAAS,KAAK;AACZ,WAAO,KAAK,IAAI,GAAG,EAAE,IAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,IAAI,KAAK,OAAO;AACd,SAAK,IAAI,GAAG,EAAE,IAAI,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,SAAS;AACd,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAM,WAAW;AACjB,UAAI,KAAK,QAAQ,IAAI,QAAQ,GAAG;AAC9B,aAAK,IAAI,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,eAAe,KAAK,UAAU;AAC5B,UAAM,cAAc,KAAK,IAAI,GAAG;AAChC,WAAO,YAAY,UAAU,MAAM;AACjC,eAAS,YAAY,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,UAAU,UAAU;AAClB,SAAK,kBAAkB,IAAI,QAAQ;AACnC,WAAO,MAAM,KAAK,kBAAkB,OAAO,QAAQ;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,KAAK;AAC3B,UAAM,cAAc,KAAK,IAAI,GAAG;AAChC,UAAM,QAAQ,YAAY,IAAG;AAC7B,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,eAAe;AAAA;AAAA,IAErB;AACI,SAAK,kBAAkB,QAAQ,CAAC,eAAe;AAC7C,UAAI;AACF,mBAAW,KAAK;AAAA,MAClB,SAAS,OAAO;AACd,gBAAQ,MAAM,8CAA8C,KAAK;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ;AACN,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,KAAK;AACZ,UAAM,eAAe,cAAc,GAAG;AACtC,SAAK,IAAI,KAAK,YAAY;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,WAAW;AACT,UAAM,WAAW,CAAA;AACjB,eAAW,CAAC,KAAK,WAAW,KAAK,KAAK,SAAS;AAC7C,eAAS,GAAG,IAAI,YAAY,IAAG;AAAA,IACjC;AACA,WAAO,OAAO,OAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,KAAK;AACtB,WAAO,KAAK,QAAQ,IAAI,GAAG,GAAG,mBAAkB,KAAM;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,SAAK,QAAQ,QAAQ,CAAC,gBAAgB,YAAY,SAAS;AAC3D,SAAK,QAAQ,MAAK;AAClB,SAAK,kBAAkB,MAAK;AAAA,EAC9B;AACF;AACA,MAAM,kBAAkB;AAAA,EACtB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,cAAc;AAChB;AACA,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,YAAY,SAAS;AACnB,SAAK,YAA4B,oBAAI,IAAG;AACxC,SAAK,gBAAgC,oBAAI,IAAG;AAC5C,SAAK,eAA+B,oBAAI,IAAG;AAC3C,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,GAAG,OAAO,SAAS;AACjB,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACrD;AACA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,aAAS,IAAI,OAAO;AACpB,SAAK,kBAAkB,KAAK;AAC5B,WAAO,MAAM,KAAK,IAAI,OAAO,OAAO;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,OAAO,SAAS;AACnB,QAAI,CAAC,KAAK,cAAc,IAAI,KAAK,GAAG;AAClC,WAAK,cAAc,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACzD;AACA,UAAM,WAAW,KAAK,cAAc,IAAI,KAAK;AAC7C,aAAS,IAAI,OAAO;AACpB,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACrD;AACA,WAAO,MAAM;AACX,eAAS,OAAO,OAAO;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,OAAO,SAAS;AAClB,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,UAAU;AACZ,eAAS,OAAO,OAAO;AACvB,UAAI,SAAS,SAAS,GAAG;AACvB,aAAK,UAAU,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AACA,UAAM,eAAe,KAAK,cAAc,IAAI,KAAK;AACjD,QAAI,cAAc;AAChB,mBAAa,OAAO,OAAO;AAC3B,UAAI,aAAa,SAAS,GAAG;AAC3B,aAAK,cAAc,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,OAAO,SAAS;AACnB,UAAM,qBAAqB,KAAK,gBAAgB,OAAO,OAAO;AAC9D,QAAI,uBAAuB,MAAM;AAC/B;AAAA,IACF;AACA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,UAAU;AACZ,YAAM,gBAAgB,MAAM,KAAK,QAAQ;AACzC,oBAAc,QAAQ,CAAC,YAAY;AACjC,aAAK,gBAAgB,SAAS,kBAAkB;AAAA,MAClD,CAAC;AAAA,IACH;AACA,UAAM,eAAe,KAAK,cAAc,IAAI,KAAK;AACjD,QAAI,cAAc;AAChB,YAAM,gBAAgB,MAAM,KAAK,YAAY;AAC7C,oBAAc,QAAQ,CAAC,YAAY;AACjC,aAAK,gBAAgB,SAAS,kBAAkB;AAAA,MAClD,CAAC;AACD,WAAK,cAAc,OAAO,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,UAAU,OAAO,SAAS;AAC9B,UAAM,qBAAqB,MAAM,KAAK,qBAAqB,OAAO,OAAO;AACzE,QAAI,uBAAuB,MAAM;AAC/B;AAAA,IACF;AACA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,UAAU;AACZ,YAAM,WAAW,MAAM,KAAK,QAAQ,EAAE;AAAA,QACpC,CAAC,YAAY,KAAK,qBAAqB,SAAS,kBAAkB;AAAA,MAC1E;AACM,YAAM,QAAQ,IAAI,QAAQ;AAAA,IAC5B;AACA,UAAM,eAAe,KAAK,cAAc,IAAI,KAAK;AACjD,QAAI,cAAc;AAChB,YAAM,gBAAgB,MAAM,KAAK,YAAY;AAC7C,YAAM,WAAW,cAAc;AAAA,QAC7B,CAAC,YAAY,KAAK,qBAAqB,SAAS,kBAAkB;AAAA,MAC1E;AACM,YAAM,QAAQ,IAAI,QAAQ;AAC1B,WAAK,cAAc,OAAO,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,UAAU,OAAO,aAAa;AAC5B,QAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,aAAO,MAAM;AAAA,MACb;AAAA,IACF;AACA,QAAI,CAAC,KAAK,aAAa,IAAI,KAAK,GAAG;AACjC,WAAK,aAAa,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACxD;AACA,UAAM,kBAAkB,KAAK,aAAa,IAAI,KAAK;AACnD,oBAAgB,IAAI,WAAW;AAC/B,WAAO,MAAM;AACX,sBAAgB,OAAO,WAAW;AAClC,UAAI,gBAAgB,SAAS,GAAG;AAC9B,aAAK,aAAa,OAAO,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,mBAAmB,OAAO;AACxB,QAAI,OAAO;AACT,WAAK,UAAU,OAAO,KAAK;AAC3B,WAAK,cAAc,OAAO,KAAK;AAAA,IACjC,OAAO;AACL,WAAK,UAAU,MAAK;AACpB,WAAK,cAAc,MAAK;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,cAAc,OAAO;AACnB,UAAM,eAAe,KAAK,UAAU,IAAI,KAAK,GAAG,QAAQ;AACxD,UAAM,YAAY,KAAK,cAAc,IAAI,KAAK,GAAG,QAAQ;AACzD,WAAO,eAAe;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,SAAK,UAAU,MAAK;AACpB,SAAK,cAAc,MAAK;AACxB,SAAK,aAAa,MAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAO,SAAS;AAC9B,QAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,KAAK,aAAa,IAAI,KAAK;AACnD,QAAI,CAAC,mBAAmB,gBAAgB,SAAS,GAAG;AAClD,aAAO;AAAA,IACT;AACA,QAAI,iBAAiB;AACrB,eAAW,eAAe,iBAAiB;AACzC,UAAI;AACF,yBAAiB,YAAY,cAAc;AAC3C,YAAI,mBAAmB,MAAM;AAC3B,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,OAAO,SAAS;AACzC,QAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,KAAK,aAAa,IAAI,KAAK;AACnD,QAAI,CAAC,mBAAmB,gBAAgB,SAAS,GAAG;AAClD,aAAO;AAAA,IACT;AACA,QAAI,iBAAiB;AACrB,eAAW,eAAe,iBAAiB;AACzC,UAAI;AACF,cAAM,SAAS,YAAY,cAAc;AACzC,yBAAiB,kBAAkB,UAAU,MAAM,SAAS;AAC5D,YAAI,mBAAmB,MAAM;AAC3B,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAS,SAAS;AAChC,QAAI;AACF,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,sCAAsC,KAAK;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,SAAS,SAAS;AAC3C,QAAI;AACF,YAAM,SAAS,QAAQ,OAAO;AAC9B,UAAI,kBAAkB,SAAS;AAC7B,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,sCAAsC,KAAK;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAO;AACvB,UAAM,QAAQ,KAAK,cAAc,KAAK;AACtC,QAAI,QAAQ,KAAK,QAAQ,cAAc;AACrC,cAAQ;AAAA,QACN,6BAA6B,KAAK,QAAQ,YAAY,yBAAyB,KAAK,oBAAoB,KAAK;AAAA,MACrH;AAAA,IACI;AAAA,EACF;AACF;AACA,MAAM,aAAa,CAAC,SAAS,QAAQ,QAAQ,OAAO;AACpD,MAAM,wBAAwB,CAAC,UAAU;AACvC,QAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,KAAK,MAAM;AAClD,QAAM,UAAU,GAAG,MAAM,IAAI,MAAM,OAAO;AAC1C,QAAM,WAAW,MAAM,YAAY;AACnC,UAAQ,MAAM,OAAK;AAAA,IACjB,KAAK;AACH,cAAQ,MAAM,SAAS,QAAQ;AAC/B;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,SAAS,QAAQ;AAC9B;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,SAAS,QAAQ;AAC9B;AAAA,IACF,KAAK;AACH,cAAQ,MAAM,SAAS,QAAQ;AAC/B;AAAA,EACN;AACA;AACA,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,YAAY,SAAS;AACnB,SAAK,QAAQ,SAAS,SAAS;AAC/B,SAAK,QAAQ,SAAS;AACtB,SAAK,UAAU,SAAS,WAAW;AACnC,SAAK,WAAW,SAAS,YAAY,CAAC,qBAAqB;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAO;AACX,WAAO,IAAI,OAAO;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,QAAQ,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,MAC/C,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,IACrB,CAAK;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAS,UAAU;AACvB,SAAK,IAAI,SAAS,SAAS,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAK,SAAS,UAAU;AACtB,SAAK,IAAI,QAAQ,SAAS,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAK,SAAS,UAAU;AACtB,SAAK,IAAI,QAAQ,SAAS,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAS,UAAU;AACvB,SAAK,IAAI,SAAS,SAAS,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAAS,OAAO;AACd,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAW,SAAS;AAClB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,WAAW,SAAS;AAClB,SAAK,SAAS,KAAK,OAAO;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,SAAS;AACrB,UAAM,QAAQ,KAAK,SAAS,QAAQ,OAAO;AAC3C,QAAI,UAAU,IAAI;AAChB,WAAK,SAAS,OAAO,OAAO,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU,KAAK,GAAG;AAC3C;AAAA,IACF;AACA,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAG;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ;AAAA,IACN;AACI,eAAW,WAAW,KAAK,UAAU;AACnC,UAAI;AACF,gBAAQ,KAAK;AAAA,MACf,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAO;AACf,WAAO,WAAW,QAAQ,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK;AAAA,EACnE;AACF;AAIA,IAAI,YAA6B,kBAAC,eAAe;AAC/C,aAAW,sBAAsB,IAAI;AACrC,aAAW,oBAAoB,IAAI;AACnC,aAAW,oBAAoB,IAAI;AACnC,aAAW,uBAAuB,IAAI;AACtC,aAAW,qBAAqB,IAAI;AACpC,aAAW,kBAAkB,IAAI;AACjC,aAAW,iBAAiB,IAAI;AAChC,aAAW,oBAAoB,IAAI;AACnC,aAAW,qBAAqB,IAAI;AACpC,aAAW,eAAe,IAAI;AAC9B,SAAO;AACT,GAAG,aAAa,CAAA,CAAE;AAClB,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,YAAY,UAAU,QAAQ,SAAS;AACrC,SAAK,SAAS,CAAA;AACd,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,aAAa,SAAS,cAAc;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,OAAO,SAAS;AACrB,UAAM,cAAc,KAAK,eAAe,OAAO,OAAO;AACtD,SAAK,aAAa,WAAW;AAC7B,SAAK,SAAS,WAAW;AACzB,SAAK,SAAS,KAAK,SAAS,WAAW;AACvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,MAAM,SAAS,SAAS;AAC5B,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,OAAO,SAAS,SAAS,KAAK,YAAY,IAAI;AAAA,MAC9C,WAAW,KAAK,IAAG;AAAA,MACnB,SAAS,SAAS;AAAA,MAClB,eAAe,SAAS;AAAA,IAC9B;AACI,WAAO,KAAK,OAAO,OAAO,SAAS,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa;AACX,WAAO,CAAC,GAAG,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,eAAe;AACb,WAAO,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,KAAK;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe;AACb,SAAK,SAAS,CAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,gBAAgB;AACd,WAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAO,SAAS;AAC7B,QAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,QAAO;AAAA,MAC/C;AAAA,IACI;AACA,WAAO;AAAA,MACL,MAAM,KAAK,aAAa,KAAK;AAAA,MAC7B,SAAS,MAAM;AAAA,MACf,OAAO,KAAK,QAAQ,KAAK;AAAA,MACzB,WAAW,KAAK,IAAG;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,IACrB;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAO;AAClB,UAAM,UAAU,MAAM,QAAQ,YAAW;AACzC,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,UAAU,GAAG;AAChC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAO;AACb,WAAO,KAAK,YAAY,KAAK,aAAa,KAAK,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAM;AAChB,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IAEN;AACI,WAAO,WAAW,SAAS,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAO;AACnB,WAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,aAAa,SAAS,WAAW,SAAS,eAAe;AAAA,EACpI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAO;AAClB,SAAK,OAAO,KAAK,KAAK;AACtB,QAAI,KAAK,OAAO,SAAS,KAAK,YAAY;AACxC,WAAK,OAAO,MAAK;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAO;AACd,UAAM,aAAa,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO;AACnD,QAAI,MAAM,OAAO;AACf,WAAK,OAAO,MAAM,YAAY;AAAA,QAC5B,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACvB,CAAO;AAAA,IACH,OAAO;AACL,WAAK,OAAO,KAAK,YAAY;AAAA,QAC3B,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACvB,CAAO;AAAA,IACH;AAAA,EACF;AACF;AACA,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,YAAY,UAAU,MAAM;AAC1B,SAAK,aAAa,CAAA;AAClB,SAAK,WAAW;AAChB,SAAK,eAAe,KAAK;AACzB,SAAK,WAAW,KAAK;AACrB,SAAK,YAAY,KAAK;AACtB,SAAK,cAAc,KAAK;AACxB,SAAK,SAAS;AAAA,MACZ,OAAO,CAAC,KAAK,aAAa,KAAK,OAAO,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,MAC5E,MAAM,CAAC,KAAK,aAAa,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,MAC1E,MAAM,CAAC,KAAK,aAAa,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,MAC1E,OAAO,CAAC,KAAK,aAAa,KAAK,OAAO,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,IAClF;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAK;AACZ,WAAO,KAAK,aAAa,SAAS,GAAG;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAK,OAAO;AACnB,SAAK,aAAa,IAAI,KAAK,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAG,OAAO,SAAS;AACjB,WAAO,KAAK,SAAS,GAAG,OAAO,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,OAAO,SAAS;AAClB,SAAK,SAAS,IAAI,OAAO,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,OAAO,SAAS;AACnB,SAAK,SAAS,KAAK,OAAO,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,IAAI;AACZ,WAAO,KAAK,YAAY,EAAE;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,SAAS;AACjB,SAAK,WAAW,KAAK,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,UAAU;AACzB,WAAO,KAAK,aAAa,UAAU,QAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc;AACZ,eAAW,WAAW,KAAK,YAAY;AACrC,UAAI;AACF,gBAAO;AAAA,MACT,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,2BAA2B,EAAE,MAAK,CAAE;AAAA,MACxD;AAAA,IACF;AACA,SAAK,aAAa,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB;AACd,WAAO,KAAK;AAAA,EACd;AACF;AACA,MAAM,cAAc;AAAA,EAClB,YAAY,UAAU,cAAc,QAAQ,SAAS;AACnD,SAAK,UAA0B,oBAAI,IAAG;AACtC,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,SAAS;AACd,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA;AAAA,EAEA,SAAS,QAAQ,QAAQ;AACvB,QAAI,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG;AAC/B,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,yBAAyB;AAAA,IAC/D;AACA,SAAK,eAAe,MAAM;AAC1B,UAAM,MAAM,IAAI,UAAU,OAAO,IAAI;AAAA,MACnC,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,WAAW,CAAC,OAAO,KAAK,eAAe,EAAE;AAAA,IAC/C,CAAK;AACD,SAAK,QAAQ,IAAI,OAAO,IAAI;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,YAAY,CAAA;AAAA,MACZ;AAAA,IACN,CAAK;AACD,SAAK,OAAO,KAAK,sBAAsB,OAAO,EAAE,EAAE;AAClD,SAAK,SAAS,KAAK,qBAAqB,EAAE,MAAM,OAAO,IAAI,MAAM,OAAO,KAAI,CAAE;AAAA,EAChF;AAAA;AAAA,EAEA,MAAM,WAAW,IAAI;AACnB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,OAAQ;AACb,QAAI,OAAO,UAAU,SAAS;AAC5B,YAAM,KAAK,cAAc,EAAE;AAAA,IAC7B;AACA,SAAK,QAAQ,OAAO,EAAE;AACtB,SAAK,OAAO,KAAK,wBAAwB,EAAE,EAAE;AAAA,EAC/C;AAAA;AAAA,EAEA,MAAM,UAAU;AACd,UAAM,QAAQ,KAAK,uBAAsB;AACzC,eAAW,MAAM,OAAO;AACtB,YAAM,KAAK,WAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM,WAAW,IAAI;AACnB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,EAAE,aAAa;AAAA,IAC5C;AACA,QAAI,OAAO,UAAU,QAAS;AAC9B,QAAI,OAAO,UAAU,gBAAgB;AACnC,YAAM,IAAI,MAAM,WAAW,EAAE,0DAA0D;AAAA,IACzF;AACA,eAAW,SAAS,OAAO,OAAO,gBAAgB,CAAA,GAAI;AACpD,YAAM,MAAM,KAAK,QAAQ,IAAI,KAAK;AAClC,UAAI,CAAC,KAAK;AACR,cAAM,IAAI,MAAM,WAAW,EAAE,gCAAgC,KAAK,GAAG;AAAA,MACvE;AACA,UAAI,IAAI,UAAU,SAAS;AACzB,cAAM,KAAK,WAAW,KAAK;AAAA,MAC7B;AAAA,IACF;AACA,QAAI;AACF,aAAO,QAAQ;AACf,UAAI,OAAO,OAAO,eAAe;AAC/B,cAAM,QAAQ,KAAK,aAAa,UAAU,OAAO,OAAO,cAAc,KAAK,OAAO,MAAM,CAAC;AACzF,eAAO,IAAI,UAAU,KAAK;AAAA,MAC5B;AACA,UAAI,OAAO,OAAO,SAAS;AACzB,cAAM,QAAQ,KAAK,SAAS,GAAG,SAAS,CAAC,QAAQ;AAC/C,iBAAO,OAAO,UAAU,IAAI,iBAAiB,IAAI,MAAM,IAAI,OAAO,CAAC;AAAA,QACrE,CAAC;AACD,eAAO,IAAI,UAAU,KAAK;AAAA,MAC5B;AACA,YAAM,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM;AAClD,aAAO,QAAQ;AACf,WAAK,OAAO,KAAK,iBAAiB,EAAE,EAAE;AACtC,WAAK,SAAS,KAAK,iBAAiB,EAAE,MAAM,IAAI;AAAA,IAClD,SAAS,OAAO;AACd,aAAO,QAAQ;AACf,aAAO,QAAQ;AACf,WAAK,OAAO,MAAM,uBAAuB,EAAE,IAAI,EAAE,OAAO;AACxD,WAAK,SAAS,KAAK,gBAAgB,EAAE,MAAM,IAAI,OAAO;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,QAAQ,KAAK,uBAAsB,EAAG,QAAO;AACnD,eAAW,MAAM,OAAO;AACtB,YAAM,KAAK,cAAc,EAAE;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM,cAAc,IAAI;AACtB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,UAAU,OAAO,UAAU,QAAS;AACzC,QAAI;AACF,YAAM,OAAO,OAAO,QAAO;AAC3B,aAAO,IAAI,YAAW;AACtB,aAAO,QAAQ;AACf,WAAK,OAAO,KAAK,qBAAqB,EAAE,EAAE;AAC1C,WAAK,SAAS,KAAK,oBAAoB,EAAE,MAAM,IAAI;AAAA,IACrD,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,0BAA0B,EAAE,IAAI,EAAE,OAAO;AAC3D,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAEA,UAAU,IAAI;AACZ,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,WAAO,SAAS,OAAO,SAAS;AAAA,EAClC;AAAA;AAAA,EAEA,eAAe,IAAI;AACjB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,WAAO,QAAQ,UAAU,UAAU,OAAO,SAAS;AAAA,EACrD;AAAA;AAAA,EAEA,UAAU,IAAI;AACZ,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA;AAAA,EAEA,eAAe,IAAI;AACjB,WAAO,KAAK,QAAQ,IAAI,EAAE,GAAG,SAAS;AAAA,EACxC;AAAA;AAAA,EAEA,eAAe;AACb,WAAO,MAAM,KAAK,KAAK,QAAQ,KAAI,CAAE;AAAA,EACvC;AAAA;AAAA,EAEA,kBAAkB;AAChB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAM,CAAE,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,EACjG;AAAA;AAAA,EAEA,iBAAiB,MAAM;AACrB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAM,CAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,EACpG;AAAA;AAAA,EAEA,eAAe,QAAQ;AACrB,UAAM,YAAY,KAAK,iBAAiB,UAAU;AAClD,eAAW,YAAY,WAAW;AAChC,YAAM,UAAU,SAAS;AACzB,UAAI,OAAO,YAAY,cAAc,QAAQ,MAAM,GAAG;AACpD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,yBAAyB;AACvB,UAAM,UAA0B,oBAAI,IAAG;AACvC,UAAM,WAA2B,oBAAI,IAAG;AACxC,UAAM,SAAS,CAAA;AACf,UAAM,QAAQ,CAAC,IAAI,OAAO,CAAA,MAAO;AAC/B,UAAI,QAAQ,IAAI,EAAE,EAAG;AACrB,UAAI,SAAS,IAAI,EAAE,GAAG;AACpB,cAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,EAAE,KAAK,MAAM;AACvC,cAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,MAC1D;AACA,YAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,UAAI,CAAC,OAAQ;AACb,eAAS,IAAI,EAAE;AACf,iBAAW,SAAS,OAAO,OAAO,gBAAgB,CAAA,GAAI;AACpD,YAAI,KAAK,QAAQ,IAAI,KAAK,GAAG;AAC3B,gBAAM,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;AAAA,QAC5B;AAAA,MACF;AACA,eAAS,OAAO,EAAE;AAClB,cAAQ,IAAI,EAAE;AACd,aAAO,KAAK,EAAE;AAAA,IAChB;AACA,eAAW,MAAM,KAAK,QAAQ,KAAI,GAAI;AACpC,YAAM,EAAE;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,eAAe,QAAQ;AACrB,QAAI,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO,UAAU;AAC/C,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,QAAI,CAAC,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AACnD,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,0BAA0B;AAAA,IAChE;AACA,QAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;AACzD,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,6BAA6B;AAAA,IACnE;AACA,QAAI,CAAC,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AACnD,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,0BAA0B;AAAA,IAChE;AACA,QAAI,OAAO,OAAO,SAAS,YAAY;AACrC,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,8BAA8B;AAAA,IACpE;AACA,QAAI,OAAO,OAAO,YAAY,YAAY;AACxC,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,gCAAgC;AAAA,IACtE;AAAA,EACF;AACF;AACA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,YAAY,SAAS;AACnB,SAAK,mBAAmB;AACxB,SAAK,YAAY;AACjB,SAAK,sBAAsB;AAC3B,SAAK,oBAAoB;AACzB,QAAI,OAAO,QAAQ,cAAc,UAAU;AACzC,YAAM,KAAK,SAAS,cAAc,QAAQ,SAAS;AACnD,UAAI,CAAC,MAAM,EAAE,cAAc,cAAc;AACvC,cAAM,IAAI,MAAM,wCAAwC,QAAQ,SAAS,EAAE;AAAA,MAC7E;AACA,WAAK,YAAY;AAAA,IACnB,WAAW,QAAQ,qBAAqB,aAAa;AACnD,WAAK,YAAY,QAAQ;AAAA,IAC3B,OAAO;AACL,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AACA,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,IAAI,SAAQ;AAC5B,SAAK,eAAe,IAAI,aAAa;AAAA,MACnC,UAAU,QAAQ,YAAY;AAAA,MAC9B,MAAM,QAAQ,QAAQ;AAAA,MACtB,QAAQ,QAAQ,UAAU;AAAA,MAC1B,OAAO,QAAQ,SAAS;AAAA,IAC9B,CAAK;AACD,SAAK,SAAS,IAAI,OAAO;AAAA,MACvB,OAAO,QAAQ,YAAY;AAAA,MAC3B,OAAO;AAAA,IACb,CAAK;AACD,SAAK,eAAe,IAAI,aAAa,KAAK,UAAU,KAAK,MAAM;AAC/D,SAAK,gBAAgB,IAAI;AAAA,MACvB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,WAAW,KAAK,UAAS;AAAA,IACjC;AACI,QAAI,QAAQ,SAAS;AACnB,iBAAW,UAAU,QAAQ,SAAS;AACpC,aAAK,cAAc,SAAS,MAAM;AAAA,MACpC;AAAA,IACF;AACA,SAAK,OAAO,KAAK,8BAA8B;AAAA,MAC7C,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ,SAAS,UAAU;AAAA,IAC1C,CAAK;AACD,SAAK,SAAS,KAAK,gBAAgB,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO;AACX,SAAK,eAAc;AACnB,eAAW,CAAC,IAAI,MAAM,KAAK,KAAK,cAAc,SAAS;AACrD,UAAI,OAAO,OAAO,SAAS,cAAc,OAAO,UAAU,cAAc;AACtE,cAAM,KAAK,cAAc,WAAW,EAAE;AAAA,MACxC;AAAA,IACF;AACA,QAAI,KAAK,YAAY;AACnB,YAAM,KAAK,KAAK,KAAK,UAAU;AAAA,IACjC;AACA,WAAO,QAAQ,QAAO;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,KAAK,QAAQ;AACjB,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,KAAK,kBAAkB,EAAE,OAAM,CAAE;AAC7C,WAAK,aAAa,OAAO;AAAA,QACvB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,QACX,aAAa;AAAA,QACb,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACvB,CAAO;AACD,UAAI,KAAK,kBAAkB;AACzB,cAAM,qBAAqB,KAAK,iBAAiB;AACjD,aAAK,OAAO,KAAK,gCAAgC,EAAE,UAAU,oBAAoB;AACjF,cAAM,KAAK,cAAc,cAAc,kBAAkB;AACzD,aAAK,mBAAmB;AAAA,MAC1B;AACA,YAAM,WAAW,KAAK,cAAc,eAAe,MAAM;AACzD,UAAI,CAAC,UAAU;AACb,aAAK,aAAa;AAAA,UAChB,UAAU;AAAA,UACV,iCAAiC,MAAM;AAAA,UACvC;AAAA,YACE,OAAO;AAAA,YACP,SAAS,EAAE,OAAM;AAAA,UAC7B;AAAA,QACA;AACQ;AAAA,MACF;AACA,WAAK,mBAAmB;AACxB,WAAK,OAAO,KAAK,qBAAqB,EAAE,UAAU,SAAS,IAAI;AAC/D,YAAM,KAAK,cAAc,WAAW,SAAS,EAAE;AAC/C,WAAK,aAAa,IAAI,UAAU,EAAE,KAAK,QAAQ,MAAM,KAAK,eAAe,MAAM,EAAC,CAAE;AAClF,UAAI,OAAO,SAAS,eAAe,YAAY;AAC7C,cAAM,SAAS,WAAW,MAAM;AAAA,MAClC;AACA,UAAI,KAAK,aAAa,SAAS,UAAU,GAAG;AAC1C,cAAM,KAAK,KAAI;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO;AAAA,QAC9B,WAAW;AAAA,QACX;AAAA,MACR,CAAO;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OAAO;AACX,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,MAAM,gBAAgB;AAClC,WAAK,aAAa,OAAO;AAAA,QACvB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,eAAe;AAAA,MACvB,CAAO;AACD,WAAK,SAAS,KAAK,iBAAiB,MAAM;AAAA,IAC5C,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO,EAAE,WAAW,QAAQ;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ;AACN,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,MAAM,iBAAiB;AACnC,WAAK,sBAAsB;AAC3B,UAAI,KAAK,sBAAsB,MAAM;AACnC,qBAAa,KAAK,iBAAiB;AACnC,aAAK,oBAAoB;AAAA,MAC3B;AACA,WAAK,aAAa,OAAO;AAAA,QACvB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,eAAe;AAAA,MACvB,CAAO;AACD,WAAK,SAAS,KAAK,kBAAkB,MAAM;AAAA,IAC7C,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO,EAAE,WAAW,SAAS;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KAAK,MAAM;AACT,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,MAAM,kBAAkB,EAAE,KAAI,CAAE;AAC5C,YAAM,aAAa,KAAK,aAAa,SAAS,SAAS;AACvD,UAAI,YAAY;AACd,aAAK,sBAAsB;AAAA,MAC7B;AACA,UAAI,KAAK,sBAAsB,MAAM;AACnC,qBAAa,KAAK,iBAAiB;AACnC,aAAK,oBAAoB;AAAA,MAC3B;AACA,WAAK,SAAS,KAAK,oBAAoB,EAAE,KAAI,CAAE;AAC/C,WAAK,aAAa,IAAI,eAAe,IAAI;AACzC,UAAI,KAAK,qBAAqB;AAC5B,aAAK,oBAAoB,WAAW,MAAM;AACxC,cAAI,KAAK,uBAAuB,KAAK,aAAa,SAAS,SAAS,GAAG;AACrE,iBAAK,OAAO,MAAM,8BAA8B;AAChD,iBAAK,sBAAsB;AAC3B,iBAAK,SAAS,KAAK,iBAAiB,MAAM;AAAA,UAC5C;AACA,eAAK,oBAAoB;AAAA,QAC3B,GAAG,GAAG;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO,EAAE,WAAW,QAAQ,MAAM;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,QAAQ;AAChB,SAAK,eAAc;AACnB,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;AACrD,SAAK,aAAa,IAAI,UAAU,aAAa;AAC7C,SAAK,SAAS,KAAK,iBAAiB;AAAA,MAClC,QAAQ;AAAA,MACR,OAAO,KAAK,aAAa,SAAS,OAAO;AAAA,IAC/C,CAAK;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,OAAO;AACd,SAAK,eAAc;AACnB,SAAK,aAAa,IAAI,SAAS,KAAK;AACpC,SAAK,SAAS,KAAK,eAAe,EAAE,MAAK,CAAE;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,gBAAgB,MAAM;AACpB,SAAK,eAAc;AACnB,SAAK,aAAa,IAAI,gBAAgB,IAAI;AAC1C,SAAK,SAAS,KAAK,uBAAuB,EAAE,KAAI,CAAE;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YAAY,UAAU;AACpB,SAAK,eAAc;AACnB,SAAK,aAAa,IAAI,YAAY,QAAQ;AAC1C,SAAK,OAAO,MAAM,gBAAgB,EAAE,SAAQ,CAAE;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,GAAG,OAAO,SAAS;AACjB,SAAK,eAAc;AACnB,WAAO,KAAK,SAAS,GAAG,OAAO,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,OAAO,SAAS;AACnB,SAAK,eAAc;AACnB,WAAO,KAAK,SAAS,KAAK,OAAO,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,MAAM;AACd,SAAK,eAAc;AACnB,WAAO,KAAK,cAAc,UAAU,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,eAAe,QAAQ;AACrB,SAAK,eAAc;AACnB,SAAK,cAAc,SAAS,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,WAAW;AACT,SAAK,eAAc;AACnB,WAAO,KAAK,aAAa,SAAQ;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACb,SAAK,eAAc;AACnB,QAAI,CAAC,KAAK,iBAAkB,QAAO,CAAA;AACnC,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,SAAS,cAAc,YAAY;AAC5C,aAAO,SAAS,UAAS;AAAA,IAC3B;AACA,WAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAO;AAChB,SAAK,eAAc;AACnB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,OAAO,KAAK,0CAA0C;AAC3D;AAAA,IACF;AACA,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,SAAS,aAAa,YAAY;AAC3C,eAAS,SAAS,KAAK;AACvB,WAAK,SAAS,KAAK,kBAAkB;AAAA,QACnC,SAAS,UAAU,KAAK,SAAS,SAAS,KAAK;AAAA,QAC/C,MAAM,UAAU;AAAA,MACxB,CAAO;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,oBAAoB;AAClB,SAAK,eAAc;AACnB,QAAI,CAAC,KAAK,iBAAkB,QAAO;AACnC,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,SAAS,oBAAoB,YAAY;AAClD,aAAO,SAAS,gBAAe;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB;AACxB,SAAK,eAAc;AACnB,QAAI;AACF,UAAI,KAAK,UAAU,mBAAmB;AACpC,cAAM,KAAK,UAAU,kBAAiB;AAAA,MACxC,WAAW,KAAK,UAAU,yBAAyB;AACjD,cAAM,KAAK,UAAU,wBAAuB;AAAA,MAC9C;AACA,WAAK,aAAa,IAAI,cAAc,IAAI;AACxC,WAAK,SAAS,KAAK,qBAAqB,EAAE,YAAY,MAAM;AAAA,IAC9D,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,6BAA6B,EAAE,MAAK,CAAE;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB;AACrB,SAAK,eAAc;AACnB,QAAI;AACF,UAAI,SAAS,gBAAgB;AAC3B,cAAM,SAAS,eAAc;AAAA,MAC/B,WAAW,SAAS,sBAAsB;AACxC,cAAM,SAAS,qBAAoB;AAAA,MACrC;AACA,WAAK,aAAa,IAAI,cAAc,KAAK;AACzC,WAAK,SAAS,KAAK,qBAAqB,EAAE,YAAY,OAAO;AAAA,IAC/D,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,0BAA0B,EAAE,MAAK,CAAE;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,mBAAmB;AACvB,QAAI,KAAK,YAAY;AACnB,YAAM,KAAK,eAAc;AAAA,IAC3B,OAAO;AACL,YAAM,KAAK,kBAAiB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACf,SAAK,eAAc;AACnB,UAAM,UAAU,KAAK,cAAc,UAAU,SAAS;AACtD,QAAI,WAAW,OAAO,QAAQ,eAAe,YAAY;AACvD,cAAQ,WAAU;AAAA,IACpB,OAAO;AACL,WAAK,OAAO,KAAK,8BAA8B;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,oBAAoB;AACxB,SAAK,eAAc;AACnB,UAAM,aAAa,KAAK,cAAc,UAAU,YAAY;AAC5D,QAAI,cAAc,OAAO,WAAW,mBAAmB,YAAY;AACjE,YAAM,WAAW,eAAc;AAAA,IACjC,OAAO;AACL,WAAK,OAAO,KAAK,iCAAiC;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,cAAc;AACZ,SAAK,eAAc;AACnB,UAAM,UAAU,KAAK,cAAc,UAAU,SAAS;AACtD,QAAI,WAAW,OAAO,QAAQ,SAAS,YAAY;AACjD,cAAQ,KAAI;AAAA,IACd;AACA,UAAM,aAAa,KAAK,cAAc,UAAU,YAAY;AAC5D,QAAI,cAAc,OAAO,WAAW,gBAAgB,YAAY;AAC9D,iBAAW,YAAW;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACX,SAAK,eAAc;AACnB,UAAM,SAAS,KAAK,aAAa,SAAS,MAAM;AAChD,QAAI,CAAC,QAAQ;AACX,WAAK,OAAO,KAAK,mBAAmB;AACpC;AAAA,IACF;AACA,QAAI,KAAK,kBAAkB;AACzB,YAAM,WAAW,KAAK;AACtB,UAAI,OAAO,SAAS,gBAAgB,YAAY;AAC9C,cAAM,WAAW,SAAS,YAAW;AACrC,YAAI,UAAU,qBAAqB,QAAQ;AACzC,eAAK,KAAK,SAAS,gBAAgB;AACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,KAAK,aAAa,SAAS,UAAU;AACtD,QAAI,WAAW,GAAG;AAChB,WAAK,KAAK,QAAQ;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AACA,SAAK,OAAO,KAAK,mBAAmB;AACpC,QAAI,KAAK,sBAAsB,MAAM;AACnC,mBAAa,KAAK,iBAAiB;AACnC,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,SAAS,KAAK,kBAAkB,MAAM;AAC3C,SAAK,cAAc,WAAU;AAC7B,SAAK,SAAS,QAAO;AACrB,SAAK,aAAa,QAAO;AACzB,SAAK,YAAY;AACjB,SAAK,OAAO,KAAK,kBAAkB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACZ,WAAO,KAAK,aAAa,SAAS,SAAS;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAS;AACX,WAAO,KAAK,aAAa,SAAS,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,cAAc;AAChB,WAAO,KAAK,aAAa,SAAS,aAAa;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAW;AACb,WAAO,KAAK,aAAa,SAAS,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAS;AACX,WAAO,KAAK,aAAa,SAAS,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAQ;AACV,WAAO,KAAK,aAAa,SAAS,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,eAAe;AACjB,WAAO,KAAK,aAAa,SAAS,cAAc;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,iBAAiB;AACnB,WAAO,KAAK,aAAa,SAAS,gBAAgB;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,kBAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,aAAa;AACf,WAAO,KAAK,aAAa,SAAS,YAAY;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,OAAO;AACT,WAAO,KAAK,aAAa,SAAS,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAW;AACb,WAAO,KAAK,aAAa,SAAS,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACf,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAQ;AACrB,UAAM,MAAM,OAAO,MAAM,GAAG,EAAE,IAAG,GAAI,YAAW;AAChD,YAAQ,KAAG;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACf;AAAA,EACE;AACF;AACA,eAAe,aAAa,SAAS;AACnC,QAAM,SAAS,IAAI,eAAe,OAAO;AACzC,QAAM,OAAO,KAAI;AACjB,SAAO;AACT;ACxsEA,IAAI,iBAAiB;AACrB,IAAI,iBAAiB;AACrB,SAAS,oBAAoB;AAC3B,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,SAAO,MAAM,YAAY,+BAA+B,MAAM;AAChE;AACA,SAAS,mBAAmB;AAC1B,MAAI,gBAAgB;AAClB,WAAO,eAAe,YAAW;AAAA,EACnC;AACA,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,CAAC,EAAE,OAAO,eAAe,OAAO;AACzC;AACA,SAAS,iBAAiB;AACxB,SAAO,kBAAiB,KAAM,iBAAgB;AAChD;AACA,eAAe,YAAY;AACzB,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AACA,oBAAkB,YAAY;AAC5B,QAAI;AACF,YAAM,YAAY,MAAM,OAAO,mBAAQ;AACvC,uBAAiB,UAAU;AAC3B,UAAI,CAAC,eAAe,eAAe;AACjC,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,uBAAiB;AACjB,YAAM,IAAI;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC1F;AAAA,IACI;AAAA,EACF,GAAC;AACD,SAAO;AACT;AACA,SAAS,kBAAkB,QAAQ;AACjC,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO,IAAI,eAAe,MAAM;AAClC;AACA,SAAS,oBAAoB;AAC3B,SAAO;AACT;AAGA,SAAS,YAAY,OAAO;AAC1B,MAAI,MAAM,MAAM;AACd,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,QAAQ;AAChB,UAAM,iBAAiB;AAAA,MACrB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACX;AACI,UAAM,UAAU,OAAO,KAAK,cAAc,EAAE,IAAI,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,MAAM,CAAC,EAAE,CAAC;AACjI,QAAI,KAAK,IAAI,UAAU,MAAM,MAAM,KAAK,IAAI;AAC1C,aAAO,eAAe,OAAO;AAAA,IAC/B;AACA,WAAO,GAAG,MAAM,MAAM;AAAA,EACxB;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,cAAc,MAAM,OAAO;AAAA,EACpC;AACA,SAAO;AACT;AACA,SAAS,cAAc,SAAS;AAC9B,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA,EACtC;AACA,MAAI,WAAW,KAAK;AAClB,WAAO,GAAG,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,EACrC;AACA,SAAO,GAAG,OAAO;AACnB;AACA,SAAS,UAAU,QAAQ,cAAc;AACvC,SAAO,OAAO,IAAI,CAAC,OAAO,WAAW;AAAA,IACnC;AAAA,IACA,OAAO,MAAM,SAAS;AAAA,IACtB,QAAQ,MAAM,UAAU;AAAA,IACxB,SAAS,MAAM,WAAW;AAAA,IAC1B,OAAO,YAAY,KAAK;AAAA,IACxB,OAAO,MAAM;AAAA,EACjB,EAAI;AACJ;AAGA,IAAI,kBAAkB;AAAA,EACpB,eAAe;AAAA,EACf,aAAa;AAAA,EAEb,WAAW;AAEb;AACA,SAAS,aAAa,SAAS;AAC7B,UAAQ,SAAO;AAAA,IACb,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACb;AACA;AACA,SAAS,cAAc,MAAM;AAC3B,SAAO;AAAA,IACL,MAAM,aAAa,KAAK,IAAI;AAAA,IAC5B,SAAS,KAAK,WAAW;AAAA,IACzB,OAAO,KAAK,SAAS;AAAA,IACrB,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,EACnB;AACA;AACA,SAAS,sBAAsB,KAAK,KAAK,WAAW;AAClD,QAAM,WAAW,CAAA;AACjB,QAAM,aAAa,CAAC,OAAO,YAAY;AACrC,QAAI,GAAG,OAAO,OAAO;AACrB,aAAS,KAAK,EAAE,OAAO,QAAO,CAAE;AAAA,EAClC;AACA,aAAW,qBAAqB,CAAC,QAAQ,SAAS;AAChD,QAAI,OAAO,MAAM,uBAAuB,EAAE,QAAQ,KAAK,OAAO,QAAQ;AACtE,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,WAAW;AAAA,MAChD,IAAI,SAAS,KAAK;AAAA,MAClB,OAAO,YAAY,KAAK;AAAA,MACxB,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,QAAQ,UAAU,IAAI;AAAA,IAC5B,EAAM;AACF,QAAI,SAAS,aAAa,MAAM;AAChC,QAAI,KAAK,kBAAkB;AAAA,MACzB,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,MAAK,EAAG;AAAA,IAC9D,CAAK;AACD,cAAU,mBAAmB,KAAK,MAAM;AAAA,EAC1C,CAAC;AACD,aAAW,oBAAoB,CAAC,QAAQ,SAAS;AAC/C,UAAM,QAAQ,IAAI,OAAO,KAAK,KAAK;AACnC,UAAM,SAAS,UAAU,mBAAgB,KAAQ,IAAI;AACrD,QAAI,OAAO,MAAM,sBAAsB,EAAE,OAAO,KAAK,OAAO,QAAQ,OAAO,QAAQ,MAAM,OAAM,CAAE;AACjG,QAAI,OAAO;AACT,YAAM,QAAQ,SAAS,SAAS,YAAY,KAAK,CAAC,MAAM,YAAY,KAAK;AACzE,UAAI,SAAS,kBAAkB;AAAA,QAC7B,IAAI,SAAS,SAAS,SAAS,KAAK,KAAK;AAAA,QACzC;AAAA,QACA,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,QAAQ;AAAA,MAChB,CAAO;AAAA,IACH;AACA,QAAI,KAAK,kBAAkB;AAAA,MACzB,SAAS,QAAQ,YAAY,KAAK,IAAI;AAAA,MACtC,MAAM;AAAA,IACZ,CAAK;AACD,cAAU,kBAAkB,KAAK,KAAK;AAAA,EACxC,CAAC;AACD,aAAW,mBAAmB,MAAM;AAClC,QAAI,SAAS,aAAa,KAAK;AAC/B,cAAU,iBAAc;AAAA,EAC1B,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,aAAa,IAAI;AAAA,EAChC,CAAC;AACD,aAAW,kBAAkB,CAAC,QAAQ,SAAS;AAC7C,QAAI,KAAK,SAAS,SAAS,QAAQ;AACjC,UAAI,SAAS,QAAQ,KAAK,QAAQ,IAAI;AACtC,gBAAU,eAAY;AAAA,IACxB;AAAA,EACF,CAAC;AACD,aAAW,YAAY,CAAC,QAAQ,SAAS;AACvC,UAAM,QAAQ,cAAc,IAAI;AAChC,QAAI,OAAO,KAAK,aAAa,EAAE,MAAK,CAAE;AACtC,cAAU,UAAU,KAAK;AAAA,EAC3B,CAAC;AACD,SAAO,MAAM;AACX,eAAW,EAAE,OAAO,QAAO,KAAM,UAAU;AACzC,UAAI,IAAI,OAAO,OAAO;AAAA,IACxB;AACA,aAAS,SAAS;AAAA,EACpB;AACF;AACA,SAAS,wBAAwB,OAAO,KAAK;AAC3C,QAAM,WAAW,CAAA;AACjB,QAAM,aAAa,CAAC,OAAO,YAAY;AACrC,UAAM,iBAAiB,OAAO,OAAO;AACrC,aAAS,KAAK,EAAE,OAAO,QAAO,CAAE;AAAA,EAClC;AACA,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,IAAI;AAC5B,QAAI,SAAS,UAAU,KAAK;AAC5B,QAAI,SAAS,iBAAiB,SAAS;AAAA,EACzC,CAAC;AACD,aAAW,SAAS,MAAM;AACxB,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,SAAS,UAAU,IAAI;AAC3B,QAAI,SAAS,iBAAiB,QAAQ;AAAA,EACxC,CAAC;AACD,aAAW,SAAS,MAAM;AACxB,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,SAAS,SAAS,IAAI;AAC1B,QAAI,SAAS,iBAAiB,OAAO;AACrC,QAAI,KAAK,kBAAkB,MAAM;AAAA,EACnC,CAAC;AACD,aAAW,cAAc,MAAM;AAC7B,QAAI,SAAS,eAAe,MAAM,WAAW;AAC7C,QAAI,KAAK,uBAAuB,EAAE,aAAa,MAAM,aAAa;AAAA,EACpE,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,YAAY,MAAM,YAAY,CAAC;AAC5C,QAAI,KAAK,wBAAwB,EAAE,UAAU,MAAM,YAAY,GAAG;AAAA,EACpE,CAAC;AACD,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,IAAI;AAC5B,QAAI,SAAS,aAAa,IAAI;AAC9B,QAAI,KAAK,iBAAiB,MAAM;AAAA,EAClC,CAAC;AACD,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,SAAS,iBAAiB,OAAO;AACrC,QAAI,KAAK,iBAAiB,MAAM;AAAA,EAClC,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,aAAa,KAAK;AAC/B,QAAI,KAAK,wBAAwB,MAAM;AAAA,EACzC,CAAC;AACD,aAAW,YAAY,MAAM;AAC3B,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,YAAM,cAAc,MAAM,SAAS,IAAI,MAAM,SAAS,SAAS,CAAC;AAChE,YAAM,iBAAiB,MAAM,WAAW,IAAI,cAAc,MAAM,WAAW;AAC3E,UAAI,SAAS,kBAAkB,cAAc;AAC7C,UAAI,SAAS,YAAY,MAAM,QAAQ;AACvC,UAAI,KAAK,kBAAkB,EAAE,UAAU,eAAc,CAAE;AAAA,IACzD;AAAA,EACF,CAAC;AACD,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,IAAI;AAAA,EAC9B,CAAC;AACD,aAAW,UAAU,MAAM;AACzB,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,KAAK,mBAAmB,EAAE,MAAM,MAAM,aAAa;AAAA,EACzD,CAAC;AACD,aAAW,gBAAgB,MAAM;AAC/B,QAAI,SAAS,UAAU,MAAM,MAAM;AACnC,QAAI,SAAS,SAAS,MAAM,KAAK;AACjC,QAAI,KAAK,iBAAiB,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,OAAO;AAAA,EACxE,CAAC;AACD,aAAW,cAAc,MAAM;AAC7B,QAAI,SAAS,gBAAgB,MAAM,YAAY;AAC/C,QAAI,KAAK,uBAAuB,EAAE,MAAM,MAAM,cAAc;AAAA,EAC9D,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,YAAY,MAAM,QAAQ;AACvC,QAAI,SAAS,aAAa,MAAM,aAAa,IAAI,UAAU,OAAO;AAAA,EACpE,CAAC;AACD,aAAW,SAAS,MAAM;AACxB,UAAM,QAAQ,MAAM;AACpB,QAAI,OAAO;AACT,UAAI,OAAO,MAAM,uBAAuB,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAO,CAAE;AACpF,UAAI,KAAK,eAAe,EAAE,OAAO,IAAI,MAAM,MAAM,WAAW,sBAAsB,GAAG;AAAA,IACvF;AAAA,EACF,CAAC;AACD,aAAW,yBAAyB,MAAM;AACxC,QAAI,SAAS,OAAO,IAAI;AACxB,QAAI,OAAO,MAAM,yBAAyB;AAAA,EAC5C,CAAC;AACD,aAAW,yBAAyB,MAAM;AACxC,QAAI,SAAS,OAAO,KAAK;AACzB,QAAI,OAAO,MAAM,wBAAwB;AACzC,QAAI,CAAC,MAAM,UAAU,IAAI,SAAS,SAAS,GAAG;AAC5C,YAAM,OAAO,MAAM,MAAM;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACD,QAAM,cAAc;AACpB,MAAI,4BAA4B,OAAO;AACrC,eAAW,iCAAiC,MAAM;AAChD,YAAM,OAAO,YAAY;AACzB,YAAM,UAAU,SAAS;AACzB,UAAI,SAAS,OAAO,OAAO;AAC3B,UAAI,OAAO,MAAM,wBAAwB,IAAI,WAAW;AACxD,UAAI,SAAS,YAAY,MAAM,QAAQ;AACrC,cAAM,OAAO,MAAM,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,MAAM;AACX,eAAW,EAAE,OAAO,QAAO,KAAM,UAAU;AACzC,YAAM,oBAAoB,OAAO,OAAO;AAAA,IAC1C;AACA,aAAS,SAAS;AAAA,EACpB;AACF;AAGA,IAAI,iBAAiB;AAAA,EACnB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,cAAc;AAAA;AAAA,EAEd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AACtB;AACA,SAAS,gBAAgB,QAAQ;AAC/B,QAAM,eAAe,EAAE,GAAG,gBAAgB,GAAG,OAAM;AACnD,MAAI,MAAM;AACV,MAAI,MAAM;AACV,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,mBAAmB;AACvB,MAAI,qBAAqB;AACzB,MAAI,gBAAgB;AACpB,MAAI,oBAAoB;AACxB,MAAI,kBAAkB;AACtB,MAAI,eAAe;AACnB,MAAI,aAAa;AACjB,MAAI,mBAAmB;AACvB,QAAM,uBAAuB;AAC7B,QAAM,kBAAkB;AACxB,QAAM,mBAAmB,MAAM;AAC7B,QAAI,MAAO,QAAO;AAClB,UAAM,WAAW,KAAK,UAAU,cAAc,OAAO;AACrD,QAAI,UAAU;AACZ,cAAQ;AACR,aAAO;AAAA,IACT;AACA,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,MAAM,UAAU;AACtB,UAAM,UAAU;AAChB,UAAM,WAAW;AACjB,UAAM,cAAc;AACpB,SAAK,UAAU,YAAY,KAAK;AAChC,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM;AACpB,uBAAgB;AAChB,uBAAmB;AACnB,yBAAkB;AAClB,yBAAqB;AACrB,QAAI,cAAc;AAChB,mBAAa,YAAY;AACzB,qBAAe;AAAA,IACjB;AACA,QAAI,KAAK;AACP,UAAI,QAAO;AACX,YAAM;AAAA,IACR;AACA,iBAAa;AACb,eAAW;AACX,oBAAgB;AAChB,wBAAoB;AACpB,sBAAkB;AAClB,iBAAa;AACb,uBAAmB;AAAA,EACrB;AACA,QAAM,iBAAiB,OAAO;AAAA,IAC5B,OAAO,aAAa;AAAA,IACpB,eAAe,aAAa;AAAA,IAC5B,eAAe,aAAa;AAAA,IAC5B,YAAY;AAAA;AAAA,IAEZ,gBAAgB,aAAa;AAAA,IAC7B,iBAAiB,aAAa;AAAA,IAC9B,oBAAoB,aAAa;AAAA,IACjC,kBAAkB,aAAa;AAAA,IAC/B,cAAc,aAAa;AAAA;AAAA,IAE3B,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,IAC3B,wBAAwB;AAAA,EAC5B;AACE,QAAM,gBAAgB,CAAC,eAAe;AACpC,UAAM,YAAY,aAAa,gBAAgB;AAC/C,UAAM,gBAAgB,aAAa,sBAAsB;AACzD,WAAO,YAAY,KAAK,IAAI,eAAe,UAAU;AAAA,EACvD;AACA,QAAM,iBAAiB,CAAC,OAAO,qBAAqB;AAClD,UAAM,UAAU,mBAAmB,cAAc,MAAM,OAAO,4BAA4B,cAAc,MAAM,OAAO;AACrH,SAAK,OAAO,MAAM,SAAS,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAO,CAAE;AACvE,SAAK,SAAS,iBAAiB,OAAO;AACtC,SAAK,SAAS,aAAa,KAAK;AAChC,SAAK,KAAK,SAAS;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,WAAW,KAAK,IAAG;AAAA,IACzB,CAAK;AAAA,EACH;AACA,QAAM,iBAAiB,CAAC,UAAU;AAChC,UAAM,MAAM,kBAAiB;AAC7B,QAAI,CAAC,OAAO,CAAC,IAAK;AAClB,UAAM,MAAM,KAAK,IAAG;AACpB,QAAI,MAAM,mBAAmB,iBAAiB;AAC5C,mBAAa;AACb,yBAAmB;AAAA,IACrB,OAAO;AACL;AAAA,IACF;AACA,QAAI,cAAc,sBAAsB;AACtC,WAAK,OAAO,MAAM,oBAAoB,UAAU,OAAO,eAAe,gBAAgB;AACtF,qBAAe,OAAO,IAAI;AAC1B,yBAAgB;AAChB,yBAAmB;AACnB,UAAI,QAAO;AACX,YAAM;AACN;AAAA,IACF;AACA,QAAI,MAAM,OAAO;AACf,WAAK,OAAO,MAAM,mBAAmB,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAO,CAAE;AACjF,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK,WAAW;AACd,gBAAM,aAAa,aAAa,qBAAqB;AACrD,cAAI,qBAAqB,YAAY;AACnC,iBAAK,OAAO,MAAM,uCAAuC,iBAAiB,WAAW;AACrF,2BAAe,OAAO,IAAI;AAC1B;AAAA,UACF;AACA;AACA,gBAAM,QAAQ,cAAc,oBAAoB,CAAC;AACjD,eAAK,OAAO,KAAK,8CAA8C,iBAAiB,IAAI,UAAU,QAAQ,KAAK,IAAI;AAC/G,eAAK,KAAK,iBAAiB,EAAE,OAAO,IAAI,MAAM,MAAM,OAAO,GAAG;AAC9D,cAAI,cAAc;AAChB,yBAAa,YAAY;AAAA,UAC3B;AACA,yBAAe,WAAW,MAAM;AAC9B,gBAAI,KAAK;AACP,kBAAI,UAAS;AAAA,YACf;AAAA,UACF,GAAG,KAAK;AACR;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,gBAAM,aAAa,aAAa,mBAAmB;AACnD,cAAI,mBAAmB,YAAY;AACjC,iBAAK,OAAO,MAAM,qCAAqC,eAAe,WAAW;AACjF,2BAAe,OAAO,IAAI;AAC1B;AAAA,UACF;AACA;AACA,gBAAM,QAAQ,cAAc,kBAAkB,CAAC;AAC/C,eAAK,OAAO,KAAK,4CAA4C,eAAe,IAAI,UAAU,QAAQ,KAAK,IAAI;AAC3G,eAAK,KAAK,eAAe,EAAE,OAAO,IAAI,MAAM,MAAM,OAAO,GAAG;AAC5D,cAAI,cAAc;AAChB,yBAAa,YAAY;AAAA,UAC3B;AACA,yBAAe,WAAW,MAAM;AAC9B,gBAAI,KAAK;AACP,kBAAI,kBAAiB;AAAA,YACvB;AAAA,UACF,GAAG,KAAK;AACR;AAAA,QACF;AAAA,QACA;AACE,yBAAe,OAAO,KAAK;AAC3B;AAAA,MACV;AAAA,IACI;AAAA,EACF;AACA,QAAM,aAAa,OAAO,QAAQ;AAChC,UAAM,UAAU,iBAAgB;AAChC,eAAW;AACX,QAAI,KAAK;AACP,2BAAqB,wBAAwB,SAAS,GAAG;AAAA,IAC3D;AACA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,WAAW,MAAM;AACrB,gBAAQ,oBAAoB,kBAAkB,QAAQ;AACtD,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,aAAK,SAAS,UAAU,EAAE,KAAK,MAAM,yBAAyB;AAC9D,aAAK,KAAK,gBAAgB,EAAE,KAAK,MAAM,yBAAyB;AAChE,gBAAO;AAAA,MACT;AACA,YAAM,UAAU,MAAM;AACpB,gBAAQ,oBAAoB,kBAAkB,QAAQ;AACtD,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,cAAM,QAAQ,QAAQ;AACtB,eAAO,IAAI,MAAM,OAAO,WAAW,2BAA2B,CAAC;AAAA,MACjE;AACA,cAAQ,iBAAiB,kBAAkB,QAAQ;AACnD,cAAQ,iBAAiB,SAAS,OAAO;AACzC,cAAQ,MAAM;AACd,cAAQ,KAAI;AAAA,IACd,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,OAAO,QAAQ;AACnC,UAAM,UAAS;AACf,UAAM,UAAU,iBAAgB;AAChC,eAAW;AACX,UAAM,kBAAkB,gBAAgB;AACxC,QAAI,KAAK;AACP,2BAAqB,wBAAwB,SAAS,GAAG;AAAA,IAC3D;AACA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,CAAC,OAAO,CAAC,KAAK;AAChB,eAAO,IAAI,MAAM,qBAAqB,CAAC;AACvC;AAAA,MACF;AACA,UAAI,WAAW;AACf,yBAAmB,sBAAsB,KAAK,KAAK;AAAA,QACjD,kBAAkB,MAAM;AACtB,cAAI,CAAC,UAAU;AACb,uBAAW;AACX,iBAAK,SAAS,UAAU,EAAE,KAAK,MAAM,yBAAyB;AAC9D,iBAAK,KAAK,gBAAgB,EAAE,KAAK,MAAM,yBAAyB;AAChE,oBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,iBAAiB,MAAM;AAAA,QACvB;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,yBAAe,KAAK;AACpB,cAAI,MAAM,SAAS,CAAC,YAAY,MAAM,SAAS,aAAa,MAAM,SAAS,SAAS;AAClF,uBAAW;AACX,mBAAO,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,UACjC;AAAA,QACF;AAAA,QACA,kBAAkB,MAAM;AAAA,MAChC,CAAO;AACD,UAAI,YAAY,OAAO;AACvB,UAAI,WAAW,GAAG;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAM,SAAS;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ,KAAK;AACX,UAAI,CAAC,eAAc,EAAI,QAAO;AAC9B,YAAM,MAAM,IAAI,YAAW;AAC3B,YAAM,kBAAkB,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACtD,UAAI,gBAAgB,SAAS,OAAO,EAAG,QAAO;AAC9C,UAAI,IAAI,SAAS,uBAAuB,EAAG,QAAO;AAClD,UAAI,IAAI,SAAS,+BAA+B,EAAG,QAAO;AAC1D,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,WAAW;AACpB,YAAM;AACN,UAAI,OAAO,KAAK,wBAAwB;AACxC,YAAM,YAAY,IAAI,GAAG,iBAAiB,YAAY;AACpD,YAAI,CAAC,MAAO;AACZ,YAAI;AACF,gBAAM,MAAM,KAAI;AAAA,QAClB,SAAS,GAAG;AACV,eAAK,OAAO,MAAM,eAAe,CAAC;AAAA,QACpC;AAAA,MACF,CAAC;AACD,YAAM,aAAa,IAAI,GAAG,kBAAkB,MAAM;AAChD,eAAO,MAAK;AAAA,MACd,CAAC;AACD,YAAM,YAAY,IAAI,GAAG,oBAAoB,CAAC,EAAE,WAAW;AACzD,YAAI,CAAC,MAAO;AACZ,cAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,YAAY,CAAC,CAAC;AACnE,cAAM,cAAc;AAAA,MACtB,CAAC;AACD,YAAM,cAAc,IAAI,GAAG,iBAAiB,CAAC,EAAE,aAAa;AAC1D,YAAI,MAAO,OAAM,SAAS;AAAA,MAC5B,CAAC;AACD,YAAM,YAAY,IAAI,GAAG,eAAe,CAAC,EAAE,YAAY;AACrD,YAAI,MAAO,OAAM,QAAQ;AAAA,MAC3B,CAAC;AACD,YAAM,YAAY,IAAI,GAAG,uBAAuB,CAAC,EAAE,WAAW;AAC5D,YAAI,MAAO,OAAM,eAAe;AAAA,MAClC,CAAC;AACD,YAAM,eAAe,IAAI,GAAG,kBAAkB,CAAC,EAAE,SAAS,WAAW;AACnE,YAAI,CAAC,OAAO,UAAU;AACpB,eAAK,OAAO,KAAK,iCAAiC;AAClD;AAAA,QACF;AACA,YAAI,QAAQ,YAAY,QAAQ;AAC9B,0BAAgB;AAChB,cAAI,eAAe;AACnB,eAAK,OAAO,MAAM,iCAAiC;AACnD,eAAK,SAAS,kBAAkB;AAAA,YAC9B,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,QAAQ;AAAA,UACpB,CAAW;AAAA,QACH,OAAO;AACL,0BAAgB;AAChB,gBAAM,aAAa,SAAS,QAAQ,QAAQ,UAAU,EAAE,GAAG,EAAE;AAC7D,cAAI,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,aAAa,IAAI,OAAO,QAAQ;AAC3E,gBAAI,eAAe;AACnB,iBAAK,OAAO,MAAM,yBAAyB,UAAU,EAAE;AAAA,UACzD;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAI,UAAU,MAAM;AAClB,kBAAS;AACT,mBAAU;AACV,kBAAS;AACT,oBAAW;AACX,kBAAS;AACT,kBAAS;AACT,qBAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,IACA,MAAM,UAAU;AACd,WAAK,OAAO,KAAK,uBAAuB;AACxC,cAAO;AACP,UAAI,OAAO,YAAY;AACrB,cAAM,WAAW,YAAY,KAAK;AAAA,MACpC;AACA,cAAQ;AACR,YAAM;AAAA,IACR;AAAA,IACA,MAAM,WAAW,KAAK;AACpB,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAClD,UAAI,OAAO,KAAK,sBAAsB,EAAE,IAAG,CAAE;AAC7C,cAAO;AACP,mBAAa;AACb,UAAI,SAAS,iBAAiB,SAAS;AACvC,UAAI,SAAS,aAAa,IAAI;AAC9B,UAAI,iBAAgB,GAAI;AACtB,YAAI,OAAO,KAAK,+BAA+B;AAC/C,cAAM,cAAc,GAAG;AAAA,MACzB,WAAW,qBAAqB;AAC9B,YAAI,OAAO,KAAK,kDAAkD;AAClE,cAAM,WAAW,GAAG;AAAA,MACtB,OAAO;AACL,cAAM,IAAI,MAAM,4CAA4C;AAAA,MAC9D;AACA,UAAI,SAAS,iBAAiB,OAAO;AACrC,UAAI,SAAS,aAAa,KAAK;AAAA,IACjC;AAAA,IACA,kBAAkB;AAChB,UAAI,YAAY,CAAC,IAAK,QAAO;AAC7B,aAAO,IAAI;AAAA,IACb;AAAA,IACA,SAAS,OAAO;AACd,UAAI,YAAY,CAAC,KAAK;AACpB,aAAK,OAAO,KAAK,oDAAoD;AACrE;AAAA,MACF;AACA,UAAI,eAAe;AAAA,IACrB;AAAA,IACA,YAAY;AACV,UAAI,YAAY,CAAC,IAAK,QAAO,CAAA;AAC7B,aAAO,UAAU,IAAI,QAAQ,IAAI,YAAY;AAAA,IAC/C;AAAA,IACA,iBAAiB;AACf,aAAO;AAAA,IACT;AAAA,IACA,cAAc;AACZ,aAAO;AAAA,IACT;AAAA,IACA,cAAc;AACZ,UAAI,YAAY,CAAC,IAAK,QAAO;AAC7B,YAAM,OAAO,KAAK,SAAS,MAAM,KAAK;AACtC,UAAI,CAAC,KAAM,QAAO;AAClB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,IAAI,WAAW;AAAA,QACxB,eAAe,IAAI,iBAAiB;AAAA,QACpC,OAAO,IAAI,SAAS;AAAA,MAC5B;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,iBAAiB;AACrB,UAAI,UAAU;AACZ,aAAK,OAAO,MAAM,0BAA0B;AAC5C;AAAA,MACF;AACA,UAAI,CAAC,kBAAiB,GAAI;AACxB,aAAK,OAAO,KAAK,0CAA0C;AAC3D;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,aAAK,OAAO,KAAK,kBAAkB;AACnC;AAAA,MACF;AACA,WAAK,OAAO,KAAK,qCAAqC;AACtD,YAAM,aAAa,KAAK,SAAS,SAAS,KAAK;AAC/C,YAAM,cAAc,OAAO,eAAe;AAC1C,YAAM,WAAW;AACjB,cAAO;AACP,YAAM,WAAW,QAAQ;AACzB,UAAI,SAAS,cAAc,GAAG;AAC5B,cAAM,cAAc;AAAA,MACtB;AACA,UAAI,cAAc,OAAO;AACvB,YAAI;AACF,gBAAM,MAAM,KAAI;AAAA,QAClB,SAAS,GAAG;AACV,eAAK,OAAO,MAAM,oCAAoC;AAAA,QACxD;AAAA,MACF;AACA,WAAK,OAAO,KAAK,wBAAwB;AAAA,IAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,gBAAgB;AACpB,UAAI,CAAC,UAAU;AACb,aAAK,OAAO,MAAM,sBAAsB;AACxC;AAAA,MACF;AACA,UAAI,CAAC,iBAAgB,GAAI;AACvB,aAAK,OAAO,KAAK,sCAAsC;AACvD;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,aAAK,OAAO,KAAK,kBAAkB;AACnC;AAAA,MACF;AACA,WAAK,OAAO,KAAK,0BAA0B;AAC3C,YAAM,aAAa,KAAK,SAAS,SAAS,KAAK;AAC/C,YAAM,cAAc,OAAO,eAAe;AAC1C,YAAM,WAAW;AACjB,cAAO;AACP,YAAM,cAAc,QAAQ;AAC5B,UAAI,SAAS,cAAc,GAAG;AAC5B,cAAM,cAAc;AAAA,MACtB;AACA,UAAI,cAAc,OAAO;AACvB,YAAI;AACF,gBAAM,MAAM,KAAI;AAAA,QAClB,SAAS,GAAG;AACV,eAAK,OAAO,MAAM,oCAAoC;AAAA,QACxD;AAAA,MACF;AACA,WAAK,OAAO,KAAK,oBAAoB;AAAA,IACvC;AAAA,EACJ;AACE,SAAO;AACT;ACxvBA,IAAI,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"embed.js","sources":["../../core/dist/index.js","../../plugins/hls/dist/index.js","../../plugins/ui/dist/index.js","../src/parser.ts","../src/embed.ts","../src/index.ts"],"sourcesContent":["const effectContext = {\n current: null\n};\nlet currentEffect = null;\nfunction setCurrentEffect(effect2) {\n effectContext.current = effect2;\n currentEffect = effect2;\n}\nfunction getCurrentEffect() {\n return effectContext.current;\n}\nfunction effect(fn) {\n const execute = () => {\n setCurrentEffect(execute);\n try {\n fn();\n } catch (error) {\n console.error(\"[Scarlett Player] Error in effect:\", error);\n throw error;\n } finally {\n setCurrentEffect(null);\n }\n };\n execute();\n return () => {\n };\n}\nclass Signal {\n constructor(initialValue) {\n this.subscribers = /* @__PURE__ */ new Set();\n this.value = initialValue;\n }\n /**\n * Get the current value and track dependency if called within an effect.\n *\n * @returns Current value\n */\n get() {\n if (currentEffect) {\n this.subscribers.add(currentEffect);\n }\n return this.value;\n }\n /**\n * Set a new value and notify subscribers if changed.\n *\n * @param newValue - New value to set\n */\n set(newValue) {\n if (Object.is(this.value, newValue)) {\n return;\n }\n this.value = newValue;\n this.notify();\n }\n /**\n * Update the value using a function.\n *\n * @param updater - Function that receives current value and returns new value\n *\n * @example\n * ```ts\n * const count = new Signal(0);\n * count.update(n => n + 1); // Increments by 1\n * ```\n */\n update(updater) {\n this.set(updater(this.value));\n }\n /**\n * Subscribe to changes without automatic dependency tracking.\n *\n * @param callback - Function to call when value changes\n * @returns Unsubscribe function\n */\n subscribe(callback) {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n /**\n * Notify all subscribers of a change.\n * @internal\n */\n notify() {\n this.subscribers.forEach((subscriber) => {\n try {\n subscriber();\n } catch (error) {\n console.error(\"[Scarlett Player] Error in signal subscriber:\", error);\n }\n });\n }\n /**\n * Clean up all subscriptions.\n * Call this when destroying the signal.\n */\n destroy() {\n this.subscribers.clear();\n }\n /**\n * Get the current number of subscribers (for debugging).\n * @internal\n */\n getSubscriberCount() {\n return this.subscribers.size;\n }\n}\nfunction signal(initialValue) {\n return new Signal(initialValue);\n}\nclass Computed {\n constructor(computation) {\n this.dirty = true;\n this.subscribers = /* @__PURE__ */ new Set();\n this.dependencies = /* @__PURE__ */ new Set();\n this.computation = computation;\n this.invalidateCallback = () => this.invalidate();\n }\n /**\n * Get the computed value, tracking dependency if in effect context.\n *\n * Recomputes if dirty, otherwise returns cached value.\n *\n * @returns Computed value\n */\n get() {\n if (this.dirty) {\n const prevEffect = getCurrentEffect();\n setCurrentEffect(this.invalidateCallback);\n try {\n this.value = this.computation();\n this.dirty = false;\n } finally {\n setCurrentEffect(prevEffect);\n }\n }\n if (currentEffect) {\n this.subscribers.add(currentEffect);\n }\n return this.value;\n }\n /**\n * Mark the computed value as dirty (needs recomputation).\n *\n * Called when a dependency changes.\n * @internal\n */\n invalidate() {\n const wasDirty = this.dirty;\n this.dirty = true;\n if (!wasDirty || this.subscribers.size > 0) {\n this.notifySubscribers();\n }\n }\n /**\n * Subscribe to computed value changes.\n *\n * @param callback - Function to call when computed value may have changed\n * @returns Unsubscribe function\n */\n subscribe(callback) {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n /**\n * Notify subscribers that this computed value needs recomputation.\n * @internal\n */\n notifySubscribers() {\n this.subscribers.forEach((subscriber) => {\n try {\n subscriber();\n } catch (error) {\n console.error(\"[Scarlett Player] Error in computed subscriber:\", error);\n }\n });\n }\n /**\n * Clean up all subscriptions.\n */\n destroy() {\n this.dependencies.forEach((unsub) => unsub());\n this.dependencies.clear();\n this.subscribers.clear();\n this.value = void 0;\n this.dirty = true;\n }\n /**\n * Get the current number of subscribers (for debugging).\n * @internal\n */\n getSubscriberCount() {\n return this.subscribers.size;\n }\n}\nfunction computed(computation) {\n return new Computed(computation);\n}\nconst DEFAULT_STATE = {\n // Core Playback State\n playbackState: \"idle\",\n playing: false,\n paused: true,\n ended: false,\n buffering: false,\n waiting: false,\n seeking: false,\n // Time & Duration\n currentTime: 0,\n duration: NaN,\n buffered: null,\n bufferedAmount: 0,\n // Media Info\n mediaType: \"unknown\",\n source: null,\n title: \"\",\n poster: \"\",\n // Volume & Audio\n volume: 1,\n muted: false,\n // Playback Controls\n playbackRate: 1,\n fullscreen: false,\n pip: false,\n controlsVisible: true,\n // Quality & Tracks\n qualities: [],\n currentQuality: null,\n audioTracks: [],\n currentAudioTrack: null,\n textTracks: [],\n currentTextTrack: null,\n // Live/DVR State (TSP features)\n live: false,\n liveEdge: true,\n seekableRange: null,\n liveLatency: 0,\n lowLatencyMode: false,\n // Chapters (TSP features)\n chapters: [],\n currentChapter: null,\n // Error State\n error: null,\n // Network & Performance\n bandwidth: 0,\n autoplay: false,\n loop: false,\n // Casting State\n airplayAvailable: false,\n airplayActive: false,\n chromecastAvailable: false,\n chromecastActive: false,\n // UI State\n interacting: false,\n hovering: false,\n focused: false\n};\nclass StateManager {\n /**\n * Create a new StateManager with default initial state.\n *\n * @param initialState - Optional partial initial state (merged with defaults)\n */\n constructor(initialState) {\n this.signals = /* @__PURE__ */ new Map();\n this.changeSubscribers = /* @__PURE__ */ new Set();\n this.initializeSignals(initialState);\n }\n /**\n * Initialize all state signals with default or provided values.\n * @private\n */\n initializeSignals(overrides) {\n const initialState = { ...DEFAULT_STATE, ...overrides };\n for (const [key, value] of Object.entries(initialState)) {\n const stateKey = key;\n const stateSignal = signal(value);\n stateSignal.subscribe(() => {\n this.notifyChangeSubscribers(stateKey);\n });\n this.signals.set(stateKey, stateSignal);\n }\n }\n /**\n * Get the signal for a state property.\n *\n * @param key - State property key\n * @returns Signal for the property\n *\n * @example\n * ```ts\n * const playingSignal = state.get('playing');\n * playingSignal.get(); // false\n * playingSignal.set(true);\n * ```\n */\n get(key) {\n const stateSignal = this.signals.get(key);\n if (!stateSignal) {\n throw new Error(`[StateManager] Unknown state key: ${key}`);\n }\n return stateSignal;\n }\n /**\n * Get the current value of a state property (convenience method).\n *\n * @param key - State property key\n * @returns Current value\n *\n * @example\n * ```ts\n * state.getValue('playing'); // false\n * ```\n */\n getValue(key) {\n return this.get(key).get();\n }\n /**\n * Set the value of a state property.\n *\n * @param key - State property key\n * @param value - New value\n *\n * @example\n * ```ts\n * state.set('playing', true);\n * state.set('currentTime', 10.5);\n * ```\n */\n set(key, value) {\n this.get(key).set(value);\n }\n /**\n * Update multiple state properties at once (batch update).\n *\n * More efficient than calling set() multiple times.\n *\n * @param updates - Partial state object with updates\n *\n * @example\n * ```ts\n * state.update({\n * playing: true,\n * currentTime: 0,\n * volume: 1.0,\n * });\n * ```\n */\n update(updates) {\n for (const [key, value] of Object.entries(updates)) {\n const stateKey = key;\n if (this.signals.has(stateKey)) {\n this.set(stateKey, value);\n }\n }\n }\n /**\n * Subscribe to changes on a specific state property.\n *\n * @param key - State property key\n * @param callback - Callback function receiving new value\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = state.subscribe('playing', (value) => {\n * console.log('Playing:', value);\n * });\n * ```\n */\n subscribeToKey(key, callback) {\n const stateSignal = this.get(key);\n return stateSignal.subscribe(() => {\n callback(stateSignal.get());\n });\n }\n /**\n * Subscribe to all state changes.\n *\n * Receives a StateChangeEvent for every state property change.\n *\n * @param callback - Callback function receiving change events\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = state.subscribe((event) => {\n * console.log(`${event.key} changed:`, event.value);\n * });\n * ```\n */\n subscribe(callback) {\n this.changeSubscribers.add(callback);\n return () => this.changeSubscribers.delete(callback);\n }\n /**\n * Notify all global change subscribers.\n * @private\n */\n notifyChangeSubscribers(key) {\n const stateSignal = this.get(key);\n const value = stateSignal.get();\n const event = {\n key,\n value,\n previousValue: value\n // Note: We don't track previous values in this simple impl\n };\n this.changeSubscribers.forEach((subscriber) => {\n try {\n subscriber(event);\n } catch (error) {\n console.error(\"[StateManager] Error in change subscriber:\", error);\n }\n });\n }\n /**\n * Reset all state to default values.\n *\n * @example\n * ```ts\n * state.reset();\n * ```\n */\n reset() {\n this.update(DEFAULT_STATE);\n }\n /**\n * Reset a specific state property to its default value.\n *\n * @param key - State property key\n *\n * @example\n * ```ts\n * state.resetKey('playing');\n * ```\n */\n resetKey(key) {\n const defaultValue = DEFAULT_STATE[key];\n this.set(key, defaultValue);\n }\n /**\n * Get a snapshot of all current state values.\n *\n * @returns Frozen snapshot of current state\n *\n * @example\n * ```ts\n * const snapshot = state.snapshot();\n * console.log(snapshot.playing, snapshot.currentTime);\n * ```\n */\n snapshot() {\n const snapshot = {};\n for (const [key, stateSignal] of this.signals) {\n snapshot[key] = stateSignal.get();\n }\n return Object.freeze(snapshot);\n }\n /**\n * Get the number of subscribers for a state property (for debugging).\n *\n * @param key - State property key\n * @returns Number of subscribers\n * @internal\n */\n getSubscriberCount(key) {\n return this.signals.get(key)?.getSubscriberCount() ?? 0;\n }\n /**\n * Destroy the state manager and cleanup all signals.\n *\n * @example\n * ```ts\n * state.destroy();\n * ```\n */\n destroy() {\n this.signals.forEach((stateSignal) => stateSignal.destroy());\n this.signals.clear();\n this.changeSubscribers.clear();\n }\n}\nconst DEFAULT_OPTIONS = {\n maxListeners: 100,\n async: false,\n interceptors: true\n};\nclass EventBus {\n /**\n * Create a new EventBus.\n *\n * @param options - Optional configuration\n */\n constructor(options) {\n this.listeners = /* @__PURE__ */ new Map();\n this.onceListeners = /* @__PURE__ */ new Map();\n this.interceptors = /* @__PURE__ */ new Map();\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = events.on('playback:play', () => {\n * console.log('Playing!');\n * });\n *\n * // Later: unsubscribe\n * unsub();\n * ```\n */\n on(event, handler) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, /* @__PURE__ */ new Set());\n }\n const handlers = this.listeners.get(event);\n handlers.add(handler);\n this.checkMaxListeners(event);\n return () => this.off(event, handler);\n }\n /**\n * Subscribe to an event once (auto-unsubscribe after first call).\n *\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * events.once('player:ready', () => {\n * console.log('Player ready!');\n * });\n * ```\n */\n once(event, handler) {\n if (!this.onceListeners.has(event)) {\n this.onceListeners.set(event, /* @__PURE__ */ new Set());\n }\n const handlers = this.onceListeners.get(event);\n handlers.add(handler);\n if (!this.listeners.has(event)) {\n this.listeners.set(event, /* @__PURE__ */ new Set());\n }\n return () => {\n handlers.delete(handler);\n };\n }\n /**\n * Unsubscribe from an event.\n *\n * @param event - Event name\n * @param handler - Event handler function to remove\n *\n * @example\n * ```ts\n * const handler = () => console.log('Playing!');\n * events.on('playback:play', handler);\n * events.off('playback:play', handler);\n * ```\n */\n off(event, handler) {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.listeners.delete(event);\n }\n }\n const onceHandlers = this.onceListeners.get(event);\n if (onceHandlers) {\n onceHandlers.delete(handler);\n if (onceHandlers.size === 0) {\n this.onceListeners.delete(event);\n }\n }\n }\n /**\n * Emit an event synchronously.\n *\n * Runs interceptors first, then calls all handlers.\n *\n * @param event - Event name\n * @param payload - Event payload\n *\n * @example\n * ```ts\n * events.emit('playback:play', undefined);\n * events.emit('playback:timeupdate', { currentTime: 10.5 });\n * ```\n */\n emit(event, payload) {\n const interceptedPayload = this.runInterceptors(event, payload);\n if (interceptedPayload === null) {\n return;\n }\n const handlers = this.listeners.get(event);\n if (handlers) {\n const handlersArray = Array.from(handlers);\n handlersArray.forEach((handler) => {\n this.safeCallHandler(handler, interceptedPayload);\n });\n }\n const onceHandlers = this.onceListeners.get(event);\n if (onceHandlers) {\n const handlersArray = Array.from(onceHandlers);\n handlersArray.forEach((handler) => {\n this.safeCallHandler(handler, interceptedPayload);\n });\n this.onceListeners.delete(event);\n }\n }\n /**\n * Emit an event asynchronously (next tick).\n *\n * @param event - Event name\n * @param payload - Event payload\n * @returns Promise that resolves when all handlers complete\n *\n * @example\n * ```ts\n * await events.emitAsync('media:loaded', { src: 'video.mp4', type: 'video/mp4' });\n * ```\n */\n async emitAsync(event, payload) {\n const interceptedPayload = await this.runInterceptorsAsync(event, payload);\n if (interceptedPayload === null) {\n return;\n }\n const handlers = this.listeners.get(event);\n if (handlers) {\n const promises = Array.from(handlers).map(\n (handler) => this.safeCallHandlerAsync(handler, interceptedPayload)\n );\n await Promise.all(promises);\n }\n const onceHandlers = this.onceListeners.get(event);\n if (onceHandlers) {\n const handlersArray = Array.from(onceHandlers);\n const promises = handlersArray.map(\n (handler) => this.safeCallHandlerAsync(handler, interceptedPayload)\n );\n await Promise.all(promises);\n this.onceListeners.delete(event);\n }\n }\n /**\n * Add an event interceptor.\n *\n * Interceptors run before handlers and can modify or cancel events.\n *\n * @param event - Event name\n * @param interceptor - Interceptor function\n * @returns Remove interceptor function\n *\n * @example\n * ```ts\n * events.intercept('playback:timeupdate', (payload) => {\n * // Round time to 2 decimals\n * return { currentTime: Math.round(payload.currentTime * 100) / 100 };\n * });\n *\n * // Cancel events\n * events.intercept('playback:play', (payload) => {\n * if (notReady) return null; // Cancel event\n * return payload;\n * });\n * ```\n */\n intercept(event, interceptor) {\n if (!this.options.interceptors) {\n return () => {\n };\n }\n if (!this.interceptors.has(event)) {\n this.interceptors.set(event, /* @__PURE__ */ new Set());\n }\n const interceptorsSet = this.interceptors.get(event);\n interceptorsSet.add(interceptor);\n return () => {\n interceptorsSet.delete(interceptor);\n if (interceptorsSet.size === 0) {\n this.interceptors.delete(event);\n }\n };\n }\n /**\n * Remove all listeners for an event (or all events if no event specified).\n *\n * @param event - Optional event name\n *\n * @example\n * ```ts\n * events.removeAllListeners('playback:play'); // Remove all playback:play listeners\n * events.removeAllListeners(); // Remove ALL listeners\n * ```\n */\n removeAllListeners(event) {\n if (event) {\n this.listeners.delete(event);\n this.onceListeners.delete(event);\n } else {\n this.listeners.clear();\n this.onceListeners.clear();\n }\n }\n /**\n * Get the number of listeners for an event.\n *\n * @param event - Event name\n * @returns Number of listeners\n *\n * @example\n * ```ts\n * events.listenerCount('playback:play'); // 3\n * ```\n */\n listenerCount(event) {\n const regularCount = this.listeners.get(event)?.size ?? 0;\n const onceCount = this.onceListeners.get(event)?.size ?? 0;\n return regularCount + onceCount;\n }\n /**\n * Destroy event bus and cleanup all listeners/interceptors.\n *\n * @example\n * ```ts\n * events.destroy();\n * ```\n */\n destroy() {\n this.listeners.clear();\n this.onceListeners.clear();\n this.interceptors.clear();\n }\n /**\n * Run interceptors synchronously.\n * @private\n */\n runInterceptors(event, payload) {\n if (!this.options.interceptors) {\n return payload;\n }\n const interceptorsSet = this.interceptors.get(event);\n if (!interceptorsSet || interceptorsSet.size === 0) {\n return payload;\n }\n let currentPayload = payload;\n for (const interceptor of interceptorsSet) {\n try {\n currentPayload = interceptor(currentPayload);\n if (currentPayload === null) {\n return null;\n }\n } catch (error) {\n console.error(\"[EventBus] Error in interceptor:\", error);\n }\n }\n return currentPayload;\n }\n /**\n * Run interceptors asynchronously.\n * @private\n */\n async runInterceptorsAsync(event, payload) {\n if (!this.options.interceptors) {\n return payload;\n }\n const interceptorsSet = this.interceptors.get(event);\n if (!interceptorsSet || interceptorsSet.size === 0) {\n return payload;\n }\n let currentPayload = payload;\n for (const interceptor of interceptorsSet) {\n try {\n const result = interceptor(currentPayload);\n currentPayload = result instanceof Promise ? await result : result;\n if (currentPayload === null) {\n return null;\n }\n } catch (error) {\n console.error(\"[EventBus] Error in interceptor:\", error);\n }\n }\n return currentPayload;\n }\n /**\n * Safely call a handler with error handling.\n * @private\n */\n safeCallHandler(handler, payload) {\n try {\n handler(payload);\n } catch (error) {\n console.error(\"[EventBus] Error in event handler:\", error);\n }\n }\n /**\n * Safely call a handler asynchronously with error handling.\n * @private\n */\n async safeCallHandlerAsync(handler, payload) {\n try {\n const result = handler(payload);\n if (result instanceof Promise) {\n await result;\n }\n } catch (error) {\n console.error(\"[EventBus] Error in event handler:\", error);\n }\n }\n /**\n * Check if max listeners exceeded and warn.\n * @private\n */\n checkMaxListeners(event) {\n const count = this.listenerCount(event);\n if (count > this.options.maxListeners) {\n console.warn(\n `[EventBus] Max listeners (${this.options.maxListeners}) exceeded for event: ${event}. Current count: ${count}. This may indicate a memory leak.`\n );\n }\n }\n}\nconst LOG_LEVELS = [\"debug\", \"info\", \"warn\", \"error\"];\nconst defaultConsoleHandler = (entry) => {\n const prefix = entry.scope ? `[${entry.scope}]` : \"[ScarlettPlayer]\";\n const message = `${prefix} ${entry.message}`;\n const metadata = entry.metadata ?? \"\";\n switch (entry.level) {\n case \"debug\":\n console.debug(message, metadata);\n break;\n case \"info\":\n console.info(message, metadata);\n break;\n case \"warn\":\n console.warn(message, metadata);\n break;\n case \"error\":\n console.error(message, metadata);\n break;\n }\n};\nclass Logger {\n /**\n * Create a new Logger.\n *\n * @param options - Logger configuration\n */\n constructor(options) {\n this.level = options?.level ?? \"warn\";\n this.scope = options?.scope;\n this.enabled = options?.enabled ?? true;\n this.handlers = options?.handlers ?? [defaultConsoleHandler];\n }\n /**\n * Create a child logger with a scope.\n *\n * Child loggers inherit parent settings and chain scopes.\n *\n * @param scope - Child logger scope\n * @returns New child logger\n *\n * @example\n * ```ts\n * const logger = new Logger();\n * const hlsLogger = logger.child('hls-plugin');\n * hlsLogger.info('Loading manifest');\n * // Output: [ScarlettPlayer:hls-plugin] Loading manifest\n * ```\n */\n child(scope) {\n return new Logger({\n level: this.level,\n scope: this.scope ? `${this.scope}:${scope}` : scope,\n enabled: this.enabled,\n handlers: this.handlers\n });\n }\n /**\n * Log a debug message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.debug('Request sent', { url: '/api/video' });\n * ```\n */\n debug(message, metadata) {\n this.log(\"debug\", message, metadata);\n }\n /**\n * Log an info message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.info('Player ready');\n * ```\n */\n info(message, metadata) {\n this.log(\"info\", message, metadata);\n }\n /**\n * Log a warning message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.warn('Low buffer', { buffered: 2.5 });\n * ```\n */\n warn(message, metadata) {\n this.log(\"warn\", message, metadata);\n }\n /**\n * Log an error message.\n *\n * @param message - Log message\n * @param metadata - Optional structured metadata\n *\n * @example\n * ```ts\n * logger.error('Playback failed', { code: 'MEDIA_ERR_DECODE' });\n * ```\n */\n error(message, metadata) {\n this.log(\"error\", message, metadata);\n }\n /**\n * Set the minimum log level threshold.\n *\n * @param level - New log level\n *\n * @example\n * ```ts\n * logger.setLevel('debug'); // Show all logs\n * logger.setLevel('error'); // Show only errors\n * ```\n */\n setLevel(level) {\n this.level = level;\n }\n /**\n * Enable or disable logging.\n *\n * @param enabled - Enable flag\n *\n * @example\n * ```ts\n * logger.setEnabled(false); // Disable all logging\n * ```\n */\n setEnabled(enabled) {\n this.enabled = enabled;\n }\n /**\n * Add a custom log handler.\n *\n * @param handler - Log handler function\n *\n * @example\n * ```ts\n * logger.addHandler((entry) => {\n * if (entry.level === 'error') {\n * sendToAnalytics(entry);\n * }\n * });\n * ```\n */\n addHandler(handler) {\n this.handlers.push(handler);\n }\n /**\n * Remove a custom log handler.\n *\n * @param handler - Log handler function to remove\n *\n * @example\n * ```ts\n * logger.removeHandler(myHandler);\n * ```\n */\n removeHandler(handler) {\n const index = this.handlers.indexOf(handler);\n if (index !== -1) {\n this.handlers.splice(index, 1);\n }\n }\n /**\n * Core logging implementation.\n * @private\n */\n log(level, message, metadata) {\n if (!this.enabled || !this.shouldLog(level)) {\n return;\n }\n const entry = {\n level,\n message,\n timestamp: Date.now(),\n scope: this.scope,\n metadata\n };\n for (const handler of this.handlers) {\n try {\n handler(entry);\n } catch (error) {\n console.error(\"[Logger] Handler error:\", error);\n }\n }\n }\n /**\n * Check if a log level should be output.\n * @private\n */\n shouldLog(level) {\n return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(this.level);\n }\n}\nfunction createLogger(scope) {\n return new Logger({ scope });\n}\nvar ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {\n ErrorCode2[\"SOURCE_NOT_SUPPORTED\"] = \"SOURCE_NOT_SUPPORTED\";\n ErrorCode2[\"SOURCE_LOAD_FAILED\"] = \"SOURCE_LOAD_FAILED\";\n ErrorCode2[\"PROVIDER_NOT_FOUND\"] = \"PROVIDER_NOT_FOUND\";\n ErrorCode2[\"PROVIDER_SETUP_FAILED\"] = \"PROVIDER_SETUP_FAILED\";\n ErrorCode2[\"PLUGIN_SETUP_FAILED\"] = \"PLUGIN_SETUP_FAILED\";\n ErrorCode2[\"PLUGIN_NOT_FOUND\"] = \"PLUGIN_NOT_FOUND\";\n ErrorCode2[\"PLAYBACK_FAILED\"] = \"PLAYBACK_FAILED\";\n ErrorCode2[\"MEDIA_DECODE_ERROR\"] = \"MEDIA_DECODE_ERROR\";\n ErrorCode2[\"MEDIA_NETWORK_ERROR\"] = \"MEDIA_NETWORK_ERROR\";\n ErrorCode2[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n return ErrorCode2;\n})(ErrorCode || {});\nclass ErrorHandler {\n /**\n * Create a new ErrorHandler.\n *\n * @param eventBus - Event bus for error emission\n * @param logger - Logger for error logging\n * @param options - Optional configuration\n */\n constructor(eventBus, logger, options) {\n this.errors = [];\n this.eventBus = eventBus;\n this.logger = logger;\n this.maxHistory = options?.maxHistory ?? 10;\n }\n /**\n * Handle an error.\n *\n * Normalizes, logs, emits, and tracks the error.\n *\n * @param error - Error to handle (native or PlayerError)\n * @param context - Optional context (what was happening)\n * @returns Normalized PlayerError\n *\n * @example\n * ```ts\n * try {\n * loadVideo();\n * } catch (error) {\n * errorHandler.handle(error as Error, { src: 'video.mp4' });\n * }\n * ```\n */\n handle(error, context) {\n const playerError = this.normalizeError(error, context);\n this.addToHistory(playerError);\n this.logError(playerError);\n this.eventBus.emit(\"error\", playerError);\n return playerError;\n }\n /**\n * Create and handle an error from code.\n *\n * @param code - Error code\n * @param message - Error message\n * @param options - Optional error options\n * @returns Created PlayerError\n *\n * @example\n * ```ts\n * errorHandler.throw(\n * ErrorCode.SOURCE_NOT_SUPPORTED,\n * 'MP4 not supported',\n * { fatal: true, context: { type: 'video/mp4' } }\n * );\n * ```\n */\n throw(code, message, options) {\n const error = {\n code,\n message,\n fatal: options?.fatal ?? this.isFatalCode(code),\n timestamp: Date.now(),\n context: options?.context,\n originalError: options?.originalError\n };\n return this.handle(error, options?.context);\n }\n /**\n * Get error history.\n *\n * @returns Readonly copy of error history\n *\n * @example\n * ```ts\n * const history = errorHandler.getHistory();\n * console.log(`${history.length} errors occurred`);\n * ```\n */\n getHistory() {\n return [...this.errors];\n }\n /**\n * Get last error that occurred.\n *\n * @returns Last error or null if none\n *\n * @example\n * ```ts\n * const lastError = errorHandler.getLastError();\n * if (lastError?.fatal) {\n * showErrorMessage(lastError.message);\n * }\n * ```\n */\n getLastError() {\n return this.errors[this.errors.length - 1] ?? null;\n }\n /**\n * Clear error history.\n *\n * @example\n * ```ts\n * errorHandler.clearHistory();\n * ```\n */\n clearHistory() {\n this.errors = [];\n }\n /**\n * Check if any fatal errors occurred.\n *\n * @returns True if any fatal error in history\n *\n * @example\n * ```ts\n * if (errorHandler.hasFatalError()) {\n * player.reset();\n * }\n * ```\n */\n hasFatalError() {\n return this.errors.some((e) => e.fatal);\n }\n /**\n * Normalize error to PlayerError.\n * @private\n */\n normalizeError(error, context) {\n if (this.isPlayerError(error)) {\n return {\n ...error,\n context: { ...error.context, ...context }\n };\n }\n return {\n code: this.getErrorCode(error),\n message: error.message,\n fatal: this.isFatal(error),\n timestamp: Date.now(),\n context,\n originalError: error\n };\n }\n /**\n * Determine error code from native Error.\n * @private\n */\n getErrorCode(error) {\n const message = error.message.toLowerCase();\n if (message.includes(\"network\")) {\n return \"MEDIA_NETWORK_ERROR\";\n }\n if (message.includes(\"decode\")) {\n return \"MEDIA_DECODE_ERROR\";\n }\n if (message.includes(\"source\")) {\n return \"SOURCE_LOAD_FAILED\";\n }\n if (message.includes(\"plugin\")) {\n return \"PLUGIN_SETUP_FAILED\";\n }\n if (message.includes(\"provider\")) {\n return \"PROVIDER_SETUP_FAILED\";\n }\n return \"UNKNOWN_ERROR\";\n }\n /**\n * Determine if error is fatal.\n * @private\n */\n isFatal(error) {\n return this.isFatalCode(this.getErrorCode(error));\n }\n /**\n * Determine if error code is fatal.\n * @private\n */\n isFatalCode(code) {\n const fatalCodes = [\n \"SOURCE_NOT_SUPPORTED\",\n \"PROVIDER_NOT_FOUND\",\n \"MEDIA_DECODE_ERROR\"\n /* MEDIA_DECODE_ERROR */\n ];\n return fatalCodes.includes(code);\n }\n /**\n * Type guard for PlayerError.\n * @private\n */\n isPlayerError(error) {\n return typeof error === \"object\" && error !== null && \"code\" in error && \"message\" in error && \"fatal\" in error && \"timestamp\" in error;\n }\n /**\n * Add error to history.\n * @private\n */\n addToHistory(error) {\n this.errors.push(error);\n if (this.errors.length > this.maxHistory) {\n this.errors.shift();\n }\n }\n /**\n * Log error with appropriate level.\n * @private\n */\n logError(error) {\n const logMessage = `[${error.code}] ${error.message}`;\n if (error.fatal) {\n this.logger.error(logMessage, {\n code: error.code,\n context: error.context\n });\n } else {\n this.logger.warn(logMessage, {\n code: error.code,\n context: error.context\n });\n }\n }\n}\nclass PluginAPI {\n /**\n * Create a new PluginAPI.\n *\n * @param pluginId - ID of the plugin this API belongs to\n * @param deps - Dependencies (stateManager, eventBus, logger, container, getPlugin)\n */\n constructor(pluginId, deps) {\n this.cleanupFns = [];\n this.pluginId = pluginId;\n this.stateManager = deps.stateManager;\n this.eventBus = deps.eventBus;\n this.container = deps.container;\n this.getPluginFn = deps.getPlugin;\n this.logger = {\n debug: (msg, metadata) => deps.logger.debug(`[${pluginId}] ${msg}`, metadata),\n info: (msg, metadata) => deps.logger.info(`[${pluginId}] ${msg}`, metadata),\n warn: (msg, metadata) => deps.logger.warn(`[${pluginId}] ${msg}`, metadata),\n error: (msg, metadata) => deps.logger.error(`[${pluginId}] ${msg}`, metadata)\n };\n }\n /**\n * Get a state value.\n *\n * @param key - State property key\n * @returns Current state value\n */\n getState(key) {\n return this.stateManager.getValue(key);\n }\n /**\n * Set a state value.\n *\n * @param key - State property key\n * @param value - New state value\n */\n setState(key, value) {\n this.stateManager.set(key, value);\n }\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n on(event, handler) {\n return this.eventBus.on(event, handler);\n }\n /**\n * Unsubscribe from an event.\n *\n * @param event - Event name\n * @param handler - Event handler to remove\n */\n off(event, handler) {\n this.eventBus.off(event, handler);\n }\n /**\n * Emit an event.\n *\n * @param event - Event name\n * @param payload - Event payload\n */\n emit(event, payload) {\n this.eventBus.emit(event, payload);\n }\n /**\n * Get another plugin by ID (if ready).\n *\n * @param id - Plugin ID\n * @returns Plugin instance or null if not found/ready\n */\n getPlugin(id) {\n return this.getPluginFn(id);\n }\n /**\n * Register a cleanup function to run when plugin is destroyed.\n *\n * @param cleanup - Cleanup function\n */\n onDestroy(cleanup) {\n this.cleanupFns.push(cleanup);\n }\n /**\n * Subscribe to state changes.\n *\n * @param callback - Callback function called on any state change\n * @returns Unsubscribe function\n */\n subscribeToState(callback) {\n return this.stateManager.subscribe(callback);\n }\n /**\n * Run all registered cleanup functions.\n * Called by PluginManager when destroying the plugin.\n *\n * @internal\n */\n runCleanups() {\n for (const cleanup of this.cleanupFns) {\n try {\n cleanup();\n } catch (error) {\n this.logger.error(\"Cleanup function failed\", { error });\n }\n }\n this.cleanupFns = [];\n }\n /**\n * Get all registered cleanup functions.\n *\n * @returns Array of cleanup functions\n * @internal\n */\n getCleanupFns() {\n return this.cleanupFns;\n }\n}\nclass PluginManager {\n constructor(eventBus, stateManager, logger, options) {\n this.plugins = /* @__PURE__ */ new Map();\n this.eventBus = eventBus;\n this.stateManager = stateManager;\n this.logger = logger;\n this.container = options.container;\n }\n /** Register a plugin with optional configuration. */\n register(plugin, config) {\n if (this.plugins.has(plugin.id)) {\n throw new Error(`Plugin \"${plugin.id}\" is already registered`);\n }\n this.validatePlugin(plugin);\n const api = new PluginAPI(plugin.id, {\n stateManager: this.stateManager,\n eventBus: this.eventBus,\n logger: this.logger,\n container: this.container,\n getPlugin: (id) => this.getReadyPlugin(id)\n });\n this.plugins.set(plugin.id, {\n plugin,\n state: \"registered\",\n config,\n cleanupFns: [],\n api\n });\n this.logger.info(`Plugin registered: ${plugin.id}`);\n this.eventBus.emit(\"plugin:registered\", { name: plugin.id, type: plugin.type });\n }\n /** Unregister a plugin. Destroys it first if active. */\n async unregister(id) {\n const record = this.plugins.get(id);\n if (!record) return;\n if (record.state === \"ready\") {\n await this.destroyPlugin(id);\n }\n this.plugins.delete(id);\n this.logger.info(`Plugin unregistered: ${id}`);\n }\n /** Initialize all registered plugins in dependency order. */\n async initAll() {\n const order = this.resolveDependencyOrder();\n for (const id of order) {\n await this.initPlugin(id);\n }\n }\n /** Initialize a specific plugin. */\n async initPlugin(id) {\n const record = this.plugins.get(id);\n if (!record) {\n throw new Error(`Plugin \"${id}\" not found`);\n }\n if (record.state === \"ready\") return;\n if (record.state === \"initializing\") {\n throw new Error(`Plugin \"${id}\" is already initializing (possible circular dependency)`);\n }\n for (const depId of record.plugin.dependencies || []) {\n const dep = this.plugins.get(depId);\n if (!dep) {\n throw new Error(`Plugin \"${id}\" depends on missing plugin \"${depId}\"`);\n }\n if (dep.state !== \"ready\") {\n await this.initPlugin(depId);\n }\n }\n try {\n record.state = \"initializing\";\n if (record.plugin.onStateChange) {\n const unsub = this.stateManager.subscribe(record.plugin.onStateChange.bind(record.plugin));\n record.api.onDestroy(unsub);\n }\n if (record.plugin.onError) {\n const unsub = this.eventBus.on(\"error\", (err) => {\n record.plugin.onError?.(err.originalError || new Error(err.message));\n });\n record.api.onDestroy(unsub);\n }\n await record.plugin.init(record.api, record.config);\n record.state = \"ready\";\n this.logger.info(`Plugin ready: ${id}`);\n this.eventBus.emit(\"plugin:active\", { name: id });\n } catch (error) {\n record.state = \"error\";\n record.error = error;\n this.logger.error(`Plugin init failed: ${id}`, { error });\n this.eventBus.emit(\"plugin:error\", { name: id, error });\n throw error;\n }\n }\n /** Destroy all plugins in reverse dependency order. */\n async destroyAll() {\n const order = this.resolveDependencyOrder().reverse();\n for (const id of order) {\n await this.destroyPlugin(id);\n }\n }\n /** Destroy a specific plugin. */\n async destroyPlugin(id) {\n const record = this.plugins.get(id);\n if (!record || record.state !== \"ready\") return;\n try {\n await record.plugin.destroy();\n record.api.runCleanups();\n record.state = \"registered\";\n this.logger.info(`Plugin destroyed: ${id}`);\n this.eventBus.emit(\"plugin:destroyed\", { name: id });\n } catch (error) {\n this.logger.error(`Plugin destroy failed: ${id}`, { error });\n record.state = \"registered\";\n }\n }\n /** Get a plugin by ID (returns any registered plugin). */\n getPlugin(id) {\n const record = this.plugins.get(id);\n return record ? record.plugin : null;\n }\n /** Get a plugin by ID only if ready (used by PluginAPI). */\n getReadyPlugin(id) {\n const record = this.plugins.get(id);\n return record?.state === \"ready\" ? record.plugin : null;\n }\n /** Check if a plugin is registered. */\n hasPlugin(id) {\n return this.plugins.has(id);\n }\n /** Get plugin state. */\n getPluginState(id) {\n return this.plugins.get(id)?.state ?? null;\n }\n /** Get all registered plugin IDs. */\n getPluginIds() {\n return Array.from(this.plugins.keys());\n }\n /** Get all ready plugins. */\n getReadyPlugins() {\n return Array.from(this.plugins.values()).filter((r) => r.state === \"ready\").map((r) => r.plugin);\n }\n /** Get plugins by type. */\n getPluginsByType(type) {\n return Array.from(this.plugins.values()).filter((r) => r.plugin.type === type).map((r) => r.plugin);\n }\n /** Select a provider plugin that can play a source. */\n selectProvider(source) {\n const providers = this.getPluginsByType(\"provider\");\n for (const provider of providers) {\n const canPlay = provider.canPlay;\n if (typeof canPlay === \"function\" && canPlay(source)) {\n return provider;\n }\n }\n return null;\n }\n /** Resolve plugin initialization order using topological sort. */\n resolveDependencyOrder() {\n const visited = /* @__PURE__ */ new Set();\n const visiting = /* @__PURE__ */ new Set();\n const sorted = [];\n const visit = (id, path = []) => {\n if (visited.has(id)) return;\n if (visiting.has(id)) {\n const cycle = [...path, id].join(\" -> \");\n throw new Error(`Circular dependency detected: ${cycle}`);\n }\n const record = this.plugins.get(id);\n if (!record) return;\n visiting.add(id);\n for (const depId of record.plugin.dependencies || []) {\n if (this.plugins.has(depId)) {\n visit(depId, [...path, id]);\n }\n }\n visiting.delete(id);\n visited.add(id);\n sorted.push(id);\n };\n for (const id of this.plugins.keys()) {\n visit(id);\n }\n return sorted;\n }\n /** Validate plugin has required properties. */\n validatePlugin(plugin) {\n if (!plugin.id || typeof plugin.id !== \"string\") {\n throw new Error(\"Plugin must have a valid id\");\n }\n if (!plugin.name || typeof plugin.name !== \"string\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a valid name`);\n }\n if (!plugin.version || typeof plugin.version !== \"string\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a valid version`);\n }\n if (!plugin.type || typeof plugin.type !== \"string\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a valid type`);\n }\n if (typeof plugin.init !== \"function\") {\n throw new Error(`Plugin \"${plugin.id}\" must have an init() method`);\n }\n if (typeof plugin.destroy !== \"function\") {\n throw new Error(`Plugin \"${plugin.id}\" must have a destroy() method`);\n }\n }\n}\nclass ScarlettPlayer {\n /**\n * Create a new ScarlettPlayer.\n *\n * @param options - Player configuration\n */\n constructor(options) {\n this._currentProvider = null;\n this.destroyed = false;\n this.seekingWhilePlaying = false;\n this.seekResumeTimeout = null;\n if (typeof options.container === \"string\") {\n const el = document.querySelector(options.container);\n if (!el || !(el instanceof HTMLElement)) {\n throw new Error(`ScarlettPlayer: container not found: ${options.container}`);\n }\n this.container = el;\n } else if (options.container instanceof HTMLElement) {\n this.container = options.container;\n } else {\n throw new Error(\"ScarlettPlayer requires a valid HTMLElement container or CSS selector\");\n }\n this.initialSrc = options.src;\n this.eventBus = new EventBus();\n this.stateManager = new StateManager({\n autoplay: options.autoplay ?? false,\n loop: options.loop ?? false,\n volume: options.volume ?? 1,\n muted: options.muted ?? false\n });\n this.logger = new Logger({\n level: options.logLevel ?? \"warn\",\n scope: \"ScarlettPlayer\"\n });\n this.errorHandler = new ErrorHandler(this.eventBus, this.logger);\n this.pluginManager = new PluginManager(\n this.eventBus,\n this.stateManager,\n this.logger,\n { container: this.container }\n );\n if (options.plugins) {\n for (const plugin of options.plugins) {\n this.pluginManager.register(plugin);\n }\n }\n this.logger.info(\"ScarlettPlayer initialized\", {\n autoplay: options.autoplay,\n plugins: options.plugins?.length ?? 0\n });\n this.eventBus.emit(\"player:ready\", void 0);\n }\n /**\n * Initialize the player asynchronously.\n * Initializes non-provider plugins and loads initial source if provided.\n */\n async init() {\n this.checkDestroyed();\n for (const [id, record] of this.pluginManager.plugins) {\n if (record.plugin.type !== \"provider\" && record.state === \"registered\") {\n await this.pluginManager.initPlugin(id);\n }\n }\n if (this.initialSrc) {\n await this.load(this.initialSrc);\n }\n return Promise.resolve();\n }\n /**\n * Load a media source.\n *\n * Selects appropriate provider plugin and loads the source.\n *\n * @param source - Media source URL\n * @returns Promise that resolves when source is loaded\n *\n * @example\n * ```ts\n * await player.load('video.m3u8');\n * ```\n */\n async load(source) {\n this.checkDestroyed();\n try {\n this.logger.info(\"Loading source\", { source });\n this.stateManager.update({\n playing: false,\n paused: true,\n ended: false,\n buffering: true,\n currentTime: 0,\n duration: 0,\n bufferedAmount: 0,\n playbackState: \"loading\"\n });\n if (this._currentProvider) {\n const previousProviderId = this._currentProvider.id;\n this.logger.info(\"Destroying previous provider\", { provider: previousProviderId });\n await this.pluginManager.destroyPlugin(previousProviderId);\n this._currentProvider = null;\n }\n const provider = this.pluginManager.selectProvider(source);\n if (!provider) {\n this.errorHandler.throw(\n ErrorCode.PROVIDER_NOT_FOUND,\n `No provider found for source: ${source}`,\n {\n fatal: true,\n context: { source }\n }\n );\n return;\n }\n this._currentProvider = provider;\n this.logger.info(\"Provider selected\", { provider: provider.id });\n await this.pluginManager.initPlugin(provider.id);\n this.stateManager.set(\"source\", { src: source, type: this.detectMimeType(source) });\n if (typeof provider.loadSource === \"function\") {\n await provider.loadSource(source);\n }\n if (this.stateManager.getValue(\"autoplay\")) {\n await this.play();\n }\n } catch (error) {\n this.errorHandler.handle(error, {\n operation: \"load\",\n source\n });\n }\n }\n /**\n * Start playback.\n *\n * @returns Promise that resolves when playback starts\n *\n * @example\n * ```ts\n * await player.play();\n * ```\n */\n async play() {\n this.checkDestroyed();\n try {\n this.logger.debug(\"Play requested\");\n this.stateManager.update({\n playing: true,\n paused: false,\n playbackState: \"playing\"\n });\n this.eventBus.emit(\"playback:play\", void 0);\n } catch (error) {\n this.errorHandler.handle(error, { operation: \"play\" });\n }\n }\n /**\n * Pause playback.\n *\n * @example\n * ```ts\n * player.pause();\n * ```\n */\n pause() {\n this.checkDestroyed();\n try {\n this.logger.debug(\"Pause requested\");\n this.seekingWhilePlaying = false;\n if (this.seekResumeTimeout !== null) {\n clearTimeout(this.seekResumeTimeout);\n this.seekResumeTimeout = null;\n }\n this.stateManager.update({\n playing: false,\n paused: true,\n playbackState: \"paused\"\n });\n this.eventBus.emit(\"playback:pause\", void 0);\n } catch (error) {\n this.errorHandler.handle(error, { operation: \"pause\" });\n }\n }\n /**\n * Seek to a specific time.\n *\n * @param time - Time in seconds\n *\n * @example\n * ```ts\n * player.seek(30); // Seek to 30 seconds\n * ```\n */\n seek(time) {\n this.checkDestroyed();\n try {\n this.logger.debug(\"Seek requested\", { time });\n const wasPlaying = this.stateManager.getValue(\"playing\");\n if (wasPlaying) {\n this.seekingWhilePlaying = true;\n }\n if (this.seekResumeTimeout !== null) {\n clearTimeout(this.seekResumeTimeout);\n this.seekResumeTimeout = null;\n }\n this.eventBus.emit(\"playback:seeking\", { time });\n this.stateManager.set(\"currentTime\", time);\n if (this.seekingWhilePlaying) {\n this.seekResumeTimeout = setTimeout(() => {\n if (this.seekingWhilePlaying && this.stateManager.getValue(\"playing\")) {\n this.logger.debug(\"Resuming playback after seek\");\n this.seekingWhilePlaying = false;\n this.eventBus.emit(\"playback:play\", void 0);\n }\n this.seekResumeTimeout = null;\n }, 300);\n }\n } catch (error) {\n this.errorHandler.handle(error, { operation: \"seek\", time });\n }\n }\n /**\n * Set volume.\n *\n * @param volume - Volume 0-1\n *\n * @example\n * ```ts\n * player.setVolume(0.5); // 50% volume\n * ```\n */\n setVolume(volume) {\n this.checkDestroyed();\n const clampedVolume = Math.max(0, Math.min(1, volume));\n this.stateManager.set(\"volume\", clampedVolume);\n this.eventBus.emit(\"volume:change\", {\n volume: clampedVolume,\n muted: this.stateManager.getValue(\"muted\")\n });\n }\n /**\n * Set muted state.\n *\n * @param muted - Mute flag\n *\n * @example\n * ```ts\n * player.setMuted(true);\n * ```\n */\n setMuted(muted) {\n this.checkDestroyed();\n this.stateManager.set(\"muted\", muted);\n this.eventBus.emit(\"volume:mute\", { muted });\n }\n /**\n * Set playback rate.\n *\n * @param rate - Playback rate (e.g., 1.0 = normal, 2.0 = 2x speed)\n *\n * @example\n * ```ts\n * player.setPlaybackRate(1.5); // 1.5x speed\n * ```\n */\n setPlaybackRate(rate) {\n this.checkDestroyed();\n this.stateManager.set(\"playbackRate\", rate);\n this.eventBus.emit(\"playback:ratechange\", { rate });\n }\n /**\n * Set autoplay state.\n *\n * When enabled, videos will automatically play after loading.\n *\n * @param autoplay - Autoplay flag\n *\n * @example\n * ```ts\n * player.setAutoplay(true);\n * await player.load('video.mp4'); // Will auto-play\n * ```\n */\n setAutoplay(autoplay) {\n this.checkDestroyed();\n this.stateManager.set(\"autoplay\", autoplay);\n this.logger.debug(\"Autoplay set\", { autoplay });\n }\n /**\n * Subscribe to an event.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * const unsub = player.on('playback:play', () => {\n * console.log('Playing!');\n * });\n *\n * // Later: unsubscribe\n * unsub();\n * ```\n */\n on(event, handler) {\n this.checkDestroyed();\n return this.eventBus.on(event, handler);\n }\n /**\n * Subscribe to an event once.\n *\n * @param event - Event name\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```ts\n * player.once('player:ready', () => {\n * console.log('Player ready!');\n * });\n * ```\n */\n once(event, handler) {\n this.checkDestroyed();\n return this.eventBus.once(event, handler);\n }\n /**\n * Get a plugin by name.\n *\n * @param name - Plugin name\n * @returns Plugin instance or null\n *\n * @example\n * ```ts\n * const hls = player.getPlugin('hls-plugin');\n * ```\n */\n getPlugin(name) {\n this.checkDestroyed();\n return this.pluginManager.getPlugin(name);\n }\n /**\n * Register a plugin.\n *\n * @param plugin - Plugin to register\n *\n * @example\n * ```ts\n * player.registerPlugin(myPlugin);\n * ```\n */\n registerPlugin(plugin) {\n this.checkDestroyed();\n this.pluginManager.register(plugin);\n }\n /**\n * Get current state snapshot.\n *\n * @returns Readonly state snapshot\n *\n * @example\n * ```ts\n * const state = player.getState();\n * console.log(state.playing, state.currentTime);\n * ```\n */\n getState() {\n this.checkDestroyed();\n return this.stateManager.snapshot();\n }\n // ===== Quality Methods (proxied to provider) =====\n /**\n * Get available quality levels from the current provider.\n * @returns Array of quality levels or empty array if not available\n */\n getQualities() {\n this.checkDestroyed();\n if (!this._currentProvider) return [];\n const provider = this._currentProvider;\n if (typeof provider.getLevels === \"function\") {\n return provider.getLevels();\n }\n return [];\n }\n /**\n * Set quality level (-1 for auto).\n * @param index - Quality level index\n */\n setQuality(index) {\n this.checkDestroyed();\n if (!this._currentProvider) {\n this.logger.warn(\"No provider available for quality change\");\n return;\n }\n const provider = this._currentProvider;\n if (typeof provider.setLevel === \"function\") {\n provider.setLevel(index);\n this.eventBus.emit(\"quality:change\", {\n quality: index === -1 ? \"auto\" : `level-${index}`,\n auto: index === -1\n });\n }\n }\n /**\n * Get current quality level index (-1 = auto).\n */\n getCurrentQuality() {\n this.checkDestroyed();\n if (!this._currentProvider) return -1;\n const provider = this._currentProvider;\n if (typeof provider.getCurrentLevel === \"function\") {\n return provider.getCurrentLevel();\n }\n return -1;\n }\n // ===== Fullscreen Methods =====\n /**\n * Request fullscreen mode.\n */\n async requestFullscreen() {\n this.checkDestroyed();\n try {\n if (this.container.requestFullscreen) {\n await this.container.requestFullscreen();\n } else if (this.container.webkitRequestFullscreen) {\n await this.container.webkitRequestFullscreen();\n }\n this.stateManager.set(\"fullscreen\", true);\n this.eventBus.emit(\"fullscreen:change\", { fullscreen: true });\n } catch (error) {\n this.logger.error(\"Fullscreen request failed\", { error });\n }\n }\n /**\n * Exit fullscreen mode.\n */\n async exitFullscreen() {\n this.checkDestroyed();\n try {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n await document.webkitExitFullscreen();\n }\n this.stateManager.set(\"fullscreen\", false);\n this.eventBus.emit(\"fullscreen:change\", { fullscreen: false });\n } catch (error) {\n this.logger.error(\"Exit fullscreen failed\", { error });\n }\n }\n /**\n * Toggle fullscreen mode.\n */\n async toggleFullscreen() {\n if (this.fullscreen) {\n await this.exitFullscreen();\n } else {\n await this.requestFullscreen();\n }\n }\n // ===== Casting Methods (proxied to plugins) =====\n /**\n * Request AirPlay (proxied to airplay plugin).\n */\n requestAirPlay() {\n this.checkDestroyed();\n const airplay = this.pluginManager.getPlugin(\"airplay\");\n if (airplay && typeof airplay.showPicker === \"function\") {\n airplay.showPicker();\n } else {\n this.logger.warn(\"AirPlay plugin not available\");\n }\n }\n /**\n * Request Chromecast session (proxied to chromecast plugin).\n */\n async requestChromecast() {\n this.checkDestroyed();\n const chromecast = this.pluginManager.getPlugin(\"chromecast\");\n if (chromecast && typeof chromecast.requestSession === \"function\") {\n await chromecast.requestSession();\n } else {\n this.logger.warn(\"Chromecast plugin not available\");\n }\n }\n /**\n * Stop casting (AirPlay or Chromecast).\n */\n stopCasting() {\n this.checkDestroyed();\n const airplay = this.pluginManager.getPlugin(\"airplay\");\n if (airplay && typeof airplay.stop === \"function\") {\n airplay.stop();\n }\n const chromecast = this.pluginManager.getPlugin(\"chromecast\");\n if (chromecast && typeof chromecast.stopSession === \"function\") {\n chromecast.stopSession();\n }\n }\n // ===== Live Stream Methods =====\n /**\n * Seek to live edge (for live streams).\n */\n seekToLive() {\n this.checkDestroyed();\n const isLive = this.stateManager.getValue(\"live\");\n if (!isLive) {\n this.logger.warn(\"Not a live stream\");\n return;\n }\n if (this._currentProvider) {\n const provider = this._currentProvider;\n if (typeof provider.getLiveInfo === \"function\") {\n const liveInfo = provider.getLiveInfo();\n if (liveInfo?.liveSyncPosition !== void 0) {\n this.seek(liveInfo.liveSyncPosition);\n return;\n }\n }\n }\n const duration = this.stateManager.getValue(\"duration\");\n if (duration > 0) {\n this.seek(duration);\n }\n }\n /**\n * Destroy the player and cleanup all resources.\n *\n * @example\n * ```ts\n * player.destroy();\n * ```\n */\n destroy() {\n if (this.destroyed) {\n return;\n }\n this.logger.info(\"Destroying player\");\n if (this.seekResumeTimeout !== null) {\n clearTimeout(this.seekResumeTimeout);\n this.seekResumeTimeout = null;\n }\n this.eventBus.emit(\"player:destroy\", void 0);\n this.pluginManager.destroyAll();\n this.eventBus.destroy();\n this.stateManager.destroy();\n this.destroyed = true;\n this.logger.info(\"Player destroyed\");\n }\n // ===== State Getters =====\n /**\n * Get playing state.\n */\n get playing() {\n return this.stateManager.getValue(\"playing\");\n }\n /**\n * Get paused state.\n */\n get paused() {\n return this.stateManager.getValue(\"paused\");\n }\n /**\n * Get current time in seconds.\n */\n get currentTime() {\n return this.stateManager.getValue(\"currentTime\");\n }\n /**\n * Get duration in seconds.\n */\n get duration() {\n return this.stateManager.getValue(\"duration\");\n }\n /**\n * Get volume (0-1).\n */\n get volume() {\n return this.stateManager.getValue(\"volume\");\n }\n /**\n * Get muted state.\n */\n get muted() {\n return this.stateManager.getValue(\"muted\");\n }\n /**\n * Get playback rate.\n */\n get playbackRate() {\n return this.stateManager.getValue(\"playbackRate\");\n }\n /**\n * Get buffered amount (0-1).\n */\n get bufferedAmount() {\n return this.stateManager.getValue(\"bufferedAmount\");\n }\n /**\n * Get current provider plugin.\n */\n get currentProvider() {\n return this._currentProvider;\n }\n /**\n * Get fullscreen state.\n */\n get fullscreen() {\n return this.stateManager.getValue(\"fullscreen\");\n }\n /**\n * Get live stream state.\n */\n get live() {\n return this.stateManager.getValue(\"live\");\n }\n /**\n * Get autoplay state.\n */\n get autoplay() {\n return this.stateManager.getValue(\"autoplay\");\n }\n /**\n * Check if player is destroyed.\n * @private\n */\n checkDestroyed() {\n if (this.destroyed) {\n throw new Error(\"Cannot call methods on destroyed player\");\n }\n }\n /**\n * Detect MIME type from source URL.\n * @private\n */\n detectMimeType(source) {\n const ext = source.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"m3u8\":\n return \"application/x-mpegURL\";\n case \"mpd\":\n return \"application/dash+xml\";\n case \"mp4\":\n return \"video/mp4\";\n case \"webm\":\n return \"video/webm\";\n case \"ogg\":\n return \"video/ogg\";\n default:\n return \"video/mp4\";\n }\n }\n}\nasync function createPlayer(options) {\n const player = new ScarlettPlayer(options);\n await player.init();\n return player;\n}\nexport {\n Computed,\n ErrorCode,\n ErrorHandler,\n EventBus,\n Logger,\n PluginAPI,\n PluginManager,\n ScarlettPlayer,\n Signal,\n StateManager,\n computed,\n createLogger,\n createPlayer,\n currentEffect,\n effect,\n getCurrentEffect,\n setCurrentEffect,\n signal\n};\n//# sourceMappingURL=index.js.map\n","// src/hls-loader.ts\nvar hlsConstructor = null;\nvar loadingPromise = null;\nfunction supportsNativeHLS() {\n if (typeof document === \"undefined\") return false;\n const video = document.createElement(\"video\");\n return video.canPlayType(\"application/vnd.apple.mpegurl\") !== \"\";\n}\nfunction isHlsJsSupported() {\n if (hlsConstructor) {\n return hlsConstructor.isSupported();\n }\n if (typeof window === \"undefined\") return false;\n return !!(window.MediaSource || window.WebKitMediaSource);\n}\nfunction isHLSSupported() {\n return supportsNativeHLS() || isHlsJsSupported();\n}\nasync function loadHlsJs() {\n if (hlsConstructor) {\n return hlsConstructor;\n }\n if (loadingPromise) {\n return loadingPromise;\n }\n loadingPromise = (async () => {\n try {\n const hlsModule = await import(\"hls.js\");\n hlsConstructor = hlsModule.default;\n if (!hlsConstructor.isSupported()) {\n throw new Error(\"hls.js is not supported in this browser\");\n }\n return hlsConstructor;\n } catch (error) {\n loadingPromise = null;\n throw new Error(\n `Failed to load hls.js: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n })();\n return loadingPromise;\n}\nfunction createHlsInstance(config) {\n if (!hlsConstructor) {\n throw new Error(\"hls.js is not loaded. Call loadHlsJs() first.\");\n }\n return new hlsConstructor(config);\n}\nfunction getHlsConstructor() {\n return hlsConstructor;\n}\n\n// src/quality.ts\nfunction formatLevel(level) {\n if (level.name) {\n return level.name;\n }\n if (level.height) {\n const standardLabels = {\n 2160: \"4K\",\n 1440: \"1440p\",\n 1080: \"1080p\",\n 720: \"720p\",\n 480: \"480p\",\n 360: \"360p\",\n 240: \"240p\",\n 144: \"144p\"\n };\n const closest = Object.keys(standardLabels).map(Number).sort((a, b) => Math.abs(a - level.height) - Math.abs(b - level.height))[0];\n if (Math.abs(closest - level.height) <= 20) {\n return standardLabels[closest];\n }\n return `${level.height}p`;\n }\n if (level.bitrate) {\n return formatBitrate(level.bitrate);\n }\n return \"Unknown\";\n}\nfunction formatBitrate(bitrate) {\n if (bitrate >= 1e6) {\n return `${(bitrate / 1e6).toFixed(1)} Mbps`;\n }\n if (bitrate >= 1e3) {\n return `${Math.round(bitrate / 1e3)} Kbps`;\n }\n return `${bitrate} bps`;\n}\nfunction mapLevels(levels, currentLevel) {\n return levels.map((level, index) => ({\n index,\n width: level.width || 0,\n height: level.height || 0,\n bitrate: level.bitrate || 0,\n label: formatLevel(level),\n codec: level.codecSet\n }));\n}\n\n// src/event-map.ts\nvar HLS_ERROR_TYPES = {\n NETWORK_ERROR: \"networkError\",\n MEDIA_ERROR: \"mediaError\",\n KEY_SYSTEM_ERROR: \"keySystemError\",\n MUX_ERROR: \"muxError\",\n OTHER_ERROR: \"otherError\"\n};\nfunction mapErrorType(hlsType) {\n switch (hlsType) {\n case HLS_ERROR_TYPES.NETWORK_ERROR:\n return \"network\";\n case HLS_ERROR_TYPES.MEDIA_ERROR:\n return \"media\";\n case HLS_ERROR_TYPES.MUX_ERROR:\n return \"mux\";\n default:\n return \"other\";\n }\n}\nfunction parseHlsError(data) {\n return {\n type: mapErrorType(data.type),\n details: data.details || \"Unknown error\",\n fatal: data.fatal || false,\n url: data.url,\n reason: data.reason,\n response: data.response\n };\n}\nfunction setupHlsEventHandlers(hls, api, callbacks) {\n const handlers = [];\n const addHandler = (event, handler) => {\n hls.on(event, handler);\n handlers.push({ event, handler });\n };\n addHandler(\"hlsManifestParsed\", (_event, data) => {\n api.logger.debug(\"HLS manifest parsed\", { levels: data.levels.length });\n const levels = data.levels.map((level, index) => ({\n id: `level-${index}`,\n label: formatLevel(level),\n width: level.width,\n height: level.height,\n bitrate: level.bitrate,\n active: index === hls.currentLevel\n }));\n api.setState(\"qualities\", levels);\n api.emit(\"quality:levels\", {\n levels: levels.map((l) => ({ id: l.id, label: l.label }))\n });\n callbacks.onManifestParsed?.(data.levels);\n });\n addHandler(\"hlsLevelSwitched\", (_event, data) => {\n const level = hls.levels[data.level];\n const isAuto = callbacks.getIsAutoQuality?.() ?? hls.autoLevelEnabled;\n api.logger.debug(\"HLS level switched\", { level: data.level, height: level?.height, auto: isAuto });\n if (level) {\n const label = isAuto ? `Auto (${formatLevel(level)})` : formatLevel(level);\n api.setState(\"currentQuality\", {\n id: isAuto ? \"auto\" : `level-${data.level}`,\n label,\n width: level.width,\n height: level.height,\n bitrate: level.bitrate,\n active: true\n });\n }\n api.emit(\"quality:change\", {\n quality: level ? formatLevel(level) : \"auto\",\n auto: isAuto\n });\n callbacks.onLevelSwitched?.(data.level);\n });\n addHandler(\"hlsFragBuffered\", () => {\n api.setState(\"buffering\", false);\n callbacks.onBufferUpdate?.();\n });\n addHandler(\"hlsFragLoading\", () => {\n api.setState(\"buffering\", true);\n });\n addHandler(\"hlsLevelLoaded\", (_event, data) => {\n if (data.details?.live !== void 0) {\n api.setState(\"live\", data.details.live);\n callbacks.onLiveUpdate?.();\n }\n });\n addHandler(\"hlsError\", (_event, data) => {\n const error = parseHlsError(data);\n api.logger.warn(\"HLS error\", { error });\n callbacks.onError?.(error);\n });\n return () => {\n for (const { event, handler } of handlers) {\n hls.off(event, handler);\n }\n handlers.length = 0;\n };\n}\nfunction setupVideoEventHandlers(video, api) {\n const handlers = [];\n const addHandler = (event, handler) => {\n video.addEventListener(event, handler);\n handlers.push({ event, handler });\n };\n addHandler(\"playing\", () => {\n api.setState(\"playing\", true);\n api.setState(\"paused\", false);\n api.setState(\"playbackState\", \"playing\");\n });\n addHandler(\"pause\", () => {\n api.setState(\"playing\", false);\n api.setState(\"paused\", true);\n api.setState(\"playbackState\", \"paused\");\n });\n addHandler(\"ended\", () => {\n api.setState(\"playing\", false);\n api.setState(\"ended\", true);\n api.setState(\"playbackState\", \"ended\");\n api.emit(\"playback:ended\", void 0);\n });\n addHandler(\"timeupdate\", () => {\n api.setState(\"currentTime\", video.currentTime);\n api.emit(\"playback:timeupdate\", { currentTime: video.currentTime });\n });\n addHandler(\"durationchange\", () => {\n api.setState(\"duration\", video.duration || 0);\n api.emit(\"media:loadedmetadata\", { duration: video.duration || 0 });\n });\n addHandler(\"waiting\", () => {\n api.setState(\"waiting\", true);\n api.setState(\"buffering\", true);\n api.emit(\"media:waiting\", void 0);\n });\n addHandler(\"canplay\", () => {\n api.setState(\"waiting\", false);\n api.setState(\"playbackState\", \"ready\");\n api.emit(\"media:canplay\", void 0);\n });\n addHandler(\"canplaythrough\", () => {\n api.setState(\"buffering\", false);\n api.emit(\"media:canplaythrough\", void 0);\n });\n addHandler(\"progress\", () => {\n if (video.buffered.length > 0) {\n const bufferedEnd = video.buffered.end(video.buffered.length - 1);\n const bufferedAmount = video.duration > 0 ? bufferedEnd / video.duration : 0;\n api.setState(\"bufferedAmount\", bufferedAmount);\n api.setState(\"buffered\", video.buffered);\n api.emit(\"media:progress\", { buffered: bufferedAmount });\n }\n });\n addHandler(\"seeking\", () => {\n api.setState(\"seeking\", true);\n });\n addHandler(\"seeked\", () => {\n api.setState(\"seeking\", false);\n api.emit(\"playback:seeked\", { time: video.currentTime });\n });\n addHandler(\"volumechange\", () => {\n api.setState(\"volume\", video.volume);\n api.setState(\"muted\", video.muted);\n api.emit(\"volume:change\", { volume: video.volume, muted: video.muted });\n });\n addHandler(\"ratechange\", () => {\n api.setState(\"playbackRate\", video.playbackRate);\n api.emit(\"playback:ratechange\", { rate: video.playbackRate });\n });\n addHandler(\"loadedmetadata\", () => {\n api.setState(\"duration\", video.duration);\n api.setState(\"mediaType\", video.videoWidth > 0 ? \"video\" : \"audio\");\n });\n addHandler(\"error\", () => {\n const error = video.error;\n if (error) {\n api.logger.error(\"Video element error\", { code: error.code, message: error.message });\n api.emit(\"media:error\", { error: new Error(error.message || \"Video playback error\") });\n }\n });\n addHandler(\"enterpictureinpicture\", () => {\n api.setState(\"pip\", true);\n api.logger.debug(\"PiP: entered (standard)\");\n });\n addHandler(\"leavepictureinpicture\", () => {\n api.setState(\"pip\", false);\n api.logger.debug(\"PiP: exited (standard)\");\n if (!video.paused || api.getState(\"playing\")) {\n video.play().catch(() => {\n });\n }\n });\n const webkitVideo = video;\n if (\"webkitPresentationMode\" in video) {\n addHandler(\"webkitpresentationmodechanged\", () => {\n const mode = webkitVideo.webkitPresentationMode;\n const isInPip = mode === \"picture-in-picture\";\n api.setState(\"pip\", isInPip);\n api.logger.debug(`PiP: mode changed to ${mode} (webkit)`);\n if (mode === \"inline\" && video.paused) {\n video.play().catch(() => {\n });\n }\n });\n }\n return () => {\n for (const { event, handler } of handlers) {\n video.removeEventListener(event, handler);\n }\n handlers.length = 0;\n };\n}\n\n// src/index.ts\nvar DEFAULT_CONFIG = {\n debug: false,\n autoStartLoad: true,\n startPosition: -1,\n lowLatencyMode: false,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n backBufferLength: 30,\n enableWorker: true,\n // Error recovery settings\n maxNetworkRetries: 3,\n maxMediaRetries: 2,\n retryDelayMs: 1e3,\n retryBackoffFactor: 2\n};\nfunction createHLSPlugin(config) {\n const mergedConfig = { ...DEFAULT_CONFIG, ...config };\n let api = null;\n let hls = null;\n let video = null;\n let isNative = false;\n let currentSrc = null;\n let cleanupHlsEvents = null;\n let cleanupVideoEvents = null;\n let isAutoQuality = true;\n let networkRetryCount = 0;\n let mediaRetryCount = 0;\n let retryTimeout = null;\n let errorCount = 0;\n let errorWindowStart = 0;\n const MAX_ERRORS_IN_WINDOW = 10;\n const ERROR_WINDOW_MS = 5e3;\n const getOrCreateVideo = () => {\n if (video) return video;\n const existing = api?.container.querySelector(\"video\");\n if (existing) {\n video = existing;\n return video;\n }\n video = document.createElement(\"video\");\n video.style.cssText = \"width:100%;height:100%;display:block;object-fit:contain;background:#000\";\n video.preload = \"metadata\";\n video.controls = false;\n video.playsInline = true;\n api?.container.appendChild(video);\n return video;\n };\n const cleanup = () => {\n cleanupHlsEvents?.();\n cleanupHlsEvents = null;\n cleanupVideoEvents?.();\n cleanupVideoEvents = null;\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n retryTimeout = null;\n }\n if (hls) {\n hls.destroy();\n hls = null;\n }\n currentSrc = null;\n isNative = false;\n isAutoQuality = true;\n networkRetryCount = 0;\n mediaRetryCount = 0;\n errorCount = 0;\n errorWindowStart = 0;\n };\n const buildHlsConfig = () => ({\n debug: mergedConfig.debug,\n autoStartLoad: mergedConfig.autoStartLoad,\n startPosition: mergedConfig.startPosition,\n startLevel: -1,\n // Auto quality selection (ABR)\n lowLatencyMode: mergedConfig.lowLatencyMode,\n maxBufferLength: mergedConfig.maxBufferLength,\n maxMaxBufferLength: mergedConfig.maxMaxBufferLength,\n backBufferLength: mergedConfig.backBufferLength,\n enableWorker: mergedConfig.enableWorker,\n // Minimize hls.js internal retries - we handle retries ourselves\n fragLoadingMaxRetry: 1,\n manifestLoadingMaxRetry: 1,\n levelLoadingMaxRetry: 1,\n fragLoadingRetryDelay: 500,\n manifestLoadingRetryDelay: 500,\n levelLoadingRetryDelay: 500\n });\n const getRetryDelay = (retryCount) => {\n const baseDelay = mergedConfig.retryDelayMs ?? 1e3;\n const backoffFactor = mergedConfig.retryBackoffFactor ?? 2;\n return baseDelay * Math.pow(backoffFactor, retryCount);\n };\n const emitFatalError = (error, retriesExhausted) => {\n const message = retriesExhausted ? `HLS error: ${error.details} (max retries exceeded)` : `HLS error: ${error.details}`;\n api?.logger.error(message, { type: error.type, details: error.details });\n api?.setState(\"playbackState\", \"error\");\n api?.setState(\"buffering\", false);\n api?.emit(\"error\", {\n code: \"MEDIA_ERROR\",\n message,\n fatal: true,\n timestamp: Date.now()\n });\n };\n const handleHlsError = (error) => {\n const Hls = getHlsConstructor();\n if (!Hls || !hls) return;\n const now = Date.now();\n if (now - errorWindowStart > ERROR_WINDOW_MS) {\n errorCount = 1;\n errorWindowStart = now;\n } else {\n errorCount++;\n }\n if (errorCount >= MAX_ERRORS_IN_WINDOW) {\n api?.logger.error(`Too many errors (${errorCount} in ${ERROR_WINDOW_MS}ms), giving up`);\n emitFatalError(error, true);\n cleanupHlsEvents?.();\n cleanupHlsEvents = null;\n hls.destroy();\n hls = null;\n return;\n }\n if (error.fatal) {\n api?.logger.error(\"Fatal HLS error\", { type: error.type, details: error.details });\n switch (error.type) {\n case \"network\": {\n const maxRetries = mergedConfig.maxNetworkRetries ?? 3;\n if (networkRetryCount >= maxRetries) {\n api?.logger.error(`Network error recovery failed after ${networkRetryCount} attempts`);\n emitFatalError(error, true);\n return;\n }\n networkRetryCount++;\n const delay = getRetryDelay(networkRetryCount - 1);\n api?.logger.info(`Attempting network error recovery (attempt ${networkRetryCount}/${maxRetries}) in ${delay}ms`);\n api?.emit(\"error:network\", { error: new Error(error.details) });\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n }\n retryTimeout = setTimeout(() => {\n if (hls) {\n hls.startLoad();\n }\n }, delay);\n break;\n }\n case \"media\": {\n const maxRetries = mergedConfig.maxMediaRetries ?? 2;\n if (mediaRetryCount >= maxRetries) {\n api?.logger.error(`Media error recovery failed after ${mediaRetryCount} attempts`);\n emitFatalError(error, true);\n return;\n }\n mediaRetryCount++;\n const delay = getRetryDelay(mediaRetryCount - 1);\n api?.logger.info(`Attempting media error recovery (attempt ${mediaRetryCount}/${maxRetries}) in ${delay}ms`);\n api?.emit(\"error:media\", { error: new Error(error.details) });\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n }\n retryTimeout = setTimeout(() => {\n if (hls) {\n hls.recoverMediaError();\n }\n }, delay);\n break;\n }\n default:\n emitFatalError(error, false);\n break;\n }\n }\n };\n const loadNative = async (src) => {\n const videoEl = getOrCreateVideo();\n isNative = true;\n if (api) {\n cleanupVideoEvents = setupVideoEventHandlers(videoEl, api);\n }\n return new Promise((resolve, reject) => {\n const onLoaded = () => {\n videoEl.removeEventListener(\"loadedmetadata\", onLoaded);\n videoEl.removeEventListener(\"error\", onError);\n api?.setState(\"source\", { src, type: \"application/x-mpegURL\" });\n api?.emit(\"media:loaded\", { src, type: \"application/x-mpegURL\" });\n resolve();\n };\n const onError = () => {\n videoEl.removeEventListener(\"loadedmetadata\", onLoaded);\n videoEl.removeEventListener(\"error\", onError);\n const error = videoEl.error;\n reject(new Error(error?.message || \"Failed to load HLS source\"));\n };\n videoEl.addEventListener(\"loadedmetadata\", onLoaded);\n videoEl.addEventListener(\"error\", onError);\n videoEl.src = src;\n videoEl.load();\n });\n };\n const loadWithHlsJs = async (src) => {\n await loadHlsJs();\n const videoEl = getOrCreateVideo();\n isNative = false;\n hls = createHlsInstance(buildHlsConfig());\n if (api) {\n cleanupVideoEvents = setupVideoEventHandlers(videoEl, api);\n }\n return new Promise((resolve, reject) => {\n if (!hls || !api) {\n reject(new Error(\"HLS not initialized\"));\n return;\n }\n let resolved = false;\n cleanupHlsEvents = setupHlsEventHandlers(hls, api, {\n onManifestParsed: () => {\n if (!resolved) {\n resolved = true;\n api?.setState(\"source\", { src, type: \"application/x-mpegURL\" });\n api?.emit(\"media:loaded\", { src, type: \"application/x-mpegURL\" });\n resolve();\n }\n },\n onLevelSwitched: () => {\n },\n onError: (error) => {\n handleHlsError(error);\n if (error.fatal && !resolved && error.type !== \"network\" && error.type !== \"media\") {\n resolved = true;\n reject(new Error(error.details));\n }\n },\n getIsAutoQuality: () => isAutoQuality\n });\n hls.attachMedia(videoEl);\n hls.loadSource(src);\n });\n };\n const plugin = {\n id: \"hls-provider\",\n name: \"HLS Provider\",\n version: \"1.0.0\",\n type: \"provider\",\n description: \"HLS playback provider using hls.js\",\n canPlay(src) {\n if (!isHLSSupported()) return false;\n const url = src.toLowerCase();\n const urlWithoutQuery = url.split(\"?\")[0].split(\"#\")[0];\n if (urlWithoutQuery.endsWith(\".m3u8\")) return true;\n if (url.includes(\"application/x-mpegurl\")) return true;\n if (url.includes(\"application/vnd.apple.mpegurl\")) return true;\n return false;\n },\n async init(pluginApi) {\n api = pluginApi;\n api.logger.info(\"HLS plugin initialized\");\n const unsubPlay = api.on(\"playback:play\", async () => {\n if (!video) return;\n try {\n await video.play();\n } catch (e) {\n api?.logger.error(\"Play failed\", e);\n }\n });\n const unsubPause = api.on(\"playback:pause\", () => {\n video?.pause();\n });\n const unsubSeek = api.on(\"playback:seeking\", ({ time }) => {\n if (!video) return;\n const clampedTime = Math.max(0, Math.min(time, video.duration || 0));\n video.currentTime = clampedTime;\n });\n const unsubVolume = api.on(\"volume:change\", ({ volume }) => {\n if (video) video.volume = volume;\n });\n const unsubMute = api.on(\"volume:mute\", ({ muted }) => {\n if (video) video.muted = muted;\n });\n const unsubRate = api.on(\"playback:ratechange\", ({ rate }) => {\n if (video) video.playbackRate = rate;\n });\n const unsubQuality = api.on(\"quality:select\", ({ quality, auto }) => {\n if (!hls || isNative) {\n api?.logger.warn(\"Quality selection not available\");\n return;\n }\n if (auto || quality === \"auto\") {\n isAutoQuality = true;\n hls.currentLevel = -1;\n api?.logger.debug(\"Quality: auto selection enabled\");\n api?.setState(\"currentQuality\", {\n id: \"auto\",\n label: \"Auto\",\n width: 0,\n height: 0,\n bitrate: 0,\n active: true\n });\n } else {\n isAutoQuality = false;\n const levelIndex = parseInt(quality.replace(\"level-\", \"\"), 10);\n if (!isNaN(levelIndex) && levelIndex >= 0 && levelIndex < hls.levels.length) {\n hls.nextLevel = levelIndex;\n api?.logger.debug(`Quality: queued switch to level ${levelIndex}`);\n }\n }\n });\n api.onDestroy(() => {\n unsubPlay();\n unsubPause();\n unsubSeek();\n unsubVolume();\n unsubMute();\n unsubRate();\n unsubQuality();\n });\n },\n async destroy() {\n api?.logger.info(\"HLS plugin destroying\");\n cleanup();\n if (video?.parentNode) {\n video.parentNode.removeChild(video);\n }\n video = null;\n api = null;\n },\n async loadSource(src) {\n if (!api) throw new Error(\"Plugin not initialized\");\n api.logger.info(\"Loading HLS source\", { src });\n cleanup();\n currentSrc = src;\n api.setState(\"playbackState\", \"loading\");\n api.setState(\"buffering\", true);\n if (isHlsJsSupported()) {\n api.logger.info(\"Using hls.js for HLS playback\");\n await loadWithHlsJs(src);\n } else if (supportsNativeHLS()) {\n api.logger.info(\"Using native HLS playback (hls.js not supported)\");\n await loadNative(src);\n } else {\n throw new Error(\"HLS playback not supported in this browser\");\n }\n api.setState(\"playbackState\", \"ready\");\n api.setState(\"buffering\", false);\n },\n getCurrentLevel() {\n if (isNative || !hls) return -1;\n return hls.currentLevel;\n },\n setLevel(index) {\n if (isNative || !hls) {\n api?.logger.warn(\"Quality selection not available in native HLS mode\");\n return;\n }\n hls.currentLevel = index;\n },\n getLevels() {\n if (isNative || !hls) return [];\n return mapLevels(hls.levels, hls.currentLevel);\n },\n getHlsInstance() {\n return hls;\n },\n isNativeHLS() {\n return isNative;\n },\n getLiveInfo() {\n if (isNative || !hls) return null;\n const live = api?.getState(\"live\") || false;\n if (!live) return null;\n return {\n isLive: true,\n latency: hls.latency || 0,\n targetLatency: hls.targetLatency || 3,\n drift: hls.drift || 0\n };\n },\n /**\n * Switch from hls.js to native HLS playback.\n * Used for AirPlay compatibility in Safari.\n * Preserves current playback position.\n */\n async switchToNative() {\n if (isNative) {\n api?.logger.debug(\"Already using native HLS\");\n return;\n }\n if (!supportsNativeHLS()) {\n api?.logger.warn(\"Native HLS not supported in this browser\");\n return;\n }\n if (!currentSrc) {\n api?.logger.warn(\"No source loaded\");\n return;\n }\n api?.logger.info(\"Switching to native HLS for AirPlay\");\n const wasPlaying = api?.getState(\"playing\") || false;\n const currentTime = video?.currentTime || 0;\n const savedSrc = currentSrc;\n cleanup();\n await loadNative(savedSrc);\n if (video && currentTime > 0) {\n video.currentTime = currentTime;\n }\n if (wasPlaying && video) {\n try {\n await video.play();\n } catch (e) {\n api?.logger.debug(\"Could not auto-resume after switch\");\n }\n }\n api?.logger.info(\"Switched to native HLS\");\n },\n /**\n * Switch from native HLS back to hls.js.\n * Restores quality control after AirPlay session ends.\n */\n async switchToHlsJs() {\n if (!isNative) {\n api?.logger.debug(\"Already using hls.js\");\n return;\n }\n if (!isHlsJsSupported()) {\n api?.logger.warn(\"hls.js not supported in this browser\");\n return;\n }\n if (!currentSrc) {\n api?.logger.warn(\"No source loaded\");\n return;\n }\n api?.logger.info(\"Switching back to hls.js\");\n const wasPlaying = api?.getState(\"playing\") || false;\n const currentTime = video?.currentTime || 0;\n const savedSrc = currentSrc;\n cleanup();\n await loadWithHlsJs(savedSrc);\n if (video && currentTime > 0) {\n video.currentTime = currentTime;\n }\n if (wasPlaying && video) {\n try {\n await video.play();\n } catch (e) {\n api?.logger.debug(\"Could not auto-resume after switch\");\n }\n }\n api?.logger.info(\"Switched to hls.js\");\n }\n };\n return plugin;\n}\nvar index_default = createHLSPlugin;\nexport {\n createHLSPlugin,\n index_default as default\n};\n","// src/styles.ts\nvar styles = `\n/* ============================================\n Container & Base\n ============================================ */\n.sp-container {\n position: relative;\n width: 100%;\n height: 100%;\n background: #000;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.sp-container video {\n width: 100%;\n height: 100%;\n display: block;\n object-fit: contain;\n}\n\n.sp-container:focus {\n outline: none;\n}\n\n/* ============================================\n Gradient Overlay\n ============================================ */\n.sp-gradient {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 160px;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.8) 0%,\n rgba(0, 0, 0, 0.4) 50%,\n transparent 100%\n );\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.25s ease;\n z-index: 5;\n}\n\n.sp-gradient--visible {\n opacity: 1;\n}\n\n/* ============================================\n Controls Container\n ============================================ */\n.sp-controls {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n align-items: center;\n padding: 0 12px 12px;\n gap: 4px;\n opacity: 0;\n transform: translateY(4px);\n transition: opacity 0.25s ease, transform 0.25s ease;\n z-index: 10;\n}\n\n.sp-controls--visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n.sp-controls--hidden {\n opacity: 0;\n transform: translateY(4px);\n pointer-events: none;\n}\n\n/* ============================================\n Progress Bar (Above Controls)\n ============================================ */\n.sp-progress-wrapper {\n position: absolute;\n bottom: 48px;\n left: 12px;\n right: 12px;\n height: 20px;\n display: flex;\n align-items: center;\n cursor: pointer;\n z-index: 10;\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.sp-progress-wrapper--visible {\n opacity: 1;\n}\n\n.sp-progress {\n position: relative;\n width: 100%;\n height: 3px;\n background: rgba(255, 255, 255, 0.3);\n border-radius: 1.5px;\n transition: height 0.15s ease;\n}\n\n.sp-progress-wrapper:hover .sp-progress,\n.sp-progress--dragging {\n height: 5px;\n}\n\n.sp-progress__track {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border-radius: inherit;\n overflow: hidden;\n}\n\n.sp-progress__buffered {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: rgba(255, 255, 255, 0.4);\n border-radius: inherit;\n transition: width 0.1s linear;\n}\n\n.sp-progress__filled {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: var(--sp-accent, #e50914);\n border-radius: inherit;\n}\n\n.sp-progress__handle {\n position: absolute;\n top: 50%;\n width: 14px;\n height: 14px;\n background: var(--sp-accent, #e50914);\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n transition: transform 0.15s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n}\n\n.sp-progress-wrapper:hover .sp-progress__handle,\n.sp-progress--dragging .sp-progress__handle {\n transform: translate(-50%, -50%) scale(1);\n}\n\n/* Progress Tooltip */\n.sp-progress__tooltip {\n position: absolute;\n bottom: calc(100% + 8px);\n padding: 6px 10px;\n background: rgba(20, 20, 20, 0.95);\n color: #fff;\n font-size: 12px;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n border-radius: 4px;\n white-space: nowrap;\n transform: translateX(-50%);\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s ease;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n.sp-progress-wrapper:hover .sp-progress__tooltip {\n opacity: 1;\n}\n\n/* ============================================\n Control Buttons\n ============================================ */\n.sp-control {\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: color 0.15s ease, transform 0.15s ease, background 0.15s ease;\n flex-shrink: 0;\n}\n\n.sp-control:hover {\n color: #fff;\n background: rgba(255, 255, 255, 0.1);\n}\n\n.sp-control:active {\n transform: scale(0.92);\n}\n\n.sp-control:focus-visible {\n outline: 2px solid var(--sp-accent, #e50914);\n outline-offset: 2px;\n}\n\n.sp-control:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n transform: none;\n}\n\n.sp-control:disabled:hover {\n background: none;\n}\n\n.sp-control svg {\n width: 24px;\n height: 24px;\n fill: currentColor;\n display: block;\n}\n\n.sp-control--small svg {\n width: 20px;\n height: 20px;\n}\n\n/* ============================================\n Spacer\n ============================================ */\n.sp-spacer {\n flex: 1;\n min-width: 0;\n}\n\n/* ============================================\n Time Display\n ============================================ */\n.sp-time {\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n color: rgba(255, 255, 255, 0.9);\n white-space: nowrap;\n padding: 0 4px;\n letter-spacing: 0.02em;\n}\n\n/* ============================================\n Volume Control\n ============================================ */\n.sp-volume {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.sp-volume__slider-wrap {\n width: 0;\n overflow: hidden;\n transition: width 0.2s ease;\n}\n\n.sp-volume:hover .sp-volume__slider-wrap,\n.sp-volume:focus-within .sp-volume__slider-wrap {\n width: 64px;\n}\n\n.sp-volume__slider {\n width: 64px;\n height: 3px;\n background: rgba(255, 255, 255, 0.3);\n border-radius: 1.5px;\n cursor: pointer;\n position: relative;\n margin: 0 8px 0 4px;\n}\n\n.sp-volume__level {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: #fff;\n border-radius: inherit;\n transition: width 0.1s ease;\n}\n\n/* ============================================\n Live Indicator\n ============================================ */\n.sp-live {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sp-accent, #e50914);\n cursor: pointer;\n padding: 6px 10px;\n border-radius: 4px;\n transition: background 0.15s ease, opacity 0.15s ease;\n}\n\n.sp-live:hover {\n background: rgba(255, 255, 255, 0.1);\n}\n\n.sp-live__dot {\n width: 8px;\n height: 8px;\n background: currentColor;\n border-radius: 50%;\n animation: sp-pulse 2s ease-in-out infinite;\n}\n\n.sp-live--behind {\n opacity: 0.6;\n}\n\n.sp-live--behind .sp-live__dot {\n animation: none;\n}\n\n@keyframes sp-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n\n/* ============================================\n Quality / Settings Menu\n ============================================ */\n.sp-quality {\n position: relative;\n}\n\n.sp-quality__btn {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.sp-quality__label {\n font-size: 12px;\n font-weight: 500;\n opacity: 0.9;\n}\n\n.sp-quality-menu {\n position: absolute;\n bottom: calc(100% + 8px);\n right: 0;\n background: rgba(20, 20, 20, 0.95);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border-radius: 8px;\n padding: 8px 0;\n min-width: 150px;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);\n opacity: 0;\n visibility: hidden;\n transform: translateY(8px);\n transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;\n z-index: 20;\n}\n\n.sp-quality-menu--open {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n}\n\n.sp-quality-menu__item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.8);\n cursor: pointer;\n transition: background 0.1s ease, color 0.1s ease;\n}\n\n.sp-quality-menu__item:hover {\n background: rgba(255, 255, 255, 0.1);\n color: #fff;\n}\n\n.sp-quality-menu__item--active {\n color: var(--sp-accent, #e50914);\n}\n\n.sp-quality-menu__check {\n width: 16px;\n height: 16px;\n fill: currentColor;\n margin-left: 8px;\n opacity: 0;\n}\n\n.sp-quality-menu__item--active .sp-quality-menu__check {\n opacity: 1;\n}\n\n/* ============================================\n Cast Button States\n ============================================ */\n.sp-cast--active {\n color: var(--sp-accent, #e50914);\n}\n\n.sp-cast--unavailable {\n opacity: 0.4;\n}\n\n/* ============================================\n Buffering Indicator\n ============================================ */\n.sp-buffering {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 15;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.sp-buffering--visible {\n opacity: 1;\n}\n\n.sp-buffering svg {\n width: 48px;\n height: 48px;\n fill: rgba(255, 255, 255, 0.9);\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));\n}\n\n@keyframes sp-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.sp-spin {\n animation: sp-spin 0.8s linear infinite;\n}\n\n/* ============================================\n Reduced Motion\n ============================================ */\n@media (prefers-reduced-motion: reduce) {\n .sp-gradient,\n .sp-controls,\n .sp-progress-wrapper,\n .sp-progress,\n .sp-progress__handle,\n .sp-progress__tooltip,\n .sp-control,\n .sp-volume__slider-wrap,\n .sp-quality-menu,\n .sp-buffering {\n transition: none;\n }\n\n .sp-live__dot,\n .sp-spin {\n animation: none;\n }\n}\n\n/* ============================================\n CSS Custom Properties (Theming)\n ============================================ */\n:root {\n --sp-accent: #e50914;\n --sp-color: #fff;\n --sp-bg: rgba(0, 0, 0, 0.8);\n --sp-control-height: 48px;\n --sp-icon-size: 24px;\n}\n`;\n\n// src/icons.ts\nvar icons = {\n play: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5v14l11-7z\"/></svg>`,\n pause: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\"/></svg>`,\n replay: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/></svg>`,\n volumeHigh: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/></svg>`,\n volumeLow: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z\"/></svg>`,\n volumeMute: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"/></svg>`,\n fullscreen: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/></svg>`,\n exitFullscreen: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"/></svg>`,\n pip: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z\"/></svg>`,\n exitPip: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14zM9 9h6v2H9z\"/></svg>`,\n settings: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z\"/></svg>`,\n chromecast: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></svg>`,\n chromecastConnected: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm18-7H5v1.63c3.96 1.28 7.09 4.41 8.37 8.37H19V7zM1 10v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></svg>`,\n airplay: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 22h12l-6-6-6 6zM21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V5h18v12h-4v2h4c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></svg>`,\n captions: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\"/></svg>`,\n captionsOff: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19.5 5.5v13h-15v-13h15zM19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2z\"/></svg>`,\n checkmark: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>`,\n chevronUp: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"/></svg>`,\n chevronDown: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\"/></svg>`,\n spinner: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"sp-spin\"><path d=\"M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z\"/></svg>`,\n skipForward: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\"/></svg>`,\n skipBack: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z\"/></svg>`,\n forward10: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M18 13c0 3.31-2.69 6-6 6s-6-2.69-6-6 2.69-6 6-6v4l5-5-5-5v4c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8h-2z\"/><text x=\"12\" y=\"15\" text-anchor=\"middle\" font-size=\"7\" font-weight=\"600\">10</text></svg>`,\n replay10: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/><text x=\"12\" y=\"15\" text-anchor=\"middle\" font-size=\"7\" font-weight=\"600\">10</text></svg>`\n};\n\n// src/utils/dom.ts\nfunction createElement(tag, attrs, children) {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (key === \"className\") {\n el.className = value;\n } else {\n el.setAttribute(key, value);\n }\n }\n }\n if (children) {\n for (const child of children) {\n if (typeof child === \"string\") {\n el.appendChild(document.createTextNode(child));\n } else {\n el.appendChild(child);\n }\n }\n }\n return el;\n}\nfunction createButton(className, label, icon) {\n const btn = createElement(\"button\", {\n className: `sp-control ${className}`,\n \"aria-label\": label,\n type: \"button\"\n });\n btn.innerHTML = icon;\n return btn;\n}\nfunction getVideo(container) {\n return container.querySelector(\"video\");\n}\n\n// src/utils/format.ts\nfunction formatTime(seconds) {\n if (!isFinite(seconds) || isNaN(seconds)) {\n return \"0:00\";\n }\n const absSeconds = Math.abs(seconds);\n const h = Math.floor(absSeconds / 3600);\n const m = Math.floor(absSeconds % 3600 / 60);\n const s = Math.floor(absSeconds % 60);\n const sign = seconds < 0 ? \"-\" : \"\";\n if (h > 0) {\n return `${sign}${h}:${pad(m)}:${pad(s)}`;\n }\n return `${sign}${m}:${pad(s)}`;\n}\nfunction pad(n) {\n return n < 10 ? `0${n}` : `${n}`;\n}\nfunction formatLiveTime(behindLive) {\n if (behindLive <= 0) {\n return \"LIVE\";\n }\n return `-${formatTime(behindLive)}`;\n}\n\n// src/controls/PlayButton.ts\nvar PlayButton = class {\n constructor(api) {\n this.clickHandler = () => {\n this.toggle();\n };\n this.api = api;\n this.el = createButton(\"sp-play\", \"Play\", icons.play);\n this.el.addEventListener(\"click\", this.clickHandler);\n }\n render() {\n return this.el;\n }\n update() {\n const playing = this.api.getState(\"playing\");\n const ended = this.api.getState(\"ended\");\n let icon;\n let label;\n if (ended) {\n icon = icons.replay;\n label = \"Replay\";\n } else if (playing) {\n icon = icons.pause;\n label = \"Pause\";\n } else {\n icon = icons.play;\n label = \"Play\";\n }\n this.el.innerHTML = icon;\n this.el.setAttribute(\"aria-label\", label);\n }\n toggle() {\n const video = getVideo(this.api.container);\n if (!video) return;\n const ended = this.api.getState(\"ended\");\n const playing = this.api.getState(\"playing\");\n if (ended) {\n video.currentTime = 0;\n video.play().catch(() => {\n });\n } else if (playing) {\n video.pause();\n } else {\n video.play().catch(() => {\n });\n }\n }\n destroy() {\n this.el.removeEventListener(\"click\", this.clickHandler);\n this.el.remove();\n }\n};\n\n// src/controls/ProgressBar.ts\nvar ProgressBar = class {\n constructor(api) {\n this.isDragging = false;\n this.lastSeekTime = 0;\n this.seekThrottleMs = 100;\n // Throttle seeks to max 10/sec\n this.wasPlayingBeforeDrag = false;\n this.onMouseDown = (e) => {\n e.preventDefault();\n const video = getVideo(this.api.container);\n this.wasPlayingBeforeDrag = video ? !video.paused : false;\n this.isDragging = true;\n this.el.classList.add(\"sp-progress--dragging\");\n this.lastSeekTime = 0;\n this.seek(e.clientX, true);\n };\n this.onDocMouseMove = (e) => {\n if (this.isDragging) {\n this.seek(e.clientX);\n this.updateVisualPosition(e.clientX);\n }\n };\n this.onMouseUp = (e) => {\n if (this.isDragging) {\n this.seek(e.clientX, true);\n this.isDragging = false;\n this.el.classList.remove(\"sp-progress--dragging\");\n if (this.wasPlayingBeforeDrag) {\n const video = getVideo(this.api.container);\n if (video && video.paused) {\n const resumePlayback = () => {\n video.removeEventListener(\"seeked\", resumePlayback);\n video.play().catch(() => {\n });\n };\n video.addEventListener(\"seeked\", resumePlayback);\n }\n }\n }\n };\n this.onMouseMove = (e) => {\n this.updateTooltip(e.clientX);\n };\n this.onMouseLeave = () => {\n if (!this.isDragging) {\n this.tooltip.style.opacity = \"0\";\n }\n };\n this.onKeyDown = (e) => {\n const video = getVideo(this.api.container);\n if (!video) return;\n const step = 5;\n const duration = this.api.getState(\"duration\") || 0;\n switch (e.key) {\n case \"ArrowLeft\":\n e.preventDefault();\n video.currentTime = Math.max(0, video.currentTime - step);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n video.currentTime = Math.min(duration, video.currentTime + step);\n break;\n case \"Home\":\n e.preventDefault();\n video.currentTime = 0;\n break;\n case \"End\":\n e.preventDefault();\n video.currentTime = duration;\n break;\n }\n };\n this.api = api;\n this.wrapper = createElement(\"div\", { className: \"sp-progress-wrapper\" });\n this.el = createElement(\"div\", { className: \"sp-progress\" });\n const track = createElement(\"div\", { className: \"sp-progress__track\" });\n this.buffered = createElement(\"div\", { className: \"sp-progress__buffered\" });\n this.filled = createElement(\"div\", { className: \"sp-progress__filled\" });\n this.handle = createElement(\"div\", { className: \"sp-progress__handle\" });\n this.tooltip = createElement(\"div\", { className: \"sp-progress__tooltip\" });\n this.tooltip.textContent = \"0:00\";\n track.appendChild(this.buffered);\n track.appendChild(this.filled);\n track.appendChild(this.handle);\n this.el.appendChild(track);\n this.el.appendChild(this.tooltip);\n this.wrapper.appendChild(this.el);\n this.el.setAttribute(\"role\", \"slider\");\n this.el.setAttribute(\"aria-label\", \"Seek\");\n this.el.setAttribute(\"aria-valuemin\", \"0\");\n this.el.setAttribute(\"tabindex\", \"0\");\n this.wrapper.addEventListener(\"mousedown\", this.onMouseDown);\n this.wrapper.addEventListener(\"mousemove\", this.onMouseMove);\n this.wrapper.addEventListener(\"mouseleave\", this.onMouseLeave);\n this.el.addEventListener(\"keydown\", this.onKeyDown);\n document.addEventListener(\"mousemove\", this.onDocMouseMove);\n document.addEventListener(\"mouseup\", this.onMouseUp);\n }\n render() {\n return this.wrapper;\n }\n /** Show the progress bar */\n show() {\n this.wrapper.classList.add(\"sp-progress-wrapper--visible\");\n }\n /** Hide the progress bar */\n hide() {\n this.wrapper.classList.remove(\"sp-progress-wrapper--visible\");\n }\n update() {\n const currentTime = this.api.getState(\"currentTime\") || 0;\n const duration = this.api.getState(\"duration\") || 0;\n const bufferedRanges = this.api.getState(\"buffered\");\n if (duration > 0) {\n const progress = currentTime / duration * 100;\n this.filled.style.width = `${progress}%`;\n this.handle.style.left = `${progress}%`;\n if (bufferedRanges && bufferedRanges.length > 0) {\n const bufferedEnd = bufferedRanges.end(bufferedRanges.length - 1);\n const bufferedPercent = bufferedEnd / duration * 100;\n this.buffered.style.width = `${bufferedPercent}%`;\n }\n this.el.setAttribute(\"aria-valuemax\", String(Math.floor(duration)));\n this.el.setAttribute(\"aria-valuenow\", String(Math.floor(currentTime)));\n this.el.setAttribute(\"aria-valuetext\", formatTime(currentTime));\n }\n }\n getTimeFromPosition(clientX) {\n const rect = this.el.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const duration = this.api.getState(\"duration\") || 0;\n return percent * duration;\n }\n updateTooltip(clientX) {\n const rect = this.el.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const time = this.getTimeFromPosition(clientX);\n this.tooltip.textContent = formatTime(time);\n this.tooltip.style.left = `${percent * 100}%`;\n }\n updateVisualPosition(clientX) {\n const rect = this.el.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n this.filled.style.width = `${percent * 100}%`;\n this.handle.style.left = `${percent * 100}%`;\n }\n seek(clientX, force = false) {\n const video = getVideo(this.api.container);\n if (!video) return;\n const now = Date.now();\n if (!force && this.isDragging && now - this.lastSeekTime < this.seekThrottleMs) {\n return;\n }\n this.lastSeekTime = now;\n const time = this.getTimeFromPosition(clientX);\n video.currentTime = time;\n }\n destroy() {\n this.wrapper.removeEventListener(\"mousedown\", this.onMouseDown);\n this.wrapper.removeEventListener(\"mousemove\", this.onMouseMove);\n this.wrapper.removeEventListener(\"mouseleave\", this.onMouseLeave);\n document.removeEventListener(\"mousemove\", this.onDocMouseMove);\n document.removeEventListener(\"mouseup\", this.onMouseUp);\n this.wrapper.remove();\n }\n};\n\n// src/controls/TimeDisplay.ts\nvar TimeDisplay = class {\n constructor(api) {\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-time\" });\n this.el.setAttribute(\"aria-live\", \"off\");\n }\n render() {\n return this.el;\n }\n update() {\n const live = this.api.getState(\"live\");\n const currentTime = this.api.getState(\"currentTime\") || 0;\n const duration = this.api.getState(\"duration\") || 0;\n if (live) {\n const seekableRange = this.api.getState(\"seekableRange\");\n if (seekableRange) {\n const behindLive = seekableRange.end - currentTime;\n this.el.textContent = formatLiveTime(behindLive);\n } else {\n this.el.textContent = formatLiveTime(0);\n }\n } else {\n this.el.textContent = `${formatTime(currentTime)} / ${formatTime(duration)}`;\n }\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/controls/VolumeControl.ts\nvar VolumeControl = class {\n constructor(api) {\n this.isDragging = false;\n this.onMouseDown = (e) => {\n e.preventDefault();\n this.isDragging = true;\n this.setVolume(this.getVolumeFromPosition(e.clientX));\n };\n this.onDocMouseMove = (e) => {\n if (this.isDragging) {\n this.setVolume(this.getVolumeFromPosition(e.clientX));\n }\n };\n this.onMouseUp = () => {\n this.isDragging = false;\n };\n this.onKeyDown = (e) => {\n const video = getVideo(this.api.container);\n if (!video) return;\n const step = 0.1;\n switch (e.key) {\n case \"ArrowUp\":\n case \"ArrowRight\":\n e.preventDefault();\n this.setVolume(video.volume + step);\n break;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n e.preventDefault();\n this.setVolume(video.volume - step);\n break;\n }\n };\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-volume\" });\n this.btn = createElement(\"button\", {\n className: \"sp-control sp-volume__btn\",\n \"aria-label\": \"Mute\",\n type: \"button\"\n });\n this.btn.innerHTML = icons.volumeHigh;\n this.btn.onclick = () => this.toggleMute();\n const sliderWrap = createElement(\"div\", { className: \"sp-volume__slider-wrap\" });\n this.slider = createElement(\"div\", { className: \"sp-volume__slider\" });\n this.slider.setAttribute(\"role\", \"slider\");\n this.slider.setAttribute(\"aria-label\", \"Volume\");\n this.slider.setAttribute(\"aria-valuemin\", \"0\");\n this.slider.setAttribute(\"aria-valuemax\", \"100\");\n this.slider.setAttribute(\"tabindex\", \"0\");\n this.level = createElement(\"div\", { className: \"sp-volume__level\" });\n this.slider.appendChild(this.level);\n sliderWrap.appendChild(this.slider);\n this.el.appendChild(this.btn);\n this.el.appendChild(sliderWrap);\n this.slider.addEventListener(\"mousedown\", this.onMouseDown);\n this.slider.addEventListener(\"keydown\", this.onKeyDown);\n document.addEventListener(\"mousemove\", this.onDocMouseMove);\n document.addEventListener(\"mouseup\", this.onMouseUp);\n }\n render() {\n return this.el;\n }\n update() {\n const volume = this.api.getState(\"volume\") ?? 1;\n const muted = this.api.getState(\"muted\") ?? false;\n let icon;\n let label;\n if (muted || volume === 0) {\n icon = icons.volumeMute;\n label = \"Unmute\";\n } else if (volume < 0.5) {\n icon = icons.volumeLow;\n label = \"Mute\";\n } else {\n icon = icons.volumeHigh;\n label = \"Mute\";\n }\n this.btn.innerHTML = icon;\n this.btn.setAttribute(\"aria-label\", label);\n const displayVolume = muted ? 0 : volume;\n this.level.style.width = `${displayVolume * 100}%`;\n this.slider.setAttribute(\"aria-valuenow\", String(Math.round(displayVolume * 100)));\n }\n toggleMute() {\n const video = getVideo(this.api.container);\n if (!video) return;\n video.muted = !video.muted;\n }\n setVolume(percent) {\n const video = getVideo(this.api.container);\n if (!video) return;\n const vol = Math.max(0, Math.min(1, percent));\n video.volume = vol;\n if (vol > 0 && video.muted) {\n video.muted = false;\n }\n }\n getVolumeFromPosition(clientX) {\n const rect = this.slider.getBoundingClientRect();\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n }\n destroy() {\n document.removeEventListener(\"mousemove\", this.onDocMouseMove);\n document.removeEventListener(\"mouseup\", this.onMouseUp);\n this.el.remove();\n }\n};\n\n// src/controls/LiveIndicator.ts\nvar LiveIndicator = class {\n constructor(api) {\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-live\" });\n this.el.innerHTML = '<div class=\"sp-live__dot\"></div><span>LIVE</span>';\n this.el.setAttribute(\"role\", \"button\");\n this.el.setAttribute(\"aria-label\", \"Seek to live\");\n this.el.setAttribute(\"tabindex\", \"0\");\n this.el.onclick = () => this.seekToLive();\n this.el.onkeydown = (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this.seekToLive();\n }\n };\n }\n render() {\n return this.el;\n }\n update() {\n const live = this.api.getState(\"live\");\n const liveEdge = this.api.getState(\"liveEdge\");\n this.el.style.display = live ? \"\" : \"none\";\n if (liveEdge) {\n this.el.classList.remove(\"sp-live--behind\");\n } else {\n this.el.classList.add(\"sp-live--behind\");\n }\n }\n seekToLive() {\n const video = getVideo(this.api.container);\n if (!video) return;\n const seekableRange = this.api.getState(\"seekableRange\");\n if (seekableRange) {\n video.currentTime = seekableRange.end;\n }\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/controls/QualityMenu.ts\nvar QualityMenu = class {\n constructor(api) {\n this.isOpen = false;\n this.lastQualitiesJson = \"\";\n this.api = api;\n this.el = createElement(\"div\", { className: \"sp-quality\" });\n this.btn = createButton(\"sp-quality__btn\", \"Quality\", icons.settings);\n this.btnLabel = createElement(\"span\", { className: \"sp-quality__label\" });\n this.btnLabel.textContent = \"Auto\";\n this.btn.appendChild(this.btnLabel);\n this.btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.toggle();\n });\n this.menu = createElement(\"div\", { className: \"sp-quality-menu\" });\n this.menu.setAttribute(\"role\", \"menu\");\n this.menu.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n });\n this.el.appendChild(this.btn);\n this.el.appendChild(this.menu);\n this.closeHandler = (e) => {\n if (!this.el.contains(e.target)) {\n this.close();\n }\n };\n document.addEventListener(\"click\", this.closeHandler);\n }\n render() {\n return this.el;\n }\n update() {\n const qualities = this.api.getState(\"qualities\") || [];\n const currentQuality = this.api.getState(\"currentQuality\");\n this.el.style.display = qualities.length > 0 ? \"\" : \"none\";\n this.btnLabel.textContent = currentQuality?.label || \"Auto\";\n const qualitiesJson = JSON.stringify(qualities.map((q) => q.id));\n const currentId = currentQuality?.id || \"auto\";\n if (qualitiesJson !== this.lastQualitiesJson) {\n this.lastQualitiesJson = qualitiesJson;\n this.rebuildMenu(qualities);\n }\n this.updateActiveStates(currentId);\n }\n rebuildMenu(qualities) {\n this.menu.innerHTML = \"\";\n const autoItem = this.createMenuItem(\"Auto\", \"auto\");\n this.menu.appendChild(autoItem);\n const sorted = [...qualities].sort((a, b) => b.height - a.height);\n for (const q of sorted) {\n if (q.id === \"auto\") continue;\n const item = this.createMenuItem(q.label, q.id);\n this.menu.appendChild(item);\n }\n }\n updateActiveStates(activeId) {\n const items = this.menu.querySelectorAll(\".sp-quality-menu__item\");\n items.forEach((item) => {\n const id = item.getAttribute(\"data-quality-id\");\n const isActive = id === activeId;\n item.classList.toggle(\"sp-quality-menu__item--active\", isActive);\n });\n }\n createMenuItem(label, qualityId) {\n const item = createElement(\"div\", {\n className: \"sp-quality-menu__item\"\n });\n item.setAttribute(\"role\", \"menuitem\");\n item.setAttribute(\"data-quality-id\", qualityId);\n const labelSpan = createElement(\"span\", { className: \"sp-quality-menu__label\" });\n labelSpan.textContent = label;\n item.appendChild(labelSpan);\n item.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.selectQuality(qualityId);\n });\n return item;\n }\n selectQuality(qualityId) {\n this.api.emit(\"quality:select\", {\n quality: qualityId,\n auto: qualityId === \"auto\"\n });\n this.close();\n }\n toggle() {\n this.isOpen ? this.close() : this.open();\n }\n open() {\n this.isOpen = true;\n this.menu.classList.add(\"sp-quality-menu--open\");\n this.btn.setAttribute(\"aria-expanded\", \"true\");\n }\n close() {\n this.isOpen = false;\n this.menu.classList.remove(\"sp-quality-menu--open\");\n this.btn.setAttribute(\"aria-expanded\", \"false\");\n }\n destroy() {\n document.removeEventListener(\"click\", this.closeHandler);\n this.el.remove();\n }\n};\n\n// src/controls/CastButton.ts\nfunction isChromecastSupported() {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n return /Chrome/.test(ua) && !/Edge|Edg/.test(ua);\n}\nfunction isAirPlaySupported() {\n if (typeof HTMLVideoElement === \"undefined\") return false;\n return typeof HTMLVideoElement.prototype.webkitShowPlaybackTargetPicker === \"function\";\n}\nvar CastButton = class {\n constructor(api, type) {\n this.api = api;\n this.type = type;\n this.supported = type === \"chromecast\" ? isChromecastSupported() : isAirPlaySupported();\n const icon = type === \"chromecast\" ? icons.chromecast : icons.airplay;\n const label = type === \"chromecast\" ? \"Cast\" : \"AirPlay\";\n this.el = createButton(`sp-cast sp-cast--${type}`, label, icon);\n this.el.addEventListener(\"click\", () => this.handleClick());\n if (!this.supported) {\n this.el.style.display = \"none\";\n }\n }\n render() {\n return this.el;\n }\n update() {\n if (!this.supported) {\n this.el.style.display = \"none\";\n return;\n }\n if (this.type === \"chromecast\") {\n const available = this.api.getState(\"chromecastAvailable\");\n const active = this.api.getState(\"chromecastActive\");\n this.el.style.display = \"\";\n this.el.disabled = !available && !active;\n this.el.classList.toggle(\"sp-cast--active\", !!active);\n this.el.classList.toggle(\"sp-cast--unavailable\", !available && !active);\n if (active) {\n this.el.innerHTML = icons.chromecastConnected;\n this.el.setAttribute(\"aria-label\", \"Stop casting\");\n } else {\n this.el.innerHTML = icons.chromecast;\n this.el.setAttribute(\"aria-label\", available ? \"Cast\" : \"No Cast devices found\");\n }\n } else {\n const active = this.api.getState(\"airplayActive\");\n this.el.style.display = \"\";\n this.el.disabled = false;\n this.el.classList.toggle(\"sp-cast--active\", !!active);\n this.el.classList.remove(\"sp-cast--unavailable\");\n this.el.setAttribute(\"aria-label\", active ? \"Stop AirPlay\" : \"AirPlay\");\n }\n }\n handleClick() {\n if (this.type === \"chromecast\") {\n this.handleChromecast();\n } else {\n this.handleAirPlay();\n }\n }\n handleChromecast() {\n const chromecast = this.api.getPlugin(\"chromecast\");\n if (!chromecast) return;\n if (chromecast.isConnected()) {\n chromecast.endSession();\n } else {\n chromecast.requestSession().catch(() => {\n });\n }\n }\n async handleAirPlay() {\n const airplayPlugin = this.api.getPlugin(\"airplay\");\n if (airplayPlugin) {\n await airplayPlugin.showPicker();\n } else {\n const video = getVideo(this.api.container);\n video?.webkitShowPlaybackTargetPicker?.();\n }\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/controls/PipButton.ts\nvar PipButton = class {\n constructor(api) {\n this.clickHandler = () => {\n this.toggle();\n };\n this.api = api;\n const video = document.createElement(\"video\");\n this.supported = \"pictureInPictureEnabled\" in document || \"webkitSetPresentationMode\" in video;\n this.el = createButton(\"sp-pip\", \"Picture-in-Picture\", icons.pip);\n this.el.addEventListener(\"click\", this.clickHandler);\n if (!this.supported) {\n this.el.style.display = \"none\";\n }\n }\n render() {\n return this.el;\n }\n update() {\n if (!this.supported) return;\n const pip = this.api.getState(\"pip\");\n this.el.setAttribute(\"aria-label\", pip ? \"Exit Picture-in-Picture\" : \"Picture-in-Picture\");\n this.el.classList.toggle(\"sp-pip--active\", !!pip);\n }\n async toggle() {\n const video = getVideo(this.api.container);\n if (!video) {\n this.api.logger.warn(\"PiP: video element not found\");\n return;\n }\n try {\n const isInPip = document.pictureInPictureElement === video || video.webkitPresentationMode === \"picture-in-picture\";\n if (isInPip) {\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n } else if (video.webkitSetPresentationMode) {\n video.webkitSetPresentationMode(\"inline\");\n }\n this.api.logger.debug(\"PiP: exited\");\n } else {\n if (video.requestPictureInPicture) {\n await video.requestPictureInPicture();\n } else if (video.webkitSetPresentationMode) {\n video.webkitSetPresentationMode(\"picture-in-picture\");\n }\n this.api.logger.debug(\"PiP: entered\");\n }\n } catch (e) {\n this.api.logger.warn(\"PiP: failed\", { error: e.message });\n }\n }\n destroy() {\n this.el.removeEventListener(\"click\", this.clickHandler);\n this.el.remove();\n }\n};\n\n// src/controls/FullscreenButton.ts\nvar FullscreenButton = class {\n constructor(api) {\n this.clickHandler = () => {\n this.toggle();\n };\n this.api = api;\n this.el = createButton(\"sp-fullscreen\", \"Fullscreen\", icons.fullscreen);\n this.el.addEventListener(\"click\", this.clickHandler);\n }\n render() {\n return this.el;\n }\n update() {\n const fullscreen = this.api.getState(\"fullscreen\");\n if (fullscreen) {\n this.el.innerHTML = icons.exitFullscreen;\n this.el.setAttribute(\"aria-label\", \"Exit fullscreen\");\n } else {\n this.el.innerHTML = icons.fullscreen;\n this.el.setAttribute(\"aria-label\", \"Fullscreen\");\n }\n }\n async toggle() {\n const container = this.api.container;\n const video = getVideo(container);\n try {\n if (document.fullscreenElement) {\n await document.exitFullscreen();\n } else if (container.requestFullscreen) {\n await container.requestFullscreen();\n } else if (video?.webkitEnterFullscreen) {\n video.webkitEnterFullscreen();\n }\n } catch {\n }\n }\n destroy() {\n this.el.removeEventListener(\"click\", this.clickHandler);\n this.el.remove();\n }\n};\n\n// src/controls/Spacer.ts\nvar Spacer = class {\n constructor() {\n this.el = createElement(\"div\", { className: \"sp-spacer\" });\n }\n render() {\n return this.el;\n }\n update() {\n }\n destroy() {\n this.el.remove();\n }\n};\n\n// src/index.ts\nvar DEFAULT_LAYOUT = [\n \"play\",\n \"volume\",\n \"time\",\n \"live-indicator\",\n \"spacer\",\n \"quality\",\n \"chromecast\",\n \"airplay\",\n \"pip\",\n \"fullscreen\"\n];\nvar DEFAULT_HIDE_DELAY = 3e3;\nfunction uiPlugin(config = {}) {\n let api;\n let controlBar = null;\n let gradient = null;\n let progressBar = null;\n let bufferingIndicator = null;\n let styleEl = null;\n let controls = [];\n let hideTimeout = null;\n let stateUnsubscribe = null;\n let controlsVisible = true;\n const layout = config.controls || DEFAULT_LAYOUT;\n const hideDelay = config.hideDelay ?? DEFAULT_HIDE_DELAY;\n const createControl = (slot) => {\n switch (slot) {\n case \"play\":\n return new PlayButton(api);\n case \"volume\":\n return new VolumeControl(api);\n case \"progress\":\n return null;\n case \"time\":\n return new TimeDisplay(api);\n case \"live-indicator\":\n return new LiveIndicator(api);\n case \"quality\":\n return new QualityMenu(api);\n case \"chromecast\":\n return new CastButton(api, \"chromecast\");\n case \"airplay\":\n return new CastButton(api, \"airplay\");\n case \"pip\":\n return new PipButton(api);\n case \"fullscreen\":\n return new FullscreenButton(api);\n case \"spacer\":\n return new Spacer();\n default:\n return null;\n }\n };\n const updateControls = () => {\n controls.forEach((c) => c.update());\n progressBar?.update();\n const waiting = api?.getState(\"waiting\");\n const seeking = api?.getState(\"seeking\");\n const playbackState = api?.getState(\"playbackState\");\n const isLoading = playbackState === \"loading\";\n const showSpinner = waiting || seeking && !api?.getState(\"paused\") || isLoading;\n bufferingIndicator?.classList.toggle(\"sp-buffering--visible\", !!showSpinner);\n };\n const showControls = () => {\n if (controlsVisible) {\n resetHideTimer();\n return;\n }\n controlsVisible = true;\n controlBar?.classList.add(\"sp-controls--visible\");\n controlBar?.classList.remove(\"sp-controls--hidden\");\n gradient?.classList.add(\"sp-gradient--visible\");\n progressBar?.show();\n api?.setState(\"controlsVisible\", true);\n resetHideTimer();\n };\n const hideControls = () => {\n const paused = api?.getState(\"paused\");\n if (paused) return;\n controlsVisible = false;\n controlBar?.classList.remove(\"sp-controls--visible\");\n controlBar?.classList.add(\"sp-controls--hidden\");\n gradient?.classList.remove(\"sp-gradient--visible\");\n progressBar?.hide();\n api?.setState(\"controlsVisible\", false);\n };\n const resetHideTimer = () => {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n }\n hideTimeout = setTimeout(hideControls, hideDelay);\n };\n const handleInteraction = () => {\n showControls();\n };\n const handleMouseLeave = () => {\n hideControls();\n };\n const handleKeyDown = (e) => {\n if (!api.container.contains(document.activeElement)) return;\n const video = api.container.querySelector(\"video\");\n if (!video) return;\n switch (e.key) {\n case \" \":\n case \"k\":\n e.preventDefault();\n video.paused ? video.play() : video.pause();\n break;\n case \"m\":\n e.preventDefault();\n video.muted = !video.muted;\n break;\n case \"f\":\n e.preventDefault();\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n api.container.requestFullscreen?.();\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n video.currentTime = Math.max(0, video.currentTime - 5);\n showControls();\n break;\n case \"ArrowRight\":\n e.preventDefault();\n video.currentTime = Math.min(video.duration || 0, video.currentTime + 5);\n showControls();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n video.volume = Math.min(1, video.volume + 0.1);\n showControls();\n break;\n case \"ArrowDown\":\n e.preventDefault();\n video.volume = Math.max(0, video.volume - 0.1);\n showControls();\n break;\n }\n };\n return {\n id: \"ui-controls\",\n name: \"UI Controls\",\n type: \"ui\",\n version: \"1.0.0\",\n async init(pluginApi) {\n api = pluginApi;\n styleEl = document.createElement(\"style\");\n styleEl.textContent = styles;\n document.head.appendChild(styleEl);\n if (config.theme) {\n this.setTheme(config.theme);\n }\n const container = api.container;\n if (!container) {\n api.logger.error(\"UI plugin: container not found\");\n return;\n }\n const containerStyle = getComputedStyle(container);\n if (containerStyle.position === \"static\") {\n container.style.position = \"relative\";\n }\n gradient = document.createElement(\"div\");\n gradient.className = \"sp-gradient sp-gradient--visible\";\n container.appendChild(gradient);\n bufferingIndicator = document.createElement(\"div\");\n bufferingIndicator.className = \"sp-buffering\";\n bufferingIndicator.innerHTML = icons.spinner;\n bufferingIndicator.setAttribute(\"aria-hidden\", \"true\");\n container.appendChild(bufferingIndicator);\n progressBar = new ProgressBar(api);\n container.appendChild(progressBar.render());\n progressBar.show();\n controlBar = document.createElement(\"div\");\n controlBar.className = \"sp-controls sp-controls--visible\";\n controlBar.setAttribute(\"role\", \"toolbar\");\n controlBar.setAttribute(\"aria-label\", \"Video controls\");\n for (const slot of layout) {\n const control = createControl(slot);\n if (control) {\n controls.push(control);\n controlBar.appendChild(control.render());\n }\n }\n container.appendChild(controlBar);\n container.addEventListener(\"mousemove\", handleInteraction);\n container.addEventListener(\"mouseenter\", handleInteraction);\n container.addEventListener(\"mouseleave\", handleMouseLeave);\n container.addEventListener(\"touchstart\", handleInteraction, { passive: true });\n container.addEventListener(\"click\", handleInteraction);\n document.addEventListener(\"keydown\", handleKeyDown);\n stateUnsubscribe = api.subscribeToState(updateControls);\n document.addEventListener(\"fullscreenchange\", updateControls);\n updateControls();\n if (!container.hasAttribute(\"tabindex\")) {\n container.setAttribute(\"tabindex\", \"0\");\n }\n api.logger.debug(\"UI controls plugin initialized\");\n },\n async destroy() {\n if (hideTimeout) {\n clearTimeout(hideTimeout);\n hideTimeout = null;\n }\n stateUnsubscribe?.();\n stateUnsubscribe = null;\n if (api?.container) {\n api.container.removeEventListener(\"mousemove\", handleInteraction);\n api.container.removeEventListener(\"mouseenter\", handleInteraction);\n api.container.removeEventListener(\"mouseleave\", handleMouseLeave);\n api.container.removeEventListener(\"touchstart\", handleInteraction);\n api.container.removeEventListener(\"click\", handleInteraction);\n }\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"fullscreenchange\", updateControls);\n controls.forEach((c) => c.destroy());\n controls = [];\n progressBar?.destroy();\n progressBar = null;\n controlBar?.remove();\n controlBar = null;\n gradient?.remove();\n gradient = null;\n bufferingIndicator?.remove();\n bufferingIndicator = null;\n styleEl?.remove();\n styleEl = null;\n api?.logger.debug(\"UI controls plugin destroyed\");\n },\n // Public API\n show() {\n showControls();\n },\n hide() {\n controlsVisible = false;\n controlBar?.classList.remove(\"sp-controls--visible\");\n controlBar?.classList.add(\"sp-controls--hidden\");\n gradient?.classList.remove(\"sp-gradient--visible\");\n progressBar?.hide();\n api?.setState(\"controlsVisible\", false);\n },\n setTheme(theme) {\n const root = api?.container || document.documentElement;\n if (theme.primaryColor) {\n root.style.setProperty(\"--sp-color\", theme.primaryColor);\n }\n if (theme.accentColor) {\n root.style.setProperty(\"--sp-accent\", theme.accentColor);\n }\n if (theme.backgroundColor) {\n root.style.setProperty(\"--sp-bg\", theme.backgroundColor);\n }\n if (theme.controlBarHeight) {\n root.style.setProperty(\"--sp-control-height\", `${theme.controlBarHeight}px`);\n }\n if (theme.iconSize) {\n root.style.setProperty(\"--sp-icon-size\", `${theme.iconSize}px`);\n }\n },\n getControlBar() {\n return controlBar;\n }\n };\n}\nvar index_default = uiPlugin;\nexport {\n index_default as default,\n formatLiveTime,\n formatTime,\n icons,\n styles,\n uiPlugin\n};\n","import type { EmbedConfig } from './types';\n\n/**\n * Helper to get attribute with fallback aliases\n * Tries each name in order until one is found\n */\nfunction getAttr(element: HTMLElement, ...names: string[]): string | null {\n for (const name of names) {\n const value = element.getAttribute(name);\n if (value !== null) return value;\n }\n return null;\n}\n\n/**\n * Parse data attributes from an element into EmbedConfig\n * Supports multiple attribute naming conventions for flexibility:\n * - Full: data-src, data-autoplay, data-brand-color\n * - Short: src, autoplay, color\n */\nexport function parseDataAttributes(element: HTMLElement): Partial<EmbedConfig> {\n const config: Partial<EmbedConfig> = {};\n\n // Required: source URL (supports: data-src, src, href)\n const src = getAttr(element, 'data-src', 'src', 'href');\n if (src) {\n config.src = src;\n }\n\n // Boolean attributes (supports: data-autoplay or just autoplay)\n const autoplay = getAttr(element, 'data-autoplay', 'autoplay');\n if (autoplay !== null) {\n config.autoplay = autoplay !== 'false';\n }\n\n const muted = getAttr(element, 'data-muted', 'muted');\n if (muted !== null) {\n config.muted = muted !== 'false';\n }\n\n const controls = getAttr(element, 'data-controls', 'controls');\n if (controls !== null) {\n config.controls = controls !== 'false';\n }\n\n const keyboard = getAttr(element, 'data-keyboard', 'keyboard');\n if (keyboard !== null) {\n config.keyboard = keyboard !== 'false';\n }\n\n const loop = getAttr(element, 'data-loop', 'loop');\n if (loop !== null) {\n config.loop = loop !== 'false';\n }\n\n // String attributes (supports: data-poster or just poster)\n const poster = getAttr(element, 'data-poster', 'poster');\n if (poster) {\n config.poster = poster;\n }\n\n // Brand color (supports: data-brand-color, data-color, color)\n const brandColor = getAttr(element, 'data-brand-color', 'data-color', 'color');\n if (brandColor) {\n config.brandColor = brandColor;\n }\n\n const primaryColor = element.getAttribute('data-primary-color');\n if (primaryColor) {\n config.primaryColor = primaryColor;\n }\n\n const backgroundColor = element.getAttribute('data-background-color');\n if (backgroundColor) {\n config.backgroundColor = backgroundColor;\n }\n\n const width = element.getAttribute('data-width');\n if (width) {\n config.width = width;\n }\n\n const height = element.getAttribute('data-height');\n if (height) {\n config.height = height;\n }\n\n const aspectRatio = element.getAttribute('data-aspect-ratio');\n if (aspectRatio) {\n config.aspectRatio = aspectRatio;\n }\n\n const className = element.getAttribute('data-class');\n if (className) {\n config.className = className;\n }\n\n // Number attributes\n const hideDelay = element.getAttribute('data-hide-delay');\n if (hideDelay) {\n const parsed = parseInt(hideDelay, 10);\n if (!isNaN(parsed)) {\n config.hideDelay = parsed;\n }\n }\n\n const playbackRate = element.getAttribute('data-playback-rate');\n if (playbackRate) {\n const parsed = parseFloat(playbackRate);\n if (!isNaN(parsed)) {\n config.playbackRate = parsed;\n }\n }\n\n const startTime = element.getAttribute('data-start-time');\n if (startTime) {\n const parsed = parseFloat(startTime);\n if (!isNaN(parsed)) {\n config.startTime = parsed;\n }\n }\n\n return config;\n}\n\n/**\n * Convert aspect ratio string (e.g., \"16:9\") to percentage\n */\nexport function aspectRatioToPercent(ratio: string): number {\n const parts = ratio.split(':').map(Number);\n const width = parts[0];\n const height = parts[1];\n if (parts.length === 2 && width !== undefined && height !== undefined && !isNaN(width) && !isNaN(height) && width > 0) {\n return (height / width) * 100;\n }\n return 56.25; // Default 16:9\n}\n\n/**\n * Apply container styles based on config\n */\nexport function applyContainerStyles(\n container: HTMLElement,\n config: Partial<EmbedConfig>\n): void {\n // Apply custom class\n if (config.className) {\n container.classList.add(...config.className.split(' '));\n }\n\n // Apply width\n if (config.width) {\n container.style.width = config.width;\n }\n\n // Apply height or aspect ratio\n if (config.height) {\n container.style.height = config.height;\n } else if (config.aspectRatio) {\n // Use padding-bottom technique for aspect ratio\n container.style.position = 'relative';\n container.style.paddingBottom = `${aspectRatioToPercent(config.aspectRatio)}%`;\n container.style.height = '0';\n }\n}\n","import { ScarlettPlayer, createPlayer, type Plugin } from '@scarlett-player/core';\nimport { createHLSPlugin } from '@scarlett-player/hls';\nimport { uiPlugin } from '@scarlett-player/ui';\nimport type { EmbedConfig, EmbedPlayerOptions } from './types';\nimport { parseDataAttributes, applyContainerStyles } from './parser';\n\n/**\n * Create a player instance from configuration\n */\nexport async function createEmbedPlayer(\n container: HTMLElement,\n config: Partial<EmbedConfig>\n): Promise<ScarlettPlayer | null> {\n if (!config.src) {\n console.error('[Scarlett Player] No source URL provided');\n return null;\n }\n\n try {\n // Apply container styles\n applyContainerStyles(container, config);\n\n // Build theme config\n const theme: Record<string, string> = {};\n if (config.brandColor) {\n theme.accentColor = config.brandColor;\n }\n if (config.primaryColor) {\n theme.primaryColor = config.primaryColor;\n }\n if (config.backgroundColor) {\n theme.backgroundColor = config.backgroundColor;\n }\n\n // Build UI plugin config\n const uiConfig: Record<string, unknown> = {};\n if (Object.keys(theme).length > 0) {\n uiConfig.theme = theme;\n }\n if (config.hideDelay !== undefined) {\n uiConfig.hideDelay = config.hideDelay;\n }\n\n // Build plugins array\n const plugins: Plugin[] = [createHLSPlugin()];\n\n // Only add UI plugin if controls are enabled (default: true)\n if (config.controls !== false) {\n plugins.push(uiPlugin(uiConfig));\n }\n\n // Create player\n const player = await createPlayer({\n container,\n src: config.src,\n autoplay: config.autoplay || false,\n muted: config.muted || false,\n poster: config.poster,\n loop: config.loop || false,\n plugins,\n });\n\n // Apply post-initialization settings\n const video = container.querySelector('video');\n if (video) {\n if (config.playbackRate) {\n video.playbackRate = config.playbackRate;\n }\n if (config.startTime) {\n video.currentTime = config.startTime;\n }\n }\n\n return player;\n } catch (error) {\n console.error('[Scarlett Player] Failed to create player:', error);\n return null;\n }\n}\n\n/**\n * Initialize a player from a DOM element with data attributes\n */\nexport async function initElement(element: HTMLElement): Promise<ScarlettPlayer | null> {\n // Check if already initialized\n if (element.hasAttribute('data-scarlett-initialized')) {\n return null;\n }\n\n // Parse data attributes\n const config = parseDataAttributes(element);\n\n // Mark as initializing to prevent double-init\n element.setAttribute('data-scarlett-initialized', 'true');\n\n // Create player\n const player = await createEmbedPlayer(element, config);\n\n if (!player) {\n // Remove marker if initialization failed\n element.removeAttribute('data-scarlett-initialized');\n }\n\n return player;\n}\n\n/**\n * Selectors for auto-initialization (in order of preference)\n * Supports multiple patterns for simpler drop-in usage\n */\nconst PLAYER_SELECTORS = [\n '[data-scarlett-player]', // Full name: <div data-scarlett-player>\n '[data-sp]', // Short: <div data-sp>\n '[data-video-player]', // Generic: <div data-video-player>\n '.scarlett-player', // Class-based: <div class=\"scarlett-player\">\n];\n\n/**\n * Initialize all players on the page\n * Supports multiple selector patterns for flexibility\n */\nexport async function initAll(): Promise<void> {\n const selector = PLAYER_SELECTORS.join(', ');\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n const promises = Array.from(elements).map((element) => initElement(element));\n await Promise.all(promises);\n\n if (elements.length > 0) {\n console.log(`[Scarlett Player] Initialized ${elements.length} player(s)`);\n }\n}\n\n/**\n * Programmatic API for creating players\n */\nexport async function create(options: EmbedPlayerOptions): Promise<ScarlettPlayer | null> {\n // Resolve container\n let container: HTMLElement | null = null;\n\n if (typeof options.container === 'string') {\n container = document.querySelector<HTMLElement>(options.container);\n if (!container) {\n console.error(`[Scarlett Player] Container not found: ${options.container}`);\n return null;\n }\n } else {\n container = options.container;\n }\n\n // Build config from options\n const config: Partial<EmbedConfig> = { ...options };\n\n // Create player\n return createEmbedPlayer(container, config);\n}\n","/**\n * Scarlett Player Embed Package\n *\n * Standalone, CDN-ready player that can be used without npm/bundlers.\n * Supports both declarative (data attributes) and programmatic (JavaScript API) usage.\n *\n * @packageDocumentation\n */\n\nimport type { ScarlettPlayerGlobal } from './types';\nimport { initAll, create } from './embed';\n\n// Export types for TypeScript users\nexport type { EmbedConfig, EmbedPlayerOptions, ScarlettPlayerGlobal } from './types';\nexport { createEmbedPlayer, initElement, initAll, create } from './embed';\nexport { parseDataAttributes, applyContainerStyles, aspectRatioToPercent } from './parser';\n\n// Package version\nconst VERSION = '0.1.0';\n\n/**\n * Global API exposed as window.ScarlettPlayer\n */\nconst ScarlettPlayerAPI: ScarlettPlayerGlobal = {\n create,\n initAll,\n version: VERSION,\n};\n\n// Expose on window\nif (typeof window !== 'undefined') {\n window.ScarlettPlayer = ScarlettPlayerAPI;\n}\n\n/**\n * Auto-initialize on DOMContentLoaded\n */\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n initAll();\n });\n } else {\n // DOM already loaded, initialize immediately\n initAll();\n }\n}\n\nexport default ScarlettPlayerAPI;\n"],"names":[],"mappings":"AA2BA,MAAM,OAAO;AAAA,EACX,YAAY,cAAc;AACxB,SAAK,cAA8B,oBAAI,IAAG;AAC1C,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AAIJ,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAU;AACZ,QAAI,OAAO,GAAG,KAAK,OAAO,QAAQ,GAAG;AACnC;AAAA,IACF;AACA,SAAK,QAAQ;AACb,SAAK,OAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,SAAS;AACd,SAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,UAAU;AAClB,SAAK,YAAY,IAAI,QAAQ;AAC7B,WAAO,MAAM,KAAK,YAAY,OAAO,QAAQ;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,SAAK,YAAY,QAAQ,CAAC,eAAe;AACvC,UAAI;AACF,mBAAU;AAAA,MACZ,SAAS,OAAO;AACd,gBAAQ,MAAM,iDAAiD,KAAK;AAAA,MACtE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,YAAY,MAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB;AACnB,WAAO,KAAK,YAAY;AAAA,EAC1B;AACF;AACA,SAAS,OAAO,cAAc;AAC5B,SAAO,IAAI,OAAO,YAAY;AAChC;AAyFA,MAAM,gBAAgB;AAAA;AAAA,EAEpB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA;AAAA,EAET,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,gBAAgB;AAAA;AAAA,EAEhB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,OAAO;AAAA;AAAA,EAEP,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,iBAAiB;AAAA;AAAA,EAEjB,WAAW,CAAA;AAAA,EACX,gBAAgB;AAAA,EAChB,aAAa,CAAA;AAAA,EACb,mBAAmB;AAAA,EACnB,YAAY,CAAA;AAAA,EACZ,kBAAkB;AAAA;AAAA,EAElB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,eAAe;AAAA,EACf,aAAa;AAAA,EACb,gBAAgB;AAAA;AAAA,EAEhB,UAAU,CAAA;AAAA,EACV,gBAAgB;AAAA;AAAA,EAEhB,OAAO;AAAA;AAAA,EAEP,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA;AAAA,EAEN,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,kBAAkB;AAAA;AAAA,EAElB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AACX;AACA,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,YAAY,cAAc;AACxB,SAAK,UAA0B,oBAAI,IAAG;AACtC,SAAK,oBAAoC,oBAAI,IAAG;AAChD,SAAK,kBAAkB,YAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAW;AAC3B,UAAM,eAAe,EAAE,GAAG,eAAe,GAAG,UAAS;AACrD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,YAAM,WAAW;AACjB,YAAM,cAAc,OAAO,KAAK;AAChC,kBAAY,UAAU,MAAM;AAC1B,aAAK,wBAAwB,QAAQ;AAAA,MACvC,CAAC;AACD,WAAK,QAAQ,IAAI,UAAU,WAAW;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,KAAK;AACP,UAAM,cAAc,KAAK,QAAQ,IAAI,GAAG;AACxC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,qCAAqC,GAAG,EAAE;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAAS,KAAK;AACZ,WAAO,KAAK,IAAI,GAAG,EAAE,IAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,IAAI,KAAK,OAAO;AACd,SAAK,IAAI,GAAG,EAAE,IAAI,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,SAAS;AACd,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAM,WAAW;AACjB,UAAI,KAAK,QAAQ,IAAI,QAAQ,GAAG;AAC9B,aAAK,IAAI,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,eAAe,KAAK,UAAU;AAC5B,UAAM,cAAc,KAAK,IAAI,GAAG;AAChC,WAAO,YAAY,UAAU,MAAM;AACjC,eAAS,YAAY,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,UAAU,UAAU;AAClB,SAAK,kBAAkB,IAAI,QAAQ;AACnC,WAAO,MAAM,KAAK,kBAAkB,OAAO,QAAQ;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,KAAK;AAC3B,UAAM,cAAc,KAAK,IAAI,GAAG;AAChC,UAAM,QAAQ,YAAY,IAAG;AAC7B,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,eAAe;AAAA;AAAA,IAErB;AACI,SAAK,kBAAkB,QAAQ,CAAC,eAAe;AAC7C,UAAI;AACF,mBAAW,KAAK;AAAA,MAClB,SAAS,OAAO;AACd,gBAAQ,MAAM,8CAA8C,KAAK;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ;AACN,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,KAAK;AACZ,UAAM,eAAe,cAAc,GAAG;AACtC,SAAK,IAAI,KAAK,YAAY;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,WAAW;AACT,UAAM,WAAW,CAAA;AACjB,eAAW,CAAC,KAAK,WAAW,KAAK,KAAK,SAAS;AAC7C,eAAS,GAAG,IAAI,YAAY,IAAG;AAAA,IACjC;AACA,WAAO,OAAO,OAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,KAAK;AACtB,WAAO,KAAK,QAAQ,IAAI,GAAG,GAAG,mBAAkB,KAAM;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,SAAK,QAAQ,QAAQ,CAAC,gBAAgB,YAAY,SAAS;AAC3D,SAAK,QAAQ,MAAK;AAClB,SAAK,kBAAkB,MAAK;AAAA,EAC9B;AACF;AACA,MAAM,kBAAkB;AAAA,EACtB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,cAAc;AAChB;AACA,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,YAAY,SAAS;AACnB,SAAK,YAA4B,oBAAI,IAAG;AACxC,SAAK,gBAAgC,oBAAI,IAAG;AAC5C,SAAK,eAA+B,oBAAI,IAAG;AAC3C,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,GAAG,OAAO,SAAS;AACjB,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACrD;AACA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,aAAS,IAAI,OAAO;AACpB,SAAK,kBAAkB,KAAK;AAC5B,WAAO,MAAM,KAAK,IAAI,OAAO,OAAO;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,OAAO,SAAS;AACnB,QAAI,CAAC,KAAK,cAAc,IAAI,KAAK,GAAG;AAClC,WAAK,cAAc,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACzD;AACA,UAAM,WAAW,KAAK,cAAc,IAAI,KAAK;AAC7C,aAAS,IAAI,OAAO;AACpB,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACrD;AACA,WAAO,MAAM;AACX,eAAS,OAAO,OAAO;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,OAAO,SAAS;AAClB,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,UAAU;AACZ,eAAS,OAAO,OAAO;AACvB,UAAI,SAAS,SAAS,GAAG;AACvB,aAAK,UAAU,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AACA,UAAM,eAAe,KAAK,cAAc,IAAI,KAAK;AACjD,QAAI,cAAc;AAChB,mBAAa,OAAO,OAAO;AAC3B,UAAI,aAAa,SAAS,GAAG;AAC3B,aAAK,cAAc,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,OAAO,SAAS;AACnB,UAAM,qBAAqB,KAAK,gBAAgB,OAAO,OAAO;AAC9D,QAAI,uBAAuB,MAAM;AAC/B;AAAA,IACF;AACA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,UAAU;AACZ,YAAM,gBAAgB,MAAM,KAAK,QAAQ;AACzC,oBAAc,QAAQ,CAAC,YAAY;AACjC,aAAK,gBAAgB,SAAS,kBAAkB;AAAA,MAClD,CAAC;AAAA,IACH;AACA,UAAM,eAAe,KAAK,cAAc,IAAI,KAAK;AACjD,QAAI,cAAc;AAChB,YAAM,gBAAgB,MAAM,KAAK,YAAY;AAC7C,oBAAc,QAAQ,CAAC,YAAY;AACjC,aAAK,gBAAgB,SAAS,kBAAkB;AAAA,MAClD,CAAC;AACD,WAAK,cAAc,OAAO,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,UAAU,OAAO,SAAS;AAC9B,UAAM,qBAAqB,MAAM,KAAK,qBAAqB,OAAO,OAAO;AACzE,QAAI,uBAAuB,MAAM;AAC/B;AAAA,IACF;AACA,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,UAAU;AACZ,YAAM,WAAW,MAAM,KAAK,QAAQ,EAAE;AAAA,QACpC,CAAC,YAAY,KAAK,qBAAqB,SAAS,kBAAkB;AAAA,MAC1E;AACM,YAAM,QAAQ,IAAI,QAAQ;AAAA,IAC5B;AACA,UAAM,eAAe,KAAK,cAAc,IAAI,KAAK;AACjD,QAAI,cAAc;AAChB,YAAM,gBAAgB,MAAM,KAAK,YAAY;AAC7C,YAAM,WAAW,cAAc;AAAA,QAC7B,CAAC,YAAY,KAAK,qBAAqB,SAAS,kBAAkB;AAAA,MAC1E;AACM,YAAM,QAAQ,IAAI,QAAQ;AAC1B,WAAK,cAAc,OAAO,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,UAAU,OAAO,aAAa;AAC5B,QAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,aAAO,MAAM;AAAA,MACb;AAAA,IACF;AACA,QAAI,CAAC,KAAK,aAAa,IAAI,KAAK,GAAG;AACjC,WAAK,aAAa,IAAI,OAAuB,oBAAI,IAAG,CAAE;AAAA,IACxD;AACA,UAAM,kBAAkB,KAAK,aAAa,IAAI,KAAK;AACnD,oBAAgB,IAAI,WAAW;AAC/B,WAAO,MAAM;AACX,sBAAgB,OAAO,WAAW;AAClC,UAAI,gBAAgB,SAAS,GAAG;AAC9B,aAAK,aAAa,OAAO,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,mBAAmB,OAAO;AACxB,QAAI,OAAO;AACT,WAAK,UAAU,OAAO,KAAK;AAC3B,WAAK,cAAc,OAAO,KAAK;AAAA,IACjC,OAAO;AACL,WAAK,UAAU,MAAK;AACpB,WAAK,cAAc,MAAK;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,cAAc,OAAO;AACnB,UAAM,eAAe,KAAK,UAAU,IAAI,KAAK,GAAG,QAAQ;AACxD,UAAM,YAAY,KAAK,cAAc,IAAI,KAAK,GAAG,QAAQ;AACzD,WAAO,eAAe;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,SAAK,UAAU,MAAK;AACpB,SAAK,cAAc,MAAK;AACxB,SAAK,aAAa,MAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAO,SAAS;AAC9B,QAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,KAAK,aAAa,IAAI,KAAK;AACnD,QAAI,CAAC,mBAAmB,gBAAgB,SAAS,GAAG;AAClD,aAAO;AAAA,IACT;AACA,QAAI,iBAAiB;AACrB,eAAW,eAAe,iBAAiB;AACzC,UAAI;AACF,yBAAiB,YAAY,cAAc;AAC3C,YAAI,mBAAmB,MAAM;AAC3B,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,OAAO,SAAS;AACzC,QAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,KAAK,aAAa,IAAI,KAAK;AACnD,QAAI,CAAC,mBAAmB,gBAAgB,SAAS,GAAG;AAClD,aAAO;AAAA,IACT;AACA,QAAI,iBAAiB;AACrB,eAAW,eAAe,iBAAiB;AACzC,UAAI;AACF,cAAM,SAAS,YAAY,cAAc;AACzC,yBAAiB,kBAAkB,UAAU,MAAM,SAAS;AAC5D,YAAI,mBAAmB,MAAM;AAC3B,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAS,SAAS;AAChC,QAAI;AACF,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,sCAAsC,KAAK;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,SAAS,SAAS;AAC3C,QAAI;AACF,YAAM,SAAS,QAAQ,OAAO;AAC9B,UAAI,kBAAkB,SAAS;AAC7B,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,sCAAsC,KAAK;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAO;AACvB,UAAM,QAAQ,KAAK,cAAc,KAAK;AACtC,QAAI,QAAQ,KAAK,QAAQ,cAAc;AACrC,cAAQ;AAAA,QACN,6BAA6B,KAAK,QAAQ,YAAY,yBAAyB,KAAK,oBAAoB,KAAK;AAAA,MACrH;AAAA,IACI;AAAA,EACF;AACF;AACA,MAAM,aAAa,CAAC,SAAS,QAAQ,QAAQ,OAAO;AACpD,MAAM,wBAAwB,CAAC,UAAU;AACvC,QAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,KAAK,MAAM;AAClD,QAAM,UAAU,GAAG,MAAM,IAAI,MAAM,OAAO;AAC1C,QAAM,WAAW,MAAM,YAAY;AACnC,UAAQ,MAAM,OAAK;AAAA,IACjB,KAAK;AACH,cAAQ,MAAM,SAAS,QAAQ;AAC/B;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,SAAS,QAAQ;AAC9B;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,SAAS,QAAQ;AAC9B;AAAA,IACF,KAAK;AACH,cAAQ,MAAM,SAAS,QAAQ;AAC/B;AAAA,EACN;AACA;AACA,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,YAAY,SAAS;AACnB,SAAK,QAAQ,SAAS,SAAS;AAC/B,SAAK,QAAQ,SAAS;AACtB,SAAK,UAAU,SAAS,WAAW;AACnC,SAAK,WAAW,SAAS,YAAY,CAAC,qBAAqB;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAO;AACX,WAAO,IAAI,OAAO;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,QAAQ,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,MAC/C,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,IACrB,CAAK;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAS,UAAU;AACvB,SAAK,IAAI,SAAS,SAAS,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAK,SAAS,UAAU;AACtB,SAAK,IAAI,QAAQ,SAAS,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAK,SAAS,UAAU;AACtB,SAAK,IAAI,QAAQ,SAAS,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAS,UAAU;AACvB,SAAK,IAAI,SAAS,SAAS,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAAS,OAAO;AACd,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAW,SAAS;AAClB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,WAAW,SAAS;AAClB,SAAK,SAAS,KAAK,OAAO;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,SAAS;AACrB,UAAM,QAAQ,KAAK,SAAS,QAAQ,OAAO;AAC3C,QAAI,UAAU,IAAI;AAChB,WAAK,SAAS,OAAO,OAAO,CAAC;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU,KAAK,GAAG;AAC3C;AAAA,IACF;AACA,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAG;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ;AAAA,IACN;AACI,eAAW,WAAW,KAAK,UAAU;AACnC,UAAI;AACF,gBAAQ,KAAK;AAAA,MACf,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAO;AACf,WAAO,WAAW,QAAQ,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK;AAAA,EACnE;AACF;AAIA,IAAI,YAA6B,kBAAC,eAAe;AAC/C,aAAW,sBAAsB,IAAI;AACrC,aAAW,oBAAoB,IAAI;AACnC,aAAW,oBAAoB,IAAI;AACnC,aAAW,uBAAuB,IAAI;AACtC,aAAW,qBAAqB,IAAI;AACpC,aAAW,kBAAkB,IAAI;AACjC,aAAW,iBAAiB,IAAI;AAChC,aAAW,oBAAoB,IAAI;AACnC,aAAW,qBAAqB,IAAI;AACpC,aAAW,eAAe,IAAI;AAC9B,SAAO;AACT,GAAG,aAAa,CAAA,CAAE;AAClB,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,YAAY,UAAU,QAAQ,SAAS;AACrC,SAAK,SAAS,CAAA;AACd,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,aAAa,SAAS,cAAc;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,OAAO,SAAS;AACrB,UAAM,cAAc,KAAK,eAAe,OAAO,OAAO;AACtD,SAAK,aAAa,WAAW;AAC7B,SAAK,SAAS,WAAW;AACzB,SAAK,SAAS,KAAK,SAAS,WAAW;AACvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,MAAM,SAAS,SAAS;AAC5B,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,OAAO,SAAS,SAAS,KAAK,YAAY,IAAI;AAAA,MAC9C,WAAW,KAAK,IAAG;AAAA,MACnB,SAAS,SAAS;AAAA,MAClB,eAAe,SAAS;AAAA,IAC9B;AACI,WAAO,KAAK,OAAO,OAAO,SAAS,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa;AACX,WAAO,CAAC,GAAG,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,eAAe;AACb,WAAO,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,KAAK;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe;AACb,SAAK,SAAS,CAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,gBAAgB;AACd,WAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAO,SAAS;AAC7B,QAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,QAAO;AAAA,MAC/C;AAAA,IACI;AACA,WAAO;AAAA,MACL,MAAM,KAAK,aAAa,KAAK;AAAA,MAC7B,SAAS,MAAM;AAAA,MACf,OAAO,KAAK,QAAQ,KAAK;AAAA,MACzB,WAAW,KAAK,IAAG;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,IACrB;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAO;AAClB,UAAM,UAAU,MAAM,QAAQ,YAAW;AACzC,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS,UAAU,GAAG;AAChC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAO;AACb,WAAO,KAAK,YAAY,KAAK,aAAa,KAAK,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAM;AAChB,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IAEN;AACI,WAAO,WAAW,SAAS,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAO;AACnB,WAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,aAAa,SAAS,WAAW,SAAS,eAAe;AAAA,EACpI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAO;AAClB,SAAK,OAAO,KAAK,KAAK;AACtB,QAAI,KAAK,OAAO,SAAS,KAAK,YAAY;AACxC,WAAK,OAAO,MAAK;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAO;AACd,UAAM,aAAa,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO;AACnD,QAAI,MAAM,OAAO;AACf,WAAK,OAAO,MAAM,YAAY;AAAA,QAC5B,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACvB,CAAO;AAAA,IACH,OAAO;AACL,WAAK,OAAO,KAAK,YAAY;AAAA,QAC3B,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACvB,CAAO;AAAA,IACH;AAAA,EACF;AACF;AACA,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,YAAY,UAAU,MAAM;AAC1B,SAAK,aAAa,CAAA;AAClB,SAAK,WAAW;AAChB,SAAK,eAAe,KAAK;AACzB,SAAK,WAAW,KAAK;AACrB,SAAK,YAAY,KAAK;AACtB,SAAK,cAAc,KAAK;AACxB,SAAK,SAAS;AAAA,MACZ,OAAO,CAAC,KAAK,aAAa,KAAK,OAAO,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,MAC5E,MAAM,CAAC,KAAK,aAAa,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,MAC1E,MAAM,CAAC,KAAK,aAAa,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,MAC1E,OAAO,CAAC,KAAK,aAAa,KAAK,OAAO,MAAM,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ;AAAA,IAClF;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAK;AACZ,WAAO,KAAK,aAAa,SAAS,GAAG;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAK,OAAO;AACnB,SAAK,aAAa,IAAI,KAAK,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAG,OAAO,SAAS;AACjB,WAAO,KAAK,SAAS,GAAG,OAAO,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,OAAO,SAAS;AAClB,SAAK,SAAS,IAAI,OAAO,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,OAAO,SAAS;AACnB,SAAK,SAAS,KAAK,OAAO,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,IAAI;AACZ,WAAO,KAAK,YAAY,EAAE;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,SAAS;AACjB,SAAK,WAAW,KAAK,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,UAAU;AACzB,WAAO,KAAK,aAAa,UAAU,QAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc;AACZ,eAAW,WAAW,KAAK,YAAY;AACrC,UAAI;AACF,gBAAO;AAAA,MACT,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,2BAA2B,EAAE,MAAK,CAAE;AAAA,MACxD;AAAA,IACF;AACA,SAAK,aAAa,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB;AACd,WAAO,KAAK;AAAA,EACd;AACF;AACA,MAAM,cAAc;AAAA,EAClB,YAAY,UAAU,cAAc,QAAQ,SAAS;AACnD,SAAK,UAA0B,oBAAI,IAAG;AACtC,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,SAAS;AACd,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA;AAAA,EAEA,SAAS,QAAQ,QAAQ;AACvB,QAAI,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG;AAC/B,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,yBAAyB;AAAA,IAC/D;AACA,SAAK,eAAe,MAAM;AAC1B,UAAM,MAAM,IAAI,UAAU,OAAO,IAAI;AAAA,MACnC,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,WAAW,CAAC,OAAO,KAAK,eAAe,EAAE;AAAA,IAC/C,CAAK;AACD,SAAK,QAAQ,IAAI,OAAO,IAAI;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,YAAY,CAAA;AAAA,MACZ;AAAA,IACN,CAAK;AACD,SAAK,OAAO,KAAK,sBAAsB,OAAO,EAAE,EAAE;AAClD,SAAK,SAAS,KAAK,qBAAqB,EAAE,MAAM,OAAO,IAAI,MAAM,OAAO,KAAI,CAAE;AAAA,EAChF;AAAA;AAAA,EAEA,MAAM,WAAW,IAAI;AACnB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,OAAQ;AACb,QAAI,OAAO,UAAU,SAAS;AAC5B,YAAM,KAAK,cAAc,EAAE;AAAA,IAC7B;AACA,SAAK,QAAQ,OAAO,EAAE;AACtB,SAAK,OAAO,KAAK,wBAAwB,EAAE,EAAE;AAAA,EAC/C;AAAA;AAAA,EAEA,MAAM,UAAU;AACd,UAAM,QAAQ,KAAK,uBAAsB;AACzC,eAAW,MAAM,OAAO;AACtB,YAAM,KAAK,WAAW,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM,WAAW,IAAI;AACnB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,EAAE,aAAa;AAAA,IAC5C;AACA,QAAI,OAAO,UAAU,QAAS;AAC9B,QAAI,OAAO,UAAU,gBAAgB;AACnC,YAAM,IAAI,MAAM,WAAW,EAAE,0DAA0D;AAAA,IACzF;AACA,eAAW,SAAS,OAAO,OAAO,gBAAgB,CAAA,GAAI;AACpD,YAAM,MAAM,KAAK,QAAQ,IAAI,KAAK;AAClC,UAAI,CAAC,KAAK;AACR,cAAM,IAAI,MAAM,WAAW,EAAE,gCAAgC,KAAK,GAAG;AAAA,MACvE;AACA,UAAI,IAAI,UAAU,SAAS;AACzB,cAAM,KAAK,WAAW,KAAK;AAAA,MAC7B;AAAA,IACF;AACA,QAAI;AACF,aAAO,QAAQ;AACf,UAAI,OAAO,OAAO,eAAe;AAC/B,cAAM,QAAQ,KAAK,aAAa,UAAU,OAAO,OAAO,cAAc,KAAK,OAAO,MAAM,CAAC;AACzF,eAAO,IAAI,UAAU,KAAK;AAAA,MAC5B;AACA,UAAI,OAAO,OAAO,SAAS;AACzB,cAAM,QAAQ,KAAK,SAAS,GAAG,SAAS,CAAC,QAAQ;AAC/C,iBAAO,OAAO,UAAU,IAAI,iBAAiB,IAAI,MAAM,IAAI,OAAO,CAAC;AAAA,QACrE,CAAC;AACD,eAAO,IAAI,UAAU,KAAK;AAAA,MAC5B;AACA,YAAM,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM;AAClD,aAAO,QAAQ;AACf,WAAK,OAAO,KAAK,iBAAiB,EAAE,EAAE;AACtC,WAAK,SAAS,KAAK,iBAAiB,EAAE,MAAM,IAAI;AAAA,IAClD,SAAS,OAAO;AACd,aAAO,QAAQ;AACf,aAAO,QAAQ;AACf,WAAK,OAAO,MAAM,uBAAuB,EAAE,IAAI,EAAE,OAAO;AACxD,WAAK,SAAS,KAAK,gBAAgB,EAAE,MAAM,IAAI,OAAO;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,QAAQ,KAAK,uBAAsB,EAAG,QAAO;AACnD,eAAW,MAAM,OAAO;AACtB,YAAM,KAAK,cAAc,EAAE;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA,EAEA,MAAM,cAAc,IAAI;AACtB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,UAAU,OAAO,UAAU,QAAS;AACzC,QAAI;AACF,YAAM,OAAO,OAAO,QAAO;AAC3B,aAAO,IAAI,YAAW;AACtB,aAAO,QAAQ;AACf,WAAK,OAAO,KAAK,qBAAqB,EAAE,EAAE;AAC1C,WAAK,SAAS,KAAK,oBAAoB,EAAE,MAAM,IAAI;AAAA,IACrD,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,0BAA0B,EAAE,IAAI,EAAE,OAAO;AAC3D,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAEA,UAAU,IAAI;AACZ,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,WAAO,SAAS,OAAO,SAAS;AAAA,EAClC;AAAA;AAAA,EAEA,eAAe,IAAI;AACjB,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,WAAO,QAAQ,UAAU,UAAU,OAAO,SAAS;AAAA,EACrD;AAAA;AAAA,EAEA,UAAU,IAAI;AACZ,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA;AAAA,EAEA,eAAe,IAAI;AACjB,WAAO,KAAK,QAAQ,IAAI,EAAE,GAAG,SAAS;AAAA,EACxC;AAAA;AAAA,EAEA,eAAe;AACb,WAAO,MAAM,KAAK,KAAK,QAAQ,KAAI,CAAE;AAAA,EACvC;AAAA;AAAA,EAEA,kBAAkB;AAChB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAM,CAAE,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,EACjG;AAAA;AAAA,EAEA,iBAAiB,MAAM;AACrB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAM,CAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,EACpG;AAAA;AAAA,EAEA,eAAe,QAAQ;AACrB,UAAM,YAAY,KAAK,iBAAiB,UAAU;AAClD,eAAW,YAAY,WAAW;AAChC,YAAM,UAAU,SAAS;AACzB,UAAI,OAAO,YAAY,cAAc,QAAQ,MAAM,GAAG;AACpD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,yBAAyB;AACvB,UAAM,UAA0B,oBAAI,IAAG;AACvC,UAAM,WAA2B,oBAAI,IAAG;AACxC,UAAM,SAAS,CAAA;AACf,UAAM,QAAQ,CAAC,IAAI,OAAO,CAAA,MAAO;AAC/B,UAAI,QAAQ,IAAI,EAAE,EAAG;AACrB,UAAI,SAAS,IAAI,EAAE,GAAG;AACpB,cAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,EAAE,KAAK,MAAM;AACvC,cAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,MAC1D;AACA,YAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,UAAI,CAAC,OAAQ;AACb,eAAS,IAAI,EAAE;AACf,iBAAW,SAAS,OAAO,OAAO,gBAAgB,CAAA,GAAI;AACpD,YAAI,KAAK,QAAQ,IAAI,KAAK,GAAG;AAC3B,gBAAM,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;AAAA,QAC5B;AAAA,MACF;AACA,eAAS,OAAO,EAAE;AAClB,cAAQ,IAAI,EAAE;AACd,aAAO,KAAK,EAAE;AAAA,IAChB;AACA,eAAW,MAAM,KAAK,QAAQ,KAAI,GAAI;AACpC,YAAM,EAAE;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,eAAe,QAAQ;AACrB,QAAI,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO,UAAU;AAC/C,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,QAAI,CAAC,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AACnD,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,0BAA0B;AAAA,IAChE;AACA,QAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;AACzD,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,6BAA6B;AAAA,IACnE;AACA,QAAI,CAAC,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AACnD,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,0BAA0B;AAAA,IAChE;AACA,QAAI,OAAO,OAAO,SAAS,YAAY;AACrC,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,8BAA8B;AAAA,IACpE;AACA,QAAI,OAAO,OAAO,YAAY,YAAY;AACxC,YAAM,IAAI,MAAM,WAAW,OAAO,EAAE,gCAAgC;AAAA,IACtE;AAAA,EACF;AACF;AACA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,YAAY,SAAS;AACnB,SAAK,mBAAmB;AACxB,SAAK,YAAY;AACjB,SAAK,sBAAsB;AAC3B,SAAK,oBAAoB;AACzB,QAAI,OAAO,QAAQ,cAAc,UAAU;AACzC,YAAM,KAAK,SAAS,cAAc,QAAQ,SAAS;AACnD,UAAI,CAAC,MAAM,EAAE,cAAc,cAAc;AACvC,cAAM,IAAI,MAAM,wCAAwC,QAAQ,SAAS,EAAE;AAAA,MAC7E;AACA,WAAK,YAAY;AAAA,IACnB,WAAW,QAAQ,qBAAqB,aAAa;AACnD,WAAK,YAAY,QAAQ;AAAA,IAC3B,OAAO;AACL,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AACA,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,IAAI,SAAQ;AAC5B,SAAK,eAAe,IAAI,aAAa;AAAA,MACnC,UAAU,QAAQ,YAAY;AAAA,MAC9B,MAAM,QAAQ,QAAQ;AAAA,MACtB,QAAQ,QAAQ,UAAU;AAAA,MAC1B,OAAO,QAAQ,SAAS;AAAA,IAC9B,CAAK;AACD,SAAK,SAAS,IAAI,OAAO;AAAA,MACvB,OAAO,QAAQ,YAAY;AAAA,MAC3B,OAAO;AAAA,IACb,CAAK;AACD,SAAK,eAAe,IAAI,aAAa,KAAK,UAAU,KAAK,MAAM;AAC/D,SAAK,gBAAgB,IAAI;AAAA,MACvB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,WAAW,KAAK,UAAS;AAAA,IACjC;AACI,QAAI,QAAQ,SAAS;AACnB,iBAAW,UAAU,QAAQ,SAAS;AACpC,aAAK,cAAc,SAAS,MAAM;AAAA,MACpC;AAAA,IACF;AACA,SAAK,OAAO,KAAK,8BAA8B;AAAA,MAC7C,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ,SAAS,UAAU;AAAA,IAC1C,CAAK;AACD,SAAK,SAAS,KAAK,gBAAgB,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO;AACX,SAAK,eAAc;AACnB,eAAW,CAAC,IAAI,MAAM,KAAK,KAAK,cAAc,SAAS;AACrD,UAAI,OAAO,OAAO,SAAS,cAAc,OAAO,UAAU,cAAc;AACtE,cAAM,KAAK,cAAc,WAAW,EAAE;AAAA,MACxC;AAAA,IACF;AACA,QAAI,KAAK,YAAY;AACnB,YAAM,KAAK,KAAK,KAAK,UAAU;AAAA,IACjC;AACA,WAAO,QAAQ,QAAO;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,KAAK,QAAQ;AACjB,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,KAAK,kBAAkB,EAAE,OAAM,CAAE;AAC7C,WAAK,aAAa,OAAO;AAAA,QACvB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,QACX,aAAa;AAAA,QACb,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACvB,CAAO;AACD,UAAI,KAAK,kBAAkB;AACzB,cAAM,qBAAqB,KAAK,iBAAiB;AACjD,aAAK,OAAO,KAAK,gCAAgC,EAAE,UAAU,oBAAoB;AACjF,cAAM,KAAK,cAAc,cAAc,kBAAkB;AACzD,aAAK,mBAAmB;AAAA,MAC1B;AACA,YAAM,WAAW,KAAK,cAAc,eAAe,MAAM;AACzD,UAAI,CAAC,UAAU;AACb,aAAK,aAAa;AAAA,UAChB,UAAU;AAAA,UACV,iCAAiC,MAAM;AAAA,UACvC;AAAA,YACE,OAAO;AAAA,YACP,SAAS,EAAE,OAAM;AAAA,UAC7B;AAAA,QACA;AACQ;AAAA,MACF;AACA,WAAK,mBAAmB;AACxB,WAAK,OAAO,KAAK,qBAAqB,EAAE,UAAU,SAAS,IAAI;AAC/D,YAAM,KAAK,cAAc,WAAW,SAAS,EAAE;AAC/C,WAAK,aAAa,IAAI,UAAU,EAAE,KAAK,QAAQ,MAAM,KAAK,eAAe,MAAM,EAAC,CAAE;AAClF,UAAI,OAAO,SAAS,eAAe,YAAY;AAC7C,cAAM,SAAS,WAAW,MAAM;AAAA,MAClC;AACA,UAAI,KAAK,aAAa,SAAS,UAAU,GAAG;AAC1C,cAAM,KAAK,KAAI;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO;AAAA,QAC9B,WAAW;AAAA,QACX;AAAA,MACR,CAAO;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OAAO;AACX,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,MAAM,gBAAgB;AAClC,WAAK,aAAa,OAAO;AAAA,QACvB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,eAAe;AAAA,MACvB,CAAO;AACD,WAAK,SAAS,KAAK,iBAAiB,MAAM;AAAA,IAC5C,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO,EAAE,WAAW,QAAQ;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ;AACN,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,MAAM,iBAAiB;AACnC,WAAK,sBAAsB;AAC3B,UAAI,KAAK,sBAAsB,MAAM;AACnC,qBAAa,KAAK,iBAAiB;AACnC,aAAK,oBAAoB;AAAA,MAC3B;AACA,WAAK,aAAa,OAAO;AAAA,QACvB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,eAAe;AAAA,MACvB,CAAO;AACD,WAAK,SAAS,KAAK,kBAAkB,MAAM;AAAA,IAC7C,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO,EAAE,WAAW,SAAS;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KAAK,MAAM;AACT,SAAK,eAAc;AACnB,QAAI;AACF,WAAK,OAAO,MAAM,kBAAkB,EAAE,KAAI,CAAE;AAC5C,YAAM,aAAa,KAAK,aAAa,SAAS,SAAS;AACvD,UAAI,YAAY;AACd,aAAK,sBAAsB;AAAA,MAC7B;AACA,UAAI,KAAK,sBAAsB,MAAM;AACnC,qBAAa,KAAK,iBAAiB;AACnC,aAAK,oBAAoB;AAAA,MAC3B;AACA,WAAK,SAAS,KAAK,oBAAoB,EAAE,KAAI,CAAE;AAC/C,WAAK,aAAa,IAAI,eAAe,IAAI;AACzC,UAAI,KAAK,qBAAqB;AAC5B,aAAK,oBAAoB,WAAW,MAAM;AACxC,cAAI,KAAK,uBAAuB,KAAK,aAAa,SAAS,SAAS,GAAG;AACrE,iBAAK,OAAO,MAAM,8BAA8B;AAChD,iBAAK,sBAAsB;AAC3B,iBAAK,SAAS,KAAK,iBAAiB,MAAM;AAAA,UAC5C;AACA,eAAK,oBAAoB;AAAA,QAC3B,GAAG,GAAG;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,WAAK,aAAa,OAAO,OAAO,EAAE,WAAW,QAAQ,MAAM;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,QAAQ;AAChB,SAAK,eAAc;AACnB,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;AACrD,SAAK,aAAa,IAAI,UAAU,aAAa;AAC7C,SAAK,SAAS,KAAK,iBAAiB;AAAA,MAClC,QAAQ;AAAA,MACR,OAAO,KAAK,aAAa,SAAS,OAAO;AAAA,IAC/C,CAAK;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,OAAO;AACd,SAAK,eAAc;AACnB,SAAK,aAAa,IAAI,SAAS,KAAK;AACpC,SAAK,SAAS,KAAK,eAAe,EAAE,MAAK,CAAE;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,gBAAgB,MAAM;AACpB,SAAK,eAAc;AACnB,SAAK,aAAa,IAAI,gBAAgB,IAAI;AAC1C,SAAK,SAAS,KAAK,uBAAuB,EAAE,KAAI,CAAE;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YAAY,UAAU;AACpB,SAAK,eAAc;AACnB,SAAK,aAAa,IAAI,YAAY,QAAQ;AAC1C,SAAK,OAAO,MAAM,gBAAgB,EAAE,SAAQ,CAAE;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,GAAG,OAAO,SAAS;AACjB,SAAK,eAAc;AACnB,WAAO,KAAK,SAAS,GAAG,OAAO,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,OAAO,SAAS;AACnB,SAAK,eAAc;AACnB,WAAO,KAAK,SAAS,KAAK,OAAO,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,MAAM;AACd,SAAK,eAAc;AACnB,WAAO,KAAK,cAAc,UAAU,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,eAAe,QAAQ;AACrB,SAAK,eAAc;AACnB,SAAK,cAAc,SAAS,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,WAAW;AACT,SAAK,eAAc;AACnB,WAAO,KAAK,aAAa,SAAQ;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACb,SAAK,eAAc;AACnB,QAAI,CAAC,KAAK,iBAAkB,QAAO,CAAA;AACnC,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,SAAS,cAAc,YAAY;AAC5C,aAAO,SAAS,UAAS;AAAA,IAC3B;AACA,WAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAO;AAChB,SAAK,eAAc;AACnB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,OAAO,KAAK,0CAA0C;AAC3D;AAAA,IACF;AACA,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,SAAS,aAAa,YAAY;AAC3C,eAAS,SAAS,KAAK;AACvB,WAAK,SAAS,KAAK,kBAAkB;AAAA,QACnC,SAAS,UAAU,KAAK,SAAS,SAAS,KAAK;AAAA,QAC/C,MAAM,UAAU;AAAA,MACxB,CAAO;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,oBAAoB;AAClB,SAAK,eAAc;AACnB,QAAI,CAAC,KAAK,iBAAkB,QAAO;AACnC,UAAM,WAAW,KAAK;AACtB,QAAI,OAAO,SAAS,oBAAoB,YAAY;AAClD,aAAO,SAAS,gBAAe;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB;AACxB,SAAK,eAAc;AACnB,QAAI;AACF,UAAI,KAAK,UAAU,mBAAmB;AACpC,cAAM,KAAK,UAAU,kBAAiB;AAAA,MACxC,WAAW,KAAK,UAAU,yBAAyB;AACjD,cAAM,KAAK,UAAU,wBAAuB;AAAA,MAC9C;AACA,WAAK,aAAa,IAAI,cAAc,IAAI;AACxC,WAAK,SAAS,KAAK,qBAAqB,EAAE,YAAY,MAAM;AAAA,IAC9D,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,6BAA6B,EAAE,MAAK,CAAE;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB;AACrB,SAAK,eAAc;AACnB,QAAI;AACF,UAAI,SAAS,gBAAgB;AAC3B,cAAM,SAAS,eAAc;AAAA,MAC/B,WAAW,SAAS,sBAAsB;AACxC,cAAM,SAAS,qBAAoB;AAAA,MACrC;AACA,WAAK,aAAa,IAAI,cAAc,KAAK;AACzC,WAAK,SAAS,KAAK,qBAAqB,EAAE,YAAY,OAAO;AAAA,IAC/D,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,0BAA0B,EAAE,MAAK,CAAE;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,mBAAmB;AACvB,QAAI,KAAK,YAAY;AACnB,YAAM,KAAK,eAAc;AAAA,IAC3B,OAAO;AACL,YAAM,KAAK,kBAAiB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACf,SAAK,eAAc;AACnB,UAAM,UAAU,KAAK,cAAc,UAAU,SAAS;AACtD,QAAI,WAAW,OAAO,QAAQ,eAAe,YAAY;AACvD,cAAQ,WAAU;AAAA,IACpB,OAAO;AACL,WAAK,OAAO,KAAK,8BAA8B;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,oBAAoB;AACxB,SAAK,eAAc;AACnB,UAAM,aAAa,KAAK,cAAc,UAAU,YAAY;AAC5D,QAAI,cAAc,OAAO,WAAW,mBAAmB,YAAY;AACjE,YAAM,WAAW,eAAc;AAAA,IACjC,OAAO;AACL,WAAK,OAAO,KAAK,iCAAiC;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAIA,cAAc;AACZ,SAAK,eAAc;AACnB,UAAM,UAAU,KAAK,cAAc,UAAU,SAAS;AACtD,QAAI,WAAW,OAAO,QAAQ,SAAS,YAAY;AACjD,cAAQ,KAAI;AAAA,IACd;AACA,UAAM,aAAa,KAAK,cAAc,UAAU,YAAY;AAC5D,QAAI,cAAc,OAAO,WAAW,gBAAgB,YAAY;AAC9D,iBAAW,YAAW;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACX,SAAK,eAAc;AACnB,UAAM,SAAS,KAAK,aAAa,SAAS,MAAM;AAChD,QAAI,CAAC,QAAQ;AACX,WAAK,OAAO,KAAK,mBAAmB;AACpC;AAAA,IACF;AACA,QAAI,KAAK,kBAAkB;AACzB,YAAM,WAAW,KAAK;AACtB,UAAI,OAAO,SAAS,gBAAgB,YAAY;AAC9C,cAAM,WAAW,SAAS,YAAW;AACrC,YAAI,UAAU,qBAAqB,QAAQ;AACzC,eAAK,KAAK,SAAS,gBAAgB;AACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,KAAK,aAAa,SAAS,UAAU;AACtD,QAAI,WAAW,GAAG;AAChB,WAAK,KAAK,QAAQ;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AACA,SAAK,OAAO,KAAK,mBAAmB;AACpC,QAAI,KAAK,sBAAsB,MAAM;AACnC,mBAAa,KAAK,iBAAiB;AACnC,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,SAAS,KAAK,kBAAkB,MAAM;AAC3C,SAAK,cAAc,WAAU;AAC7B,SAAK,SAAS,QAAO;AACrB,SAAK,aAAa,QAAO;AACzB,SAAK,YAAY;AACjB,SAAK,OAAO,KAAK,kBAAkB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACZ,WAAO,KAAK,aAAa,SAAS,SAAS;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAS;AACX,WAAO,KAAK,aAAa,SAAS,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,cAAc;AAChB,WAAO,KAAK,aAAa,SAAS,aAAa;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAW;AACb,WAAO,KAAK,aAAa,SAAS,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAS;AACX,WAAO,KAAK,aAAa,SAAS,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAQ;AACV,WAAO,KAAK,aAAa,SAAS,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,eAAe;AACjB,WAAO,KAAK,aAAa,SAAS,cAAc;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,iBAAiB;AACnB,WAAO,KAAK,aAAa,SAAS,gBAAgB;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,kBAAkB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,aAAa;AACf,WAAO,KAAK,aAAa,SAAS,YAAY;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,OAAO;AACT,WAAO,KAAK,aAAa,SAAS,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAW;AACb,WAAO,KAAK,aAAa,SAAS,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACf,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAQ;AACrB,UAAM,MAAM,OAAO,MAAM,GAAG,EAAE,IAAG,GAAI,YAAW;AAChD,YAAQ,KAAG;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACf;AAAA,EACE;AACF;AACA,eAAe,aAAa,SAAS;AACnC,QAAM,SAAS,IAAI,eAAe,OAAO;AACzC,QAAM,OAAO,KAAI;AACjB,SAAO;AACT;ACxsEA,IAAI,iBAAiB;AACrB,IAAI,iBAAiB;AACrB,SAAS,oBAAoB;AAC3B,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,SAAO,MAAM,YAAY,+BAA+B,MAAM;AAChE;AACA,SAAS,mBAAmB;AAC1B,MAAI,gBAAgB;AAClB,WAAO,eAAe,YAAW;AAAA,EACnC;AACA,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,CAAC,EAAE,OAAO,eAAe,OAAO;AACzC;AACA,SAAS,iBAAiB;AACxB,SAAO,kBAAiB,KAAM,iBAAgB;AAChD;AACA,eAAe,YAAY;AACzB,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AACA,oBAAkB,YAAY;AAC5B,QAAI;AACF,YAAM,YAAY,MAAM,OAAO,mBAAQ;AACvC,uBAAiB,UAAU;AAC3B,UAAI,CAAC,eAAe,eAAe;AACjC,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,uBAAiB;AACjB,YAAM,IAAI;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC1F;AAAA,IACI;AAAA,EACF,GAAC;AACD,SAAO;AACT;AACA,SAAS,kBAAkB,QAAQ;AACjC,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO,IAAI,eAAe,MAAM;AAClC;AACA,SAAS,oBAAoB;AAC3B,SAAO;AACT;AAGA,SAAS,YAAY,OAAO;AAC1B,MAAI,MAAM,MAAM;AACd,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,QAAQ;AAChB,UAAM,iBAAiB;AAAA,MACrB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACX;AACI,UAAM,UAAU,OAAO,KAAK,cAAc,EAAE,IAAI,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,MAAM,CAAC,EAAE,CAAC;AACjI,QAAI,KAAK,IAAI,UAAU,MAAM,MAAM,KAAK,IAAI;AAC1C,aAAO,eAAe,OAAO;AAAA,IAC/B;AACA,WAAO,GAAG,MAAM,MAAM;AAAA,EACxB;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,cAAc,MAAM,OAAO;AAAA,EACpC;AACA,SAAO;AACT;AACA,SAAS,cAAc,SAAS;AAC9B,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA,EACtC;AACA,MAAI,WAAW,KAAK;AAClB,WAAO,GAAG,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,EACrC;AACA,SAAO,GAAG,OAAO;AACnB;AACA,SAAS,UAAU,QAAQ,cAAc;AACvC,SAAO,OAAO,IAAI,CAAC,OAAO,WAAW;AAAA,IACnC;AAAA,IACA,OAAO,MAAM,SAAS;AAAA,IACtB,QAAQ,MAAM,UAAU;AAAA,IACxB,SAAS,MAAM,WAAW;AAAA,IAC1B,OAAO,YAAY,KAAK;AAAA,IACxB,OAAO,MAAM;AAAA,EACjB,EAAI;AACJ;AAGA,IAAI,kBAAkB;AAAA,EACpB,eAAe;AAAA,EACf,aAAa;AAAA,EAEb,WAAW;AAEb;AACA,SAAS,aAAa,SAAS;AAC7B,UAAQ,SAAO;AAAA,IACb,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACb;AACA;AACA,SAAS,cAAc,MAAM;AAC3B,SAAO;AAAA,IACL,MAAM,aAAa,KAAK,IAAI;AAAA,IAC5B,SAAS,KAAK,WAAW;AAAA,IACzB,OAAO,KAAK,SAAS;AAAA,IACrB,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,EACnB;AACA;AACA,SAAS,sBAAsB,KAAK,KAAK,WAAW;AAClD,QAAM,WAAW,CAAA;AACjB,QAAM,aAAa,CAAC,OAAO,YAAY;AACrC,QAAI,GAAG,OAAO,OAAO;AACrB,aAAS,KAAK,EAAE,OAAO,QAAO,CAAE;AAAA,EAClC;AACA,aAAW,qBAAqB,CAAC,QAAQ,SAAS;AAChD,QAAI,OAAO,MAAM,uBAAuB,EAAE,QAAQ,KAAK,OAAO,QAAQ;AACtE,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,WAAW;AAAA,MAChD,IAAI,SAAS,KAAK;AAAA,MAClB,OAAO,YAAY,KAAK;AAAA,MACxB,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,QAAQ,UAAU,IAAI;AAAA,IAC5B,EAAM;AACF,QAAI,SAAS,aAAa,MAAM;AAChC,QAAI,KAAK,kBAAkB;AAAA,MACzB,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,MAAK,EAAG;AAAA,IAC9D,CAAK;AACD,cAAU,mBAAmB,KAAK,MAAM;AAAA,EAC1C,CAAC;AACD,aAAW,oBAAoB,CAAC,QAAQ,SAAS;AAC/C,UAAM,QAAQ,IAAI,OAAO,KAAK,KAAK;AACnC,UAAM,SAAS,UAAU,mBAAgB,KAAQ,IAAI;AACrD,QAAI,OAAO,MAAM,sBAAsB,EAAE,OAAO,KAAK,OAAO,QAAQ,OAAO,QAAQ,MAAM,OAAM,CAAE;AACjG,QAAI,OAAO;AACT,YAAM,QAAQ,SAAS,SAAS,YAAY,KAAK,CAAC,MAAM,YAAY,KAAK;AACzE,UAAI,SAAS,kBAAkB;AAAA,QAC7B,IAAI,SAAS,SAAS,SAAS,KAAK,KAAK;AAAA,QACzC;AAAA,QACA,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,QAAQ;AAAA,MAChB,CAAO;AAAA,IACH;AACA,QAAI,KAAK,kBAAkB;AAAA,MACzB,SAAS,QAAQ,YAAY,KAAK,IAAI;AAAA,MACtC,MAAM;AAAA,IACZ,CAAK;AACD,cAAU,kBAAkB,KAAK,KAAK;AAAA,EACxC,CAAC;AACD,aAAW,mBAAmB,MAAM;AAClC,QAAI,SAAS,aAAa,KAAK;AAC/B,cAAU,iBAAc;AAAA,EAC1B,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,aAAa,IAAI;AAAA,EAChC,CAAC;AACD,aAAW,kBAAkB,CAAC,QAAQ,SAAS;AAC7C,QAAI,KAAK,SAAS,SAAS,QAAQ;AACjC,UAAI,SAAS,QAAQ,KAAK,QAAQ,IAAI;AACtC,gBAAU,eAAY;AAAA,IACxB;AAAA,EACF,CAAC;AACD,aAAW,YAAY,CAAC,QAAQ,SAAS;AACvC,UAAM,QAAQ,cAAc,IAAI;AAChC,QAAI,OAAO,KAAK,aAAa,EAAE,MAAK,CAAE;AACtC,cAAU,UAAU,KAAK;AAAA,EAC3B,CAAC;AACD,SAAO,MAAM;AACX,eAAW,EAAE,OAAO,QAAO,KAAM,UAAU;AACzC,UAAI,IAAI,OAAO,OAAO;AAAA,IACxB;AACA,aAAS,SAAS;AAAA,EACpB;AACF;AACA,SAAS,wBAAwB,OAAO,KAAK;AAC3C,QAAM,WAAW,CAAA;AACjB,QAAM,aAAa,CAAC,OAAO,YAAY;AACrC,UAAM,iBAAiB,OAAO,OAAO;AACrC,aAAS,KAAK,EAAE,OAAO,QAAO,CAAE;AAAA,EAClC;AACA,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,IAAI;AAC5B,QAAI,SAAS,UAAU,KAAK;AAC5B,QAAI,SAAS,iBAAiB,SAAS;AAAA,EACzC,CAAC;AACD,aAAW,SAAS,MAAM;AACxB,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,SAAS,UAAU,IAAI;AAC3B,QAAI,SAAS,iBAAiB,QAAQ;AAAA,EACxC,CAAC;AACD,aAAW,SAAS,MAAM;AACxB,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,SAAS,SAAS,IAAI;AAC1B,QAAI,SAAS,iBAAiB,OAAO;AACrC,QAAI,KAAK,kBAAkB,MAAM;AAAA,EACnC,CAAC;AACD,aAAW,cAAc,MAAM;AAC7B,QAAI,SAAS,eAAe,MAAM,WAAW;AAC7C,QAAI,KAAK,uBAAuB,EAAE,aAAa,MAAM,aAAa;AAAA,EACpE,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,YAAY,MAAM,YAAY,CAAC;AAC5C,QAAI,KAAK,wBAAwB,EAAE,UAAU,MAAM,YAAY,GAAG;AAAA,EACpE,CAAC;AACD,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,IAAI;AAC5B,QAAI,SAAS,aAAa,IAAI;AAC9B,QAAI,KAAK,iBAAiB,MAAM;AAAA,EAClC,CAAC;AACD,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,SAAS,iBAAiB,OAAO;AACrC,QAAI,KAAK,iBAAiB,MAAM;AAAA,EAClC,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,aAAa,KAAK;AAC/B,QAAI,KAAK,wBAAwB,MAAM;AAAA,EACzC,CAAC;AACD,aAAW,YAAY,MAAM;AAC3B,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,YAAM,cAAc,MAAM,SAAS,IAAI,MAAM,SAAS,SAAS,CAAC;AAChE,YAAM,iBAAiB,MAAM,WAAW,IAAI,cAAc,MAAM,WAAW;AAC3E,UAAI,SAAS,kBAAkB,cAAc;AAC7C,UAAI,SAAS,YAAY,MAAM,QAAQ;AACvC,UAAI,KAAK,kBAAkB,EAAE,UAAU,eAAc,CAAE;AAAA,IACzD;AAAA,EACF,CAAC;AACD,aAAW,WAAW,MAAM;AAC1B,QAAI,SAAS,WAAW,IAAI;AAAA,EAC9B,CAAC;AACD,aAAW,UAAU,MAAM;AACzB,QAAI,SAAS,WAAW,KAAK;AAC7B,QAAI,KAAK,mBAAmB,EAAE,MAAM,MAAM,aAAa;AAAA,EACzD,CAAC;AACD,aAAW,gBAAgB,MAAM;AAC/B,QAAI,SAAS,UAAU,MAAM,MAAM;AACnC,QAAI,SAAS,SAAS,MAAM,KAAK;AACjC,QAAI,KAAK,iBAAiB,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,OAAO;AAAA,EACxE,CAAC;AACD,aAAW,cAAc,MAAM;AAC7B,QAAI,SAAS,gBAAgB,MAAM,YAAY;AAC/C,QAAI,KAAK,uBAAuB,EAAE,MAAM,MAAM,cAAc;AAAA,EAC9D,CAAC;AACD,aAAW,kBAAkB,MAAM;AACjC,QAAI,SAAS,YAAY,MAAM,QAAQ;AACvC,QAAI,SAAS,aAAa,MAAM,aAAa,IAAI,UAAU,OAAO;AAAA,EACpE,CAAC;AACD,aAAW,SAAS,MAAM;AACxB,UAAM,QAAQ,MAAM;AACpB,QAAI,OAAO;AACT,UAAI,OAAO,MAAM,uBAAuB,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAO,CAAE;AACpF,UAAI,KAAK,eAAe,EAAE,OAAO,IAAI,MAAM,MAAM,WAAW,sBAAsB,GAAG;AAAA,IACvF;AAAA,EACF,CAAC;AACD,aAAW,yBAAyB,MAAM;AACxC,QAAI,SAAS,OAAO,IAAI;AACxB,QAAI,OAAO,MAAM,yBAAyB;AAAA,EAC5C,CAAC;AACD,aAAW,yBAAyB,MAAM;AACxC,QAAI,SAAS,OAAO,KAAK;AACzB,QAAI,OAAO,MAAM,wBAAwB;AACzC,QAAI,CAAC,MAAM,UAAU,IAAI,SAAS,SAAS,GAAG;AAC5C,YAAM,OAAO,MAAM,MAAM;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACD,QAAM,cAAc;AACpB,MAAI,4BAA4B,OAAO;AACrC,eAAW,iCAAiC,MAAM;AAChD,YAAM,OAAO,YAAY;AACzB,YAAM,UAAU,SAAS;AACzB,UAAI,SAAS,OAAO,OAAO;AAC3B,UAAI,OAAO,MAAM,wBAAwB,IAAI,WAAW;AACxD,UAAI,SAAS,YAAY,MAAM,QAAQ;AACrC,cAAM,OAAO,MAAM,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,MAAM;AACX,eAAW,EAAE,OAAO,QAAO,KAAM,UAAU;AACzC,YAAM,oBAAoB,OAAO,OAAO;AAAA,IAC1C;AACA,aAAS,SAAS;AAAA,EACpB;AACF;AAGA,IAAI,iBAAiB;AAAA,EACnB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,cAAc;AAAA;AAAA,EAEd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AACtB;AACA,SAAS,gBAAgB,QAAQ;AAC/B,QAAM,eAAe,EAAE,GAAG,gBAAgB,GAAG,OAAM;AACnD,MAAI,MAAM;AACV,MAAI,MAAM;AACV,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,mBAAmB;AACvB,MAAI,qBAAqB;AACzB,MAAI,gBAAgB;AACpB,MAAI,oBAAoB;AACxB,MAAI,kBAAkB;AACtB,MAAI,eAAe;AACnB,MAAI,aAAa;AACjB,MAAI,mBAAmB;AACvB,QAAM,uBAAuB;AAC7B,QAAM,kBAAkB;AACxB,QAAM,mBAAmB,MAAM;AAC7B,QAAI,MAAO,QAAO;AAClB,UAAM,WAAW,KAAK,UAAU,cAAc,OAAO;AACrD,QAAI,UAAU;AACZ,cAAQ;AACR,aAAO;AAAA,IACT;AACA,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,MAAM,UAAU;AACtB,UAAM,UAAU;AAChB,UAAM,WAAW;AACjB,UAAM,cAAc;AACpB,SAAK,UAAU,YAAY,KAAK;AAChC,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM;AACpB,uBAAgB;AAChB,uBAAmB;AACnB,yBAAkB;AAClB,yBAAqB;AACrB,QAAI,cAAc;AAChB,mBAAa,YAAY;AACzB,qBAAe;AAAA,IACjB;AACA,QAAI,KAAK;AACP,UAAI,QAAO;AACX,YAAM;AAAA,IACR;AACA,iBAAa;AACb,eAAW;AACX,oBAAgB;AAChB,wBAAoB;AACpB,sBAAkB;AAClB,iBAAa;AACb,uBAAmB;AAAA,EACrB;AACA,QAAM,iBAAiB,OAAO;AAAA,IAC5B,OAAO,aAAa;AAAA,IACpB,eAAe,aAAa;AAAA,IAC5B,eAAe,aAAa;AAAA,IAC5B,YAAY;AAAA;AAAA,IAEZ,gBAAgB,aAAa;AAAA,IAC7B,iBAAiB,aAAa;AAAA,IAC9B,oBAAoB,aAAa;AAAA,IACjC,kBAAkB,aAAa;AAAA,IAC/B,cAAc,aAAa;AAAA;AAAA,IAE3B,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,IAC3B,wBAAwB;AAAA,EAC5B;AACE,QAAM,gBAAgB,CAAC,eAAe;AACpC,UAAM,YAAY,aAAa,gBAAgB;AAC/C,UAAM,gBAAgB,aAAa,sBAAsB;AACzD,WAAO,YAAY,KAAK,IAAI,eAAe,UAAU;AAAA,EACvD;AACA,QAAM,iBAAiB,CAAC,OAAO,qBAAqB;AAClD,UAAM,UAAU,mBAAmB,cAAc,MAAM,OAAO,4BAA4B,cAAc,MAAM,OAAO;AACrH,SAAK,OAAO,MAAM,SAAS,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAO,CAAE;AACvE,SAAK,SAAS,iBAAiB,OAAO;AACtC,SAAK,SAAS,aAAa,KAAK;AAChC,SAAK,KAAK,SAAS;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,WAAW,KAAK,IAAG;AAAA,IACzB,CAAK;AAAA,EACH;AACA,QAAM,iBAAiB,CAAC,UAAU;AAChC,UAAM,MAAM,kBAAiB;AAC7B,QAAI,CAAC,OAAO,CAAC,IAAK;AAClB,UAAM,MAAM,KAAK,IAAG;AACpB,QAAI,MAAM,mBAAmB,iBAAiB;AAC5C,mBAAa;AACb,yBAAmB;AAAA,IACrB,OAAO;AACL;AAAA,IACF;AACA,QAAI,cAAc,sBAAsB;AACtC,WAAK,OAAO,MAAM,oBAAoB,UAAU,OAAO,eAAe,gBAAgB;AACtF,qBAAe,OAAO,IAAI;AAC1B,yBAAgB;AAChB,yBAAmB;AACnB,UAAI,QAAO;AACX,YAAM;AACN;AAAA,IACF;AACA,QAAI,MAAM,OAAO;AACf,WAAK,OAAO,MAAM,mBAAmB,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAO,CAAE;AACjF,cAAQ,MAAM,MAAI;AAAA,QAChB,KAAK,WAAW;AACd,gBAAM,aAAa,aAAa,qBAAqB;AACrD,cAAI,qBAAqB,YAAY;AACnC,iBAAK,OAAO,MAAM,uCAAuC,iBAAiB,WAAW;AACrF,2BAAe,OAAO,IAAI;AAC1B;AAAA,UACF;AACA;AACA,gBAAM,QAAQ,cAAc,oBAAoB,CAAC;AACjD,eAAK,OAAO,KAAK,8CAA8C,iBAAiB,IAAI,UAAU,QAAQ,KAAK,IAAI;AAC/G,eAAK,KAAK,iBAAiB,EAAE,OAAO,IAAI,MAAM,MAAM,OAAO,GAAG;AAC9D,cAAI,cAAc;AAChB,yBAAa,YAAY;AAAA,UAC3B;AACA,yBAAe,WAAW,MAAM;AAC9B,gBAAI,KAAK;AACP,kBAAI,UAAS;AAAA,YACf;AAAA,UACF,GAAG,KAAK;AACR;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,gBAAM,aAAa,aAAa,mBAAmB;AACnD,cAAI,mBAAmB,YAAY;AACjC,iBAAK,OAAO,MAAM,qCAAqC,eAAe,WAAW;AACjF,2BAAe,OAAO,IAAI;AAC1B;AAAA,UACF;AACA;AACA,gBAAM,QAAQ,cAAc,kBAAkB,CAAC;AAC/C,eAAK,OAAO,KAAK,4CAA4C,eAAe,IAAI,UAAU,QAAQ,KAAK,IAAI;AAC3G,eAAK,KAAK,eAAe,EAAE,OAAO,IAAI,MAAM,MAAM,OAAO,GAAG;AAC5D,cAAI,cAAc;AAChB,yBAAa,YAAY;AAAA,UAC3B;AACA,yBAAe,WAAW,MAAM;AAC9B,gBAAI,KAAK;AACP,kBAAI,kBAAiB;AAAA,YACvB;AAAA,UACF,GAAG,KAAK;AACR;AAAA,QACF;AAAA,QACA;AACE,yBAAe,OAAO,KAAK;AAC3B;AAAA,MACV;AAAA,IACI;AAAA,EACF;AACA,QAAM,aAAa,OAAO,QAAQ;AAChC,UAAM,UAAU,iBAAgB;AAChC,eAAW;AACX,QAAI,KAAK;AACP,2BAAqB,wBAAwB,SAAS,GAAG;AAAA,IAC3D;AACA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,WAAW,MAAM;AACrB,gBAAQ,oBAAoB,kBAAkB,QAAQ;AACtD,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,aAAK,SAAS,UAAU,EAAE,KAAK,MAAM,yBAAyB;AAC9D,aAAK,KAAK,gBAAgB,EAAE,KAAK,MAAM,yBAAyB;AAChE,gBAAO;AAAA,MACT;AACA,YAAM,UAAU,MAAM;AACpB,gBAAQ,oBAAoB,kBAAkB,QAAQ;AACtD,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,cAAM,QAAQ,QAAQ;AACtB,eAAO,IAAI,MAAM,OAAO,WAAW,2BAA2B,CAAC;AAAA,MACjE;AACA,cAAQ,iBAAiB,kBAAkB,QAAQ;AACnD,cAAQ,iBAAiB,SAAS,OAAO;AACzC,cAAQ,MAAM;AACd,cAAQ,KAAI;AAAA,IACd,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,OAAO,QAAQ;AACnC,UAAM,UAAS;AACf,UAAM,UAAU,iBAAgB;AAChC,eAAW;AACX,UAAM,kBAAkB,gBAAgB;AACxC,QAAI,KAAK;AACP,2BAAqB,wBAAwB,SAAS,GAAG;AAAA,IAC3D;AACA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,CAAC,OAAO,CAAC,KAAK;AAChB,eAAO,IAAI,MAAM,qBAAqB,CAAC;AACvC;AAAA,MACF;AACA,UAAI,WAAW;AACf,yBAAmB,sBAAsB,KAAK,KAAK;AAAA,QACjD,kBAAkB,MAAM;AACtB,cAAI,CAAC,UAAU;AACb,uBAAW;AACX,iBAAK,SAAS,UAAU,EAAE,KAAK,MAAM,yBAAyB;AAC9D,iBAAK,KAAK,gBAAgB,EAAE,KAAK,MAAM,yBAAyB;AAChE,oBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,iBAAiB,MAAM;AAAA,QACvB;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,yBAAe,KAAK;AACpB,cAAI,MAAM,SAAS,CAAC,YAAY,MAAM,SAAS,aAAa,MAAM,SAAS,SAAS;AAClF,uBAAW;AACX,mBAAO,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,UACjC;AAAA,QACF;AAAA,QACA,kBAAkB,MAAM;AAAA,MAChC,CAAO;AACD,UAAI,YAAY,OAAO;AACvB,UAAI,WAAW,GAAG;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAM,SAAS;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ,KAAK;AACX,UAAI,CAAC,eAAc,EAAI,QAAO;AAC9B,YAAM,MAAM,IAAI,YAAW;AAC3B,YAAM,kBAAkB,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACtD,UAAI,gBAAgB,SAAS,OAAO,EAAG,QAAO;AAC9C,UAAI,IAAI,SAAS,uBAAuB,EAAG,QAAO;AAClD,UAAI,IAAI,SAAS,+BAA+B,EAAG,QAAO;AAC1D,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,WAAW;AACpB,YAAM;AACN,UAAI,OAAO,KAAK,wBAAwB;AACxC,YAAM,YAAY,IAAI,GAAG,iBAAiB,YAAY;AACpD,YAAI,CAAC,MAAO;AACZ,YAAI;AACF,gBAAM,MAAM,KAAI;AAAA,QAClB,SAAS,GAAG;AACV,eAAK,OAAO,MAAM,eAAe,CAAC;AAAA,QACpC;AAAA,MACF,CAAC;AACD,YAAM,aAAa,IAAI,GAAG,kBAAkB,MAAM;AAChD,eAAO,MAAK;AAAA,MACd,CAAC;AACD,YAAM,YAAY,IAAI,GAAG,oBAAoB,CAAC,EAAE,WAAW;AACzD,YAAI,CAAC,MAAO;AACZ,cAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,YAAY,CAAC,CAAC;AACnE,cAAM,cAAc;AAAA,MACtB,CAAC;AACD,YAAM,cAAc,IAAI,GAAG,iBAAiB,CAAC,EAAE,aAAa;AAC1D,YAAI,MAAO,OAAM,SAAS;AAAA,MAC5B,CAAC;AACD,YAAM,YAAY,IAAI,GAAG,eAAe,CAAC,EAAE,YAAY;AACrD,YAAI,MAAO,OAAM,QAAQ;AAAA,MAC3B,CAAC;AACD,YAAM,YAAY,IAAI,GAAG,uBAAuB,CAAC,EAAE,WAAW;AAC5D,YAAI,MAAO,OAAM,eAAe;AAAA,MAClC,CAAC;AACD,YAAM,eAAe,IAAI,GAAG,kBAAkB,CAAC,EAAE,SAAS,WAAW;AACnE,YAAI,CAAC,OAAO,UAAU;AACpB,eAAK,OAAO,KAAK,iCAAiC;AAClD;AAAA,QACF;AACA,YAAI,QAAQ,YAAY,QAAQ;AAC9B,0BAAgB;AAChB,cAAI,eAAe;AACnB,eAAK,OAAO,MAAM,iCAAiC;AACnD,eAAK,SAAS,kBAAkB;AAAA,YAC9B,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,QAAQ;AAAA,UACpB,CAAW;AAAA,QACH,OAAO;AACL,0BAAgB;AAChB,gBAAM,aAAa,SAAS,QAAQ,QAAQ,UAAU,EAAE,GAAG,EAAE;AAC7D,cAAI,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,aAAa,IAAI,OAAO,QAAQ;AAC3E,gBAAI,YAAY;AAChB,iBAAK,OAAO,MAAM,mCAAmC,UAAU,EAAE;AAAA,UACnE;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAI,UAAU,MAAM;AAClB,kBAAS;AACT,mBAAU;AACV,kBAAS;AACT,oBAAW;AACX,kBAAS;AACT,kBAAS;AACT,qBAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,IACA,MAAM,UAAU;AACd,WAAK,OAAO,KAAK,uBAAuB;AACxC,cAAO;AACP,UAAI,OAAO,YAAY;AACrB,cAAM,WAAW,YAAY,KAAK;AAAA,MACpC;AACA,cAAQ;AACR,YAAM;AAAA,IACR;AAAA,IACA,MAAM,WAAW,KAAK;AACpB,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAClD,UAAI,OAAO,KAAK,sBAAsB,EAAE,IAAG,CAAE;AAC7C,cAAO;AACP,mBAAa;AACb,UAAI,SAAS,iBAAiB,SAAS;AACvC,UAAI,SAAS,aAAa,IAAI;AAC9B,UAAI,iBAAgB,GAAI;AACtB,YAAI,OAAO,KAAK,+BAA+B;AAC/C,cAAM,cAAc,GAAG;AAAA,MACzB,WAAW,qBAAqB;AAC9B,YAAI,OAAO,KAAK,kDAAkD;AAClE,cAAM,WAAW,GAAG;AAAA,MACtB,OAAO;AACL,cAAM,IAAI,MAAM,4CAA4C;AAAA,MAC9D;AACA,UAAI,SAAS,iBAAiB,OAAO;AACrC,UAAI,SAAS,aAAa,KAAK;AAAA,IACjC;AAAA,IACA,kBAAkB;AAChB,UAAI,YAAY,CAAC,IAAK,QAAO;AAC7B,aAAO,IAAI;AAAA,IACb;AAAA,IACA,SAAS,OAAO;AACd,UAAI,YAAY,CAAC,KAAK;AACpB,aAAK,OAAO,KAAK,oDAAoD;AACrE;AAAA,MACF;AACA,UAAI,eAAe;AAAA,IACrB;AAAA,IACA,YAAY;AACV,UAAI,YAAY,CAAC,IAAK,QAAO,CAAA;AAC7B,aAAO,UAAU,IAAI,QAAQ,IAAI,YAAY;AAAA,IAC/C;AAAA,IACA,iBAAiB;AACf,aAAO;AAAA,IACT;AAAA,IACA,cAAc;AACZ,aAAO;AAAA,IACT;AAAA,IACA,cAAc;AACZ,UAAI,YAAY,CAAC,IAAK,QAAO;AAC7B,YAAM,OAAO,KAAK,SAAS,MAAM,KAAK;AACtC,UAAI,CAAC,KAAM,QAAO;AAClB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,IAAI,WAAW;AAAA,QACxB,eAAe,IAAI,iBAAiB;AAAA,QACpC,OAAO,IAAI,SAAS;AAAA,MAC5B;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,iBAAiB;AACrB,UAAI,UAAU;AACZ,aAAK,OAAO,MAAM,0BAA0B;AAC5C;AAAA,MACF;AACA,UAAI,CAAC,kBAAiB,GAAI;AACxB,aAAK,OAAO,KAAK,0CAA0C;AAC3D;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,aAAK,OAAO,KAAK,kBAAkB;AACnC;AAAA,MACF;AACA,WAAK,OAAO,KAAK,qCAAqC;AACtD,YAAM,aAAa,KAAK,SAAS,SAAS,KAAK;AAC/C,YAAM,cAAc,OAAO,eAAe;AAC1C,YAAM,WAAW;AACjB,cAAO;AACP,YAAM,WAAW,QAAQ;AACzB,UAAI,SAAS,cAAc,GAAG;AAC5B,cAAM,cAAc;AAAA,MACtB;AACA,UAAI,cAAc,OAAO;AACvB,YAAI;AACF,gBAAM,MAAM,KAAI;AAAA,QAClB,SAAS,GAAG;AACV,eAAK,OAAO,MAAM,oCAAoC;AAAA,QACxD;AAAA,MACF;AACA,WAAK,OAAO,KAAK,wBAAwB;AAAA,IAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,gBAAgB;AACpB,UAAI,CAAC,UAAU;AACb,aAAK,OAAO,MAAM,sBAAsB;AACxC;AAAA,MACF;AACA,UAAI,CAAC,iBAAgB,GAAI;AACvB,aAAK,OAAO,KAAK,sCAAsC;AACvD;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,aAAK,OAAO,KAAK,kBAAkB;AACnC;AAAA,MACF;AACA,WAAK,OAAO,KAAK,0BAA0B;AAC3C,YAAM,aAAa,KAAK,SAAS,SAAS,KAAK;AAC/C,YAAM,cAAc,OAAO,eAAe;AAC1C,YAAM,WAAW;AACjB,cAAO;AACP,YAAM,cAAc,QAAQ;AAC5B,UAAI,SAAS,cAAc,GAAG;AAC5B,cAAM,cAAc;AAAA,MACtB;AACA,UAAI,cAAc,OAAO;AACvB,YAAI;AACF,gBAAM,MAAM,KAAI;AAAA,QAClB,SAAS,GAAG;AACV,eAAK,OAAO,MAAM,oCAAoC;AAAA,QACxD;AAAA,MACF;AACA,WAAK,OAAO,KAAK,oBAAoB;AAAA,IACvC;AAAA,EACJ;AACE,SAAO;AACT;ACxvBA,IAAI,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}