@grizzshutsdown/simpleplayer 0.1.8 → 0.1.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"simple-player.js","sources":["../src/player/constants.ts","../src/player/fullscreen.ts","../src/player/media.ts","../src/player/progress.ts","../src/player/styles.ts","../src/player/template.ts","../src/player/simple-player-element.ts","../src/simple-player.ts"],"sourcesContent":["export const DEFAULT_ASPECT_RATIO = '16 / 9';\nexport const DEFAULT_PRELOAD_MARGIN = '360px 0px';\n\nexport const OBSERVED_ATTRIBUTES = [\n 'src',\n 'aspect-ratio',\n 'preload-margin',\n 'controls',\n 'disable-autoplay',\n 'enable-volume',\n 'disable-volume',\n 'disable-volume-slider',\n 'enable-picture-in-picture',\n 'disable-picture-in-picture',\n 'enable-fullscreen',\n 'disable-fullscreen',\n 'show-time',\n 'no-autoplay',\n 'no-volume',\n 'no-volume-slider',\n 'no-picture-in-picture',\n 'no-fullscreen',\n] as const;\n","import type { FullscreenDocument, FullscreenPlayer, FullscreenVideo } from './types';\n\nexport function getFullscreenElement(root: ShadowRoot): Element | null {\n const fullscreenDocument = document as FullscreenDocument;\n\n return (\n root.fullscreenElement ||\n document.fullscreenElement ||\n fullscreenDocument.webkitFullscreenElement ||\n fullscreenDocument.mozFullScreenElement ||\n fullscreenDocument.msFullscreenElement ||\n null\n );\n}\n\nexport function isFullscreenSupported(\n fullscreenEnabled: boolean,\n player: HTMLElement,\n video: HTMLVideoElement,\n): boolean {\n const fullscreenDocument = document as FullscreenDocument;\n const fullscreenPlayer = player as FullscreenPlayer;\n const fullscreenVideo = video as FullscreenVideo;\n const canFullscreenPlayer = !!(\n (\n document.fullscreenEnabled ??\n fullscreenDocument.webkitFullscreenEnabled ??\n fullscreenDocument.mozFullScreenEnabled ??\n fullscreenDocument.msFullscreenEnabled ??\n false\n ) &&\n (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n )\n );\n const canFullscreenVideo = !!(\n fullscreenVideo.webkitSupportsFullscreen ||\n fullscreenVideo.webkitEnterFullscreen ||\n fullscreenVideo.webkitEnterFullScreen\n );\n\n return !!(fullscreenEnabled && (canFullscreenPlayer || canFullscreenVideo));\n}\n\nexport function requestPlayerFullscreen(player: HTMLElement): Promise<void> {\n const fullscreenPlayer = player as FullscreenPlayer;\n const requestFullscreen = (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n );\n\n return Promise.resolve(requestFullscreen?.call(fullscreenPlayer));\n}\n\nexport function canRequestPlayerFullscreen(player: HTMLElement): boolean {\n const fullscreenPlayer = player as FullscreenPlayer;\n\n return (\n typeof fullscreenPlayer.requestFullscreen === 'function' ||\n typeof fullscreenPlayer.webkitRequestFullscreen === 'function' ||\n typeof fullscreenPlayer.mozRequestFullScreen === 'function' ||\n typeof fullscreenPlayer.msRequestFullscreen === 'function'\n );\n}\n\nexport function requestVideoFullscreen(video: HTMLVideoElement): void {\n const fullscreenVideo = video as FullscreenVideo;\n const requestFullscreen = fullscreenVideo.webkitEnterFullscreen || fullscreenVideo.webkitEnterFullScreen;\n\n requestFullscreen?.call(fullscreenVideo);\n}\n\nexport function exitFullscreen(): Promise<void> {\n const fullscreenDocument = document as FullscreenDocument;\n const exitFullscreen = (\n document.exitFullscreen ||\n fullscreenDocument.webkitExitFullscreen ||\n fullscreenDocument.mozCancelFullScreen ||\n fullscreenDocument.msExitFullscreen\n );\n\n return Promise.resolve(exitFullscreen?.call(fullscreenDocument));\n}\n","export function formatVideoTime(time: number): string {\n if (!Number.isFinite(time) || time < 0) return '0:00';\n\n const totalSeconds = Math.floor(time);\n const seconds = totalSeconds % 60;\n const totalMinutes = Math.floor(totalSeconds / 60);\n const minutes = totalMinutes % 60;\n const hours = Math.floor(totalMinutes / 60);\n\n if (hours > 0) {\n return hours + ':' + String(minutes).padStart(2, '0') + ':' + String(seconds).padStart(2, '0');\n }\n\n return minutes + ':' + String(seconds).padStart(2, '0');\n}\n\nexport type AudioAvailability = 'available' | 'unavailable' | 'unknown';\n\nexport function detectAudioAvailability(video: HTMLVideoElement): AudioAvailability {\n const audioTrackVideo = video as HTMLVideoElement & { audioTracks?: { length: number } };\n if (audioTrackVideo.audioTracks && typeof audioTrackVideo.audioTracks.length === 'number') {\n return audioTrackVideo.audioTracks.length > 0 ? 'available' : 'unavailable';\n }\n\n const firefoxVideo = video as HTMLVideoElement & { mozHasAudio?: boolean };\n if (typeof firefoxVideo.mozHasAudio === 'boolean') {\n return firefoxVideo.mozHasAudio ? 'available' : 'unavailable';\n }\n\n const streamVideo = video as HTMLVideoElement & {\n captureStream?: () => MediaStream;\n mozCaptureStream?: () => MediaStream;\n };\n const captureStream = streamVideo.captureStream ?? streamVideo.mozCaptureStream;\n if (captureStream && video.readyState >= HTMLMediaElement.HAVE_METADATA) {\n try {\n return captureStream.call(video).getAudioTracks().length > 0 ? 'available' : 'unavailable';\n } catch {\n // Cross-origin media can block captureStream; keep probing with other browser hints.\n }\n }\n\n const webkitVideo = video as HTMLVideoElement & { webkitAudioDecodedByteCount?: number };\n if (\n typeof webkitVideo.webkitAudioDecodedByteCount === 'number' &&\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.currentTime > 0.25\n ) {\n return webkitVideo.webkitAudioDecodedByteCount > 0 ? 'available' : 'unavailable';\n }\n\n return 'unknown';\n}\n\nexport function isAudioAvailabilityPending(video: HTMLVideoElement): boolean {\n const webkitVideo = video as HTMLVideoElement & { webkitAudioDecodedByteCount?: number };\n return (\n typeof webkitVideo.webkitAudioDecodedByteCount === 'number' &&\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.currentTime <= 0.25\n );\n}\n","import type { ProgressMetrics } from './types';\n\nexport function getProgressMetrics(rect: DOMRect): ProgressMetrics {\n const sideInset = Math.min(2, Math.max(0, rect.width / 2));\n const innerWidth = Math.max(1, rect.width - (sideInset * 2));\n\n return { rect, sideInset, innerWidth };\n}\n\nexport function getProgressXFromPercent(percent: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n const clampedPercent = Math.min(1, Math.max(0, percent));\n\n return sideInset + (clampedPercent * innerWidth);\n}\n\nexport function getProgressPercentFromClientX(clientX: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n\n return Math.min(1, Math.max(0, (clientX - rect.left - sideInset) / innerWidth));\n}\n","import { DEFAULT_ASPECT_RATIO } from './constants';\n\nexport const styles: string = `\n :host {\n --simple-player-aspect-ratio: ${DEFAULT_ASPECT_RATIO};\n --space: 4px;\n --white: #fff;\n --black: #000;\n --white-rgb: 255 255 255;\n --overlay-soft: rgb(0 0 0 / 0.42);\n --overlay-blur: 0px;\n --sp-glass-surface: rgb(255 255 255 / 0.04);\n --sp-glass-opacity: 0.28;\n --sp-control-glass-surface: rgb(255 255 255 / 0.12);\n --sp-control-glass-opacity: 0.62;\n --sp-control-hover-surface: rgb(255 255 255 / 0.14);\n --sp-glass-filter: invert(1) grayscale(1);\n --sp-shimmer-highlight: rgb(255 255 255 / 0.42);\n --sp-control-tray-display: block;\n --sp-enabled-controls-count: 3;\n --sp-control-tray-width: 0px;\n --sp-control-tray-expanded-width: calc((var(--sp-control-slot-size) * var(--sp-enabled-controls-count)) + (var(--sp-control-tray-padding) * 2));\n --sp-control-tray-gap: 0px;\n --sp-control-icon-size: 20px;\n --sp-control-icon-render-size: 20px;\n --sp-control-icon-opacity: 0.82;\n --sp-control-icon-hidden-opacity: 0;\n --sp-control-icon-hidden-transform: translateY(2px) scale(0.84);\n --sp-control-icon-hover-opacity: 0.96;\n --sp-control-icon-stroke-width: 1.6;\n --sp-control-icon-delay-1: 30ms;\n --sp-control-icon-delay-2: 55ms;\n --sp-control-icon-delay-3: 80ms;\n --sp-control-hover-opacity: 1;\n --sp-control-slot-hover-surface: transparent;\n --sp-control-tray-padding: 2px;\n --sp-control-slot-size: calc(var(--sp-control-icon-size) + 4px);\n --sp-touch-control-hover-offset: -9999px;\n --sp-volume-level: 100%;\n\n position: relative;\n display: block;\n width: 100%;\n aspect-ratio: var(--simple-player-aspect-ratio);\n isolation: isolate;\n overflow: hidden;\n contain: paint;\n background: #1E1E1E;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n .sp-video {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n object-fit: cover;\n }\n\n .sp-asset {\n pointer-events: none;\n opacity: 0;\n transition: opacity 160ms ease;\n user-select: none;\n -webkit-user-select: none;\n -webkit-user-drag: none;\n -webkit-touch-callout: none;\n }\n\n .sp-player.has-visible-frame .sp-asset {\n opacity: 1;\n }\n\n .sp-player {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n min-width: 100%;\n min-height: 100%;\n overflow: hidden;\n --sp-progress-inset: 100%;\n --sp-scrub-preview-left: 0px;\n --sp-return-marker-left: 0px;\n --sp-return-marker-base-opacity: 1;\n --sp-return-marker-hole-left: -9999px;\n user-select: none;\n -webkit-user-select: none;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: transparent;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-player:fullscreen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-player:-webkit-full-screen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background-color: var(--overlay-soft);\n backdrop-filter: blur(var(--overlay-blur));\n -webkit-backdrop-filter: blur(var(--overlay-blur));\n opacity: 0;\n transition: opacity 260ms ease;\n transform: translateZ(0);\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-controls-visible .sp-overlay,\n :host(:hover) .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay {\n opacity: 0;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 3;\n display: grid;\n place-items: center;\n width: 60px;\n height: 60px;\n padding: 0;\n border: 0;\n border-radius: 0;\n color: var(--white);\n background: transparent;\n cursor: pointer;\n opacity: 0;\n pointer-events: none;\n transform: translate(-50%, -50%) scale(0.96);\n transition: opacity 260ms ease, transform 260ms cubic-bezier(0.23, 1, 0.32, 1);\n -webkit-tap-highlight-color: transparent;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-controls-visible .sp-button,\n :host(:hover) .sp-button {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button:focus {\n outline: 0;\n }\n\n .sp-icon {\n grid-area: 1 / 1;\n position: relative;\n z-index: 1;\n display: block;\n overflow: visible;\n transition: opacity 160ms ease, transform 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-icon--play {\n width: 54px;\n height: 60px;\n opacity: 1;\n transform: translate(4px, 0) rotate(0deg) scale(1);\n }\n\n .sp-icon--pause {\n width: 54px;\n height: 60px;\n opacity: 0;\n transform: translate(0, 0) rotate(-70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--play {\n opacity: 0;\n transform: translate(4px, 0) rotate(70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--pause {\n opacity: 1;\n transform: translate(0, 0) rotate(0deg) scale(1);\n }\n\n .sp-progress-cluster {\n position: absolute;\n top: calc(100% - 28px);\n left: 50%;\n z-index: 4;\n display: block;\n width: calc(100% - (var(--space) * 8));\n height: 28px;\n --sp-progress-height: 4px;\n transform: translateX(-50%);\n transition:\n top 360ms cubic-bezier(0.23, 1, 0.32, 1),\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n transform 360ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-progress {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n height: 28px;\n cursor: pointer;\n touch-action: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster {\n top: 50%;\n left: 50%;\n width: min(148px, calc(100% - (var(--space) * 12)));\n height: 20px;\n --sp-progress-height: 4px;\n transform: translate(-50%, -50%);\n }\n\n .sp-progress-surface,\n .sp-progress-fill {\n position: absolute;\n bottom: calc(var(--space) * 2);\n left: 0;\n height: var(--sp-progress-height);\n border-radius: 3px;\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-progress-surface {\n right: 0;\n bottom: calc((var(--space) * 2) - 2px);\n z-index: 0;\n height: calc(var(--sp-progress-height) + 4px);\n border-radius: 5px;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n }\n\n .sp-progress-surface::after {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0;\n border-radius: inherit;\n background: linear-gradient(90deg, transparent 0%, var(--sp-shimmer-highlight) 46%, transparent 100%);\n transform: translateX(-120%);\n }\n\n .sp-player.is-loading .sp-progress-surface::after {\n opacity: 1;\n animation: sp-progress-shimmer 1.35s ease-in-out infinite;\n }\n\n .sp-player.is-loading.has-loaded-once .sp-progress-surface {\n opacity: 0.48;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-surface {\n background: rgb(255 255 255 / 0.08);\n opacity: 1;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-fill,\n .sp-player.is-progress-settling .sp-progress-fill {\n opacity: 0;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover),\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-control-tray {\n position: absolute;\n display: var(--sp-control-tray-display);\n right: 0;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n z-index: 3;\n width: var(--sp-control-tray-expanded-width);\n height: calc(var(--sp-control-slot-size) + (var(--sp-control-tray-padding) * 2));\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: right bottom;\n transition:\n bottom 180ms ease,\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-pointer-active .sp-control-tray,\n .sp-player.is-controls-visible .sp-control-tray,\n :host(:hover) .sp-control-tray {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n opacity: var(--sp-control-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-control-tray-slots {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 0;\n height: 100%;\n box-sizing: border-box;\n padding: var(--sp-control-tray-padding);\n border-radius: 5px;\n overflow: visible;\n opacity: 1;\n transition: height 180ms ease;\n }\n\n .sp-control-tray-slots::before {\n content: '';\n position: absolute;\n top: var(--sp-control-tray-padding);\n left: var(--sp-control-tray-padding);\n z-index: 0;\n width: var(--sp-control-slot-size);\n height: var(--sp-control-slot-size);\n border-radius: 3px;\n background: var(--sp-control-hover-surface);\n opacity: 0;\n pointer-events: none;\n transform: translateX(var(--sp-control-hover-offset, 0px));\n transition:\n opacity 120ms ease,\n transform 240ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: var(--sp-control-hover-opacity);\n transition:\n opacity 80ms ease 120ms,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n transform: translateX(var(--sp-touch-control-hover-offset));\n transition:\n opacity 80ms ease,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:not(:has(.sp-control-button:hover))::before {\n transition:\n opacity 100ms ease,\n transform 0ms linear 100ms;\n }\n\n .sp-control-button {\n position: relative;\n z-index: 1;\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n aspect-ratio: 1 / 1;\n width: var(--sp-control-slot-size);\n min-width: 0;\n height: var(--sp-control-slot-size);\n border: 0;\n border-radius: 3px;\n color: var(--white);\n background: transparent;\n padding: 0;\n cursor: pointer;\n transition: background-color 150ms ease, color 150ms ease;\n }\n\n .sp-control-button:focus {\n outline: 0;\n }\n\n .sp-control-button:hover {\n background: var(--sp-control-slot-hover-surface);\n }\n\n .sp-player:not(.has-volume-control) [data-sp-volume-control],\n .sp-player:not(.has-picture-in-picture-control) [data-sp-picture-in-picture-control],\n .sp-player:not(.has-fullscreen-control) [data-sp-fullscreen-control] {\n display: none;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control] {\n cursor: default;\n pointer-events: auto;\n }\n\n .sp-player.is-volume-unavailable .sp-volume-icon {\n transition: none;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control]:hover {\n background: transparent;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control]:hover .sp-control-icon,\n .sp-player.is-volume-unavailable [data-sp-volume-control].is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control]:hover)::before,\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control].is-control-tap-active)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-icon {\n display: block;\n width: var(--sp-control-icon-render-size);\n height: var(--sp-control-icon-render-size);\n color: currentColor;\n overflow: visible;\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n transition:\n opacity 180ms ease,\n transform 280ms cubic-bezier(0.18, 0.9, 0.22, 1);\n transition-delay: 0ms;\n }\n\n .sp-control-icon [stroke] {\n stroke-width: var(--sp-control-icon-stroke-width);\n }\n\n .sp-volume-icon,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: none;\n }\n\n .sp-player.is-volume-sound .sp-volume-icon--sound,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: block;\n }\n\n .sp-player.is-volume-icon-animating .sp-volume-icon {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-popover {\n position: absolute;\n left: 0;\n bottom: calc(var(--sp-control-slot-size) + var(--sp-control-tray-padding) + 4px);\n z-index: -1;\n display: grid;\n place-items: center;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(8px) scale(0.98);\n transform-origin: center bottom;\n transition:\n opacity 140ms ease,\n filter 180ms ease,\n transform 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-slot::after {\n content: '';\n position: absolute;\n right: 0;\n bottom: 100%;\n left: 0;\n height: calc(var(--sp-control-tray-padding) + 4px);\n z-index: 5;\n pointer-events: auto;\n }\n\n .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-volume-popover.is-scrubbing-volume {\n z-index: 4;\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n transition:\n opacity 150ms ease,\n filter 220ms ease,\n transform 260ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-volume-unavailable .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player:not(.has-volume-slider-control) .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player.is-volume-unavailable .sp-volume-popover.is-scrubbing-volume {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-volume-track {\n position: relative;\n z-index: 1;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n overflow: hidden;\n touch-action: none;\n cursor: ns-resize;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n }\n\n .sp-volume-fill {\n position: absolute;\n right: 2px;\n bottom: 2px;\n left: 2px;\n height: max(0px, calc(var(--sp-volume-level) - 4px));\n min-height: 0;\n border-radius: 3px;\n background: var(--white);\n opacity: 1;\n transition: height 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-fullscreen-icon,\n .sp-player.is-fullscreen .sp-fullscreen-icon--enter,\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--exit {\n display: none;\n }\n\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--enter,\n .sp-player.is-fullscreen .sp-fullscreen-icon--exit {\n display: block;\n }\n\n .sp-player.is-pointer-active .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-icon,\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(1) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(1) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(1) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(2) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(2) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(2) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-2);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(3) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(3) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(3) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-3);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-control-tray,\n .sp-player.is-progress-settling .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n }\n\n .sp-player.has-controls-collision .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(1.4px);\n transform: translateY(-2px) scale(0.985);\n }\n\n .sp-progress-fill {\n display: block;\n z-index: 1;\n left: 2px;\n right: 2px;\n background: var(--white);\n border-radius: 3px;\n clip-path: inset(0 var(--sp-progress-inset) 0 0 round 3px);\n -webkit-mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n -webkit-mask-composite: xor;\n mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n mask-composite: exclude;\n transform: translateZ(0);\n will-change: clip-path;\n }\n\n .sp-progress-marker {\n position: absolute;\n bottom: calc((var(--space) * 2) + 1.5px);\n left: clamp(1px, var(--sp-return-marker-left), calc(100% - 1px));\n z-index: 2;\n width: 2px;\n height: max(1px, calc(var(--sp-progress-height) - 3px));\n border-radius: 2px;\n background: rgb(var(--white-rgb) / calc(var(--sp-return-marker-base-opacity) * 0.58));\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n transform: translateX(-50%) translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-player.is-scrubbing.has-return-marker .sp-progress-marker {\n opacity: 1;\n }\n\n .sp-time {\n position: absolute;\n display: block;\n bottom: calc(100% + var(--space));\n left: var(--sp-scrub-preview-left);\n z-index: 2;\n padding: 2px calc(var(--space) * 1.5);\n color: var(--white);\n background: transparent;\n border-radius: 4px;\n isolation: isolate;\n overflow: hidden;\n pointer-events: none;\n opacity: 0;\n transition: transform 120ms ease;\n transform: translateX(-50%) translateY(2px);\n white-space: nowrap;\n font: 500 12px/1.35 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-time-surface {\n position: absolute;\n inset: 0;\n z-index: 0;\n border-radius: inherit;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n will-change: backdrop-filter, opacity;\n }\n\n .sp-time-text {\n position: relative;\n z-index: 1;\n }\n\n .sp-progress:hover .sp-time,\n .sp-player.is-progress-hovering .sp-time,\n .sp-player.is-scrubbing .sp-time {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n .sp-player.has-pinned-time .sp-time {\n display: none !important;\n }\n\n .sp-tray-time {\n position: absolute;\n display: none;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n left: 0;\n z-index: 3;\n color: var(--white);\n isolation: isolate;\n overflow: visible;\n pointer-events: none;\n white-space: nowrap;\n opacity: 0;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: left bottom;\n transition:\n bottom 180ms ease,\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.has-pinned-time .sp-tray-time {\n display: block;\n }\n\n .sp-player.has-pinned-time.is-pointer-active .sp-tray-time,\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time,\n :host(:hover) .sp-player.has-pinned-time .sp-tray-time {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-tray-time-holder {\n position: relative;\n right: auto;\n bottom: auto;\n width: calc(var(--sp-tray-time-width, max-content) + (var(--sp-control-tray-padding) * 2));\n height: calc(var(--sp-control-slot-size) + (var(--sp-control-tray-padding) * 2));\n transition: width 240ms cubic-bezier(0.23, 1, 0.32, 1);\n overflow: hidden;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots::before {\n width: calc(100% - (var(--sp-control-tray-padding) * 2));\n opacity: var(--sp-control-hover-opacity);\n }\n\n .sp-tray-time-holder .sp-tray-time-text {\n aspect-ratio: auto;\n width: 100%;\n height: var(--sp-control-slot-size);\n max-height: var(--sp-control-slot-size);\n padding: 0 8px;\n font: 600 13px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n color: var(--white);\n border-radius: 3px;\n }\n\n .sp-tray-time-text {\n pointer-events: auto;\n cursor: pointer;\n }\n\n .sp-tray-time-text.is-time-animating {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-tray-time {\n opacity: 0;\n }\n\n .sp-button:focus-visible,\n .sp-progress:focus-visible,\n .sp-control-button:focus-visible,\n .sp-volume-track:focus-visible {\n outline: 2px solid rgb(255 255 255 / 0.92);\n outline-offset: 3px;\n box-shadow: 0 0 0 5px rgb(0 0 0 / 0.32);\n }\n\n @media (max-width: 768px) and (hover: none) and (pointer: coarse) {\n .sp-overlay,\n .sp-button {\n transition-duration: 340ms;\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n opacity: 0;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n transform: translate(-50%, -50%) scale(0.96);\n }\n\n .sp-player.is-controls-visible .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button,\n .sp-player.is-scrubbing .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time {\n opacity: 1;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n :host(:hover) .sp-overlay,\n :host(:hover) .sp-button,\n :host(:hover) .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n }\n\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n }\n\n .sp-player.is-controls-visible .sp-overlay,\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n pointer-events: auto;\n }\n\n .sp-player.is-controls-visible .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes sp-progress-shimmer {\n 0% {\n transform: translateX(-120%);\n }\n\n 58%,\n 100% {\n transform: translateX(120%);\n }\n }\n\n @keyframes sp-volume-icon-swap {\n 0% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n 42% {\n filter: blur(1.2px);\n transform: translateY(0) scale(0.9);\n }\n\n 100% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n }\n`;\n","import { styles } from './styles';\n\nexport const template = document.createElement('template');\ntemplate.innerHTML = `\n <style>${styles}</style>\n <div class=\"sp-player is-loading\" data-sp-player>\n <video\n class=\"sp-video sp-asset\"\n autoplay\n muted\n playsinline\n loop\n preload=\"none\"\n controlslist=\"nodownload nofullscreen noremoteplayback\"\n disableRemotePlayback\n data-sp-video>\n </video>\n <span class=\"sp-overlay\" aria-hidden=\"true\"></span>\n <button class=\"sp-button\" type=\"button\" aria-label=\"Play video\" data-sp-button>\n <svg class=\"sp-icon sp-icon--play\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <path d=\"M3 3.5L15 10L3 16.5Z\" fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-icon sp-icon--pause\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n <rect x=\"10\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n </svg>\n </button>\n <div class=\"sp-progress-cluster\">\n <div class=\"sp-progress\" aria-label=\"Video progress\" role=\"slider\" tabindex=\"0\" data-sp-progress-track>\n <span class=\"sp-progress-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time\" data-sp-time>\n <span class=\"sp-time-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time-text\" data-sp-time-text>0:00</span>\n </span>\n <span class=\"sp-progress-fill\" data-sp-progress></span>\n <span class=\"sp-progress-marker\" aria-hidden=\"true\"></span>\n </div>\n <span class=\"sp-tray-time\" data-sp-tray-time>\n <span class=\"sp-control-tray sp-tray-time-holder\">\n <span class=\"sp-control-tray-slots\">\n <button class=\"sp-control-button sp-tray-time-text\" type=\"button\" tabindex=\"-1\" data-sp-tray-time-text>0:00</button>\n </span>\n </span>\n </span>\n <span class=\"sp-control-tray\" data-sp-control-tray>\n <span class=\"sp-control-tray-slots\" data-sp-control-tray-slots>\n <button class=\"sp-control-button sp-volume-slot\" type=\"button\" aria-label=\"Toggle sound\" data-sp-volume-control>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--sound\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M8 7.00002H5C3.8954 7.00002 3 7.89542 3 9.00002V11C3 12.1046 3.8954 13 5 13H8L12.5227 16.7689C13.1093 17.2578 14 16.8406 14 16.077V3.92302C14 3.15942 13.1094 2.74222 12.5227 3.23112L8 7.00002Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M17.4141 8.58582C18.1951 9.36682 18.1951 10.6332 17.4141 11.4142\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--muted\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M3 17L17 3\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M15 16.0773C14.9998 17.6883 13.1207 18.5686 11.8828 17.5372L9.8333 15.8303C9.38114 15.4538 9.35003 14.7702 9.76611 14.3541C10.132 13.9882 10.7165 13.9617 11.114 14.2929L13 15.8644V11.5354C13 11.2702 13.1054 11.0158 13.2929 10.8283C13.9229 10.1983 15 10.6445 15 11.5354V16.0773Z\" fill=\"currentColor\"></path>\n <path d=\"M12 2.37218C13.2358 1.48685 15 2.36173 15 3.92296V4.87902L13 6.87902V4.13488L8.64062 7.76867C8.46092 7.91841 8.23392 8.00011 8 8.00011H5C4.44768 8.00011 4 8.4478 4 9.00011V11.0001C4.00009 11.5524 4.44774 12.0001 5 12.0001H7.87891L5.87891 14.0001H5C3.34317 14.0001 2.00009 12.6569 2 11.0001V9.00011C2 7.34323 3.34312 6.00011 5 6.00011H7.63672L11.8828 2.463L12 2.37218Z\" fill=\"currentColor\"></path>\n </svg>\n <span class=\"sp-volume-popover\" data-sp-volume-popover>\n <span class=\"sp-volume-track\" role=\"slider\" aria-label=\"Volume\" aria-valuemin=\"0\" aria-valuemax=\"100\" tabindex=\"0\" data-sp-volume-track>\n <span class=\"sp-volume-fill\" data-sp-volume-fill></span>\n </span>\n </span>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Picture in picture\" data-sp-picture-in-picture-control>\n <svg class=\"sp-control-icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"m5.5,13c-1.381,0-2.5-1.119-2.5-2.5v-5c0-1.381,1.119-2.5,2.5-2.5h7c1.381,0,2.5,1.119,2.5,2.5v2.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></path>\n <rect x=\"9\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" ry=\"1.5\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></rect>\n <line x1=\"8\" y1=\"8\" x2=\"6\" y2=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></line>\n <polygon points=\"9 6 9 9 6 9 9 6\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></polygon>\n </svg>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Enter fullscreen\" data-sp-fullscreen-control>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--enter\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"12.5 16 16 16 16 12.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"16\" y1=\"16\" x2=\"12\" y2=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"7.5 4 4 4 4 7.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"4\" y1=\"4\" x2=\"8\" y2=\"8\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--exit\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"16 12.5 12.5 12.5 12.5 16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"12\" y1=\"12\" x2=\"16\" y2=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"4 7.5 7.5 7.5 7.5 4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"8\" y1=\"8\" x2=\"4\" y2=\"4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n </button>\n </span>\n </span>\n </div>\n </div>\n`;\n","import { DEFAULT_ASPECT_RATIO, DEFAULT_PRELOAD_MARGIN, OBSERVED_ATTRIBUTES } from './constants';\nimport {\n canRequestPlayerFullscreen,\n exitFullscreen,\n getFullscreenElement,\n isFullscreenSupported,\n requestPlayerFullscreen,\n requestVideoFullscreen,\n} from './fullscreen';\nimport { detectAudioAvailability, formatVideoTime, isAudioAvailabilityPending } from './media';\nimport { getProgressMetrics, getProgressPercentFromClientX, getProgressXFromPercent } from './progress';\nimport { template } from './template';\nimport type { Cleanup, PlaybackState } from './types';\n\nexport class SimplePlayer extends HTMLElement {\n static observedAttributes = OBSERVED_ATTRIBUTES;\n\n #root: ShadowRoot;\n #cleanup: Cleanup[] = [];\n #observer: IntersectionObserver | null = null;\n #initialized = false;\n #videoSourceLoaded = false;\n #player!: HTMLElement;\n #video!: HTMLVideoElement;\n #button!: HTMLButtonElement;\n #progressTrack!: HTMLElement;\n #controlTray!: HTMLElement;\n #controlTraySlots!: HTMLElement;\n #trayTime!: HTMLElement;\n #trayTimeText!: HTMLElement;\n #scrubTime!: HTMLElement;\n #scrubTimeText!: HTMLElement;\n #volumeControl!: HTMLButtonElement;\n #volumePopover!: HTMLElement;\n #volumeTrack!: HTMLElement;\n #pictureInPictureControl!: HTMLButtonElement;\n #fullscreenControl!: HTMLButtonElement;\n #controlButtons: HTMLButtonElement[] = [];\n\n #progressFrame = 0;\n #isScrubbing = false;\n #isTrackingScrub = false;\n #scrubWasPlaying = false;\n #scrubTargetTime = 0;\n #scrubReturnTime = 0;\n #scrubReturnPercent = 0;\n #hasScrubReturnMarker = false;\n #isCommittedScrubPending = false;\n #committedScrubWasPlaying = false;\n #scrubStartX = 0;\n #scrubLongPressTimer = 0;\n #activeScrubPointerId: number | null = null;\n #optimisticPlaybackState: PlaybackState = null;\n #videoLoadAttempt = 0;\n #videoRetryTimer = 0;\n #controlsHideTimer = 0;\n #loadingStateTimer = 0;\n #initialProgressSettleTimer = 0;\n #suppressTouchButtonClickUntil = 0;\n #suppressTouchControlClickUntil = 0;\n #timeWidthObserver: ResizeObserver | null = null;\n #hasDecodedFirstFrame = false;\n #hasPresentedFirstFrame = false;\n #firstFrameRequestPending = false;\n #firstFramePresentationPending = false;\n #firstFrameRequestToken = 0;\n #firstFrameFallbackTimer = 0;\n #hasInitialProgressSettled = false;\n #initialProgressEstimateUnlockAt = 0;\n #isPlaybackBuffering = true;\n #visualProgressTime = 0;\n #visualProgressUpdatedAt = performance.now();\n #lastRenderedProgressTime = 0;\n #pausedVisualProgressTime: number | null = null;\n #pauseFrozenProgressPercent: number | null = null;\n #hasControlsCollision = false;\n #isProgressHoverPreviewing = false;\n #hasAudioTrack = false;\n #hasCheckedAudioTrack = false;\n #isPointerOverControlSurface = false;\n #lastPointerClientX: number | null = null;\n #lastPointerClientY: number | null = null;\n #lastPointerWasTouch = false;\n #isVolumeScrubbing = false;\n #isVolumeHovering = false;\n #activeVolumePointerId: number | null = null;\n #volumeCloseTimer = 0;\n #volumeIconAnimationTimer = 0;\n #controlTapTimer = 0;\n #volumeIconState: 'sound' | 'muted' | null = null;\n #showRemainingTime = false;\n #timeAnimationTimer = 0;\n\n readonly #scrubDragThreshold = 4;\n readonly #scrubSnapDistance = 3.5;\n readonly #scrubReturnMarkerBodyInset = 6;\n readonly #scrubReturnMarkerMinTime = 0.08;\n readonly #scrubLongPressDelay = 240;\n readonly #controlsAutoHideDelay = 1200;\n readonly #pointerControlsIdleDelay = 1600;\n readonly #loadingStateDelay = 140;\n readonly #initialProgressSettleDelay = 380;\n readonly #initialProgressEstimateHold = 650;\n readonly #videoRetryDelay = 2000;\n readonly #maxVideoLoadAttempts = 3;\n readonly #bufferedAheadTarget = 10;\n readonly #bufferedRangeFuzz = 0.18;\n readonly #controlsCollisionEnterMargin = 8;\n readonly #controlsCollisionExitMargin = 18;\n\n constructor() {\n super();\n this.#root = this.attachShadow({ mode: 'open' });\n this.#root.append(template.content.cloneNode(true));\n }\n\n get src() {\n return this.getAttribute('src') ?? '';\n }\n\n set src(value: string) {\n this.#setStringAttribute('src', value);\n }\n\n get aspectRatio() {\n return this.getAttribute('aspect-ratio') || DEFAULT_ASPECT_RATIO;\n }\n\n set aspectRatio(value: string) {\n this.#setStringAttribute('aspect-ratio', value);\n }\n\n get preloadMargin() {\n return this.getAttribute('preload-margin') || DEFAULT_PRELOAD_MARGIN;\n }\n\n set preloadMargin(value: string) {\n this.#setStringAttribute('preload-margin', value);\n }\n\n get autoplayEnabled() {\n return !this.hasAttribute('disable-autoplay') && !this.hasAttribute('no-autoplay');\n }\n\n set autoplayEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-autoplay');\n this.removeAttribute('no-autoplay');\n return;\n }\n\n this.setAttribute('disable-autoplay', '');\n }\n\n get controlsEnabled() {\n return this.hasAttribute('controls');\n }\n\n set controlsEnabled(value: boolean) {\n if (value) {\n this.setAttribute('controls', '');\n return;\n }\n\n this.removeAttribute('controls');\n }\n\n get timeVisible() {\n return this.hasAttribute('show-time');\n }\n\n set timeVisible(value: boolean) {\n if (value) {\n this.setAttribute('show-time', '');\n return;\n }\n\n this.removeAttribute('show-time');\n }\n\n get volumeEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-volume') &&\n !this.hasAttribute('no-volume')\n );\n }\n\n set volumeEnabled(value: boolean) {\n this.#setOptionalControlAttributes('volume', value);\n }\n\n get volumeSliderEnabled() {\n return !this.hasAttribute('disable-volume-slider') && !this.hasAttribute('no-volume-slider');\n }\n\n set volumeSliderEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-volume-slider');\n this.removeAttribute('no-volume-slider');\n return;\n }\n\n this.setAttribute('disable-volume-slider', '');\n }\n\n get pictureInPictureEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-picture-in-picture') &&\n !this.hasAttribute('no-picture-in-picture')\n );\n }\n\n set pictureInPictureEnabled(value: boolean) {\n this.#setOptionalControlAttributes('picture-in-picture', value);\n }\n\n get fullscreenEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-fullscreen') &&\n !this.hasAttribute('no-fullscreen')\n );\n }\n\n set fullscreenEnabled(value: boolean) {\n this.#setOptionalControlAttributes('fullscreen', value);\n }\n\n connectedCallback() {\n this.#player = this.#root.querySelector('[data-sp-player]')!;\n this.#video = this.#root.querySelector('[data-sp-video]')!;\n this.#button = this.#root.querySelector('[data-sp-button]')!;\n this.#progressTrack = this.#root.querySelector('[data-sp-progress-track]')!;\n this.#controlTray = this.#root.querySelector('[data-sp-control-tray]')!;\n this.#controlTraySlots = this.#root.querySelector('[data-sp-control-tray-slots]')!;\n this.#trayTime = this.#root.querySelector('[data-sp-tray-time]')!;\n this.#trayTimeText = this.#root.querySelector('[data-sp-tray-time-text]')!;\n this.#scrubTime = this.#root.querySelector('[data-sp-time]')!;\n this.#scrubTimeText = this.#root.querySelector('[data-sp-time-text]')!;\n this.#volumeControl = this.#root.querySelector('[data-sp-volume-control]')!;\n this.#volumePopover = this.#root.querySelector('[data-sp-volume-popover]')!;\n this.#volumeTrack = this.#root.querySelector('[data-sp-volume-track]')!;\n this.#pictureInPictureControl = this.#root.querySelector('[data-sp-picture-in-picture-control]')!;\n this.#fullscreenControl = this.#root.querySelector('[data-sp-fullscreen-control]')!;\n this.#controlButtons = [this.#volumeControl, this.#pictureInPictureControl, this.#fullscreenControl];\n this.#syncAspectRatio();\n\n if (!this.#initialized) {\n this.#bindEvents();\n this.#initialized = true;\n }\n\n this.#syncAutoplayState();\n this.#setupLazyLoading();\n this.#syncOptionalControls();\n this.#syncTimeVisibility();\n this.#syncVideoLoading();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncVideoState();\n }\n\n disconnectedCallback() {\n this.#observer?.disconnect();\n this.#observer = null;\n this.#cleanup.forEach((cleanup) => cleanup());\n this.#cleanup = [];\n this.#initialized = false;\n this.#clearControlsHideTimer();\n this.#clearLoadingStateTimer();\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#clearScrubLongPressTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#clearVolumeCloseTimer();\n this.#clearVolumeIconAnimationTimer();\n this.#clearControlTapTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.style.removeProperty('--sp-touch-control-hover-offset');\n this.#clearControlsCollision();\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#isPointerOverControlSurface = false;\n this.#activeVolumePointerId = null;\n this.#volumeControl.classList.remove('is-volume-open');\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.#player.classList.remove('is-pointer-active');\n this.#stopProgressLoop();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return;\n\n if (name === 'aspect-ratio') {\n this.#syncAspectRatio();\n return;\n }\n\n if (name === 'preload-margin' && this.isConnected) {\n this.#observer?.disconnect();\n this.#setupLazyLoading();\n return;\n }\n\n if (name === 'src' && this.isConnected) {\n this.#resetSource();\n this.#setupLazyLoading();\n return;\n }\n\n if ((name === 'disable-autoplay' || name === 'no-autoplay') && this.isConnected) {\n this.#syncAutoplayState();\n this.#syncAudioControlState();\n this.#syncVideoState();\n return;\n }\n\n if (name === 'show-time' && this.isConnected) {\n this.#syncTimeVisibility();\n return;\n }\n\n if (\n (\n name === 'controls' ||\n name.startsWith('enable-') ||\n name.startsWith('disable-') ||\n name.startsWith('no-')\n ) &&\n this.isConnected\n ) {\n this.#syncOptionalControls();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncTimeVisibility();\n }\n }\n\n #setStringAttribute(name: string, value: string) {\n if (value === '') {\n this.removeAttribute(name);\n return;\n }\n\n this.setAttribute(name, value);\n }\n\n #setOptionalControlAttributes(name: 'volume' | 'picture-in-picture' | 'fullscreen', enabled: boolean) {\n if (enabled) {\n this.setAttribute(`enable-${name}`, '');\n this.removeAttribute(`disable-${name}`);\n this.removeAttribute(`no-${name}`);\n return;\n }\n\n this.removeAttribute(`enable-${name}`);\n this.setAttribute(`disable-${name}`, '');\n }\n\n #syncAspectRatio() {\n this.style.setProperty('--simple-player-aspect-ratio', this.aspectRatio);\n }\n\n #syncAutoplayState() {\n if (!this.#video) return;\n\n const isEnabled = this.autoplayEnabled;\n this.#video.autoplay = isEnabled;\n\n if (isEnabled) {\n this.#video.muted = true;\n this.#video.setAttribute('autoplay', '');\n this.#video.setAttribute('muted', '');\n return;\n }\n\n this.#video.removeAttribute('autoplay');\n\n if (!this.#videoSourceLoaded) {\n this.#video.muted = false;\n this.#video.removeAttribute('muted');\n }\n }\n\n #syncOptionalControls() {\n if (!this.#player) return;\n\n const hasVolumeControl = this.#isVolumeAvailable();\n const controls = [\n { button: this.#volumeControl, enabled: hasVolumeControl, className: 'has-volume-control' },\n { button: this.#pictureInPictureControl, enabled: this.pictureInPictureEnabled, className: 'has-picture-in-picture-control' },\n { button: this.#fullscreenControl, enabled: this.fullscreenEnabled, className: 'has-fullscreen-control' },\n ];\n\n let index = 0;\n for (const control of controls) {\n this.#player.classList.toggle(control.className, control.enabled);\n control.button.hidden = !control.enabled;\n\n if (control.enabled) {\n control.button.dataset.spControlIndex = `${index}`;\n index += 1;\n } else {\n delete control.button.dataset.spControlIndex;\n }\n }\n\n this.style.setProperty('--sp-enabled-controls-count', `${index}`);\n this.style.setProperty('--sp-control-tray-display', index > 0 ? 'block' : 'none');\n this.#player.classList.toggle('has-volume-slider-control', hasVolumeControl && this.volumeSliderEnabled);\n\n if (!hasVolumeControl || !this.volumeSliderEnabled) {\n this.#closeVolumePopover();\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n }\n\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n }\n\n get #hasPinnedTime() {\n return this.timeVisible && this.controlsEnabled;\n }\n\n #syncTimeVisibility() {\n if (!this.#player) return;\n\n this.#player.classList.toggle('has-pinned-time', this.#hasPinnedTime);\n if (this.#hasPinnedTime) {\n this.#syncPinnedTimeText();\n }\n }\n\n #bindEvents() {\n this.#listen(this.#button, 'click', this.#handleButtonClick);\n this.#listen(this, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#button, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#button, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleProgressPointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleProgressPointerLeave);\n this.#listen(this.#controlTray, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#controlTray, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#root, 'focusin', this.#handleControlSurfaceFocusIn);\n this.#listen(this.#root, 'focusout', this.#handleControlSurfaceFocusOut);\n this.#listen(this.#player, 'pointerdown', this.#handlePlayerPointerDown);\n this.#listen(this.#player, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#player, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#progressTrack, 'pointerdown', this.#handleProgressPointerDown);\n this.#listen(this.#progressTrack, 'pointermove', this.#handleProgressPointerMove);\n this.#listen(this.#progressTrack, 'pointerup', this.#handleProgressPointerUp);\n this.#listen(this.#progressTrack, 'pointercancel', this.#handleProgressPointerCancel);\n this.#listen(this.#progressTrack, 'keydown', this.#handleProgressKeyDown);\n this.#listen(this.#volumeControl, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumeControl, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeControl, 'click', this.#handleVolumeControlClick);\n this.#listen(this.#volumePopover, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumePopover, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeTrack, 'pointerdown', this.#handleVolumePointerDown);\n this.#listen(this.#volumeTrack, 'pointermove', this.#handleVolumePointerMove);\n this.#listen(this.#volumeTrack, 'pointerup', this.#handleVolumePointerUp);\n this.#listen(this.#volumeTrack, 'pointercancel', this.#handleVolumePointerCancel);\n this.#listen(this.#volumeTrack, 'click', this.#preventVolumeTrackClick);\n this.#listen(this.#volumeTrack, 'keydown', this.#handleVolumeKeyDown);\n this.#listen(this.#pictureInPictureControl, 'click', this.#handlePictureInPictureClick);\n this.#listen(this.#fullscreenControl, 'click', this.#handleFullscreenClick);\n this.#listen(this.#trayTimeText, 'click', this.#handleTimeToggleClick);\n for (const control of this.#controlButtons) {\n this.#listen(control, 'pointerenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'mouseenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'pointerdown', this.#handleControlButtonPointerDown);\n }\n\n if ('ResizeObserver' in window) {\n this.#timeWidthObserver = new ResizeObserver(() => {\n this.#syncTrayTimeWidth();\n });\n this.#timeWidthObserver.observe(this.#trayTimeText);\n this.#cleanup.push(() => {\n this.#timeWidthObserver?.disconnect();\n this.#timeWidthObserver = null;\n });\n }\n\n this.#listen(document, 'pointerup', this.#handleDocumentPointerUp);\n this.#listen(document, 'pointercancel', this.#handleDocumentPointerCancel);\n this.#listen(document, 'pointermove', this.#handleDocumentPointerMove);\n this.#listen(document, 'mousemove', this.#handleDocumentPointerMove);\n this.#listen(document, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'webkitfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'mozfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'MSFullscreenChange', this.#handleFullscreenChange);\n this.#listen(this.#root, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(window, 'blur', this.#handleWindowBlur);\n this.#listen(window, 'focus', this.#handleWindowFocus);\n\n this.#listen(this.#video, 'play', this.#handleVideoPlay);\n this.#listen(this.#video, 'pause', this.#handleVideoPause);\n this.#listen(this.#video, 'ended', this.#handleVideoEnded);\n this.#listen(this.#video, 'loadstart', this.#handleVideoLoadStart);\n this.#listen(this.#video, 'waiting', this.#handleVideoWaiting);\n this.#listen(this.#video, 'stalled', this.#handleVideoWaiting);\n this.#listen(this.#video, 'seeking', this.#handleVideoWaiting);\n this.#listen(this.#video, 'loadeddata', this.#markVideoReady);\n this.#listen(this.#video, 'loadedmetadata', this.#handleVideoLoadedMetadata);\n this.#listen(this.#video, 'canplay', this.#markVideoReady);\n this.#listen(this.#video, 'canplaythrough', this.#markVideoReady);\n this.#listen(this.#video, 'playing', this.#handleVideoPlaying);\n this.#listen(this.#video, 'seeked', this.#handleVideoSeeked);\n this.#listen(this.#video, 'error', this.#handleVideoError);\n this.#listen(this.#video, 'progress', this.#syncVideoLoading);\n this.#listen(this.#video, 'suspend', this.#syncVideoLoading);\n this.#listen(this.#video, 'timeupdate', this.#handleVideoTimeUpdate);\n this.#listen(this.#video, 'volumechange', this.#handleVideoVolumeChange);\n this.#listen(this.#video, 'enterpictureinpicture', this.#syncPictureInPictureState);\n this.#listen(this.#video, 'leavepictureinpicture', this.#syncPictureInPictureState);\n }\n\n #syncTrayTimeWidth() {\n if (!this.#player || !this.#trayTimeText) return;\n this.#trayTimeText.style.width = 'fit-content';\n const width = Math.ceil(this.#trayTimeText.scrollWidth);\n this.#trayTimeText.style.width = '';\n this.#player.style.setProperty('--sp-tray-time-width', `${width}px`);\n }\n\n #listen(target: EventTarget, type: string, listener: EventListenerOrEventListenerObject) {\n target.addEventListener(type, listener);\n this.#cleanup.push(() => target.removeEventListener(type, listener));\n }\n\n #setupLazyLoading() {\n if (!this.src || this.#videoSourceLoaded) return;\n\n this.#observer?.disconnect();\n this.#video.dataset.src = this.src;\n\n if ('IntersectionObserver' in window) {\n this.#observer = new IntersectionObserver((entries, observer) => {\n if (!entries.some((entry) => entry.isIntersecting)) return;\n observer.disconnect();\n this.#observer = null;\n void this.#hydrateVideoSource();\n }, { rootMargin: this.preloadMargin });\n\n this.#observer.observe(this.#player);\n return;\n }\n\n void this.#hydrateVideoSource();\n }\n\n #preventNativeVideoAction = (event: Event) => {\n event.preventDefault();\n };\n\n #clearControlsHideTimer() {\n if (!this.#controlsHideTimer) return;\n window.clearTimeout(this.#controlsHideTimer);\n this.#controlsHideTimer = 0;\n }\n\n #hideControls = () => {\n this.#controlsHideTimer = 0;\n if (this.#isTrackingScrub || this.#isScrubbing || this.#isVolumeScrubbing) return;\n\n if (this.#isTouchControls()) {\n this.#player.classList.remove('is-controls-visible');\n return;\n }\n\n if (this.#isPointerOverControlSurface) return;\n this.#player.classList.remove('is-pointer-active');\n };\n\n #scheduleControlsHide(delay = this.#isTouchControls() ? this.#controlsAutoHideDelay : this.#pointerControlsIdleDelay) {\n this.#clearControlsHideTimer();\n this.#controlsHideTimer = window.setTimeout(this.#hideControls, delay);\n }\n\n #scheduleTouchControlsHide() {\n if (!this.#isTouchControls()) return;\n this.#scheduleControlsHide(this.#controlsAutoHideDelay);\n }\n\n #showTouchControls() {\n if (!this.#isTouchControls()) return false;\n const wasVisible = this.#player.classList.contains('is-controls-visible');\n this.#player.classList.add('is-controls-visible');\n this.#scheduleTouchControlsHide();\n return !wasVisible;\n }\n\n #showPointerControls(forcePointer = false) {\n if (!forcePointer && this.#isTouchControls()) return;\n this.#player.classList.add('is-pointer-active');\n if (!this.#isPointerOverControlSurface) {\n this.#scheduleControlsHide(forcePointer ? this.#pointerControlsIdleDelay : undefined);\n } else {\n this.#clearControlsHideTimer();\n }\n }\n\n #hidePointerControls() {\n this.#isPointerOverControlSurface = false;\n this.#clearControlsHideTimer();\n this.#player.classList.remove('is-pointer-active');\n }\n\n #trackPointerPosition(event: Event) {\n if (event instanceof PointerEvent) {\n this.#lastPointerWasTouch = event.pointerType === 'touch';\n if (this.#lastPointerWasTouch) return false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n if (event instanceof MouseEvent) {\n this.#lastPointerWasTouch = false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n return false;\n }\n\n #isPointInsidePlayer(clientX: number | null, clientY: number | null) {\n if (clientX === null || clientY === null) return false;\n if (clientX < 0 || clientY < 0 || clientX > window.innerWidth || clientY > window.innerHeight) return false;\n\n const rect = this.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #isPointInsideElement(element: Element | null, clientX: number, clientY: number) {\n if (!element) return false;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #clearProgressHoverPreview() {\n if (!this.#isProgressHoverPreviewing) return;\n\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#clearControlsCollision();\n this.#syncPinnedTimeText();\n }\n\n #syncHoverTargetsFromPointer(clientX: number, clientY: number) {\n if (this.#isTouchControls()) return;\n\n if (!this.#isScrubPreviewLocked() && this.#isPointInsideElement(this.#progressTrack, clientX, clientY)) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(clientX, false, false);\n } else if (!this.#isScrubPreviewLocked()) {\n this.#clearProgressHoverPreview();\n }\n\n const hoveredControl = this.#controlButtons.find((button) => {\n return !button.hidden && !this.#isUnavailableControlButton(button) && this.#isPointInsideElement(button, clientX, clientY);\n }) ?? null;\n\n if (!hoveredControl) return;\n\n const index = Number(hoveredControl.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n }\n\n #areControlsVisible() {\n return (\n this.#player.classList.contains('is-controls-visible') ||\n this.#player.classList.contains('is-pointer-active') ||\n this.#root.activeElement instanceof HTMLElement\n );\n }\n\n #shouldSuppressControlAction() {\n return this.#isTouchControls() && performance.now() < this.#suppressTouchControlClickUntil;\n }\n\n #isUnavailableControlButton(button: HTMLElement | null) {\n return (\n button instanceof HTMLButtonElement &&\n (button.disabled || (button === this.#volumeControl && !this.#isVolumeAvailable()))\n );\n }\n\n #syncPointerControlsFromLastPosition() {\n if (!this.#lastPointerWasTouch && this.#isPointInsidePlayer(this.#lastPointerClientX, this.#lastPointerClientY)) {\n this.#showPointerControls(true);\n return;\n }\n\n this.#hidePointerControls();\n }\n\n #handlePlayerPointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#showPointerControls(true);\n };\n\n #handlePlayerPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#showPointerControls(true);\n };\n\n #handleDocumentPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#syncPointerControlsFromLastPosition();\n };\n\n #handlePlayerPointerLeave = () => {\n this.#hidePointerControls();\n };\n\n #handleControlSurfacePointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#isPointerOverControlSurface = true;\n this.#player.classList.add('is-pointer-active');\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfacePointerLeave = () => {\n this.#isPointerOverControlSurface = false;\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlSurfaceFocusIn = () => {\n if (this.#isTouchControls()) {\n this.#player.classList.add('is-controls-visible');\n } else {\n this.#player.classList.add('is-pointer-active');\n }\n\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfaceFocusOut = () => {\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlButtonPointerEnter = (event: Event) => {\n const target = event.currentTarget as HTMLElement | null;\n if (this.#isUnavailableControlButton(target)) return;\n\n const button = target as HTMLButtonElement;\n const index = Number(button.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n };\n\n #clearControlTapTimer() {\n if (!this.#controlTapTimer) return;\n window.clearTimeout(this.#controlTapTimer);\n this.#controlTapTimer = 0;\n }\n\n #clearControlTapActive = () => {\n this.#controlTapTimer = 0;\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.style.removeProperty('--sp-touch-control-hover-offset');\n };\n\n #handleControlButtonPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent) || event.pointerType !== 'touch') return;\n\n const target = event.currentTarget as HTMLButtonElement | null;\n if (!target || !this.#areControlsVisible() || this.#isUnavailableControlButton(target)) return;\n\n const index = Number(target.dataset.spControlIndex ?? 0);\n this.#clearControlTapTimer();\n this.#controlButtons.forEach((button) => button.classList.toggle('is-control-tap-active', button === target));\n this.style.setProperty('--sp-touch-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n this.#controlTapTimer = window.setTimeout(this.#clearControlTapActive, 280);\n };\n\n #clearLoadingStateTimer() {\n if (!this.#loadingStateTimer) return;\n window.clearTimeout(this.#loadingStateTimer);\n this.#loadingStateTimer = 0;\n }\n\n #clearVideoRetryTimer() {\n if (!this.#videoRetryTimer) return;\n window.clearTimeout(this.#videoRetryTimer);\n this.#videoRetryTimer = 0;\n }\n\n #clearInitialProgressSettleTimer() {\n if (!this.#initialProgressSettleTimer) return;\n window.clearTimeout(this.#initialProgressSettleTimer);\n this.#initialProgressSettleTimer = 0;\n }\n\n #clearFirstFrameFallbackTimer() {\n if (!this.#firstFrameFallbackTimer) return;\n window.clearTimeout(this.#firstFrameFallbackTimer);\n this.#firstFrameFallbackTimer = 0;\n }\n\n #clearVolumeIconAnimationTimer() {\n if (!this.#volumeIconAnimationTimer) return;\n window.clearTimeout(this.#volumeIconAnimationTimer);\n this.#volumeIconAnimationTimer = 0;\n }\n\n #animateVolumeIconSwap() {\n this.#clearVolumeIconAnimationTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n void this.#volumeControl.offsetWidth;\n this.#player.classList.add('is-volume-icon-animating');\n this.#volumeIconAnimationTimer = window.setTimeout(() => {\n this.#volumeIconAnimationTimer = 0;\n this.#player.classList.remove('is-volume-icon-animating');\n }, 240);\n }\n\n #finishInitialProgressSettle = () => {\n const wasSettling = Boolean(this.#initialProgressSettleTimer) || this.#player.classList.contains('is-progress-settling');\n if (!wasSettling) return;\n\n this.#clearInitialProgressSettleTimer();\n if (this.#hasInitialProgressSettled) {\n this.#player.classList.remove('is-progress-settling');\n return;\n }\n\n this.#hasInitialProgressSettled = true;\n this.#initialProgressEstimateUnlockAt = performance.now() + this.#initialProgressEstimateHold;\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n this.#player.classList.remove('is-progress-settling');\n this.#syncVideoState();\n };\n\n #queueInitialProgressSettle() {\n if (this.#hasInitialProgressSettled || this.#initialProgressSettleTimer) return;\n\n this.#player.classList.add('is-progress-settling');\n this.#setProgressVisual(0);\n this.#initialProgressSettleTimer = window.setTimeout(this.#finishInitialProgressSettle, this.#initialProgressSettleDelay);\n }\n\n async #hydrateVideoSource() {\n if (this.#videoSourceLoaded) return;\n\n const source = this.#video.dataset.src || this.src;\n if (!source) return;\n\n this.#clearVideoRetryTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#videoLoadAttempt += 1;\n this.#videoSourceLoaded = true;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#syncAutoplayState();\n this.#video.src = source;\n this.#video.preload = 'auto';\n this.#video.load();\n\n if (this.#video.autoplay && this.#video.muted) {\n await this.#video.play().catch(() => undefined);\n }\n }\n\n #isLoopBoundaryBlip() {\n if (!this.#video.loop || this.#video.paused || !Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return false;\n return this.#video.currentTime < 0.28 || (this.#video.duration - this.#video.currentTime) < 0.28;\n }\n\n #getBufferedAhead(time = this.#video.currentTime) {\n if (!Number.isFinite(time)) return 0;\n\n const currentTime = Math.max(0, time);\n\n try {\n for (let index = 0; index < this.#video.buffered.length; index += 1) {\n const start = this.#video.buffered.start(index);\n const end = this.#video.buffered.end(index);\n\n if (currentTime + this.#bufferedRangeFuzz >= start && currentTime <= end + this.#bufferedRangeFuzz) {\n return Math.max(0, end - currentTime);\n }\n }\n } catch {\n return 0;\n }\n\n return 0;\n }\n\n #hasBufferedAhead(seconds = this.#bufferedAheadTarget) {\n if (\n !this.#videoSourceLoaded ||\n this.#video.error ||\n !this.#player.classList.contains('has-loaded-once') ||\n !Number.isFinite(this.#video.duration) ||\n this.#video.duration <= 0\n ) return false;\n\n const remainingDuration = Math.max(0, this.#video.duration - this.#video.currentTime);\n const requiredBuffer = Math.min(seconds, remainingDuration);\n\n return requiredBuffer <= this.#bufferedRangeFuzz || this.#getBufferedAhead() + this.#bufferedRangeFuzz >= requiredBuffer;\n }\n\n #setVideoLoading(isLoading: boolean, immediate = false) {\n this.#clearLoadingStateTimer();\n const shouldLoad = isLoading && !this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead();\n const shouldWaitForFirstFrame = isLoading && !this.#hasPresentedFirstFrame;\n const shouldShowLoading = shouldWaitForFirstFrame || shouldLoad;\n this.#isPlaybackBuffering = shouldShowLoading;\n\n if (!shouldShowLoading) {\n this.#player.classList.remove('is-loading');\n return;\n }\n\n if (immediate) {\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#loadingStateTimer = window.setTimeout(() => {\n this.#loadingStateTimer = 0;\n if (!this.#hasPresentedFirstFrame || (!this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead())) {\n this.#isPlaybackBuffering = true;\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#isPlaybackBuffering = false;\n this.#player.classList.remove('is-loading');\n }, this.#loadingStateDelay);\n }\n\n #syncVideoLoading = () => {\n if (this.#video.error) {\n this.#setVideoLoading(true, true);\n return;\n }\n\n this.#setVideoLoading(\n (\n !this.#videoSourceLoaded ||\n !this.#hasPresentedFirstFrame ||\n this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA\n ),\n );\n };\n\n #canStartImmediately() {\n return (\n this.#videoSourceLoaded &&\n !this.#video.error &&\n this.#hasDecodedFirstFrame &&\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA ||\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n !this.#player.classList.contains('is-loading')\n )\n )\n );\n }\n\n #isScrubPreviewLocked() {\n return this.#isTrackingScrub || this.#isScrubbing || this.#isCommittedScrubPending;\n }\n\n #retryVideoLoad() {\n if (this.#videoLoadAttempt >= this.#maxVideoLoadAttempts || this.#videoRetryTimer) return;\n\n this.#videoRetryTimer = window.setTimeout(() => {\n this.#videoRetryTimer = 0;\n this.#clearFirstFrameFallbackTimer();\n this.#videoSourceLoaded = false;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n\n if (!this.#player.classList.contains('has-loaded-once')) {\n this.#setProgressVisual(0);\n }\n\n this.#video.removeAttribute('src');\n this.#video.load();\n void this.#hydrateVideoSource();\n }, this.#videoRetryDelay);\n }\n\n #clearCommittedScrubPreview() {\n if (!this.#isCommittedScrubPending) return false;\n\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #commitVideoReady() {\n this.#clearVideoRetryTimer();\n const isFirstReady = !this.#player.classList.contains('has-loaded-once');\n\n if (isFirstReady) this.#queueInitialProgressSettle();\n\n this.#player.classList.add('has-loaded-once');\n this.#player.classList.add('has-visible-frame');\n this.#syncVideoLoading();\n this.#optimisticPlaybackState = null;\n if (this.#isCommittedScrubPending) {\n this.#clearCommittedScrubPreview();\n return true;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #requestFirstVideoFrame() {\n if (this.#hasDecodedFirstFrame || this.#firstFrameRequestPending || this.#video.error) return;\n\n this.#firstFrameRequestPending = true;\n const requestToken = this.#firstFrameRequestToken;\n const confirmFirstFrame = () => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#clearFirstFrameFallbackTimer();\n this.#firstFrameRequestPending = false;\n this.#hasDecodedFirstFrame =\n !this.#video.error &&\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n this.#video.videoWidth > 0 &&\n this.#video.videoHeight > 0;\n\n if (this.#hasDecodedFirstFrame) {\n if (this.#firstFramePresentationPending || this.#hasPresentedFirstFrame) return;\n\n this.#firstFramePresentationPending = true;\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#firstFramePresentationPending = false;\n this.#hasPresentedFirstFrame = true;\n this.#commitVideoReady();\n this.#syncVideoState();\n });\n });\n this.#syncVideoState();\n return;\n }\n\n this.#syncVideoLoading();\n };\n\n if ('requestVideoFrameCallback' in this.#video) {\n this.#video.requestVideoFrameCallback(confirmFirstFrame);\n this.#firstFrameFallbackTimer = window.setTimeout(confirmFirstFrame, 180);\n return;\n }\n\n window.requestAnimationFrame(confirmFirstFrame);\n }\n\n #markVideoReady = () => {\n if (\n this.#video.error ||\n this.#video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA ||\n this.#video.videoWidth <= 0 ||\n this.#video.videoHeight <= 0\n ) {\n this.#syncVideoLoading();\n return false;\n }\n\n if (!this.#hasDecodedFirstFrame) {\n this.#requestFirstVideoFrame();\n this.#syncVideoLoading();\n return false;\n }\n\n const isReady = this.#commitVideoReady();\n this.#syncAudioControlState();\n return isReady;\n };\n\n #isVideoAdvancing() {\n return (\n !this.#video.paused &&\n (!this.#video.ended || this.#video.loop) &&\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA\n );\n }\n\n #syncVisualProgressClock(time = this.#video.currentTime) {\n this.#visualProgressTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#visualProgressUpdatedAt = performance.now();\n }\n\n #clearPausedVisualProgress() {\n this.#pausedVisualProgressTime = null;\n this.#pauseFrozenProgressPercent = null;\n }\n\n #holdPausedVisualProgress() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pausedVisualProgressTime = null;\n return;\n }\n\n const currentTime = Number.isFinite(this.#video.currentTime) ? Math.max(0, this.#video.currentTime) : 0;\n const renderedTime = Number.isFinite(this.#lastRenderedProgressTime) ? this.#lastRenderedProgressTime : currentTime;\n this.#pausedVisualProgressTime = Math.min(this.#video.duration, Math.max(currentTime, renderedTime));\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n }\n\n #freezeRenderedProgressForPause() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pauseFrozenProgressPercent = null;\n this.#holdPausedVisualProgress();\n return;\n }\n\n const rawInset = this.#player.style.getPropertyValue('--sp-progress-inset');\n const inset = Number.parseFloat(rawInset);\n const progressFromFill = Number.isFinite(inset) ? Math.min(1, Math.max(0, 1 - (inset / 100))) : null;\n const visualTime = this.#getVisualProgressTime();\n const progressFromTime = Math.min(1, Math.max(0, visualTime / this.#video.duration));\n const frozenProgress = Math.max(progressFromFill ?? 0, progressFromTime);\n\n this.#pauseFrozenProgressPercent = frozenProgress;\n this.#pausedVisualProgressTime = frozenProgress * this.#video.duration;\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n this.#setProgressVisual(frozenProgress);\n this.#progressTrack.setAttribute('aria-valuenow', `${this.#pausedVisualProgressTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(this.#pausedVisualProgressTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n #getVisualProgressTime() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime || 0;\n if (this.#isScrubPreviewLocked()) return this.#scrubTargetTime;\n if (this.#pausedVisualProgressTime !== null) return this.#pausedVisualProgressTime;\n if (!this.#isVideoAdvancing()) return this.#video.currentTime || 0;\n\n if (this.#isPlaybackBuffering || !this.#hasInitialProgressSettled || performance.now() < this.#initialProgressEstimateUnlockAt) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n if (this.#player.classList.contains('is-loading') && this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n const elapsed = (performance.now() - this.#visualProgressUpdatedAt) / 1000;\n const estimatedTime = this.#visualProgressTime + elapsed;\n const visualTime = this.#video.loop\n ? estimatedTime % this.#video.duration\n : Math.min(estimatedTime, this.#video.duration);\n\n if (!this.#video.loop && this.#video.currentTime - visualTime > 0.45) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime;\n }\n\n return visualTime;\n }\n\n #setProgressVisual(percent: number) {\n const clampedPercent = Math.min(1, Math.max(0, percent));\n const remainingPercent = (1 - clampedPercent) * 100;\n const { innerWidth } = this.#getProgressMetrics();\n const markerEdgePercent = 1 / innerWidth;\n const markerIsFullyOnFill =\n this.#isScrubbing &&\n this.#hasScrubReturnMarker &&\n this.#scrubReturnPercent + markerEdgePercent < clampedPercent;\n\n this.#player.style.setProperty('--sp-progress-inset', `${remainingPercent}%`);\n this.#player.style.setProperty('--sp-return-marker-base-opacity', markerIsFullyOnFill ? '0' : '1');\n\n if (markerIsFullyOnFill) {\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent);\n const maxHoleLeft = Math.max(0, innerWidth - 2);\n const holeLeft = Math.min(maxHoleLeft, Math.max(0, markerX - 3));\n\n this.#player.style.setProperty('--sp-return-marker-hole-left', `${holeLeft}px`);\n } else {\n this.#player.style.setProperty('--sp-return-marker-hole-left', '-9999px');\n }\n }\n\n #getProgressPercentFromTime(time: number) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return 0;\n\n return Math.min(1, Math.max(0, time / this.#video.duration));\n }\n\n #getProgressMetrics(rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressMetrics(rect);\n }\n\n #getProgressXFromPercent(percent: number, rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressXFromPercent(percent, rect);\n }\n\n #getProgressPercentFromClientX(clientX: number, rect: DOMRect) {\n return getProgressPercentFromClientX(clientX, rect);\n }\n\n #setScrubReturnMarker(time: number) {\n this.#scrubReturnTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#scrubReturnPercent = this.#getProgressPercentFromTime(this.#scrubReturnTime);\n const rect = this.#progressTrack.getBoundingClientRect();\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerIsInTrackBody =\n markerX >= this.#scrubReturnMarkerBodyInset &&\n markerX <= Math.max(this.#scrubReturnMarkerBodyInset, rect.width - this.#scrubReturnMarkerBodyInset);\n\n this.#hasScrubReturnMarker = this.#scrubReturnTime > this.#scrubReturnMarkerMinTime && markerIsInTrackBody;\n this.#player.classList.toggle('has-return-marker', this.#hasScrubReturnMarker);\n this.#player.style.setProperty('--sp-return-marker-left', `${markerX}px`);\n }\n\n #getScrubPoint(clientX: number, rect: DOMRect, percent: number, shouldSnap = this.#isScrubbing) {\n const targetTime = percent * this.#video.duration;\n\n if (!shouldSnap || !this.#hasScrubReturnMarker) {\n return { percent, targetTime };\n }\n\n const markerX = rect.left + this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerDistance = Math.abs(clientX - markerX);\n const isInSnapZone = markerDistance <= this.#scrubSnapDistance;\n\n if (!isInSnapZone) {\n return { percent, targetTime };\n }\n\n return {\n percent: this.#scrubReturnPercent,\n targetTime: this.#scrubReturnTime,\n };\n }\n\n #syncPinnedTimeText(time = this.#getVisualProgressTime()) {\n if (!this.#hasPinnedTime || this.#isProgressHoverPreviewing || this.#isScrubPreviewLocked()) return;\n\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(time);\n this.#syncTrayTimeWidth();\n }\n\n #updateProgress(time = this.#getVisualProgressTime()) {\n const hasDuration = Number.isFinite(this.#video.duration) && this.#video.duration > 0;\n if (hasDuration && this.#pauseFrozenProgressPercent !== null) {\n const frozenTime = this.#pauseFrozenProgressPercent * this.#video.duration;\n this.#lastRenderedProgressTime = frozenTime;\n this.#setProgressVisual(this.#pauseFrozenProgressPercent);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', `${this.#video.duration}`);\n this.#progressTrack.setAttribute('aria-valuenow', `${frozenTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(frozenTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n this.#syncPinnedTimeText(frozenTime);\n return;\n }\n\n const renderedTime = hasDuration ? Math.min(this.#video.duration, Math.max(0, time)) : time;\n const progressValue = hasDuration ? renderedTime / this.#video.duration : 0;\n this.#lastRenderedProgressTime = Number.isFinite(renderedTime) ? Math.max(0, renderedTime) : 0;\n this.#setProgressVisual(progressValue);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', hasDuration ? `${this.#video.duration}` : '0');\n this.#progressTrack.setAttribute('aria-valuenow', hasDuration ? `${renderedTime}` : '0');\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n hasDuration ? `${formatVideoTime(renderedTime)} of ${formatVideoTime(this.#video.duration)}` : 'Loading video',\n );\n this.#syncPinnedTimeText(renderedTime);\n }\n\n #previewSeekFromClientX(clientX: number, shouldSnap = this.#isScrubbing, updateVisual = true) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime;\n\n const rect = this.#progressTrack.getBoundingClientRect();\n const percent = this.#getProgressPercentFromClientX(clientX, rect);\n const scrubPoint = this.#getScrubPoint(clientX, rect, percent, shouldSnap);\n\n if (updateVisual) {\n this.#setProgressVisual(scrubPoint.percent);\n }\n\n if (!this.#hasPinnedTime) {\n this.#player.style.setProperty('--sp-scrub-preview-left', `${this.#getProgressXFromPercent(scrubPoint.percent, rect)}px`);\n }\n\n this.#scrubTimeText.textContent = formatVideoTime(scrubPoint.targetTime);\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(scrubPoint.targetTime);\n this.#syncTrayTimeWidth();\n\n if (updateVisual) {\n this.#progressTrack.setAttribute('aria-valuenow', `${scrubPoint.targetTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(scrubPoint.targetTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n this.#syncControlsCollision();\n return scrubPoint.targetTime;\n }\n\n #clearControlsCollision() {\n this.#hasControlsCollision = false;\n this.#player?.classList.remove('has-controls-collision');\n }\n\n #syncControlsCollision() {\n if ((!this.#isScrubbing && !this.#isProgressHoverPreviewing) || !this.#controlTray || !this.#scrubTime || this.#hasPinnedTime) {\n this.#clearControlsCollision();\n return;\n }\n\n const holderRect = this.#controlTray.getBoundingClientRect();\n const timeRect = this.#scrubTime.getBoundingClientRect();\n const holderIsVisible = holderRect.width > 0 && holderRect.height > 0;\n const margin = this.#hasControlsCollision ? this.#controlsCollisionExitMargin : this.#controlsCollisionEnterMargin;\n const timeTouchesHolder =\n holderIsVisible &&\n timeRect.right >= holderRect.left - margin &&\n timeRect.left <= holderRect.right + margin &&\n timeRect.bottom >= holderRect.top - margin &&\n timeRect.top <= holderRect.bottom + margin;\n\n this.#hasControlsCollision = timeTouchesHolder;\n this.#player.classList.toggle('has-controls-collision', this.#hasControlsCollision);\n }\n\n #stopProgressLoop() {\n if (!this.#progressFrame) return;\n window.cancelAnimationFrame(this.#progressFrame);\n this.#progressFrame = 0;\n }\n\n #startProgressLoop() {\n this.#stopProgressLoop();\n this.#syncVisualProgressClock();\n\n const tick = () => {\n this.#updateProgress(this.#getVisualProgressTime());\n if (this.#isVideoAdvancing()) {\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n };\n\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n\n #syncVideoState() {\n const realIsPlaying = (!this.#video.paused && (!this.#video.ended || this.#video.loop)) || (this.#isScrubbing && this.#scrubWasPlaying);\n const isPlaying = this.#optimisticPlaybackState ? this.#optimisticPlaybackState === 'playing' : realIsPlaying;\n this.#player.classList.toggle('is-playing', isPlaying);\n this.#button.setAttribute('aria-label', isPlaying ? 'Pause video' : 'Play video');\n\n if (this.#isScrubbing) {\n this.#stopProgressLoop();\n return;\n }\n\n if (\n realIsPlaying &&\n this.#player.classList.contains('has-loaded-once') &&\n !this.#player.classList.contains('is-progress-settling')\n ) {\n this.#startProgressLoop();\n } else {\n this.#stopProgressLoop();\n this.#updateProgress();\n }\n }\n\n #clearScrubLongPressTimer() {\n if (!this.#scrubLongPressTimer) return;\n window.clearTimeout(this.#scrubLongPressTimer);\n this.#scrubLongPressTimer = 0;\n }\n\n #detectAudioAvailability() {\n return detectAudioAvailability(this.#video);\n }\n\n #isVolumeAvailable() {\n return this.volumeEnabled && this.#hasCheckedAudioTrack && this.#hasAudioTrack;\n }\n\n #clearVolumeInteractionState() {\n this.#clearVolumeCloseTimer();\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#activeVolumePointerId = null;\n this.#volumeControl.classList.remove('is-volume-open', 'is-control-tap-active');\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n }\n\n #syncAudioControlState = () => {\n if (!this.volumeEnabled) {\n this.#player.classList.remove('is-volume-unavailable', 'is-volume-muted', 'is-volume-sound', 'is-volume-icon-animating');\n this.#clearVolumeInteractionState();\n this.#volumeControl.disabled = true;\n this.#volumeControl.setAttribute('aria-disabled', 'true');\n return;\n }\n\n if (!this.#hasCheckedAudioTrack) {\n const audioAvailability = this.#detectAudioAvailability();\n if (audioAvailability !== 'unknown') {\n this.#hasCheckedAudioTrack = true;\n this.#hasAudioTrack = audioAvailability === 'available';\n } else if (\n this.#video.readyState >= HTMLMediaElement.HAVE_METADATA &&\n !isAudioAvailabilityPending(this.#video)\n ) {\n this.#hasCheckedAudioTrack = true;\n this.#hasAudioTrack = true;\n }\n }\n\n const wasVolumeControlHidden = this.#volumeControl.hidden;\n const hasUsableAudio = this.#isVolumeAvailable();\n const isMuted = !hasUsableAudio || this.#video.muted || this.#video.volume <= 0;\n const visualVolume = hasUsableAudio && !this.#video.muted ? this.#video.volume : 0;\n const volumePercent = Math.round(visualVolume * 100);\n const nextIconState = isMuted ? 'muted' : 'sound';\n\n if (this.#volumeIconState && this.#volumeIconState !== nextIconState) {\n this.#animateVolumeIconSwap();\n }\n\n this.#volumeIconState = nextIconState;\n\n this.#player.classList.toggle('is-volume-unavailable', !hasUsableAudio);\n this.#player.classList.toggle('is-volume-muted', isMuted);\n this.#player.classList.toggle('is-volume-sound', !isMuted);\n this.#player.style.setProperty('--sp-volume-level', `${volumePercent}%`);\n this.#volumeControl.disabled = !hasUsableAudio;\n this.#volumeControl.setAttribute('aria-disabled', `${!hasUsableAudio}`);\n this.#volumeControl.setAttribute(\n 'aria-label',\n !hasUsableAudio ? 'Video has no audio' : isMuted ? 'Unmute video' : 'Mute video',\n );\n this.#volumeTrack.setAttribute('aria-valuenow', `${volumePercent}`);\n this.#volumeTrack.setAttribute('aria-valuetext', `${volumePercent}%`);\n\n if (!hasUsableAudio) {\n this.#clearVolumeInteractionState();\n }\n\n if (wasVolumeControlHidden === hasUsableAudio) {\n this.#syncOptionalControls();\n }\n };\n\n #setVolumeFromClientY(clientY: number) {\n if (!this.#isVolumeAvailable()) return;\n const rect = this.#volumeTrack.getBoundingClientRect();\n const percent = Math.min(1, Math.max(0, 1 - ((clientY - rect.top) / rect.height)));\n const rounded = Math.round(percent * 100) / 100;\n this.#video.volume = rounded;\n this.#video.muted = rounded <= 0;\n this.#syncAudioControlState();\n }\n\n #releaseVolumePointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#volumeTrack.hasPointerCapture(pointerId)) {\n this.#volumeTrack.releasePointerCapture(pointerId);\n }\n }\n\n #finishVolumeScrub(pointerId: number | null) {\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#volumeTrack.blur();\n this.#releaseVolumePointer(pointerId);\n this.#scheduleVolumePopoverClose(260);\n }\n\n #syncPictureInPictureState = () => {\n const isActive = document.pictureInPictureElement === this.#video;\n const video = this.#video as HTMLVideoElement & { requestPictureInPicture?: () => Promise<PictureInPictureWindow> };\n const isSupported = Boolean(this.pictureInPictureEnabled && document.pictureInPictureEnabled && video.requestPictureInPicture);\n this.#player.classList.toggle('is-picture-in-picture', isActive);\n this.#pictureInPictureControl.disabled = !isSupported;\n this.#pictureInPictureControl.setAttribute('aria-label', isActive ? 'Exit picture in picture' : 'Enter picture in picture');\n };\n\n #getFullscreenElement() {\n return getFullscreenElement(this.#root);\n }\n\n #isFullscreenSupported() {\n return isFullscreenSupported(this.fullscreenEnabled, this.#player, this.#video);\n }\n\n #requestPlayerFullscreen() {\n return requestPlayerFullscreen(this.#player);\n }\n\n #requestVideoFullscreen() {\n requestVideoFullscreen(this.#video);\n }\n\n #exitFullscreen() {\n return exitFullscreen();\n }\n\n #syncFullscreenState = () => {\n const fullscreenElement = this.#getFullscreenElement();\n const isActive = fullscreenElement === this.#player || fullscreenElement === this;\n const isSupported = this.#isFullscreenSupported();\n this.#player.classList.toggle('is-fullscreen', isActive);\n this.#fullscreenControl.disabled = !isSupported;\n this.#fullscreenControl.setAttribute('aria-label', isActive ? 'Exit fullscreen' : 'Enter fullscreen');\n return isActive;\n };\n\n #handleFullscreenChange = () => {\n const isFullscreenActive = this.#syncFullscreenState();\n this.#resetFullscreenPointerState(isFullscreenActive);\n };\n\n #resetFullscreenPointerState(isFullscreenActive: boolean) {\n this.#clearControlsHideTimer();\n this.#clearVolumeCloseTimer();\n this.#releaseScrubPointer(this.#activeScrubPointerId);\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#isPointerOverControlSurface = false;\n this.#isVolumeHovering = false;\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#clearControlTapTimer();\n this.#clearControlTapActive();\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.#volumeControl.classList.remove('is-volume-open');\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#player.classList.remove('is-scrubbing');\n this.#player.classList.remove('is-pointer-active');\n\n const activeElement = this.#root.activeElement;\n if (activeElement instanceof HTMLElement) {\n activeElement.blur();\n }\n\n if (isFullscreenActive) {\n this.#syncPointerControlsFromLastPosition();\n } else {\n this.#hidePointerControls();\n }\n }\n\n #enterScrubMode = () => {\n if (!this.#isTrackingScrub || this.#isScrubbing) return;\n\n this.#clearPausedVisualProgress();\n this.#clearControlsHideTimer();\n this.#clearScrubLongPressTimer();\n this.#isScrubbing = true;\n this.#player.classList.add('is-scrubbing');\n this.#scrubTargetTime = this.#previewSeekFromClientX(this.#scrubStartX, true);\n if (this.#scrubWasPlaying) this.#video.pause();\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n this.#updateProgress(this.#scrubTargetTime);\n this.#stopProgressLoop();\n this.#syncVideoState();\n };\n\n #releaseScrubPointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#progressTrack.hasPointerCapture(pointerId)) {\n this.#progressTrack.releasePointerCapture(pointerId);\n }\n }\n\n async #finishScrub(clientX: number | null, pointerId: number | null, shouldCommit: boolean) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n const wasDragging = this.#isScrubbing;\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n\n if (shouldCommit && clientX !== null) {\n this.#clearPausedVisualProgress();\n this.#scrubTargetTime = this.#previewSeekFromClientX(clientX, wasDragging);\n this.#isCommittedScrubPending = true;\n this.#committedScrubWasPlaying = this.#scrubWasPlaying;\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n }\n\n this.#updateProgress(this.#scrubTargetTime);\n\n if (wasDragging && this.#scrubWasPlaying) {\n await this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #cancelScrub(pointerId: number | null) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n this.#syncVisualProgressClock();\n this.#updateProgress();\n\n if (this.#scrubWasPlaying) {\n void this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #formatTimeForDisplay(time: number) {\n if (!this.#showRemainingTime) return formatVideoTime(time);\n const duration = Number.isFinite(this.#video.duration) ? this.#video.duration : 0;\n if (duration <= 0) return formatVideoTime(time);\n return `-${formatVideoTime(Math.max(0, duration - time))}`;\n }\n\n #clearTimeAnimationTimer() {\n if (!this.#timeAnimationTimer) return;\n window.clearTimeout(this.#timeAnimationTimer);\n this.#timeAnimationTimer = 0;\n }\n\n #animateTimeSwap() {\n this.#clearTimeAnimationTimer();\n this.#trayTimeText.classList.remove('is-time-animating');\n void this.#trayTimeText.offsetWidth;\n this.#trayTimeText.classList.add('is-time-animating');\n this.#timeAnimationTimer = window.setTimeout(() => {\n this.#timeAnimationTimer = 0;\n this.#trayTimeText.classList.remove('is-time-animating');\n }, 240);\n }\n\n #handleTimeToggleClick = (event: Event) => {\n event.stopPropagation();\n this.#showRemainingTime = !this.#showRemainingTime;\n this.#animateTimeSwap();\n if (this.#isScrubPreviewLocked() || this.#isProgressHoverPreviewing) {\n if (this.#trayTimeText) {\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(this.#scrubTargetTime);\n this.#syncTrayTimeWidth();\n }\n } else {\n this.#syncPinnedTimeText(this.#getVisualProgressTime());\n }\n };\n\n #handleButtonClick = async () => {\n if (performance.now() < this.#suppressTouchButtonClickUntil) {\n return;\n }\n\n const shouldPlay = this.#optimisticPlaybackState\n ? this.#optimisticPlaybackState !== 'playing'\n : this.#video.paused || this.#video.ended;\n const shouldFlipImmediately = !shouldPlay || this.#canStartImmediately();\n\n this.#showTouchControls();\n\n if (shouldFlipImmediately) {\n this.#optimisticPlaybackState = shouldPlay ? 'playing' : 'paused';\n this.#syncVideoState();\n }\n\n if (shouldPlay) {\n this.#clearPausedVisualProgress();\n await this.#hydrateVideoSource();\n await this.#video.play().catch(() => {\n this.#optimisticPlaybackState = null;\n });\n } else {\n this.#freezeRenderedProgressForPause();\n this.#video.pause();\n }\n\n this.#syncVideoState();\n this.#scheduleTouchControlsHide();\n };\n\n #handlePlayerPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n\n const buttonRect = this.#button.getBoundingClientRect();\n const isInsideButton =\n event.clientX >= buttonRect.left &&\n event.clientX <= buttonRect.right &&\n event.clientY >= buttonRect.top &&\n event.clientY <= buttonRect.bottom;\n const controlTrayRect = this.#controlTray.getBoundingClientRect();\n const isInsideControlTray =\n event.clientX >= controlTrayRect.left &&\n event.clientX <= controlTrayRect.right &&\n event.clientY >= controlTrayRect.top &&\n event.clientY <= controlTrayRect.bottom;\n const progressRect = this.#progressTrack.getBoundingClientRect();\n const isInsideProgress =\n event.clientX >= progressRect.left &&\n event.clientX <= progressRect.right &&\n event.clientY >= progressRect.top &&\n event.clientY <= progressRect.bottom;\n const didRevealControls = this.#showTouchControls();\n\n if (didRevealControls && isInsideButton) {\n this.#suppressTouchButtonClickUntil = performance.now() + 260;\n }\n\n if (didRevealControls && (isInsideControlTray || isInsideProgress)) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n\n void this.#hydrateVideoSource();\n };\n\n #preventVolumeTrackClick = (event: Event) => {\n event.stopPropagation();\n };\n\n #clearVolumeCloseTimer() {\n if (!this.#volumeCloseTimer) return;\n window.clearTimeout(this.#volumeCloseTimer);\n this.#volumeCloseTimer = 0;\n }\n\n #openVolumePopover() {\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#clearVolumeCloseTimer();\n this.#volumeControl.classList.add('is-volume-open');\n }\n\n #closeVolumePopover = () => {\n this.#volumeCloseTimer = 0;\n if (this.#isVolumeHovering || this.#isVolumeScrubbing) return;\n this.#volumeControl.classList.remove('is-volume-open');\n };\n\n #scheduleVolumePopoverClose(delay = 150) {\n this.#clearVolumeCloseTimer();\n this.#volumeCloseTimer = window.setTimeout(this.#closeVolumePopover, delay);\n }\n\n #handleVolumePointerEnter = () => {\n if (this.#isTouchControls()) return;\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#isVolumeHovering = true;\n this.#openVolumePopover();\n };\n\n #handleVolumePointerLeave = () => {\n if (this.#isTouchControls()) return;\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#isVolumeHovering = false;\n this.#scheduleVolumePopoverClose();\n };\n\n #handleVolumeControlClick = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!this.#isVolumeAvailable()) {\n this.#clearVolumeInteractionState();\n return;\n }\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n this.#closeVolumePopover();\n if (this.#video.muted || this.#video.volume <= 0) {\n if (this.#video.volume <= 0) this.#video.volume = 0.7;\n this.#video.muted = false;\n } else {\n this.#video.muted = true;\n }\n\n this.#syncAudioControlState();\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled || this.#isTouchControls()) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#openVolumePopover();\n this.#isVolumeScrubbing = true;\n this.#activeVolumePointerId = event.pointerId;\n this.#volumePopover.classList.add('is-scrubbing-volume');\n this.#volumeTrack.setPointerCapture(event.pointerId);\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isVolumeScrubbing) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.preventDefault();\n event.stopPropagation();\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n };\n\n #handleVolumeKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (!this.#isVolumeAvailable()) {\n event.preventDefault();\n event.stopPropagation();\n this.#clearVolumeInteractionState();\n return;\n }\n if (!['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n const step = event.shiftKey ? 0.1 : 0.05;\n const nextVolume =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? 1\n : this.#video.volume + (event.key === 'ArrowUp' ? step : -step);\n this.#video.volume = Math.min(1, Math.max(0, nextVolume));\n this.#video.muted = this.#video.volume <= 0;\n this.#syncAudioControlState();\n };\n\n #handlePictureInPictureClick = async () => {\n const video = this.#video as HTMLVideoElement & {\n requestPictureInPicture?: () => Promise<PictureInPictureWindow>;\n };\n\n if (!this.pictureInPictureEnabled || !document.pictureInPictureEnabled || !video.requestPictureInPicture) return;\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n\n try {\n await this.#hydrateVideoSource();\n if (document.pictureInPictureElement === this.#video) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch {\n // Picture-in-Picture can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncPictureInPictureState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleFullscreenClick = async (event: Event) => {\n if (!this.#isFullscreenSupported()) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#trackPointerPosition(event);\n this.#showTouchControls();\n\n try {\n const fullscreenElement = this.#getFullscreenElement();\n if (fullscreenElement === this.#player || fullscreenElement === this) {\n await this.#exitFullscreen();\n } else {\n await this.#hydrateVideoSource();\n if (canRequestPlayerFullscreen(this.#player)) {\n await this.#requestPlayerFullscreen();\n } else {\n this.#requestVideoFullscreen();\n }\n }\n } catch {\n // Fullscreen can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncFullscreenState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleProgressPointerEnter = (event: Event) => {\n if (this.#isTouchControls() || this.#isScrubPreviewLocked()) return;\n if (!(event instanceof PointerEvent) && !(event instanceof MouseEvent)) return;\n\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n };\n\n #handleProgressPointerLeave = () => {\n if (this.#isScrubPreviewLocked()) return;\n\n this.#clearProgressHoverPreview();\n };\n\n #handleProgressPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n event.preventDefault();\n\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) {\n this.#showTouchControls();\n if (this.#isTouchControls()) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n return;\n }\n\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#finishInitialProgressSettle();\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#setScrubReturnMarker(this.#getVisualProgressTime());\n this.#isTrackingScrub = true;\n this.#activeScrubPointerId = event.pointerId;\n this.#scrubStartX = event.clientX;\n this.#scrubWasPlaying = !this.#video.paused && !this.#video.ended;\n this.#progressTrack.setPointerCapture(event.pointerId);\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX, false);\n this.#clearScrubLongPressTimer();\n this.#scrubLongPressTimer = window.setTimeout(this.#enterScrubMode, this.#scrubLongPressDelay);\n };\n\n #handleProgressKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.#handleControlSurfaceFocusIn();\n\n const baseTime = this.#getVisualProgressTime();\n const smallStep = event.shiftKey ? 10 : 5;\n const largeStep = Math.max(10, this.#video.duration * 0.1);\n const nextTime =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? this.#video.duration\n : event.key === 'PageUp'\n ? baseTime + largeStep\n : event.key === 'PageDown'\n ? baseTime - largeStep\n : baseTime + (event.key === 'ArrowRight' ? smallStep : -smallStep);\n\n this.#video.currentTime = Math.min(this.#video.duration, Math.max(0, nextTime));\n this.#syncVisualProgressClock(this.#video.currentTime);\n this.#updateProgress(this.#video.currentTime);\n };\n\n #handleProgressPointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isTrackingScrub) {\n if (!this.#isTouchControls()) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n }\n return;\n }\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n\n if (!this.#isScrubbing && Math.abs(event.clientX - this.#scrubStartX) >= this.#scrubDragThreshold) {\n this.#enterScrubMode();\n }\n\n if (!this.#isScrubbing) return;\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX);\n };\n\n #handleProgressPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleProgressPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleDocumentPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleDocumentPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleWindowBlur = () => {\n this.#finishVolumeScrub(this.#activeVolumePointerId);\n this.#cancelScrub(this.#activeScrubPointerId);\n };\n\n #handleWindowFocus = () => {\n if (this.#getFullscreenElement()) return;\n this.#hidePointerControls();\n };\n\n #handleVideoPlay = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoPause = () => {\n this.#optimisticPlaybackState = null;\n if (!this.#isScrubPreviewLocked()) this.#holdPausedVisualProgress();\n this.#syncVideoLoading();\n this.#syncVideoState();\n };\n\n #handleVideoEnded = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoLoadStart = () => {\n this.#setVideoLoading(true, true);\n };\n\n #handleVideoWaiting = () => {\n this.#setVideoLoading(true);\n };\n\n #handleVideoLoadedMetadata = () => {\n this.#clearPausedVisualProgress();\n this.#syncAudioControlState();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoLoading();\n this.#updateProgress();\n };\n\n #handleVideoPlaying = () => {\n const isReady = this.#markVideoReady();\n this.#syncAudioControlState();\n if (isReady && !this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoSeeked = () => {\n this.#clearPausedVisualProgress();\n this.#syncVideoLoading();\n if (\n this.#isCommittedScrubPending &&\n (!this.#committedScrubWasPlaying || this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA)\n ) {\n this.#clearCommittedScrubPreview();\n this.#syncVideoState();\n return;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n };\n\n #handleVideoError = () => {\n this.#optimisticPlaybackState = null;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#setVideoLoading(true, true);\n this.#syncVideoState();\n this.#retryVideoLoad();\n };\n\n #handleVideoTimeUpdate = () => {\n this.#syncAudioControlState();\n this.#updateProgress();\n };\n\n #handleVideoVolumeChange = () => {\n this.#syncAudioControlState();\n };\n\n #isTouchControls() {\n return (\n window.matchMedia('(max-width: 768px)').matches &&\n window.matchMedia('(hover: none), (pointer: coarse)').matches\n );\n }\n\n #resetSource() {\n if (!this.#video) return;\n this.#observer?.disconnect();\n this.#observer = null;\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#videoSourceLoaded = false;\n this.#videoLoadAttempt = 0;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#hasInitialProgressSettled = false;\n this.#lastRenderedProgressTime = 0;\n this.#clearPausedVisualProgress();\n this.#hasAudioTrack = false;\n this.#hasCheckedAudioTrack = false;\n this.#clearVolumeInteractionState();\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#optimisticPlaybackState = null;\n this.#player.classList.remove('has-loaded-once', 'has-visible-frame', 'is-progress-settling');\n this.#video.dataset.src = this.src;\n this.#video.pause();\n this.#video.removeAttribute('src');\n this.#video.preload = 'none';\n this.#syncAutoplayState();\n this.#video.load();\n this.#setProgressVisual(0);\n this.#syncAudioControlState();\n this.#syncVideoLoading();\n this.#syncVideoState();\n }\n}\n","import { SimplePlayer } from './player/simple-player-element';\n\nexport { SimplePlayer } from './player/simple-player-element';\n\nif (!customElements.get('simple-player')) {\n customElements.define('simple-player', SimplePlayer);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'simple-player': SimplePlayer;\n }\n}\n"],"names":["DEFAULT_ASPECT_RATIO","DEFAULT_PRELOAD_MARGIN","OBSERVED_ATTRIBUTES","getFullscreenElement","root","fullscreenDocument","isFullscreenSupported","fullscreenEnabled","player","video","fullscreenPlayer","fullscreenVideo","canFullscreenPlayer","canFullscreenVideo","requestPlayerFullscreen","requestFullscreen","canRequestPlayerFullscreen","requestVideoFullscreen","exitFullscreen","formatVideoTime","time","totalSeconds","seconds","totalMinutes","minutes","hours","detectAudioAvailability","audioTrackVideo","firefoxVideo","streamVideo","captureStream","webkitVideo","isAudioAvailabilityPending","getProgressMetrics","rect","sideInset","innerWidth","getProgressXFromPercent","percent","clampedPercent","getProgressPercentFromClientX","clientX","styles","template","SimplePlayer","#root","#cleanup","#observer","#initialized","#videoSourceLoaded","#player","#video","#button","#progressTrack","#controlTray","#controlTraySlots","#trayTime","#trayTimeText","#scrubTime","#scrubTimeText","#volumeControl","#volumePopover","#volumeTrack","#pictureInPictureControl","#fullscreenControl","#controlButtons","#progressFrame","#isScrubbing","#isTrackingScrub","#scrubWasPlaying","#scrubTargetTime","#scrubReturnTime","#scrubReturnPercent","#hasScrubReturnMarker","#isCommittedScrubPending","#committedScrubWasPlaying","#scrubStartX","#scrubLongPressTimer","#activeScrubPointerId","#optimisticPlaybackState","#videoLoadAttempt","#videoRetryTimer","#controlsHideTimer","#loadingStateTimer","#initialProgressSettleTimer","#suppressTouchButtonClickUntil","#suppressTouchControlClickUntil","#timeWidthObserver","#hasDecodedFirstFrame","#hasPresentedFirstFrame","#firstFrameRequestPending","#firstFramePresentationPending","#firstFrameRequestToken","#firstFrameFallbackTimer","#hasInitialProgressSettled","#initialProgressEstimateUnlockAt","#isPlaybackBuffering","#visualProgressTime","#visualProgressUpdatedAt","#lastRenderedProgressTime","#pausedVisualProgressTime","#pauseFrozenProgressPercent","#hasControlsCollision","#isProgressHoverPreviewing","#hasAudioTrack","#hasCheckedAudioTrack","#isPointerOverControlSurface","#lastPointerClientX","#lastPointerClientY","#lastPointerWasTouch","#isVolumeScrubbing","#isVolumeHovering","#activeVolumePointerId","#volumeCloseTimer","#volumeIconAnimationTimer","#controlTapTimer","#volumeIconState","#showRemainingTime","#timeAnimationTimer","#scrubDragThreshold","#scrubSnapDistance","#scrubReturnMarkerBodyInset","#scrubReturnMarkerMinTime","#scrubLongPressDelay","#controlsAutoHideDelay","#pointerControlsIdleDelay","#loadingStateDelay","#initialProgressSettleDelay","#initialProgressEstimateHold","#videoRetryDelay","#maxVideoLoadAttempts","#bufferedAheadTarget","#bufferedRangeFuzz","#controlsCollisionEnterMargin","#controlsCollisionExitMargin","value","#setStringAttribute","#setOptionalControlAttributes","#syncAspectRatio","#bindEvents","#syncAutoplayState","#setupLazyLoading","#syncOptionalControls","#syncTimeVisibility","#syncVideoLoading","#syncAudioControlState","#syncPictureInPictureState","#syncFullscreenState","#syncVideoState","cleanup","#clearControlsHideTimer","#clearLoadingStateTimer","#clearVideoRetryTimer","#clearInitialProgressSettleTimer","#clearScrubLongPressTimer","#clearFirstFrameFallbackTimer","#clearVolumeCloseTimer","#clearVolumeIconAnimationTimer","#clearControlTapTimer","#clearControlsCollision","button","#stopProgressLoop","name","oldValue","newValue","#resetSource","enabled","isEnabled","hasVolumeControl","#isVolumeAvailable","controls","index","control","#closeVolumePopover","#releaseVolumePointer","#hasPinnedTime","#syncPinnedTimeText","#listen","#handleButtonClick","#handlePlayerPointerEnter","#handlePlayerPointerMove","#handlePlayerPointerLeave","#handleControlSurfacePointerEnter","#handleControlSurfacePointerLeave","#handleProgressPointerEnter","#handleProgressPointerLeave","#handleControlSurfaceFocusIn","#handleControlSurfaceFocusOut","#handlePlayerPointerDown","#preventNativeVideoAction","#handleProgressPointerDown","#handleProgressPointerMove","#handleProgressPointerUp","#handleProgressPointerCancel","#handleProgressKeyDown","#handleVolumePointerEnter","#handleVolumePointerLeave","#handleVolumeControlClick","#handleVolumePointerDown","#handleVolumePointerMove","#handleVolumePointerUp","#handleVolumePointerCancel","#preventVolumeTrackClick","#handleVolumeKeyDown","#handlePictureInPictureClick","#handleFullscreenClick","#handleTimeToggleClick","#handleControlButtonPointerEnter","#handleControlButtonPointerDown","#syncTrayTimeWidth","#handleDocumentPointerUp","#handleDocumentPointerCancel","#handleDocumentPointerMove","#handleFullscreenChange","#handleWindowBlur","#handleWindowFocus","#handleVideoPlay","#handleVideoPause","#handleVideoEnded","#handleVideoLoadStart","#handleVideoWaiting","#markVideoReady","#handleVideoLoadedMetadata","#handleVideoPlaying","#handleVideoSeeked","#handleVideoError","#handleVideoTimeUpdate","#handleVideoVolumeChange","width","target","type","listener","entries","observer","entry","#hydrateVideoSource","event","#hideControls","#isTouchControls","#scheduleControlsHide","delay","#scheduleTouchControlsHide","#showTouchControls","wasVisible","#showPointerControls","forcePointer","#hidePointerControls","#trackPointerPosition","#isPointInsidePlayer","clientY","#isPointInsideElement","element","#clearProgressHoverPreview","#syncHoverTargetsFromPointer","#isScrubPreviewLocked","#previewSeekFromClientX","hoveredControl","#isUnavailableControlButton","#areControlsVisible","#shouldSuppressControlAction","#syncPointerControlsFromLastPosition","#clearControlTapActive","#animateVolumeIconSwap","#finishInitialProgressSettle","#syncVisualProgressClock","#updateProgress","#queueInitialProgressSettle","#setProgressVisual","source","#isLoopBoundaryBlip","#getBufferedAhead","currentTime","start","end","#hasBufferedAhead","remainingDuration","requiredBuffer","#setVideoLoading","isLoading","immediate","shouldLoad","shouldShowLoading","#canStartImmediately","#retryVideoLoad","#clearCommittedScrubPreview","#commitVideoReady","#requestFirstVideoFrame","requestToken","confirmFirstFrame","isReady","#isVideoAdvancing","#clearPausedVisualProgress","#holdPausedVisualProgress","renderedTime","#freezeRenderedProgressForPause","rawInset","inset","progressFromFill","visualTime","#getVisualProgressTime","progressFromTime","frozenProgress","elapsed","estimatedTime","remainingPercent","#getProgressMetrics","markerEdgePercent","markerIsFullyOnFill","markerX","#getProgressXFromPercent","maxHoleLeft","holeLeft","#getProgressPercentFromTime","#getProgressPercentFromClientX","#setScrubReturnMarker","markerIsInTrackBody","#getScrubPoint","shouldSnap","targetTime","#formatTimeForDisplay","hasDuration","frozenTime","progressValue","updateVisual","scrubPoint","#syncControlsCollision","holderRect","timeRect","holderIsVisible","margin","timeTouchesHolder","#startProgressLoop","tick","realIsPlaying","isPlaying","#detectAudioAvailability","#clearVolumeInteractionState","audioAvailability","wasVolumeControlHidden","hasUsableAudio","isMuted","visualVolume","volumePercent","nextIconState","#setVolumeFromClientY","rounded","pointerId","#finishVolumeScrub","#scheduleVolumePopoverClose","isActive","isSupported","#getFullscreenElement","#isFullscreenSupported","#requestPlayerFullscreen","#requestVideoFullscreen","#exitFullscreen","fullscreenElement","isFullscreenActive","#resetFullscreenPointerState","#releaseScrubPointer","activeElement","#enterScrubMode","#finishScrub","shouldCommit","wasDragging","#cancelScrub","duration","#clearTimeAnimationTimer","#animateTimeSwap","shouldPlay","shouldFlipImmediately","buttonRect","isInsideButton","controlTrayRect","isInsideControlTray","progressRect","isInsideProgress","didRevealControls","#openVolumePopover","step","nextVolume","baseTime","smallStep","largeStep","nextTime"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
1
+ {"version":3,"file":"simple-player.js","sources":["../src/player/constants.ts","../src/player/fullscreen.ts","../src/player/media.ts","../src/player/progress.ts","../src/player/styles.ts","../src/player/template.ts","../src/player/simple-player-element.ts","../src/simple-player.ts"],"sourcesContent":["export const DEFAULT_ASPECT_RATIO = '16 / 9';\nexport const DEFAULT_PRELOAD_MARGIN = '360px 0px';\n\nexport const OBSERVED_ATTRIBUTES = [\n 'src',\n 'aspect-ratio',\n 'preload-margin',\n 'controls',\n 'disable-autoplay',\n 'enable-volume',\n 'disable-volume',\n 'disable-volume-slider',\n 'enable-picture-in-picture',\n 'disable-picture-in-picture',\n 'enable-fullscreen',\n 'disable-fullscreen',\n 'show-time',\n 'no-autoplay',\n 'no-volume',\n 'no-volume-slider',\n 'no-picture-in-picture',\n 'no-fullscreen',\n] as const;\n","import type { FullscreenDocument, FullscreenPlayer, FullscreenVideo } from './types';\n\nexport function getFullscreenElement(root: ShadowRoot): Element | null {\n const fullscreenDocument = document as FullscreenDocument;\n\n return (\n root.fullscreenElement ||\n document.fullscreenElement ||\n fullscreenDocument.webkitFullscreenElement ||\n fullscreenDocument.mozFullScreenElement ||\n fullscreenDocument.msFullscreenElement ||\n null\n );\n}\n\nexport function isFullscreenSupported(\n fullscreenEnabled: boolean,\n player: HTMLElement,\n video: HTMLVideoElement,\n): boolean {\n const fullscreenDocument = document as FullscreenDocument;\n const fullscreenPlayer = player as FullscreenPlayer;\n const fullscreenVideo = video as FullscreenVideo;\n const canFullscreenPlayer = !!(\n (\n document.fullscreenEnabled ??\n fullscreenDocument.webkitFullscreenEnabled ??\n fullscreenDocument.mozFullScreenEnabled ??\n fullscreenDocument.msFullscreenEnabled ??\n false\n ) &&\n (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n )\n );\n const canFullscreenVideo = !!(\n fullscreenVideo.webkitSupportsFullscreen ||\n fullscreenVideo.webkitEnterFullscreen ||\n fullscreenVideo.webkitEnterFullScreen\n );\n\n return !!(fullscreenEnabled && (canFullscreenPlayer || canFullscreenVideo));\n}\n\nexport function requestPlayerFullscreen(player: HTMLElement): Promise<void> {\n const fullscreenPlayer = player as FullscreenPlayer;\n const requestFullscreen = (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n );\n\n return Promise.resolve(requestFullscreen?.call(fullscreenPlayer));\n}\n\nexport function canRequestPlayerFullscreen(player: HTMLElement): boolean {\n const fullscreenPlayer = player as FullscreenPlayer;\n\n return (\n typeof fullscreenPlayer.requestFullscreen === 'function' ||\n typeof fullscreenPlayer.webkitRequestFullscreen === 'function' ||\n typeof fullscreenPlayer.mozRequestFullScreen === 'function' ||\n typeof fullscreenPlayer.msRequestFullscreen === 'function'\n );\n}\n\nexport function requestVideoFullscreen(video: HTMLVideoElement): void {\n const fullscreenVideo = video as FullscreenVideo;\n const requestFullscreen = fullscreenVideo.webkitEnterFullscreen || fullscreenVideo.webkitEnterFullScreen;\n\n requestFullscreen?.call(fullscreenVideo);\n}\n\nexport function exitFullscreen(): Promise<void> {\n const fullscreenDocument = document as FullscreenDocument;\n const exitFullscreen = (\n document.exitFullscreen ||\n fullscreenDocument.webkitExitFullscreen ||\n fullscreenDocument.mozCancelFullScreen ||\n fullscreenDocument.msExitFullscreen\n );\n\n return Promise.resolve(exitFullscreen?.call(fullscreenDocument));\n}\n","export function formatVideoTime(time: number): string {\n if (!Number.isFinite(time) || time < 0) return '0:00';\n\n const totalSeconds = Math.floor(time);\n const seconds = totalSeconds % 60;\n const totalMinutes = Math.floor(totalSeconds / 60);\n const minutes = totalMinutes % 60;\n const hours = Math.floor(totalMinutes / 60);\n\n if (hours > 0) {\n return hours + ':' + String(minutes).padStart(2, '0') + ':' + String(seconds).padStart(2, '0');\n }\n\n return minutes + ':' + String(seconds).padStart(2, '0');\n}\n\nexport type AudioAvailability = 'available' | 'unavailable' | 'unknown';\n\nexport function detectAudioAvailability(video: HTMLVideoElement): AudioAvailability {\n const audioTrackVideo = video as HTMLVideoElement & { audioTracks?: { length: number } };\n if (audioTrackVideo.audioTracks && typeof audioTrackVideo.audioTracks.length === 'number') {\n if (audioTrackVideo.audioTracks.length > 0) return 'available';\n if (video.readyState >= HTMLMediaElement.HAVE_METADATA) return 'unavailable';\n }\n\n const firefoxVideo = video as HTMLVideoElement & { mozHasAudio?: boolean };\n if (typeof firefoxVideo.mozHasAudio === 'boolean') {\n return firefoxVideo.mozHasAudio ? 'available' : 'unavailable';\n }\n\n const streamVideo = video as HTMLVideoElement & {\n captureStream?: () => MediaStream;\n mozCaptureStream?: () => MediaStream;\n };\n const captureStream = streamVideo.captureStream ?? streamVideo.mozCaptureStream;\n if (captureStream && video.readyState >= HTMLMediaElement.HAVE_METADATA) {\n try {\n return captureStream.call(video).getAudioTracks().length > 0 ? 'available' : 'unavailable';\n } catch {\n // Cross-origin media can block captureStream; keep probing with other browser hints.\n }\n }\n\n const webkitVideo = video as HTMLVideoElement & { webkitAudioDecodedByteCount?: number };\n if (\n typeof webkitVideo.webkitAudioDecodedByteCount === 'number' &&\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.currentTime > 0.25\n ) {\n return webkitVideo.webkitAudioDecodedByteCount > 0 ? 'available' : 'unavailable';\n }\n\n return 'unknown';\n}\n\nexport function isAudioAvailabilityPending(video: HTMLVideoElement): boolean {\n const webkitVideo = video as HTMLVideoElement & { webkitAudioDecodedByteCount?: number };\n return (\n typeof webkitVideo.webkitAudioDecodedByteCount === 'number' &&\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.currentTime <= 0.25\n );\n}\n","import type { ProgressMetrics } from './types';\n\nexport function getProgressMetrics(rect: DOMRect): ProgressMetrics {\n const sideInset = Math.min(2, Math.max(0, rect.width / 2));\n const innerWidth = Math.max(1, rect.width - (sideInset * 2));\n\n return { rect, sideInset, innerWidth };\n}\n\nexport function getProgressXFromPercent(percent: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n const clampedPercent = Math.min(1, Math.max(0, percent));\n\n return sideInset + (clampedPercent * innerWidth);\n}\n\nexport function getProgressPercentFromClientX(clientX: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n\n return Math.min(1, Math.max(0, (clientX - rect.left - sideInset) / innerWidth));\n}\n","import { DEFAULT_ASPECT_RATIO } from './constants';\n\nexport const styles: string = `\n :host {\n --simple-player-aspect-ratio: ${DEFAULT_ASPECT_RATIO};\n --space: 4px;\n --white: #fff;\n --black: #000;\n --white-rgb: 255 255 255;\n --overlay-soft: rgb(0 0 0 / 0.42);\n --overlay-blur: 0px;\n --sp-glass-surface: rgb(255 255 255 / 0.04);\n --sp-glass-opacity: 0.28;\n --sp-control-glass-surface: rgb(255 255 255 / 0.12);\n --sp-control-glass-opacity: 0.62;\n --sp-control-hover-surface: rgb(255 255 255 / 0.14);\n --sp-glass-filter: invert(1) grayscale(1);\n --sp-shimmer-highlight: rgb(255 255 255 / 0.42);\n --sp-control-tray-display: block;\n --sp-enabled-controls-count: 3;\n --sp-control-tray-width: 0px;\n --sp-control-tray-expanded-width: calc((var(--sp-control-slot-size) * var(--sp-enabled-controls-count)) + (var(--sp-control-tray-padding) * 2));\n --sp-control-tray-gap: 0px;\n --sp-control-icon-size: 20px;\n --sp-control-icon-render-size: 20px;\n --sp-control-icon-opacity: 0.82;\n --sp-control-icon-hidden-opacity: 0;\n --sp-control-icon-hidden-transform: translateY(2px) scale(0.84);\n --sp-control-icon-hover-opacity: 0.96;\n --sp-control-icon-stroke-width: 1.6;\n --sp-control-icon-delay-1: 30ms;\n --sp-control-icon-delay-2: 55ms;\n --sp-control-icon-delay-3: 80ms;\n --sp-control-hover-opacity: 1;\n --sp-control-slot-hover-surface: transparent;\n --sp-control-tray-padding: 2px;\n --sp-control-slot-size: calc(var(--sp-control-icon-size) + 4px);\n --sp-touch-control-hover-offset: -9999px;\n --sp-volume-level: 100%;\n\n position: relative;\n display: block;\n width: 100%;\n aspect-ratio: var(--simple-player-aspect-ratio);\n isolation: isolate;\n overflow: hidden;\n contain: paint;\n background: #1E1E1E;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n .sp-video {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n object-fit: cover;\n }\n\n .sp-asset {\n pointer-events: none;\n opacity: 0;\n transition: opacity 160ms ease;\n user-select: none;\n -webkit-user-select: none;\n -webkit-user-drag: none;\n -webkit-touch-callout: none;\n }\n\n .sp-player.has-visible-frame .sp-asset {\n opacity: 1;\n }\n\n .sp-player {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n min-width: 100%;\n min-height: 100%;\n overflow: hidden;\n --sp-progress-inset: 100%;\n --sp-hover-fill-inset: 100%;\n --sp-scrub-preview-left: 0px;\n --sp-return-marker-left: 0px;\n --sp-return-marker-base-opacity: 1;\n --sp-return-marker-hole-left: -9999px;\n user-select: none;\n -webkit-user-select: none;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: transparent;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-player:fullscreen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-player:-webkit-full-screen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background-color: var(--overlay-soft);\n backdrop-filter: blur(var(--overlay-blur));\n -webkit-backdrop-filter: blur(var(--overlay-blur));\n opacity: 0;\n transition: opacity 260ms ease;\n transform: translateZ(0);\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-controls-visible .sp-overlay,\n :host(:hover) .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay {\n opacity: 0;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 3;\n display: grid;\n place-items: center;\n width: 60px;\n height: 60px;\n padding: 0;\n border: 0;\n border-radius: 0;\n color: var(--white);\n background: transparent;\n cursor: pointer;\n opacity: 0;\n pointer-events: none;\n transform: translate(-50%, -50%) scale(0.96);\n transition: opacity 260ms ease, transform 260ms cubic-bezier(0.23, 1, 0.32, 1);\n -webkit-tap-highlight-color: transparent;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-controls-visible .sp-button,\n :host(:hover) .sp-button {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button:focus {\n outline: 0;\n }\n\n .sp-icon {\n grid-area: 1 / 1;\n position: relative;\n z-index: 1;\n display: block;\n overflow: visible;\n transition: opacity 160ms ease, transform 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-icon--play {\n width: 54px;\n height: 60px;\n opacity: 1;\n transform: translate(4px, 0) rotate(0deg) scale(1);\n }\n\n .sp-icon--pause {\n width: 54px;\n height: 60px;\n opacity: 0;\n transform: translate(0, 0) rotate(-70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--play {\n opacity: 0;\n transform: translate(4px, 0) rotate(70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--pause {\n opacity: 1;\n transform: translate(0, 0) rotate(0deg) scale(1);\n }\n\n .sp-progress-cluster {\n position: absolute;\n top: calc(100% - 28px);\n left: 50%;\n z-index: 4;\n display: block;\n width: calc(100% - (var(--space) * 8));\n height: 28px;\n --sp-progress-height: 4px;\n transform: translateX(-50%);\n transition:\n top 360ms cubic-bezier(0.23, 1, 0.32, 1),\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n transform 360ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-progress {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n height: 28px;\n cursor: pointer;\n touch-action: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster {\n top: 50%;\n left: 50%;\n width: min(148px, calc(100% - (var(--space) * 12)));\n height: 20px;\n --sp-progress-height: 4px;\n transform: translate(-50%, -50%);\n }\n\n .sp-progress-surface,\n .sp-progress-fill {\n position: absolute;\n bottom: calc(var(--space) * 2);\n left: 0;\n height: var(--sp-progress-height);\n border-radius: 3px;\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-progress-surface {\n right: 0;\n bottom: calc((var(--space) * 2) - 2px);\n z-index: 0;\n height: calc(var(--sp-progress-height) + 4px);\n border-radius: 5px;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n }\n\n .sp-progress-surface::after {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0;\n border-radius: inherit;\n background: linear-gradient(90deg, transparent 0%, var(--sp-shimmer-highlight) 46%, transparent 100%);\n transform: translateX(-120%);\n }\n\n .sp-player.is-loading .sp-progress-surface::after {\n opacity: 1;\n animation: sp-progress-shimmer 1.35s ease-in-out infinite;\n }\n\n .sp-player.is-loading.has-loaded-once .sp-progress-surface {\n opacity: 0.48;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-surface {\n background: rgb(255 255 255 / 0.08);\n opacity: 1;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-fill,\n .sp-player.is-progress-settling .sp-progress-fill {\n opacity: 0;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover),\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-control-tray {\n position: absolute;\n display: var(--sp-control-tray-display);\n right: 0;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n z-index: 3;\n width: var(--sp-control-tray-expanded-width);\n height: calc(var(--sp-control-slot-size) + (var(--sp-control-tray-padding) * 2));\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: right bottom;\n transition:\n bottom 180ms ease,\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-pointer-active .sp-control-tray,\n .sp-player.is-controls-visible .sp-control-tray,\n :host(:hover) .sp-control-tray {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n opacity: var(--sp-control-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-control-tray-slots {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 0;\n height: 100%;\n box-sizing: border-box;\n padding: var(--sp-control-tray-padding);\n border-radius: 5px;\n overflow: visible;\n opacity: 1;\n transition: height 180ms ease;\n }\n\n .sp-control-tray-slots::before {\n content: '';\n position: absolute;\n top: var(--sp-control-tray-padding);\n left: var(--sp-control-tray-padding);\n z-index: 0;\n width: var(--sp-control-slot-size);\n height: var(--sp-control-slot-size);\n border-radius: 3px;\n background: var(--sp-control-hover-surface);\n opacity: 0;\n pointer-events: none;\n transform: translateX(var(--sp-control-hover-offset, 0px));\n transition:\n opacity 120ms ease,\n transform 240ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: var(--sp-control-hover-opacity);\n transition:\n opacity 80ms ease 120ms,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n transform: translateX(var(--sp-touch-control-hover-offset));\n transition:\n opacity 80ms ease,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:not(:has(.sp-control-button:hover))::before {\n transition:\n opacity 100ms ease,\n transform 0ms linear 100ms;\n }\n\n .sp-control-button {\n position: relative;\n z-index: 1;\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n aspect-ratio: 1 / 1;\n width: var(--sp-control-slot-size);\n min-width: 0;\n height: var(--sp-control-slot-size);\n border: 0;\n border-radius: 3px;\n color: var(--white);\n background: transparent;\n padding: 0;\n cursor: pointer;\n transition: background-color 150ms ease, color 150ms ease;\n }\n\n .sp-control-button:focus {\n outline: 0;\n }\n\n .sp-control-button:hover {\n background: var(--sp-control-slot-hover-surface);\n }\n\n .sp-player:not(.has-volume-control) [data-sp-volume-control],\n .sp-player:not(.has-picture-in-picture-control) [data-sp-picture-in-picture-control],\n .sp-player:not(.has-fullscreen-control) [data-sp-fullscreen-control] {\n display: none;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control] {\n cursor: default;\n pointer-events: auto;\n }\n\n .sp-player.is-volume-unavailable .sp-volume-icon {\n transition: none;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control]:hover {\n background: transparent;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control]:hover .sp-control-icon,\n .sp-player.is-volume-unavailable [data-sp-volume-control].is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control]:hover)::before,\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control].is-control-tap-active)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-icon {\n display: block;\n width: var(--sp-control-icon-render-size);\n height: var(--sp-control-icon-render-size);\n color: currentColor;\n overflow: visible;\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n transition:\n opacity 180ms ease,\n transform 280ms cubic-bezier(0.18, 0.9, 0.22, 1);\n transition-delay: 0ms;\n }\n\n .sp-control-icon [stroke] {\n stroke-width: var(--sp-control-icon-stroke-width);\n }\n\n .sp-volume-icon,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: none;\n }\n\n .sp-player.is-volume-sound .sp-volume-icon--sound,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: block;\n }\n\n .sp-player.is-volume-icon-animating .sp-volume-icon {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-popover {\n position: absolute;\n left: 0;\n bottom: calc(var(--sp-control-slot-size) + var(--sp-control-tray-padding) + 4px);\n z-index: -1;\n display: grid;\n place-items: center;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(8px) scale(0.98);\n transform-origin: center bottom;\n transition:\n opacity 140ms ease,\n filter 180ms ease,\n transform 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-slot::after {\n content: '';\n position: absolute;\n right: 0;\n bottom: 100%;\n left: 0;\n height: calc(var(--sp-control-tray-padding) + 4px);\n z-index: 5;\n pointer-events: auto;\n }\n\n .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-volume-popover.is-scrubbing-volume {\n z-index: 4;\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n transition:\n opacity 150ms ease,\n filter 220ms ease,\n transform 260ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-volume-unavailable .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player:not(.has-volume-slider-control) .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player.is-volume-unavailable .sp-volume-popover.is-scrubbing-volume {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-volume-track {\n position: relative;\n z-index: 1;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n overflow: hidden;\n touch-action: none;\n cursor: ns-resize;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n }\n\n .sp-volume-fill {\n position: absolute;\n right: 2px;\n bottom: 2px;\n left: 2px;\n height: max(0px, calc(var(--sp-volume-level) - 4px));\n min-height: 0;\n border-radius: 3px;\n background: var(--white);\n opacity: 1;\n transition: height 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-fullscreen-icon,\n .sp-player.is-fullscreen .sp-fullscreen-icon--enter,\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--exit {\n display: none;\n }\n\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--enter,\n .sp-player.is-fullscreen .sp-fullscreen-icon--exit {\n display: block;\n }\n\n .sp-player.is-pointer-active .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-icon,\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(1) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(1) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(1) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(2) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(2) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(2) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-2);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(3) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(3) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(3) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-3);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-control-tray,\n .sp-player.is-progress-settling .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n }\n\n .sp-player.has-controls-collision .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(1.4px);\n transform: translateY(-2px) scale(0.985);\n }\n\n .sp-progress-fill {\n display: block;\n z-index: 1;\n left: 2px;\n right: 2px;\n background: var(--white);\n border-radius: 3px;\n clip-path: inset(0 var(--sp-progress-inset) 0 0 round 3px);\n -webkit-mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n -webkit-mask-composite: xor;\n mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n mask-composite: exclude;\n transform: translateZ(0);\n will-change: clip-path;\n }\n\n .sp-progress-hover-fill {\n position: absolute;\n bottom: calc(var(--space) * 2);\n left: 2px;\n right: 2px;\n z-index: 0;\n height: var(--sp-progress-height);\n border-radius: 3px;\n background: var(--white);\n opacity: 0;\n pointer-events: none;\n clip-path: inset(0 var(--sp-hover-fill-inset) 0 0 round 3px);\n transform: translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-progress:hover .sp-progress-hover-fill,\n .sp-player.is-progress-hovering .sp-progress-hover-fill,\n .sp-player.is-scrubbing .sp-progress-hover-fill {\n opacity: 0.2;\n }\n\n .sp-progress-marker {\n position: absolute;\n bottom: calc((var(--space) * 2) + 1.5px);\n left: clamp(1px, var(--sp-return-marker-left), calc(100% - 1px));\n z-index: 2;\n width: 2px;\n height: max(1px, calc(var(--sp-progress-height) - 3px));\n border-radius: 2px;\n background: rgb(var(--white-rgb) / calc(var(--sp-return-marker-base-opacity) * 0.58));\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n transform: translateX(-50%) translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-player.is-scrubbing.has-return-marker .sp-progress-marker {\n opacity: 1;\n }\n\n .sp-time {\n position: absolute;\n display: block;\n bottom: calc(100% + var(--space));\n left: var(--sp-scrub-preview-left);\n z-index: 2;\n padding: 2px calc(var(--space) * 1.5);\n color: var(--white);\n background: transparent;\n border-radius: 4px;\n isolation: isolate;\n overflow: hidden;\n pointer-events: none;\n opacity: 0;\n transition: transform 120ms ease;\n transform: translateX(-50%) translateY(2px);\n white-space: nowrap;\n font: 500 12px/1.35 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-time-surface {\n position: absolute;\n inset: 0;\n z-index: 0;\n border-radius: inherit;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n will-change: backdrop-filter, opacity;\n }\n\n .sp-time-text {\n position: relative;\n z-index: 1;\n }\n\n .sp-progress:hover .sp-time,\n .sp-player.is-progress-hovering .sp-time,\n .sp-player.is-scrubbing .sp-time {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n .sp-player.has-pinned-time .sp-time {\n display: none !important;\n }\n\n .sp-tray-time {\n position: absolute;\n display: none;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n left: 0;\n z-index: 3;\n color: var(--white);\n isolation: isolate;\n overflow: visible;\n pointer-events: none;\n white-space: nowrap;\n opacity: 0;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: left bottom;\n transition:\n bottom 180ms ease,\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.has-pinned-time .sp-tray-time {\n display: block;\n }\n\n .sp-player.has-pinned-time.is-pointer-active .sp-tray-time,\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time,\n :host(:hover) .sp-player.has-pinned-time .sp-tray-time {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-tray-time-holder {\n position: relative;\n right: auto;\n bottom: auto;\n width: calc(var(--sp-tray-time-width, max-content) + (var(--sp-control-tray-padding) * 2));\n height: calc(var(--sp-control-slot-size) + (var(--sp-control-tray-padding) * 2));\n transition: width 240ms cubic-bezier(0.23, 1, 0.32, 1);\n overflow: hidden;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots::before {\n width: calc(100% - (var(--sp-control-tray-padding) * 2));\n }\n\n .sp-tray-time-holder .sp-tray-time-text {\n aspect-ratio: auto;\n width: 100%;\n height: var(--sp-control-slot-size);\n max-height: var(--sp-control-slot-size);\n padding: 0 8px;\n font: 600 13px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n color: var(--white);\n border-radius: 3px;\n }\n\n .sp-tray-time-text {\n pointer-events: auto;\n cursor: pointer;\n }\n\n .sp-tray-time-text.is-time-animating {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-tray-time {\n opacity: 0;\n }\n\n .sp-button:focus-visible,\n .sp-progress:focus-visible,\n .sp-control-button:focus-visible,\n .sp-volume-track:focus-visible {\n outline: 2px solid rgb(255 255 255 / 0.92);\n outline-offset: 3px;\n box-shadow: 0 0 0 5px rgb(0 0 0 / 0.32);\n }\n\n @media (max-width: 768px) and (hover: none) and (pointer: coarse) {\n .sp-overlay,\n .sp-button {\n transition-duration: 340ms;\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n opacity: 0;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n transform: translate(-50%, -50%) scale(0.96);\n }\n\n .sp-player.is-controls-visible .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button,\n .sp-player.is-scrubbing .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time {\n opacity: 1;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n :host(:hover) .sp-overlay,\n :host(:hover) .sp-button,\n :host(:hover) .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n }\n\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n }\n\n .sp-player.is-controls-visible .sp-overlay,\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n pointer-events: auto;\n }\n\n .sp-player.is-controls-visible .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes sp-progress-shimmer {\n 0% {\n transform: translateX(-120%);\n }\n\n 58%,\n 100% {\n transform: translateX(120%);\n }\n }\n\n @keyframes sp-volume-icon-swap {\n 0% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n 42% {\n filter: blur(1.2px);\n transform: translateY(0) scale(0.9);\n }\n\n 100% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n }\n`;\n","import { styles } from './styles';\n\nexport const template = document.createElement('template');\ntemplate.innerHTML = `\n <style>${styles}</style>\n <div class=\"sp-player is-loading\" data-sp-player>\n <video\n class=\"sp-video sp-asset\"\n autoplay\n muted\n playsinline\n loop\n preload=\"none\"\n controlslist=\"nodownload nofullscreen noremoteplayback\"\n disableRemotePlayback\n data-sp-video>\n </video>\n <span class=\"sp-overlay\" aria-hidden=\"true\"></span>\n <button class=\"sp-button\" type=\"button\" aria-label=\"Play video\" data-sp-button>\n <svg class=\"sp-icon sp-icon--play\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <path d=\"M3 3.5L15 10L3 16.5Z\" fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-icon sp-icon--pause\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n <rect x=\"10\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n </svg>\n </button>\n <div class=\"sp-progress-cluster\">\n <div class=\"sp-progress\" aria-label=\"Video progress\" role=\"slider\" tabindex=\"0\" data-sp-progress-track>\n <span class=\"sp-progress-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time\" data-sp-time>\n <span class=\"sp-time-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time-text\" data-sp-time-text>0:00</span>\n </span>\n <span class=\"sp-progress-fill\" data-sp-progress></span>\n <span class=\"sp-progress-hover-fill\" aria-hidden=\"true\"></span>\n <span class=\"sp-progress-marker\" aria-hidden=\"true\"></span>\n </div>\n <span class=\"sp-tray-time\" data-sp-tray-time>\n <span class=\"sp-control-tray sp-tray-time-holder\">\n <span class=\"sp-control-tray-slots\">\n <button class=\"sp-control-button sp-tray-time-text\" type=\"button\" tabindex=\"-1\" data-sp-tray-time-text>0:00</button>\n </span>\n </span>\n </span>\n <span class=\"sp-control-tray\" data-sp-control-tray>\n <span class=\"sp-control-tray-slots\" data-sp-control-tray-slots>\n <button class=\"sp-control-button sp-volume-slot\" type=\"button\" aria-label=\"Toggle sound\" data-sp-volume-control>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--sound\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M8 7.00002H5C3.8954 7.00002 3 7.89542 3 9.00002V11C3 12.1046 3.8954 13 5 13H8L12.5227 16.7689C13.1093 17.2578 14 16.8406 14 16.077V3.92302C14 3.15942 13.1094 2.74222 12.5227 3.23112L8 7.00002Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M17.4141 8.58582C18.1951 9.36682 18.1951 10.6332 17.4141 11.4142\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--muted\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M3 17L17 3\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M15 16.0773C14.9998 17.6883 13.1207 18.5686 11.8828 17.5372L9.8333 15.8303C9.38114 15.4538 9.35003 14.7702 9.76611 14.3541C10.132 13.9882 10.7165 13.9617 11.114 14.2929L13 15.8644V11.5354C13 11.2702 13.1054 11.0158 13.2929 10.8283C13.9229 10.1983 15 10.6445 15 11.5354V16.0773Z\" fill=\"currentColor\"></path>\n <path d=\"M12 2.37218C13.2358 1.48685 15 2.36173 15 3.92296V4.87902L13 6.87902V4.13488L8.64062 7.76867C8.46092 7.91841 8.23392 8.00011 8 8.00011H5C4.44768 8.00011 4 8.4478 4 9.00011V11.0001C4.00009 11.5524 4.44774 12.0001 5 12.0001H7.87891L5.87891 14.0001H5C3.34317 14.0001 2.00009 12.6569 2 11.0001V9.00011C2 7.34323 3.34312 6.00011 5 6.00011H7.63672L11.8828 2.463L12 2.37218Z\" fill=\"currentColor\"></path>\n </svg>\n <span class=\"sp-volume-popover\" data-sp-volume-popover>\n <span class=\"sp-volume-track\" role=\"slider\" aria-label=\"Volume\" aria-valuemin=\"0\" aria-valuemax=\"100\" tabindex=\"0\" data-sp-volume-track>\n <span class=\"sp-volume-fill\" data-sp-volume-fill></span>\n </span>\n </span>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Picture in picture\" data-sp-picture-in-picture-control>\n <svg class=\"sp-control-icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"m5.5,13c-1.381,0-2.5-1.119-2.5-2.5v-5c0-1.381,1.119-2.5,2.5-2.5h7c1.381,0,2.5,1.119,2.5,2.5v2.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></path>\n <rect x=\"9\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" ry=\"1.5\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></rect>\n <line x1=\"8\" y1=\"8\" x2=\"6\" y2=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></line>\n <polygon points=\"9 6 9 9 6 9 9 6\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></polygon>\n </svg>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Enter fullscreen\" data-sp-fullscreen-control>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--enter\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"12.5 16 16 16 16 12.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"16\" y1=\"16\" x2=\"12\" y2=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"7.5 4 4 4 4 7.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"4\" y1=\"4\" x2=\"8\" y2=\"8\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--exit\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"16 12.5 12.5 12.5 12.5 16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"12\" y1=\"12\" x2=\"16\" y2=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"4 7.5 7.5 7.5 7.5 4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"8\" y1=\"8\" x2=\"4\" y2=\"4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n </button>\n </span>\n </span>\n </div>\n </div>\n`;\n","import { DEFAULT_ASPECT_RATIO, DEFAULT_PRELOAD_MARGIN, OBSERVED_ATTRIBUTES } from './constants';\nimport {\n canRequestPlayerFullscreen,\n exitFullscreen,\n getFullscreenElement,\n isFullscreenSupported,\n requestPlayerFullscreen,\n requestVideoFullscreen,\n} from './fullscreen';\nimport { detectAudioAvailability, formatVideoTime, isAudioAvailabilityPending } from './media';\nimport { getProgressMetrics, getProgressPercentFromClientX, getProgressXFromPercent } from './progress';\nimport { template } from './template';\nimport type { Cleanup, PlaybackState } from './types';\n\nexport class SimplePlayer extends HTMLElement {\n static observedAttributes = OBSERVED_ATTRIBUTES;\n\n #root: ShadowRoot;\n #cleanup: Cleanup[] = [];\n #observer: IntersectionObserver | null = null;\n #initialized = false;\n #videoSourceLoaded = false;\n #player!: HTMLElement;\n #video!: HTMLVideoElement;\n #button!: HTMLButtonElement;\n #progressTrack!: HTMLElement;\n #controlTray!: HTMLElement;\n #controlTraySlots!: HTMLElement;\n #trayTime!: HTMLElement;\n #trayTimeText!: HTMLElement;\n #scrubTime!: HTMLElement;\n #scrubTimeText!: HTMLElement;\n #volumeControl!: HTMLButtonElement;\n #volumePopover!: HTMLElement;\n #volumeTrack!: HTMLElement;\n #pictureInPictureControl!: HTMLButtonElement;\n #fullscreenControl!: HTMLButtonElement;\n #controlButtons: HTMLButtonElement[] = [];\n\n #progressFrame = 0;\n #isScrubbing = false;\n #isTrackingScrub = false;\n #scrubWasPlaying = false;\n #scrubTargetTime = 0;\n #scrubReturnTime = 0;\n #scrubReturnPercent = 0;\n #hasScrubReturnMarker = false;\n #isCommittedScrubPending = false;\n #committedScrubWasPlaying = false;\n #scrubStartX = 0;\n #scrubLongPressTimer = 0;\n #activeScrubPointerId: number | null = null;\n #optimisticPlaybackState: PlaybackState = null;\n #videoLoadAttempt = 0;\n #videoRetryTimer = 0;\n #controlsHideTimer = 0;\n #loadingStateTimer = 0;\n #initialProgressSettleTimer = 0;\n #suppressTouchButtonClickUntil = 0;\n #suppressTouchControlClickUntil = 0;\n #timeWidthObserver: ResizeObserver | null = null;\n #hasDecodedFirstFrame = false;\n #hasPresentedFirstFrame = false;\n #firstFrameRequestPending = false;\n #firstFramePresentationPending = false;\n #firstFrameRequestToken = 0;\n #firstFrameFallbackTimer = 0;\n #hasInitialProgressSettled = false;\n #initialProgressEstimateUnlockAt = 0;\n #isPlaybackBuffering = true;\n #visualProgressTime = 0;\n #visualProgressUpdatedAt = performance.now();\n #lastRenderedProgressTime = 0;\n #pausedVisualProgressTime: number | null = null;\n #pauseFrozenProgressPercent: number | null = null;\n #hasControlsCollision = false;\n #isProgressHoverPreviewing = false;\n #hasAudioTrack = false;\n #hasCheckedAudioTrack = false;\n #isPointerOverControlSurface = false;\n #lastPointerClientX: number | null = null;\n #lastPointerClientY: number | null = null;\n #lastPointerWasTouch = false;\n #isVolumeScrubbing = false;\n #isVolumeHovering = false;\n #activeVolumePointerId: number | null = null;\n #volumeCloseTimer = 0;\n #volumeIconAnimationTimer = 0;\n #controlTapTimer = 0;\n #volumeIconState: 'sound' | 'muted' | null = null;\n #showRemainingTime = false;\n #timeAnimationTimer = 0;\n\n readonly #scrubDragThreshold = 4;\n readonly #scrubSnapDistance = 3.5;\n readonly #scrubReturnMarkerBodyInset = 6;\n readonly #scrubReturnMarkerMinTime = 0.08;\n readonly #scrubLongPressDelay = 240;\n readonly #controlsAutoHideDelay = 1200;\n readonly #pointerControlsIdleDelay = 1600;\n readonly #loadingStateDelay = 140;\n readonly #initialProgressSettleDelay = 380;\n readonly #initialProgressEstimateHold = 650;\n readonly #videoRetryDelay = 2000;\n readonly #maxVideoLoadAttempts = 3;\n readonly #bufferedAheadTarget = 10;\n readonly #bufferedRangeFuzz = 0.18;\n readonly #controlsCollisionEnterMargin = 8;\n readonly #controlsCollisionExitMargin = 18;\n\n constructor() {\n super();\n this.#root = this.attachShadow({ mode: 'open' });\n this.#root.append(template.content.cloneNode(true));\n }\n\n get src() {\n return this.getAttribute('src') ?? '';\n }\n\n set src(value: string) {\n this.#setStringAttribute('src', value);\n }\n\n get aspectRatio() {\n return this.getAttribute('aspect-ratio') || DEFAULT_ASPECT_RATIO;\n }\n\n set aspectRatio(value: string) {\n this.#setStringAttribute('aspect-ratio', value);\n }\n\n get preloadMargin() {\n return this.getAttribute('preload-margin') || DEFAULT_PRELOAD_MARGIN;\n }\n\n set preloadMargin(value: string) {\n this.#setStringAttribute('preload-margin', value);\n }\n\n get autoplayEnabled() {\n return !this.hasAttribute('disable-autoplay') && !this.hasAttribute('no-autoplay');\n }\n\n set autoplayEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-autoplay');\n this.removeAttribute('no-autoplay');\n return;\n }\n\n this.setAttribute('disable-autoplay', '');\n }\n\n get controlsEnabled() {\n return this.hasAttribute('controls');\n }\n\n set controlsEnabled(value: boolean) {\n if (value) {\n this.setAttribute('controls', '');\n return;\n }\n\n this.removeAttribute('controls');\n }\n\n get timeVisible() {\n return this.hasAttribute('show-time');\n }\n\n set timeVisible(value: boolean) {\n if (value) {\n this.setAttribute('show-time', '');\n return;\n }\n\n this.removeAttribute('show-time');\n }\n\n get volumeEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-volume') &&\n !this.hasAttribute('no-volume')\n );\n }\n\n set volumeEnabled(value: boolean) {\n this.#setOptionalControlAttributes('volume', value);\n }\n\n get volumeSliderEnabled() {\n return !this.hasAttribute('disable-volume-slider') && !this.hasAttribute('no-volume-slider');\n }\n\n set volumeSliderEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-volume-slider');\n this.removeAttribute('no-volume-slider');\n return;\n }\n\n this.setAttribute('disable-volume-slider', '');\n }\n\n get pictureInPictureEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-picture-in-picture') &&\n !this.hasAttribute('no-picture-in-picture')\n );\n }\n\n set pictureInPictureEnabled(value: boolean) {\n this.#setOptionalControlAttributes('picture-in-picture', value);\n }\n\n get fullscreenEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-fullscreen') &&\n !this.hasAttribute('no-fullscreen')\n );\n }\n\n set fullscreenEnabled(value: boolean) {\n this.#setOptionalControlAttributes('fullscreen', value);\n }\n\n connectedCallback() {\n this.#player = this.#root.querySelector('[data-sp-player]')!;\n this.#video = this.#root.querySelector('[data-sp-video]')!;\n this.#button = this.#root.querySelector('[data-sp-button]')!;\n this.#progressTrack = this.#root.querySelector('[data-sp-progress-track]')!;\n this.#controlTray = this.#root.querySelector('[data-sp-control-tray]')!;\n this.#controlTraySlots = this.#root.querySelector('[data-sp-control-tray-slots]')!;\n this.#trayTime = this.#root.querySelector('[data-sp-tray-time]')!;\n this.#trayTimeText = this.#root.querySelector('[data-sp-tray-time-text]')!;\n this.#scrubTime = this.#root.querySelector('[data-sp-time]')!;\n this.#scrubTimeText = this.#root.querySelector('[data-sp-time-text]')!;\n this.#volumeControl = this.#root.querySelector('[data-sp-volume-control]')!;\n this.#volumePopover = this.#root.querySelector('[data-sp-volume-popover]')!;\n this.#volumeTrack = this.#root.querySelector('[data-sp-volume-track]')!;\n this.#pictureInPictureControl = this.#root.querySelector('[data-sp-picture-in-picture-control]')!;\n this.#fullscreenControl = this.#root.querySelector('[data-sp-fullscreen-control]')!;\n this.#controlButtons = [this.#volumeControl, this.#pictureInPictureControl, this.#fullscreenControl];\n this.#syncAspectRatio();\n\n if (!this.#initialized) {\n this.#bindEvents();\n this.#initialized = true;\n }\n\n this.#syncAutoplayState();\n this.#setupLazyLoading();\n this.#syncOptionalControls();\n this.#syncTimeVisibility();\n this.#syncVideoLoading();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncVideoState();\n }\n\n disconnectedCallback() {\n this.#observer?.disconnect();\n this.#observer = null;\n this.#cleanup.forEach((cleanup) => cleanup());\n this.#cleanup = [];\n this.#initialized = false;\n this.#clearControlsHideTimer();\n this.#clearLoadingStateTimer();\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#clearScrubLongPressTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#clearVolumeCloseTimer();\n this.#clearVolumeIconAnimationTimer();\n this.#clearControlTapTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.style.removeProperty('--sp-touch-control-hover-offset');\n this.#clearControlsCollision();\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#isPointerOverControlSurface = false;\n this.#activeVolumePointerId = null;\n this.#volumeControl.classList.remove('is-volume-open');\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.#player.classList.remove('is-pointer-active');\n this.#stopProgressLoop();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return;\n\n if (name === 'aspect-ratio') {\n this.#syncAspectRatio();\n return;\n }\n\n if (name === 'preload-margin' && this.isConnected) {\n this.#observer?.disconnect();\n this.#setupLazyLoading();\n return;\n }\n\n if (name === 'src' && this.isConnected) {\n this.#resetSource();\n this.#setupLazyLoading();\n return;\n }\n\n if ((name === 'disable-autoplay' || name === 'no-autoplay') && this.isConnected) {\n this.#syncAutoplayState();\n this.#syncAudioControlState();\n this.#syncVideoState();\n return;\n }\n\n if (name === 'show-time' && this.isConnected) {\n this.#syncTimeVisibility();\n return;\n }\n\n if (\n (\n name === 'controls' ||\n name.startsWith('enable-') ||\n name.startsWith('disable-') ||\n name.startsWith('no-')\n ) &&\n this.isConnected\n ) {\n this.#syncOptionalControls();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncTimeVisibility();\n }\n }\n\n #setStringAttribute(name: string, value: string) {\n if (value === '') {\n this.removeAttribute(name);\n return;\n }\n\n this.setAttribute(name, value);\n }\n\n #setOptionalControlAttributes(name: 'volume' | 'picture-in-picture' | 'fullscreen', enabled: boolean) {\n if (enabled) {\n this.setAttribute(`enable-${name}`, '');\n this.removeAttribute(`disable-${name}`);\n this.removeAttribute(`no-${name}`);\n return;\n }\n\n this.removeAttribute(`enable-${name}`);\n this.setAttribute(`disable-${name}`, '');\n }\n\n #syncAspectRatio() {\n this.style.setProperty('--simple-player-aspect-ratio', this.aspectRatio);\n }\n\n #syncAutoplayState() {\n if (!this.#video) return;\n\n const isEnabled = this.autoplayEnabled;\n this.#video.autoplay = isEnabled;\n\n if (isEnabled) {\n this.#video.muted = true;\n this.#video.setAttribute('autoplay', '');\n this.#video.setAttribute('muted', '');\n return;\n }\n\n this.#video.removeAttribute('autoplay');\n\n if (!this.#videoSourceLoaded) {\n this.#video.muted = false;\n this.#video.removeAttribute('muted');\n }\n }\n\n #syncOptionalControls() {\n if (!this.#player) return;\n\n const hasVolumeControl = this.#isVolumeAvailable();\n const controls = [\n { button: this.#volumeControl, enabled: hasVolumeControl, className: 'has-volume-control' },\n { button: this.#pictureInPictureControl, enabled: this.pictureInPictureEnabled, className: 'has-picture-in-picture-control' },\n { button: this.#fullscreenControl, enabled: this.fullscreenEnabled, className: 'has-fullscreen-control' },\n ];\n\n let index = 0;\n for (const control of controls) {\n this.#player.classList.toggle(control.className, control.enabled);\n control.button.hidden = !control.enabled;\n\n if (control.enabled) {\n control.button.dataset.spControlIndex = `${index}`;\n index += 1;\n } else {\n delete control.button.dataset.spControlIndex;\n }\n }\n\n this.style.setProperty('--sp-enabled-controls-count', `${index}`);\n this.style.setProperty('--sp-control-tray-display', index > 0 ? 'block' : 'none');\n this.#player.classList.toggle('has-volume-slider-control', hasVolumeControl && this.volumeSliderEnabled);\n\n if (!hasVolumeControl || !this.volumeSliderEnabled) {\n this.#closeVolumePopover();\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n }\n\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n }\n\n get #hasPinnedTime() {\n return this.timeVisible && this.controlsEnabled;\n }\n\n #syncTimeVisibility() {\n if (!this.#player) return;\n\n this.#player.classList.toggle('has-pinned-time', this.#hasPinnedTime);\n if (this.#hasPinnedTime) {\n this.#syncPinnedTimeText();\n }\n }\n\n #bindEvents() {\n this.#listen(this.#button, 'click', this.#handleButtonClick);\n this.#listen(this, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#button, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#button, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleProgressPointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleProgressPointerLeave);\n this.#listen(this.#controlTray, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#controlTray, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#root, 'focusin', this.#handleControlSurfaceFocusIn);\n this.#listen(this.#root, 'focusout', this.#handleControlSurfaceFocusOut);\n this.#listen(this.#player, 'pointerdown', this.#handlePlayerPointerDown);\n this.#listen(this.#player, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#player, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#progressTrack, 'pointerdown', this.#handleProgressPointerDown);\n this.#listen(this.#progressTrack, 'pointermove', this.#handleProgressPointerMove);\n this.#listen(this.#progressTrack, 'pointerup', this.#handleProgressPointerUp);\n this.#listen(this.#progressTrack, 'pointercancel', this.#handleProgressPointerCancel);\n this.#listen(this.#progressTrack, 'keydown', this.#handleProgressKeyDown);\n this.#listen(this.#volumeControl, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumeControl, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeControl, 'click', this.#handleVolumeControlClick);\n this.#listen(this.#volumePopover, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumePopover, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeTrack, 'pointerdown', this.#handleVolumePointerDown);\n this.#listen(this.#volumeTrack, 'pointermove', this.#handleVolumePointerMove);\n this.#listen(this.#volumeTrack, 'pointerup', this.#handleVolumePointerUp);\n this.#listen(this.#volumeTrack, 'pointercancel', this.#handleVolumePointerCancel);\n this.#listen(this.#volumeTrack, 'click', this.#preventVolumeTrackClick);\n this.#listen(this.#volumeTrack, 'keydown', this.#handleVolumeKeyDown);\n this.#listen(this.#pictureInPictureControl, 'click', this.#handlePictureInPictureClick);\n this.#listen(this.#fullscreenControl, 'click', this.#handleFullscreenClick);\n this.#listen(this.#trayTimeText, 'click', this.#handleTimeToggleClick);\n for (const control of this.#controlButtons) {\n this.#listen(control, 'pointerenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'mouseenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'pointerdown', this.#handleControlButtonPointerDown);\n }\n\n if ('ResizeObserver' in window) {\n this.#timeWidthObserver = new ResizeObserver(() => {\n this.#syncTrayTimeWidth();\n });\n this.#timeWidthObserver.observe(this.#trayTimeText);\n this.#cleanup.push(() => {\n this.#timeWidthObserver?.disconnect();\n this.#timeWidthObserver = null;\n });\n }\n\n this.#listen(document, 'pointerup', this.#handleDocumentPointerUp);\n this.#listen(document, 'pointercancel', this.#handleDocumentPointerCancel);\n this.#listen(document, 'pointermove', this.#handleDocumentPointerMove);\n this.#listen(document, 'mousemove', this.#handleDocumentPointerMove);\n this.#listen(document, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'webkitfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'mozfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'MSFullscreenChange', this.#handleFullscreenChange);\n this.#listen(this.#root, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(window, 'blur', this.#handleWindowBlur);\n this.#listen(window, 'focus', this.#handleWindowFocus);\n\n this.#listen(this.#video, 'play', this.#handleVideoPlay);\n this.#listen(this.#video, 'pause', this.#handleVideoPause);\n this.#listen(this.#video, 'ended', this.#handleVideoEnded);\n this.#listen(this.#video, 'loadstart', this.#handleVideoLoadStart);\n this.#listen(this.#video, 'waiting', this.#handleVideoWaiting);\n this.#listen(this.#video, 'stalled', this.#handleVideoWaiting);\n this.#listen(this.#video, 'seeking', this.#handleVideoWaiting);\n this.#listen(this.#video, 'loadeddata', this.#markVideoReady);\n this.#listen(this.#video, 'loadedmetadata', this.#handleVideoLoadedMetadata);\n this.#listen(this.#video, 'canplay', this.#markVideoReady);\n this.#listen(this.#video, 'canplaythrough', this.#markVideoReady);\n this.#listen(this.#video, 'playing', this.#handleVideoPlaying);\n this.#listen(this.#video, 'seeked', this.#handleVideoSeeked);\n this.#listen(this.#video, 'error', this.#handleVideoError);\n this.#listen(this.#video, 'progress', this.#syncVideoLoading);\n this.#listen(this.#video, 'suspend', this.#syncVideoLoading);\n this.#listen(this.#video, 'timeupdate', this.#handleVideoTimeUpdate);\n this.#listen(this.#video, 'volumechange', this.#handleVideoVolumeChange);\n this.#listen(this.#video, 'enterpictureinpicture', this.#syncPictureInPictureState);\n this.#listen(this.#video, 'leavepictureinpicture', this.#syncPictureInPictureState);\n }\n\n #syncTrayTimeWidth() {\n if (!this.#player || !this.#trayTimeText) return;\n this.#trayTimeText.style.width = 'fit-content';\n const width = Math.ceil(this.#trayTimeText.scrollWidth);\n this.#trayTimeText.style.width = '';\n this.#player.style.setProperty('--sp-tray-time-width', `${width}px`);\n }\n\n #listen(target: EventTarget, type: string, listener: EventListenerOrEventListenerObject) {\n target.addEventListener(type, listener);\n this.#cleanup.push(() => target.removeEventListener(type, listener));\n }\n\n #setupLazyLoading() {\n if (!this.src || this.#videoSourceLoaded) return;\n\n this.#observer?.disconnect();\n this.#video.dataset.src = this.src;\n\n if ('IntersectionObserver' in window) {\n this.#observer = new IntersectionObserver((entries, observer) => {\n if (!entries.some((entry) => entry.isIntersecting)) return;\n observer.disconnect();\n this.#observer = null;\n void this.#hydrateVideoSource();\n }, { rootMargin: this.preloadMargin });\n\n this.#observer.observe(this.#player);\n return;\n }\n\n void this.#hydrateVideoSource();\n }\n\n #preventNativeVideoAction = (event: Event) => {\n event.preventDefault();\n };\n\n #clearControlsHideTimer() {\n if (!this.#controlsHideTimer) return;\n window.clearTimeout(this.#controlsHideTimer);\n this.#controlsHideTimer = 0;\n }\n\n #hideControls = () => {\n this.#controlsHideTimer = 0;\n if (this.#isTrackingScrub || this.#isScrubbing || this.#isVolumeScrubbing) return;\n\n if (this.#isTouchControls()) {\n this.#player.classList.remove('is-controls-visible');\n return;\n }\n\n if (this.#isPointerOverControlSurface) return;\n this.#player.classList.remove('is-pointer-active');\n };\n\n #scheduleControlsHide(delay = this.#isTouchControls() ? this.#controlsAutoHideDelay : this.#pointerControlsIdleDelay) {\n this.#clearControlsHideTimer();\n this.#controlsHideTimer = window.setTimeout(this.#hideControls, delay);\n }\n\n #scheduleTouchControlsHide() {\n if (!this.#isTouchControls()) return;\n this.#scheduleControlsHide(this.#controlsAutoHideDelay);\n }\n\n #showTouchControls() {\n if (!this.#isTouchControls()) return false;\n const wasVisible = this.#player.classList.contains('is-controls-visible');\n this.#player.classList.add('is-controls-visible');\n this.#scheduleTouchControlsHide();\n return !wasVisible;\n }\n\n #showPointerControls(forcePointer = false) {\n if (!forcePointer && this.#isTouchControls()) return;\n this.#player.classList.add('is-pointer-active');\n if (!this.#isPointerOverControlSurface) {\n this.#scheduleControlsHide(forcePointer ? this.#pointerControlsIdleDelay : undefined);\n } else {\n this.#clearControlsHideTimer();\n }\n }\n\n #hidePointerControls() {\n this.#isPointerOverControlSurface = false;\n this.#clearControlsHideTimer();\n this.#player.classList.remove('is-pointer-active');\n }\n\n #trackPointerPosition(event: Event) {\n if (event instanceof PointerEvent) {\n this.#lastPointerWasTouch = event.pointerType === 'touch';\n if (this.#lastPointerWasTouch) return false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n if (event instanceof MouseEvent) {\n this.#lastPointerWasTouch = false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n return false;\n }\n\n #isPointInsidePlayer(clientX: number | null, clientY: number | null) {\n if (clientX === null || clientY === null) return false;\n if (clientX < 0 || clientY < 0 || clientX > window.innerWidth || clientY > window.innerHeight) return false;\n\n const rect = this.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #isPointInsideElement(element: Element | null, clientX: number, clientY: number) {\n if (!element) return false;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #clearProgressHoverPreview() {\n if (!this.#isProgressHoverPreviewing) return;\n\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#player.style.setProperty('--sp-hover-fill-inset', '100%');\n this.#clearControlsCollision();\n this.#syncPinnedTimeText();\n }\n\n #syncHoverTargetsFromPointer(clientX: number, clientY: number) {\n if (this.#isTouchControls()) return;\n\n if (!this.#isScrubPreviewLocked() && this.#isPointInsideElement(this.#progressTrack, clientX, clientY)) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(clientX, false, false);\n } else if (!this.#isScrubPreviewLocked()) {\n this.#clearProgressHoverPreview();\n }\n\n const hoveredControl = this.#controlButtons.find((button) => {\n return !button.hidden && !this.#isUnavailableControlButton(button) && this.#isPointInsideElement(button, clientX, clientY);\n }) ?? null;\n\n if (!hoveredControl) return;\n\n const index = Number(hoveredControl.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n }\n\n #areControlsVisible() {\n return (\n this.#player.classList.contains('is-controls-visible') ||\n this.#player.classList.contains('is-pointer-active') ||\n this.#root.activeElement instanceof HTMLElement\n );\n }\n\n #shouldSuppressControlAction() {\n return this.#isTouchControls() && performance.now() < this.#suppressTouchControlClickUntil;\n }\n\n #isUnavailableControlButton(button: HTMLElement | null) {\n return (\n button instanceof HTMLButtonElement &&\n (button.disabled || (button === this.#volumeControl && !this.#isVolumeAvailable()))\n );\n }\n\n #syncPointerControlsFromLastPosition() {\n if (!this.#lastPointerWasTouch && this.#isPointInsidePlayer(this.#lastPointerClientX, this.#lastPointerClientY)) {\n this.#showPointerControls(true);\n return;\n }\n\n this.#hidePointerControls();\n }\n\n #handlePlayerPointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#showPointerControls(true);\n };\n\n #handlePlayerPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#showPointerControls(true);\n };\n\n #handleDocumentPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#syncPointerControlsFromLastPosition();\n };\n\n #handlePlayerPointerLeave = () => {\n this.#hidePointerControls();\n };\n\n #handleControlSurfacePointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#isPointerOverControlSurface = true;\n this.#player.classList.add('is-pointer-active');\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfacePointerLeave = () => {\n this.#isPointerOverControlSurface = false;\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlSurfaceFocusIn = () => {\n if (this.#isTouchControls()) {\n this.#player.classList.add('is-controls-visible');\n } else {\n this.#player.classList.add('is-pointer-active');\n }\n\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfaceFocusOut = () => {\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlButtonPointerEnter = (event: Event) => {\n const target = event.currentTarget as HTMLElement | null;\n if (this.#isUnavailableControlButton(target)) return;\n\n const button = target as HTMLButtonElement;\n const index = Number(button.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n };\n\n #clearControlTapTimer() {\n if (!this.#controlTapTimer) return;\n window.clearTimeout(this.#controlTapTimer);\n this.#controlTapTimer = 0;\n }\n\n #clearControlTapActive = () => {\n this.#controlTapTimer = 0;\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.style.removeProperty('--sp-touch-control-hover-offset');\n };\n\n #handleControlButtonPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent) || event.pointerType !== 'touch') return;\n\n const target = event.currentTarget as HTMLButtonElement | null;\n if (!target || !this.#areControlsVisible() || this.#isUnavailableControlButton(target)) return;\n\n const index = Number(target.dataset.spControlIndex ?? 0);\n this.#clearControlTapTimer();\n this.#controlButtons.forEach((button) => button.classList.toggle('is-control-tap-active', button === target));\n this.style.setProperty('--sp-touch-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n this.#controlTapTimer = window.setTimeout(this.#clearControlTapActive, 280);\n };\n\n #clearLoadingStateTimer() {\n if (!this.#loadingStateTimer) return;\n window.clearTimeout(this.#loadingStateTimer);\n this.#loadingStateTimer = 0;\n }\n\n #clearVideoRetryTimer() {\n if (!this.#videoRetryTimer) return;\n window.clearTimeout(this.#videoRetryTimer);\n this.#videoRetryTimer = 0;\n }\n\n #clearInitialProgressSettleTimer() {\n if (!this.#initialProgressSettleTimer) return;\n window.clearTimeout(this.#initialProgressSettleTimer);\n this.#initialProgressSettleTimer = 0;\n }\n\n #clearFirstFrameFallbackTimer() {\n if (!this.#firstFrameFallbackTimer) return;\n window.clearTimeout(this.#firstFrameFallbackTimer);\n this.#firstFrameFallbackTimer = 0;\n }\n\n #clearVolumeIconAnimationTimer() {\n if (!this.#volumeIconAnimationTimer) return;\n window.clearTimeout(this.#volumeIconAnimationTimer);\n this.#volumeIconAnimationTimer = 0;\n }\n\n #animateVolumeIconSwap() {\n this.#clearVolumeIconAnimationTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n void this.#volumeControl.offsetWidth;\n this.#player.classList.add('is-volume-icon-animating');\n this.#volumeIconAnimationTimer = window.setTimeout(() => {\n this.#volumeIconAnimationTimer = 0;\n this.#player.classList.remove('is-volume-icon-animating');\n }, 240);\n }\n\n #finishInitialProgressSettle = () => {\n const wasSettling = Boolean(this.#initialProgressSettleTimer) || this.#player.classList.contains('is-progress-settling');\n if (!wasSettling) return;\n\n this.#clearInitialProgressSettleTimer();\n if (this.#hasInitialProgressSettled) {\n this.#player.classList.remove('is-progress-settling');\n return;\n }\n\n this.#hasInitialProgressSettled = true;\n this.#initialProgressEstimateUnlockAt = performance.now() + this.#initialProgressEstimateHold;\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n this.#player.classList.remove('is-progress-settling');\n this.#syncVideoState();\n };\n\n #queueInitialProgressSettle() {\n if (this.#hasInitialProgressSettled || this.#initialProgressSettleTimer) return;\n\n this.#player.classList.add('is-progress-settling');\n this.#setProgressVisual(0);\n this.#initialProgressSettleTimer = window.setTimeout(this.#finishInitialProgressSettle, this.#initialProgressSettleDelay);\n }\n\n async #hydrateVideoSource() {\n if (this.#videoSourceLoaded) return;\n\n const source = this.#video.dataset.src || this.src;\n if (!source) return;\n\n this.#clearVideoRetryTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#videoLoadAttempt += 1;\n this.#videoSourceLoaded = true;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#syncAutoplayState();\n this.#video.src = source;\n this.#video.preload = 'auto';\n this.#video.load();\n\n if (this.#video.autoplay && this.#video.muted) {\n await this.#video.play().catch(() => undefined);\n }\n }\n\n #isLoopBoundaryBlip() {\n if (!this.#video.loop || this.#video.paused || !Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return false;\n return this.#video.currentTime < 0.28 || (this.#video.duration - this.#video.currentTime) < 0.28;\n }\n\n #getBufferedAhead(time = this.#video.currentTime) {\n if (!Number.isFinite(time)) return 0;\n\n const currentTime = Math.max(0, time);\n\n try {\n for (let index = 0; index < this.#video.buffered.length; index += 1) {\n const start = this.#video.buffered.start(index);\n const end = this.#video.buffered.end(index);\n\n if (currentTime + this.#bufferedRangeFuzz >= start && currentTime <= end + this.#bufferedRangeFuzz) {\n return Math.max(0, end - currentTime);\n }\n }\n } catch {\n return 0;\n }\n\n return 0;\n }\n\n #hasBufferedAhead(seconds = this.#bufferedAheadTarget) {\n if (\n !this.#videoSourceLoaded ||\n this.#video.error ||\n !this.#player.classList.contains('has-loaded-once') ||\n !Number.isFinite(this.#video.duration) ||\n this.#video.duration <= 0\n ) return false;\n\n const remainingDuration = Math.max(0, this.#video.duration - this.#video.currentTime);\n const requiredBuffer = Math.min(seconds, remainingDuration);\n\n return requiredBuffer <= this.#bufferedRangeFuzz || this.#getBufferedAhead() + this.#bufferedRangeFuzz >= requiredBuffer;\n }\n\n #setVideoLoading(isLoading: boolean, immediate = false) {\n this.#clearLoadingStateTimer();\n const shouldLoad = isLoading && !this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead();\n const shouldWaitForFirstFrame = isLoading && !this.#hasPresentedFirstFrame;\n const shouldShowLoading = shouldWaitForFirstFrame || shouldLoad;\n this.#isPlaybackBuffering = shouldShowLoading;\n\n if (!shouldShowLoading) {\n this.#player.classList.remove('is-loading');\n return;\n }\n\n if (immediate) {\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#loadingStateTimer = window.setTimeout(() => {\n this.#loadingStateTimer = 0;\n if (!this.#hasPresentedFirstFrame || (!this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead())) {\n this.#isPlaybackBuffering = true;\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#isPlaybackBuffering = false;\n this.#player.classList.remove('is-loading');\n }, this.#loadingStateDelay);\n }\n\n #syncVideoLoading = () => {\n if (this.#video.error) {\n this.#setVideoLoading(true, true);\n return;\n }\n\n this.#setVideoLoading(\n (\n !this.#videoSourceLoaded ||\n !this.#hasPresentedFirstFrame ||\n this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA\n ),\n );\n };\n\n #canStartImmediately() {\n return (\n this.#videoSourceLoaded &&\n !this.#video.error &&\n this.#hasDecodedFirstFrame &&\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA ||\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n !this.#player.classList.contains('is-loading')\n )\n )\n );\n }\n\n #isScrubPreviewLocked() {\n return this.#isTrackingScrub || this.#isScrubbing || this.#isCommittedScrubPending;\n }\n\n #retryVideoLoad() {\n if (this.#videoLoadAttempt >= this.#maxVideoLoadAttempts || this.#videoRetryTimer) return;\n\n this.#videoRetryTimer = window.setTimeout(() => {\n this.#videoRetryTimer = 0;\n this.#clearFirstFrameFallbackTimer();\n this.#videoSourceLoaded = false;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n\n if (!this.#player.classList.contains('has-loaded-once')) {\n this.#setProgressVisual(0);\n }\n\n this.#video.removeAttribute('src');\n this.#video.load();\n void this.#hydrateVideoSource();\n }, this.#videoRetryDelay);\n }\n\n #clearCommittedScrubPreview() {\n if (!this.#isCommittedScrubPending) return false;\n\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #commitVideoReady() {\n this.#clearVideoRetryTimer();\n const isFirstReady = !this.#player.classList.contains('has-loaded-once');\n\n if (isFirstReady) this.#queueInitialProgressSettle();\n\n this.#player.classList.add('has-loaded-once');\n this.#player.classList.add('has-visible-frame');\n this.#syncVideoLoading();\n this.#optimisticPlaybackState = null;\n if (this.#isCommittedScrubPending) {\n this.#clearCommittedScrubPreview();\n return true;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #requestFirstVideoFrame() {\n if (this.#hasDecodedFirstFrame || this.#firstFrameRequestPending || this.#video.error) return;\n\n this.#firstFrameRequestPending = true;\n const requestToken = this.#firstFrameRequestToken;\n const confirmFirstFrame = () => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#clearFirstFrameFallbackTimer();\n this.#firstFrameRequestPending = false;\n this.#hasDecodedFirstFrame =\n !this.#video.error &&\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n this.#video.videoWidth > 0 &&\n this.#video.videoHeight > 0;\n\n if (this.#hasDecodedFirstFrame) {\n if (this.#firstFramePresentationPending || this.#hasPresentedFirstFrame) return;\n\n this.#firstFramePresentationPending = true;\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#firstFramePresentationPending = false;\n this.#hasPresentedFirstFrame = true;\n this.#commitVideoReady();\n this.#syncVideoState();\n });\n });\n this.#syncVideoState();\n return;\n }\n\n this.#syncVideoLoading();\n };\n\n if ('requestVideoFrameCallback' in this.#video) {\n this.#video.requestVideoFrameCallback(confirmFirstFrame);\n this.#firstFrameFallbackTimer = window.setTimeout(confirmFirstFrame, 180);\n return;\n }\n\n window.requestAnimationFrame(confirmFirstFrame);\n }\n\n #markVideoReady = () => {\n if (\n this.#video.error ||\n this.#video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA ||\n this.#video.videoWidth <= 0 ||\n this.#video.videoHeight <= 0\n ) {\n this.#syncVideoLoading();\n return false;\n }\n\n if (!this.#hasDecodedFirstFrame) {\n this.#requestFirstVideoFrame();\n this.#syncVideoLoading();\n return false;\n }\n\n const isReady = this.#commitVideoReady();\n this.#syncAudioControlState();\n return isReady;\n };\n\n #isVideoAdvancing() {\n return (\n !this.#video.paused &&\n (!this.#video.ended || this.#video.loop) &&\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA\n );\n }\n\n #syncVisualProgressClock(time = this.#video.currentTime) {\n this.#visualProgressTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#visualProgressUpdatedAt = performance.now();\n }\n\n #clearPausedVisualProgress() {\n this.#pausedVisualProgressTime = null;\n this.#pauseFrozenProgressPercent = null;\n }\n\n #holdPausedVisualProgress() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pausedVisualProgressTime = null;\n return;\n }\n\n const currentTime = Number.isFinite(this.#video.currentTime) ? Math.max(0, this.#video.currentTime) : 0;\n const renderedTime = Number.isFinite(this.#lastRenderedProgressTime) ? this.#lastRenderedProgressTime : currentTime;\n this.#pausedVisualProgressTime = Math.min(this.#video.duration, Math.max(currentTime, renderedTime));\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n }\n\n #freezeRenderedProgressForPause() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pauseFrozenProgressPercent = null;\n this.#holdPausedVisualProgress();\n return;\n }\n\n const rawInset = this.#player.style.getPropertyValue('--sp-progress-inset');\n const inset = Number.parseFloat(rawInset);\n const progressFromFill = Number.isFinite(inset) ? Math.min(1, Math.max(0, 1 - (inset / 100))) : null;\n const visualTime = this.#getVisualProgressTime();\n const progressFromTime = Math.min(1, Math.max(0, visualTime / this.#video.duration));\n const frozenProgress = Math.max(progressFromFill ?? 0, progressFromTime);\n\n this.#pauseFrozenProgressPercent = frozenProgress;\n this.#pausedVisualProgressTime = frozenProgress * this.#video.duration;\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n this.#setProgressVisual(frozenProgress);\n this.#progressTrack.setAttribute('aria-valuenow', `${this.#pausedVisualProgressTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(this.#pausedVisualProgressTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n #getVisualProgressTime() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime || 0;\n if (this.#isScrubPreviewLocked()) return this.#scrubTargetTime;\n if (this.#pausedVisualProgressTime !== null) return this.#pausedVisualProgressTime;\n if (!this.#isVideoAdvancing()) return this.#video.currentTime || 0;\n\n if (this.#isPlaybackBuffering || !this.#hasInitialProgressSettled || performance.now() < this.#initialProgressEstimateUnlockAt) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n if (this.#player.classList.contains('is-loading') && this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n const elapsed = (performance.now() - this.#visualProgressUpdatedAt) / 1000;\n const estimatedTime = this.#visualProgressTime + elapsed;\n const visualTime = this.#video.loop\n ? estimatedTime % this.#video.duration\n : Math.min(estimatedTime, this.#video.duration);\n\n if (!this.#video.loop && this.#video.currentTime - visualTime > 0.45) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime;\n }\n\n return visualTime;\n }\n\n #setProgressVisual(percent: number) {\n const clampedPercent = Math.min(1, Math.max(0, percent));\n const remainingPercent = (1 - clampedPercent) * 100;\n const { innerWidth } = this.#getProgressMetrics();\n const markerEdgePercent = 1 / innerWidth;\n const markerIsFullyOnFill =\n this.#isScrubbing &&\n this.#hasScrubReturnMarker &&\n this.#scrubReturnPercent + markerEdgePercent < clampedPercent;\n\n this.#player.style.setProperty('--sp-progress-inset', `${remainingPercent}%`);\n this.#player.style.setProperty('--sp-return-marker-base-opacity', markerIsFullyOnFill ? '0' : '1');\n\n if (markerIsFullyOnFill) {\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent);\n const maxHoleLeft = Math.max(0, innerWidth - 2);\n const holeLeft = Math.min(maxHoleLeft, Math.max(0, markerX - 3));\n\n this.#player.style.setProperty('--sp-return-marker-hole-left', `${holeLeft}px`);\n } else {\n this.#player.style.setProperty('--sp-return-marker-hole-left', '-9999px');\n }\n }\n\n #getProgressPercentFromTime(time: number) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return 0;\n\n return Math.min(1, Math.max(0, time / this.#video.duration));\n }\n\n #getProgressMetrics(rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressMetrics(rect);\n }\n\n #getProgressXFromPercent(percent: number, rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressXFromPercent(percent, rect);\n }\n\n #getProgressPercentFromClientX(clientX: number, rect: DOMRect) {\n return getProgressPercentFromClientX(clientX, rect);\n }\n\n #setScrubReturnMarker(time: number) {\n this.#scrubReturnTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#scrubReturnPercent = this.#getProgressPercentFromTime(this.#scrubReturnTime);\n const rect = this.#progressTrack.getBoundingClientRect();\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerIsInTrackBody =\n markerX >= this.#scrubReturnMarkerBodyInset &&\n markerX <= Math.max(this.#scrubReturnMarkerBodyInset, rect.width - this.#scrubReturnMarkerBodyInset);\n\n this.#hasScrubReturnMarker = this.#scrubReturnTime > this.#scrubReturnMarkerMinTime && markerIsInTrackBody;\n this.#player.classList.toggle('has-return-marker', this.#hasScrubReturnMarker);\n this.#player.style.setProperty('--sp-return-marker-left', `${markerX}px`);\n }\n\n #getScrubPoint(clientX: number, rect: DOMRect, percent: number, shouldSnap = this.#isScrubbing) {\n const targetTime = percent * this.#video.duration;\n\n if (!shouldSnap || !this.#hasScrubReturnMarker) {\n return { percent, targetTime };\n }\n\n const markerX = rect.left + this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerDistance = Math.abs(clientX - markerX);\n const isInSnapZone = markerDistance <= this.#scrubSnapDistance;\n\n if (!isInSnapZone) {\n return { percent, targetTime };\n }\n\n return {\n percent: this.#scrubReturnPercent,\n targetTime: this.#scrubReturnTime,\n };\n }\n\n #syncPinnedTimeText(time = this.#getVisualProgressTime()) {\n if (!this.#hasPinnedTime || this.#isProgressHoverPreviewing || this.#isScrubPreviewLocked()) return;\n\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(time);\n this.#syncTrayTimeWidth();\n }\n\n #updateProgress(time = this.#getVisualProgressTime()) {\n const hasDuration = Number.isFinite(this.#video.duration) && this.#video.duration > 0;\n if (hasDuration && this.#pauseFrozenProgressPercent !== null) {\n const frozenTime = this.#pauseFrozenProgressPercent * this.#video.duration;\n this.#lastRenderedProgressTime = frozenTime;\n this.#setProgressVisual(this.#pauseFrozenProgressPercent);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', `${this.#video.duration}`);\n this.#progressTrack.setAttribute('aria-valuenow', `${frozenTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(frozenTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n this.#syncPinnedTimeText(frozenTime);\n return;\n }\n\n const renderedTime = hasDuration ? Math.min(this.#video.duration, Math.max(0, time)) : time;\n const progressValue = hasDuration ? renderedTime / this.#video.duration : 0;\n this.#lastRenderedProgressTime = Number.isFinite(renderedTime) ? Math.max(0, renderedTime) : 0;\n this.#setProgressVisual(progressValue);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', hasDuration ? `${this.#video.duration}` : '0');\n this.#progressTrack.setAttribute('aria-valuenow', hasDuration ? `${renderedTime}` : '0');\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n hasDuration ? `${formatVideoTime(renderedTime)} of ${formatVideoTime(this.#video.duration)}` : 'Loading video',\n );\n this.#syncPinnedTimeText(renderedTime);\n }\n\n #previewSeekFromClientX(clientX: number, shouldSnap = this.#isScrubbing, updateVisual = true) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime;\n\n const rect = this.#progressTrack.getBoundingClientRect();\n const percent = this.#getProgressPercentFromClientX(clientX, rect);\n const scrubPoint = this.#getScrubPoint(clientX, rect, percent, shouldSnap);\n\n this.#player.style.setProperty('--sp-hover-fill-inset', `${(1 - percent) * 100}%`);\n\n if (updateVisual) {\n this.#setProgressVisual(scrubPoint.percent);\n }\n\n if (!this.#hasPinnedTime) {\n this.#player.style.setProperty('--sp-scrub-preview-left', `${this.#getProgressXFromPercent(scrubPoint.percent, rect)}px`);\n }\n\n this.#scrubTimeText.textContent = formatVideoTime(scrubPoint.targetTime);\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(scrubPoint.targetTime);\n this.#syncTrayTimeWidth();\n\n if (updateVisual) {\n this.#progressTrack.setAttribute('aria-valuenow', `${scrubPoint.targetTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(scrubPoint.targetTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n this.#syncControlsCollision();\n return scrubPoint.targetTime;\n }\n\n #clearControlsCollision() {\n this.#hasControlsCollision = false;\n this.#player?.classList.remove('has-controls-collision');\n }\n\n #syncControlsCollision() {\n if ((!this.#isScrubbing && !this.#isProgressHoverPreviewing) || !this.#controlTray || !this.#scrubTime || this.#hasPinnedTime) {\n this.#clearControlsCollision();\n return;\n }\n\n const holderRect = this.#controlTray.getBoundingClientRect();\n const timeRect = this.#scrubTime.getBoundingClientRect();\n const holderIsVisible = holderRect.width > 0 && holderRect.height > 0;\n const margin = this.#hasControlsCollision ? this.#controlsCollisionExitMargin : this.#controlsCollisionEnterMargin;\n const timeTouchesHolder =\n holderIsVisible &&\n timeRect.right >= holderRect.left - margin &&\n timeRect.left <= holderRect.right + margin &&\n timeRect.bottom >= holderRect.top - margin &&\n timeRect.top <= holderRect.bottom + margin;\n\n this.#hasControlsCollision = timeTouchesHolder;\n this.#player.classList.toggle('has-controls-collision', this.#hasControlsCollision);\n }\n\n #stopProgressLoop() {\n if (!this.#progressFrame) return;\n window.cancelAnimationFrame(this.#progressFrame);\n this.#progressFrame = 0;\n }\n\n #startProgressLoop() {\n this.#stopProgressLoop();\n this.#syncVisualProgressClock();\n\n const tick = () => {\n this.#updateProgress(this.#getVisualProgressTime());\n if (this.#isVideoAdvancing()) {\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n };\n\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n\n #syncVideoState() {\n const realIsPlaying = (!this.#video.paused && (!this.#video.ended || this.#video.loop)) || (this.#isScrubbing && this.#scrubWasPlaying);\n const isPlaying = this.#optimisticPlaybackState ? this.#optimisticPlaybackState === 'playing' : realIsPlaying;\n this.#player.classList.toggle('is-playing', isPlaying);\n this.#button.setAttribute('aria-label', isPlaying ? 'Pause video' : 'Play video');\n\n if (this.#isScrubbing) {\n this.#stopProgressLoop();\n return;\n }\n\n if (\n realIsPlaying &&\n this.#player.classList.contains('has-loaded-once') &&\n !this.#player.classList.contains('is-progress-settling')\n ) {\n this.#startProgressLoop();\n } else {\n this.#stopProgressLoop();\n this.#updateProgress();\n }\n }\n\n #clearScrubLongPressTimer() {\n if (!this.#scrubLongPressTimer) return;\n window.clearTimeout(this.#scrubLongPressTimer);\n this.#scrubLongPressTimer = 0;\n }\n\n #detectAudioAvailability() {\n return detectAudioAvailability(this.#video);\n }\n\n #isVolumeAvailable() {\n return this.volumeEnabled && this.#hasCheckedAudioTrack && this.#hasAudioTrack;\n }\n\n #clearVolumeInteractionState() {\n this.#clearVolumeCloseTimer();\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#activeVolumePointerId = null;\n this.#volumeControl.classList.remove('is-volume-open', 'is-control-tap-active');\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n }\n\n #syncAudioControlState = () => {\n if (!this.volumeEnabled) {\n this.#player.classList.remove('is-volume-unavailable', 'is-volume-muted', 'is-volume-sound', 'is-volume-icon-animating');\n this.#clearVolumeInteractionState();\n this.#volumeControl.disabled = true;\n this.#volumeControl.setAttribute('aria-disabled', 'true');\n return;\n }\n\n if (!this.#hasCheckedAudioTrack) {\n const audioAvailability = this.#detectAudioAvailability();\n if (audioAvailability !== 'unknown') {\n this.#hasCheckedAudioTrack = true;\n this.#hasAudioTrack = audioAvailability === 'available';\n } else if (\n this.#video.readyState >= HTMLMediaElement.HAVE_METADATA &&\n !isAudioAvailabilityPending(this.#video)\n ) {\n this.#hasCheckedAudioTrack = true;\n this.#hasAudioTrack = true;\n }\n }\n\n const wasVolumeControlHidden = this.#volumeControl.hidden;\n const hasUsableAudio = this.#isVolumeAvailable();\n const isMuted = !hasUsableAudio || this.#video.muted || this.#video.volume <= 0;\n const visualVolume = hasUsableAudio && !this.#video.muted ? this.#video.volume : 0;\n const volumePercent = Math.round(visualVolume * 100);\n const nextIconState = isMuted ? 'muted' : 'sound';\n\n if (this.#volumeIconState && this.#volumeIconState !== nextIconState) {\n this.#animateVolumeIconSwap();\n }\n\n this.#volumeIconState = nextIconState;\n\n this.#player.classList.toggle('is-volume-unavailable', !hasUsableAudio);\n this.#player.classList.toggle('is-volume-muted', isMuted);\n this.#player.classList.toggle('is-volume-sound', !isMuted);\n this.#player.style.setProperty('--sp-volume-level', `${volumePercent}%`);\n this.#volumeControl.disabled = !hasUsableAudio;\n this.#volumeControl.setAttribute('aria-disabled', `${!hasUsableAudio}`);\n this.#volumeControl.setAttribute(\n 'aria-label',\n !hasUsableAudio ? 'Video has no audio' : isMuted ? 'Unmute video' : 'Mute video',\n );\n this.#volumeTrack.setAttribute('aria-valuenow', `${volumePercent}`);\n this.#volumeTrack.setAttribute('aria-valuetext', `${volumePercent}%`);\n\n if (!hasUsableAudio) {\n this.#clearVolumeInteractionState();\n }\n\n if (wasVolumeControlHidden === hasUsableAudio) {\n this.#syncOptionalControls();\n }\n };\n\n #setVolumeFromClientY(clientY: number) {\n if (!this.#isVolumeAvailable()) return;\n const rect = this.#volumeTrack.getBoundingClientRect();\n const percent = Math.min(1, Math.max(0, 1 - ((clientY - rect.top) / rect.height)));\n const rounded = Math.round(percent * 100) / 100;\n this.#video.volume = rounded;\n this.#video.muted = rounded <= 0;\n this.#syncAudioControlState();\n }\n\n #releaseVolumePointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#volumeTrack.hasPointerCapture(pointerId)) {\n this.#volumeTrack.releasePointerCapture(pointerId);\n }\n }\n\n #finishVolumeScrub(pointerId: number | null) {\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#volumeTrack.blur();\n this.#releaseVolumePointer(pointerId);\n this.#scheduleVolumePopoverClose(260);\n }\n\n #syncPictureInPictureState = () => {\n const isActive = document.pictureInPictureElement === this.#video;\n const video = this.#video as HTMLVideoElement & { requestPictureInPicture?: () => Promise<PictureInPictureWindow> };\n const isSupported = Boolean(this.pictureInPictureEnabled && document.pictureInPictureEnabled && video.requestPictureInPicture);\n this.#player.classList.toggle('is-picture-in-picture', isActive);\n this.#pictureInPictureControl.disabled = !isSupported;\n this.#pictureInPictureControl.setAttribute('aria-label', isActive ? 'Exit picture in picture' : 'Enter picture in picture');\n };\n\n #getFullscreenElement() {\n return getFullscreenElement(this.#root);\n }\n\n #isFullscreenSupported() {\n return isFullscreenSupported(this.fullscreenEnabled, this.#player, this.#video);\n }\n\n #requestPlayerFullscreen() {\n return requestPlayerFullscreen(this.#player);\n }\n\n #requestVideoFullscreen() {\n requestVideoFullscreen(this.#video);\n }\n\n #exitFullscreen() {\n return exitFullscreen();\n }\n\n #syncFullscreenState = () => {\n const fullscreenElement = this.#getFullscreenElement();\n const isActive = fullscreenElement === this.#player || fullscreenElement === this;\n const isSupported = this.#isFullscreenSupported();\n this.#player.classList.toggle('is-fullscreen', isActive);\n this.#fullscreenControl.disabled = !isSupported;\n this.#fullscreenControl.setAttribute('aria-label', isActive ? 'Exit fullscreen' : 'Enter fullscreen');\n return isActive;\n };\n\n #handleFullscreenChange = () => {\n const isFullscreenActive = this.#syncFullscreenState();\n this.#resetFullscreenPointerState(isFullscreenActive);\n };\n\n #resetFullscreenPointerState(isFullscreenActive: boolean) {\n this.#clearControlsHideTimer();\n this.#clearVolumeCloseTimer();\n this.#releaseScrubPointer(this.#activeScrubPointerId);\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#isPointerOverControlSurface = false;\n this.#isVolumeHovering = false;\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#clearControlTapTimer();\n this.#clearControlTapActive();\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.#volumeControl.classList.remove('is-volume-open');\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#player.classList.remove('is-scrubbing');\n this.#player.classList.remove('is-pointer-active');\n\n const activeElement = this.#root.activeElement;\n if (activeElement instanceof HTMLElement) {\n activeElement.blur();\n }\n\n if (isFullscreenActive) {\n this.#syncPointerControlsFromLastPosition();\n } else {\n this.#hidePointerControls();\n }\n }\n\n #enterScrubMode = () => {\n if (!this.#isTrackingScrub || this.#isScrubbing) return;\n\n this.#clearPausedVisualProgress();\n this.#clearControlsHideTimer();\n this.#clearScrubLongPressTimer();\n this.#isScrubbing = true;\n this.#player.classList.add('is-scrubbing');\n this.#scrubTargetTime = this.#previewSeekFromClientX(this.#scrubStartX, true);\n if (this.#scrubWasPlaying) this.#video.pause();\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n this.#updateProgress(this.#scrubTargetTime);\n this.#stopProgressLoop();\n this.#syncVideoState();\n };\n\n #releaseScrubPointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#progressTrack.hasPointerCapture(pointerId)) {\n this.#progressTrack.releasePointerCapture(pointerId);\n }\n }\n\n async #finishScrub(clientX: number | null, pointerId: number | null, shouldCommit: boolean) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n const wasDragging = this.#isScrubbing;\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#player.style.setProperty('--sp-hover-fill-inset', '100%');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n\n if (shouldCommit && clientX !== null) {\n this.#clearPausedVisualProgress();\n this.#scrubTargetTime = this.#previewSeekFromClientX(clientX, wasDragging);\n this.#isCommittedScrubPending = true;\n this.#committedScrubWasPlaying = this.#scrubWasPlaying;\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n }\n\n this.#updateProgress(this.#scrubTargetTime);\n\n if (wasDragging && this.#scrubWasPlaying) {\n await this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #cancelScrub(pointerId: number | null) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#player.style.setProperty('--sp-hover-fill-inset', '100%');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n this.#syncVisualProgressClock();\n this.#updateProgress();\n\n if (this.#scrubWasPlaying) {\n void this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #formatTimeForDisplay(time: number) {\n if (!this.#showRemainingTime) return formatVideoTime(time);\n const duration = Number.isFinite(this.#video.duration) ? this.#video.duration : 0;\n if (duration <= 0) return formatVideoTime(time);\n return `-${formatVideoTime(Math.max(0, duration - time))}`;\n }\n\n #clearTimeAnimationTimer() {\n if (!this.#timeAnimationTimer) return;\n window.clearTimeout(this.#timeAnimationTimer);\n this.#timeAnimationTimer = 0;\n }\n\n #animateTimeSwap() {\n this.#clearTimeAnimationTimer();\n this.#trayTimeText.classList.remove('is-time-animating');\n void this.#trayTimeText.offsetWidth;\n this.#trayTimeText.classList.add('is-time-animating');\n this.#timeAnimationTimer = window.setTimeout(() => {\n this.#timeAnimationTimer = 0;\n this.#trayTimeText.classList.remove('is-time-animating');\n }, 240);\n }\n\n #handleTimeToggleClick = (event: Event) => {\n event.stopPropagation();\n this.#showRemainingTime = !this.#showRemainingTime;\n this.#animateTimeSwap();\n if (this.#isScrubPreviewLocked() || this.#isProgressHoverPreviewing) {\n if (this.#trayTimeText) {\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(this.#scrubTargetTime);\n this.#syncTrayTimeWidth();\n }\n } else {\n this.#syncPinnedTimeText(this.#getVisualProgressTime());\n }\n };\n\n #handleButtonClick = async () => {\n if (performance.now() < this.#suppressTouchButtonClickUntil) {\n return;\n }\n\n const shouldPlay = this.#optimisticPlaybackState\n ? this.#optimisticPlaybackState !== 'playing'\n : this.#video.paused || this.#video.ended;\n const shouldFlipImmediately = !shouldPlay || this.#canStartImmediately();\n\n this.#showTouchControls();\n\n if (shouldFlipImmediately) {\n this.#optimisticPlaybackState = shouldPlay ? 'playing' : 'paused';\n this.#syncVideoState();\n }\n\n if (shouldPlay) {\n this.#clearPausedVisualProgress();\n await this.#hydrateVideoSource();\n await this.#video.play().catch(() => {\n this.#optimisticPlaybackState = null;\n });\n } else {\n this.#freezeRenderedProgressForPause();\n this.#video.pause();\n }\n\n this.#syncVideoState();\n this.#scheduleTouchControlsHide();\n };\n\n #handlePlayerPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n\n const buttonRect = this.#button.getBoundingClientRect();\n const isInsideButton =\n event.clientX >= buttonRect.left &&\n event.clientX <= buttonRect.right &&\n event.clientY >= buttonRect.top &&\n event.clientY <= buttonRect.bottom;\n const controlTrayRect = this.#controlTray.getBoundingClientRect();\n const isInsideControlTray =\n event.clientX >= controlTrayRect.left &&\n event.clientX <= controlTrayRect.right &&\n event.clientY >= controlTrayRect.top &&\n event.clientY <= controlTrayRect.bottom;\n const progressRect = this.#progressTrack.getBoundingClientRect();\n const isInsideProgress =\n event.clientX >= progressRect.left &&\n event.clientX <= progressRect.right &&\n event.clientY >= progressRect.top &&\n event.clientY <= progressRect.bottom;\n const didRevealControls = this.#showTouchControls();\n\n if (didRevealControls && isInsideButton) {\n this.#suppressTouchButtonClickUntil = performance.now() + 260;\n }\n\n if (didRevealControls && (isInsideControlTray || isInsideProgress)) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n\n void this.#hydrateVideoSource();\n };\n\n #preventVolumeTrackClick = (event: Event) => {\n event.stopPropagation();\n };\n\n #clearVolumeCloseTimer() {\n if (!this.#volumeCloseTimer) return;\n window.clearTimeout(this.#volumeCloseTimer);\n this.#volumeCloseTimer = 0;\n }\n\n #openVolumePopover() {\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#clearVolumeCloseTimer();\n this.#volumeControl.classList.add('is-volume-open');\n }\n\n #closeVolumePopover = () => {\n this.#volumeCloseTimer = 0;\n if (this.#isVolumeHovering || this.#isVolumeScrubbing) return;\n this.#volumeControl.classList.remove('is-volume-open');\n };\n\n #scheduleVolumePopoverClose(delay = 150) {\n this.#clearVolumeCloseTimer();\n this.#volumeCloseTimer = window.setTimeout(this.#closeVolumePopover, delay);\n }\n\n #handleVolumePointerEnter = () => {\n if (this.#isTouchControls()) return;\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#isVolumeHovering = true;\n this.#openVolumePopover();\n };\n\n #handleVolumePointerLeave = () => {\n if (this.#isTouchControls()) return;\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#isVolumeHovering = false;\n this.#scheduleVolumePopoverClose();\n };\n\n #handleVolumeControlClick = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!this.#isVolumeAvailable()) {\n this.#clearVolumeInteractionState();\n return;\n }\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n this.#closeVolumePopover();\n if (this.#video.muted || this.#video.volume <= 0) {\n if (this.#video.volume <= 0) this.#video.volume = 0.7;\n this.#video.muted = false;\n } else {\n this.#video.muted = true;\n }\n\n this.#syncAudioControlState();\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled || this.#isTouchControls()) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#openVolumePopover();\n this.#isVolumeScrubbing = true;\n this.#activeVolumePointerId = event.pointerId;\n this.#volumePopover.classList.add('is-scrubbing-volume');\n this.#volumeTrack.setPointerCapture(event.pointerId);\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isVolumeScrubbing) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.preventDefault();\n event.stopPropagation();\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n };\n\n #handleVolumeKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (!this.#isVolumeAvailable()) {\n event.preventDefault();\n event.stopPropagation();\n this.#clearVolumeInteractionState();\n return;\n }\n if (!['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n const step = event.shiftKey ? 0.1 : 0.05;\n const nextVolume =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? 1\n : this.#video.volume + (event.key === 'ArrowUp' ? step : -step);\n this.#video.volume = Math.min(1, Math.max(0, nextVolume));\n this.#video.muted = this.#video.volume <= 0;\n this.#syncAudioControlState();\n };\n\n #handlePictureInPictureClick = async () => {\n const video = this.#video as HTMLVideoElement & {\n requestPictureInPicture?: () => Promise<PictureInPictureWindow>;\n };\n\n if (!this.pictureInPictureEnabled || !document.pictureInPictureEnabled || !video.requestPictureInPicture) return;\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n\n try {\n await this.#hydrateVideoSource();\n if (document.pictureInPictureElement === this.#video) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch {\n // Picture-in-Picture can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncPictureInPictureState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleFullscreenClick = async (event: Event) => {\n if (!this.#isFullscreenSupported()) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#trackPointerPosition(event);\n this.#showTouchControls();\n\n try {\n const fullscreenElement = this.#getFullscreenElement();\n if (fullscreenElement === this.#player || fullscreenElement === this) {\n await this.#exitFullscreen();\n } else {\n await this.#hydrateVideoSource();\n if (canRequestPlayerFullscreen(this.#player)) {\n await this.#requestPlayerFullscreen();\n } else {\n this.#requestVideoFullscreen();\n }\n }\n } catch {\n // Fullscreen can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncFullscreenState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleProgressPointerEnter = (event: Event) => {\n if (this.#isTouchControls() || this.#isScrubPreviewLocked()) return;\n if (!(event instanceof PointerEvent) && !(event instanceof MouseEvent)) return;\n\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n };\n\n #handleProgressPointerLeave = () => {\n if (this.#isScrubPreviewLocked()) return;\n\n this.#clearProgressHoverPreview();\n };\n\n #handleProgressPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n event.preventDefault();\n\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) {\n this.#showTouchControls();\n if (this.#isTouchControls()) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n return;\n }\n\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#finishInitialProgressSettle();\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#setScrubReturnMarker(this.#getVisualProgressTime());\n this.#isTrackingScrub = true;\n this.#activeScrubPointerId = event.pointerId;\n this.#scrubStartX = event.clientX;\n this.#scrubWasPlaying = !this.#video.paused && !this.#video.ended;\n this.#progressTrack.setPointerCapture(event.pointerId);\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX, false);\n this.#clearScrubLongPressTimer();\n this.#scrubLongPressTimer = window.setTimeout(this.#enterScrubMode, this.#scrubLongPressDelay);\n };\n\n #handleProgressKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.#handleControlSurfaceFocusIn();\n\n const baseTime = this.#getVisualProgressTime();\n const smallStep = event.shiftKey ? 10 : 5;\n const largeStep = Math.max(10, this.#video.duration * 0.1);\n const nextTime =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? this.#video.duration\n : event.key === 'PageUp'\n ? baseTime + largeStep\n : event.key === 'PageDown'\n ? baseTime - largeStep\n : baseTime + (event.key === 'ArrowRight' ? smallStep : -smallStep);\n\n this.#video.currentTime = Math.min(this.#video.duration, Math.max(0, nextTime));\n this.#syncVisualProgressClock(this.#video.currentTime);\n this.#updateProgress(this.#video.currentTime);\n };\n\n #handleProgressPointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isTrackingScrub) {\n if (!this.#isTouchControls()) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n }\n return;\n }\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n\n if (!this.#isScrubbing && Math.abs(event.clientX - this.#scrubStartX) >= this.#scrubDragThreshold) {\n this.#enterScrubMode();\n }\n\n if (!this.#isScrubbing) return;\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX);\n };\n\n #handleProgressPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleProgressPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleDocumentPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleDocumentPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleWindowBlur = () => {\n this.#finishVolumeScrub(this.#activeVolumePointerId);\n this.#cancelScrub(this.#activeScrubPointerId);\n };\n\n #handleWindowFocus = () => {\n if (this.#getFullscreenElement()) return;\n this.#hidePointerControls();\n };\n\n #handleVideoPlay = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoPause = () => {\n this.#optimisticPlaybackState = null;\n if (!this.#isScrubPreviewLocked()) this.#holdPausedVisualProgress();\n this.#syncVideoLoading();\n this.#syncVideoState();\n };\n\n #handleVideoEnded = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoLoadStart = () => {\n this.#setVideoLoading(true, true);\n };\n\n #handleVideoWaiting = () => {\n this.#setVideoLoading(true);\n };\n\n #handleVideoLoadedMetadata = () => {\n this.#clearPausedVisualProgress();\n this.#syncAudioControlState();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoLoading();\n this.#updateProgress();\n };\n\n #handleVideoPlaying = () => {\n const isReady = this.#markVideoReady();\n this.#syncAudioControlState();\n if (isReady && !this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoSeeked = () => {\n this.#clearPausedVisualProgress();\n this.#syncVideoLoading();\n if (\n this.#isCommittedScrubPending &&\n (!this.#committedScrubWasPlaying || this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA)\n ) {\n this.#clearCommittedScrubPreview();\n this.#syncVideoState();\n return;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n };\n\n #handleVideoError = () => {\n this.#optimisticPlaybackState = null;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#setVideoLoading(true, true);\n this.#syncVideoState();\n this.#retryVideoLoad();\n };\n\n #handleVideoTimeUpdate = () => {\n this.#syncAudioControlState();\n this.#updateProgress();\n };\n\n #handleVideoVolumeChange = () => {\n this.#syncAudioControlState();\n };\n\n #isTouchControls() {\n return (\n window.matchMedia('(max-width: 768px)').matches &&\n window.matchMedia('(hover: none), (pointer: coarse)').matches\n );\n }\n\n #resetSource() {\n if (!this.#video) return;\n this.#observer?.disconnect();\n this.#observer = null;\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#videoSourceLoaded = false;\n this.#videoLoadAttempt = 0;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#hasInitialProgressSettled = false;\n this.#lastRenderedProgressTime = 0;\n this.#clearPausedVisualProgress();\n this.#hasAudioTrack = false;\n this.#hasCheckedAudioTrack = false;\n this.#clearVolumeInteractionState();\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#optimisticPlaybackState = null;\n this.#player.classList.remove('has-loaded-once', 'has-visible-frame', 'is-progress-settling');\n this.#video.dataset.src = this.src;\n this.#video.pause();\n this.#video.removeAttribute('src');\n this.#video.preload = 'none';\n this.#syncAutoplayState();\n this.#video.load();\n this.#setProgressVisual(0);\n this.#syncAudioControlState();\n this.#syncVideoLoading();\n this.#syncVideoState();\n }\n}\n","import { SimplePlayer } from './player/simple-player-element';\n\nexport { SimplePlayer } from './player/simple-player-element';\n\nif (!customElements.get('simple-player')) {\n customElements.define('simple-player', SimplePlayer);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'simple-player': SimplePlayer;\n }\n}\n"],"names":["DEFAULT_ASPECT_RATIO","DEFAULT_PRELOAD_MARGIN","OBSERVED_ATTRIBUTES","getFullscreenElement","root","fullscreenDocument","isFullscreenSupported","fullscreenEnabled","player","video","fullscreenPlayer","fullscreenVideo","canFullscreenPlayer","canFullscreenVideo","requestPlayerFullscreen","requestFullscreen","canRequestPlayerFullscreen","requestVideoFullscreen","exitFullscreen","formatVideoTime","time","totalSeconds","seconds","totalMinutes","minutes","hours","detectAudioAvailability","audioTrackVideo","firefoxVideo","streamVideo","captureStream","webkitVideo","isAudioAvailabilityPending","getProgressMetrics","rect","sideInset","innerWidth","getProgressXFromPercent","percent","clampedPercent","getProgressPercentFromClientX","clientX","styles","template","SimplePlayer","#root","#cleanup","#observer","#initialized","#videoSourceLoaded","#player","#video","#button","#progressTrack","#controlTray","#controlTraySlots","#trayTime","#trayTimeText","#scrubTime","#scrubTimeText","#volumeControl","#volumePopover","#volumeTrack","#pictureInPictureControl","#fullscreenControl","#controlButtons","#progressFrame","#isScrubbing","#isTrackingScrub","#scrubWasPlaying","#scrubTargetTime","#scrubReturnTime","#scrubReturnPercent","#hasScrubReturnMarker","#isCommittedScrubPending","#committedScrubWasPlaying","#scrubStartX","#scrubLongPressTimer","#activeScrubPointerId","#optimisticPlaybackState","#videoLoadAttempt","#videoRetryTimer","#controlsHideTimer","#loadingStateTimer","#initialProgressSettleTimer","#suppressTouchButtonClickUntil","#suppressTouchControlClickUntil","#timeWidthObserver","#hasDecodedFirstFrame","#hasPresentedFirstFrame","#firstFrameRequestPending","#firstFramePresentationPending","#firstFrameRequestToken","#firstFrameFallbackTimer","#hasInitialProgressSettled","#initialProgressEstimateUnlockAt","#isPlaybackBuffering","#visualProgressTime","#visualProgressUpdatedAt","#lastRenderedProgressTime","#pausedVisualProgressTime","#pauseFrozenProgressPercent","#hasControlsCollision","#isProgressHoverPreviewing","#hasAudioTrack","#hasCheckedAudioTrack","#isPointerOverControlSurface","#lastPointerClientX","#lastPointerClientY","#lastPointerWasTouch","#isVolumeScrubbing","#isVolumeHovering","#activeVolumePointerId","#volumeCloseTimer","#volumeIconAnimationTimer","#controlTapTimer","#volumeIconState","#showRemainingTime","#timeAnimationTimer","#scrubDragThreshold","#scrubSnapDistance","#scrubReturnMarkerBodyInset","#scrubReturnMarkerMinTime","#scrubLongPressDelay","#controlsAutoHideDelay","#pointerControlsIdleDelay","#loadingStateDelay","#initialProgressSettleDelay","#initialProgressEstimateHold","#videoRetryDelay","#maxVideoLoadAttempts","#bufferedAheadTarget","#bufferedRangeFuzz","#controlsCollisionEnterMargin","#controlsCollisionExitMargin","value","#setStringAttribute","#setOptionalControlAttributes","#syncAspectRatio","#bindEvents","#syncAutoplayState","#setupLazyLoading","#syncOptionalControls","#syncTimeVisibility","#syncVideoLoading","#syncAudioControlState","#syncPictureInPictureState","#syncFullscreenState","#syncVideoState","cleanup","#clearControlsHideTimer","#clearLoadingStateTimer","#clearVideoRetryTimer","#clearInitialProgressSettleTimer","#clearScrubLongPressTimer","#clearFirstFrameFallbackTimer","#clearVolumeCloseTimer","#clearVolumeIconAnimationTimer","#clearControlTapTimer","#clearControlsCollision","button","#stopProgressLoop","name","oldValue","newValue","#resetSource","enabled","isEnabled","hasVolumeControl","#isVolumeAvailable","controls","index","control","#closeVolumePopover","#releaseVolumePointer","#hasPinnedTime","#syncPinnedTimeText","#listen","#handleButtonClick","#handlePlayerPointerEnter","#handlePlayerPointerMove","#handlePlayerPointerLeave","#handleControlSurfacePointerEnter","#handleControlSurfacePointerLeave","#handleProgressPointerEnter","#handleProgressPointerLeave","#handleControlSurfaceFocusIn","#handleControlSurfaceFocusOut","#handlePlayerPointerDown","#preventNativeVideoAction","#handleProgressPointerDown","#handleProgressPointerMove","#handleProgressPointerUp","#handleProgressPointerCancel","#handleProgressKeyDown","#handleVolumePointerEnter","#handleVolumePointerLeave","#handleVolumeControlClick","#handleVolumePointerDown","#handleVolumePointerMove","#handleVolumePointerUp","#handleVolumePointerCancel","#preventVolumeTrackClick","#handleVolumeKeyDown","#handlePictureInPictureClick","#handleFullscreenClick","#handleTimeToggleClick","#handleControlButtonPointerEnter","#handleControlButtonPointerDown","#syncTrayTimeWidth","#handleDocumentPointerUp","#handleDocumentPointerCancel","#handleDocumentPointerMove","#handleFullscreenChange","#handleWindowBlur","#handleWindowFocus","#handleVideoPlay","#handleVideoPause","#handleVideoEnded","#handleVideoLoadStart","#handleVideoWaiting","#markVideoReady","#handleVideoLoadedMetadata","#handleVideoPlaying","#handleVideoSeeked","#handleVideoError","#handleVideoTimeUpdate","#handleVideoVolumeChange","width","target","type","listener","entries","observer","entry","#hydrateVideoSource","event","#hideControls","#isTouchControls","#scheduleControlsHide","delay","#scheduleTouchControlsHide","#showTouchControls","wasVisible","#showPointerControls","forcePointer","#hidePointerControls","#trackPointerPosition","#isPointInsidePlayer","clientY","#isPointInsideElement","element","#clearProgressHoverPreview","#syncHoverTargetsFromPointer","#isScrubPreviewLocked","#previewSeekFromClientX","hoveredControl","#isUnavailableControlButton","#areControlsVisible","#shouldSuppressControlAction","#syncPointerControlsFromLastPosition","#clearControlTapActive","#animateVolumeIconSwap","#finishInitialProgressSettle","#syncVisualProgressClock","#updateProgress","#queueInitialProgressSettle","#setProgressVisual","source","#isLoopBoundaryBlip","#getBufferedAhead","currentTime","start","end","#hasBufferedAhead","remainingDuration","requiredBuffer","#setVideoLoading","isLoading","immediate","shouldLoad","shouldShowLoading","#canStartImmediately","#retryVideoLoad","#clearCommittedScrubPreview","#commitVideoReady","#requestFirstVideoFrame","requestToken","confirmFirstFrame","isReady","#isVideoAdvancing","#clearPausedVisualProgress","#holdPausedVisualProgress","renderedTime","#freezeRenderedProgressForPause","rawInset","inset","progressFromFill","visualTime","#getVisualProgressTime","progressFromTime","frozenProgress","elapsed","estimatedTime","remainingPercent","#getProgressMetrics","markerEdgePercent","markerIsFullyOnFill","markerX","#getProgressXFromPercent","maxHoleLeft","holeLeft","#getProgressPercentFromTime","#getProgressPercentFromClientX","#setScrubReturnMarker","markerIsInTrackBody","#getScrubPoint","shouldSnap","targetTime","#formatTimeForDisplay","hasDuration","frozenTime","progressValue","updateVisual","scrubPoint","#syncControlsCollision","holderRect","timeRect","holderIsVisible","margin","timeTouchesHolder","#startProgressLoop","tick","realIsPlaying","isPlaying","#detectAudioAvailability","#clearVolumeInteractionState","audioAvailability","wasVolumeControlHidden","hasUsableAudio","isMuted","visualVolume","volumePercent","nextIconState","#setVolumeFromClientY","rounded","pointerId","#finishVolumeScrub","#scheduleVolumePopoverClose","isActive","isSupported","#getFullscreenElement","#isFullscreenSupported","#requestPlayerFullscreen","#requestVideoFullscreen","#exitFullscreen","fullscreenElement","isFullscreenActive","#resetFullscreenPointerState","#releaseScrubPointer","activeElement","#enterScrubMode","#finishScrub","shouldCommit","wasDragging","#cancelScrub","duration","#clearTimeAnimationTimer","#animateTimeSwap","shouldPlay","shouldFlipImmediately","buttonRect","isInsideButton","controlTrayRect","isInsideControlTray","progressRect","isInsideProgress","didRevealControls","#openVolumePopover","step","nextVolume","baseTime","smallStep","largeStep","nextTime"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCF3C2C,IAAW,SAAS,cAAc,UAAU;AACzDA,EAAS,YAAY;AAAA,WACVD,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACUV,MAAME,UAAqB,YAAY;AAAA,EAC5C,OAAO,qBAAqB1C;AAAA,EAE5B2C;AAAA,EACAC,MAAsB,CAAA;AAAA,EACtBC,KAAyC;AAAA,EACzCC,MAAe;AAAA,EACfC,KAAqB;AAAA,EACrBC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC,KAAuC,CAAA;AAAA,EAEvCC,MAAiB;AAAA,EACjBC,KAAe;AAAA,EACfC,KAAmB;AAAA,EACnBC,KAAmB;AAAA,EACnBC,KAAmB;AAAA,EACnBC,MAAmB;AAAA,EACnBC,KAAsB;AAAA,EACtBC,MAAwB;AAAA,EACxBC,KAA2B;AAAA,EAC3BC,MAA4B;AAAA,EAC5BC,MAAe;AAAA,EACfC,MAAuB;AAAA,EACvBC,KAAuC;AAAA,EACvCC,KAA0C;AAAA,EAC1CC,MAAoB;AAAA,EACpBC,KAAmB;AAAA,EACnBC,MAAqB;AAAA,EACrBC,MAAqB;AAAA,EACrBC,MAA8B;AAAA,EAC9BC,MAAiC;AAAA,EACjCC,MAAkC;AAAA,EAClCC,MAA4C;AAAA,EAC5CC,KAAwB;AAAA,EACxBC,KAA0B;AAAA,EAC1BC,KAA4B;AAAA,EAC5BC,KAAiC;AAAA,EACjCC,KAA0B;AAAA,EAC1BC,MAA2B;AAAA,EAC3BC,MAA6B;AAAA,EAC7BC,MAAmC;AAAA,EACnCC,MAAuB;AAAA,EACvBC,MAAsB;AAAA,EACtBC,MAA2B,YAAY,IAAA;AAAA,EACvCC,MAA4B;AAAA,EAC5BC,KAA2C;AAAA,EAC3CC,MAA6C;AAAA,EAC7CC,MAAwB;AAAA,EACxBC,KAA6B;AAAA,EAC7BC,MAAiB;AAAA,EACjBC,MAAwB;AAAA,EACxBC,KAA+B;AAAA,EAC/BC,MAAqC;AAAA,EACrCC,MAAqC;AAAA,EACrCC,MAAuB;AAAA,EACvBC,KAAqB;AAAA,EACrBC,KAAoB;AAAA,EACpBC,KAAwC;AAAA,EACxCC,MAAoB;AAAA,EACpBC,MAA4B;AAAA,EAC5BC,MAAmB;AAAA,EACnBC,MAA6C;AAAA,EAC7CC,MAAqB;AAAA,EACrBC,MAAsB;AAAA,EAEbC,MAAsB;AAAA,EACtBC,MAAqB;AAAA,EACrBC,MAA8B;AAAA,EAC9BC,MAA4B;AAAA,EAC5BC,MAAuB;AAAA,EACvBC,MAAyB;AAAA,EACzBC,MAA4B;AAAA,EAC5BC,MAAqB;AAAA,EACrBC,MAA8B;AAAA,EAC9BC,MAA+B;AAAA,EAC/BC,MAAmB;AAAA,EACnBC,MAAwB;AAAA,EACxBC,MAAuB;AAAA,EACvBC,MAAqB;AAAA,EACrBC,MAAgC;AAAA,EAChCC,MAA+B;AAAA,EAExC,cAAc;AACZ,UAAA,GACA,KAAKzF,KAAQ,KAAK,aAAa,EAAE,MAAM,QAAQ,GAC/C,KAAKA,GAAM,OAAOF,EAAS,QAAQ,UAAU,EAAI,CAAC;AAAA,EACpD;AAAA,EAEA,IAAI,MAAM;AACR,WAAO,KAAK,aAAa,KAAK,KAAK;AAAA,EACrC;AAAA,EAEA,IAAI,IAAI4F,GAAe;AACrB,SAAKC,IAAoB,OAAOD,CAAK;AAAA,EACvC;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,aAAa,cAAc,KAAKvI;AAAA,EAC9C;AAAA,EAEA,IAAI,YAAYuI,GAAe;AAC7B,SAAKC,IAAoB,gBAAgBD,CAAK;AAAA,EAChD;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,aAAa,gBAAgB,KAAKtI;AAAA,EAChD;AAAA,EAEA,IAAI,cAAcsI,GAAe;AAC/B,SAAKC,IAAoB,kBAAkBD,CAAK;AAAA,EAClD;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,CAAC,KAAK,aAAa,kBAAkB,KAAK,CAAC,KAAK,aAAa,aAAa;AAAA,EACnF;AAAA,EAEA,IAAI,gBAAgBA,GAAgB;AAClC,QAAIA,GAAO;AACT,WAAK,gBAAgB,kBAAkB,GACvC,KAAK,gBAAgB,aAAa;AAClC;AAAA,IACF;AAEA,SAAK,aAAa,oBAAoB,EAAE;AAAA,EAC1C;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,aAAa,UAAU;AAAA,EACrC;AAAA,EAEA,IAAI,gBAAgBA,GAAgB;AAClC,QAAIA,GAAO;AACT,WAAK,aAAa,YAAY,EAAE;AAChC;AAAA,IACF;AAEA,SAAK,gBAAgB,UAAU;AAAA,EACjC;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,aAAa,WAAW;AAAA,EACtC;AAAA,EAEA,IAAI,YAAYA,GAAgB;AAC9B,QAAIA,GAAO;AACT,WAAK,aAAa,aAAa,EAAE;AACjC;AAAA,IACF;AAEA,SAAK,gBAAgB,WAAW;AAAA,EAClC;AAAA,EAEA,IAAI,gBAAgB;AAClB,WACE,KAAK,mBACL,CAAC,KAAK,aAAa,gBAAgB,KACnC,CAAC,KAAK,aAAa,WAAW;AAAA,EAElC;AAAA,EAEA,IAAI,cAAcA,GAAgB;AAChC,SAAKE,IAA8B,UAAUF,CAAK;AAAA,EACpD;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,CAAC,KAAK,aAAa,uBAAuB,KAAK,CAAC,KAAK,aAAa,kBAAkB;AAAA,EAC7F;AAAA,EAEA,IAAI,oBAAoBA,GAAgB;AACtC,QAAIA,GAAO;AACT,WAAK,gBAAgB,uBAAuB,GAC5C,KAAK,gBAAgB,kBAAkB;AACvC;AAAA,IACF;AAEA,SAAK,aAAa,yBAAyB,EAAE;AAAA,EAC/C;AAAA,EAEA,IAAI,0BAA0B;AAC5B,WACE,KAAK,mBACL,CAAC,KAAK,aAAa,4BAA4B,KAC/C,CAAC,KAAK,aAAa,uBAAuB;AAAA,EAE9C;AAAA,EAEA,IAAI,wBAAwBA,GAAgB;AAC1C,SAAKE,IAA8B,sBAAsBF,CAAK;AAAA,EAChE;AAAA,EAEA,IAAI,oBAAoB;AACtB,WACE,KAAK,mBACL,CAAC,KAAK,aAAa,oBAAoB,KACvC,CAAC,KAAK,aAAa,eAAe;AAAA,EAEtC;AAAA,EAEA,IAAI,kBAAkBA,GAAgB;AACpC,SAAKE,IAA8B,cAAcF,CAAK;AAAA,EACxD;AAAA,EAEA,oBAAoB;AAClB,SAAKrF,KAAU,KAAKL,GAAM,cAAc,kBAAkB,GAC1D,KAAKM,KAAS,KAAKN,GAAM,cAAc,iBAAiB,GACxD,KAAKO,KAAU,KAAKP,GAAM,cAAc,kBAAkB,GAC1D,KAAKQ,KAAiB,KAAKR,GAAM,cAAc,0BAA0B,GACzE,KAAKS,KAAe,KAAKT,GAAM,cAAc,wBAAwB,GACrE,KAAKU,KAAoB,KAAKV,GAAM,cAAc,8BAA8B,GAChF,KAAKW,MAAY,KAAKX,GAAM,cAAc,qBAAqB,GAC/D,KAAKY,KAAgB,KAAKZ,GAAM,cAAc,0BAA0B,GACxE,KAAKa,MAAa,KAAKb,GAAM,cAAc,gBAAgB,GAC3D,KAAKc,MAAiB,KAAKd,GAAM,cAAc,qBAAqB,GACpE,KAAKe,KAAiB,KAAKf,GAAM,cAAc,0BAA0B,GACzE,KAAKgB,KAAiB,KAAKhB,GAAM,cAAc,0BAA0B,GACzE,KAAKiB,KAAe,KAAKjB,GAAM,cAAc,wBAAwB,GACrE,KAAKkB,KAA2B,KAAKlB,GAAM,cAAc,sCAAsC,GAC/F,KAAKmB,KAAqB,KAAKnB,GAAM,cAAc,8BAA8B,GACjF,KAAKoB,KAAkB,CAAC,KAAKL,IAAgB,KAAKG,IAA0B,KAAKC,EAAkB,GACnG,KAAK0E,IAAA,GAEA,KAAK1F,QACR,KAAK2F,IAAA,GACL,KAAK3F,MAAe,KAGtB,KAAK4F,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,GAAA,GACL,KAAKC,GAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,GAAA;AAAA,EACP;AAAA,EAEA,uBAAuB;AACrB,SAAKrG,IAAW,WAAA,GAChB,KAAKA,KAAY,MACjB,KAAKD,IAAS,QAAQ,CAACuG,MAAYA,GAAS,GAC5C,KAAKvG,MAAW,CAAA,GAChB,KAAKE,MAAe,IACpB,KAAKsG,GAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAK5G,GAAQ,UAAU,OAAO,0BAA0B,GACxD,KAAKK,GAAkB,MAAM,eAAe,2BAA2B,GACvE,KAAK,MAAM,eAAe,iCAAiC,GAC3D,KAAKwG,IAAA,GACL,KAAKxD,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,OAAO,sBAAsB,GACpD,KAAK4D,KAAqB,IAC1B,KAAKC,KAAoB,IACzB,KAAKL,KAA+B,IACpC,KAAKM,KAAyB,MAC9B,KAAKpD,GAAe,UAAU,OAAO,gBAAgB,GACrD,KAAKK,GAAgB,QAAQ,CAAC+F,MAAWA,EAAO,UAAU,OAAO,uBAAuB,CAAC,GACzF,KAAK9G,GAAQ,UAAU,OAAO,mBAAmB,GACjD,KAAK+G,IAAA;AAAA,EACP;AAAA,EAEA,yBAAyBC,GAAcC,GAAyBC,GAAyB;AACvF,QAAID,MAAaC,GAEjB;AAAA,UAAIF,MAAS,gBAAgB;AAC3B,aAAKxB,IAAA;AACL;AAAA,MACF;AAEA,UAAIwB,MAAS,oBAAoB,KAAK,aAAa;AACjD,aAAKnH,IAAW,WAAA,GAChB,KAAK8F,IAAA;AACL;AAAA,MACF;AAEA,UAAIqB,MAAS,SAAS,KAAK,aAAa;AACtC,aAAKG,IAAA,GACL,KAAKxB,IAAA;AACL;AAAA,MACF;AAEA,WAAKqB,MAAS,sBAAsBA,MAAS,kBAAkB,KAAK,aAAa;AAC/E,aAAKtB,IAAA,GACL,KAAKK,GAAA,GACL,KAAKG,GAAA;AACL;AAAA,MACF;AAEA,UAAIc,MAAS,eAAe,KAAK,aAAa;AAC5C,aAAKnB,IAAA;AACL;AAAA,MACF;AAEA,OAEImB,MAAS,cACTA,EAAK,WAAW,SAAS,KACzBA,EAAK,WAAW,UAAU,KAC1BA,EAAK,WAAW,KAAK,MAEvB,KAAK,gBAEL,KAAKpB,IAAA,GACL,KAAKG,GAAA,GACL,KAAKC,IAAA,GACL,KAAKC,IAAA,GACL,KAAKJ,IAAA;AAAA;AAAA,EAET;AAAA,EAEAP,IAAoB0B,GAAc3B,GAAe;AAC/C,QAAIA,MAAU,IAAI;AAChB,WAAK,gBAAgB2B,CAAI;AACzB;AAAA,IACF;AAEA,SAAK,aAAaA,GAAM3B,CAAK;AAAA,EAC/B;AAAA,EAEAE,IAA8ByB,GAAsDI,GAAkB;AACpG,QAAIA,GAAS;AACX,WAAK,aAAa,UAAUJ,CAAI,IAAI,EAAE,GACtC,KAAK,gBAAgB,WAAWA,CAAI,EAAE,GACtC,KAAK,gBAAgB,MAAMA,CAAI,EAAE;AACjC;AAAA,IACF;AAEA,SAAK,gBAAgB,UAAUA,CAAI,EAAE,GACrC,KAAK,aAAa,WAAWA,CAAI,IAAI,EAAE;AAAA,EACzC;AAAA,EAEAxB,MAAmB;AACjB,SAAK,MAAM,YAAY,gCAAgC,KAAK,WAAW;AAAA,EACzE;AAAA,EAEAE,MAAqB;AACnB,QAAI,CAAC,KAAKzF,GAAQ;AAElB,UAAMoH,IAAY,KAAK;AAGvB,QAFA,KAAKpH,GAAO,WAAWoH,GAEnBA,GAAW;AACb,WAAKpH,GAAO,QAAQ,IACpB,KAAKA,GAAO,aAAa,YAAY,EAAE,GACvC,KAAKA,GAAO,aAAa,SAAS,EAAE;AACpC;AAAA,IACF;AAEA,SAAKA,GAAO,gBAAgB,UAAU,GAEjC,KAAKF,OACR,KAAKE,GAAO,QAAQ,IACpB,KAAKA,GAAO,gBAAgB,OAAO;AAAA,EAEvC;AAAA,EAEA2F,MAAwB;AACtB,QAAI,CAAC,KAAK5F,GAAS;AAEnB,UAAMsH,IAAmB,KAAKC,GAAA,GACxBC,IAAW;AAAA,MACf,EAAE,QAAQ,KAAK9G,IAAgB,SAAS4G,GAAkB,WAAW,qBAAA;AAAA,MACrE,EAAE,QAAQ,KAAKzG,IAA0B,SAAS,KAAK,yBAAyB,WAAW,iCAAA;AAAA,MAC3F,EAAE,QAAQ,KAAKC,IAAoB,SAAS,KAAK,mBAAmB,WAAW,yBAAA;AAAA,IAAyB;AAG1G,QAAI2G,IAAQ;AACZ,eAAWC,KAAWF;AACpB,WAAKxH,GAAQ,UAAU,OAAO0H,EAAQ,WAAWA,EAAQ,OAAO,GAChEA,EAAQ,OAAO,SAAS,CAACA,EAAQ,SAE7BA,EAAQ,WACVA,EAAQ,OAAO,QAAQ,iBAAiB,GAAGD,CAAK,IAChDA,KAAS,KAET,OAAOC,EAAQ,OAAO,QAAQ;AAIlC,SAAK,MAAM,YAAY,+BAA+B,GAAGD,CAAK,EAAE,GAChE,KAAK,MAAM,YAAY,6BAA6BA,IAAQ,IAAI,UAAU,MAAM,GAChF,KAAKzH,GAAQ,UAAU,OAAO,6BAA6BsH,KAAoB,KAAK,mBAAmB,IAEnG,CAACA,KAAoB,CAAC,KAAK,yBAC7B,KAAKK,IAAA,GACL,KAAKC,IAAsB,KAAK9D,EAAsB,GACtD,KAAKF,KAAqB,IAC1B,KAAKC,KAAoB,IACzB,KAAKlD,GAAe,UAAU,OAAO,qBAAqB,IAG5D,KAAKN,GAAkB,MAAM,eAAe,2BAA2B;AAAA,EACzE;AAAA,EAEA,IAAIwH,MAAiB;AACnB,WAAO,KAAK,eAAe,KAAK;AAAA,EAClC;AAAA,EAEAhC,MAAsB;AACpB,IAAK,KAAK7F,OAEV,KAAKA,GAAQ,UAAU,OAAO,mBAAmB,KAAK6H,GAAc,GAChE,KAAKA,OACP,KAAKC,IAAA;AAAA,EAET;AAAA,EAEArC,MAAc;AACZ,SAAKsC,GAAQ,KAAK7H,IAAS,SAAS,KAAK8H,GAAkB,GAC3D,KAAKD,GAAQ,MAAM,gBAAgB,KAAKE,GAAyB,GACjE,KAAKF,GAAQ,MAAM,eAAe,KAAKG,GAAwB,GAC/D,KAAKH,GAAQ,MAAM,gBAAgB,KAAKI,GAAyB,GACjE,KAAKJ,GAAQ,MAAM,cAAc,KAAKE,GAAyB,GAC/D,KAAKF,GAAQ,MAAM,aAAa,KAAKG,GAAwB,GAC7D,KAAKH,GAAQ,MAAM,cAAc,KAAKI,GAAyB,GAC/D,KAAKJ,GAAQ,KAAK/H,IAAS,gBAAgB,KAAKiI,GAAyB,GACzE,KAAKF,GAAQ,KAAK/H,IAAS,eAAe,KAAKkI,GAAwB,GACvE,KAAKH,GAAQ,KAAK/H,IAAS,gBAAgB,KAAKmI,GAAyB,GACzE,KAAKJ,GAAQ,KAAK/H,IAAS,cAAc,KAAKiI,GAAyB,GACvE,KAAKF,GAAQ,KAAK/H,IAAS,aAAa,KAAKkI,GAAwB,GACrE,KAAKH,GAAQ,KAAK/H,IAAS,cAAc,KAAKmI,GAAyB,GACvE,KAAKJ,GAAQ,KAAK7H,IAAS,gBAAgB,KAAKkI,GAAiC,GACjF,KAAKL,GAAQ,KAAK7H,IAAS,gBAAgB,KAAKmI,GAAiC,GACjF,KAAKN,GAAQ,KAAK7H,IAAS,cAAc,KAAKkI,GAAiC,GAC/E,KAAKL,GAAQ,KAAK7H,IAAS,cAAc,KAAKmI,GAAiC,GAC/E,KAAKN,GAAQ,KAAK5H,IAAgB,gBAAgB,KAAKiI,GAAiC,GACxF,KAAKL,GAAQ,KAAK5H,IAAgB,gBAAgB,KAAKkI,GAAiC,GACxF,KAAKN,GAAQ,KAAK5H,IAAgB,cAAc,KAAKiI,GAAiC,GACtF,KAAKL,GAAQ,KAAK5H,IAAgB,cAAc,KAAKkI,GAAiC,GACtF,KAAKN,GAAQ,KAAK5H,IAAgB,gBAAgB,KAAKmI,GAA2B,GAClF,KAAKP,GAAQ,KAAK5H,IAAgB,gBAAgB,KAAKoI,GAA2B,GAClF,KAAKR,GAAQ,KAAK5H,IAAgB,cAAc,KAAKmI,GAA2B,GAChF,KAAKP,GAAQ,KAAK5H,IAAgB,cAAc,KAAKoI,GAA2B,GAChF,KAAKR,GAAQ,KAAK3H,IAAc,gBAAgB,KAAKgI,GAAiC,GACtF,KAAKL,GAAQ,KAAK3H,IAAc,gBAAgB,KAAKiI,GAAiC,GACtF,KAAKN,GAAQ,KAAK3H,IAAc,cAAc,KAAKgI,GAAiC,GACpF,KAAKL,GAAQ,KAAK3H,IAAc,cAAc,KAAKiI,GAAiC,GACpF,KAAKN,GAAQ,KAAKpI,IAAO,WAAW,KAAK6I,GAA4B,GACrE,KAAKT,GAAQ,KAAKpI,IAAO,YAAY,KAAK8I,GAA6B,GACvE,KAAKV,GAAQ,KAAK/H,IAAS,eAAe,KAAK0I,GAAwB,GACvE,KAAKX,GAAQ,KAAK/H,IAAS,aAAa,KAAK2I,GAAyB,GACtE,KAAKZ,GAAQ,KAAK/H,IAAS,eAAe,KAAK2I,GAAyB,GACxE,KAAKZ,GAAQ,KAAK9H,IAAQ,aAAa,KAAK0I,GAAyB,GACrE,KAAKZ,GAAQ,KAAK9H,IAAQ,eAAe,KAAK0I,GAAyB,GACvE,KAAKZ,GAAQ,KAAK5H,IAAgB,eAAe,KAAKyI,GAA0B,GAChF,KAAKb,GAAQ,KAAK5H,IAAgB,eAAe,KAAK0I,GAA0B,GAChF,KAAKd,GAAQ,KAAK5H,IAAgB,aAAa,KAAK2I,GAAwB,GAC5E,KAAKf,GAAQ,KAAK5H,IAAgB,iBAAiB,KAAK4I,GAA4B,GACpF,KAAKhB,GAAQ,KAAK5H,IAAgB,WAAW,KAAK6I,GAAsB,GACxE,KAAKjB,GAAQ,KAAKrH,IAAgB,gBAAgB,KAAKuI,GAAyB,GAChF,KAAKlB,GAAQ,KAAKrH,IAAgB,gBAAgB,KAAKwI,GAAyB,GAChF,KAAKnB,GAAQ,KAAKrH,IAAgB,SAAS,KAAKyI,GAAyB,GACzE,KAAKpB,GAAQ,KAAKpH,IAAgB,gBAAgB,KAAKsI,GAAyB,GAChF,KAAKlB,GAAQ,KAAKpH,IAAgB,gBAAgB,KAAKuI,GAAyB,GAChF,KAAKnB,GAAQ,KAAKnH,IAAc,eAAe,KAAKwI,GAAwB,GAC5E,KAAKrB,GAAQ,KAAKnH,IAAc,eAAe,KAAKyI,GAAwB,GAC5E,KAAKtB,GAAQ,KAAKnH,IAAc,aAAa,KAAK0I,GAAsB,GACxE,KAAKvB,GAAQ,KAAKnH,IAAc,iBAAiB,KAAK2I,GAA0B,GAChF,KAAKxB,GAAQ,KAAKnH,IAAc,SAAS,KAAK4I,GAAwB,GACtE,KAAKzB,GAAQ,KAAKnH,IAAc,WAAW,KAAK6I,GAAoB,GACpE,KAAK1B,GAAQ,KAAKlH,IAA0B,SAAS,KAAK6I,GAA4B,GACtF,KAAK3B,GAAQ,KAAKjH,IAAoB,SAAS,KAAK6I,GAAsB,GAC1E,KAAK5B,GAAQ,KAAKxH,IAAe,SAAS,KAAKqJ,GAAsB;AACrE,eAAWlC,KAAW,KAAK3G;AACzB,WAAKgH,GAAQL,GAAS,gBAAgB,KAAKmC,GAAgC,GAC3E,KAAK9B,GAAQL,GAAS,cAAc,KAAKmC,GAAgC,GACzE,KAAK9B,GAAQL,GAAS,eAAe,KAAKoC,GAA+B;AAG3E,IAAI,oBAAoB,WACtB,KAAKzH,MAAqB,IAAI,eAAe,MAAM;AACjD,WAAK0H,IAAA;AAAA,IACP,CAAC,GACD,KAAK1H,IAAmB,QAAQ,KAAK9B,EAAa,GAClD,KAAKX,IAAS,KAAK,MAAM;AACvB,WAAKyC,KAAoB,WAAA,GACzB,KAAKA,MAAqB;AAAA,IAC5B,CAAC,IAGH,KAAK0F,GAAQ,UAAU,aAAa,KAAKiC,GAAwB,GACjE,KAAKjC,GAAQ,UAAU,iBAAiB,KAAKkC,GAA4B,GACzE,KAAKlC,GAAQ,UAAU,eAAe,KAAKmC,GAA0B,GACrE,KAAKnC,GAAQ,UAAU,aAAa,KAAKmC,GAA0B,GACnE,KAAKnC,GAAQ,UAAU,oBAAoB,KAAKoC,GAAuB,GACvE,KAAKpC,GAAQ,UAAU,0BAA0B,KAAKoC,GAAuB,GAC7E,KAAKpC,GAAQ,UAAU,uBAAuB,KAAKoC,GAAuB,GAC1E,KAAKpC,GAAQ,UAAU,sBAAsB,KAAKoC,GAAuB,GACzE,KAAKpC,GAAQ,KAAKpI,IAAO,oBAAoB,KAAKwK,GAAuB,GACzE,KAAKpC,GAAQ,QAAQ,QAAQ,KAAKqC,GAAiB,GACnD,KAAKrC,GAAQ,QAAQ,SAAS,KAAKsC,GAAkB,GAErD,KAAKtC,GAAQ,KAAK9H,IAAQ,QAAQ,KAAKqK,GAAgB,GACvD,KAAKvC,GAAQ,KAAK9H,IAAQ,SAAS,KAAKsK,GAAiB,GACzD,KAAKxC,GAAQ,KAAK9H,IAAQ,SAAS,KAAKuK,GAAiB,GACzD,KAAKzC,GAAQ,KAAK9H,IAAQ,aAAa,KAAKwK,GAAqB,GACjE,KAAK1C,GAAQ,KAAK9H,IAAQ,WAAW,KAAKyK,GAAmB,GAC7D,KAAK3C,GAAQ,KAAK9H,IAAQ,WAAW,KAAKyK,GAAmB,GAC7D,KAAK3C,GAAQ,KAAK9H,IAAQ,WAAW,KAAKyK,GAAmB,GAC7D,KAAK3C,GAAQ,KAAK9H,IAAQ,cAAc,KAAK0K,GAAe,GAC5D,KAAK5C,GAAQ,KAAK9H,IAAQ,kBAAkB,KAAK2K,GAA0B,GAC3E,KAAK7C,GAAQ,KAAK9H,IAAQ,WAAW,KAAK0K,GAAe,GACzD,KAAK5C,GAAQ,KAAK9H,IAAQ,kBAAkB,KAAK0K,GAAe,GAChE,KAAK5C,GAAQ,KAAK9H,IAAQ,WAAW,KAAK4K,GAAmB,GAC7D,KAAK9C,GAAQ,KAAK9H,IAAQ,UAAU,KAAK6K,GAAkB,GAC3D,KAAK/C,GAAQ,KAAK9H,IAAQ,SAAS,KAAK8K,GAAiB,GACzD,KAAKhD,GAAQ,KAAK9H,IAAQ,YAAY,KAAK6F,EAAiB,GAC5D,KAAKiC,GAAQ,KAAK9H,IAAQ,WAAW,KAAK6F,EAAiB,GAC3D,KAAKiC,GAAQ,KAAK9H,IAAQ,cAAc,KAAK+K,GAAsB,GACnE,KAAKjD,GAAQ,KAAK9H,IAAQ,gBAAgB,KAAKgL,GAAwB,GACvE,KAAKlD,GAAQ,KAAK9H,IAAQ,yBAAyB,KAAK+F,GAA0B,GAClF,KAAK+B,GAAQ,KAAK9H,IAAQ,yBAAyB,KAAK+F,GAA0B;AAAA,EACpF;AAAA,EAEA+D,MAAqB;AACnB,QAAI,CAAC,KAAK/J,MAAW,CAAC,KAAKO,GAAe;AAC1C,SAAKA,GAAc,MAAM,QAAQ;AACjC,UAAM2K,IAAQ,KAAK,KAAK,KAAK3K,GAAc,WAAW;AACtD,SAAKA,GAAc,MAAM,QAAQ,IACjC,KAAKP,GAAQ,MAAM,YAAY,wBAAwB,GAAGkL,CAAK,IAAI;AAAA,EACrE;AAAA,EAEAnD,GAAQoD,GAAqBC,GAAcC,GAA8C;AACvF,IAAAF,EAAO,iBAAiBC,GAAMC,CAAQ,GACtC,KAAKzL,IAAS,KAAK,MAAMuL,EAAO,oBAAoBC,GAAMC,CAAQ,CAAC;AAAA,EACrE;AAAA,EAEA1F,MAAoB;AAClB,QAAI,GAAC,KAAK,OAAO,KAAK5F,KAKtB;AAAA,UAHA,KAAKF,IAAW,WAAA,GAChB,KAAKI,GAAO,QAAQ,MAAM,KAAK,KAE3B,0BAA0B,QAAQ;AACpC,aAAKJ,KAAY,IAAI,qBAAqB,CAACyL,GAASC,MAAa;AAC/D,UAAKD,EAAQ,KAAK,CAACE,MAAUA,EAAM,cAAc,MACjDD,EAAS,WAAA,GACT,KAAK1L,KAAY,MACZ,KAAK4L,GAAA;AAAA,QACZ,GAAG,EAAE,YAAY,KAAK,eAAe,GAErC,KAAK5L,GAAU,QAAQ,KAAKG,EAAO;AACnC;AAAA,MACF;AAEA,MAAK,KAAKyL,GAAA;AAAA;AAAA,EACZ;AAAA,EAEA9C,MAA4B,CAAC+C,MAAiB;AAC5C,IAAAA,EAAM,eAAA;AAAA,EACR;AAAA,EAEAtF,KAA0B;AACxB,IAAK,KAAKpE,QACV,OAAO,aAAa,KAAKA,GAAkB,GAC3C,KAAKA,MAAqB;AAAA,EAC5B;AAAA,EAEA2J,MAAgB,MAAM;AAEpB,QADA,KAAK3J,MAAqB,GACtB,OAAKd,MAAoB,KAAKD,MAAgB,KAAK2C,KAEvD;AAAA,UAAI,KAAKgI,MAAoB;AAC3B,aAAK5L,GAAQ,UAAU,OAAO,qBAAqB;AACnD;AAAA,MACF;AAEA,MAAI,KAAKwD,MACT,KAAKxD,GAAQ,UAAU,OAAO,mBAAmB;AAAA;AAAA,EACnD;AAAA,EAEA6L,IAAsBC,IAAQ,KAAKF,GAAA,IAAqB,KAAKlH,MAAyB,KAAKC,KAA2B;AACpH,SAAKyB,GAAA,GACL,KAAKpE,MAAqB,OAAO,WAAW,KAAK2J,KAAeG,CAAK;AAAA,EACvE;AAAA,EAEAC,KAA6B;AAC3B,IAAK,KAAKH,QACV,KAAKC,IAAsB,KAAKnH,GAAsB;AAAA,EACxD;AAAA,EAEAsH,KAAqB;AACnB,QAAI,CAAC,KAAKJ,GAAA,EAAoB,QAAO;AACrC,UAAMK,IAAa,KAAKjM,GAAQ,UAAU,SAAS,qBAAqB;AACxE,gBAAKA,GAAQ,UAAU,IAAI,qBAAqB,GAChD,KAAK+L,GAAA,GACE,CAACE;AAAA,EACV;AAAA,EAEAC,IAAqBC,IAAe,IAAO;AACzC,IAAI,CAACA,KAAgB,KAAKP,SAC1B,KAAK5L,GAAQ,UAAU,IAAI,mBAAmB,GACzC,KAAKwD,KAGR,KAAK4C,GAAA,IAFL,KAAKyF,IAAsBM,IAAe,KAAKxH,MAA4B,MAAS;AAAA,EAIxF;AAAA,EAEAyH,MAAuB;AACrB,SAAK5I,KAA+B,IACpC,KAAK4C,GAAA,GACL,KAAKpG,GAAQ,UAAU,OAAO,mBAAmB;AAAA,EACnD;AAAA,EAEAqM,IAAsBX,GAAc;AAClC,WAAIA,aAAiB,gBACnB,KAAK/H,MAAuB+H,EAAM,gBAAgB,SAC9C,KAAK/H,MAA6B,MACtC,KAAKF,MAAsBiI,EAAM,SACjC,KAAKhI,MAAsBgI,EAAM,SAC1B,OAGLA,aAAiB,cACnB,KAAK/H,MAAuB,IAC5B,KAAKF,MAAsBiI,EAAM,SACjC,KAAKhI,MAAsBgI,EAAM,SAC1B,MAGF;AAAA,EACT;AAAA,EAEAY,IAAqB/M,GAAwBgN,GAAwB;AAEnE,QADIhN,MAAY,QAAQgN,MAAY,QAChChN,IAAU,KAAKgN,IAAU,KAAKhN,IAAU,OAAO,cAAcgN,IAAU,OAAO,YAAa,QAAO;AAEtG,UAAMvN,IAAO,KAAK,sBAAA;AAClB,WAAIA,EAAK,SAAS,KAAKA,EAAK,UAAU,IAAU,KAG9CO,KAAWP,EAAK,QAChBO,KAAWP,EAAK,SAChBuN,KAAWvN,EAAK,OAChBuN,KAAWvN,EAAK;AAAA,EAEpB;AAAA,EAEAwN,IAAsBC,GAAyBlN,GAAiBgN,GAAiB;AAC/E,QAAI,CAACE,EAAS,QAAO;AAErB,UAAMzN,IAAOyN,EAAQ,sBAAA;AACrB,WAAIzN,EAAK,SAAS,KAAKA,EAAK,UAAU,IAAU,KAG9CO,KAAWP,EAAK,QAChBO,KAAWP,EAAK,SAChBuN,KAAWvN,EAAK,OAChBuN,KAAWvN,EAAK;AAAA,EAEpB;AAAA,EAEA0N,MAA6B;AAC3B,IAAK,KAAKrJ,OAEV,KAAKA,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,OAAO,sBAAsB,GACpD,KAAKA,GAAQ,MAAM,YAAY,yBAAyB,MAAM,GAC9D,KAAK6G,IAAA,GACL,KAAKiB,IAAA;AAAA,EACP;AAAA,EAEA6E,IAA6BpN,GAAiBgN,GAAiB;AAC7D,QAAI,KAAKX,KAAoB;AAE7B,IAAI,CAAC,KAAKgB,GAAA,KAA2B,KAAKJ,IAAsB,KAAKrM,IAAgBZ,GAASgN,CAAO,KACnG,KAAKlJ,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,IAAI,sBAAsB,GACjD,KAAK6M,GAAwBtN,GAAS,IAAO,EAAK,KACxC,KAAKqN,QACf,KAAKF,IAAA;AAGP,UAAMI,IAAiB,KAAK/L,GAAgB,KAAK,CAAC+F,MACzC,CAACA,EAAO,UAAU,CAAC,KAAKiG,IAA4BjG,CAAM,KAAK,KAAK0F,IAAsB1F,GAAQvH,GAASgN,CAAO,CAC1H,KAAK;AAEN,QAAI,CAACO,EAAgB;AAErB,UAAMrF,IAAQ,OAAOqF,EAAe,QAAQ,kBAAkB,CAAC;AAC/D,SAAKzM,GAAkB,MAAM,YAAY,6BAA6B,sCAAsCoH,CAAK,GAAG;AAAA,EACtH;AAAA,EAEAuF,MAAsB;AACpB,WACE,KAAKhN,GAAQ,UAAU,SAAS,qBAAqB,KACrD,KAAKA,GAAQ,UAAU,SAAS,mBAAmB,KACnD,KAAKL,GAAM,yBAAyB;AAAA,EAExC;AAAA,EAEAsN,MAA+B;AAC7B,WAAO,KAAKrB,GAAA,KAAsB,YAAY,IAAA,IAAQ,KAAKxJ;AAAA,EAC7D;AAAA,EAEA2K,IAA4BjG,GAA4B;AACtD,WACEA,aAAkB,sBACjBA,EAAO,YAAaA,MAAW,KAAKpG,MAAkB,CAAC,KAAK6G;EAEjE;AAAA,EAEA2F,MAAuC;AACrC,QAAI,CAAC,KAAKvJ,OAAwB,KAAK2I,IAAqB,KAAK7I,KAAqB,KAAKC,GAAmB,GAAG;AAC/G,WAAKwI,IAAqB,EAAI;AAC9B;AAAA,IACF;AAEA,SAAKE,IAAA;AAAA,EACP;AAAA,EAEAnE,MAA4B,CAACyD,MAAiB;AAC5C,IAAK,KAAKW,IAAsBX,CAAK,KACrC,KAAKQ,IAAqB,EAAI;AAAA,EAChC;AAAA,EAEAhE,MAA2B,CAACwD,MAAiB;AAC3C,IAAK,KAAKW,IAAsBX,CAAK,OACjCA,aAAiB,gBAAgBA,aAAiB,eACpD,KAAKiB,IAA6BjB,EAAM,SAASA,EAAM,OAAO,GAEhE,KAAKQ,IAAqB,EAAI;AAAA,EAChC;AAAA,EAEAhC,MAA6B,CAACwB,MAAiB;AAC7C,IAAK,KAAKW,IAAsBX,CAAK,OACjCA,aAAiB,gBAAgBA,aAAiB,eACpD,KAAKiB,IAA6BjB,EAAM,SAASA,EAAM,OAAO,GAEhE,KAAKwB,IAAA;AAAA,EACP;AAAA,EAEA/E,MAA4B,MAAM;AAChC,SAAKiE,IAAA;AAAA,EACP;AAAA,EAEAhE,MAAoC,CAACsD,MAAiB;AACpD,IAAK,KAAKW,IAAsBX,CAAK,MACrC,KAAKlI,KAA+B,IACpC,KAAKxD,GAAQ,UAAU,IAAI,mBAAmB,GAC9C,KAAKoG,GAAA;AAAA,EACP;AAAA,EAEAiC,MAAoC,MAAM;AACxC,SAAK7E,KAA+B,IACpC,KAAKqI,IAAsB,KAAKlH,GAAyB;AAAA,EAC3D;AAAA,EAEA6D,MAA+B,MAAM;AACnC,IAAI,KAAKoD,OACP,KAAK5L,GAAQ,UAAU,IAAI,qBAAqB,IAEhD,KAAKA,GAAQ,UAAU,IAAI,mBAAmB,GAGhD,KAAKoG,GAAA;AAAA,EACP;AAAA,EAEAqC,MAAgC,MAAM;AACpC,SAAKoD,IAAsB,KAAKlH,GAAyB;AAAA,EAC3D;AAAA,EAEAkF,MAAmC,CAAC6B,MAAiB;AACnD,UAAMP,IAASO,EAAM;AACrB,QAAI,KAAKqB,IAA4B5B,CAAM,EAAG;AAG9C,UAAM1D,IAAQ,OADC0D,EACa,QAAQ,kBAAkB,CAAC;AACvD,SAAK9K,GAAkB,MAAM,YAAY,6BAA6B,sCAAsCoH,CAAK,GAAG;AAAA,EACtH;AAAA,EAEAb,MAAwB;AACtB,IAAK,KAAK3C,QACV,OAAO,aAAa,KAAKA,GAAgB,GACzC,KAAKA,MAAmB;AAAA,EAC1B;AAAA,EAEAkJ,MAAyB,MAAM;AAC7B,SAAKlJ,MAAmB,GACxB,KAAKlD,GAAgB,QAAQ,CAAC+F,MAAWA,EAAO,UAAU,OAAO,uBAAuB,CAAC,GACzF,KAAK,MAAM,eAAe,iCAAiC;AAAA,EAC7D;AAAA,EAEAgD,MAAkC,CAAC4B,MAAiB;AAClD,QAAI,EAAEA,aAAiB,iBAAiBA,EAAM,gBAAgB,QAAS;AAEvE,UAAMP,IAASO,EAAM;AACrB,QAAI,CAACP,KAAU,CAAC,KAAK6B,SAAyB,KAAKD,IAA4B5B,CAAM,EAAG;AAExF,UAAM1D,IAAQ,OAAO0D,EAAO,QAAQ,kBAAkB,CAAC;AACvD,SAAKvE,IAAA,GACL,KAAK7F,GAAgB,QAAQ,CAAC+F,MAAWA,EAAO,UAAU,OAAO,yBAAyBA,MAAWqE,CAAM,CAAC,GAC5G,KAAK,MAAM,YAAY,mCAAmC,sCAAsC1D,CAAK,GAAG,GACxG,KAAKxD,MAAmB,OAAO,WAAW,KAAKkJ,KAAwB,GAAG;AAAA,EAC5E;AAAA,EAEA9G,MAA0B;AACxB,IAAK,KAAKpE,QACV,OAAO,aAAa,KAAKA,GAAkB,GAC3C,KAAKA,MAAqB;AAAA,EAC5B;AAAA,EAEAqE,MAAwB;AACtB,IAAK,KAAKvE,OACV,OAAO,aAAa,KAAKA,EAAgB,GACzC,KAAKA,KAAmB;AAAA,EAC1B;AAAA,EAEAwE,MAAmC;AACjC,IAAK,KAAKrE,QACV,OAAO,aAAa,KAAKA,GAA2B,GACpD,KAAKA,MAA8B;AAAA,EACrC;AAAA,EAEAuE,MAAgC;AAC9B,IAAK,KAAK9D,QACV,OAAO,aAAa,KAAKA,GAAwB,GACjD,KAAKA,MAA2B;AAAA,EAClC;AAAA,EAEAgE,MAAiC;AAC/B,IAAK,KAAK3C,QACV,OAAO,aAAa,KAAKA,GAAyB,GAClD,KAAKA,MAA4B;AAAA,EACnC;AAAA,EAEAoJ,MAAyB;AACvB,SAAKzG,IAAA,GACL,KAAK3G,GAAQ,UAAU,OAAO,0BAA0B,GACnD,KAAKU,GAAe,aACzB,KAAKV,GAAQ,UAAU,IAAI,0BAA0B,GACrD,KAAKgE,MAA4B,OAAO,WAAW,MAAM;AACvD,WAAKA,MAA4B,GACjC,KAAKhE,GAAQ,UAAU,OAAO,0BAA0B;AAAA,IAC1D,GAAG,GAAG;AAAA,EACR;AAAA,EAEAqN,MAA+B,MAAM;AAEnC,QAD4B,KAAKnL,OAAgC,KAAKlC,GAAQ,UAAU,SAAS,sBAAsB,GAIvH;AAAA,UADA,KAAKuG,IAAA,GACD,KAAK3D,KAA4B;AACnC,aAAK5C,GAAQ,UAAU,OAAO,sBAAsB;AACpD;AAAA,MACF;AAEA,WAAK4C,MAA6B,IAClC,KAAKC,MAAmC,YAAY,IAAA,IAAQ,KAAKiC,KAC5D,KAAK8H,aAA8BU,GAAA,GACxC,KAAKC,GAAA,GACL,KAAKvN,GAAQ,UAAU,OAAO,sBAAsB,GACpD,KAAKkG,GAAA;AAAA;AAAA,EACP;AAAA,EAEAsH,MAA8B;AAC5B,IAAI,KAAK5K,OAA8B,KAAKV,QAE5C,KAAKlC,GAAQ,UAAU,IAAI,sBAAsB,GACjD,KAAKyN,GAAmB,CAAC,GACzB,KAAKvL,MAA8B,OAAO,WAAW,KAAKmL,KAA8B,KAAKxI,GAA2B;AAAA,EAC1H;AAAA,EAEA,MAAM4G,KAAsB;AAC1B,QAAI,KAAK1L,GAAoB;AAE7B,UAAM2N,IAAS,KAAKzN,GAAO,QAAQ,OAAO,KAAK;AAC/C,IAAKyN,MAEL,KAAKpH,IAAA,GACL,KAAKG,IAAA,GACL,KAAK3E,OAAqB,GAC1B,KAAK/B,KAAqB,IAC1B,KAAKuC,KAAwB,IAC7B,KAAKC,KAA0B,IAC/B,KAAKC,KAA4B,IACjC,KAAKC,KAAiC,IACtC,KAAKC,MAA2B,GAChC,KAAK1C,GAAQ,UAAU,OAAO,mBAAmB,GACjD,KAAK0F,IAAA,GACL,KAAKzF,GAAO,MAAMyN,GAClB,KAAKzN,GAAO,UAAU,QACtB,KAAKA,GAAO,KAAA,GAER,KAAKA,GAAO,YAAY,KAAKA,GAAO,SACtC,MAAM,KAAKA,GAAO,KAAA,EAAO,MAAM,MAAA;AAAA,KAAe;AAAA,EAElD;AAAA,EAEA0N,MAAsB;AACpB,WAAI,CAAC,KAAK1N,GAAO,QAAQ,KAAKA,GAAO,UAAU,CAAC,OAAO,SAAS,KAAKA,GAAO,QAAQ,KAAK,KAAKA,GAAO,YAAY,IAAU,KACpH,KAAKA,GAAO,cAAc,QAAS,KAAKA,GAAO,WAAW,KAAKA,GAAO,cAAe;AAAA,EAC9F;AAAA,EAEA2N,IAAkB1P,IAAO,KAAK+B,GAAO,aAAa;AAChD,QAAI,CAAC,OAAO,SAAS/B,CAAI,EAAG,QAAO;AAEnC,UAAM2P,IAAc,KAAK,IAAI,GAAG3P,CAAI;AAEpC,QAAI;AACF,eAASuJ,IAAQ,GAAGA,IAAQ,KAAKxH,GAAO,SAAS,QAAQwH,KAAS,GAAG;AACnE,cAAMqG,IAAQ,KAAK7N,GAAO,SAAS,MAAMwH,CAAK,GACxCsG,IAAM,KAAK9N,GAAO,SAAS,IAAIwH,CAAK;AAE1C,YAAIoG,IAAc,KAAK3I,OAAsB4I,KAASD,KAAeE,IAAM,KAAK7I;AAC9E,iBAAO,KAAK,IAAI,GAAG6I,IAAMF,CAAW;AAAA,MAExC;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEAG,IAAkB5P,IAAU,KAAK6G,KAAsB;AACrD,QACE,CAAC,KAAKlF,MACN,KAAKE,GAAO,SACZ,CAAC,KAAKD,GAAQ,UAAU,SAAS,iBAAiB,KAClD,CAAC,OAAO,SAAS,KAAKC,GAAO,QAAQ,KACrC,KAAKA,GAAO,YAAY,EACxB,QAAO;AAET,UAAMgO,IAAoB,KAAK,IAAI,GAAG,KAAKhO,GAAO,WAAW,KAAKA,GAAO,WAAW,GAC9EiO,IAAiB,KAAK,IAAI9P,GAAS6P,CAAiB;AAE1D,WAAOC,KAAkB,KAAKhJ,OAAsB,KAAK0I,QAAsB,KAAK1I,OAAsBgJ;AAAA,EAC5G;AAAA,EAEAC,IAAiBC,GAAoBC,IAAY,IAAO;AACtD,SAAKhI,IAAA;AACL,UAAMiI,IAAaF,KAAa,CAAC,KAAKT,SAAyB,CAAC,KAAKK,IAAA,GAE/DO,IAD0BH,KAAa,CAAC,KAAK7L,MACE+L;AAGrD,QAFA,KAAKxL,MAAuByL,GAExB,CAACA,GAAmB;AACtB,WAAKvO,GAAQ,UAAU,OAAO,YAAY;AAC1C;AAAA,IACF;AAEA,QAAIqO,GAAW;AACb,WAAKrO,GAAQ,UAAU,IAAI,YAAY;AACvC;AAAA,IACF;AAEA,SAAKiC,MAAqB,OAAO,WAAW,MAAM;AAEhD,UADA,KAAKA,MAAqB,GACtB,CAAC,KAAKM,MAA4B,CAAC,KAAKoL,SAAyB,CAAC,KAAKK,OAAsB;AAC/F,aAAKlL,MAAuB,IAC5B,KAAK9C,GAAQ,UAAU,IAAI,YAAY;AACvC;AAAA,MACF;AAEA,WAAK8C,MAAuB,IAC5B,KAAK9C,GAAQ,UAAU,OAAO,YAAY;AAAA,IAC5C,GAAG,KAAK4E,GAAkB;AAAA,EAC5B;AAAA,EAEAkB,KAAoB,MAAM;AACxB,QAAI,KAAK7F,GAAO,OAAO;AACrB,WAAKkO,IAAiB,IAAM,EAAI;AAChC;AAAA,IACF;AAEA,SAAKA;AAAA,MAED,CAAC,KAAKpO,MACN,CAAC,KAAKwC,MACN,KAAKtC,GAAO,aAAa,iBAAiB;AAAA,IAAA;AAAA,EAGhD;AAAA,EAEAuO,MAAuB;AACrB,WACE,KAAKzO,MACL,CAAC,KAAKE,GAAO,SACb,KAAKqC,OAEH,KAAKrC,GAAO,cAAc,iBAAiB,oBAEzC,KAAKA,GAAO,cAAc,iBAAiB,qBAC3C,CAAC,KAAKD,GAAQ,UAAU,SAAS,YAAY;AAAA,EAIrD;AAAA,EAEA4M,KAAwB;AACtB,WAAO,KAAK1L,MAAoB,KAAKD,MAAgB,KAAKO;AAAA,EAC5D;AAAA,EAEAiN,MAAkB;AAChB,IAAI,KAAK3M,OAAqB,KAAKkD,OAAyB,KAAKjD,OAEjE,KAAKA,KAAmB,OAAO,WAAW,MAAM;AAC9C,WAAKA,KAAmB,GACxB,KAAK0E,IAAA,GACL,KAAK1G,KAAqB,IAC1B,KAAKuC,KAAwB,IAC7B,KAAKC,KAA0B,IAC/B,KAAKC,KAA4B,IACjC,KAAKC,KAAiC,IACtC,KAAKC,MAA2B,GAChC,KAAK1C,GAAQ,UAAU,OAAO,mBAAmB,GAE5C,KAAKA,GAAQ,UAAU,SAAS,iBAAiB,KACpD,KAAKyN,GAAmB,CAAC,GAG3B,KAAKxN,GAAO,gBAAgB,KAAK,GACjC,KAAKA,GAAO,KAAA,GACP,KAAKwL,GAAA;AAAA,IACZ,GAAG,KAAK1G,GAAgB;AAAA,EAC1B;AAAA,EAEA2J,MAA8B;AAC5B,WAAK,KAAKlN,MAEV,KAAKA,KAA2B,IAChC,KAAKC,MAA4B,IACjC,KAAK6L,GAAA,GACL,KAAKC,GAAA,GACE,MANoC;AAAA,EAO7C;AAAA,EAEAoB,MAAoB;AAUlB,WATA,KAAKrI,IAAA,GACgB,CAAC,KAAKtG,GAAQ,UAAU,SAAS,iBAAiB,UAEhDwN,IAAA,GAEvB,KAAKxN,GAAQ,UAAU,IAAI,iBAAiB,GAC5C,KAAKA,GAAQ,UAAU,IAAI,mBAAmB,GAC9C,KAAK8F,GAAA,GACL,KAAKjE,KAA2B,MAC5B,KAAKL,MACP,KAAKkN,IAAA,GACE,OAGJ,KAAK9B,aAA8BU,GAAA,GACxC,KAAKC,GAAA,GACE;AAAA,EACT;AAAA,EAEAqB,MAA0B;AACxB,QAAI,KAAKtM,MAAyB,KAAKE,MAA6B,KAAKvC,GAAO,MAAO;AAEvF,SAAKuC,KAA4B;AACjC,UAAMqM,IAAe,KAAKnM,IACpBoM,IAAoB,MAAM;AAC9B,UAAID,MAAiB,KAAKnM,IAU1B;AAAA,YARA,KAAK+D,IAAA,GACL,KAAKjE,KAA4B,IACjC,KAAKF,KACH,CAAC,KAAKrC,GAAO,SACb,KAAKA,GAAO,cAAc,iBAAiB,qBAC3C,KAAKA,GAAO,aAAa,KACzB,KAAKA,GAAO,cAAc,GAExB,KAAKqC,IAAuB;AAC9B,cAAI,KAAKG,MAAkC,KAAKF,GAAyB;AAEzE,eAAKE,KAAiC,IACtC,OAAO,sBAAsB,MAAM;AACjC,mBAAO,sBAAsB,MAAM;AACjC,cAAIoM,MAAiB,KAAKnM,OAE1B,KAAKD,KAAiC,IACtC,KAAKF,KAA0B,IAC/B,KAAKoM,IAAA,GACL,KAAKzI,GAAA;AAAA,YACP,CAAC;AAAA,UACH,CAAC,GACD,KAAKA,GAAA;AACL;AAAA,QACF;AAEA,aAAKJ,GAAA;AAAA;AAAA,IACP;AAEA,QAAI,+BAA+B,KAAK7F,IAAQ;AAC9C,WAAKA,GAAO,0BAA0B6O,CAAiB,GACvD,KAAKnM,MAA2B,OAAO,WAAWmM,GAAmB,GAAG;AACxE;AAAA,IACF;AAEA,WAAO,sBAAsBA,CAAiB;AAAA,EAChD;AAAA,EAEAnE,MAAkB,MAAM;AACtB,QACE,KAAK1K,GAAO,SACZ,KAAKA,GAAO,aAAa,iBAAiB,qBAC1C,KAAKA,GAAO,cAAc,KAC1B,KAAKA,GAAO,eAAe;AAE3B,kBAAK6F,GAAA,GACE;AAGT,QAAI,CAAC,KAAKxD;AACR,kBAAKsM,IAAA,GACL,KAAK9I,GAAA,GACE;AAGT,UAAMiJ,IAAU,KAAKJ,IAAA;AACrB,gBAAK5I,GAAA,GACEgJ;AAAA,EACT;AAAA,EAEAC,MAAoB;AAClB,WACE,CAAC,KAAK/O,GAAO,WACZ,CAAC,KAAKA,GAAO,SAAS,KAAKA,GAAO,SACnC,KAAKA,GAAO,cAAc,iBAAiB;AAAA,EAE/C;AAAA,EAEAqN,GAAyBpP,IAAO,KAAK+B,GAAO,aAAa;AACvD,SAAK8C,MAAsB,OAAO,SAAS7E,CAAI,IAAI,KAAK,IAAI,GAAGA,CAAI,IAAI,GACvE,KAAK8E,MAA2B,YAAY,IAAA;AAAA,EAC9C;AAAA,EAEAiM,KAA6B;AAC3B,SAAK/L,KAA4B,MACjC,KAAKC,MAA8B;AAAA,EACrC;AAAA,EAEA+L,MAA4B;AAC1B,QAAI,CAAC,OAAO,SAAS,KAAKjP,GAAO,QAAQ,KAAK,KAAKA,GAAO,YAAY,GAAG;AACvE,WAAKiD,KAA4B;AACjC;AAAA,IACF;AAEA,UAAM2K,IAAc,OAAO,SAAS,KAAK5N,GAAO,WAAW,IAAI,KAAK,IAAI,GAAG,KAAKA,GAAO,WAAW,IAAI,GAChGkP,IAAe,OAAO,SAAS,KAAKlM,GAAyB,IAAI,KAAKA,MAA4B4K;AACxG,SAAK3K,KAA4B,KAAK,IAAI,KAAKjD,GAAO,UAAU,KAAK,IAAI4N,GAAasB,CAAY,CAAC,GACnG,KAAK7B,GAAyB,KAAKpK,EAAyB;AAAA,EAC9D;AAAA,EAEAkM,MAAkC;AAChC,QAAI,CAAC,OAAO,SAAS,KAAKnP,GAAO,QAAQ,KAAK,KAAKA,GAAO,YAAY,GAAG;AACvE,WAAKkD,MAA8B,MACnC,KAAK+L,IAAA;AACL;AAAA,IACF;AAEA,UAAMG,IAAW,KAAKrP,GAAQ,MAAM,iBAAiB,qBAAqB,GACpEsP,IAAQ,OAAO,WAAWD,CAAQ,GAClCE,IAAmB,OAAO,SAASD,CAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAKA,IAAQ,GAAI,CAAC,IAAI,MAC1FE,IAAa,KAAKC,GAAA,GAClBC,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGF,IAAa,KAAKvP,GAAO,QAAQ,CAAC,GAC7E0P,IAAiB,KAAK,IAAIJ,KAAoB,GAAGG,CAAgB;AAEvE,SAAKvM,MAA8BwM,GACnC,KAAKzM,KAA4ByM,IAAiB,KAAK1P,GAAO,UAC9D,KAAKqN,GAAyB,KAAKpK,EAAyB,GAC5D,KAAKuK,GAAmBkC,CAAc,GACtC,KAAKxP,GAAe,aAAa,iBAAiB,GAAG,KAAK+C,EAAyB,EAAE,GACrF,KAAK/C,GAAe;AAAA,MAClB;AAAA,MACA,GAAGlC,EAAgB,KAAKiF,EAAyB,CAAC,OAAOjF,EAAgB,KAAKgC,GAAO,QAAQ,CAAC;AAAA,IAAA;AAAA,EAElG;AAAA,EAEAwP,KAAyB;AACvB,QAAI,CAAC,OAAO,SAAS,KAAKxP,GAAO,QAAQ,KAAK,KAAKA,GAAO,YAAY,EAAG,QAAO,KAAKA,GAAO,eAAe;AAC3G,QAAI,KAAK2M,KAAyB,QAAO,KAAKxL;AAC9C,QAAI,KAAK8B,OAA8B,KAAM,QAAO,KAAKA;AACzD,QAAI,CAAC,KAAK8L,IAAA,EAAqB,QAAO,KAAK/O,GAAO,eAAe;AAEjE,QAAI,KAAK6C,OAAwB,CAAC,KAAKF,OAA8B,YAAY,IAAA,IAAQ,KAAKC;AAC5F,kBAAKyK,GAAA,GACE,KAAKrN,GAAO,eAAe;AAGpC,QAAI,KAAKD,GAAQ,UAAU,SAAS,YAAY,KAAK,KAAKC,GAAO,aAAa,iBAAiB;AAC7F,kBAAKqN,GAAA,GACE,KAAKrN,GAAO,eAAe;AAGpC,UAAM2P,KAAW,YAAY,IAAA,IAAQ,KAAK5M,OAA4B,KAChE6M,IAAgB,KAAK9M,MAAsB6M,GAC3CJ,IAAa,KAAKvP,GAAO,OAC3B4P,IAAgB,KAAK5P,GAAO,WAC5B,KAAK,IAAI4P,GAAe,KAAK5P,GAAO,QAAQ;AAEhD,WAAI,CAAC,KAAKA,GAAO,QAAQ,KAAKA,GAAO,cAAcuP,IAAa,QAC9D,KAAKlC,GAAA,GACE,KAAKrN,GAAO,eAGduP;AAAA,EACT;AAAA,EAEA/B,GAAmBrO,GAAiB;AAClC,UAAMC,IAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGD,CAAO,CAAC,GACjD0Q,KAAoB,IAAIzQ,KAAkB,KAC1C,EAAE,YAAAH,EAAA,IAAe,KAAK6Q,IAAA,GACtBC,IAAoB,IAAI9Q,GACxB+Q,IACJ,KAAKhP,MACL,KAAKM,OACL,KAAKD,KAAsB0O,IAAoB3Q;AAKjD,QAHA,KAAKW,GAAQ,MAAM,YAAY,uBAAuB,GAAG8P,CAAgB,GAAG,GAC5E,KAAK9P,GAAQ,MAAM,YAAY,mCAAmCiQ,IAAsB,MAAM,GAAG,GAE7FA,GAAqB;AACvB,YAAMC,IAAU,KAAKC,IAAyB,KAAK7O,EAAmB,GAChE8O,IAAc,KAAK,IAAI,GAAGlR,IAAa,CAAC,GACxCmR,IAAW,KAAK,IAAID,GAAa,KAAK,IAAI,GAAGF,IAAU,CAAC,CAAC;AAE/D,WAAKlQ,GAAQ,MAAM,YAAY,gCAAgC,GAAGqQ,CAAQ,IAAI;AAAA,IAChF;AACE,WAAKrQ,GAAQ,MAAM,YAAY,gCAAgC,SAAS;AAAA,EAE5E;AAAA,EAEAsQ,IAA4BpS,GAAc;AACxC,WAAI,CAAC,OAAO,SAAS,KAAK+B,GAAO,QAAQ,KAAK,KAAKA,GAAO,YAAY,IAAU,IAEzE,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG/B,IAAO,KAAK+B,GAAO,QAAQ,CAAC;AAAA,EAC7D;AAAA,EAEA8P,IAAoB/Q,IAAO,KAAKmB,GAAe,yBAAyB;AACtE,WAAOpB,EAAmBC,CAAI;AAAA,EAChC;AAAA,EAEAmR,IAAyB/Q,GAAiBJ,IAAO,KAAKmB,GAAe,yBAAyB;AAC5F,WAAOhB,EAAwBC,GAASJ,CAAI;AAAA,EAC9C;AAAA,EAEAuR,IAA+BhR,GAAiBP,GAAe;AAC7D,WAAOM,EAA8BC,GAASP,CAAI;AAAA,EACpD;AAAA,EAEAwR,IAAsBtS,GAAc;AAClC,SAAKmD,MAAmB,OAAO,SAASnD,CAAI,IAAI,KAAK,IAAI,GAAGA,CAAI,IAAI,GACpE,KAAKoD,KAAsB,KAAKgP,IAA4B,KAAKjP,GAAgB;AACjF,UAAMrC,IAAO,KAAKmB,GAAe,sBAAA,GAC3B+P,IAAU,KAAKC,IAAyB,KAAK7O,IAAqBtC,CAAI,GACtEyR,IACJP,KAAW,KAAK3L,OAChB2L,KAAW,KAAK,IAAI,KAAK3L,KAA6BvF,EAAK,QAAQ,KAAKuF,GAA2B;AAErG,SAAKhD,MAAwB,KAAKF,MAAmB,KAAKmD,OAA6BiM,GACvF,KAAKzQ,GAAQ,UAAU,OAAO,qBAAqB,KAAKuB,GAAqB,GAC7E,KAAKvB,GAAQ,MAAM,YAAY,2BAA2B,GAAGkQ,CAAO,IAAI;AAAA,EAC1E;AAAA,EAEAQ,IAAenR,GAAiBP,GAAeI,GAAiBuR,IAAa,KAAK1P,IAAc;AAC9F,UAAM2P,IAAaxR,IAAU,KAAKa,GAAO;AAEzC,QAAI,CAAC0Q,KAAc,CAAC,KAAKpP;AACvB,aAAO,EAAE,SAAAnC,GAAS,YAAAwR,EAAA;AAGpB,UAAMV,IAAUlR,EAAK,OAAO,KAAKmR,IAAyB,KAAK7O,IAAqBtC,CAAI;AAIxF,WAHuB,KAAK,IAAIO,IAAU2Q,CAAO,KACV,KAAK5L,MAMrC;AAAA,MACL,SAAS,KAAKhD;AAAA,MACd,YAAY,KAAKD;AAAA,IAAA,IALV,EAAE,SAAAjC,GAAS,YAAAwR,EAAA;AAAA,EAOtB;AAAA,EAEA9I,IAAoB5J,IAAO,KAAKuR,MAA0B;AACxD,IAAI,CAAC,KAAK5H,OAAkB,KAAKxE,MAA8B,KAAKuJ,SAEpE,KAAKrM,GAAc,cAAc,KAAKsQ,IAAsB3S,CAAI,GAChE,KAAK6L,IAAA;AAAA,EACP;AAAA,EAEAwD,GAAgBrP,IAAO,KAAKuR,MAA0B;AACpD,UAAMqB,IAAc,OAAO,SAAS,KAAK7Q,GAAO,QAAQ,KAAK,KAAKA,GAAO,WAAW;AACpF,QAAI6Q,KAAe,KAAK3N,QAAgC,MAAM;AAC5D,YAAM4N,IAAa,KAAK5N,MAA8B,KAAKlD,GAAO;AAClE,WAAKgD,MAA4B8N,GACjC,KAAKtD,GAAmB,KAAKtK,GAA2B,GACxD,KAAKhD,GAAe,aAAa,iBAAiB,GAAG,GACrD,KAAKA,GAAe,aAAa,iBAAiB,GAAG,KAAKF,GAAO,QAAQ,EAAE,GAC3E,KAAKE,GAAe,aAAa,iBAAiB,GAAG4Q,CAAU,EAAE,GACjE,KAAK5Q,GAAe;AAAA,QAClB;AAAA,QACA,GAAGlC,EAAgB8S,CAAU,CAAC,OAAO9S,EAAgB,KAAKgC,GAAO,QAAQ,CAAC;AAAA,MAAA,GAE5E,KAAK6H,IAAoBiJ,CAAU;AACnC;AAAA,IACF;AAEA,UAAM5B,IAAe2B,IAAc,KAAK,IAAI,KAAK7Q,GAAO,UAAU,KAAK,IAAI,GAAG/B,CAAI,CAAC,IAAIA,GACjF8S,IAAgBF,IAAc3B,IAAe,KAAKlP,GAAO,WAAW;AAC1E,SAAKgD,MAA4B,OAAO,SAASkM,CAAY,IAAI,KAAK,IAAI,GAAGA,CAAY,IAAI,GAC7F,KAAK1B,GAAmBuD,CAAa,GACrC,KAAK7Q,GAAe,aAAa,iBAAiB,GAAG,GACrD,KAAKA,GAAe,aAAa,iBAAiB2Q,IAAc,GAAG,KAAK7Q,GAAO,QAAQ,KAAK,GAAG,GAC/F,KAAKE,GAAe,aAAa,iBAAiB2Q,IAAc,GAAG3B,CAAY,KAAK,GAAG,GACvF,KAAKhP,GAAe;AAAA,MAClB;AAAA,MACA2Q,IAAc,GAAG7S,EAAgBkR,CAAY,CAAC,OAAOlR,EAAgB,KAAKgC,GAAO,QAAQ,CAAC,KAAK;AAAA,IAAA,GAEjG,KAAK6H,IAAoBqH,CAAY;AAAA,EACvC;AAAA,EAEAtC,GAAwBtN,GAAiBoR,IAAa,KAAK1P,IAAcgQ,IAAe,IAAM;AAC5F,QAAI,CAAC,OAAO,SAAS,KAAKhR,GAAO,QAAQ,KAAK,KAAKA,GAAO,YAAY,EAAG,QAAO,KAAKA,GAAO;AAE5F,UAAMjB,IAAO,KAAKmB,GAAe,sBAAA,GAC3Bf,IAAU,KAAKmR,IAA+BhR,GAASP,CAAI,GAC3DkS,IAAa,KAAKR,IAAenR,GAASP,GAAMI,GAASuR,CAAU;AAEzE,gBAAK3Q,GAAQ,MAAM,YAAY,yBAAyB,IAAI,IAAIZ,KAAW,GAAG,GAAG,GAE7E6R,KACF,KAAKxD,GAAmByD,EAAW,OAAO,GAGvC,KAAKrJ,OACR,KAAK7H,GAAQ,MAAM,YAAY,2BAA2B,GAAG,KAAKmQ,IAAyBe,EAAW,SAASlS,CAAI,CAAC,IAAI,GAG1H,KAAKyB,IAAe,cAAcxC,EAAgBiT,EAAW,UAAU,GACvE,KAAK3Q,GAAc,cAAc,KAAKsQ,IAAsBK,EAAW,UAAU,GACjF,KAAKnH,IAAA,GAEDkH,MACF,KAAK9Q,GAAe,aAAa,iBAAiB,GAAG+Q,EAAW,UAAU,EAAE,GAC5E,KAAK/Q,GAAe;AAAA,MAClB;AAAA,MACA,GAAGlC,EAAgBiT,EAAW,UAAU,CAAC,OAAOjT,EAAgB,KAAKgC,GAAO,QAAQ,CAAC;AAAA,IAAA,IAIzF,KAAKkR,IAAA,GACED,EAAW;AAAA,EACpB;AAAA,EAEArK,MAA0B;AACxB,SAAKzD,MAAwB,IAC7B,KAAKpD,IAAS,UAAU,OAAO,wBAAwB;AAAA,EACzD;AAAA,EAEAmR,MAAyB;AACvB,QAAK,CAAC,KAAKlQ,MAAgB,CAAC,KAAKoC,MAA+B,CAAC,KAAKjD,MAAgB,CAAC,KAAKI,OAAc,KAAKqH,KAAgB;AAC7H,WAAKhB,IAAA;AACL;AAAA,IACF;AAEA,UAAMuK,IAAa,KAAKhR,GAAa,sBAAA,GAC/BiR,IAAW,KAAK7Q,IAAW,sBAAA,GAC3B8Q,IAAkBF,EAAW,QAAQ,KAAKA,EAAW,SAAS,GAC9DG,IAAS,KAAKnO,MAAwB,KAAKgC,MAA+B,KAAKD,KAC/EqM,IACJF,KACAD,EAAS,SAASD,EAAW,OAAOG,KACpCF,EAAS,QAAQD,EAAW,QAAQG,KACpCF,EAAS,UAAUD,EAAW,MAAMG,KACpCF,EAAS,OAAOD,EAAW,SAASG;AAEtC,SAAKnO,MAAwBoO,GAC7B,KAAKxR,GAAQ,UAAU,OAAO,0BAA0B,KAAKoD,GAAqB;AAAA,EACpF;AAAA,EAEA2D,MAAoB;AAClB,IAAK,KAAK/F,QACV,OAAO,qBAAqB,KAAKA,GAAc,GAC/C,KAAKA,MAAiB;AAAA,EACxB;AAAA,EAEAyQ,MAAqB;AACnB,SAAK1K,IAAA,GACL,KAAKuG,GAAA;AAEL,UAAMoE,IAAO,MAAM;AACjB,WAAKnE,GAAgB,KAAKkC,IAAwB,GAC9C,KAAKT,UACP,KAAKhO,MAAiB,OAAO,sBAAsB0Q,CAAI;AAAA,IAE3D;AAEA,SAAK1Q,MAAiB,OAAO,sBAAsB0Q,CAAI;AAAA,EACzD;AAAA,EAEAxL,KAAkB;AAChB,UAAMyL,IAAiB,CAAC,KAAK1R,GAAO,WAAW,CAAC,KAAKA,GAAO,SAAS,KAAKA,GAAO,SAAW,KAAKgB,MAAgB,KAAKE,IAChHyQ,IAAY,KAAK/P,KAA2B,KAAKA,OAA6B,YAAY8P;AAIhG,QAHA,KAAK3R,GAAQ,UAAU,OAAO,cAAc4R,CAAS,GACrD,KAAK1R,GAAQ,aAAa,cAAc0R,IAAY,gBAAgB,YAAY,GAE5E,KAAK3Q,IAAc;AACrB,WAAK8F,IAAA;AACL;AAAA,IACF;AAEA,IACE4K,KACA,KAAK3R,GAAQ,UAAU,SAAS,iBAAiB,KACjD,CAAC,KAAKA,GAAQ,UAAU,SAAS,sBAAsB,IAEvD,KAAKyR,IAAA,KAEL,KAAK1K,IAAA,GACL,KAAKwG,GAAA;AAAA,EAET;AAAA,EAEA/G,MAA4B;AAC1B,IAAK,KAAK7E,QACV,OAAO,aAAa,KAAKA,GAAoB,GAC7C,KAAKA,MAAuB;AAAA,EAC9B;AAAA,EAEAkQ,MAA2B;AACzB,WAAOrT,EAAwB,KAAKyB,EAAM;AAAA,EAC5C;AAAA,EAEAsH,KAAqB;AACnB,WAAO,KAAK,iBAAiB,KAAKhE,OAAyB,KAAKD;AAAA,EAClE;AAAA,EAEAwO,KAA+B;AAC7B,SAAKpL,IAAA,GACL,KAAKkB,IAAsB,KAAK9D,EAAsB,GACtD,KAAKF,KAAqB,IAC1B,KAAKC,KAAoB,IACzB,KAAKC,KAAyB,MAC9B,KAAKpD,GAAe,UAAU,OAAO,kBAAkB,uBAAuB,GAC9E,KAAKC,GAAe,UAAU,OAAO,qBAAqB;AAAA,EAC5D;AAAA,EAEAoF,KAAyB,MAAM;AAC7B,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK/F,GAAQ,UAAU,OAAO,yBAAyB,mBAAmB,mBAAmB,0BAA0B,GACvH,KAAK8R,GAAA,GACL,KAAKpR,GAAe,WAAW,IAC/B,KAAKA,GAAe,aAAa,iBAAiB,MAAM;AACxD;AAAA,IACF;AAEA,QAAI,CAAC,KAAK6C,KAAuB;AAC/B,YAAMwO,IAAoB,KAAKF,IAAA;AAC/B,MAAIE,MAAsB,aACxB,KAAKxO,MAAwB,IAC7B,KAAKD,MAAiByO,MAAsB,eAE5C,KAAK9R,GAAO,cAAc,iBAAiB,iBAC3C,CAACnB,EAA2B,KAAKmB,EAAM,MAEvC,KAAKsD,MAAwB,IAC7B,KAAKD,MAAiB;AAAA,IAE1B;AAEA,UAAM0O,IAAyB,KAAKtR,GAAe,QAC7CuR,IAAiB,KAAK1K,GAAA,GACtB2K,IAAU,CAACD,KAAkB,KAAKhS,GAAO,SAAS,KAAKA,GAAO,UAAU,GACxEkS,IAAeF,KAAkB,CAAC,KAAKhS,GAAO,QAAQ,KAAKA,GAAO,SAAS,GAC3EmS,IAAgB,KAAK,MAAMD,IAAe,GAAG,GAC7CE,IAAgBH,IAAU,UAAU;AAE1C,IAAI,KAAKhO,OAAoB,KAAKA,QAAqBmO,KACrD,KAAKjF,IAAA,GAGP,KAAKlJ,MAAmBmO,GAExB,KAAKrS,GAAQ,UAAU,OAAO,yBAAyB,CAACiS,CAAc,GACtE,KAAKjS,GAAQ,UAAU,OAAO,mBAAmBkS,CAAO,GACxD,KAAKlS,GAAQ,UAAU,OAAO,mBAAmB,CAACkS,CAAO,GACzD,KAAKlS,GAAQ,MAAM,YAAY,qBAAqB,GAAGoS,CAAa,GAAG,GACvE,KAAK1R,GAAe,WAAW,CAACuR,GAChC,KAAKvR,GAAe,aAAa,iBAAiB,GAAG,CAACuR,CAAc,EAAE,GACtE,KAAKvR,GAAe;AAAA,MAClB;AAAA,MACCuR,IAAwCC,IAAU,iBAAiB,eAAlD;AAAA,IAAkD,GAEtE,KAAKtR,GAAa,aAAa,iBAAiB,GAAGwR,CAAa,EAAE,GAClE,KAAKxR,GAAa,aAAa,kBAAkB,GAAGwR,CAAa,GAAG,GAE/DH,KACH,KAAKH,GAAA,GAGHE,MAA2BC,KAC7B,KAAKrM,IAAA;AAAA,EAET;AAAA,EAEA0M,IAAsB/F,GAAiB;AACrC,QAAI,CAAC,KAAKhF,KAAsB;AAChC,UAAMvI,IAAO,KAAK4B,GAAa,sBAAA,GACzBxB,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAMmN,IAAUvN,EAAK,OAAOA,EAAK,MAAO,CAAC,GAC3EuT,IAAU,KAAK,MAAMnT,IAAU,GAAG,IAAI;AAC5C,SAAKa,GAAO,SAASsS,GACrB,KAAKtS,GAAO,QAAQsS,KAAW,GAC/B,KAAKxM,GAAA;AAAA,EACP;AAAA,EAEA6B,IAAsB4K,GAA0B;AAC9C,IAAIA,MAAc,QACd,KAAK5R,GAAa,kBAAkB4R,CAAS,KAC/C,KAAK5R,GAAa,sBAAsB4R,CAAS;AAAA,EAErD;AAAA,EAEAC,IAAmBD,GAA0B;AAC3C,SAAK5O,KAAqB,IAC1B,KAAKE,KAAyB,MAC9B,KAAKnD,GAAe,UAAU,OAAO,qBAAqB,GAC1D,KAAKC,GAAa,KAAA,GAClB,KAAKgH,IAAsB4K,CAAS,GACpC,KAAKE,IAA4B,GAAG;AAAA,EACtC;AAAA,EAEA1M,MAA6B,MAAM;AACjC,UAAM2M,IAAW,SAAS,4BAA4B,KAAK1S,IACrD1C,IAAQ,KAAK0C,IACb2S,IAAc,GAAQ,KAAK,2BAA2B,SAAS,2BAA2BrV,EAAM;AACtG,SAAKyC,GAAQ,UAAU,OAAO,yBAAyB2S,CAAQ,GAC/D,KAAK9R,GAAyB,WAAW,CAAC+R,GAC1C,KAAK/R,GAAyB,aAAa,cAAc8R,IAAW,4BAA4B,0BAA0B;AAAA,EAC5H;AAAA,EAEAE,MAAwB;AACtB,WAAO5V,EAAqB,KAAK0C,EAAK;AAAA,EACxC;AAAA,EAEAmT,MAAyB;AACvB,WAAO1V,EAAsB,KAAK,mBAAmB,KAAK4C,IAAS,KAAKC,EAAM;AAAA,EAChF;AAAA,EAEA8S,MAA2B;AACzB,WAAOnV,EAAwB,KAAKoC,EAAO;AAAA,EAC7C;AAAA,EAEAgT,MAA0B;AACxB,IAAAjV,EAAuB,KAAKkC,EAAM;AAAA,EACpC;AAAA,EAEAgT,MAAkB;AAChB,WAAOjV,EAAA;AAAA,EACT;AAAA,EAEAiI,MAAuB,MAAM;AAC3B,UAAMiN,IAAoB,KAAKL,IAAA,GACzBF,IAAWO,MAAsB,KAAKlT,MAAWkT,MAAsB,MACvEN,IAAc,KAAKE,IAAA;AACzB,gBAAK9S,GAAQ,UAAU,OAAO,iBAAiB2S,CAAQ,GACvD,KAAK7R,GAAmB,WAAW,CAAC8R,GACpC,KAAK9R,GAAmB,aAAa,cAAc6R,IAAW,oBAAoB,kBAAkB,GAC7FA;AAAA,EACT;AAAA,EAEAxI,MAA0B,MAAM;AAC9B,UAAMgJ,IAAqB,KAAKlN,IAAA;AAChC,SAAKmN,IAA6BD,CAAkB;AAAA,EACtD;AAAA,EAEAC,IAA6BD,GAA6B;AACxD,SAAK/M,GAAA,GACL,KAAKM,IAAA,GACL,KAAK2M,IAAqB,KAAKzR,EAAqB,GACpD,KAAKgG,IAAsB,KAAK9D,EAAsB,GACtD,KAAK0C,IAAA,GACL,KAAKtF,KAAmB,IACxB,KAAKD,KAAe,IACpB,KAAKoC,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,OAAO,sBAAsB,GACpD,KAAK4B,KAAwB,MAC7B,KAAK4B,KAA+B,IACpC,KAAKK,KAAoB,IACzB,KAAKD,KAAqB,IAC1B,KAAKE,KAAyB,MAC9B,KAAK8C,IAAA,GACL,KAAKuG,IAAA,GACL,KAAK9M,GAAkB,MAAM,eAAe,2BAA2B,GACvE,KAAKK,GAAe,UAAU,OAAO,gBAAgB,GACrD,KAAKC,GAAe,UAAU,OAAO,qBAAqB,GAC1D,KAAKX,GAAQ,UAAU,OAAO,cAAc,GAC5C,KAAKA,GAAQ,UAAU,OAAO,mBAAmB;AAEjD,UAAMsT,IAAgB,KAAK3T,GAAM;AACjC,IAAI2T,aAAyB,eAC3BA,EAAc,KAAA,GAGZH,IACF,KAAKjG,IAAA,IAEL,KAAKd,IAAA;AAAA,EAET;AAAA,EAEAmH,MAAkB,MAAM;AACtB,IAAI,CAAC,KAAKrS,MAAoB,KAAKD,OAEnC,KAAKgO,GAAA,GACL,KAAK7I,GAAA,GACL,KAAKI,IAAA,GACL,KAAKvF,KAAe,IACpB,KAAKjB,GAAQ,UAAU,IAAI,cAAc,GACzC,KAAKoB,KAAmB,KAAKyL,GAAwB,KAAKnL,KAAc,EAAI,GACxE,KAAKP,MAAkB,KAAKlB,GAAO,MAAA,GACvC,KAAKA,GAAO,cAAc,KAAKmB,IAC/B,KAAKkM,GAAyB,KAAKlM,EAAgB,GACnD,KAAKmM,GAAgB,KAAKnM,EAAgB,GAC1C,KAAK2F,IAAA,GACL,KAAKb,GAAA;AAAA,EACP;AAAA,EAEAmN,IAAqBb,GAA0B;AAC7C,IAAIA,MAAc,QACd,KAAKrS,GAAe,kBAAkBqS,CAAS,KACjD,KAAKrS,GAAe,sBAAsBqS,CAAS;AAAA,EAEvD;AAAA,EAEA,MAAMgB,IAAajU,GAAwBiT,GAA0BiB,GAAuB;AAC1F,QAAI,CAAC,KAAKvS,MAAoB,CAAC,KAAKD,GAAc;AAElD,UAAMyS,IAAc,KAAKzS;AACzB,SAAKuF,IAAA,GACL,KAAKtF,KAAmB,IACxB,KAAKD,KAAe,IACpB,KAAKoC,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,OAAO,sBAAsB,GACpD,KAAKA,GAAQ,MAAM,YAAY,yBAAyB,MAAM,GAC9D,KAAK4B,KAAwB,MAC7B,KAAK5B,GAAQ,UAAU,OAAO,cAAc,GAC5C,KAAK6G,IAAA,GACL,KAAKwM,IAAqBb,CAAS,GAE/BiB,KAAgBlU,MAAY,SAC9B,KAAK0P,GAAA,GACL,KAAK7N,KAAmB,KAAKyL,GAAwBtN,GAASmU,CAAW,GACzE,KAAKlS,KAA2B,IAChC,KAAKC,MAA4B,KAAKN,IACtC,KAAKlB,GAAO,cAAc,KAAKmB,IAC/B,KAAKkM,GAAyB,KAAKlM,EAAgB,IAGrD,KAAKmM,GAAgB,KAAKnM,EAAgB,GAEtCsS,KAAe,KAAKvS,MACtB,MAAM,KAAKlB,GAAO,KAAA,GAGpB,KAAK8L,GAAA;AAAA,EACP;AAAA,EAEA4H,IAAanB,GAA0B;AACrC,IAAI,CAAC,KAAKtR,MAAoB,CAAC,KAAKD,OAEpC,KAAKuF,IAAA,GACL,KAAKtF,KAAmB,IACxB,KAAKD,KAAe,IACpB,KAAKoC,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,OAAO,sBAAsB,GACpD,KAAKA,GAAQ,MAAM,YAAY,yBAAyB,MAAM,GAC9D,KAAK4B,KAAwB,MAC7B,KAAK5B,GAAQ,UAAU,OAAO,cAAc,GAC5C,KAAK6G,IAAA,GACL,KAAKwM,IAAqBb,CAAS,GACnC,KAAKlF,GAAA,GACL,KAAKC,GAAA,GAED,KAAKpM,MACF,KAAKlB,GAAO,KAAA,GAGnB,KAAK8L,GAAA;AAAA,EACP;AAAA,EAEA8E,IAAsB3S,GAAc;AAClC,QAAI,CAAC,KAAKiG,IAAoB,QAAOlG,EAAgBC,CAAI;AACzD,UAAM0V,IAAW,OAAO,SAAS,KAAK3T,GAAO,QAAQ,IAAI,KAAKA,GAAO,WAAW;AAChF,WAAI2T,KAAY,IAAU3V,EAAgBC,CAAI,IACvC,IAAID,EAAgB,KAAK,IAAI,GAAG2V,IAAW1V,CAAI,CAAC,CAAC;AAAA,EAC1D;AAAA,EAEA2V,MAA2B;AACzB,IAAK,KAAKzP,QACV,OAAO,aAAa,KAAKA,GAAmB,GAC5C,KAAKA,MAAsB;AAAA,EAC7B;AAAA,EAEA0P,MAAmB;AACjB,SAAKD,IAAA,GACL,KAAKtT,GAAc,UAAU,OAAO,mBAAmB,GAClD,KAAKA,GAAc,aACxB,KAAKA,GAAc,UAAU,IAAI,mBAAmB,GACpD,KAAK6D,MAAsB,OAAO,WAAW,MAAM;AACjD,WAAKA,MAAsB,GAC3B,KAAK7D,GAAc,UAAU,OAAO,mBAAmB;AAAA,IACzD,GAAG,GAAG;AAAA,EACR;AAAA,EAEAqJ,MAAyB,CAAC8B,MAAiB;AACzC,IAAAA,EAAM,gBAAA,GACN,KAAKvH,MAAqB,CAAC,KAAKA,KAChC,KAAK2P,IAAA,GACD,KAAKlH,QAA2B,KAAKvJ,KACnC,KAAK9C,OACN,KAAKA,GAAc,cAAc,KAAKsQ,IAAsB,KAAKzP,EAAgB,GACjF,KAAK2I,IAAA,KAGR,KAAKjC,IAAoB,KAAK2H,IAAwB;AAAA,EAE1D;AAAA,EAEAzH,MAAqB,YAAY;AAC/B,QAAI,YAAY,QAAQ,KAAK7F;AAC3B;AAGF,UAAM4R,IAAa,KAAKlS,KACpB,KAAKA,OAA6B,YAClC,KAAK5B,GAAO,UAAU,KAAKA,GAAO,OAChC+T,IAAwB,CAACD,KAAc,KAAKvF,IAAA;AAElD,SAAKxC,GAAA,GAEDgI,MACF,KAAKnS,KAA2BkS,IAAa,YAAY,UACzD,KAAK7N,GAAA,IAGH6N,KACF,KAAK9E,GAAA,GACL,MAAM,KAAKxD,GAAA,GACX,MAAM,KAAKxL,GAAO,KAAA,EAAO,MAAM,MAAM;AACnC,WAAK4B,KAA2B;AAAA,IAClC,CAAC,MAED,KAAKuN,IAAA,GACL,KAAKnP,GAAO,MAAA,IAGd,KAAKiG,GAAA,GACL,KAAK6F,GAAA;AAAA,EACP;AAAA,EAEArD,MAA2B,CAACgD,MAAiB;AAC3C,QAAI,EAAEA,aAAiB,cAAe;AAEtC,UAAMuI,IAAa,KAAK/T,GAAQ,sBAAA,GAC1BgU,IACJxI,EAAM,WAAWuI,EAAW,QAC5BvI,EAAM,WAAWuI,EAAW,SAC5BvI,EAAM,WAAWuI,EAAW,OAC5BvI,EAAM,WAAWuI,EAAW,QACxBE,IAAkB,KAAK/T,GAAa,sBAAA,GACpCgU,IACJ1I,EAAM,WAAWyI,EAAgB,QACjCzI,EAAM,WAAWyI,EAAgB,SACjCzI,EAAM,WAAWyI,EAAgB,OACjCzI,EAAM,WAAWyI,EAAgB,QAC7BE,IAAe,KAAKlU,GAAe,sBAAA,GACnCmU,IACJ5I,EAAM,WAAW2I,EAAa,QAC9B3I,EAAM,WAAW2I,EAAa,SAC9B3I,EAAM,WAAW2I,EAAa,OAC9B3I,EAAM,WAAW2I,EAAa,QAC1BE,IAAoB,KAAKvI,GAAA;AAE/B,IAAIuI,KAAqBL,MACvB,KAAK/R,MAAiC,YAAY,IAAA,IAAQ,MAGxDoS,MAAsBH,KAAuBE,OAC/C,KAAKlS,MAAkC,YAAY,IAAA,IAAQ,MAGxD,KAAKqJ,GAAA;AAAA,EACZ;AAAA,EAEAjC,MAA2B,CAACkC,MAAiB;AAC3C,IAAAA,EAAM,gBAAA;AAAA,EACR;AAAA,EAEAhF,MAAyB;AACvB,IAAK,KAAK3C,QACV,OAAO,aAAa,KAAKA,GAAiB,GAC1C,KAAKA,MAAoB;AAAA,EAC3B;AAAA,EAEAyQ,MAAqB;AACnB,QAAI,CAAC,KAAKjN,GAAA,KAAwB,CAAC,KAAK,qBAAqB;AAC3D,WAAKuK,GAAA;AACL;AAAA,IACF;AACA,SAAKpL,IAAA,GACL,KAAKhG,GAAe,UAAU,IAAI,gBAAgB;AAAA,EACpD;AAAA,EAEAiH,MAAsB,MAAM;AAE1B,IADA,KAAK5D,MAAoB,GACrB,OAAKF,MAAqB,KAAKD,OACnC,KAAKlD,GAAe,UAAU,OAAO,gBAAgB;AAAA,EACvD;AAAA,EAEAgS,IAA4B5G,IAAQ,KAAK;AACvC,SAAKpF,IAAA,GACL,KAAK3C,MAAoB,OAAO,WAAW,KAAK4D,KAAqBmE,CAAK;AAAA,EAC5E;AAAA,EAEA7C,MAA4B,MAAM;AAChC,QAAI,MAAK2C,MACT;AAAA,UAAI,CAAC,KAAKrE,GAAA,KAAwB,CAAC,KAAK,qBAAqB;AAC3D,aAAKuK,GAAA;AACL;AAAA,MACF;AACA,WAAKjO,KAAoB,IACzB,KAAK2Q,IAAA;AAAA;AAAA,EACP;AAAA,EAEAtL,MAA4B,MAAM;AAChC,QAAI,MAAK0C,MACT;AAAA,UAAI,CAAC,KAAKrE,GAAA,KAAwB,CAAC,KAAK,qBAAqB;AAC3D,aAAKuK,GAAA;AACL;AAAA,MACF;AACA,WAAKjO,KAAoB,IACzB,KAAK6O,IAAA;AAAA;AAAA,EACP;AAAA,EAEAvJ,MAA4B,CAACuC,MAAiB;AAG5C,QAFAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACF,CAAC,KAAKnE,MAAsB;AAC9B,WAAKuK,GAAA;AACL;AAAA,IACF;AACA,IAAI,CAAC,KAAK9E,IAAA,KAAyB,KAAKC,UACxC,KAAKjB,GAAA,GACL,KAAKrE,IAAA,GACD,KAAK1H,GAAO,SAAS,KAAKA,GAAO,UAAU,KACzC,KAAKA,GAAO,UAAU,MAAG,KAAKA,GAAO,SAAS,MAClD,KAAKA,GAAO,QAAQ,MAEpB,KAAKA,GAAO,QAAQ,IAGtB,KAAK8F,GAAA,GACL,KAAKgG,GAAA;AAAA,EACP;AAAA,EAEA3C,MAA2B,CAACsC,MAAiB;AAC3C,QAAMA,aAAiB,cAGvB;AAAA,UAFAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACF,CAAC,KAAKnE,QAAwB,CAAC,KAAK,uBAAuB,KAAKqE,MAAoB;AACtF,aAAKkG,GAAA;AACL;AAAA,MACF;AACA,WAAK9F,GAAA,GACL,KAAK5F,GAAA,GACL,KAAKoO,IAAA,GACL,KAAK5Q,KAAqB,IAC1B,KAAKE,KAAyB4H,EAAM,WACpC,KAAK/K,GAAe,UAAU,IAAI,qBAAqB,GACvD,KAAKC,GAAa,kBAAkB8K,EAAM,SAAS,GACnD,KAAK4G,IAAsB5G,EAAM,OAAO;AAAA;AAAA,EAC1C;AAAA,EAEArC,MAA2B,CAACqC,MAAiB;AAC3C,IAAMA,aAAiB,gBAClB,KAAK9H,OACN,KAAKE,OAA2B,QAAQ4H,EAAM,cAAc,KAAK5H,OACrE4H,EAAM,eAAA,GACNA,EAAM,gBAAA,GACN,KAAK4G,IAAsB5G,EAAM,OAAO;AAAA,EAC1C;AAAA,EAEApC,MAAyB,CAACoC,MAAiB;AACzC,IAAMA,aAAiB,iBACnB,KAAK5H,OAA2B,QAAQ4H,EAAM,cAAc,KAAK5H,OACrE4H,EAAM,gBAAA,GACN,KAAK+G,IAAmB/G,EAAM,SAAS,GACvC,KAAKK,GAAA;AAAA,EACP;AAAA,EAEAxC,MAA6B,CAACmC,MAAiB;AAC7C,IAAMA,aAAiB,iBACnB,KAAK5H,OAA2B,QAAQ4H,EAAM,cAAc,KAAK5H,OACrE4H,EAAM,gBAAA,GACN,KAAK+G,IAAmB/G,EAAM,SAAS;AAAA,EACzC;AAAA,EAEAjC,MAAuB,CAACiC,MAAiB;AACvC,QAAI,EAAEA,aAAiB,eAAgB;AACvC,QAAI,CAAC,KAAKnE,MAAsB;AAC9B,MAAAmE,EAAM,eAAA,GACNA,EAAM,gBAAA,GACN,KAAKoG,GAAA;AACL;AAAA,IACF;AACA,QAAI,CAAC,CAAC,WAAW,aAAa,QAAQ,KAAK,EAAE,SAASpG,EAAM,GAAG,EAAG;AAElE,IAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN,UAAM+I,IAAO/I,EAAM,WAAW,MAAM,MAC9BgJ,IACJhJ,EAAM,QAAQ,SACV,IACAA,EAAM,QAAQ,QACZ,IACA,KAAKzL,GAAO,UAAUyL,EAAM,QAAQ,YAAY+I,IAAO,CAACA;AAChE,SAAKxU,GAAO,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGyU,CAAU,CAAC,GACxD,KAAKzU,GAAO,QAAQ,KAAKA,GAAO,UAAU,GAC1C,KAAK8F,GAAA;AAAA,EACP;AAAA,EAEA2D,MAA+B,YAAY;AACzC,UAAMnM,IAAQ,KAAK0C;AAInB,QAAI,GAAC,KAAK,2BAA2B,CAAC,SAAS,2BAA2B,CAAC1C,EAAM,4BAC7E,GAAC,KAAKyP,IAAA,KAAyB,KAAKC,QACxC;AAAA,WAAKjB,GAAA;AAEL,UAAI;AACF,cAAM,KAAKP,GAAA,GACP,SAAS,4BAA4B,KAAKxL,KAC5C,MAAM,SAAS,qBAAA,IAEf,MAAM1C,EAAM,wBAAA;AAAA,MAEhB,QAAQ;AAAA,MAER,UAAA;AACE,aAAKyI,IAAA,GACL,KAAK+F,GAAA;AAAA,MACP;AAAA;AAAA,EACF;AAAA,EAEApC,MAAyB,OAAO+B,MAAiB;AAC/C,QAAK,KAAKoH,UACVpH,EAAM,eAAA,GACNA,EAAM,gBAAA,GACF,GAAC,KAAKsB,IAAA,KAAyB,KAAKC,SACxC;AAAA,WAAKZ,IAAsBX,CAAK,GAChC,KAAKM,GAAA;AAEL,UAAI;AACF,cAAMkH,IAAoB,KAAKL,IAAA;AAC/B,QAAIK,MAAsB,KAAKlT,MAAWkT,MAAsB,OAC9D,MAAM,KAAKD,IAAA,KAEX,MAAM,KAAKxH,GAAA,GACP3N,EAA2B,KAAKkC,EAAO,IACzC,MAAM,KAAK+S,IAAA,IAEX,KAAKC,IAAA;AAAA,MAGX,QAAQ;AAAA,MAER,UAAA;AACE,aAAK/M,IAAA,GACL,KAAK8F,GAAA;AAAA,MACP;AAAA;AAAA,EACF;AAAA,EAEAzD,MAA8B,CAACoD,MAAiB;AAC9C,IAAI,KAAKE,GAAA,KAAsB,KAAKgB,QAChC,EAAElB,aAAiB,iBAAiB,EAAEA,aAAiB,gBAE3D,KAAKrI,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,IAAI,sBAAsB,GACjD,KAAK6M,GAAwBnB,EAAM,SAAS,IAAO,EAAK;AAAA,EAC1D;AAAA,EAEAnD,MAA8B,MAAM;AAClC,IAAI,KAAKqE,QAET,KAAKF,IAAA;AAAA,EACP;AAAA,EAEA9D,MAA6B,CAAC8C,MAAiB;AAC7C,QAAMA,aAAiB,cAGvB;AAAA,UAFAA,EAAM,eAAA,GAEF,CAAC,KAAKsB,IAAA,KAAyB,KAAKC,OAAgC;AACtE,aAAKjB,GAAA,GACD,KAAKJ,SACP,KAAKxJ,MAAkC,YAAY,IAAA,IAAQ;AAE7D;AAAA,MACF;AAEA,WAAK4J,GAAA,GACL,KAAK5F,GAAA,GACL,KAAKiH,IAAA,GACL,KAAK7L,KAA2B,IAChC,KAAKC,MAA4B,IACjC,KAAK+O,IAAsB,KAAKf,IAAwB,GACxD,KAAKvO,KAAmB,IACxB,KAAKU,KAAwB8J,EAAM,WACnC,KAAKhK,MAAegK,EAAM,SAC1B,KAAKvK,KAAmB,CAAC,KAAKlB,GAAO,UAAU,CAAC,KAAKA,GAAO,OAC5D,KAAKE,GAAe,kBAAkBuL,EAAM,SAAS,GACrD,KAAKtK,KAAmB,KAAKyL,GAAwBnB,EAAM,SAAS,EAAK,GACzE,KAAKlF,IAAA,GACL,KAAK7E,MAAuB,OAAO,WAAW,KAAK4R,KAAiB,KAAK9O,GAAoB;AAAA;AAAA,EAC/F;AAAA,EAEAuE,MAAyB,CAAC0C,MAAiB;AAGzC,QAFI,EAAEA,aAAiB,kBACnB,CAAC,OAAO,SAAS,KAAKzL,GAAO,QAAQ,KAAK,KAAKA,GAAO,YAAY,KAClE,CAAC,CAAC,aAAa,cAAc,QAAQ,OAAO,UAAU,UAAU,EAAE,SAASyL,EAAM,GAAG,EAAG;AAE3F,IAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACN,KAAKlD,IAAA;AAEL,UAAMmM,IAAW,KAAKlF,GAAA,GAChBmF,IAAYlJ,EAAM,WAAW,KAAK,GAClCmJ,IAAY,KAAK,IAAI,IAAI,KAAK5U,GAAO,WAAW,GAAG,GACnD6U,IACJpJ,EAAM,QAAQ,SACV,IACAA,EAAM,QAAQ,QACZ,KAAKzL,GAAO,WACZyL,EAAM,QAAQ,WACZiJ,IAAWE,IACXnJ,EAAM,QAAQ,aACZiJ,IAAWE,IACXF,KAAYjJ,EAAM,QAAQ,eAAekJ,IAAY,CAACA;AAElE,SAAK3U,GAAO,cAAc,KAAK,IAAI,KAAKA,GAAO,UAAU,KAAK,IAAI,GAAG6U,CAAQ,CAAC,GAC9E,KAAKxH,GAAyB,KAAKrN,GAAO,WAAW,GACrD,KAAKsN,GAAgB,KAAKtN,GAAO,WAAW;AAAA,EAC9C;AAAA,EAEA4I,MAA6B,CAAC6C,MAAiB;AAC7C,QAAMA,aAAiB,cACvB;AAAA,UAAI,CAAC,KAAKxK,IAAkB;AAC1B,QAAK,KAAK0K,SACR,KAAKvI,KAA6B,IAClC,KAAKrD,GAAQ,UAAU,IAAI,sBAAsB,GACjD,KAAK6M,GAAwBnB,EAAM,SAAS,IAAO,EAAK;AAE1D;AAAA,MACF;AACA,MAAI,KAAK9J,OAA0B,QAAQ8J,EAAM,cAAc,KAAK9J,OAEhE,CAAC,KAAKX,MAAgB,KAAK,IAAIyK,EAAM,UAAU,KAAKhK,GAAY,KAAK,KAAK2C,OAC5E,KAAKkP,IAAA,GAGF,KAAKtS,OACV,KAAKG,KAAmB,KAAKyL,GAAwBnB,EAAM,OAAO;AAAA;AAAA,EACpE;AAAA,EAEA5C,MAA2B,CAAC4C,MAAiB;AAC3C,IAAMA,aAAiB,iBACnB,KAAK9J,OAA0B,QAAQ8J,EAAM,cAAc,KAAK9J,MAC/D,KAAK4R,IAAa9H,EAAM,SAASA,EAAM,WAAW,EAAI;AAAA,EAC7D;AAAA,EAEA3C,MAA+B,CAAC2C,MAAiB;AAC/C,IAAMA,aAAiB,iBACnB,KAAK9J,OAA0B,QAAQ8J,EAAM,cAAc,KAAK9J,MACpE,KAAK+R,IAAajI,EAAM,SAAS;AAAA,EACnC;AAAA,EAEA1B,MAA2B,CAAC0B,MAAiB;AAC3C,QAAMA,aAAiB,cACvB;AAAA,UAAI,KAAK5H,OAA2B,QAAQ4H,EAAM,cAAc,KAAK5H,IAAwB;AAC3F,aAAK2O,IAAmB/G,EAAM,SAAS;AACvC;AAAA,MACF;AACA,MAAI,KAAK9J,OAA0B,QAAQ8J,EAAM,cAAc,KAAK9J,MAC/D,KAAK4R,IAAa9H,EAAM,SAASA,EAAM,WAAW,EAAI;AAAA;AAAA,EAC7D;AAAA,EAEAzB,MAA+B,CAACyB,MAAiB;AAC/C,QAAMA,aAAiB,cACvB;AAAA,UAAI,KAAK5H,OAA2B,QAAQ4H,EAAM,cAAc,KAAK5H,IAAwB;AAC3F,aAAK2O,IAAmB/G,EAAM,SAAS;AACvC;AAAA,MACF;AACA,MAAI,KAAK9J,OAA0B,QAAQ8J,EAAM,cAAc,KAAK9J,MACpE,KAAK+R,IAAajI,EAAM,SAAS;AAAA;AAAA,EACnC;AAAA,EAEAtB,MAAoB,MAAM;AACxB,SAAKqI,IAAmB,KAAK3O,EAAsB,GACnD,KAAK6P,IAAa,KAAK/R,EAAqB;AAAA,EAC9C;AAAA,EAEAyI,MAAqB,MAAM;AACzB,IAAI,KAAKwI,SACT,KAAKzG,IAAA;AAAA,EACP;AAAA,EAEA9B,MAAmB,MAAM;AACvB,SAAKzI,KAA2B,MAChC,KAAKoN,GAAA,GACA,KAAKrC,aAA8BU,GAAA,GACxC,KAAKpH,GAAA;AAAA,EACP;AAAA,EAEAqE,MAAoB,MAAM;AACxB,SAAK1I,KAA2B,MAC3B,KAAK+K,aAA8BsC,IAAA,GACxC,KAAKpJ,GAAA,GACL,KAAKI,GAAA;AAAA,EACP;AAAA,EAEAsE,MAAoB,MAAM;AACxB,SAAK3I,KAA2B,MAChC,KAAKoN,GAAA,GACA,KAAKrC,aAA8BU,GAAA,GACxC,KAAKpH,GAAA;AAAA,EACP;AAAA,EAEAuE,MAAwB,MAAM;AAC5B,SAAK0D,IAAiB,IAAM,EAAI;AAAA,EAClC;AAAA,EAEAzD,MAAsB,MAAM;AAC1B,SAAKyD,IAAiB,EAAI;AAAA,EAC5B;AAAA,EAEAvD,MAA6B,MAAM;AACjC,SAAKqE,GAAA,GACL,KAAKlJ,GAAA,GACA,KAAK6G,aAA8BU,GAAA,GACxC,KAAKxH,GAAA,GACL,KAAKyH,GAAA;AAAA,EACP;AAAA,EAEA1C,MAAsB,MAAM;AAC1B,UAAMkE,IAAU,KAAKpE,IAAA;AACrB,SAAK5E,GAAA,GACDgJ,KAAW,CAAC,KAAKnC,GAAA,UAA8BU,GAAA,GACnD,KAAKpH,GAAA;AAAA,EACP;AAAA,EAEA4E,MAAqB,MAAM;AAGzB,QAFA,KAAKmE,GAAA,GACL,KAAKnJ,GAAA,GAEH,KAAKtE,OACJ,CAAC,KAAKC,OAA6B,KAAKxB,GAAO,cAAc,iBAAiB,mBAC/E;AACA,WAAKyO,IAAA,GACL,KAAKxI,GAAA;AACL;AAAA,IACF;AAEA,IAAK,KAAK0G,aAA8BU,GAAA,GACxC,KAAKC,GAAA;AAAA,EACP;AAAA,EAEAxC,MAAoB,MAAM;AACxB,SAAKlJ,KAA2B,MAChC,KAAKS,KAAwB,IAC7B,KAAKC,KAA0B,IAC/B,KAAKC,KAA4B,IACjC,KAAKC,KAAiC,IACtC,KAAKC,MAA2B,GAChC,KAAK1C,GAAQ,UAAU,OAAO,mBAAmB,GACjD,KAAKmO,IAAiB,IAAM,EAAI,GAChC,KAAKjI,GAAA,GACL,KAAKuI,IAAA;AAAA,EACP;AAAA,EAEAzD,MAAyB,MAAM;AAC7B,SAAKjF,GAAA,GACL,KAAKwH,GAAA;AAAA,EACP;AAAA,EAEAtC,MAA2B,MAAM;AAC/B,SAAKlF,GAAA;AAAA,EACP;AAAA,EAEA6F,KAAmB;AACjB,WACE,OAAO,WAAW,oBAAoB,EAAE,WACxC,OAAO,WAAW,kCAAkC,EAAE;AAAA,EAE1D;AAAA,EAEAzE,MAAe;AACb,IAAK,KAAKlH,OACV,KAAKJ,IAAW,WAAA,GAChB,KAAKA,KAAY,MACjB,KAAKyG,IAAA,GACL,KAAKC,IAAA,GACL,KAAKxG,KAAqB,IAC1B,KAAK+B,MAAoB,GACzB,KAAKQ,KAAwB,IAC7B,KAAKC,KAA0B,IAC/B,KAAKC,KAA4B,IACjC,KAAKC,KAAiC,IACtC,KAAKC,MAA2B,GAChC,KAAKE,MAA6B,IAClC,KAAKK,MAA4B,GACjC,KAAKgM,GAAA,GACL,KAAK3L,MAAiB,IACtB,KAAKC,MAAwB,IAC7B,KAAKuO,GAAA,GACL,KAAKtQ,KAA2B,IAChC,KAAKC,MAA4B,IACjC,KAAKI,KAA2B,MAChC,KAAK7B,GAAQ,UAAU,OAAO,mBAAmB,qBAAqB,sBAAsB,GAC5F,KAAKC,GAAO,QAAQ,MAAM,KAAK,KAC/B,KAAKA,GAAO,MAAA,GACZ,KAAKA,GAAO,gBAAgB,KAAK,GACjC,KAAKA,GAAO,UAAU,QACtB,KAAKyF,IAAA,GACL,KAAKzF,GAAO,KAAA,GACZ,KAAKwN,GAAmB,CAAC,GACzB,KAAK1H,GAAA,GACL,KAAKD,GAAA,GACL,KAAKI,GAAA;AAAA,EACP;AACF;AC1tEK,eAAe,IAAI,eAAe,KACrC,eAAe,OAAO,iBAAiBxG,CAAY;"}