@shival99/z-ui 2.4.3 → 2.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/assets/css/base.css +2 -1
  2. package/assets/css/global.css +23 -2
  3. package/assets/css/tailwind.css +7 -4
  4. package/fesm2022/shival99-z-ui-components-z-accordion.mjs +6 -6
  5. package/fesm2022/shival99-z-ui-components-z-accordion.mjs.map +1 -1
  6. package/fesm2022/shival99-z-ui-components-z-audio-player.mjs +3 -3
  7. package/fesm2022/shival99-z-ui-components-z-audio-player.mjs.map +1 -1
  8. package/fesm2022/shival99-z-ui-components-z-autocomplete.mjs +27 -12
  9. package/fesm2022/shival99-z-ui-components-z-autocomplete.mjs.map +1 -1
  10. package/fesm2022/shival99-z-ui-components-z-avatar.mjs +6 -6
  11. package/fesm2022/shival99-z-ui-components-z-avatar.mjs.map +1 -1
  12. package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs +3 -3
  13. package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs.map +1 -1
  14. package/fesm2022/shival99-z-ui-components-z-button-group.mjs +11 -11
  15. package/fesm2022/shival99-z-ui-components-z-button-group.mjs.map +1 -1
  16. package/fesm2022/shival99-z-ui-components-z-button.mjs +3 -3
  17. package/fesm2022/shival99-z-ui-components-z-button.mjs.map +1 -1
  18. package/fesm2022/shival99-z-ui-components-z-calendar.mjs +40 -40
  19. package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -1
  20. package/fesm2022/shival99-z-ui-components-z-card.mjs +7 -7
  21. package/fesm2022/shival99-z-ui-components-z-card.mjs.map +1 -1
  22. package/fesm2022/shival99-z-ui-components-z-chat.mjs +4 -4
  23. package/fesm2022/shival99-z-ui-components-z-chat.mjs.map +1 -1
  24. package/fesm2022/shival99-z-ui-components-z-checkbox.mjs +3 -3
  25. package/fesm2022/shival99-z-ui-components-z-checkbox.mjs.map +1 -1
  26. package/fesm2022/shival99-z-ui-components-z-code.mjs +58 -19
  27. package/fesm2022/shival99-z-ui-components-z-code.mjs.map +1 -1
  28. package/fesm2022/shival99-z-ui-components-z-command.mjs +6 -5
  29. package/fesm2022/shival99-z-ui-components-z-command.mjs.map +1 -1
  30. package/fesm2022/shival99-z-ui-components-z-drawer.mjs +17 -17
  31. package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -1
  32. package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs +12 -4
  33. package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs.map +1 -1
  34. package/fesm2022/shival99-z-ui-components-z-editor.mjs +6 -6
  35. package/fesm2022/shival99-z-ui-components-z-editor.mjs.map +1 -1
  36. package/fesm2022/shival99-z-ui-components-z-empty.mjs +3 -3
  37. package/fesm2022/shival99-z-ui-components-z-empty.mjs.map +1 -1
  38. package/fesm2022/shival99-z-ui-components-z-filter.mjs +27 -27
  39. package/fesm2022/shival99-z-ui-components-z-filter.mjs.map +1 -1
  40. package/fesm2022/shival99-z-ui-components-z-gallery.mjs +42 -34
  41. package/fesm2022/shival99-z-ui-components-z-gallery.mjs.map +1 -1
  42. package/fesm2022/shival99-z-ui-components-z-hover-glide.mjs +221 -0
  43. package/fesm2022/shival99-z-ui-components-z-hover-glide.mjs.map +1 -0
  44. package/fesm2022/shival99-z-ui-components-z-icon.mjs +3 -3
  45. package/fesm2022/shival99-z-ui-components-z-icon.mjs.map +1 -1
  46. package/fesm2022/shival99-z-ui-components-z-input.mjs +5 -5
  47. package/fesm2022/shival99-z-ui-components-z-input.mjs.map +1 -1
  48. package/fesm2022/shival99-z-ui-components-z-kanban.mjs +4 -4
  49. package/fesm2022/shival99-z-ui-components-z-kanban.mjs.map +1 -1
  50. package/fesm2022/shival99-z-ui-components-z-loading.mjs +18 -4
  51. package/fesm2022/shival99-z-ui-components-z-loading.mjs.map +1 -1
  52. package/fesm2022/shival99-z-ui-components-z-marquee.mjs +3 -3
  53. package/fesm2022/shival99-z-ui-components-z-marquee.mjs.map +1 -1
  54. package/fesm2022/shival99-z-ui-components-z-media-player.mjs +346 -956
  55. package/fesm2022/shival99-z-ui-components-z-media-player.mjs.map +1 -1
  56. package/fesm2022/shival99-z-ui-components-z-menu.mjs +8 -8
  57. package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -1
  58. package/fesm2022/shival99-z-ui-components-z-metric-card.mjs +5 -5
  59. package/fesm2022/shival99-z-ui-components-z-metric-card.mjs.map +1 -1
  60. package/fesm2022/shival99-z-ui-components-z-modal.mjs +17 -17
  61. package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -1
  62. package/fesm2022/shival99-z-ui-components-z-number-ticker.mjs +352 -0
  63. package/fesm2022/shival99-z-ui-components-z-number-ticker.mjs.map +1 -0
  64. package/fesm2022/shival99-z-ui-components-z-overlay.mjs +9 -9
  65. package/fesm2022/shival99-z-ui-components-z-overlay.mjs.map +1 -1
  66. package/fesm2022/shival99-z-ui-components-z-pagination.mjs +4 -4
  67. package/fesm2022/shival99-z-ui-components-z-pagination.mjs.map +1 -1
  68. package/fesm2022/shival99-z-ui-components-z-popover.mjs +14 -14
  69. package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -1
  70. package/fesm2022/shival99-z-ui-components-z-qrcode.mjs +32 -8
  71. package/fesm2022/shival99-z-ui-components-z-qrcode.mjs.map +1 -1
  72. package/fesm2022/shival99-z-ui-components-z-radio.mjs +3 -3
  73. package/fesm2022/shival99-z-ui-components-z-radio.mjs.map +1 -1
  74. package/fesm2022/shival99-z-ui-components-z-scrollarea.mjs +3 -3
  75. package/fesm2022/shival99-z-ui-components-z-scrollarea.mjs.map +1 -1
  76. package/fesm2022/shival99-z-ui-components-z-select.mjs +181 -26
  77. package/fesm2022/shival99-z-ui-components-z-select.mjs.map +1 -1
  78. package/fesm2022/shival99-z-ui-components-z-show-more.mjs +3 -3
  79. package/fesm2022/shival99-z-ui-components-z-show-more.mjs.map +1 -1
  80. package/fesm2022/shival99-z-ui-components-z-skeleton-auto.mjs +4 -4
  81. package/fesm2022/shival99-z-ui-components-z-skeleton-auto.mjs.map +1 -1
  82. package/fesm2022/shival99-z-ui-components-z-skeleton.mjs +5 -5
  83. package/fesm2022/shival99-z-ui-components-z-skeleton.mjs.map +1 -1
  84. package/fesm2022/shival99-z-ui-components-z-steps.mjs +4 -4
  85. package/fesm2022/shival99-z-ui-components-z-steps.mjs.map +1 -1
  86. package/fesm2022/shival99-z-ui-components-z-switch.mjs +5 -5
  87. package/fesm2022/shival99-z-ui-components-z-switch.mjs.map +1 -1
  88. package/fesm2022/shival99-z-ui-components-z-table.mjs +107 -105
  89. package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -1
  90. package/fesm2022/shival99-z-ui-components-z-tabs.mjs +327 -31
  91. package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -1
  92. package/fesm2022/shival99-z-ui-components-z-tags.mjs +15 -15
  93. package/fesm2022/shival99-z-ui-components-z-tags.mjs.map +1 -1
  94. package/fesm2022/shival99-z-ui-components-z-timeline.mjs +4 -4
  95. package/fesm2022/shival99-z-ui-components-z-timeline.mjs.map +1 -1
  96. package/fesm2022/shival99-z-ui-components-z-toast.mjs +10 -9
  97. package/fesm2022/shival99-z-ui-components-z-toast.mjs.map +1 -1
  98. package/fesm2022/shival99-z-ui-components-z-tooltip.mjs +11 -11
  99. package/fesm2022/shival99-z-ui-components-z-tooltip.mjs.map +1 -1
  100. package/fesm2022/shival99-z-ui-components-z-upload.mjs +3 -3
  101. package/fesm2022/shival99-z-ui-components-z-upload.mjs.map +1 -1
  102. package/fesm2022/shival99-z-ui-i18n.mjs +6 -26
  103. package/fesm2022/shival99-z-ui-i18n.mjs.map +1 -1
  104. package/fesm2022/shival99-z-ui-pipes.mjs +18 -18
  105. package/fesm2022/shival99-z-ui-pipes.mjs.map +1 -1
  106. package/fesm2022/shival99-z-ui-services.mjs +31 -31
  107. package/fesm2022/shival99-z-ui-services.mjs.map +1 -1
  108. package/package.json +21 -1
  109. package/types/shival99-z-ui-components-z-autocomplete.d.ts +6 -2
  110. package/types/shival99-z-ui-components-z-calendar.d.ts +4 -4
  111. package/types/shival99-z-ui-components-z-card.d.ts +21 -21
  112. package/types/shival99-z-ui-components-z-code.d.ts +16 -3
  113. package/types/shival99-z-ui-components-z-drawer.d.ts +1 -1
  114. package/types/shival99-z-ui-components-z-editor.d.ts +8 -8
  115. package/types/shival99-z-ui-components-z-gallery.d.ts +4 -1
  116. package/types/shival99-z-ui-components-z-hover-glide.d.ts +48 -0
  117. package/types/shival99-z-ui-components-z-icon.d.ts +1 -1
  118. package/types/shival99-z-ui-components-z-loading.d.ts +9 -2
  119. package/types/shival99-z-ui-components-z-media-player.d.ts +102 -172
  120. package/types/shival99-z-ui-components-z-metric-card.d.ts +19 -19
  121. package/types/shival99-z-ui-components-z-modal.d.ts +1 -1
  122. package/types/shival99-z-ui-components-z-number-ticker.d.ts +110 -0
  123. package/types/shival99-z-ui-components-z-overlay.d.ts +3 -3
  124. package/types/shival99-z-ui-components-z-popover.d.ts +11 -8
  125. package/types/shival99-z-ui-components-z-qrcode.d.ts +5 -2
  126. package/types/shival99-z-ui-components-z-select.d.ts +45 -7
  127. package/types/shival99-z-ui-components-z-switch.d.ts +22 -21
  128. package/types/shival99-z-ui-components-z-table.d.ts +1 -1
  129. package/types/shival99-z-ui-components-z-tabs.d.ts +59 -7
  130. package/types/shival99-z-ui-components-z-toast.d.ts +1 -1
  131. package/types/shival99-z-ui-components-z-tooltip.d.ts +2 -2
  132. package/types/shival99-z-ui-components-z-upload.d.ts +3 -3
  133. package/types/shival99-z-ui-services.d.ts +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"shival99-z-ui-components-z-media-player.mjs","sources":["../../../../libs/core-ui/components/z-media-player/z-media-player.define.ts","../../../../libs/core-ui/components/z-media-player/z-media-player.variants.ts","../../../../libs/core-ui/components/z-media-player/z-media-player.component.ts","../../../../libs/core-ui/components/z-media-player/z-media-player.component.html","../../../../libs/core-ui/components/z-media-player/shival99-z-ui-components-z-media-player.ts"],"sourcesContent":["import type { ZMediaPlayerControls } from './z-media-player.types';\n\n/** Matches youtube.com/watch, youtu.be, youtube.com/embed and /shorts links, capturing the 11-char video id. */\nexport const YOUTUBE_URL_PATTERN = /(?:youtube\\.com\\/(?:watch\\?(?:.*&)?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([\\w-]{11})/;\n\n/** Every control group renders by default; pass `zControls` to opt specific groups out. */\nexport const DEFAULT_MEDIA_PLAYER_CONTROLS: ZMediaPlayerControls = {\n play: true,\n volume: true,\n skip: true,\n time: true,\n timeline: true,\n subtitles: true,\n settings: true,\n pip: true,\n theater: true,\n fullscreen: true,\n};\n","import { cva } from 'class-variance-authority';\n\nexport const zMediaPlayerVariants = cva(\n 'relative overflow-hidden bg-black select-none transition-all duration-300 w-full flex flex-col justify-center items-center group/player outline-none',\n {\n variants: {\n zLayout: {\n default: 'aspect-video rounded-sm shadow-sm border border-border max-w-5xl mx-auto',\n theater: 'w-full aspect-[21/9] max-w-full',\n fullscreen: 'fixed inset-0 w-screen h-screen z-[9999] rounded-none max-w-full aspect-none',\n },\n },\n defaultVariants: {\n zLayout: 'default',\n },\n }\n);\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n NgZone,\n output,\n signal,\n computed,\n effect,\n viewChild,\n afterNextRender,\n OnDestroy,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ZButtonComponent } from '@shival99/z-ui/components/z-button';\nimport { ZIconComponent } from '@shival99/z-ui/components/z-icon';\nimport { ZPopoverDirective } from '@shival99/z-ui/components/z-popover';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport { DEFAULT_MEDIA_PLAYER_CONTROLS, YOUTUBE_URL_PATTERN } from './z-media-player.define';\nimport type {\n ZDocumentWithPiP,\n ZMediaPlayerControls,\n ZMediaPlayerPlaybackSpeed,\n ZMediaPlayerSettingsPanel,\n ZMediaPlayerSource,\n ZMediaPlayerSubtitleTrack,\n ZMediaPlayerThumbnailCue,\n ZMediaPlayerVariants,\n ZWebkitHTMLVideoElement,\n} from './z-media-player.types';\nimport { zMediaPlayerVariants } from './z-media-player.variants';\n\n@Component({\n selector: 'z-media-player',\n imports: [CommonModule, FormsModule, ZIconComponent, ZPopoverDirective, TranslatePipe, ZButtonComponent],\n standalone: true,\n templateUrl: './z-media-player.component.html',\n styleUrl: './z-media-player.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'zClasses()',\n '[attr.tabindex]': '0',\n '(keydown)': 'onKeyDown($event)',\n '(mouseleave)': 'onMouseLeave()',\n '(document:fullscreenchange)': 'onFullscreenStateChange()',\n },\n})\nexport class ZMediaPlayerComponent implements OnDestroy {\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\n private readonly _ngZone = inject(NgZone);\n private readonly _sanitizer = inject(DomSanitizer);\n\n // Inputs\n public readonly class = input<ClassValue>('');\n public readonly zSrc = input.required<string>();\n public readonly zSources = input<ZMediaPlayerSource[]>([]);\n public readonly zPoster = input<string>('');\n public readonly zAutoplay = input(false);\n public readonly zLoop = input(false);\n public readonly zMuted = input(false);\n public readonly zVolume = input(1.0);\n public readonly zSubtitles = input<ZMediaPlayerSubtitleTrack[]>([]);\n /** URL to a WebVTT storyboard file powering the YouTube-style timeline hover preview. */\n public readonly zThumbnailsVtt = input<string>('');\n /** Toggles which control bar groups render. Unset groups default to visible. */\n public readonly zControls = input<Partial<ZMediaPlayerControls>>({});\n\n // Outputs\n public readonly zLoaded = output<void>();\n public readonly zError = output<Error | null>();\n public readonly zPlay = output<boolean>();\n public readonly zTimeUpdate = output<number>();\n public readonly zVolumeChange = output<number>();\n public readonly zFullscreenChange = output<boolean>();\n public readonly zTheaterModeChange = output<boolean>();\n public readonly zMiniplayerChange = output<boolean>();\n public readonly zQualityChange = output<ZMediaPlayerSource>();\n\n // Element Refs sử dụng signal viewChild thay vì decorator\n public readonly videoElement = viewChild<ElementRef<HTMLVideoElement>>('videoElement');\n public readonly timelineContainer = viewChild<ElementRef<HTMLDivElement>>('timelineContainer');\n private readonly _settingsPopover = viewChild(ZPopoverDirective);\n\n // Component Signals trạng thái trình phát\n protected readonly isPlaying = signal(false);\n protected readonly currentTime = signal(0);\n protected readonly duration = signal(0);\n protected readonly volume = signal(1.0);\n protected readonly isMuted = signal(false);\n protected readonly playbackSpeed = signal(1.0);\n protected readonly activeSourceSrc = signal<string | null>(null);\n private readonly _activeQualitySourceLabel = signal<string | null>(null);\n protected readonly showControls = signal(true);\n protected readonly isPointerOver = signal(false);\n protected readonly isBuffering = signal(false);\n protected readonly captionsEnabled = signal(false);\n protected readonly subtitleText = signal('');\n protected readonly hasSubtitles = computed(() => this.zSubtitles().length > 0);\n protected readonly isTheaterMode = signal(false);\n protected readonly isFullscreen = signal(false);\n protected readonly isMiniplayer = signal(false);\n protected readonly showSettings = signal(false);\n protected readonly settingsPanel = signal<ZMediaPlayerSettingsPanel>('main');\n protected readonly isDragging = signal(false);\n\n // Tiến trình đệm và phát\n protected readonly bufferedProgress = signal(0);\n protected readonly progress = signal(0);\n\n // Trạng thái visual hiển thị\n protected readonly playPauseFlash = signal<'play' | 'pause' | null>(null);\n protected readonly hoverTimeLabel = signal<string | null>(null);\n protected readonly hoverTime = signal<number | null>(null);\n protected readonly hoverX = signal(0);\n\n // Storyboard thumbnails cho preview khi hover timeline (kiểu YouTube)\n private readonly _thumbnailCues = signal<ZMediaPlayerThumbnailCue[]>([]);\n private readonly _positionedSubtitleTracks = new WeakSet<TextTrack>();\n\n // Lớp phủ tua nhanh nhảy số cộng dồn kiểu YouTube\n protected readonly skipOverlayDirection = signal<'left' | 'right' | null>(null);\n protected readonly skipOverlayValue = signal(0);\n protected readonly skipOverlayPulse = signal(0);\n\n // Kiểm tra trình duyệt hỗ trợ Picture-in-Picture\n protected readonly isPiPSupported = computed(() => {\n if (typeof document === 'undefined') {\n return false;\n }\n const doc = document as ZDocumentWithPiP;\n const hasPiP = doc.pictureInPictureEnabled;\n const hasRequestPiP =\n typeof HTMLVideoElement !== 'undefined' && 'requestPictureInPicture' in HTMLVideoElement.prototype;\n if (hasPiP && hasRequestPiP) {\n return true;\n }\n const video = this.videoElement()?.nativeElement;\n if (video) {\n const supportsPresentationMode = (video as ZWebkitHTMLVideoElement).webkitSupportsPresentationMode;\n const hasWebkit =\n 'webkitSupportsPresentationMode' in video &&\n typeof supportsPresentationMode === 'function' &&\n supportsPresentationMode.call(video, 'picture-in-picture');\n return !!hasWebkit;\n }\n const hasWebkitProto =\n typeof HTMLVideoElement !== 'undefined' &&\n 'webkitSupportsPresentationMode' in HTMLVideoElement.prototype &&\n 'webkitSetPresentationMode' in HTMLVideoElement.prototype;\n return hasWebkitProto;\n });\n\n // Danh sách các tốc độ phát video\n protected readonly playbackSpeeds: readonly ZMediaPlayerPlaybackSpeed[] = [\n { label: '0.25x', value: 0.25 },\n { label: '0.5x', value: 0.5 },\n { label: '0.75x', value: 0.75 },\n { label: 'i18n_z_ui_media_player_normal', value: 1.0 },\n { label: '1.25x', value: 1.25 },\n { label: '1.5x', value: 1.5 },\n { label: '2.0x', value: 2.0 },\n ];\n\n // Lưu trữ Timer ẩn thanh điều khiển và điều hướng\n private _controlsTimeout: ReturnType<typeof setTimeout> | null = null;\n private _flashTimeout: ReturnType<typeof setTimeout> | null = null;\n private _skipOverlayTimeout: ReturnType<typeof setTimeout> | null = null;\n private _bufferAnimationFrame: number | null = null;\n private _playbackAnimationFrame: number | null = null;\n private _mouseMoveCleanup: (() => void) | null = null;\n private _lastMouseMoveAt = 0;\n private _bufferedTarget = 0;\n private _accumulatedSkip = 0;\n\n // Cập nhật CVA class dựa trên các trạng thái giao diện\n protected readonly zClasses = computed(() => {\n let layout: ZMediaPlayerVariants['zLayout'] = 'default';\n if (this.isTheaterMode()) {\n layout = 'theater';\n }\n if (this.isFullscreen()) {\n layout = 'fullscreen';\n }\n\n return zMergeClasses(zMediaPlayerVariants({ zLayout: layout }), this.class());\n });\n\n // Nhãn thời gian hiển thị computed signals\n protected readonly currentTimeLabel = computed(() => this._formatTime(this.currentTime()));\n protected readonly durationLabel = computed(() => this._formatTime(this.duration()));\n\n protected readonly controls = computed<ZMediaPlayerControls>(() => ({\n ...DEFAULT_MEDIA_PLAYER_CONTROLS,\n ...this.zControls(),\n }));\n\n protected readonly effectiveSrc = computed(() => this.activeSourceSrc() ?? this.zSrc());\n protected readonly qualitySources = computed(() => this.zSources().filter(source => !!source.src));\n protected readonly activeQualityLabel = computed(\n () => this._activeQualitySourceLabel() ?? this.qualitySources()[0]?.label ?? 'Auto'\n );\n\n // Nhận diện link YouTube để nhúng iframe gốc thay vì thẻ <video>\n protected readonly youtubeVideoId = computed(() => YOUTUBE_URL_PATTERN.exec(this.effectiveSrc())?.[1] ?? null);\n protected readonly isYouTube = computed(() => this.youtubeVideoId() !== null);\n protected readonly youtubeEmbedUrl = computed(() => {\n const id = this.youtubeVideoId();\n if (!id) {\n return null;\n }\n\n const params = new URLSearchParams({\n autoplay: this.zAutoplay() ? '1' : '0',\n mute: this.zMuted() ? '1' : '0',\n loop: this.zLoop() ? '1' : '0',\n playsinline: '1',\n rel: '0',\n modestbranding: '1',\n });\n if (this.zLoop()) {\n params.set('playlist', id);\n }\n\n return this._sanitizer.bypassSecurityTrustResourceUrl(\n `https://www.youtube-nocookie.com/embed/${id}?${params.toString()}`\n );\n });\n\n // Cue storyboard đang khớp với thời điểm đang hover trên timeline\n protected readonly hoverThumbnailCue = computed(() => {\n const time = this.hoverTime();\n const cues = this._thumbnailCues();\n if (time === null || cues.length === 0) {\n return null;\n }\n\n return cues.find(cue => time >= cue.start && time < cue.end) ?? cues[cues.length - 1];\n });\n\n constructor() {\n effect(() => {\n const fallbackSrc = this.zSrc();\n const sources = this.qualitySources();\n const currentLabel = this._activeQualitySourceLabel();\n if (currentLabel && sources.some(source => source.label === currentLabel)) {\n return;\n }\n\n const defaultSource = sources[0] ?? null;\n this.activeSourceSrc.set(defaultSource?.src ?? fallbackSrc);\n this._activeQualitySourceLabel.set(defaultSource?.label ?? null);\n });\n\n effect(() => {\n const src = this.effectiveSrc();\n const video = this.videoElement()?.nativeElement;\n if (video) {\n if (video.src !== src) {\n video.src = src;\n }\n video.load();\n }\n });\n\n effect(() => {\n const vttUrl = this.zThumbnailsVtt();\n if (!vttUrl) {\n this._thumbnailCues.set([]);\n return;\n }\n\n void this._loadThumbnailVtt(vttUrl);\n });\n\n effect(() => {\n this.showControls();\n this.isFullscreen();\n const video = this.videoElement()?.nativeElement;\n if (!video || !this.captionsEnabled()) {\n return;\n }\n\n let i = 0;\n while (i < video.textTracks.length) {\n this._positionSubtitleCues(video.textTracks[i]);\n i++;\n }\n });\n\n afterNextRender(() => {\n this._initializeVideoState();\n this._ngZone.runOutsideAngular(() => {\n const host = this._elementRef.nativeElement;\n const onMouseMove = () => {\n this.isPointerOver.set(true);\n const now = performance.now();\n if (this.showControls() && now - this._lastMouseMoveAt < 200) {\n return;\n }\n\n this._lastMouseMoveAt = now;\n this._resetControlsTimer();\n };\n host.addEventListener('mousemove', onMouseMove, { passive: true });\n this._mouseMoveCleanup = () => host.removeEventListener('mousemove', onMouseMove);\n });\n });\n }\n\n ngOnDestroy(): void {\n this._mouseMoveCleanup?.();\n if (this._controlsTimeout) {\n clearTimeout(this._controlsTimeout);\n }\n if (this._flashTimeout) {\n clearTimeout(this._flashTimeout);\n }\n if (this._skipOverlayTimeout) {\n clearTimeout(this._skipOverlayTimeout);\n }\n if (this._bufferAnimationFrame !== null) {\n cancelAnimationFrame(this._bufferAnimationFrame);\n }\n if (this._playbackAnimationFrame !== null) {\n cancelAnimationFrame(this._playbackAnimationFrame);\n }\n }\n\n // Khởi tạo trạng thái âm lượng và tắt tiếng khi bắt đầu render\n private _initializeVideoState(): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n video.volume = this.zVolume();\n this.volume.set(this.zVolume());\n\n video.muted = this.zMuted();\n this.isMuted.set(this.zMuted());\n\n this._resetControlsTimer();\n }\n\n // Thay đổi trạng thái Phát / Tạm dừng\n protected togglePlay(): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n if (video.paused) {\n video.play().catch(console.error);\n this._triggerFlashIcon('play');\n return;\n }\n\n video.pause();\n this._triggerFlashIcon('pause');\n }\n\n // Kích hoạt flash icon giữa màn hình\n private _triggerFlashIcon(type: 'play' | 'pause'): void {\n if (this._flashTimeout) {\n clearTimeout(this._flashTimeout);\n }\n\n this.playPauseFlash.set(type);\n this._flashTimeout = setTimeout(() => {\n this.playPauseFlash.set(null);\n }, 500);\n }\n\n // Bật / tắt tiếng (Mute)\n protected toggleMute(): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n const nextMuted = !video.muted;\n video.muted = nextMuted;\n this.isMuted.set(nextMuted);\n this.zVolumeChange.emit(nextMuted ? 0 : this.volume());\n }\n\n // Điều chỉnh mức âm lượng từ slider\n protected onVolumeChange(val: number): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n video.volume = val;\n this.volume.set(val);\n\n const isSilent = val === 0;\n video.muted = isSilent;\n this.isMuted.set(isSilent);\n\n this.zVolumeChange.emit(val);\n }\n\n // Đặt tốc độ phát video\n protected setPlaybackSpeed(speed: number): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n video.playbackRate = speed;\n this.playbackSpeed.set(speed);\n this.closeSettingsPanel();\n }\n\n protected openSettingsPanel(panel: ZMediaPlayerSettingsPanel): void {\n this.settingsPanel.set(panel);\n }\n\n protected closeSettingsPanel(): void {\n this.settingsPanel.set('main');\n }\n\n protected onSettingsHidden(): void {\n this.showSettings.set(false);\n this.closeSettingsPanel();\n if (this._controlsTimeout) {\n clearTimeout(this._controlsTimeout);\n this._controlsTimeout = null;\n }\n\n if (!this.isPointerOver()) {\n this.showControls.set(false);\n return;\n }\n\n this._controlsTimeout = setTimeout(() => {\n this.showControls.set(false);\n this._controlsTimeout = null;\n }, 1000);\n }\n\n protected toggleInlineSettings(): void {\n const nextVisible = !this.showSettings();\n this.showSettings.set(nextVisible);\n if (!nextVisible) {\n this.closeSettingsPanel();\n }\n this.onMouseMove();\n }\n\n protected setQualitySource(source: ZMediaPlayerSource): void {\n if (source.label === this.activeQualityLabel()) {\n this.closeSettingsPanel();\n return;\n }\n\n if (source.src === this.effectiveSrc()) {\n this._activeQualitySourceLabel.set(source.label);\n this.zQualityChange.emit(source);\n this.closeSettingsPanel();\n return;\n }\n\n const video = this.videoElement()?.nativeElement;\n const current = video?.currentTime ?? this.currentTime();\n const shouldResume = !!video && !video.paused;\n const playbackRate = video?.playbackRate ?? this.playbackSpeed();\n\n if (video) {\n let didResume = false;\n const restorePosition = () => {\n const safeTime = Number.isFinite(video.duration) ? Math.min(current, video.duration) : current;\n video.playbackRate = playbackRate;\n video.currentTime = safeTime;\n this.currentTime.set(safeTime);\n if (shouldResume && !didResume) {\n didResume = true;\n video.play().catch(console.error);\n }\n };\n\n video.addEventListener('loadedmetadata', restorePosition, { once: true });\n video.addEventListener('loadeddata', restorePosition, { once: true });\n }\n\n this.activeSourceSrc.set(source.src);\n this._activeQualitySourceLabel.set(source.label);\n this._setBufferedTarget(0);\n this.zQualityChange.emit(source);\n this.closeSettingsPanel();\n }\n\n // Tua đến mốc thời gian chỉ định\n protected seekTo(time: number): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n video.currentTime = time;\n this.currentTime.set(time);\n this._syncPlaybackProgress(time);\n }\n\n // Bật/tắt chế độ rạp phim (Theater Mode)\n protected toggleTheaterMode(): void {\n if (this.isFullscreen()) {\n return;\n }\n\n const nextState = !this.isTheaterMode();\n this.isTheaterMode.set(nextState);\n this.zTheaterModeChange.emit(nextState);\n }\n\n // Bật/tắt chế độ toàn màn hình\n protected toggleFullscreen(): void {\n const wrapper = this._elementRef.nativeElement;\n if (!wrapper) {\n return;\n }\n\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(console.error);\n return;\n }\n\n wrapper.requestFullscreen().catch(console.error);\n }\n\n // Lắng nghe sự kiện thay đổi fullscreen (liên kết qua host property của component)\n protected onFullscreenStateChange(): void {\n const isFull = !!document.fullscreenElement;\n this.isFullscreen.set(isFull);\n this.onSettingsHidden();\n this.zFullscreenChange.emit(isFull);\n }\n\n // Trình phát thu nhỏ (Picture-in-Picture)\n protected async toggleMiniplayer(): Promise<void> {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n try {\n const doc = document as ZDocumentWithPiP;\n if (doc.pictureInPictureEnabled && typeof video.requestPictureInPicture === 'function') {\n if (doc.pictureInPictureElement) {\n await doc.exitPictureInPicture();\n this.isMiniplayer.set(false);\n this.zMiniplayerChange.emit(false);\n return;\n }\n\n await video.requestPictureInPicture();\n this.isMiniplayer.set(true);\n this.zMiniplayerChange.emit(true);\n return;\n }\n\n const webkitVideo = video as ZWebkitHTMLVideoElement;\n if (\n 'webkitSupportsPresentationMode' in webkitVideo &&\n typeof webkitVideo.webkitSupportsPresentationMode === 'function' &&\n webkitVideo.webkitSupportsPresentationMode('picture-in-picture')\n ) {\n const currentMode = webkitVideo.webkitPresentationMode;\n const targetMode = currentMode === 'picture-in-picture' ? 'inline' : 'picture-in-picture';\n if (typeof webkitVideo.webkitSetPresentationMode !== 'function') {\n return;\n }\n webkitVideo.webkitSetPresentationMode(targetMode);\n const isPiP = targetMode === 'picture-in-picture';\n this.isMiniplayer.set(isPiP);\n this.zMiniplayerChange.emit(isPiP);\n }\n } catch (err) {\n console.warn('Picture-in-Picture API error: ', err);\n }\n }\n\n protected onEnterPiP(): void {\n this.isMiniplayer.set(true);\n this.zMiniplayerChange.emit(true);\n }\n\n protected onLeavePiP(): void {\n this.isMiniplayer.set(false);\n this.zMiniplayerChange.emit(false);\n }\n\n protected onWebkitPresentationModeChanged(): void {\n const video = this.videoElement()?.nativeElement;\n if (video) {\n const isPiP = (video as ZWebkitHTMLVideoElement).webkitPresentationMode === 'picture-in-picture';\n this.isMiniplayer.set(isPiP);\n this.zMiniplayerChange.emit(isPiP);\n }\n }\n\n // Bật/tắt hiển thị phụ đề (CC)\n protected toggleSubtitles(): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n const tracks = video.textTracks;\n const currentEnabled = this.captionsEnabled();\n const targetState = !currentEnabled;\n\n this.captionsEnabled.set(targetState);\n\n let i = 0;\n while (i < tracks.length) {\n const track = tracks[i];\n track.mode = targetState ? 'showing' : 'disabled';\n if (targetState) {\n this._positionSubtitleCues(track);\n }\n i++;\n }\n\n if (!targetState) {\n this.subtitleText.set('');\n return;\n }\n\n this._updateSubtitleText(tracks);\n }\n\n private _positionSubtitleCues(track: TextTrack): void {\n if (!this._positionedSubtitleTracks.has(track) && typeof track.addEventListener === 'function') {\n track.addEventListener('cuechange', () => {\n this._positionSubtitleCues(track);\n this._updateSubtitleText(this.videoElement()?.nativeElement.textTracks);\n });\n this._positionedSubtitleTracks.add(track);\n }\n\n const cues = track.activeCues;\n if (!cues) {\n return;\n }\n\n let i = 0;\n while (i < cues.length) {\n const cue = cues[i];\n if (typeof VTTCue !== 'undefined' && cue instanceof VTTCue) {\n cue.line = 0;\n }\n i++;\n }\n }\n\n private _updateSubtitleText(tracks: TextTrackList | undefined): void {\n if (!tracks) {\n this.subtitleText.set('');\n return;\n }\n\n let i = 0;\n while (i < tracks.length) {\n const cues = tracks[i].activeCues;\n if (cues && cues.length > 0) {\n const cue = cues[0];\n if ('text' in cue && typeof cue.text === 'string') {\n this.subtitleText.set(cue.text);\n return;\n }\n }\n i++;\n }\n\n this.subtitleText.set('');\n }\n\n // Cập nhật trạng thái khi video phát/dừng\n protected onPlayStateChange(playing: boolean): void {\n this.isPlaying.set(playing);\n this.zPlay.emit(playing);\n if (!playing) {\n const video = this.videoElement()?.nativeElement;\n this._stopPlaybackProgressLoop();\n this._syncPlaybackProgress(video?.currentTime ?? this.currentTime());\n this._resetControlsTimer();\n return;\n }\n\n this._startPlaybackProgressLoop();\n this._resetControlsTimer();\n }\n\n // Cập nhật mốc thời gian phát\n protected onTimeUpdate(): void {\n const video = this.videoElement()?.nativeElement;\n if (!video || this.isDragging()) {\n return;\n }\n\n this.currentTime.set(video.currentTime);\n this.zTimeUpdate.emit(video.currentTime);\n this._syncPlaybackProgress(video.currentTime);\n this.updateBufferedProgress();\n }\n\n protected onDurationChange(): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n this.duration.set(video.duration);\n this._syncPlaybackProgress(video.currentTime);\n this.updateBufferedProgress();\n }\n\n protected onLoadedData(): void {\n if (this.zSubtitles().some(subtitle => subtitle.default)) {\n this.captionsEnabled.set(true);\n }\n this.zLoaded.emit();\n }\n\n protected onVideoError(): void {\n const video = this.videoElement()?.nativeElement;\n this.zError.emit(video?.error ? new Error(video.error.message || 'Media playback error') : null);\n }\n\n protected onSeeking(seeking: boolean): void {\n this.isBuffering.set(seeking);\n if (!seeking) {\n this.updateBufferedProgress();\n }\n }\n\n protected updateBufferedProgress(): void {\n const video = this.videoElement()?.nativeElement;\n if (!video || video.buffered.length === 0 || this.duration() === 0) {\n return;\n }\n\n const end = video.buffered.end(video.buffered.length - 1);\n this._setBufferedTarget((end / this.duration()) * 100);\n }\n\n private _setBufferedTarget(target: number): void {\n this._bufferedTarget = Math.min(100, Math.max(0, target));\n\n if (typeof requestAnimationFrame === 'undefined' || this._bufferAnimationFrame !== null) {\n return;\n }\n\n const animate = (): void => {\n const current = this.bufferedProgress();\n const distance = this._bufferedTarget - current;\n if (Math.abs(distance) < 0.1) {\n this.bufferedProgress.set(this._bufferedTarget);\n this._bufferAnimationFrame = null;\n return;\n }\n\n this.bufferedProgress.set(current + distance * 0.08);\n this._bufferAnimationFrame = requestAnimationFrame(animate);\n };\n\n this._bufferAnimationFrame = requestAnimationFrame(animate);\n }\n\n private _startPlaybackProgressLoop(): void {\n if (typeof requestAnimationFrame === 'undefined' || this._playbackAnimationFrame !== null) {\n return;\n }\n\n const animate = (): void => {\n const video = this.videoElement()?.nativeElement;\n if (!video || video.paused || video.ended) {\n this._playbackAnimationFrame = null;\n this._syncPlaybackProgress(video?.currentTime ?? this.currentTime());\n return;\n }\n\n this._syncPlaybackProgress(video.currentTime);\n this._playbackAnimationFrame = requestAnimationFrame(animate);\n };\n\n this._playbackAnimationFrame = requestAnimationFrame(animate);\n }\n\n private _stopPlaybackProgressLoop(): void {\n if (this._playbackAnimationFrame === null) {\n return;\n }\n\n cancelAnimationFrame(this._playbackAnimationFrame);\n this._playbackAnimationFrame = null;\n }\n\n private _syncPlaybackProgress(time: number): void {\n const dur = this.duration();\n if (!Number.isFinite(dur) || dur <= 0 || !Number.isFinite(time)) {\n this.progress.set(0);\n return;\n }\n\n this.progress.set(Math.min(100, Math.max(0, (time / dur) * 100)));\n }\n\n // Bắt đầu kéo thanh timeline phát\n protected onTimelineDragStart(event: MouseEvent): void {\n event.preventDefault();\n this.isDragging.set(true);\n this._updateTimeFromCoords(event);\n\n const moveHandler = (moveEvent: MouseEvent) => {\n this._updateTimeFromCoords(moveEvent);\n };\n\n const upHandler = () => {\n this.isDragging.set(false);\n document.removeEventListener('mousemove', moveHandler);\n document.removeEventListener('mouseup', upHandler);\n this._resetControlsTimer();\n };\n\n document.addEventListener('mousemove', moveHandler);\n document.addEventListener('mouseup', upHandler);\n }\n\n protected onTimelineHover(event: MouseEvent): void {\n const container = this.timelineContainer()?.nativeElement;\n if (!container) {\n return;\n }\n\n const rect = container.getBoundingClientRect();\n const offsetX = event.clientX - rect.left;\n this.hoverX.set(offsetX);\n\n const ratio = Math.max(0, Math.min(1, offsetX / rect.width));\n const hoverTime = ratio * this.duration();\n this.hoverTime.set(hoverTime);\n this.hoverTimeLabel.set(this._formatTime(hoverTime));\n }\n\n protected onTimelineHoverEnd(): void {\n this.hoverTime.set(null);\n this.hoverTimeLabel.set(null);\n }\n\n // Tải và phân tích file WebVTT storyboard cho preview ảnh nhỏ khi hover timeline\n private async _loadThumbnailVtt(vttUrl: string): Promise<void> {\n try {\n const response = await fetch(vttUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch thumbnails VTT: ${response.status}`);\n }\n\n const text = await response.text();\n // `response.url` is always absolute (resolves relative input against the document, follows redirects),\n // unlike `vttUrl` which callers may pass as a root-relative path.\n this._thumbnailCues.set(this._parseThumbnailVtt(text, response.url));\n } catch (err) {\n console.warn('Unable to load media player thumbnails VTT: ', err);\n this._thumbnailCues.set([]);\n }\n }\n\n // Phân tích nội dung VTT thành danh sách cue { start, end, src, x, y, w, h }\n private _parseThumbnailVtt(text: string, baseUrl: string): ZMediaPlayerThumbnailCue[] {\n const timeRangePattern = /(\\d{2}:\\d{2}:\\d{2}[.,]\\d{3})\\s*-->\\s*(\\d{2}:\\d{2}:\\d{2}[.,]\\d{3})/;\n const lines = text.split(/\\r?\\n/);\n const cues: ZMediaPlayerThumbnailCue[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const match = timeRangePattern.exec(lines[i]);\n if (!match) {\n continue;\n }\n\n const imageLine = lines[i + 1]?.trim();\n if (!imageLine) {\n continue;\n }\n\n const [imageRef, xywhRef] = imageLine.split('#xywh=');\n const xywh = xywhRef?.split(',').map(Number);\n if (!imageRef || !xywh || xywh.length !== 4 || xywh.some(Number.isNaN)) {\n continue;\n }\n\n cues.push({\n start: this._parseVttTimestamp(match[1]),\n end: this._parseVttTimestamp(match[2]),\n src: new URL(imageRef, baseUrl).href,\n x: xywh[0],\n y: xywh[1],\n w: xywh[2],\n h: xywh[3],\n });\n }\n\n return cues;\n }\n\n private _parseVttTimestamp(value: string): number {\n const [hours, minutes, secondsAndMs] = value.split(':');\n const [seconds, milliseconds] = secondsAndMs.split(/[.,]/);\n return Number(hours) * 3600 + Number(minutes) * 60 + Number(seconds) + Number(milliseconds) / 1000;\n }\n\n private _updateTimeFromCoords(event: MouseEvent): void {\n const container = this.timelineContainer()?.nativeElement;\n if (!container) {\n return;\n }\n\n const rect = container.getBoundingClientRect();\n const offsetX = event.clientX - rect.left;\n const { width } = rect;\n let ratio = offsetX / width;\n\n if (ratio < 0) {\n ratio = 0;\n }\n if (ratio > 1) {\n ratio = 1;\n }\n\n const targetTime = ratio * this.duration();\n const video = this.videoElement()?.nativeElement;\n if (video) {\n video.currentTime = targetTime;\n this.currentTime.set(targetTime);\n }\n }\n\n // Tải lại bộ đếm thời gian ẩn controls\n protected onMouseMove(): void {\n this._resetControlsTimer();\n }\n\n protected onMouseLeave(): void {\n this.isPointerOver.set(false);\n const video = this.videoElement()?.nativeElement;\n if (video && !video.paused && !this.isDragging() && !this.showSettings()) {\n if (this._controlsTimeout) {\n clearTimeout(this._controlsTimeout);\n this._controlsTimeout = null;\n }\n this.showControls.set(false);\n }\n }\n\n private _resetControlsTimer(): void {\n this.showControls.set(true);\n\n if (this._controlsTimeout) {\n clearTimeout(this._controlsTimeout);\n }\n\n const video = this.videoElement()?.nativeElement;\n if (video && !video.paused && !this.showSettings() && !this.isDragging()) {\n this._controlsTimeout = setTimeout(() => {\n this.showControls.set(false);\n }, 1000);\n }\n }\n\n // Click mặt video chỉ điều khiển play/pause; tua dùng các nút skip riêng để tránh click nhanh bị hiểu nhầm.\n protected onVideoClick(): void {\n // Nếu menu cài đặt đang mở, click vào video chỉ đóng menu, không toggle play/pause\n if (this.showSettings()) {\n this._settingsPopover()?.hide();\n this.onSettingsHidden();\n return;\n }\n\n this.togglePlay();\n }\n\n // Kích hoạt overlay tua nhanh cộng dồn\n protected triggerSkip(seconds: number, direction: 'left' | 'right'): void {\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n if (direction === 'left') {\n this.seekTo(Math.max(0, video.currentTime - seconds));\n }\n if (direction === 'right') {\n this.seekTo(Math.min(this.duration(), video.currentTime + seconds));\n }\n\n this._triggerSkipOverlay(seconds, direction);\n }\n\n private _triggerSkipOverlay(seconds: number, direction: 'left' | 'right'): void {\n if (this._skipOverlayTimeout) {\n clearTimeout(this._skipOverlayTimeout);\n }\n\n this._accumulatedSkip += Math.abs(seconds);\n this.skipOverlayDirection.set(direction);\n this.skipOverlayValue.set(this._accumulatedSkip);\n this.skipOverlayPulse.update(value => value + 1);\n\n this._skipOverlayTimeout = setTimeout(() => {\n this.skipOverlayDirection.set(null);\n this.skipOverlayValue.set(0);\n this._accumulatedSkip = 0;\n }, 800);\n }\n\n // Bắt sự kiện phím tắt điều khiển\n protected onKeyDown(event: KeyboardEvent): void {\n const activeEl = document.activeElement;\n if (\n activeEl &&\n (activeEl.tagName === 'INPUT' || activeEl.tagName === 'TEXTAREA' || activeEl.hasAttribute('contenteditable'))\n ) {\n return;\n }\n\n const video = this.videoElement()?.nativeElement;\n if (!video) {\n return;\n }\n\n const key = event.key.toLowerCase();\n\n switch (key) {\n case ' ':\n event.preventDefault();\n this.togglePlay();\n return;\n case 'k':\n this.togglePlay();\n return;\n case 'm':\n this.toggleMute();\n return;\n case 'f':\n this.toggleFullscreen();\n return;\n case 't':\n this.toggleTheaterMode();\n return;\n case 'i':\n void this.toggleMiniplayer();\n return;\n case 'arrowleft':\n event.preventDefault();\n this.triggerSkip(5, 'left');\n return;\n case 'j':\n this.triggerSkip(10, 'left');\n return;\n case 'arrowright':\n event.preventDefault();\n this.triggerSkip(5, 'right');\n return;\n case 'l':\n this.triggerSkip(10, 'right');\n return;\n case 'arrowup':\n event.preventDefault();\n this.onVolumeChange(Math.min(1.0, this.volume() + 0.05));\n return;\n case 'arrowdown':\n event.preventDefault();\n this.onVolumeChange(Math.max(0, this.volume() - 0.05));\n return;\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n this.seekTo((Number(key) / 10) * this.duration());\n return;\n }\n }\n\n protected toggleSettings(): void {\n this.showSettings.set(!this.showSettings());\n }\n\n // Định dạng hiển thị m:ss / h:mm:ss\n private _formatTime(time: number): string {\n if (Number.isNaN(time) || time === Infinity || time < 0) {\n return '0:00';\n }\n\n const hours = Math.floor(time / 3600);\n const minutes = Math.floor((time % 3600) / 60);\n const seconds = Math.floor(time % 60);\n\n const formattedSeconds = seconds < 10 ? `0${seconds}` : seconds;\n\n if (hours > 0) {\n const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes;\n return `${hours}:${formattedMinutes}:${formattedSeconds}`;\n }\n\n return `${minutes}:${formattedSeconds}`;\n }\n}\n","@if (isYouTube()) {\n <!-- Nhúng iframe YouTube gốc, dùng control mặc định của YouTube -->\n <iframe\n class=\"h-full w-full\"\n [src]=\"youtubeEmbedUrl()\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowfullscreen></iframe>\n} @else {\n <!-- Thẻ video chính phát nguồn zSrc -->\n <video\n #videoElement\n class=\"h-full w-full cursor-pointer object-cover\"\n [src]=\"effectiveSrc()\"\n [poster]=\"zPoster()\"\n [loop]=\"zLoop()\"\n [autoplay]=\"zAutoplay()\"\n playsinline\n webkit-playsinline\n (click)=\"onVideoClick()\"\n (play)=\"onPlayStateChange(true)\"\n (pause)=\"onPlayStateChange(false)\"\n (loadeddata)=\"onLoadedData()\"\n (error)=\"onVideoError()\"\n (timeupdate)=\"onTimeUpdate()\"\n (durationchange)=\"onDurationChange()\"\n (seeking)=\"onSeeking(true)\"\n (seeked)=\"onSeeking(false)\"\n (waiting)=\"onSeeking(true)\"\n (playing)=\"onSeeking(false)\"\n (enterpictureinpicture)=\"onEnterPiP()\"\n (leavepictureinpicture)=\"onLeavePiP()\"\n (webkitpresentationmodechanged)=\"onWebkitPresentationModeChanged()\">\n @for (sub of zSubtitles(); track sub.src) {\n <track\n [src]=\"sub.src\"\n kind=\"subtitles\"\n [srclang]=\"sub.srclang\"\n [label]=\"sub.label\"\n [default]=\"sub.default || false\" />\n }\n </video>\n\n @if (subtitleText()) {\n <div\n class=\"pointer-events-none absolute inset-x-3 z-[11] mx-auto w-fit max-w-[calc(100%-1.5rem)] rounded-sm bg-black/80 px-4 py-2 text-center text-base leading-6 whitespace-pre-line text-white shadow-sm transition-[bottom] duration-200 ease-out sm:text-lg sm:leading-7\"\n [class.bottom-16]=\"showControls()\"\n [class.bottom-2]=\"!showControls()\">\n {{ subtitleText() }}\n </div>\n }\n\n <!-- Vòng tròn loading giữa màn hình khi video đang buffer -->\n @if (isBuffering()) {\n <div class=\"pointer-events-none absolute inset-0 z-[13] flex items-center justify-center\">\n <span class=\"z-media-player-loading-pulse\"></span>\n </div>\n }\n\n <!-- Hiệu ứng nhấp nháy Play/Pause lớn giữa màn hình tương tự YouTube -->\n <div class=\"pointer-events-none absolute inset-0 z-[11] flex items-center justify-center\">\n <div\n class=\"z-flash-animation flex size-10 scale-75 items-center justify-center rounded-full bg-black/60 text-white opacity-0\"\n [class.z-flash-active]=\"!!playPauseFlash()\">\n @if (playPauseFlash(); as flashType) {\n <z-icon\n [zType]=\"flashType === 'play' ? 'tablerPlayerPlayFill' : 'tablerPlayerPauseFill'\"\n zSize=\"28\"\n [zStrokeWidth]=\"2\"\n [class.translate-x-[2px]]=\"flashType === 'play'\" />\n }\n </div>\n </div>\n\n <!-- Lớp phủ tua nhanh nhảy số cộng dồn Trái (YouTube style) -->\n @if (skipOverlayValue() > 0 && skipOverlayDirection() === 'left') {\n <div class=\"z-double-tap-ripple-left\" [class.z-skip-pulse-alt]=\"skipOverlayPulse() % 2 === 1\">\n <div class=\"z-skip-overlay-content\">\n <span class=\"z-skip-overlay-number\">- {{ skipOverlayValue() }}</span>\n <span class=\"z-skip-overlay-arrows z-chevron-slide-left\">\n <z-icon zType=\"tablerChevronsLeft\" zSize=\"26\" [zStrokeWidth]=\"2.4\" />\n </span>\n </div>\n </div>\n }\n\n <!-- Lớp phủ tua nhanh nhảy số cộng dồn Phải (YouTube style) -->\n @if (skipOverlayValue() > 0 && skipOverlayDirection() === 'right') {\n <div class=\"z-double-tap-ripple-right\" [class.z-skip-pulse-alt]=\"skipOverlayPulse() % 2 === 1\">\n <div class=\"z-skip-overlay-content\">\n <span class=\"z-skip-overlay-arrows z-chevron-slide-right\">\n <z-icon zType=\"tablerChevronsRight\" zSize=\"26\" [zStrokeWidth]=\"2.4\" />\n </span>\n <span class=\"z-skip-overlay-number\">+ {{ skipOverlayValue() }}</span>\n </div>\n </div>\n }\n\n <!-- Lớp phủ gradient phủ sát toàn bộ mép dưới video -->\n <div\n class=\"pointer-events-none absolute inset-x-0 bottom-0 z-[10] h-28 bg-gradient-to-t from-black/55 via-black/25 to-transparent transition-opacity duration-200 ease-out\"\n [class.opacity-0]=\"!showControls()\"></div>\n\n <!-- Thanh điều khiển dạng rounded-sm nổi phía trên đáy video -->\n <div\n class=\"z-media-player-controls absolute inset-x-2 bottom-2 z-[12] transition-opacity duration-200 ease-out select-none sm:inset-x-3 sm:bottom-3\"\n [class.opacity-0]=\"!showControls()\"\n [class.pointer-events-auto]=\"showControls()\"\n [class.pointer-events-none]=\"!showControls()\">\n <div class=\"z-media-player-controls-surface relative z-[1] rounded-sm px-2 py-1.5 text-sm text-white\">\n <div class=\"flex items-center gap-1.5 sm:gap-2\">\n <!-- Nút Phát / Tạm dừng -->\n @if (controls().play) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_play_btn\"\n class=\"flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90\"\n [title]=\"(isPlaying() ? 'i18n_z_ui_media_player_pause' : 'i18n_z_ui_media_player_play') | translate\"\n (click)=\"togglePlay()\">\n <z-icon\n [zType]=\"isPlaying() ? 'tablerPlayerPauseFill' : 'tablerPlayerPlayFill'\"\n zSize=\"18\"\n [zStrokeWidth]=\"2\" />\n </button>\n }\n\n <!-- Nút Tua lùi / Tua tiến 5 giây -->\n @if (controls().skip) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_rewind_5_btn\"\n class=\"hidden size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90 sm:flex\"\n title=\"Tua lùi 5 giây (Arrow Left)\"\n (click)=\"triggerSkip(5, 'left')\">\n <z-icon zType=\"tablerRewindBackward5\" zSize=\"18\" [zStrokeWidth]=\"2\" />\n </button>\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_forward_5_btn\"\n class=\"hidden size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90 sm:flex\"\n title=\"Tua tiến 5 giây (Arrow Right)\"\n (click)=\"triggerSkip(5, 'right')\">\n <z-icon zType=\"tablerRewindForward5\" zSize=\"18\" [zStrokeWidth]=\"2\" />\n </button>\n }\n\n <!-- Tổ hợp nút Mute và Slider âm lượng trượt ngang -->\n @if (controls().volume) {\n <div class=\"group/volume hidden shrink-0 items-center sm:flex\">\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_mute_btn\"\n class=\"flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90\"\n [title]=\"(isMuted() ? 'i18n_z_ui_media_player_unmute' : 'i18n_z_ui_media_player_mute') | translate\"\n (click)=\"toggleMute()\">\n <z-icon\n [zType]=\"isMuted() ? 'tablerVolumeOff' : volume() < 0.5 ? 'tablerVolume2' : 'tablerVolume'\"\n zSize=\"18\"\n [zStrokeWidth]=\"2\" />\n </button>\n <!-- Thanh trượt âm lượng trượt ngang mở rộng khi hover -->\n <input\n type=\"range\"\n id=\"z_media_player_volume_slider\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n [ngModel]=\"volume()\"\n (ngModelChange)=\"onVolumeChange($event)\"\n class=\"accent-primary h-1 w-0 cursor-pointer rounded-lg bg-white/20 opacity-0 transition-all duration-200 outline-none group-hover/volume:w-16 group-hover/volume:opacity-100 focus-visible:w-16 focus-visible:opacity-100\" />\n </div>\n }\n\n <!-- Thời gian phát: gộp chung \"đã phát / tổng thời lượng\" thành một nhóm duy nhất -->\n @if (controls().time) {\n <span class=\"shrink-0 rounded-full bg-black/30 px-2 py-0.5 font-mono text-xs whitespace-nowrap text-white/90\">\n {{ currentTimeLabel() }}\n <span class=\"text-white/50\">/</span>\n {{ durationLabel() }}\n </span>\n }\n\n <!-- Thanh Timeline (Progress Bar) tùy chỉnh kiểu YouTube, nằm chung hàng với các nút -->\n @if (controls().timeline) {\n <div\n #timelineContainer\n id=\"z_media_player_timeline\"\n class=\"group/timeline relative flex h-1 min-w-0 flex-1 cursor-pointer items-center\"\n (mousedown)=\"onTimelineDragStart($event)\"\n (mousemove)=\"onTimelineHover($event)\"\n (mouseleave)=\"onTimelineHoverEnd()\">\n <!-- Thanh nền xám của thanh timeline -->\n <div\n class=\"absolute inset-x-0 h-1 overflow-hidden rounded-full bg-white/25 transition-all group-hover/timeline:h-1.5\">\n <!-- Tiến trình tải buffer của video -->\n <div\n class=\"absolute top-0 left-0 h-full rounded-full bg-white/30\"\n [style.width.%]=\"bufferedProgress()\"></div>\n <!-- Tiến trình phát hiện tại của video -->\n <div class=\"bg-primary absolute top-0 left-0 h-full rounded-full\" [style.width.%]=\"progress()\"></div>\n </div>\n\n <!-- Đầu kéo timeline (Thumb) đỏ chỉ hiển thị khi hover hoặc kéo -->\n <div\n class=\"bg-primary pointer-events-none absolute size-3.5 -translate-x-1/2 scale-0 transform rounded-full opacity-0 transition-opacity duration-150 group-hover/timeline:scale-100 group-hover/timeline:opacity-100\"\n [style.left.%]=\"progress()\"></div>\n\n <!-- Preview ảnh nhỏ storyboard khi hover timeline (kiểu YouTube) -->\n @if (hoverThumbnailCue(); as cue) {\n <div\n class=\"pointer-events-none absolute z-[20] -translate-x-1/2 overflow-hidden rounded-md border-0 bg-black shadow-[0_12px_24px_-10px_rgba(0,0,0,0.85)]\"\n [style.left.px]=\"hoverX()\"\n [style.bottom.px]=\"24\"\n [style.width.px]=\"cue.w\"\n [style.height.px]=\"cue.h\">\n <div\n class=\"bg-no-repeat\"\n [style.width.px]=\"cue.w\"\n [style.height.px]=\"cue.h\"\n [style.background-image]=\"'url(' + cue.src + ')'\"\n [style.background-position]=\"'-' + cue.x + 'px -' + cue.y + 'px'\"></div>\n </div>\n }\n\n <!-- Tooltip hiển thị mốc thời gian khi hover -->\n @if (hoverTimeLabel()) {\n <div\n class=\"pointer-events-none absolute bottom-4 z-[20] -translate-x-1/2 rounded-xs bg-zinc-950/70 px-2 py-1 font-mono text-[11px] leading-none whitespace-nowrap text-zinc-100 shadow-[0_12px_24px_-10px_rgba(0,0,0,0.85)] backdrop-blur-2xl\"\n [style.left.px]=\"hoverX()\">\n {{ hoverTimeLabel() }}\n </div>\n }\n </div>\n }\n\n <!-- Nút mở trình đơn Cài đặt bằng ZPopoverDirective -->\n @if (controls().settings) {\n @if (isFullscreen()) {\n <div class=\"relative shrink-0\">\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_settings_btn\"\n class=\"flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:border-transparent focus-visible:ring-0 focus-visible:outline-none active:scale-90\"\n [class.bg-white/15]=\"showSettings()\"\n [title]=\"'i18n_z_ui_media_player_settings' | translate\"\n (click)=\"toggleInlineSettings()\">\n <z-icon zType=\"tablerSettings\" zSize=\"18\" [zStrokeWidth]=\"2\" />\n </button>\n <!-- Popover cài đặt neo trực tiếp vào nút, vì overlay CDK không hiển thị được trong chế độ Fullscreen gốc -->\n @if (showSettings()) {\n <div class=\"z-media-player-popover absolute bottom-full left-1/2 mb-2 -translate-x-1/2\">\n <ng-container [ngTemplateOutlet]=\"speedMenuTemplate\" />\n </div>\n }\n </div>\n } @else {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_settings_btn\"\n class=\"flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:border-transparent focus-visible:ring-0 focus-visible:outline-none active:scale-90 aria-expanded:!bg-white/15 aria-expanded:!text-white\"\n [title]=\"'i18n_z_ui_media_player_settings' | translate\"\n z-popover\n [zPopoverContent]=\"speedMenuTemplate\"\n zPosition=\"top\"\n zTrigger=\"click\"\n [zOffset]=\"9\"\n zClass=\"z-media-player-popover\"\n (zShow)=\"showSettings.set(true); onMouseMove()\"\n (zHide)=\"onSettingsHidden()\">\n <z-icon zType=\"tablerSettings\" zSize=\"18\" [zStrokeWidth]=\"2\" />\n </button>\n }\n }\n\n <!-- Nút bật/tắt phụ đề (CC) -->\n @if (controls().subtitles && hasSubtitles()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"xs\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_subtitles_btn\"\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90\"\n [class.bg-white!]=\"captionsEnabled()\"\n [class.text-black!]=\"captionsEnabled()\"\n [attr.aria-pressed]=\"captionsEnabled()\"\n [title]=\"'i18n_z_ui_media_player_subtitles' | translate\"\n (click)=\"toggleSubtitles()\">\n <span class=\"text-[11px] leading-none font-bold tracking-[-0.04em]\">CC</span>\n </button>\n }\n\n <!-- Nút Miniplayer (Picture-in-Picture) - Ẩn hoặc disable nếu browser ko hỗ trợ -->\n @if (controls().pip && isPiPSupported()) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_mini_btn\"\n class=\"hidden size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90 sm:flex\"\n [title]=\"'i18n_z_ui_media_player_miniplayer' | translate\"\n (click)=\"toggleMiniplayer()\">\n <z-icon zType=\"tablerPictureInPicture\" zSize=\"18\" [zStrokeWidth]=\"2\" />\n </button>\n }\n\n <!-- Nút bật/tắt chế độ rạp chiếu phim (Theater Mode) -->\n @if (controls().theater) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n id=\"z_media_player_theater_btn\"\n class=\"hidden size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90 md:flex\"\n [title]=\"\n (isTheaterMode() ? 'i18n_z_ui_media_player_default_mode' : 'i18n_z_ui_media_player_theater_mode')\n | translate\n \"\n (click)=\"toggleTheaterMode()\">\n <z-icon [zType]=\"isTheaterMode() ? 'tablerSquare' : 'tablerRectangle'\" zSize=\"18\" [zStrokeWidth]=\"2\" />\n </button>\n }\n\n <!-- Nút bật/tắt chế độ toàn màn hình (Fullscreen) -->\n @if (controls().fullscreen) {\n <button\n z-button\n zType=\"ghost\"\n zSize=\"sm\"\n zShape=\"default\"\n [zWave]=\"false\"\n type=\"button\"\n id=\"z_media_player_full_btn\"\n class=\"flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 border-none bg-transparent p-0 text-white shadow-none transition-[background-color,color,transform] outline-none hover:bg-white/15 hover:text-white focus:outline-none focus-visible:outline-none active:scale-90\"\n [title]=\"\n (isFullscreen() ? 'i18n_z_ui_media_player_exit_fullscreen' : 'i18n_z_ui_media_player_fullscreen')\n | translate\n \"\n (click)=\"toggleFullscreen()\">\n <z-icon [zType]=\"isFullscreen() ? 'tablerMinimize' : 'tablerMaximize'\" zSize=\"18\" [zStrokeWidth]=\"2\" />\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Template cấu hình Popover cài đặt sử dụng ng-template -->\n <ng-template #speedMenuTemplate>\n <div\n class=\"z-media-player-settings flex w-max max-w-48 min-w-28 flex-col px-1 py-[4px] text-zinc-200\"\n [class.z-main-panel]=\"settingsPanel() === 'main'\"\n [class.z-sub-panel]=\"settingsPanel() !== 'main'\">\n @if (settingsPanel() === 'main') {\n <div class=\"z-media-player-settings-panel flex flex-col\">\n @if (qualitySources().length > 1) {\n <button type=\"button\" class=\"z-media-player-settings-item\" (click)=\"openSettingsPanel('quality')\">\n <span class=\"min-w-0 flex-1 truncate whitespace-nowrap\">\n {{ 'i18n_z_ui_media_player_quality' | translate }}\n </span>\n <span class=\"flex max-w-[5.5rem] min-w-0 items-center gap-1.5 text-zinc-400\">\n <span class=\"min-w-0 truncate whitespace-nowrap\">{{ activeQualityLabel() }}</span>\n <z-icon zType=\"tablerChevronRight\" zSize=\"13\" class=\"shrink-0\" />\n </span>\n </button>\n }\n <button type=\"button\" class=\"z-media-player-settings-item\" (click)=\"openSettingsPanel('speed')\">\n <span class=\"min-w-0 flex-1 truncate whitespace-nowrap\">\n {{ 'i18n_z_ui_media_player_speed' | translate }}\n </span>\n <span class=\"flex max-w-[5.5rem] min-w-0 items-center gap-1.5 text-zinc-400\">\n <span class=\"min-w-0 truncate whitespace-nowrap\">\n {{ playbackSpeed() === 1 ? ('i18n_z_ui_media_player_normal' | translate) : playbackSpeed() + 'x' }}\n </span>\n <z-icon zType=\"tablerChevronRight\" zSize=\"13\" class=\"shrink-0\" />\n </span>\n </button>\n </div>\n }\n\n @if (settingsPanel() === 'quality') {\n <div class=\"z-media-player-settings-panel flex flex-col\">\n <button\n type=\"button\"\n [title]=\"'i18n_z_ui_media_player_back' | translate\"\n class=\"z-media-player-settings-back\"\n (click)=\"closeSettingsPanel()\">\n <z-icon zType=\"tablerChevronLeft\" zSize=\"13\" class=\"shrink-0\" />\n <span class=\"min-w-0 truncate whitespace-nowrap\">{{ 'i18n_z_ui_media_player_quality' | translate }}</span>\n </button>\n @for (source of qualitySources(); track source.label) {\n <button\n type=\"button\"\n [id]=\"'z_media_player_quality_btn_' + source.label\"\n class=\"z-media-player-settings-item\"\n [class.z-active]=\"activeQualityLabel() === source.label\"\n (click)=\"setQualitySource(source)\">\n <span class=\"min-w-0 truncate whitespace-nowrap\">{{ source.label }}</span>\n </button>\n }\n </div>\n }\n\n @if (settingsPanel() === 'speed') {\n <div class=\"z-media-player-settings-panel flex flex-col\">\n <button\n type=\"button\"\n [title]=\"'i18n_z_ui_media_player_back' | translate\"\n class=\"z-media-player-settings-back\"\n (click)=\"closeSettingsPanel()\">\n <z-icon zType=\"tablerChevronLeft\" zSize=\"13\" class=\"shrink-0\" />\n <span class=\"min-w-0 truncate whitespace-nowrap\">{{ 'i18n_z_ui_media_player_speed' | translate }}</span>\n </button>\n @for (speed of playbackSpeeds; track speed.value) {\n <button\n type=\"button\"\n [id]=\"'z_media_player_speed_btn_' + speed.value\"\n class=\"z-media-player-settings-item\"\n [class.z-active]=\"playbackSpeed() === speed.value\"\n (click)=\"setPlaybackSpeed(speed.value)\">\n <span class=\"min-w-0 truncate whitespace-nowrap\">{{ speed.label | translate }}</span>\n </button>\n }\n </div>\n }\n </div>\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA;AACO,MAAM,mBAAmB,GAAG,iFAAiF;AAEpH;AACO,MAAM,6BAA6B,GAAyB;AACjE,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,UAAU,EAAE,IAAI;CACjB;;ACfM,MAAM,oBAAoB,GAAG,GAAG,CACrC,sJAAsJ,EACtJ;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,0EAA0E;AACnF,YAAA,OAAO,EAAE,iCAAiC;AAC1C,YAAA,UAAU,EAAE,8EAA8E;AAC3F,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,SAAS;AACnB,KAAA;AACF,CAAA,CACF;;MCuCY,qBAAqB,CAAA;AACf,IAAA,WAAW,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC7C,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;;IAGlC,KAAK,GAAG,KAAK,CAAa,EAAE;8EAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAU;IAC/B,QAAQ,GAAG,KAAK,CAAuB,EAAE;iFAAC;IAC1C,OAAO,GAAG,KAAK,CAAS,EAAE;gFAAC;IAC3B,SAAS,GAAG,KAAK,CAAC,KAAK;kFAAC;IACxB,KAAK,GAAG,KAAK,CAAC,KAAK;8EAAC;IACpB,MAAM,GAAG,KAAK,CAAC,KAAK;+EAAC;IACrB,OAAO,GAAG,KAAK,CAAC,GAAG;gFAAC;IACpB,UAAU,GAAG,KAAK,CAA8B,EAAE;mFAAC;;IAEnD,cAAc,GAAG,KAAK,CAAS,EAAE;uFAAC;;IAElC,SAAS,GAAG,KAAK,CAAgC,EAAE;kFAAC;;IAGpD,OAAO,GAAG,MAAM,EAAQ;IACxB,MAAM,GAAG,MAAM,EAAgB;IAC/B,KAAK,GAAG,MAAM,EAAW;IACzB,WAAW,GAAG,MAAM,EAAU;IAC9B,aAAa,GAAG,MAAM,EAAU;IAChC,iBAAiB,GAAG,MAAM,EAAW;IACrC,kBAAkB,GAAG,MAAM,EAAW;IACtC,iBAAiB,GAAG,MAAM,EAAW;IACrC,cAAc,GAAG,MAAM,EAAsB;;IAG7C,YAAY,GAAG,SAAS,CAA+B,cAAc;qFAAC;IACtE,iBAAiB,GAAG,SAAS,CAA6B,mBAAmB;0FAAC;IAC7E,gBAAgB,GAAG,SAAS,CAAC,iBAAiB;yFAAC;;IAG7C,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;IACzB,WAAW,GAAG,MAAM,CAAC,CAAC;oFAAC;IACvB,QAAQ,GAAG,MAAM,CAAC,CAAC;iFAAC;IACpB,MAAM,GAAG,MAAM,CAAC,GAAG;+EAAC;IACpB,OAAO,GAAG,MAAM,CAAC,KAAK;gFAAC;IACvB,aAAa,GAAG,MAAM,CAAC,GAAG;sFAAC;IAC3B,eAAe,GAAG,MAAM,CAAgB,IAAI;wFAAC;IAC/C,yBAAyB,GAAG,MAAM,CAAgB,IAAI;kGAAC;IACrD,YAAY,GAAG,MAAM,CAAC,IAAI;qFAAC;IAC3B,aAAa,GAAG,MAAM,CAAC,KAAK;sFAAC;IAC7B,WAAW,GAAG,MAAM,CAAC,KAAK;oFAAC;IAC3B,eAAe,GAAG,MAAM,CAAC,KAAK;wFAAC;IAC/B,YAAY,GAAG,MAAM,CAAC,EAAE;qFAAC;AACzB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC;qFAAC;IAC3D,aAAa,GAAG,MAAM,CAAC,KAAK;sFAAC;IAC7B,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;IAC5B,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;IAC5B,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;IAC5B,aAAa,GAAG,MAAM,CAA4B,MAAM;sFAAC;IACzD,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;;IAG1B,gBAAgB,GAAG,MAAM,CAAC,CAAC;yFAAC;IAC5B,QAAQ,GAAG,MAAM,CAAC,CAAC;iFAAC;;IAGpB,cAAc,GAAG,MAAM,CAA0B,IAAI;uFAAC;IACtD,cAAc,GAAG,MAAM,CAAgB,IAAI;uFAAC;IAC5C,SAAS,GAAG,MAAM,CAAgB,IAAI;kFAAC;IACvC,MAAM,GAAG,MAAM,CAAC,CAAC;+EAAC;;IAGpB,cAAc,GAAG,MAAM,CAA6B,EAAE;uFAAC;AACvD,IAAA,yBAAyB,GAAG,IAAI,OAAO,EAAa;;IAGlD,oBAAoB,GAAG,MAAM,CAA0B,IAAI;6FAAC;IAC5D,gBAAgB,GAAG,MAAM,CAAC,CAAC;yFAAC;IAC5B,gBAAgB,GAAG,MAAM,CAAC,CAAC;yFAAC;;AAG5B,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACnC,YAAA,OAAO,KAAK;QACd;QACA,MAAM,GAAG,GAAG,QAA4B;AACxC,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,uBAAuB;AAC1C,QAAA,MAAM,aAAa,GACjB,OAAO,gBAAgB,KAAK,WAAW,IAAI,yBAAyB,IAAI,gBAAgB,CAAC,SAAS;AACpG,QAAA,IAAI,MAAM,IAAI,aAAa,EAAE;AAC3B,YAAA,OAAO,IAAI;QACb;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,wBAAwB,GAAI,KAAiC,CAAC,8BAA8B;AAClG,YAAA,MAAM,SAAS,GACb,gCAAgC,IAAI,KAAK;gBACzC,OAAO,wBAAwB,KAAK,UAAU;AAC9C,gBAAA,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,oBAAoB,CAAC;YAC5D,OAAO,CAAC,CAAC,SAAS;QACpB;AACA,QAAA,MAAM,cAAc,GAClB,OAAO,gBAAgB,KAAK,WAAW;YACvC,gCAAgC,IAAI,gBAAgB,CAAC,SAAS;AAC9D,YAAA,2BAA2B,IAAI,gBAAgB,CAAC,SAAS;AAC3D,QAAA,OAAO,cAAc;IACvB,CAAC;uFAAC;;AAGiB,IAAA,cAAc,GAAyC;AACxE,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC/B,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;AAC7B,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC/B,QAAA,EAAE,KAAK,EAAE,+BAA+B,EAAE,KAAK,EAAE,GAAG,EAAE;AACtD,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC/B,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;AAC7B,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;KAC9B;;IAGO,gBAAgB,GAAyC,IAAI;IAC7D,aAAa,GAAyC,IAAI;IAC1D,mBAAmB,GAAyC,IAAI;IAChE,qBAAqB,GAAkB,IAAI;IAC3C,uBAAuB,GAAkB,IAAI;IAC7C,iBAAiB,GAAwB,IAAI;IAC7C,gBAAgB,GAAG,CAAC;IACpB,eAAe,GAAG,CAAC;IACnB,gBAAgB,GAAG,CAAC;;AAGT,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAC1C,IAAI,MAAM,GAAoC,SAAS;AACvD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACxB,MAAM,GAAG,SAAS;QACpB;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,MAAM,GAAG,YAAY;QACvB;AAEA,QAAA,OAAO,aAAa,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/E,CAAC;iFAAC;;AAGiB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;yFAAC;AACvE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;sFAAC;AAEjE,IAAA,QAAQ,GAAG,QAAQ,CAAuB,OAAO;AAClE,QAAA,GAAG,6BAA6B;QAChC,GAAG,IAAI,CAAC,SAAS,EAAE;KACpB,CAAC;iFAAC;AAEgB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;qFAAC;IACpE,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;uFAAC;IAC/E,kBAAkB,GAAG,QAAQ,CAC9C,MAAM,IAAI,CAAC,yBAAyB,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM;2FACpF;;IAGkB,cAAc,GAAG,QAAQ,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI;uFAAC;IAC3F,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI;kFAAC;AAC1D,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE;QAChC,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;AACjC,YAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG;AACtC,YAAA,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG;AAC/B,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG;AAC9B,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,GAAG,EAAE,GAAG;AACR,YAAA,cAAc,EAAE,GAAG;AACpB,SAAA,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;AAChB,YAAA,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;QAC5B;AAEA,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,8BAA8B,CACnD,CAAA,uCAAA,EAA0C,EAAE,CAAA,CAAA,EAAI,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAE,CACpE;IACH,CAAC;wFAAC;;AAGiB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACnD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvF,CAAC;0FAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE;AACrD,YAAA,IAAI,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,CAAC,EAAE;gBACzE;YACF;YAEA,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;YACxC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,IAAI,WAAW,CAAC;YAC3D,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC;AAClE,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;YAChD,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACrB,oBAAA,KAAK,CAAC,GAAG,GAAG,GAAG;gBACjB;gBACA,KAAK,CAAC,IAAI,EAAE;YACd;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;YACpC,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B;YACF;AAEA,YAAA,KAAK,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;AACrC,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,YAAY,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;YAChD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;gBACrC;YACF;YAEA,IAAI,CAAC,GAAG,CAAC;YACT,OAAO,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE;gBAClC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC/C,gBAAA,CAAC,EAAE;YACL;AACF,QAAA,CAAC,CAAC;QAEF,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAK;AAClC,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;gBAC3C,MAAM,WAAW,GAAG,MAAK;AACvB,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,oBAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,oBAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,GAAG,EAAE;wBAC5D;oBACF;AAEA,oBAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;oBAC3B,IAAI,CAAC,mBAAmB,EAAE;AAC5B,gBAAA,CAAC;AACD,gBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClE,gBAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACnF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,iBAAiB,IAAI;AAC1B,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACrC;AACA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QAClC;AACA,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACxC;AACA,QAAA,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE;AACvC,YAAA,oBAAoB,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAClD;AACA,QAAA,IAAI,IAAI,CAAC,uBAAuB,KAAK,IAAI,EAAE;AACzC,YAAA,oBAAoB,CAAC,IAAI,CAAC,uBAAuB,CAAC;QACpD;IACF;;IAGQ,qBAAqB,GAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAE/B,QAAA,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/B,IAAI,CAAC,mBAAmB,EAAE;IAC5B;;IAGU,UAAU,GAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACjC,YAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAC9B;QACF;QAEA,KAAK,CAAC,KAAK,EAAE;AACb,QAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;IACjC;;AAGQ,IAAA,iBAAiB,CAAC,IAAsB,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QAClC;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;AACnC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,CAAC,EAAE,GAAG,CAAC;IACT;;IAGU,UAAU,GAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,KAAK;AAC9B,QAAA,KAAK,CAAC,KAAK,GAAG,SAAS;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACxD;;AAGU,IAAA,cAAc,CAAC,GAAW,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,KAAK,CAAC,MAAM,GAAG,GAAG;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAEpB,QAAA,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAC1B,QAAA,KAAK,CAAC,KAAK,GAAG,QAAQ;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE1B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B;;AAGU,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,KAAK,CAAC,YAAY,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,kBAAkB,EAAE;IAC3B;AAEU,IAAA,iBAAiB,CAAC,KAAgC,EAAA;AAC1D,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B;IAEU,kBAAkB,GAAA;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IAChC;IAEU,gBAAgB,GAAA;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACnC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B;QACF;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B,CAAC,EAAE,IAAI,CAAC;IACV;IAEU,oBAAoB,GAAA;AAC5B,QAAA,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC;QAClC,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,kBAAkB,EAAE;QAC3B;QACA,IAAI,CAAC,WAAW,EAAE;IACpB;AAEU,IAAA,gBAAgB,CAAC,MAA0B,EAAA;QACnD,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC9C,IAAI,CAAC,kBAAkB,EAAE;YACzB;QACF;QAEA,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,EAAE,EAAE;YACtC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AAChD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,kBAAkB,EAAE;YACzB;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,MAAM,OAAO,GAAG,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE;QACxD,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;QAC7C,MAAM,YAAY,GAAG,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE;QAEhE,IAAI,KAAK,EAAE;YACT,IAAI,SAAS,GAAG,KAAK;YACrB,MAAM,eAAe,GAAG,MAAK;gBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO;AAC9F,gBAAA,KAAK,CAAC,YAAY,GAAG,YAAY;AACjC,gBAAA,KAAK,CAAC,WAAW,GAAG,QAAQ;AAC5B,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC9B,gBAAA,IAAI,YAAY,IAAI,CAAC,SAAS,EAAE;oBAC9B,SAAS,GAAG,IAAI;oBAChB,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACnC;AACF,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACzE,YAAA,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvE;QAEA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,kBAAkB,EAAE;IAC3B;;AAGU,IAAA,MAAM,CAAC,IAAY,EAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,KAAK,CAAC,WAAW,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;IAClC;;IAGU,iBAAiB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;IACzC;;IAGU,gBAAgB,GAAA;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;QAC9C,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,IAAI,QAAQ,CAAC,iBAAiB,EAAE;YAC9B,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC9C;QACF;QAEA,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD;;IAGU,uBAAuB,GAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB;AAC3C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;IACrC;;AAGU,IAAA,MAAM,gBAAgB,GAAA;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,QAA4B;YACxC,IAAI,GAAG,CAAC,uBAAuB,IAAI,OAAO,KAAK,CAAC,uBAAuB,KAAK,UAAU,EAAE;AACtF,gBAAA,IAAI,GAAG,CAAC,uBAAuB,EAAE;AAC/B,oBAAA,MAAM,GAAG,CAAC,oBAAoB,EAAE;AAChC,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;oBAClC;gBACF;AAEA,gBAAA,MAAM,KAAK,CAAC,uBAAuB,EAAE;AACrC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACjC;YACF;YAEA,MAAM,WAAW,GAAG,KAAgC;YACpD,IACE,gCAAgC,IAAI,WAAW;AAC/C,gBAAA,OAAO,WAAW,CAAC,8BAA8B,KAAK,UAAU;AAChE,gBAAA,WAAW,CAAC,8BAA8B,CAAC,oBAAoB,CAAC,EAChE;AACA,gBAAA,MAAM,WAAW,GAAG,WAAW,CAAC,sBAAsB;AACtD,gBAAA,MAAM,UAAU,GAAG,WAAW,KAAK,oBAAoB,GAAG,QAAQ,GAAG,oBAAoB;AACzF,gBAAA,IAAI,OAAO,WAAW,CAAC,yBAAyB,KAAK,UAAU,EAAE;oBAC/D;gBACF;AACA,gBAAA,WAAW,CAAC,yBAAyB,CAAC,UAAU,CAAC;AACjD,gBAAA,MAAM,KAAK,GAAG,UAAU,KAAK,oBAAoB;AACjD,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;YACpC;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,CAAC;QACrD;IACF;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IACnC;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC;IAEU,+BAA+B,GAAA;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,KAAK,GAAI,KAAiC,CAAC,sBAAsB,KAAK,oBAAoB;AAChG,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QACpC;IACF;;IAGU,eAAe,GAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU;AAC/B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE;AAC7C,QAAA,MAAM,WAAW,GAAG,CAAC,cAAc;AAEnC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC;QAErC,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AACxB,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AACvB,YAAA,KAAK,CAAC,IAAI,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU;YACjD,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACnC;AACA,YAAA,CAAC,EAAE;QACL;QAEA,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;IAClC;AAEQ,IAAA,qBAAqB,CAAC,KAAgB,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,gBAAgB,KAAK,UAAU,EAAE;AAC9F,YAAA,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAK;AACvC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACjC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,UAAU,CAAC;AACzE,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3C;AAEA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU;QAC7B,IAAI,CAAC,IAAI,EAAE;YACT;QACF;QAEA,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;YACnB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,GAAG,YAAY,MAAM,EAAE;AAC1D,gBAAA,GAAG,CAAC,IAAI,GAAG,CAAC;YACd;AACA,YAAA,CAAC,EAAE;QACL;IACF;AAEQ,IAAA,mBAAmB,CAAC,MAAiC,EAAA;QAC3D,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB;QACF;QAEA,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU;YACjC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;gBACnB,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACjD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC/B;gBACF;YACF;AACA,YAAA,CAAC,EAAE;QACL;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;;AAGU,IAAA,iBAAiB,CAAC,OAAgB,EAAA;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;YAChD,IAAI,CAAC,yBAAyB,EAAE;AAChC,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpE,IAAI,CAAC,mBAAmB,EAAE;YAC1B;QACF;QAEA,IAAI,CAAC,0BAA0B,EAAE;QACjC,IAAI,CAAC,mBAAmB,EAAE;IAC5B;;IAGU,YAAY,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YAC/B;QACF;QAEA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;AACxC,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC;QAC7C,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEU,gBAAgB,GAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC;QAC7C,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;AACxD,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;IAEU,YAAY,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,sBAAsB,CAAC,GAAG,IAAI,CAAC;IAClG;AAEU,IAAA,SAAS,CAAC,OAAgB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,sBAAsB,EAAE;QAC/B;IACF;IAEU,sBAAsB,GAAA;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;AAChD,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClE;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC;IACxD;AAEQ,IAAA,kBAAkB,CAAC,MAAc,EAAA;AACvC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAEzD,IAAI,OAAO,qBAAqB,KAAK,WAAW,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE;YACvF;QACF;QAEA,MAAM,OAAO,GAAG,MAAW;AACzB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,GAAG,OAAO;YAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,EAAE;gBAC5B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;AAC/C,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;gBACjC;YACF;YAEA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;AACpD,YAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,OAAO,CAAC;AAC7D,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,OAAO,CAAC;IAC7D;IAEQ,0BAA0B,GAAA;QAChC,IAAI,OAAO,qBAAqB,KAAK,WAAW,IAAI,IAAI,CAAC,uBAAuB,KAAK,IAAI,EAAE;YACzF;QACF;QAEA,MAAM,OAAO,GAAG,MAAW;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;YAChD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AACzC,gBAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;AACnC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpE;YACF;AAEA,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC;AAC7C,YAAA,IAAI,CAAC,uBAAuB,GAAG,qBAAqB,CAAC,OAAO,CAAC;AAC/D,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,uBAAuB,GAAG,qBAAqB,CAAC,OAAO,CAAC;IAC/D;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,uBAAuB,KAAK,IAAI,EAAE;YACzC;QACF;AAEA,QAAA,oBAAoB,CAAC,IAAI,CAAC,uBAAuB,CAAC;AAClD,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;IACrC;AAEQ,IAAA,qBAAqB,CAAC,IAAY,EAAA;AACxC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC/D,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACpB;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACnE;;AAGU,IAAA,mBAAmB,CAAC,KAAiB,EAAA;QAC7C,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AAEjC,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;AACvC,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACtD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;YAClD,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACnD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IACjD;AAEU,IAAA,eAAe,CAAC,KAAiB,EAAA;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa;QACzD,IAAI,CAAC,SAAS,EAAE;YACd;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;AACzC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACtD;IAEU,kBAAkB,GAAA;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;;IAGQ,MAAM,iBAAiB,CAAC,MAAc,EAAA;AAC5C,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,CAAA,gCAAA,EAAmC,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;YACvE;AAEA,YAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;;AAGlC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtE;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,GAAG,CAAC;AACjE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B;IACF;;IAGQ,kBAAkB,CAAC,IAAY,EAAE,OAAe,EAAA;QACtD,MAAM,gBAAgB,GAAG,mEAAmE;QAC5F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACjC,MAAM,IAAI,GAA+B,EAAE;AAE3C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;YAEA,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;YACtC,IAAI,CAAC,SAAS,EAAE;gBACd;YACF;AAEA,YAAA,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;AACrD,YAAA,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtE;YACF;YAEA,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxC,GAAG,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtC,GAAG,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI;AACpC,gBAAA,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACV,gBAAA,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACV,gBAAA,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACV,gBAAA,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACX,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,kBAAkB,CAAC,KAAa,EAAA;AACtC,QAAA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AACvD,QAAA,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1D,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI;IACpG;AAEQ,IAAA,qBAAqB,CAAC,KAAiB,EAAA;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa;QACzD,IAAI,CAAC,SAAS,EAAE;YACd;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;AACzC,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;AACtB,QAAA,IAAI,KAAK,GAAG,OAAO,GAAG,KAAK;AAE3B,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,KAAK,GAAG,CAAC;QACX;AACA,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,KAAK,GAAG,CAAC;QACX;QAEA,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,CAAC,WAAW,GAAG,UAAU;AAC9B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;QAClC;IACF;;IAGU,WAAW,GAAA;QACnB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;AAChD,QAAA,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxE,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,gBAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACnC,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;YAC9B;AACA,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B;IACF;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACrC;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;AAChD,QAAA,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACxE,YAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAK;AACtC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B,CAAC,EAAE,IAAI,CAAC;QACV;IACF;;IAGU,YAAY,GAAA;;AAEpB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE;YAC/B,IAAI,CAAC,gBAAgB,EAAE;YACvB;QACF;QAEA,IAAI,CAAC,UAAU,EAAE;IACnB;;IAGU,WAAW,CAAC,OAAe,EAAE,SAA2B,EAAA;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC;QACvD;AACA,QAAA,IAAI,SAAS,KAAK,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC;QACrE;AAEA,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC;IAC9C;IAEQ,mBAAmB,CAAC,OAAe,EAAE,SAA2B,EAAA;AACtE,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACxC;QAEA,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1C,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAChD,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;AAEhD,QAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,MAAK;AACzC,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,YAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;QAC3B,CAAC,EAAE,GAAG,CAAC;IACT;;AAGU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa;AACvC,QAAA,IACE,QAAQ;aACP,QAAQ,CAAC,OAAO,KAAK,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU,IAAI,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,EAC7G;YACA;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;QAEA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;QAEnC,QAAQ,GAAG;AACT,YAAA,KAAK,GAAG;gBACN,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,UAAU,EAAE;gBACjB;AACF,YAAA,KAAK,GAAG;gBACN,IAAI,CAAC,UAAU,EAAE;gBACjB;AACF,YAAA,KAAK,GAAG;gBACN,IAAI,CAAC,UAAU,EAAE;gBACjB;AACF,YAAA,KAAK,GAAG;gBACN,IAAI,CAAC,gBAAgB,EAAE;gBACvB;AACF,YAAA,KAAK,GAAG;gBACN,IAAI,CAAC,iBAAiB,EAAE;gBACxB;AACF,YAAA,KAAK,GAAG;AACN,gBAAA,KAAK,IAAI,CAAC,gBAAgB,EAAE;gBAC5B;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;gBAC3B;AACF,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC;gBAC5B;AACF,YAAA,KAAK,YAAY;gBACf,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;gBAC5B;AACF,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC;gBAC7B;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;gBACxD;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;gBACtD;AACF,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjD;;IAEN;IAEU,cAAc,GAAA;QACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7C;;AAGQ,IAAA,WAAW,CAAC,IAAY,EAAA;AAC9B,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,CAAC,EAAE;AACvD,YAAA,OAAO,MAAM;QACf;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;AAErC,QAAA,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,GAAG,OAAO;AAE/D,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAA,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,GAAG,OAAO;AAC/D,YAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA,EAAI,gBAAgB,EAAE;QAC3D;AAEA,QAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,gBAAgB,EAAE;IACzC;uGA1iCW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,2BAAA,EAAA,2BAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,YAAA,EAAA,eAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAkCc,iBAAiB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzFjE,67vBAidA,ooWDxaY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,2IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,gBAAgB,6SAA/B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAc1E,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAhBjC,SAAS;+BACE,gBAAgB,EAAA,OAAA,EACjB,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,UAAA,EAC5F,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,SAAS,EAAE,YAAY;AACvB,wBAAA,iBAAiB,EAAE,GAAG;AACtB,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,6BAA6B,EAAE,2BAA2B;AAC3D,qBAAA,EAAA,QAAA,EAAA,67vBAAA,EAAA,MAAA,EAAA,CAAA,6kWAAA,CAAA,EAAA;gqDAkCsE,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACX,mBAAmB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAC/C,iBAAiB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEzFjE;;AAEG;;;;"}
1
+ {"version":3,"file":"shival99-z-ui-components-z-media-player.mjs","sources":["../../../../libs/core-ui/components/z-media-player/z-media-player.define.ts","../../../../libs/core-ui/components/z-media-player/z-media-player.utils.ts","../../../../libs/core-ui/components/z-media-player/z-media-player.variants.ts","../../../../libs/core-ui/components/z-media-player/z-media-player.component.ts","../../../../libs/core-ui/components/z-media-player/z-media-player.component.html","../../../../libs/core-ui/components/z-media-player/shival99-z-ui-components-z-media-player.ts"],"sourcesContent":["import type { DefaultLayoutTranslations, PlyrLayoutTranslations } from 'vidstack';\nimport type { ZMediaPlayerConfig } from './z-media-player.types';\n\nexport const DEFAULT_MEDIA_PLAYER_CONFIG: ZMediaPlayerConfig = {\n autoPlay: false,\n loop: false,\n muted: false,\n volume: 1,\n playbackRate: 1,\n subtitles: [],\n thumbnailsVtt: '',\n chaptersVtt: '',\n playsInline: true,\n};\n\n/** Vietnamese translation of Vidstack's Default Layout UI words, applied when the app language is `vi`. */\nexport const MEDIA_PLAYER_VI_DEFAULT_TRANSLATIONS: Partial<DefaultLayoutTranslations> = {\n Announcements: 'Thông báo',\n Accessibility: 'Trợ năng',\n AirPlay: 'AirPlay',\n Audio: 'Âm thanh',\n Auto: 'Tự động',\n Boost: 'Tăng cường',\n Captions: 'Phụ đề',\n 'Caption Styles': 'Kiểu phụ đề',\n 'Captions look like this': 'Phụ đề trông như thế này',\n Chapters: 'Chương',\n 'Closed-Captions Off': 'Tắt phụ đề',\n 'Closed-Captions On': 'Bật phụ đề',\n Connected: 'Đã kết nối',\n Continue: 'Tiếp tục',\n Connecting: 'Đang kết nối',\n Default: 'Mặc định',\n Disabled: 'Đã tắt',\n Disconnected: 'Đã ngắt kết nối',\n 'Display Background': 'Nền hiển thị',\n Download: 'Tải xuống',\n 'Enter Fullscreen': 'Vào toàn màn hình',\n 'Enter PiP': 'Vào chế độ nổi',\n 'Exit Fullscreen': 'Thoát toàn màn hình',\n 'Exit PiP': 'Thoát chế độ nổi',\n Font: 'Phông chữ',\n Family: 'Kiểu chữ',\n Fullscreen: 'Toàn màn hình',\n 'Google Cast': 'Google Cast',\n 'Keyboard Animations': 'Hiệu ứng phím tắt',\n LIVE: 'TRỰC TIẾP',\n Loop: 'Lặp lại',\n Mute: 'Tắt tiếng',\n Normal: 'Bình thường',\n Off: 'Tắt',\n Pause: 'Tạm dừng',\n Play: 'Phát',\n Playback: 'Phát lại',\n PiP: 'Nổi',\n Quality: 'Chất lượng',\n Replay: 'Phát lại',\n Reset: 'Đặt lại',\n 'Seek Backward': 'Tua lùi',\n 'Seek Forward': 'Tua tới',\n Seek: 'Tua',\n Settings: 'Cài đặt',\n 'Skip To Live': 'Về trực tiếp',\n Speed: 'Tốc độ',\n Size: 'Kích thước',\n Color: 'Màu sắc',\n Opacity: 'Độ mờ',\n Shadow: 'Đổ bóng',\n Text: 'Văn bản',\n 'Text Background': 'Nền văn bản',\n Track: 'Track',\n Unmute: 'Bật tiếng',\n Volume: 'Âm lượng',\n};\n\n/** Vietnamese translation of Vidstack's Plyr Layout UI words, applied when the app language is `vi`. */\nexport const MEDIA_PLAYER_VI_PLYR_TRANSLATIONS: Partial<PlyrLayoutTranslations> = {\n Ad: 'Quảng cáo',\n All: 'Tất cả',\n AirPlay: 'AirPlay',\n Audio: 'Âm thanh',\n Auto: 'Tự động',\n Buffered: 'Đã tải đệm',\n Captions: 'Phụ đề',\n 'Current time': 'Thời gian hiện tại',\n Default: 'Mặc định',\n 'Disable captions': 'Tắt phụ đề',\n Disabled: 'Đã tắt',\n Download: 'Tải xuống',\n Duration: 'Thời lượng',\n 'Enable captions': 'Bật phụ đề',\n Enabled: 'Đã bật',\n End: 'Kết thúc',\n 'Enter Fullscreen': 'Vào toàn màn hình',\n 'Exit Fullscreen': 'Thoát toàn màn hình',\n Forward: 'Tua tới',\n 'Go back to previous menu': 'Quay lại menu trước',\n LIVE: 'TRỰC TIẾP',\n Loop: 'Lặp lại',\n Mute: 'Tắt tiếng',\n Normal: 'Bình thường',\n Pause: 'Tạm dừng',\n 'Enter PiP': 'Vào chế độ nổi',\n 'Exit PiP': 'Thoát chế độ nổi',\n Play: 'Phát',\n Played: 'Đã phát',\n Quality: 'Chất lượng',\n Reset: 'Đặt lại',\n Restart: 'Phát lại từ đầu',\n Rewind: 'Tua lùi',\n Seek: 'Tua',\n Settings: 'Cài đặt',\n Speed: 'Tốc độ',\n Start: 'Bắt đầu',\n Unmute: 'Bật tiếng',\n Volume: 'Âm lượng',\n};\n","import type { MediaSrc } from 'vidstack';\nimport type {\n ZMediaPlayerSource,\n ZMediaPlayerSnapshot,\n ZMediaPlayerStateChange,\n ZMediaPlayerStateEvent,\n ZMediaPlayerVidstackState,\n} from './z-media-player.types';\n\nexport function mapSourceToProviderProps(source: ZMediaPlayerSource): MediaSrc {\n switch (source.kind) {\n case 'video':\n return { src: source.src, type: 'video/mp4' };\n case 'audio':\n return { src: source.src, type: 'audio/mpeg' };\n case 'hls':\n return { src: source.src, type: 'application/x-mpegurl' };\n case 'dash':\n return { src: source.src, type: 'application/dash+xml' };\n case 'youtube':\n return { src: source.src, type: 'video/youtube' };\n case 'vimeo':\n return { src: source.src, type: 'video/vimeo' };\n }\n}\n\n/**\n * Vidstack's own thumbnail-storyboard loader only resolves relative sprite paths inside a VTT\n * file against the VTT's own URL when that URL is itself absolute (`^https?:`); a root-relative\n * path like `/assets/foo.vtt` makes it silently fall back to resolving against the current page\n * URL instead, breaking the sprite image path. Resolving to an absolute URL up front avoids that.\n */\nexport function resolveAbsoluteUrl(url: string | null | undefined): string | null {\n if (!url) {\n return null;\n }\n try {\n return new URL(url, document.baseURI).href;\n } catch {\n return url;\n }\n}\n\n/** Assigns non-`undefined` entries of `source` onto `target`, leaving its own defaults for omitted keys. */\nexport function assignDefinedProperties<T extends object>(target: T, source: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined) {\n (target as Record<string, unknown>)[key] = value;\n }\n }\n}\n\nexport function buildStateChange(\n event: ZMediaPlayerStateEvent,\n state: ZMediaPlayerVidstackState,\n activeSourceLabel: string | null\n): ZMediaPlayerStateChange {\n const bufferedEnd =\n typeof state.bufferedEnd === 'number'\n ? state.bufferedEnd\n : state.buffered && state.buffered.length > 0\n ? state.buffered.end(state.buffered.length - 1)\n : 0;\n const snapshot: ZMediaPlayerSnapshot = {\n paused: state.paused,\n playing: state.playing,\n ended: state.ended,\n waiting: state.waiting,\n currentTime: state.currentTime,\n duration: state.duration,\n volume: state.volume,\n muted: state.muted,\n playbackRate: state.playbackRate,\n bufferedRatio: state.duration > 0 ? Math.min(1, bufferedEnd / state.duration) : 0,\n fullscreen: state.fullscreen,\n theaterMode: false,\n pictureInPicture: state.pictureInPicture,\n activeSourceLabel,\n activeCaptionsLabel: state.textTrack?.label ?? null,\n };\n\n return { event, state: snapshot };\n}\n","import { cva } from 'class-variance-authority';\n\nexport const zMediaPlayerVariants = cva(\n 'relative overflow-hidden bg-black select-none transition-all duration-300 w-full flex flex-col justify-center items-center group/player outline-none',\n {\n variants: {\n zLayout: {\n default: 'aspect-video rounded-sm shadow-sm border border-border max-w-5xl mx-auto',\n },\n },\n defaultVariants: {\n zLayout: 'default',\n },\n }\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ZThemeService, ZTranslateService } from '@shival99/z-ui/services';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport type { DefaultLayoutTranslations, PlyrLayoutTranslations } from 'vidstack';\nimport type { MediaPlayerElement } from 'vidstack/elements';\nimport {\n DEFAULT_MEDIA_PLAYER_CONFIG,\n MEDIA_PLAYER_VI_DEFAULT_TRANSLATIONS,\n MEDIA_PLAYER_VI_PLYR_TRANSLATIONS,\n} from './z-media-player.define';\nimport type {\n ZMediaPlayerConfig,\n ZMediaPlayerDefaultLayoutConfig,\n ZMediaPlayerError,\n ZMediaPlayerPlyrLayoutConfig,\n ZMediaPlayerSkin,\n ZMediaPlayerSnapshot,\n ZMediaPlayerSource,\n ZMediaPlayerStateChange,\n ZMediaPlayerStateEvent,\n} from './z-media-player.types';\nimport {\n assignDefinedProperties,\n buildStateChange,\n mapSourceToProviderProps,\n resolveAbsoluteUrl,\n} from './z-media-player.utils';\nimport { zMediaPlayerVariants } from './z-media-player.variants';\n\nimport 'vidstack/player';\nimport 'vidstack/player/ui';\nimport 'vidstack/player/layouts/default';\nimport 'vidstack/player/layouts/plyr';\n\n/**\n * Video, audio, HLS, DASH, YouTube, and Vimeo use Vidstack's Default or Plyr Layout skin\n * (`zSkin`). `zConfig` mirrors Vidstack's own `<media-player>` props; `zDefaultLayoutConfig` /\n * `zPlyrLayoutConfig` mirror the props of the currently active skin.\n */\n@Component({\n selector: 'z-media-player',\n standalone: true,\n templateUrl: './z-media-player.component.html',\n styleUrl: './z-media-player.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'zClasses()',\n },\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class ZMediaPlayerComponent {\n private readonly _themeService = inject(ZThemeService, { optional: true });\n private readonly _translateService = inject(ZTranslateService, { optional: true });\n\n public readonly class = input<ClassValue>('');\n public readonly zSources = input.required<ZMediaPlayerSource[]>();\n public readonly zConfig = input<Partial<ZMediaPlayerConfig>>({});\n public readonly zSkin = input<ZMediaPlayerSkin>('default');\n public readonly zDefaultLayoutConfig = input<ZMediaPlayerDefaultLayoutConfig>({});\n public readonly zPlyrLayoutConfig = input<ZMediaPlayerPlyrLayoutConfig>({});\n public readonly zStateChange = output<ZMediaPlayerStateChange>();\n public readonly zError = output<ZMediaPlayerError>();\n\n protected readonly playerElement = viewChild<ElementRef<MediaPlayerElement>>('playerElement');\n protected readonly layoutElement = viewChild<ElementRef<HTMLElement>>('layoutElement');\n protected readonly activeSource = computed<ZMediaPlayerSource | null>(() => {\n const sources = this.zSources();\n return sources.find(source => source.default) ?? sources[0] ?? null;\n });\n\n protected readonly isAudioSource = computed(() => this.activeSource()?.kind === 'audio');\n protected readonly isPlyrSkin = computed(() => this.zSkin() === 'plyr');\n protected readonly colorScheme = computed<'light' | 'dark' | 'system'>(() => {\n if (!this._themeService) {\n return 'system';\n }\n return this._themeService.isDark() ? 'dark' : 'light';\n });\n\n private readonly _isVietnamese = computed(() => (this._translateService?.currentLang() ?? 'en') === 'vi');\n protected readonly defaultLayoutTranslations = computed<Partial<DefaultLayoutTranslations> | null>(() => {\n const base = this._isVietnamese() ? MEDIA_PLAYER_VI_DEFAULT_TRANSLATIONS : null;\n const override = this.zDefaultLayoutConfig().translations;\n return base || override ? { ...base, ...override } : null;\n });\n\n protected readonly plyrLayoutTranslations = computed<Partial<PlyrLayoutTranslations> | null>(() => {\n const base = this._isVietnamese() ? MEDIA_PLAYER_VI_PLYR_TRANSLATIONS : null;\n const override = this.zPlyrLayoutConfig().translations;\n return base || override ? { ...base, ...override } : null;\n });\n\n protected readonly state = signal<ZMediaPlayerSnapshot>({\n paused: true,\n playing: false,\n ended: false,\n waiting: false,\n currentTime: 0,\n duration: 0,\n volume: DEFAULT_MEDIA_PLAYER_CONFIG.volume ?? 1,\n muted: DEFAULT_MEDIA_PLAYER_CONFIG.muted ?? false,\n playbackRate: DEFAULT_MEDIA_PLAYER_CONFIG.playbackRate ?? 1,\n bufferedRatio: 0,\n fullscreen: false,\n theaterMode: false,\n pictureInPicture: false,\n activeSourceLabel: null,\n activeCaptionsLabel: null,\n });\n\n protected readonly zClasses = computed(() => zMergeClasses(zMediaPlayerVariants(), this.class()));\n\n constructor() {\n effect(() => {\n const player = this.playerElement()?.nativeElement;\n const sources = this.zSources();\n const source = this.activeSource();\n if (!player || !source || sources.length === 0) {\n return;\n }\n\n const {\n subtitles: _subtitles,\n thumbnailsVtt: _thumbnailsVtt,\n chaptersVtt: _chaptersVtt,\n ...playerProps\n } = {\n ...DEFAULT_MEDIA_PLAYER_CONFIG,\n ...this.zConfig(),\n };\n const orderedSources = [...sources].sort(\n (left, right) => Number(Boolean(right.default)) - Number(Boolean(left.default))\n );\n const providerSources = orderedSources.map(mapSourceToProviderProps);\n player.src = providerSources.length === 1 ? providerSources[0] : providerSources;\n assignDefinedProperties(player, playerProps);\n });\n\n effect(() => {\n const layout = this.layoutElement()?.nativeElement;\n if (!layout) {\n return;\n }\n\n const thumbnails = resolveAbsoluteUrl(this.zConfig().thumbnailsVtt);\n if (this.isPlyrSkin()) {\n assignDefinedProperties(layout, {\n thumbnails,\n translations: this.plyrLayoutTranslations(),\n ...this.zPlyrLayoutConfig(),\n });\n return;\n }\n\n assignDefinedProperties(layout, {\n thumbnails,\n colorScheme: this.colorScheme(),\n translations: this.defaultLayoutTranslations(),\n ...this.zDefaultLayoutConfig(),\n });\n });\n\n effect(onCleanup => {\n const player = this.playerElement()?.nativeElement;\n if (!player) {\n return;\n }\n\n const stateSubscription = player.subscribe(nextState => this._syncState(nextState));\n const eventMap: Readonly<Record<string, ZMediaPlayerStateEvent>> = {\n 'loaded-data': 'loaded',\n play: 'play',\n pause: 'pause',\n ended: 'ended',\n 'time-update': 'time-update',\n 'volume-change': 'volume-change',\n 'rate-change': 'rate-change',\n 'fullscreen-change': 'fullscreen-change',\n 'picture-in-picture-change': 'pip-change',\n 'source-change': 'source-change',\n 'text-track-change': 'subtitle-change',\n waiting: 'waiting',\n 'can-play': 'can-play',\n };\n const listeners = Object.entries(eventMap).map(([eventName, event]) => {\n const listener = () => this._emitStateChange(event);\n player.addEventListener(eventName, listener);\n return () => player.removeEventListener(eventName, listener);\n });\n const onError = (event: Event) => this._emitError(event);\n const onProviderChange = (event: Event) => this._configureStreamingProvider(event);\n player.addEventListener('error', onError);\n player.addEventListener('provider-change', onProviderChange);\n\n onCleanup(() => {\n stateSubscription();\n listeners.forEach(cleanup => cleanup());\n player.removeEventListener('error', onError);\n player.removeEventListener('provider-change', onProviderChange);\n });\n });\n }\n\n private _syncState(nextState: unknown): void {\n const player = this.playerElement()?.nativeElement;\n if (!player) {\n return;\n }\n\n const patch = nextState && typeof nextState === 'object' ? nextState : {};\n const state = { ...player.state, ...patch } as Parameters<typeof buildStateChange>[1];\n this.state.set(buildStateChange('time-update', state, this.activeSource()?.label ?? null).state);\n }\n\n private _emitStateChange(event: ZMediaPlayerStateEvent): void {\n const player = this.playerElement()?.nativeElement;\n if (!player) {\n return;\n }\n\n const change = buildStateChange(\n event,\n player.state as Parameters<typeof buildStateChange>[1],\n this.activeSource()?.label ?? null\n );\n this.state.set(change.state);\n this.zStateChange.emit(change);\n }\n\n private _emitError(event: Event): void {\n const { detail } = event as CustomEvent<unknown>;\n const error = detail && typeof detail === 'object' ? (detail as Record<string, unknown>) : {};\n this.zError.emit({\n message: typeof error['message'] === 'string' ? error['message'] : 'Media playback error',\n code: typeof error['code'] === 'string' || typeof error['code'] === 'number' ? error['code'] : undefined,\n source: 'provider',\n raw: detail,\n });\n }\n\n private _configureStreamingProvider(event: Event): void {\n const source = this.activeSource();\n const { detail } = event as CustomEvent<unknown>;\n if (!source || !detail || typeof detail !== 'object') {\n return;\n }\n\n const provider = detail as { library?: unknown };\n if (source.kind === 'hls') {\n provider.library = () => import('hls.js');\n return;\n }\n if (source.kind === 'dash') {\n provider.library = () => import('dashjs');\n }\n }\n}\n","<media-player #playerElement>\n <media-provider>\n @for (subtitle of zConfig().subtitles ?? []; track subtitle.src) {\n <track\n kind=\"subtitles\"\n [label]=\"subtitle.label\"\n [src]=\"subtitle.src\"\n [srclang]=\"subtitle.srclang\"\n [default]=\"subtitle.default ?? false\" />\n }\n @if (zConfig().chaptersVtt) {\n <track kind=\"chapters\" [src]=\"zConfig().chaptersVtt!\" />\n }\n </media-provider>\n\n @if (isPlyrSkin()) {\n <media-plyr-layout #layoutElement></media-plyr-layout>\n } @else if (isAudioSource()) {\n <media-audio-layout #layoutElement></media-audio-layout>\n } @else {\n <media-video-layout #layoutElement></media-video-layout>\n }\n</media-player>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}