@videojs/html 10.0.0-beta.23 → 10.0.0-beta.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/cdn/audio-minimal-ui.dev.js +2 -1
- package/cdn/audio-minimal-ui.js +1 -1
- package/cdn/audio-minimal.dev.js +22 -18
- package/cdn/audio-minimal.dev.js.map +1 -1
- package/cdn/audio-minimal.js +1 -1
- package/cdn/audio-minimal.js.map +1 -1
- package/cdn/audio-ui.dev.js +2 -1
- package/cdn/audio-ui.js +1 -1
- package/cdn/audio.dev.js +22 -17
- package/cdn/audio.dev.js.map +1 -1
- package/cdn/audio.js +1 -1
- package/cdn/audio.js.map +1 -1
- package/cdn/background.dev.js +4 -4
- package/cdn/background.dev.js.map +1 -1
- package/cdn/background.js +1 -1
- package/cdn/background.js.map +1 -1
- package/cdn/base-CaXY3kMA.js +66 -0
- package/cdn/base-CaXY3kMA.js.map +1 -0
- package/cdn/base-JIGv_MlJ.js +2 -0
- package/cdn/base-JIGv_MlJ.js.map +1 -0
- package/cdn/compounds-CJ9NGNJr.js +8 -0
- package/cdn/compounds-CJ9NGNJr.js.map +1 -0
- package/cdn/{compounds-BHHGcL_P.js → compounds-DxdDY3jr.js} +2753 -500
- package/cdn/compounds-DxdDY3jr.js.map +1 -0
- package/cdn/create-player-B2W5yr5I.js +7 -0
- package/cdn/create-player-B2W5yr5I.js.map +1 -0
- package/cdn/{create-player-B-gVAMdr.js → create-player-_WED6HtK.js} +92 -12
- package/cdn/create-player-_WED6HtK.js.map +1 -0
- package/cdn/default-BtA2xVd7.js +33 -0
- package/cdn/default-BtA2xVd7.js.map +1 -0
- package/cdn/default-Ci15Ic2n.js +2 -0
- package/cdn/default-Ci15Ic2n.js.map +1 -0
- package/cdn/default-Ciudg7Lh.js +32 -0
- package/cdn/default-Ciudg7Lh.js.map +1 -0
- package/cdn/default-CmbctS5n.js +2 -0
- package/cdn/default-CmbctS5n.js.map +1 -0
- package/cdn/{hls-DEP0AzDp.js → hls-CoCXCB8b.js} +3 -3
- package/cdn/hls-CoCXCB8b.js.map +1 -0
- package/cdn/{hls-DR-Xxpxv.js → hls-DjqAxSvY.js} +84 -9
- package/cdn/hls-DjqAxSvY.js.map +1 -0
- package/cdn/{hotkey-element-oEdY8YLl.js → hotkey-element-89VAnCrc.js} +27 -38
- package/cdn/hotkey-element-89VAnCrc.js.map +1 -0
- package/cdn/hotkey-element-CmUxzW-C.js +2 -0
- package/cdn/hotkey-element-CmUxzW-C.js.map +1 -0
- package/cdn/live-button-element-BMneBAzX.js +208 -0
- package/cdn/live-button-element-BMneBAzX.js.map +1 -0
- package/cdn/live-button-element-CPEl1qK3.js +2 -0
- package/cdn/live-button-element-CPEl1qK3.js.map +1 -0
- package/cdn/live-video-minimal.dev.js +86 -8
- package/cdn/live-video-minimal.dev.js.map +1 -1
- package/cdn/live-video-minimal.js +1 -1
- package/cdn/live-video-minimal.js.map +1 -1
- package/cdn/live-video.dev.js +69 -5
- package/cdn/live-video.dev.js.map +1 -1
- package/cdn/live-video.js +1 -1
- package/cdn/live-video.js.map +1 -1
- package/cdn/media/dash-video.dev.js +3 -3
- package/cdn/media/dash-video.js +1 -1
- package/cdn/media/hls-video.dev.js +4 -4
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/mux-audio.dev.js +4 -4
- package/cdn/media/mux-audio.js +1 -1
- package/cdn/media/mux-video.dev.js +4 -4
- package/cdn/media/mux-video.js +1 -1
- package/cdn/media/native-hls-video.dev.js +4 -4
- package/cdn/media/native-hls-video.js +1 -1
- package/cdn/media/simple-hls-video.dev.js +3602 -2636
- package/cdn/media/simple-hls-video.dev.js.map +1 -1
- package/cdn/media/simple-hls-video.js +7 -7
- package/cdn/media/simple-hls-video.js.map +1 -1
- package/cdn/{media-attach-mixin-DuquRhAk.js → media-attach-mixin-0gzahJxP.js} +2 -2
- package/cdn/{media-attach-mixin-DuquRhAk.js.map → media-attach-mixin-0gzahJxP.js.map} +1 -1
- package/cdn/{media-attach-mixin-pV8deGiO.js → media-attach-mixin-C1KQy-y8.js} +2 -2
- package/cdn/{media-attach-mixin-pV8deGiO.js.map → media-attach-mixin-C1KQy-y8.js.map} +1 -1
- package/cdn/minimal-BGKTRgLy.js +2 -0
- package/cdn/minimal-BGKTRgLy.js.map +1 -0
- package/cdn/minimal-BY8ZmNCh.js +33 -0
- package/cdn/minimal-BY8ZmNCh.js.map +1 -0
- package/cdn/minimal-D-o7FGL2.js +2 -0
- package/cdn/minimal-D-o7FGL2.js.map +1 -0
- package/cdn/minimal-b3s_qClU.js +32 -0
- package/cdn/minimal-b3s_qClU.js.map +1 -0
- package/cdn/minimal-ui-B0PWg1gR.js +2 -0
- package/cdn/minimal-ui-B0PWg1gR.js.map +1 -0
- package/cdn/minimal-ui-B6AtFmJO.js +2 -0
- package/cdn/minimal-ui-B6AtFmJO.js.map +1 -0
- package/cdn/minimal-ui-BjQUqQ_m.js +26 -0
- package/cdn/minimal-ui-BjQUqQ_m.js.map +1 -0
- package/cdn/minimal-ui-C2NRTvWx.js +38 -0
- package/cdn/minimal-ui-C2NRTvWx.js.map +1 -0
- package/cdn/{mux-DH3Kxyot.js → mux-CJn4lTbv.js} +3 -3
- package/cdn/{mux-DH3Kxyot.js.map → mux-CJn4lTbv.js.map} +1 -1
- package/cdn/{mux-D5M5HL6A.js → mux-wKbnuUQu.js} +3 -3
- package/cdn/{mux-D5M5HL6A.js.map → mux-wKbnuUQu.js.map} +1 -1
- package/cdn/{native-hls-DN_aWn2z.js → native-hls-1-isweaY.js} +2 -2
- package/cdn/{native-hls-DN_aWn2z.js.map → native-hls-1-isweaY.js.map} +1 -1
- package/cdn/{native-hls-ak4v9DN6.js → native-hls-D4f2-E9D.js} +2 -2
- package/cdn/{native-hls-ak4v9DN6.js.map → native-hls-D4f2-E9D.js.map} +1 -1
- package/cdn/playback-rate-button-element-Ck7CCs0t.js +2 -0
- package/cdn/playback-rate-button-element-Ck7CCs0t.js.map +1 -0
- package/cdn/playback-rate-button-element-DN78puhg.js +79 -0
- package/cdn/playback-rate-button-element-DN78puhg.js.map +1 -0
- package/cdn/player-9_6BPhTP.js +16 -0
- package/cdn/player-9_6BPhTP.js.map +1 -0
- package/cdn/player-C6DIXZpP.js +16 -0
- package/cdn/player-C6DIXZpP.js.map +1 -0
- package/cdn/{player-D468sScc.js → player-ClV0UtoS.js} +3 -3
- package/cdn/{player-D468sScc.js.map → player-ClV0UtoS.js.map} +1 -1
- package/cdn/player-D7lHFQo6.js +2 -0
- package/cdn/player-D7lHFQo6.js.map +1 -0
- package/cdn/player-DzqwkiTI.js +2 -0
- package/cdn/{player-CtegNw3g.js.map → player-DzqwkiTI.js.map} +1 -1
- package/cdn/player-_4EjFnET.js +2 -0
- package/cdn/player-_4EjFnET.js.map +1 -0
- package/cdn/poster-element-DmfmTRCV.js +2 -0
- package/cdn/poster-element-DmfmTRCV.js.map +1 -0
- package/cdn/{player-C_6YjMl7.js → poster-element-IdY3MYJj.js} +6 -17
- package/cdn/poster-element-IdY3MYJj.js.map +1 -0
- package/cdn/{predicate-BOcV_HDG.js → predicate-Dqd8wbW6.js} +5 -2
- package/cdn/predicate-Dqd8wbW6.js.map +1 -0
- package/cdn/{predicate-Cad5WV4q.js → predicate-Dxl3IuYh.js} +2 -2
- package/cdn/predicate-Dxl3IuYh.js.map +1 -0
- package/cdn/seek-button-element-BkC8xrVR.js +394 -0
- package/cdn/seek-button-element-BkC8xrVR.js.map +1 -0
- package/cdn/seek-button-element-C0uAXebE.js +2 -0
- package/cdn/seek-button-element-C0uAXebE.js.map +1 -0
- package/cdn/skin-element-D0TDGWJH.js +2 -0
- package/cdn/skin-element-D0TDGWJH.js.map +1 -0
- package/cdn/skin-element-mgqcAutZ.js +55 -0
- package/cdn/skin-element-mgqcAutZ.js.map +1 -0
- package/cdn/ui-BH0azXYN.js +2 -0
- package/cdn/ui-BH0azXYN.js.map +1 -0
- package/cdn/ui-B_E6hb1k.js +33 -0
- package/cdn/ui-B_E6hb1k.js.map +1 -0
- package/cdn/ui-ByhUcpaY.js +2 -0
- package/cdn/ui-ByhUcpaY.js.map +1 -0
- package/cdn/ui-DG0AlJbU.js +42 -0
- package/cdn/ui-DG0AlJbU.js.map +1 -0
- package/cdn/{video-host-BR_2vUZH.js → video-host-BU9t26fe.js} +3 -3
- package/cdn/{video-host-BR_2vUZH.js.map → video-host-BU9t26fe.js.map} +1 -1
- package/cdn/{video-host-Bkh2OyyP.js → video-host-CvYvXa8l.js} +2 -2
- package/cdn/{video-host-Bkh2OyyP.js.map → video-host-CvYvXa8l.js.map} +1 -1
- package/cdn/video-minimal-ui.dev.js +2 -1
- package/cdn/video-minimal-ui.js +1 -1
- package/cdn/video-minimal.dev.js +83 -18
- package/cdn/video-minimal.dev.js.map +1 -1
- package/cdn/video-minimal.js +1 -1
- package/cdn/video-minimal.js.map +1 -1
- package/cdn/video-ui.dev.js +2 -1
- package/cdn/video-ui.js +1 -1
- package/cdn/video.dev.js +56 -15
- package/cdn/video.dev.js.map +1 -1
- package/cdn/video.js +1 -1
- package/cdn/video.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/background/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/background/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/global.js +6 -0
- package/dist/default/_virtual/inline-css_src/define/global.js.map +1 -0
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/default/define/audio/minimal-skin.css +225 -107
- package/dist/default/define/audio/minimal-skin.js +1 -1
- package/dist/default/define/audio/minimal-skin.js.map +1 -1
- package/dist/default/define/audio/minimal-skin.tailwind.js +3 -2
- package/dist/default/define/audio/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/audio/minimal-ui.js +8 -3
- package/dist/default/define/audio/minimal-ui.js.map +1 -1
- package/dist/default/define/audio/skin.css +251 -107
- package/dist/default/define/audio/skin.js +1 -1
- package/dist/default/define/audio/skin.js.map +1 -1
- package/dist/default/define/audio/skin.tailwind.js +2 -1
- package/dist/default/define/audio/skin.tailwind.js.map +1 -1
- package/dist/default/define/audio/ui.js +10 -1
- package/dist/default/define/audio/ui.js.map +1 -1
- package/dist/default/define/background/skin.css +4 -2
- package/dist/default/define/{base.css → global.css} +12 -8
- package/dist/default/define/live-audio/minimal-skin.css +225 -107
- package/dist/default/define/live-audio/minimal-skin.js +2 -2
- package/dist/default/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/default/define/live-audio/minimal-skin.tailwind.js +2 -2
- package/dist/default/define/live-audio/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/live-audio/minimal-ui.js +26 -0
- package/dist/default/define/live-audio/minimal-ui.js.map +1 -0
- package/dist/default/define/live-audio/player.js +18 -0
- package/dist/default/define/live-audio/player.js.map +1 -0
- package/dist/default/define/live-audio/skin.css +251 -107
- package/dist/default/define/live-audio/skin.js +2 -2
- package/dist/default/define/live-audio/skin.js.map +1 -1
- package/dist/default/define/live-audio/skin.tailwind.js +2 -2
- package/dist/default/define/live-audio/skin.tailwind.js.map +1 -1
- package/dist/default/define/live-audio/ui.js +30 -0
- package/dist/default/define/live-audio/ui.js.map +1 -0
- package/dist/default/define/live-video/minimal-skin.css +569 -146
- package/dist/default/define/live-video/minimal-skin.js +2 -2
- package/dist/default/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/define/live-video/minimal-skin.tailwind.js +3 -2
- package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/live-video/minimal-ui.js +44 -0
- package/dist/default/define/live-video/minimal-ui.js.map +1 -0
- package/dist/default/define/live-video/player.js +18 -0
- package/dist/default/define/live-video/player.js.map +1 -0
- package/dist/default/define/live-video/skin.css +579 -144
- package/dist/default/define/live-video/skin.js +2 -2
- package/dist/default/define/live-video/skin.js.map +1 -1
- package/dist/default/define/live-video/skin.tailwind.js +3 -3
- package/dist/default/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/default/define/live-video/ui.js +44 -0
- package/dist/default/define/live-video/ui.js.map +1 -0
- package/dist/default/define/shared.css +4 -0
- package/dist/default/define/skin-element.js +2 -2
- package/dist/default/define/skin-element.js.map +1 -1
- package/dist/default/define/tailwind.css +66 -0
- package/dist/default/define/ui/compounds.js +43 -1
- package/dist/default/define/ui/compounds.js.map +1 -1
- package/dist/default/define/ui/menu.js +6 -0
- package/dist/default/define/ui/menu.js.map +1 -0
- package/dist/default/define/ui/playback-rate-menu.js +13 -0
- package/dist/default/define/ui/playback-rate-menu.js.map +1 -0
- package/dist/default/define/ui/seek-indicator-value.js +7 -0
- package/dist/default/define/ui/seek-indicator-value.js.map +1 -0
- package/dist/default/define/ui/seek-indicator.js +9 -0
- package/dist/default/define/ui/seek-indicator.js.map +1 -0
- package/dist/default/define/ui/status-announcer.js +7 -0
- package/dist/default/define/ui/status-announcer.js.map +1 -0
- package/dist/default/define/ui/status-indicator-value.js +7 -0
- package/dist/default/define/ui/status-indicator-value.js.map +1 -0
- package/dist/default/define/ui/status-indicator.js +9 -0
- package/dist/default/define/ui/status-indicator.js.map +1 -0
- package/dist/default/define/ui/volume-indicator-fill.js +7 -0
- package/dist/default/define/ui/volume-indicator-fill.js.map +1 -0
- package/dist/default/define/ui/volume-indicator-value.js +7 -0
- package/dist/default/define/ui/volume-indicator-value.js.map +1 -0
- package/dist/default/define/ui/volume-indicator.js +11 -0
- package/dist/default/define/ui/volume-indicator.js.map +1 -0
- package/dist/default/define/video/minimal-skin.css +569 -146
- package/dist/default/define/video/minimal-skin.js +1 -1
- package/dist/default/define/video/minimal-skin.js.map +1 -1
- package/dist/default/define/video/minimal-skin.tailwind.js +4 -2
- package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/video/minimal-ui.js +13 -3
- package/dist/default/define/video/minimal-ui.js.map +1 -1
- package/dist/default/define/video/skin.css +579 -144
- package/dist/default/define/video/skin.js +1 -1
- package/dist/default/define/video/skin.js.map +1 -1
- package/dist/default/define/video/skin.tailwind.js +3 -2
- package/dist/default/define/video/skin.tailwind.js.map +1 -1
- package/dist/default/define/video/ui.js +11 -1
- package/dist/default/define/video/ui.js.map +1 -1
- package/dist/default/icons/default/index.js +19 -0
- package/dist/default/icons/dist/element/base.js +66 -0
- package/dist/default/icons/dist/element/base.js.map +1 -0
- package/dist/default/icons/dist/element/default/icons.js +25 -0
- package/dist/default/icons/dist/element/default/icons.js.map +1 -0
- package/dist/default/icons/dist/element/default/index.js +10 -0
- package/dist/default/icons/dist/element/default/index.js.map +1 -0
- package/dist/default/icons/dist/element/index.js +11 -0
- package/dist/default/icons/dist/element/index.js.map +1 -0
- package/dist/default/icons/dist/element/minimal/icons.js +25 -0
- package/dist/default/icons/dist/element/minimal/icons.js.map +1 -0
- package/dist/default/icons/dist/element/minimal/index.js +10 -0
- package/dist/default/icons/dist/element/minimal/index.js.map +1 -0
- package/dist/default/icons/dist/html/default/captions-off.js +6 -0
- package/dist/default/icons/dist/html/default/captions-off.js.map +1 -0
- package/dist/default/icons/dist/html/default/captions-on.js +6 -0
- package/dist/default/icons/dist/html/default/captions-on.js.map +1 -0
- package/dist/default/icons/dist/html/default/cast-enter.js +6 -0
- package/dist/default/icons/dist/html/default/cast-enter.js.map +1 -0
- package/dist/default/icons/dist/html/default/cast-exit.js +6 -0
- package/dist/default/icons/dist/html/default/cast-exit.js.map +1 -0
- package/dist/default/icons/dist/html/default/check.js +6 -0
- package/dist/default/icons/dist/html/default/check.js.map +1 -0
- package/dist/default/icons/dist/html/default/chevron.js +6 -0
- package/dist/default/icons/dist/html/default/chevron.js.map +1 -0
- package/dist/default/icons/dist/html/default/fullscreen-enter.js +6 -0
- package/dist/default/icons/dist/html/default/fullscreen-enter.js.map +1 -0
- package/dist/default/icons/dist/html/default/fullscreen-exit.js +6 -0
- package/dist/default/icons/dist/html/default/fullscreen-exit.js.map +1 -0
- package/dist/default/icons/dist/html/default/pause.js +6 -0
- package/dist/default/icons/dist/html/default/pause.js.map +1 -0
- package/dist/default/icons/dist/html/default/pip-enter.js +6 -0
- package/dist/default/icons/dist/html/default/pip-enter.js.map +1 -0
- package/dist/default/icons/dist/html/default/pip-exit.js +6 -0
- package/dist/default/icons/dist/html/default/pip-exit.js.map +1 -0
- package/dist/default/icons/dist/html/default/play.js +6 -0
- package/dist/default/icons/dist/html/default/play.js.map +1 -0
- package/dist/default/icons/dist/html/default/restart.js +6 -0
- package/dist/default/icons/dist/html/default/restart.js.map +1 -0
- package/dist/default/icons/dist/html/default/seek.js +6 -0
- package/dist/default/icons/dist/html/default/seek.js.map +1 -0
- package/dist/default/icons/dist/html/default/spinner.js +6 -0
- package/dist/default/icons/dist/html/default/spinner.js.map +1 -0
- package/dist/default/icons/dist/html/default/volume-high.js +6 -0
- package/dist/default/icons/dist/html/default/volume-high.js.map +1 -0
- package/dist/default/icons/dist/html/default/volume-low.js +6 -0
- package/dist/default/icons/dist/html/default/volume-low.js.map +1 -0
- package/dist/default/icons/dist/html/default/volume-off.js +6 -0
- package/dist/default/icons/dist/html/default/volume-off.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/captions-off.js +6 -0
- package/dist/default/icons/dist/html/minimal/captions-off.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/captions-on.js +6 -0
- package/dist/default/icons/dist/html/minimal/captions-on.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/cast-enter.js +6 -0
- package/dist/default/icons/dist/html/minimal/cast-enter.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/cast-exit.js +6 -0
- package/dist/default/icons/dist/html/minimal/cast-exit.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/check.js +6 -0
- package/dist/default/icons/dist/html/minimal/check.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/chevron.js +6 -0
- package/dist/default/icons/dist/html/minimal/chevron.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/fullscreen-enter.js +6 -0
- package/dist/default/icons/dist/html/minimal/fullscreen-enter.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/fullscreen-exit.js +6 -0
- package/dist/default/icons/dist/html/minimal/fullscreen-exit.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/pause.js +6 -0
- package/dist/default/icons/dist/html/minimal/pause.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/pip-enter.js +6 -0
- package/dist/default/icons/dist/html/minimal/pip-enter.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/pip-exit.js +6 -0
- package/dist/default/icons/dist/html/minimal/pip-exit.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/play.js +6 -0
- package/dist/default/icons/dist/html/minimal/play.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/restart.js +6 -0
- package/dist/default/icons/dist/html/minimal/restart.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/seek.js +6 -0
- package/dist/default/icons/dist/html/minimal/seek.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/spinner.js +6 -0
- package/dist/default/icons/dist/html/minimal/spinner.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/volume-high.js +6 -0
- package/dist/default/icons/dist/html/minimal/volume-high.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/volume-low.js +6 -0
- package/dist/default/icons/dist/html/minimal/volume-low.js.map +1 -0
- package/dist/default/icons/dist/html/minimal/volume-off.js +6 -0
- package/dist/default/icons/dist/html/minimal/volume-off.js.map +1 -0
- package/dist/default/icons/dist/render/default/index.js +17 -15
- package/dist/default/icons/dist/render/default/index.js.map +1 -1
- package/dist/default/icons/dist/render/minimal/index.js +17 -15
- package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
- package/dist/default/icons/element/default/index.js +1 -0
- package/dist/default/icons/element/index.js +1 -0
- package/dist/default/icons/element/minimal/index.js +1 -0
- package/dist/default/icons/index.js +19 -0
- package/dist/default/icons/minimal/index.js +19 -0
- package/dist/default/index.js +25 -1
- package/dist/default/player/context.js.map +1 -1
- package/dist/default/presets/live-audio.js +2 -1
- package/dist/default/presets/live-video.js +2 -1
- package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +3 -2
- package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -2
- package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/controls.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/icon.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js +40 -0
- package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -0
- package/dist/default/skins/dist/default/default/tailwind/components/menu.js +12 -0
- package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -0
- package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/preview.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/reset.js +7 -0
- package/dist/default/skins/dist/default/default/tailwind/components/reset.js.map +1 -0
- package/dist/default/skins/dist/default/default/tailwind/components/root.js +2 -1
- package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +13 -4
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +4 -2
- package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +3 -2
- package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js +41 -0
- package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -0
- package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +12 -0
- package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -0
- package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/reset.js +7 -0
- package/dist/default/skins/dist/default/minimal/tailwind/components/reset.js.map +1 -0
- package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +2 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -4
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/store/provider-mixin.js +8 -3
- package/dist/default/store/provider-mixin.js.map +1 -1
- package/dist/default/ui/controls/controls-element.js +13 -1
- package/dist/default/ui/controls/controls-element.js.map +1 -1
- package/dist/default/ui/gesture/gesture-element.js +2 -1
- package/dist/default/ui/gesture/gesture-element.js.map +1 -1
- package/dist/default/ui/hotkey/hotkey-element.js +1 -0
- package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/default/ui/input-indicators/input-indicator-element.js +110 -0
- package/dist/default/ui/input-indicators/input-indicator-element.js.map +1 -0
- package/dist/default/ui/input-indicators/live-indicator.js +32 -0
- package/dist/default/ui/input-indicators/live-indicator.js.map +1 -0
- package/dist/default/ui/live-button/live-button-element.js +97 -0
- package/dist/default/ui/live-button/live-button-element.js.map +1 -0
- package/dist/default/ui/menu/context.js +10 -0
- package/dist/default/ui/menu/context.js.map +1 -0
- package/dist/default/ui/menu/menu-back-element.js +57 -0
- package/dist/default/ui/menu/menu-back-element.js.map +1 -0
- package/dist/default/ui/menu/menu-checkbox-item-element.js +78 -0
- package/dist/default/ui/menu/menu-checkbox-item-element.js.map +1 -0
- package/dist/default/ui/menu/menu-element.js +285 -0
- package/dist/default/ui/menu/menu-element.js.map +1 -0
- package/dist/default/ui/menu/menu-group-element.js +35 -0
- package/dist/default/ui/menu/menu-group-element.js.map +1 -0
- package/dist/default/ui/menu/menu-item-element.js +96 -0
- package/dist/default/ui/menu/menu-item-element.js.map +1 -0
- package/dist/default/ui/menu/menu-item-indicator-element.js +34 -0
- package/dist/default/ui/menu/menu-item-indicator-element.js.map +1 -0
- package/dist/default/ui/menu/menu-label-element.js +20 -0
- package/dist/default/ui/menu/menu-label-element.js.map +1 -0
- package/dist/default/ui/menu/menu-radio-group-element.js +51 -0
- package/dist/default/ui/menu/menu-radio-group-element.js.map +1 -0
- package/dist/default/ui/menu/menu-radio-item-element.js +84 -0
- package/dist/default/ui/menu/menu-radio-item-element.js.map +1 -0
- package/dist/default/ui/menu/menu-separator-element.js +24 -0
- package/dist/default/ui/menu/menu-separator-element.js.map +1 -0
- package/dist/default/ui/menu/menu-view-element.js +16 -0
- package/dist/default/ui/menu/menu-view-element.js.map +1 -0
- package/dist/default/ui/playback-rate-menu/playback-rate-menu-element.js +47 -0
- package/dist/default/ui/playback-rate-menu/playback-rate-menu-element.js.map +1 -0
- package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger-element.js +85 -0
- package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger-element.js.map +1 -0
- package/dist/default/ui/playback-rate-menu/playback-rate-options-element.js +113 -0
- package/dist/default/ui/playback-rate-menu/playback-rate-options-element.js.map +1 -0
- package/dist/default/ui/popover/popover-element.js +30 -9
- package/dist/default/ui/popover/popover-element.js.map +1 -1
- package/dist/default/ui/position-controller.js +11 -6
- package/dist/default/ui/position-controller.js.map +1 -1
- package/dist/default/ui/seek-indicator/seek-indicator-element.js +44 -0
- package/dist/default/ui/seek-indicator/seek-indicator-element.js.map +1 -0
- package/dist/default/ui/seek-indicator/seek-indicator-value-element.js +11 -0
- package/dist/default/ui/seek-indicator/seek-indicator-value-element.js.map +1 -0
- package/dist/default/ui/status-announcer/status-announcer-element.js +70 -0
- package/dist/default/ui/status-announcer/status-announcer-element.js.map +1 -0
- package/dist/default/ui/status-indicator/status-indicator-element.js +53 -0
- package/dist/default/ui/status-indicator/status-indicator-element.js.map +1 -0
- package/dist/default/ui/status-indicator/status-indicator-value-element.js +11 -0
- package/dist/default/ui/status-indicator/status-indicator-value-element.js.map +1 -0
- package/dist/default/ui/tooltip/tooltip-element.js +27 -8
- package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
- package/dist/default/ui/volume-indicator/volume-indicator-element.js +46 -0
- package/dist/default/ui/volume-indicator/volume-indicator-element.js.map +1 -0
- package/dist/default/ui/volume-indicator/volume-indicator-fill-element.js +11 -0
- package/dist/default/ui/volume-indicator/volume-indicator-fill-element.js.map +1 -0
- package/dist/default/ui/volume-indicator/volume-indicator-value-element.js +11 -0
- package/dist/default/ui/volume-indicator/volume-indicator-value-element.js.map +1 -0
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/background/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/background/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/global.js +6 -0
- package/dist/dev/_virtual/inline-css_src/define/global.js.map +1 -0
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/shared.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/shared.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.css +225 -107
- package/dist/dev/define/audio/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/audio/minimal-skin.js +18 -14
- package/dist/dev/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/audio/minimal-skin.tailwind.js +29 -23
- package/dist/dev/define/audio/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/audio/minimal-ui.js +8 -3
- package/dist/dev/define/audio/minimal-ui.js.map +1 -1
- package/dist/dev/define/audio/skin.css +251 -107
- package/dist/dev/define/audio/skin.d.ts.map +1 -1
- package/dist/dev/define/audio/skin.js +18 -13
- package/dist/dev/define/audio/skin.js.map +1 -1
- package/dist/dev/define/audio/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/audio/skin.tailwind.js +27 -21
- package/dist/dev/define/audio/skin.tailwind.js.map +1 -1
- package/dist/dev/define/audio/ui.js +10 -1
- package/dist/dev/define/audio/ui.js.map +1 -1
- package/dist/dev/define/background/skin.css +4 -2
- package/dist/dev/define/{base.css → global.css} +12 -8
- package/dist/dev/define/live-audio/minimal-skin.css +225 -107
- package/dist/dev/define/live-audio/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/live-audio/minimal-skin.js +6 -4
- package/dist/dev/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/dev/define/live-audio/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-audio/minimal-skin.tailwind.js +12 -10
- package/dist/dev/define/live-audio/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/live-audio/minimal-ui.d.ts +1 -0
- package/dist/dev/define/live-audio/minimal-ui.js +26 -0
- package/dist/dev/define/live-audio/minimal-ui.js.map +1 -0
- package/dist/dev/define/live-audio/player.d.ts +17 -0
- package/dist/dev/define/live-audio/player.d.ts.map +1 -0
- package/dist/dev/define/live-audio/player.js +18 -0
- package/dist/dev/define/live-audio/player.js.map +1 -0
- package/dist/dev/define/live-audio/skin.css +251 -107
- package/dist/dev/define/live-audio/skin.d.ts.map +1 -1
- package/dist/dev/define/live-audio/skin.js +6 -4
- package/dist/dev/define/live-audio/skin.js.map +1 -1
- package/dist/dev/define/live-audio/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-audio/skin.tailwind.js +11 -9
- package/dist/dev/define/live-audio/skin.tailwind.js.map +1 -1
- package/dist/dev/define/live-audio/ui.d.ts +1 -0
- package/dist/dev/define/live-audio/ui.js +30 -0
- package/dist/dev/define/live-audio/ui.js.map +1 -0
- package/dist/dev/define/live-video/minimal-skin.css +569 -146
- package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.js +53 -5
- package/dist/dev/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.js +60 -9
- package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/live-video/minimal-ui.d.ts +1 -0
- package/dist/dev/define/live-video/minimal-ui.js +44 -0
- package/dist/dev/define/live-video/minimal-ui.js.map +1 -0
- package/dist/dev/define/live-video/player.d.ts +17 -0
- package/dist/dev/define/live-video/player.d.ts.map +1 -0
- package/dist/dev/define/live-video/player.js +18 -0
- package/dist/dev/define/live-video/player.js.map +1 -0
- package/dist/dev/define/live-video/skin.css +579 -144
- package/dist/dev/define/live-video/skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.js +36 -2
- package/dist/dev/define/live-video/skin.js.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.js +57 -8
- package/dist/dev/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/dev/define/live-video/ui.d.ts +1 -0
- package/dist/dev/define/live-video/ui.js +44 -0
- package/dist/dev/define/live-video/ui.js.map +1 -0
- package/dist/dev/define/shared.css +4 -0
- package/dist/dev/define/skin-element.js +2 -2
- package/dist/dev/define/skin-element.js.map +1 -1
- package/dist/dev/define/tailwind.css +66 -0
- package/dist/dev/define/ui/compounds.d.ts +3 -1
- package/dist/dev/define/ui/compounds.d.ts.map +1 -1
- package/dist/dev/define/ui/compounds.js +43 -1
- package/dist/dev/define/ui/compounds.js.map +1 -1
- package/dist/dev/define/ui/menu.d.ts +25 -0
- package/dist/dev/define/ui/menu.d.ts.map +1 -0
- package/dist/dev/define/ui/menu.js +6 -0
- package/dist/dev/define/ui/menu.js.map +1 -0
- package/dist/dev/define/ui/playback-rate-menu.d.ts +13 -0
- package/dist/dev/define/ui/playback-rate-menu.d.ts.map +1 -0
- package/dist/dev/define/ui/playback-rate-menu.js +13 -0
- package/dist/dev/define/ui/playback-rate-menu.js.map +1 -0
- package/dist/dev/define/ui/seek-indicator-value.d.ts +9 -0
- package/dist/dev/define/ui/seek-indicator-value.d.ts.map +1 -0
- package/dist/dev/define/ui/seek-indicator-value.js +7 -0
- package/dist/dev/define/ui/seek-indicator-value.js.map +1 -0
- package/dist/dev/define/ui/seek-indicator.d.ts +11 -0
- package/dist/dev/define/ui/seek-indicator.d.ts.map +1 -0
- package/dist/dev/define/ui/seek-indicator.js +9 -0
- package/dist/dev/define/ui/seek-indicator.js.map +1 -0
- package/dist/dev/define/ui/status-announcer.d.ts +9 -0
- package/dist/dev/define/ui/status-announcer.d.ts.map +1 -0
- package/dist/dev/define/ui/status-announcer.js +7 -0
- package/dist/dev/define/ui/status-announcer.js.map +1 -0
- package/dist/dev/define/ui/status-indicator-value.d.ts +9 -0
- package/dist/dev/define/ui/status-indicator-value.d.ts.map +1 -0
- package/dist/dev/define/ui/status-indicator-value.js +7 -0
- package/dist/dev/define/ui/status-indicator-value.js.map +1 -0
- package/dist/dev/define/ui/status-indicator.d.ts +11 -0
- package/dist/dev/define/ui/status-indicator.d.ts.map +1 -0
- package/dist/dev/define/ui/status-indicator.js +9 -0
- package/dist/dev/define/ui/status-indicator.js.map +1 -0
- package/dist/dev/define/ui/volume-indicator-fill.d.ts +9 -0
- package/dist/dev/define/ui/volume-indicator-fill.d.ts.map +1 -0
- package/dist/dev/define/ui/volume-indicator-fill.js +7 -0
- package/dist/dev/define/ui/volume-indicator-fill.js.map +1 -0
- package/dist/dev/define/ui/volume-indicator-value.d.ts +9 -0
- package/dist/dev/define/ui/volume-indicator-value.d.ts.map +1 -0
- package/dist/dev/define/ui/volume-indicator-value.js +7 -0
- package/dist/dev/define/ui/volume-indicator-value.js.map +1 -0
- package/dist/dev/define/ui/volume-indicator.d.ts +13 -0
- package/dist/dev/define/ui/volume-indicator.d.ts.map +1 -0
- package/dist/dev/define/ui/volume-indicator.js +11 -0
- package/dist/dev/define/ui/volume-indicator.js.map +1 -0
- package/dist/dev/define/video/minimal-skin.css +569 -146
- package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.js +79 -14
- package/dist/dev/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.js +93 -21
- package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/video/minimal-ui.js +13 -3
- package/dist/dev/define/video/minimal-ui.js.map +1 -1
- package/dist/dev/define/video/skin.css +579 -144
- package/dist/dev/define/video/skin.d.ts.map +1 -1
- package/dist/dev/define/video/skin.js +52 -11
- package/dist/dev/define/video/skin.js.map +1 -1
- package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/skin.tailwind.js +89 -19
- package/dist/dev/define/video/skin.tailwind.js.map +1 -1
- package/dist/dev/define/video/ui.js +11 -1
- package/dist/dev/define/video/ui.js.map +1 -1
- package/dist/dev/icons/default/index.d.ts +2 -0
- package/dist/dev/icons/default/index.js +19 -0
- package/dist/dev/icons/element/default/index.d.ts +1 -0
- package/dist/dev/icons/element/default/index.js +1 -0
- package/dist/dev/icons/element/index.d.ts +1 -0
- package/dist/dev/icons/element/index.js +1 -0
- package/dist/dev/icons/element/minimal/index.d.ts +1 -0
- package/dist/dev/icons/element/minimal/index.js +1 -0
- package/dist/dev/icons/index.d.ts +2 -0
- package/dist/dev/icons/index.js +19 -0
- package/dist/dev/icons/minimal/index.d.ts +2 -0
- package/dist/dev/icons/minimal/index.js +19 -0
- package/dist/dev/index.d.ts +26 -2
- package/dist/dev/index.js +25 -1
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/index.d.ts +2 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/context-request-event.d.ts +61 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/context-request-event.d.ts.map +1 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-consumer.d.ts +1 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-provider.d.ts +22 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-provider.d.ts.map +1 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/create-context.d.ts +19 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/create-context.d.ts.map +1 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/decorators/consume.d.ts +1 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/decorators/provide.d.ts +1 -0
- package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/value-notifier.d.ts +1 -0
- package/dist/dev/node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/development/reactive-element.d.ts +116 -0
- package/dist/dev/node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/development/reactive-element.d.ts.map +1 -0
- package/dist/dev/packages/icons/dist/element/base.js +66 -0
- package/dist/dev/packages/icons/dist/element/base.js.map +1 -0
- package/dist/dev/packages/icons/dist/element/default/icons.js +25 -0
- package/dist/dev/packages/icons/dist/element/default/icons.js.map +1 -0
- package/dist/dev/packages/icons/dist/element/default/index.d.ts +1 -0
- package/dist/dev/packages/icons/dist/element/default/index.js +10 -0
- package/dist/dev/packages/icons/dist/element/default/index.js.map +1 -0
- package/dist/dev/packages/icons/dist/element/index.d.ts +1 -0
- package/dist/dev/packages/icons/dist/element/index.js +11 -0
- package/dist/dev/packages/icons/dist/element/index.js.map +1 -0
- package/dist/dev/packages/icons/dist/element/minimal/icons.js +25 -0
- package/dist/dev/packages/icons/dist/element/minimal/icons.js.map +1 -0
- package/dist/dev/packages/icons/dist/element/minimal/index.d.ts +1 -0
- package/dist/dev/packages/icons/dist/element/minimal/index.js +10 -0
- package/dist/dev/packages/icons/dist/element/minimal/index.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/captions-off.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/captions-off.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/captions-on.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/captions-on.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/cast-enter.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/cast-enter.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/cast-exit.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/cast-exit.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/check.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/check.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/chevron.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/chevron.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/fullscreen-enter.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/fullscreen-enter.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/fullscreen-exit.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/fullscreen-exit.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/index.d.ts +23 -0
- package/dist/dev/packages/icons/dist/html/default/index.d.ts.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/pause.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/pause.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/pip-enter.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/pip-enter.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/pip-exit.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/pip-exit.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/play.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/play.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/restart.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/restart.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/seek.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/seek.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/spinner.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/spinner.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/volume-high.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/volume-high.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/volume-low.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/volume-low.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/default/volume-off.js +6 -0
- package/dist/dev/packages/icons/dist/html/default/volume-off.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/captions-off.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/captions-off.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/captions-on.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/captions-on.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/cast-enter.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/cast-enter.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/cast-exit.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/cast-exit.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/check.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/check.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/chevron.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/chevron.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/fullscreen-enter.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/fullscreen-enter.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/fullscreen-exit.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/fullscreen-exit.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/index.d.ts +23 -0
- package/dist/dev/packages/icons/dist/html/minimal/index.d.ts.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/pause.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/pause.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/pip-enter.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/pip-enter.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/pip-exit.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/pip-exit.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/play.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/play.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/restart.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/restart.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/seek.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/seek.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/spinner.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/spinner.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/volume-high.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/volume-high.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/volume-low.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/volume-low.js.map +1 -0
- package/dist/dev/packages/icons/dist/html/minimal/volume-off.js +6 -0
- package/dist/dev/packages/icons/dist/html/minimal/volume-off.js.map +1 -0
- package/dist/dev/packages/icons/dist/render/default/index.js +32 -0
- package/dist/dev/packages/icons/dist/render/default/index.js.map +1 -0
- package/dist/dev/packages/icons/dist/render/minimal/index.js +32 -0
- package/dist/dev/packages/icons/dist/render/minimal/index.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/audio.tailwind.js +3 -2
- package/dist/dev/packages/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/buffering.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/buffering.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button-group.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +13 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/controls.js +7 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/controls.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/error.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/icon.js +9 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/icon.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/input-feedback.js +40 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js +12 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/overlay.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/playback-rate.js +6 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/popup.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/preview.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/reset.js +7 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/reset.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/root.js +8 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/root.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/seek.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/slider.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/surface.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/time.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/video.tailwind.js +13 -4
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/audio.tailwind.js +4 -2
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/buffering.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button.js +13 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/controls.js +7 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/error.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/icon.js +9 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/input-feedback.js +41 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js +12 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/preview.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/reset.js +7 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/reset.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/root.js +8 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/root.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/slider.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/time.js.map +1 -0
- package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/video.tailwind.js +6 -4
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
- package/dist/dev/player/context.d.ts +2 -1
- package/dist/dev/player/context.d.ts.map +1 -1
- package/dist/dev/player/context.js.map +1 -1
- package/dist/dev/presets/live-audio.d.ts +2 -1
- package/dist/dev/presets/live-audio.js +2 -1
- package/dist/dev/presets/live-video.d.ts +2 -1
- package/dist/dev/presets/live-video.js +2 -1
- package/dist/dev/store/provider-mixin.d.ts.map +1 -1
- package/dist/dev/store/provider-mixin.js +8 -3
- package/dist/dev/store/provider-mixin.js.map +1 -1
- package/dist/dev/ui/controls/controls-element.d.ts.map +1 -1
- package/dist/dev/ui/controls/controls-element.js +13 -1
- package/dist/dev/ui/controls/controls-element.js.map +1 -1
- package/dist/dev/ui/gesture/gesture-element.js +2 -1
- package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
- package/dist/dev/ui/hotkey/hotkey-element.js +1 -0
- package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/dev/ui/input-indicators/input-indicator-element.d.ts +37 -0
- package/dist/dev/ui/input-indicators/input-indicator-element.d.ts.map +1 -0
- package/dist/dev/ui/input-indicators/input-indicator-element.js +110 -0
- package/dist/dev/ui/input-indicators/input-indicator-element.js.map +1 -0
- package/dist/dev/ui/input-indicators/live-indicator.d.ts +18 -0
- package/dist/dev/ui/input-indicators/live-indicator.d.ts.map +1 -0
- package/dist/dev/ui/input-indicators/live-indicator.js +32 -0
- package/dist/dev/ui/input-indicators/live-indicator.js.map +1 -0
- package/dist/dev/ui/live-button/live-button-element.d.ts +38 -0
- package/dist/dev/ui/live-button/live-button-element.d.ts.map +1 -0
- package/dist/dev/ui/live-button/live-button-element.js +98 -0
- package/dist/dev/ui/live-button/live-button-element.js.map +1 -0
- package/dist/dev/ui/menu/context.d.ts +25 -0
- package/dist/dev/ui/menu/context.d.ts.map +1 -0
- package/dist/dev/ui/menu/context.js +10 -0
- package/dist/dev/ui/menu/context.js.map +1 -0
- package/dist/dev/ui/menu/menu-back-element.d.ts +20 -0
- package/dist/dev/ui/menu/menu-back-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-back-element.js +57 -0
- package/dist/dev/ui/menu/menu-back-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-checkbox-item-element.d.ts +24 -0
- package/dist/dev/ui/menu/menu-checkbox-item-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-checkbox-item-element.js +78 -0
- package/dist/dev/ui/menu/menu-checkbox-item-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-element.d.ts +52 -0
- package/dist/dev/ui/menu/menu-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-element.js +285 -0
- package/dist/dev/ui/menu/menu-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-group-element.d.ts +18 -0
- package/dist/dev/ui/menu/menu-group-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-group-element.js +35 -0
- package/dist/dev/ui/menu/menu-group-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-item-element.d.ts +25 -0
- package/dist/dev/ui/menu/menu-item-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-item-element.js +96 -0
- package/dist/dev/ui/menu/menu-item-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-item-indicator-element.d.ts +22 -0
- package/dist/dev/ui/menu/menu-item-indicator-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-item-indicator-element.js +34 -0
- package/dist/dev/ui/menu/menu-item-indicator-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-label-element.d.ts +15 -0
- package/dist/dev/ui/menu/menu-label-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-label-element.js +20 -0
- package/dist/dev/ui/menu/menu-label-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts +22 -0
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-radio-group-element.js +51 -0
- package/dist/dev/ui/menu/menu-radio-group-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-radio-item-element.d.ts +24 -0
- package/dist/dev/ui/menu/menu-radio-item-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-radio-item-element.js +84 -0
- package/dist/dev/ui/menu/menu-radio-item-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-separator-element.d.ts +12 -0
- package/dist/dev/ui/menu/menu-separator-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-separator-element.js +24 -0
- package/dist/dev/ui/menu/menu-separator-element.js.map +1 -0
- package/dist/dev/ui/menu/menu-view-element.d.ts +11 -0
- package/dist/dev/ui/menu/menu-view-element.d.ts.map +1 -0
- package/dist/dev/ui/menu/menu-view-element.js +16 -0
- package/dist/dev/ui/menu/menu-view-element.js.map +1 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.d.ts +53 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.d.ts.map +1 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.js +48 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.js.map +1 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.d.ts +35 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.d.ts.map +1 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.js +86 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.js.map +1 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.d.ts +31 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.d.ts.map +1 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.js +114 -0
- package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.js.map +1 -0
- package/dist/dev/ui/popover/popover-element.d.ts +6 -0
- package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
- package/dist/dev/ui/popover/popover-element.js +30 -9
- package/dist/dev/ui/popover/popover-element.js.map +1 -1
- package/dist/dev/ui/position-controller.js +11 -6
- package/dist/dev/ui/position-controller.js.map +1 -1
- package/dist/dev/ui/seek-indicator/seek-indicator-element.d.ts +25 -0
- package/dist/dev/ui/seek-indicator/seek-indicator-element.d.ts.map +1 -0
- package/dist/dev/ui/seek-indicator/seek-indicator-element.js +44 -0
- package/dist/dev/ui/seek-indicator/seek-indicator-element.js.map +1 -0
- package/dist/dev/ui/seek-indicator/seek-indicator-value-element.d.ts +9 -0
- package/dist/dev/ui/seek-indicator/seek-indicator-value-element.d.ts.map +1 -0
- package/dist/dev/ui/seek-indicator/seek-indicator-value-element.js +11 -0
- package/dist/dev/ui/seek-indicator/seek-indicator-value-element.js.map +1 -0
- package/dist/dev/ui/status-announcer/status-announcer-element.d.ts +23 -0
- package/dist/dev/ui/status-announcer/status-announcer-element.d.ts.map +1 -0
- package/dist/dev/ui/status-announcer/status-announcer-element.js +70 -0
- package/dist/dev/ui/status-announcer/status-announcer-element.js.map +1 -0
- package/dist/dev/ui/status-indicator/status-indicator-element.d.ts +29 -0
- package/dist/dev/ui/status-indicator/status-indicator-element.d.ts.map +1 -0
- package/dist/dev/ui/status-indicator/status-indicator-element.js +53 -0
- package/dist/dev/ui/status-indicator/status-indicator-element.js.map +1 -0
- package/dist/dev/ui/status-indicator/status-indicator-value-element.d.ts +9 -0
- package/dist/dev/ui/status-indicator/status-indicator-value-element.d.ts.map +1 -0
- package/dist/dev/ui/status-indicator/status-indicator-value-element.js +11 -0
- package/dist/dev/ui/status-indicator/status-indicator-value-element.js.map +1 -0
- package/dist/dev/ui/tooltip/tooltip-element.d.ts +6 -0
- package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
- package/dist/dev/ui/tooltip/tooltip-element.js +27 -8
- package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
- package/dist/dev/ui/volume-indicator/volume-indicator-element.d.ts +25 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-element.d.ts.map +1 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-element.js +46 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-element.js.map +1 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.d.ts +9 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.d.ts.map +1 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.js +11 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.js.map +1 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-value-element.d.ts +9 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-value-element.d.ts.map +1 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-value-element.js +11 -0
- package/dist/dev/ui/volume-indicator/volume-indicator-value-element.js.map +1 -0
- package/docs/README.md +7 -0
- package/docs/concepts/accessibility.md +60 -0
- package/docs/concepts/browser-support.md +37 -0
- package/docs/concepts/features.md +129 -0
- package/docs/concepts/overview.md +118 -0
- package/docs/concepts/presets.md +207 -0
- package/docs/concepts/skins.md +2006 -0
- package/docs/concepts/ui-components.md +59 -0
- package/docs/concepts/v10-roadmap.md +75 -0
- package/docs/concepts/why-videojs.md +113 -0
- package/docs/how-to/build-with-ai.md +39 -0
- package/docs/how-to/build-your-own-component.md +217 -0
- package/docs/how-to/customize-skins.md +5711 -0
- package/docs/how-to/installation.md +172 -0
- package/docs/llms.txt +88 -0
- package/docs/reference/buffering-indicator.md +152 -0
- package/docs/reference/captions-button.md +216 -0
- package/docs/reference/container-mixin.md +69 -0
- package/docs/reference/controls.md +248 -0
- package/docs/reference/create-selector.md +59 -0
- package/docs/reference/feature-buffer.md +52 -0
- package/docs/reference/feature-controls.md +70 -0
- package/docs/reference/feature-error.md +60 -0
- package/docs/reference/feature-fullscreen.md +90 -0
- package/docs/reference/feature-live.md +60 -0
- package/docs/reference/feature-pip.md +90 -0
- package/docs/reference/feature-playback-rate.md +70 -0
- package/docs/reference/feature-playback.md +110 -0
- package/docs/reference/feature-remote-playback.md +70 -0
- package/docs/reference/feature-source.md +70 -0
- package/docs/reference/feature-stream-type.md +46 -0
- package/docs/reference/feature-text-tracks.md +100 -0
- package/docs/reference/feature-time.md +80 -0
- package/docs/reference/feature-volume.md +90 -0
- package/docs/reference/fullscreen-button.md +229 -0
- package/docs/reference/html-create-player.md +449 -0
- package/docs/reference/media-attach-mixin.md +83 -0
- package/docs/reference/mute-button.md +301 -0
- package/docs/reference/pip-button.md +229 -0
- package/docs/reference/play-button.md +251 -0
- package/docs/reference/playback-rate-button.md +170 -0
- package/docs/reference/player-container.md +126 -0
- package/docs/reference/player-context.md +50 -0
- package/docs/reference/player-controller.md +276 -0
- package/docs/reference/player-provider.md +114 -0
- package/docs/reference/popover.md +460 -0
- package/docs/reference/poster.md +158 -0
- package/docs/reference/provider-mixin.md +71 -0
- package/docs/reference/seek-button.md +223 -0
- package/docs/reference/slider.md +862 -0
- package/docs/reference/snapshot-controller.md +208 -0
- package/docs/reference/store-controller.md +180 -0
- package/docs/reference/thumbnail.md +364 -0
- package/docs/reference/time-slider.md +794 -0
- package/docs/reference/time.md +488 -0
- package/docs/reference/tooltip.md +547 -0
- package/docs/reference/volume-slider.md +783 -0
- package/package.json +23 -10
- package/cdn/compounds-BHHGcL_P.js.map +0 -1
- package/cdn/compounds-DJyzXLOB.js +0 -8
- package/cdn/compounds-DJyzXLOB.js.map +0 -1
- package/cdn/create-player-B-gVAMdr.js.map +0 -1
- package/cdn/create-player-C5ui1T2i.js +0 -7
- package/cdn/create-player-C5ui1T2i.js.map +0 -1
- package/cdn/default-Djy9PEXm.js +0 -2
- package/cdn/default-Djy9PEXm.js.map +0 -1
- package/cdn/default-YzaLyoYg.js +0 -30
- package/cdn/default-YzaLyoYg.js.map +0 -1
- package/cdn/hls-DEP0AzDp.js.map +0 -1
- package/cdn/hls-DR-Xxpxv.js.map +0 -1
- package/cdn/hotkey-element-BvI78DTc.js +0 -2
- package/cdn/hotkey-element-BvI78DTc.js.map +0 -1
- package/cdn/hotkey-element-oEdY8YLl.js.map +0 -1
- package/cdn/minimal-CciG7Fsu.js +0 -30
- package/cdn/minimal-CciG7Fsu.js.map +0 -1
- package/cdn/minimal-DSLrhnDm.js +0 -2
- package/cdn/minimal-DSLrhnDm.js.map +0 -1
- package/cdn/minimal-ui-Bx-_SggT.js +0 -29
- package/cdn/minimal-ui-Bx-_SggT.js.map +0 -1
- package/cdn/minimal-ui-CFO4ssL8.js +0 -2
- package/cdn/minimal-ui-CFO4ssL8.js.map +0 -1
- package/cdn/minimal-ui-D6Pvbx1R.js +0 -2
- package/cdn/minimal-ui-D6Pvbx1R.js.map +0 -1
- package/cdn/minimal-ui-Dl-8ZL53.js +0 -22
- package/cdn/minimal-ui-Dl-8ZL53.js.map +0 -1
- package/cdn/player-BKKCelEs.js +0 -2
- package/cdn/player-BKKCelEs.js.map +0 -1
- package/cdn/player-C_6YjMl7.js.map +0 -1
- package/cdn/player-CtegNw3g.js +0 -2
- package/cdn/predicate-BOcV_HDG.js.map +0 -1
- package/cdn/predicate-Cad5WV4q.js.map +0 -1
- package/cdn/skin-element-BcbrkgGs.js +0 -55
- package/cdn/skin-element-BcbrkgGs.js.map +0 -1
- package/cdn/skin-element-DesLkJKs.js +0 -2
- package/cdn/skin-element-DesLkJKs.js.map +0 -1
- package/cdn/ui-CzxKbsyb.js +0 -32
- package/cdn/ui-CzxKbsyb.js.map +0 -1
- package/cdn/ui-D6DV-Emw.js +0 -2
- package/cdn/ui-D6DV-Emw.js.map +0 -1
- package/cdn/ui-Dw-n2AMs.js +0 -2
- package/cdn/ui-Dw-n2AMs.js.map +0 -1
- package/cdn/ui-S_eLj4ur.js +0 -25
- package/cdn/ui-S_eLj4ur.js.map +0 -1
- package/dist/default/_virtual/inline-css_src/define/base.js +0 -6
- package/dist/default/_virtual/inline-css_src/define/base.js.map +0 -1
- package/dist/dev/_virtual/inline-css_src/define/base.js +0 -6
- package/dist/dev/_virtual/inline-css_src/define/base.js.map +0 -1
- package/dist/dev/icons/dist/render/default/index.js +0 -30
- package/dist/dev/icons/dist/render/default/index.js.map +0 -1
- package/dist/dev/icons/dist/render/minimal/index.js +0 -30
- package/dist/dev/icons/dist/render/minimal/index.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/button-group.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/button.js +0 -12
- package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +0 -7
- package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +0 -9
- package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js +0 -6
- package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/root.js +0 -7
- package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +0 -1
- package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +0 -12
- package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +0 -7
- package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +0 -9
- package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js +0 -6
- package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +0 -7
- package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +0 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +0 -1
- package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +0 -1
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/button-group.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/error.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/overlay.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/popup.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/poster.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/seek.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/surface.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/time.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/button-group.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/error.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/overlay.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/popup.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/poster.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/seek.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/time.js +0 -0
- /package/dist/dev/{skins → packages/skins}/dist/default/shared/tailwind/icon-state.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-hls-video.dev.js","names":["#readableStream","#runFn","#signal","#abortController","#status","#value","#error","#destroyed","#pending","#settled","#resolveSettled","#chain","#current","ActorKeyByType","deriveState","deriveState","waitForSourceBuffersReady","getMaxBufferedEnd","#config","#engine","#cancelPendingPlay","#preload","#loadstartListener"],"sources":["../../../spf/dist/dev/core/abr/ewma.js","../../../spf/dist/dev/core/abr/bandwidth-estimator.js","../../../spf/dist/dev/core/buffer/forward-buffer.js","../../../../node_modules/.pnpm/signal-polyfill@0.2.2/node_modules/signal-polyfill/dist/index.js","../../../spf/dist/dev/core/signals/effect.js","../../../spf/dist/dev/core/signals/primitives.js","../../../spf/dist/dev/core/types/index.js","../../../spf/dist/dev/core/utils/track-selection.js","../../../spf/dist/dev/dom/network/chunked-stream-iterable.js","../../../spf/dist/dev/dom/network/fetch.js","../../../spf/dist/dev/core/buffer/back-buffer.js","../../../spf/dist/dev/core/machine.js","../../../spf/dist/dev/core/create-machine-actor.js","../../../spf/dist/dev/core/utils/generate-id.js","../../../spf/dist/dev/core/task.js","../../../spf/dist/dev/dom/features/segment-loader-actor.js","../../../spf/dist/dev/dom/features/load-segments.js","../../../spf/dist/dev/dom/text/parse-vtt-segment.js","../../../spf/dist/dev/core/create-machine-reactor.js","../../../spf/dist/dev/dom/features/text-track-segment-loader-actor.js","../../../spf/dist/dev/core/create-transition-actor.js","../../../spf/dist/dev/dom/features/text-tracks-actor.js","../../../spf/dist/dev/dom/features/load-text-track-cues.js","../../../spf/dist/dev/dom/features/track-current-time.js","../../../spf/dist/dev/dom/features/track-playback-initiated.js","../../../spf/dist/dev/dom/media/append-segment.js","../../../spf/dist/dev/dom/media/buffer-flusher.js","../../../spf/dist/dev/core/features/calculate-presentation-duration.js","../../../spf/dist/dev/core/abr/quality-selection.js","../../../spf/dist/dev/core/features/quality-switching.js","../../../spf/dist/dev/core/hls/parse-attributes.js","../../../spf/dist/dev/core/hls/resolve-url.js","../../../spf/dist/dev/core/hls/parse-multivariant.js","../../../spf/dist/dev/core/features/resolve-presentation.js","../../../spf/dist/dev/core/hls/parse-media-playlist.js","../../../spf/dist/dev/core/features/resolve-track.js","../../../spf/dist/dev/core/features/select-tracks.js","../../../spf/dist/dev/core/features/sync-preload-attribute.js","../../../spf/dist/dev/dom/features/end-of-stream.js","../../../spf/dist/dev/dom/media/mediasource-setup.js","../../../spf/dist/dev/dom/features/setup-mediasource.js","../../../spf/dist/dev/dom/media/source-buffer-actor.js","../../../spf/dist/dev/dom/features/setup-sourcebuffer.js","../../../spf/dist/dev/dom/features/sync-text-tracks.js","../../../spf/dist/dev/dom/features/update-duration.js","../../../spf/dist/dev/dom/playback-engine/engine.js","../../../spf/dist/dev/dom/playback-engine/adapter.js","../../../core/dist/dev/dom/media/simple-hls/index.js","../../src/media/simple-hls-video/index.ts","../../src/define/media/simple-hls-video.ts"],"sourcesContent":["//#region src/core/abr/ewma.ts\n/**\n* Exponentially Weighted Moving Average (EWMA)\n*\n* Pure functional implementation of EWMA calculations.\n* Based on Shaka Player's EWMA algorithm.\n*/\n/**\n* Calculate alpha (decay factor) from half-life.\n*\n* Alpha determines how quickly old data \"expires\":\n* - alpha close to 1 = slow decay (long memory)\n* - alpha close to 0 = fast decay (short memory)\n*\n* @param halfLife - The quantity of prior samples (by weight) that make up\n* half of the new estimate. Must be positive.\n* @returns Alpha value between 0 and 1\n*\n* @example\n* const alpha = calculateAlpha(2); // ≈ 0.7071 for 2-second half-life\n*/\nfunction calculateAlpha(halfLife) {\n\treturn Math.exp(Math.log(.5) / halfLife);\n}\n/**\n* Calculate exponentially weighted moving average.\n*\n* Updates an estimate by blending a new value with the previous estimate,\n* weighted by the sample duration. Longer samples have more influence.\n*\n* @param prevEstimate - Previous EWMA estimate\n* @param value - New sample value to incorporate\n* @param weight - Sample weight (typically duration in seconds)\n* @param halfLife - Half-life for decay (typically 2-5 seconds)\n* @returns Updated EWMA estimate\n*\n* @example\n* let estimate = 0;\n* estimate = calculateEwma(estimate, 1_000_000, 1, 2); // First sample\n* estimate = calculateEwma(estimate, 2_000_000, 1, 2); // Second sample\n*/\nfunction calculateEwma(prevEstimate, value, weight, halfLife) {\n\tconst adjAlpha = calculateAlpha(halfLife) ** weight;\n\treturn value * (1 - adjAlpha) + adjAlpha * prevEstimate;\n}\n/**\n* Apply zero-factor correction to EWMA estimate.\n*\n* The zero-factor correction compensates for bias when starting from zero.\n* Without this correction, early estimates would be artificially low.\n*\n* As totalWeight increases, the correction factor approaches 1, meaning\n* the estimate becomes more reliable and needs less correction.\n*\n* @param estimate - Raw EWMA estimate (uncorrected)\n* @param totalWeight - Accumulated weight from all samples\n* @param halfLife - Half-life used in EWMA calculation\n* @returns Corrected estimate, or 0 if totalWeight is 0\n*\n* @example\n* const raw = calculateEwma(0, 1_000_000, 1, 2);\n* const corrected = applyZeroFactor(raw, 1, 2); // ≈ 1_000_000\n*/\nfunction applyZeroFactor(estimate, totalWeight, halfLife) {\n\tif (totalWeight === 0) return 0;\n\treturn estimate / (1 - calculateAlpha(halfLife) ** totalWeight);\n}\n//#endregion\nexport { applyZeroFactor, calculateEwma };\n\n//# sourceMappingURL=ewma.js.map","import { applyZeroFactor, calculateEwma } from \"./ewma.js\";\n//#region src/core/abr/bandwidth-estimator.ts\n/**\n* Dual EWMA Bandwidth Estimator\n*\n* Estimates available bandwidth using two EWMA calculations with different\n* half-lives, taking the minimum of both. This approach (from Shaka Player):\n*\n* - **Fast EWMA** (2s half-life): Reacts quickly to bandwidth drops\n* - **Slow EWMA** (5s half-life): Provides stability during fluctuations\n* - **min(fast, slow)**: Adapts down quickly, up slowly\n*\n* This naturally provides asymmetric behavior needed for good QoE:\n* avoiding stalls (quick downgrade) while preventing oscillation (slow upgrade).\n*/\n/**\n* Default bandwidth estimator configuration.\n*\n* Values match Shaka Player defaults based on experimentation.\n*/\nconst DEFAULT_BANDWIDTH_CONFIG = {\n\tfastHalfLife: 2,\n\tslowHalfLife: 5,\n\tminTotalBytes: 128e3,\n\tminBytes: 16e3,\n\tminDuration: 5\n};\n/**\n* Add a bandwidth sample from a segment download.\n*\n* Samples are filtered based on:\n* - Minimum bytes (filters TTFB-dominated small segments)\n* - Minimum duration (filters cached responses)\n*\n* Valid samples update both fast and slow EWMA estimates.\n*\n* @param state - Current estimator state\n* @param durationMs - Download duration in milliseconds\n* @param numBytes - Number of bytes downloaded\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns New estimator state with sample incorporated (or unchanged if filtered)\n*\n* @example\n* let state = { fastEstimate: 0, fastTotalWeight: 0, ... };\n* // Sample: 1MB in 1 second\n* state = sampleBandwidth(state, 1000, 1_000_000);\n*/\nfunction sampleBandwidth(state, durationMs, numBytes, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tconst updatedBytesSampled = state.bytesSampled + numBytes;\n\tif (numBytes < config.minBytes) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tif (durationMs < config.minDuration) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tconst bandwidth = 8e3 * numBytes / durationMs;\n\tconst weight = durationMs / 1e3;\n\treturn {\n\t\tfastEstimate: calculateEwma(state.fastEstimate, bandwidth, weight, config.fastHalfLife),\n\t\tfastTotalWeight: state.fastTotalWeight + weight,\n\t\tslowEstimate: calculateEwma(state.slowEstimate, bandwidth, weight, config.slowHalfLife),\n\t\tslowTotalWeight: state.slowTotalWeight + weight,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n}\n/**\n* Get the current bandwidth estimate.\n*\n* Returns the **minimum** of the fast and slow EWMA estimates.\n* This provides the key asymmetric behavior:\n* - When bandwidth drops, fast EWMA reacts first and dominates (quick adaptation)\n* - When bandwidth rises, slow EWMA lags behind and dominates (slow adaptation)\n*\n* Uses default estimate until enough data has been sampled.\n*\n* @param state - Current estimator state\n* @param defaultEstimate - Fallback estimate before sufficient samples (bps)\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns Bandwidth estimate in bits per second\n*\n* @example\n* const estimate = getBandwidthEstimate(state, 5_000_000); // 5 Mbps default\n*/\nfunction getBandwidthEstimate(state, defaultEstimate, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tif (state.bytesSampled < config.minTotalBytes) return defaultEstimate;\n\tconst fastEstimate = applyZeroFactor(state.fastEstimate, state.fastTotalWeight, config.fastHalfLife);\n\tconst slowEstimate = applyZeroFactor(state.slowEstimate, state.slowTotalWeight, config.slowHalfLife);\n\treturn Math.min(fastEstimate, slowEstimate);\n}\n//#endregion\nexport { getBandwidthEstimate, sampleBandwidth };\n\n//# sourceMappingURL=bandwidth-estimator.js.map","//#region src/core/buffer/forward-buffer.ts\n/**\n* Default forward buffer configuration.\n*/\nconst DEFAULT_FORWARD_BUFFER_CONFIG = { bufferDuration: 30 };\n/**\n* Get segments that need to be loaded for forward buffer.\n*\n* Determines which segments to load to maintain target buffer duration.\n* Handles discontiguous buffering (gaps after seeks).\n*\n* Algorithm:\n* 1. Calculate target time: currentTime + bufferDuration\n* 2. Find all segments in range [currentTime, targetTime)\n* 3. Filter out segments already buffered at that time position\n* 4. Return segments to load (fills gaps + extends to target)\n*\n* @param segments - All available segments from playlist\n* @param bufferedSegments - Segments already buffered (ordered by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Array of segments to load (empty if buffer is sufficient)\n*\n* @example\n* // After seek: buffered [0-12, 18-30], playing at 7s\n* const toLoad = getSegmentsToLoad(segments, buffered, 7, { bufferDuration: 24 });\n* // Returns [seg-12, seg-30] (fills gap, extends to target 31s)\n*/\n/**\n* Calculate the start time from which to flush forward buffer content.\n*\n* Content that starts at or beyond `currentTime + bufferDuration` is no\n* longer needed for the current playback position and should be removed\n* from the SourceBuffer. This prevents unbounded accumulation of scattered\n* SourceBuffer content after seeks, which can cause QuotaExceededError on\n* long-form content.\n*\n* Returns `Infinity` when nothing needs flushing (no buffered segments\n* exist beyond the threshold).\n*\n* @param bufferedSegments - Segments currently tracked in the buffer model\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Start time to flush from (flush range: [flushStart, Infinity)),\n* or Infinity if no flush is needed\n*\n* @example\n* // Playing at 0s, buffered [0,6,12,18,24,30,36], bufferDuration=30\n* const flushStart = calculateForwardFlushPoint(segments, 0);\n* // Returns 30 — flush [30, Infinity), keep [0, 30)\n*/\nfunction calculateForwardFlushPoint(bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (bufferedSegments.length === 0) return Infinity;\n\tconst threshold = currentTime + config.bufferDuration;\n\tconst beyond = bufferedSegments.filter((seg) => seg.startTime >= threshold);\n\tif (beyond.length === 0) return Infinity;\n\treturn Math.min(...beyond.map((seg) => seg.startTime));\n}\nfunction getSegmentsToLoad(segments, bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (segments.length === 0) return [];\n\tconst targetTime = currentTime + config.bufferDuration;\n\tconst bufferedStartTimes = new Set(bufferedSegments.map((seg) => seg.startTime));\n\treturn segments.filter((seg) => {\n\t\tconst segmentEnd = seg.startTime + seg.duration;\n\t\tconst isInRange = seg.startTime < targetTime && segmentEnd > currentTime;\n\t\tconst isNotBuffered = !bufferedStartTimes.has(seg.startTime);\n\t\treturn isInRange && isNotBuffered;\n\t});\n}\n//#endregion\nexport { DEFAULT_FORWARD_BUFFER_CONFIG, calculateForwardFlushPoint, getSegmentsToLoad };\n\n//# sourceMappingURL=forward-buffer.js.map","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nvar __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateIn = (member, obj) => {\n if (Object(obj) !== obj)\n throw TypeError('Cannot use the \"in\" operator on this value');\n return member.has(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction defaultEquals(a, b) {\n return Object.is(a, b);\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet activeConsumer = null;\nlet inNotificationPhase = false;\nlet epoch = 1;\nconst SIGNAL = /* @__PURE__ */ Symbol(\"SIGNAL\");\nfunction setActiveConsumer(consumer) {\n const prev = activeConsumer;\n activeConsumer = consumer;\n return prev;\n}\nfunction getActiveConsumer() {\n return activeConsumer;\n}\nfunction isInNotificationPhase() {\n return inNotificationPhase;\n}\nconst REACTIVE_NODE = {\n version: 0,\n lastCleanEpoch: 0,\n dirty: false,\n producerNode: void 0,\n producerLastReadVersion: void 0,\n producerIndexOfThis: void 0,\n nextProducerIndex: 0,\n liveConsumerNode: void 0,\n liveConsumerIndexOfThis: void 0,\n consumerAllowSignalWrites: false,\n consumerIsAlwaysLive: false,\n producerMustRecompute: () => false,\n producerRecomputeValue: () => {\n },\n consumerMarkedDirty: () => {\n },\n consumerOnSignalRead: () => {\n }\n};\nfunction producerAccessed(node) {\n if (inNotificationPhase) {\n throw new Error(\n typeof ngDevMode !== \"undefined\" && ngDevMode ? `Assertion error: signal read during notification phase` : \"\"\n );\n }\n if (activeConsumer === null) {\n return;\n }\n activeConsumer.consumerOnSignalRead(node);\n const idx = activeConsumer.nextProducerIndex++;\n assertConsumerNode(activeConsumer);\n if (idx < activeConsumer.producerNode.length && activeConsumer.producerNode[idx] !== node) {\n if (consumerIsLive(activeConsumer)) {\n const staleProducer = activeConsumer.producerNode[idx];\n producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]);\n }\n }\n if (activeConsumer.producerNode[idx] !== node) {\n activeConsumer.producerNode[idx] = node;\n activeConsumer.producerIndexOfThis[idx] = consumerIsLive(activeConsumer) ? producerAddLiveConsumer(node, activeConsumer, idx) : 0;\n }\n activeConsumer.producerLastReadVersion[idx] = node.version;\n}\nfunction producerIncrementEpoch() {\n epoch++;\n}\nfunction producerUpdateValueVersion(node) {\n if (!node.dirty && node.lastCleanEpoch === epoch) {\n return;\n }\n if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) {\n node.dirty = false;\n node.lastCleanEpoch = epoch;\n return;\n }\n node.producerRecomputeValue(node);\n node.dirty = false;\n node.lastCleanEpoch = epoch;\n}\nfunction producerNotifyConsumers(node) {\n if (node.liveConsumerNode === void 0) {\n return;\n }\n const prev = inNotificationPhase;\n inNotificationPhase = true;\n try {\n for (const consumer of node.liveConsumerNode) {\n if (!consumer.dirty) {\n consumerMarkDirty(consumer);\n }\n }\n } finally {\n inNotificationPhase = prev;\n }\n}\nfunction producerUpdatesAllowed() {\n return (activeConsumer == null ? void 0 : activeConsumer.consumerAllowSignalWrites) !== false;\n}\nfunction consumerMarkDirty(node) {\n var _a;\n node.dirty = true;\n producerNotifyConsumers(node);\n (_a = node.consumerMarkedDirty) == null ? void 0 : _a.call(node.wrapper ?? node);\n}\nfunction consumerBeforeComputation(node) {\n node && (node.nextProducerIndex = 0);\n return setActiveConsumer(node);\n}\nfunction consumerAfterComputation(node, prevConsumer) {\n setActiveConsumer(prevConsumer);\n if (!node || node.producerNode === void 0 || node.producerIndexOfThis === void 0 || node.producerLastReadVersion === void 0) {\n return;\n }\n if (consumerIsLive(node)) {\n for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n }\n }\n while (node.producerNode.length > node.nextProducerIndex) {\n node.producerNode.pop();\n node.producerLastReadVersion.pop();\n node.producerIndexOfThis.pop();\n }\n}\nfunction consumerPollProducersForChange(node) {\n assertConsumerNode(node);\n for (let i = 0; i < node.producerNode.length; i++) {\n const producer = node.producerNode[i];\n const seenVersion = node.producerLastReadVersion[i];\n if (seenVersion !== producer.version) {\n return true;\n }\n producerUpdateValueVersion(producer);\n if (seenVersion !== producer.version) {\n return true;\n }\n }\n return false;\n}\nfunction producerAddLiveConsumer(node, consumer, indexOfThis) {\n var _a;\n assertProducerNode(node);\n assertConsumerNode(node);\n if (node.liveConsumerNode.length === 0) {\n (_a = node.watched) == null ? void 0 : _a.call(node.wrapper);\n for (let i = 0; i < node.producerNode.length; i++) {\n node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i);\n }\n }\n node.liveConsumerIndexOfThis.push(indexOfThis);\n return node.liveConsumerNode.push(consumer) - 1;\n}\nfunction producerRemoveLiveConsumerAtIndex(node, idx) {\n var _a;\n assertProducerNode(node);\n assertConsumerNode(node);\n if (typeof ngDevMode !== \"undefined\" && ngDevMode && idx >= node.liveConsumerNode.length) {\n throw new Error(\n `Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`\n );\n }\n if (node.liveConsumerNode.length === 1) {\n (_a = node.unwatched) == null ? void 0 : _a.call(node.wrapper);\n for (let i = 0; i < node.producerNode.length; i++) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n }\n }\n const lastIdx = node.liveConsumerNode.length - 1;\n node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx];\n node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx];\n node.liveConsumerNode.length--;\n node.liveConsumerIndexOfThis.length--;\n if (idx < node.liveConsumerNode.length) {\n const idxProducer = node.liveConsumerIndexOfThis[idx];\n const consumer = node.liveConsumerNode[idx];\n assertConsumerNode(consumer);\n consumer.producerIndexOfThis[idxProducer] = idx;\n }\n}\nfunction consumerIsLive(node) {\n var _a;\n return node.consumerIsAlwaysLive || (((_a = node == null ? void 0 : node.liveConsumerNode) == null ? void 0 : _a.length) ?? 0) > 0;\n}\nfunction assertConsumerNode(node) {\n node.producerNode ?? (node.producerNode = []);\n node.producerIndexOfThis ?? (node.producerIndexOfThis = []);\n node.producerLastReadVersion ?? (node.producerLastReadVersion = []);\n}\nfunction assertProducerNode(node) {\n node.liveConsumerNode ?? (node.liveConsumerNode = []);\n node.liveConsumerIndexOfThis ?? (node.liveConsumerIndexOfThis = []);\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction computedGet(node) {\n producerUpdateValueVersion(node);\n producerAccessed(node);\n if (node.value === ERRORED) {\n throw node.error;\n }\n return node.value;\n}\nfunction createComputed(computation) {\n const node = Object.create(COMPUTED_NODE);\n node.computation = computation;\n const computed = () => computedGet(node);\n computed[SIGNAL] = node;\n return computed;\n}\nconst UNSET = /* @__PURE__ */ Symbol(\"UNSET\");\nconst COMPUTING = /* @__PURE__ */ Symbol(\"COMPUTING\");\nconst ERRORED = /* @__PURE__ */ Symbol(\"ERRORED\");\nconst COMPUTED_NODE = /* @__PURE__ */ (() => {\n return {\n ...REACTIVE_NODE,\n value: UNSET,\n dirty: true,\n error: null,\n equal: defaultEquals,\n producerMustRecompute(node) {\n return node.value === UNSET || node.value === COMPUTING;\n },\n producerRecomputeValue(node) {\n if (node.value === COMPUTING) {\n throw new Error(\"Detected cycle in computations.\");\n }\n const oldValue = node.value;\n node.value = COMPUTING;\n const prevConsumer = consumerBeforeComputation(node);\n let newValue;\n let wasEqual = false;\n try {\n newValue = node.computation.call(node.wrapper);\n const oldOk = oldValue !== UNSET && oldValue !== ERRORED;\n wasEqual = oldOk && node.equal.call(node.wrapper, oldValue, newValue);\n } catch (err) {\n newValue = ERRORED;\n node.error = err;\n } finally {\n consumerAfterComputation(node, prevConsumer);\n }\n if (wasEqual) {\n node.value = oldValue;\n return;\n }\n node.value = newValue;\n node.version++;\n }\n };\n})();\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction defaultThrowError() {\n throw new Error();\n}\nlet throwInvalidWriteToSignalErrorFn = defaultThrowError;\nfunction throwInvalidWriteToSignalError() {\n throwInvalidWriteToSignalErrorFn();\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction createSignal(initialValue) {\n const node = Object.create(SIGNAL_NODE);\n node.value = initialValue;\n const getter = () => {\n producerAccessed(node);\n return node.value;\n };\n getter[SIGNAL] = node;\n return getter;\n}\nfunction signalGetFn() {\n producerAccessed(this);\n return this.value;\n}\nfunction signalSetFn(node, newValue) {\n if (!producerUpdatesAllowed()) {\n throwInvalidWriteToSignalError();\n }\n if (!node.equal.call(node.wrapper, node.value, newValue)) {\n node.value = newValue;\n signalValueChanged(node);\n }\n}\nconst SIGNAL_NODE = /* @__PURE__ */ (() => {\n return {\n ...REACTIVE_NODE,\n equal: defaultEquals,\n value: void 0\n };\n})();\nfunction signalValueChanged(node) {\n node.version++;\n producerIncrementEpoch();\n producerNotifyConsumers(node);\n}\n/**\n * @license\n * Copyright 2024 Bloomberg Finance L.P.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst NODE = Symbol(\"node\");\nvar Signal;\n((Signal2) => {\n var _a, _brand, brand_fn, _b, _brand2, brand_fn2;\n class State {\n constructor(initialValue, options = {}) {\n __privateAdd(this, _brand);\n __publicField(this, _a);\n const ref = createSignal(initialValue);\n const node = ref[SIGNAL];\n this[NODE] = node;\n node.wrapper = this;\n if (options) {\n const equals = options.equals;\n if (equals) {\n node.equal = equals;\n }\n node.watched = options[Signal2.subtle.watched];\n node.unwatched = options[Signal2.subtle.unwatched];\n }\n }\n get() {\n if (!(0, Signal2.isState)(this))\n throw new TypeError(\"Wrong receiver type for Signal.State.prototype.get\");\n return signalGetFn.call(this[NODE]);\n }\n set(newValue) {\n if (!(0, Signal2.isState)(this))\n throw new TypeError(\"Wrong receiver type for Signal.State.prototype.set\");\n if (isInNotificationPhase()) {\n throw new Error(\"Writes to signals not permitted during Watcher callback\");\n }\n const ref = this[NODE];\n signalSetFn(ref, newValue);\n }\n }\n _a = NODE;\n _brand = new WeakSet();\n brand_fn = function() {\n };\n Signal2.isState = (s) => typeof s === \"object\" && __privateIn(_brand, s);\n Signal2.State = State;\n class Computed {\n // Create a Signal which evaluates to the value returned by the callback.\n // Callback is called with this signal as the parameter.\n constructor(computation, options) {\n __privateAdd(this, _brand2);\n __publicField(this, _b);\n const ref = createComputed(computation);\n const node = ref[SIGNAL];\n node.consumerAllowSignalWrites = true;\n this[NODE] = node;\n node.wrapper = this;\n if (options) {\n const equals = options.equals;\n if (equals) {\n node.equal = equals;\n }\n node.watched = options[Signal2.subtle.watched];\n node.unwatched = options[Signal2.subtle.unwatched];\n }\n }\n get() {\n if (!(0, Signal2.isComputed)(this))\n throw new TypeError(\"Wrong receiver type for Signal.Computed.prototype.get\");\n return computedGet(this[NODE]);\n }\n }\n _b = NODE;\n _brand2 = new WeakSet();\n brand_fn2 = function() {\n };\n Signal2.isComputed = (c) => typeof c === \"object\" && __privateIn(_brand2, c);\n Signal2.Computed = Computed;\n ((subtle2) => {\n var _a2, _brand3, brand_fn3, _assertSignals, assertSignals_fn;\n function untrack(cb) {\n let output;\n let prevActiveConsumer = null;\n try {\n prevActiveConsumer = setActiveConsumer(null);\n output = cb();\n } finally {\n setActiveConsumer(prevActiveConsumer);\n }\n return output;\n }\n subtle2.untrack = untrack;\n function introspectSources(sink) {\n var _a3;\n if (!(0, Signal2.isComputed)(sink) && !(0, Signal2.isWatcher)(sink)) {\n throw new TypeError(\"Called introspectSources without a Computed or Watcher argument\");\n }\n return ((_a3 = sink[NODE].producerNode) == null ? void 0 : _a3.map((n) => n.wrapper)) ?? [];\n }\n subtle2.introspectSources = introspectSources;\n function introspectSinks(signal) {\n var _a3;\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called introspectSinks without a Signal argument\");\n }\n return ((_a3 = signal[NODE].liveConsumerNode) == null ? void 0 : _a3.map((n) => n.wrapper)) ?? [];\n }\n subtle2.introspectSinks = introspectSinks;\n function hasSinks(signal) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called hasSinks without a Signal argument\");\n }\n const liveConsumerNode = signal[NODE].liveConsumerNode;\n if (!liveConsumerNode)\n return false;\n return liveConsumerNode.length > 0;\n }\n subtle2.hasSinks = hasSinks;\n function hasSources(signal) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isWatcher)(signal)) {\n throw new TypeError(\"Called hasSources without a Computed or Watcher argument\");\n }\n const producerNode = signal[NODE].producerNode;\n if (!producerNode)\n return false;\n return producerNode.length > 0;\n }\n subtle2.hasSources = hasSources;\n class Watcher {\n // When a (recursive) source of Watcher is written to, call this callback,\n // if it hasn't already been called since the last `watch` call.\n // No signals may be read or written during the notify.\n constructor(notify) {\n __privateAdd(this, _brand3);\n __privateAdd(this, _assertSignals);\n __publicField(this, _a2);\n let node = Object.create(REACTIVE_NODE);\n node.wrapper = this;\n node.consumerMarkedDirty = notify;\n node.consumerIsAlwaysLive = true;\n node.consumerAllowSignalWrites = false;\n node.producerNode = [];\n this[NODE] = node;\n }\n // Add these signals to the Watcher's set, and set the watcher to run its\n // notify callback next time any signal in the set (or one of its dependencies) changes.\n // Can be called with no arguments just to reset the \"notified\" state, so that\n // the notify callback will be invoked again.\n watch(...signals) {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called unwatch without Watcher receiver\");\n }\n __privateMethod(this, _assertSignals, assertSignals_fn).call(this, signals);\n const node = this[NODE];\n node.dirty = false;\n const prev = setActiveConsumer(node);\n for (const signal of signals) {\n producerAccessed(signal[NODE]);\n }\n setActiveConsumer(prev);\n }\n // Remove these signals from the watched set (e.g., for an effect which is disposed)\n unwatch(...signals) {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called unwatch without Watcher receiver\");\n }\n __privateMethod(this, _assertSignals, assertSignals_fn).call(this, signals);\n const node = this[NODE];\n assertConsumerNode(node);\n for (let i = node.producerNode.length - 1; i >= 0; i--) {\n if (signals.includes(node.producerNode[i].wrapper)) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n const lastIdx = node.producerNode.length - 1;\n node.producerNode[i] = node.producerNode[lastIdx];\n node.producerIndexOfThis[i] = node.producerIndexOfThis[lastIdx];\n node.producerNode.length--;\n node.producerIndexOfThis.length--;\n node.nextProducerIndex--;\n if (i < node.producerNode.length) {\n const idxConsumer = node.producerIndexOfThis[i];\n const producer = node.producerNode[i];\n assertProducerNode(producer);\n producer.liveConsumerIndexOfThis[idxConsumer] = i;\n }\n }\n }\n }\n // Returns the set of computeds in the Watcher's set which are still yet\n // to be re-evaluated\n getPending() {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called getPending without Watcher receiver\");\n }\n const node = this[NODE];\n return node.producerNode.filter((n) => n.dirty).map((n) => n.wrapper);\n }\n }\n _a2 = NODE;\n _brand3 = new WeakSet();\n brand_fn3 = function() {\n };\n _assertSignals = new WeakSet();\n assertSignals_fn = function(signals) {\n for (const signal of signals) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called watch/unwatch without a Computed or State argument\");\n }\n }\n };\n Signal2.isWatcher = (w) => __privateIn(_brand3, w);\n subtle2.Watcher = Watcher;\n function currentComputed() {\n var _a3;\n return (_a3 = getActiveConsumer()) == null ? void 0 : _a3.wrapper;\n }\n subtle2.currentComputed = currentComputed;\n subtle2.watched = Symbol(\"watched\");\n subtle2.unwatched = Symbol(\"unwatched\");\n })(Signal2.subtle || (Signal2.subtle = {}));\n})(Signal || (Signal = {}));\nexport {\n Signal\n};\n","import { Signal } from \"signal-polyfill\";\n//#region src/core/signals/effect.ts\nconst pending = /* @__PURE__ */ new Set();\nconst watcher = new Signal.subtle.Watcher(() => {\n\tqueueMicrotask(runPending);\n});\nfunction runPending() {\n\tfor (const c of watcher.getPending()) pending.add(c);\n\twatcher.watch();\n\tfor (const c of pending) {\n\t\tpending.delete(c);\n\t\tc.get();\n\t}\n}\n/**\n* Run a side effect whenever its signal dependencies change.\n*\n* Executes immediately (synchronous initial run), then re-runs on the next\n* microtask after any dependency changes. If the callback returns a function,\n* it is called before each re-run and when the effect is stopped — the same\n* cleanup contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.\n*\n* Returns a cleanup function that stops the effect.\n*/\nfunction effect(fn) {\n\tlet cleanup;\n\tconst c = new Signal.Computed(() => {\n\t\tif (typeof cleanup === \"function\") cleanup();\n\t\tcleanup = fn();\n\t});\n\twatcher.watch(c);\n\tc.get();\n\treturn () => {\n\t\twatcher.unwatch(c);\n\t\tif (typeof cleanup === \"function\") cleanup();\n\t};\n}\n//#endregion\nexport { effect };\n\n//# sourceMappingURL=effect.js.map","import { Signal } from \"signal-polyfill\";\n//#region src/core/signals/primitives.ts\n/** Read a signal value without tracking it as a dependency. */\nconst untrack = Signal.subtle.untrack;\n/** Create a writable reactive value. */\nfunction signal(initialValue, options) {\n\treturn new Signal.State(initialValue, options);\n}\n/** Create a computed reactive value. */\nfunction computed(fn, options) {\n\treturn new Signal.Computed(fn, options);\n}\n/**\n* Update a writable signal. Accepts either a partial object to merge into the\n* current state, or an updater function that receives the current state and\n* returns the next state.\n*\n* @example\n* update(state, { playbackRate: 2 });\n* update(state, (s) => ({ ...s, count: s.count + 1 }));\n*/\nfunction update(signal, updater) {\n\tconst current = untrack(() => signal.get());\n\tsignal.set(typeof updater === \"function\" ? updater(current) : {\n\t\t...current,\n\t\t...updater\n\t});\n}\n//#endregion\nexport { computed, signal, untrack, update };\n\n//# sourceMappingURL=primitives.js.map","//#region src/core/types/index.ts\nfunction isResolvedTrack(track) {\n\treturn \"segments\" in track;\n}\n/**\n* Check if a presentation has duration (at least one track resolved).\n* Narrows type to include required duration.\n*/\nfunction hasPresentationDuration(presentation) {\n\treturn presentation.duration !== void 0;\n}\n//#endregion\nexport { hasPresentationDuration, isResolvedTrack };\n\n//# sourceMappingURL=index.js.map","//#region src/core/utils/track-selection.ts\n/**\n* Map track type to selected track ID property key in state.\n*/\nconst SelectedTrackIdKeyByType = {\n\tvideo: \"selectedVideoTrackId\",\n\taudio: \"selectedAudioTrackId\",\n\ttext: \"selectedTextTrackId\"\n};\n/**\n* Map track type to buffer owner property key.\n* Used for SourceBuffer references in owners.\n*/\nconst BufferKeyByType = {\n\tvideo: \"videoBuffer\",\n\taudio: \"audioBuffer\"\n};\n/**\n* Get selected track from state by type.\n* Returns properly typed track (partially or fully resolved) or undefined.\n* Type parameter T is inferred from the type argument.\n*\n* @example\n* const videoTrack = getSelectedTrack(state, 'video');\n* if (videoTrack && isResolvedTrack(videoTrack)) {\n* // videoTrack is VideoTrack\n* }\n*/\nfunction getSelectedTrack(state, type) {\n\tconst { presentation } = state;\n\t/** @TODO Consider moving and reusing isUnresolved(presentation) (CJP) */\n\tif (!presentation || !(\"id\" in presentation)) return void 0;\n\tconst trackId = state[SelectedTrackIdKeyByType[type]];\n\treturn presentation.selectionSets.find(({ type: selectionSetType }) => selectionSetType === type)?.switchingSets[0]?.tracks.find(({ id }) => id === trackId);\n}\n//#endregion\nexport { BufferKeyByType, SelectedTrackIdKeyByType, getSelectedTrack };\n\n//# sourceMappingURL=track-selection.js.map","//#region src/dom/network/chunked-stream-iterable.ts\nconst DEFAULT_MIN_CHUNK_SIZE = 2 ** 17;\n/**\n* Adapts a `ReadableStream<Uint8Array>` (e.g. `response.body`) into an\n* `AsyncIterable<Uint8Array>` that yields chunks no smaller than\n* `minChunkSize` bytes. Smaller network chunks are accumulated and yielded\n* together once the threshold is met. Any remainder is flushed on stream end.\n*\n* Errors from the underlying stream propagate naturally — the reader lock is\n* always released via `finally`.\n*/\nvar ChunkedStreamIterable = class {\n\tminChunkSize;\n\t#readableStream;\n\tconstructor(readableStream, { minChunkSize = DEFAULT_MIN_CHUNK_SIZE } = {}) {\n\t\tthis.#readableStream = readableStream;\n\t\tthis.minChunkSize = minChunkSize;\n\t}\n\tasync *[Symbol.asyncIterator]() {\n\t\tlet pending;\n\t\tconst reader = this.#readableStream.getReader();\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) {\n\t\t\t\t\tif (pending) yield pending;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpending = pending ? concat(pending, value) : value;\n\t\t\t\tif (pending.length >= this.minChunkSize) {\n\t\t\t\t\tyield pending;\n\t\t\t\t\tpending = void 0;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock();\n\t\t}\n\t}\n};\nfunction concat(a, b) {\n\tconst result = new Uint8Array(a.length + b.length);\n\tresult.set(a);\n\tresult.set(b, a.length);\n\treturn result;\n}\n//#endregion\nexport { ChunkedStreamIterable };\n\n//# sourceMappingURL=chunked-stream-iterable.js.map","//#region src/dom/network/fetch.ts\n/**\n* Fetch resolvable from AddressableObject.\n*\n* Handles byte range requests if byteRange is present.\n* Returns native fetch Response for composability (can extract text, stream, etc.).\n*\n* @param addressable - Resource to fetch (url + optional byteRange)\n* @returns Promise resolving to Response\n*\n* @example\n* const response = await fetchResolvable({ url: 'https://example.com/segment.m4s' });\n* const text = await getResponseText(response);\n*\n* @example\n* // With byte range\n* const response = await fetchResolvable({\n* url: 'https://example.com/file.mp4',\n* byteRange: { start: 1000, end: 1999 }\n* });\n*/\nasync function fetchResolvable(addressable, options) {\n\tconst headers = new Headers(options?.headers);\n\tif (addressable.byteRange) {\n\t\tconst { start, end } = addressable.byteRange;\n\t\theaders.set(\"Range\", `bytes=${start}-${end}`);\n\t}\n\tconst request = new Request(addressable.url, {\n\t\tmethod: \"GET\",\n\t\theaders,\n\t\t...options\n\t});\n\treturn fetch(request);\n}\n/**\n* Extract text from Response.\n*\n* Accepts minimal Response-like object (just needs text() method).\n* Returns promise from response.text().\n*\n* @param response - Response-like object with text() method\n* @returns Promise resolving to text content\n*\n* @example\n* const response = await fetchResolvable(addressable);\n* const text = await getResponseText(response);\n*/\nfunction getResponseText(response) {\n\treturn response.text();\n}\n//#endregion\nexport { fetchResolvable, getResponseText };\n\n//# sourceMappingURL=fetch.js.map","//#region src/core/buffer/back-buffer.ts\n/**\n* Default back buffer configuration.\n*/\nconst DEFAULT_BACK_BUFFER_CONFIG = { keepSegments: 2 };\n/**\n* Calculate back buffer flush point.\n*\n* Determines where to flush old segments from the back buffer.\n* Keeps a fixed number of segments behind the current playback position.\n*\n* Algorithm:\n* 1. Find segments before currentTime\n* 2. Count back N segments (keepSegments)\n* 3. Return startTime of segment N+1 back (flush everything before this)\n*\n* @param segments - Available segments (should be sorted by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional back buffer configuration\n* @returns Time in seconds to flush up to (flush range: [0, flushEnd))\n*\n* @example\n* const segments = [\n* { startTime: 0, duration: 6, ... },\n* { startTime: 6, duration: 6, ... },\n* { startTime: 12, duration: 6, ... },\n* { startTime: 18, duration: 6, ... },\n* ];\n*\n* // Playing at 18s, keep 2 segments\n* const flushEnd = calculateBackBufferFlushPoint(segments, 18);\n* // Returns 6 (flush [0, 6), keep [6-18))\n*/\nfunction calculateBackBufferFlushPoint(segments, currentTime, config = DEFAULT_BACK_BUFFER_CONFIG) {\n\tif (segments.length === 0) return 0;\n\tconst segmentsBefore = segments.filter((seg) => seg.startTime < currentTime);\n\tif (segmentsBefore.length === 0) return 0;\n\tconst segmentsToFlush = segmentsBefore.length - config.keepSegments;\n\tif (segmentsToFlush <= 0) return 0;\n\tif (segmentsToFlush >= segmentsBefore.length) return currentTime;\n\treturn segmentsBefore[segmentsToFlush].startTime;\n}\n//#endregion\nexport { calculateBackBufferFlushPoint };\n\n//# sourceMappingURL=back-buffer.js.map","import { signal, untrack, update } from \"./signals/primitives.js\";\n//#region src/core/machine.ts\n/**\n* Provisions the shared mechanics for all machine-like primitives: a snapshot\n* signal, an untracked state reader, and a transition function.\n*\n* Internal — consumed by `createMachineActor` and `createMachineReactor`. Not part of the\n* public API.\n*/\nfunction createMachineCore(initialSnapshot) {\n\tconst snapshotSignal = signal(initialSnapshot);\n\tconst getState = () => untrack(() => snapshotSignal.get().value);\n\tconst transition = (to) => update(snapshotSignal, (current) => ({\n\t\t...current,\n\t\tvalue: to\n\t}));\n\treturn {\n\t\tsnapshotSignal,\n\t\tgetState,\n\t\ttransition\n\t};\n}\n//#endregion\nexport { createMachineCore };\n\n//# sourceMappingURL=machine.js.map","import { untrack, update } from \"./signals/primitives.js\";\nimport { createMachineCore } from \"./machine.js\";\n//#region src/core/create-machine-actor.ts\n/**\n* Creates a message-driven actor from a declarative definition.\n*\n* The actor owns a reactive snapshot signal (state + context), an optional\n* runner, and dispatches incoming messages to per-state handlers. `'destroyed'`\n* is always the implicit terminal state — `destroy()` transitions there\n* unconditionally and all subsequent `send()` calls are no-ops.\n*\n* When a state declares `onSettled`, the framework calls `runner.whenSettled()`\n* after the handler returns. The runner owns the generation-token logic — if\n* new tasks are scheduled before the current batch settles, the callback is\n* automatically superseded.\n*\n* @example\n* const actor = createMachineActor({\n* runner: () => new SerialRunner(),\n* initial: 'idle',\n* context: {},\n* states: {\n* idle: {\n* on: {\n* load: (msg, { transition, runner }) => {\n* segments.forEach(s => runner.schedule(new Task(...)));\n* transition('loading');\n* }\n* }\n* },\n* loading: {\n* onSettled: 'idle',\n* on: {\n* load: (msg, { runner }) => {\n* runner.abortAll();\n* segments.forEach(s => runner.schedule(new Task(...)));\n* }\n* }\n* }\n* }\n* });\n*/\nfunction createMachineActor(def) {\n\tconst runner = def.runner?.();\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: def.initial,\n\t\tcontext: def.context\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => {\n\t\tupdate(snapshotSignal, { context });\n\t};\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tconst state = getState();\n\t\t\tif (state === \"destroyed\") return;\n\t\t\tconst handler = def.states[state]?.on?.[message.type];\n\t\t\tif (!handler) return;\n\t\t\thandler(message, {\n\t\t\t\tcontext: getContext(),\n\t\t\t\tgetContext,\n\t\t\t\ttransition: (to) => transition(to),\n\t\t\t\tsetContext,\n\t\t\t\t...runner ? { runner } : {}\n\t\t\t});\n\t\t\tconst newState = getState();\n\t\t\tif (newState !== \"destroyed\") {\n\t\t\t\tconst newStateDef = def.states[newState];\n\t\t\t\tif (newStateDef?.onSettled && runner) {\n\t\t\t\t\tconst targetState = newStateDef.onSettled;\n\t\t\t\t\trunner.whenSettled(() => {\n\t\t\t\t\t\tif (getState() !== newState) return;\n\t\t\t\t\t\ttransition(targetState);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\trunner?.destroy();\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createMachineActor };\n\n//# sourceMappingURL=create-machine-actor.js.map","//#region src/core/utils/generate-id.ts\n/**\n* Generate unique ID for HAM objects.\n*\n* Uses timestamp + random number for sufficient uniqueness.\n* IDs are strings without decimals.\n*\n* @returns Unique string ID in format: timestamp-random\n*\n* @example\n* ```ts\n* const id = generateId(); // \"1738423156789-542891\"\n* ```\n*/\nfunction generateId() {\n\treturn `${Date.now()}-${Math.floor(Math.random() * 1e6)}`;\n}\n//#endregion\nexport { generateId };\n\n//# sourceMappingURL=generate-id.js.map","import { generateId } from \"./utils/generate-id.js\";\nimport { anyAbortSignal } from \"@videojs/utils/events\";\n//#region src/core/task.ts\n/**\n* Generic reusable task that wraps an async run function.\n*\n* Owns its own AbortController so it can always be aborted independently.\n* Optionally composes an external AbortSignal so that a parent's cancellation\n* propagates into the task's work without requiring the caller to track the\n* task separately.\n*\n* Ordering guarantee: `value` is written before `status` transitions to `'done'`;\n* `error` is written before `status` transitions to `'error'`. Any reader\n* observing `status === 'done'` is guaranteed `value` is already present.\n*/\nvar Task = class {\n\tid;\n\t#runFn;\n\t#abortController = new AbortController();\n\t#signal;\n\t#status = \"pending\";\n\t#value = void 0;\n\t#error = void 0;\n\tconstructor(runFn, config) {\n\t\tthis.#runFn = runFn;\n\t\tconst rawId = config?.id;\n\t\tthis.id = typeof rawId === \"function\" ? rawId() : rawId ?? generateId();\n\t\tthis.#signal = config?.signal ? anyAbortSignal([this.#abortController.signal, config.signal]) : this.#abortController.signal;\n\t}\n\tget status() {\n\t\treturn this.#status;\n\t}\n\tget value() {\n\t\treturn this.#value;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tasync run() {\n\t\tthis.#status = \"running\";\n\t\ttry {\n\t\t\tconst result = await this.#runFn(this.#signal);\n\t\t\tthis.#value = result;\n\t\t\tthis.#status = \"done\";\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tthis.#error = e;\n\t\t\tthis.#status = \"error\";\n\t\t\tthrow e;\n\t\t}\n\t}\n\tabort() {\n\t\tthis.#abortController.abort();\n\t}\n};\n/**\n* Runs tasks concurrently, deduplicated by task id.\n*\n* If a task with a given id is already in flight, subsequent schedule() calls\n* for that id are silently ignored until the first completes. Tasks are stored\n* so abortAll() can cancel any in-flight work (e.g. on engine cleanup).\n*/\nvar ConcurrentRunner = class {\n\t#pending = /* @__PURE__ */ new Map();\n\t#settled = Promise.resolve();\n\t#resolveSettled = null;\n\t#destroyed = false;\n\tschedule(task) {\n\t\tif (this.#destroyed) return Promise.resolve();\n\t\tconst existing = this.#pending.get(task.id);\n\t\tif (existing) return existing.promise;\n\t\tif (this.#pending.size === 0) this.#settled = new Promise((resolve) => {\n\t\t\tthis.#resolveSettled = resolve;\n\t\t});\n\t\tconst promise = task.run();\n\t\tpromise.catch(() => {});\n\t\tconst cleanup = () => {\n\t\t\tthis.#pending.delete(task.id);\n\t\t\tif (this.#pending.size === 0) {\n\t\t\t\tthis.#resolveSettled?.();\n\t\t\t\tthis.#resolveSettled = null;\n\t\t\t}\n\t\t};\n\t\tpromise.then(cleanup, cleanup);\n\t\tthis.#pending.set(task.id, {\n\t\t\ttask,\n\t\t\tpromise\n\t\t});\n\t\treturn promise;\n\t}\n\t/**\n\t* Registers a callback to fire when all currently in-flight tasks settle.\n\t* If the runner is already idle, the callback is never called. If abortAll()\n\t* is called before the batch settles, the callback is superseded and silently\n\t* dropped — no stale callbacks, no generation token required by the caller.\n\t*/\n\twhenSettled(callback) {\n\t\tif (this.#pending.size === 0) return;\n\t\tconst captured = this.#settled;\n\t\tcaptured.then(() => {\n\t\t\tif (this.#settled !== captured) return;\n\t\t\tcallback();\n\t\t}, () => {});\n\t}\n\tabortAll() {\n\t\tfor (const { task } of this.#pending.values()) task.abort();\n\t\tthis.#pending.clear();\n\t\tthis.#resolveSettled?.();\n\t\tthis.#resolveSettled = null;\n\t\tthis.#settled = Promise.resolve();\n\t}\n\tdestroy() {\n\t\tthis.#destroyed = true;\n\t\tthis.abortAll();\n\t}\n};\n/**\n* Runs tasks one at a time in submission order.\n*\n* Each schedule() call returns a Promise that resolves or rejects with the\n* task's result when it is eventually executed. Tasks wait in queue until the\n* prior task completes.\n*\n* Serialization is achieved by chaining each task's run() onto the tail of a\n* shared promise chain — no explicit queue or drain loop needed.\n*\n* abortAll() aborts all pending (not yet started) tasks and the currently\n* in-flight task. Pending tasks still run briefly but receive an aborted\n* signal and are expected to exit early.\n*/\nvar SerialRunner = class {\n\t#chain = Promise.resolve();\n\t#pending = /* @__PURE__ */ new Set();\n\t#current = null;\n\t#destroyed = false;\n\tschedule(task) {\n\t\tif (this.#destroyed) return Promise.resolve();\n\t\tconst t = task;\n\t\tthis.#pending.add(t);\n\t\tconst result = this.#chain.then(() => {\n\t\t\tthis.#pending.delete(t);\n\t\t\tthis.#current = t;\n\t\t\treturn task.run();\n\t\t}).finally(() => {\n\t\t\tthis.#current = null;\n\t\t});\n\t\tthis.#chain = result.then(() => {}, () => {});\n\t\treturn result;\n\t}\n\t/**\n\t* A promise that resolves when all currently-scheduled tasks have settled.\n\t* Use the reference as a generation token: capture it after scheduling a\n\t* batch, then check identity in the resolution callback to detect whether\n\t* a subsequent abortAll() + new batch has superseded this one.\n\t*/\n\tget settled() {\n\t\treturn this.#chain;\n\t}\n\t/**\n\t* Registers a callback to fire when all currently-pending tasks settle.\n\t* If the runner is already idle (no pending or running tasks), the callback\n\t* is never called. If new tasks are scheduled before the current batch\n\t* settles, the callback is superseded and silently dropped — no stale\n\t* callbacks, no generation token required by the caller.\n\t*/\n\twhenSettled(callback) {\n\t\tif (this.#pending.size === 0 && this.#current === null) return;\n\t\tconst currentChain = this.#chain;\n\t\tcurrentChain.then(() => {\n\t\t\tif (this.#chain !== currentChain) return;\n\t\t\tcallback();\n\t\t}, () => {});\n\t}\n\t/** Aborts and clears queued tasks without touching the in-flight task. */\n\tabortPending() {\n\t\tfor (const task of this.#pending) task.abort();\n\t\tthis.#pending.clear();\n\t}\n\tabortAll() {\n\t\tthis.abortPending();\n\t\tthis.#current?.abort();\n\t}\n\tdestroy() {\n\t\tthis.#destroyed = true;\n\t\tthis.abortAll();\n\t}\n};\n//#endregion\nexport { ConcurrentRunner, SerialRunner, Task };\n\n//# sourceMappingURL=task.js.map","import { calculateForwardFlushPoint, getSegmentsToLoad } from \"../../core/buffer/forward-buffer.js\";\nimport { effect } from \"../../core/signals/effect.js\";\nimport { calculateBackBufferFlushPoint } from \"../../core/buffer/back-buffer.js\";\nimport { createMachineActor } from \"../../core/create-machine-actor.js\";\nimport { SerialRunner, Task } from \"../../core/task.js\";\n//#region src/dom/features/segment-loader-actor.ts\n/**\n* Resolves when the SourceBufferActor snapshot reaches 'idle'.\n* Rejects if the signal is aborted or the actor is destroyed.\n*\n* Used to sequence SourceBufferActor operations without awaiting send()\n* directly — send() is fire-and-forget; callers observe completion via\n* state transition.\n*/\nfunction waitForIdle(snapshot, signal) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (snapshot.get().value === \"idle\") {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tif (snapshot.get().value === \"destroyed\") {\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\treturn;\n\t\t}\n\t\tif (signal.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tlet stop;\n\t\tconst cleanup = (fn) => {\n\t\t\tstop?.();\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tfn();\n\t\t};\n\t\tconst onAbort = () => cleanup(() => reject(signal.reason));\n\t\tstop = effect(() => {\n\t\t\tconst value = snapshot.get().value;\n\t\t\tif (value === \"idle\") cleanup(resolve);\n\t\t\telse if (value === \"destroyed\") cleanup(() => reject(new DOMException(\"Aborted\", \"AbortError\")));\n\t\t});\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n/**\n* Wraps a LoadTask descriptor into a Task that fetches (if needed) and\n* forwards to SourceBufferActor. Updates in-flight context around async\n* operations so the loading handler can make accurate continue/preempt\n* decisions at any point.\n*/\nfunction makeLoadTask(op, { getContext, setContext, fetchBytes, sourceBufferActor }) {\n\treturn new Task(async (taskSignal) => {\n\t\tif (taskSignal.aborted) return;\n\t\tif (op.type === \"remove\") {\n\t\t\tsourceBufferActor.send(op);\n\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\treturn;\n\t\t}\n\t\tif (op.type === \"append-init\") {\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightInitTrackId: op.meta.trackId\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst data = await fetchBytes(op, {\n\t\t\t\t\tsignal: taskSignal,\n\t\t\t\t\tminChunkSize: Infinity\n\t\t\t\t});\n\t\t\t\tif (!taskSignal.aborted) {\n\t\t\t\t\tsourceBufferActor.send({\n\t\t\t\t\t\ttype: \"append-init\",\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tmeta: op.meta\n\t\t\t\t\t});\n\t\t\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetContext({\n\t\t\t\t\t...getContext(),\n\t\t\t\t\tinFlightInitTrackId: null\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsetContext({\n\t\t\t...getContext(),\n\t\t\tinFlightSegmentId: op.meta.id\n\t\t});\n\t\ttry {\n\t\t\tconst stream = await fetchBytes(op, { signal: taskSignal });\n\t\t\tif (!taskSignal.aborted) {\n\t\t\t\tsourceBufferActor.send({\n\t\t\t\t\ttype: \"append-segment\",\n\t\t\t\t\tdata: stream,\n\t\t\t\t\tmeta: op.meta\n\t\t\t\t});\n\t\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightSegmentId: null\n\t\t\t});\n\t\t}\n\t});\n}\n/**\n* Creates a SegmentLoaderActor for one track type (video or audio).\n*\n* Receives load assignments via `send()` and owns all execution: planning,\n* removes, fetches, and appends. Coordinates with the SourceBufferActor for\n* all physical SourceBuffer operations.\n*\n* Planning (Cases 1–3) happens in the `load` handler on every incoming\n* message, producing an ordered LoadTask list. The runner drains that list\n* sequentially via SerialRunner. When a new message arrives mid-run, the\n* handler replans and either continues the in-flight operation (abortPending\n* + schedule new remainder) or preempts it (abortAll + cancel SourceBuffer\n* if needed + schedule new plan).\n*\n* @param sourceBufferActor - Shared SourceBufferActor reference (not owned)\n* @param fetchBytes - Tracked fetch closure (owns throughput sampling for segments).\n* Accepts an optional `minChunkSize` in options; init segments pass `Infinity`\n* so the entire body accumulates as one chunk before appending.\n*/\nfunction createSegmentLoaderActor(sourceBufferActor, fetchBytes) {\n\tconst getBufferedSegments = (allSegments) => {\n\t\tconst bufferedIds = new Set(sourceBufferActor.snapshot.get().context.segments.filter((s) => !s.partial).map((s) => s.id));\n\t\treturn allSegments.filter((s) => bufferedIds.has(s.id));\n\t};\n\t/**\n\t* Translate a load message into an ordered LoadTask list based on committed\n\t* actor state. In-flight awareness is handled separately in the load handler.\n\t*\n\t* @todo Rename alongside LoadTask (e.g. planOps).\n\t*\n\t* Case 1 — Removes: forward and back buffer flush points, segment-aligned.\n\t* No flush on track switch: appending new content overwrites existing buffer\n\t* ranges, and the actor's time-aligned deduplication keeps the segment model\n\t* accurate as new segments arrive.\n\t*\n\t* Case 2 — Init: schedule if not yet committed for this track.\n\t*\n\t* Case 3 — Segments: all segments in the load window not yet committed.\n\t*/\n\tconst planTasks = (message) => {\n\t\tconst { track, range } = message;\n\t\tconst actorCtx = sourceBufferActor.snapshot.get().context;\n\t\tconst bufferedSegments = getBufferedSegments(track.segments);\n\t\tconst currentTime = range?.start ?? 0;\n\t\tconst tasks = [];\n\t\tif (range) {\n\t\t\tconst forwardFlushStart = calculateForwardFlushPoint(bufferedSegments, currentTime);\n\t\t\tif (forwardFlushStart < Infinity) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: forwardFlushStart,\n\t\t\t\tend: Infinity\n\t\t\t});\n\t\t\tconst backFlushEnd = calculateBackBufferFlushPoint(bufferedSegments, currentTime);\n\t\t\tif (backFlushEnd > 0) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: 0,\n\t\t\t\tend: backFlushEnd\n\t\t\t});\n\t\t}\n\t\tif (actorCtx.initTrackId !== track.id) tasks.push({\n\t\t\ttype: \"append-init\",\n\t\t\tmeta: { trackId: track.id },\n\t\t\turl: track.initialization.url,\n\t\t\t...track.initialization.byteRange !== void 0 && { byteRange: track.initialization.byteRange }\n\t\t});\n\t\tif (range) {\n\t\t\tconst EPSILON = 1e-4;\n\t\t\tconst segmentsToLoad = getSegmentsToLoad(track.segments, bufferedSegments, currentTime).filter((seg) => {\n\t\t\t\tconst existing = actorCtx.segments.find((s) => Math.abs(s.startTime - seg.startTime) < EPSILON);\n\t\t\t\tif (existing?.partial) return true;\n\t\t\t\tif (!existing?.trackBandwidth || !track.bandwidth) return true;\n\t\t\t\treturn track.bandwidth > existing.trackBandwidth;\n\t\t\t});\n\t\t\tfor (const segment of segmentsToLoad) tasks.push({\n\t\t\t\ttype: \"append-segment\",\n\t\t\t\tmeta: {\n\t\t\t\t\tid: segment.id,\n\t\t\t\t\tstartTime: segment.startTime,\n\t\t\t\t\tduration: segment.duration,\n\t\t\t\t\ttrackId: track.id,\n\t\t\t\t\ttrackBandwidth: track.bandwidth\n\t\t\t\t},\n\t\t\t\turl: segment.url,\n\t\t\t\t...segment.byteRange !== void 0 && { byteRange: segment.byteRange }\n\t\t\t});\n\t\t}\n\t\treturn tasks;\n\t};\n\tconst scheduleAll = (tasks, { getContext, setContext, runner }) => {\n\t\ttasks.forEach((op) => {\n\t\t\trunner.schedule(makeLoadTask(op, {\n\t\t\t\tgetContext,\n\t\t\t\tsetContext,\n\t\t\t\tfetchBytes,\n\t\t\t\tsourceBufferActor\n\t\t\t})).then(void 0, (e) => {\n\t\t\t\tif (e instanceof Error && e.name === \"AbortError\") return;\n\t\t\t\tconsole.error(\"Unexpected error in segment loader:\", e);\n\t\t\t\trunner.abortPending();\n\t\t\t});\n\t\t});\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tinFlightInitTrackId: null,\n\t\t\tinFlightSegmentId: null\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: { load: (msg, ctx) => {\n\t\t\t\tconst allTasks = planTasks(msg);\n\t\t\t\tif (allTasks.length === 0) return;\n\t\t\t\tctx.transition(\"loading\");\n\t\t\t\tscheduleAll(allTasks, ctx);\n\t\t\t} } },\n\t\t\tloading: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { load: (msg, ctx) => {\n\t\t\t\t\tconst { context, runner } = ctx;\n\t\t\t\t\tconst allTasks = planTasks(msg);\n\t\t\t\t\tif (context.inFlightSegmentId !== null && allTasks.some((t) => t.type === \"append-segment\" && t.meta.id === context.inFlightSegmentId) || context.inFlightInitTrackId !== null && allTasks.some((t) => t.type === \"append-init\" && t.meta.trackId === context.inFlightInitTrackId)) {\n\t\t\t\t\t\trunner.abortPending();\n\t\t\t\t\t\tscheduleAll(allTasks.filter((t) => !(t.type === \"append-segment\" && t.meta.id === context.inFlightSegmentId) && !(t.type === \"append-init\" && t.meta.trackId === context.inFlightInitTrackId)), ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trunner.abortAll();\n\t\t\t\t\t\tif (context.inFlightSegmentId !== null || context.inFlightInitTrackId !== null && allTasks.some((t) => t.type === \"append-init\" && t.meta.trackId !== context.inFlightInitTrackId)) sourceBufferActor.send({ type: \"cancel\" });\n\t\t\t\t\t\tscheduleAll(allTasks, ctx);\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createSegmentLoaderActor };\n\n//# sourceMappingURL=segment-loader-actor.js.map","import { sampleBandwidth } from \"../../core/abr/bandwidth-estimator.js\";\nimport { DEFAULT_FORWARD_BUFFER_CONFIG } from \"../../core/buffer/forward-buffer.js\";\nimport { effect } from \"../../core/signals/effect.js\";\nimport { computed, signal } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { getSelectedTrack } from \"../../core/utils/track-selection.js\";\nimport { ChunkedStreamIterable } from \"../network/chunked-stream-iterable.js\";\nimport { fetchResolvable } from \"../network/fetch.js\";\nimport { createSegmentLoaderActor } from \"./segment-loader-actor.js\";\n//#region src/dom/features/load-segments.ts\nconst ActorKeyByType = {\n\tvideo: \"videoBufferActor\",\n\taudio: \"audioBufferActor\"\n};\nfunction createTrackedFetch(throughput, onSample) {\n\treturn async (addressable, options) => {\n\t\tconst { minChunkSize, ...fetchOptions } = options ?? {};\n\t\tconst response = await fetchResolvable(addressable, fetchOptions);\n\t\tif (!response.body) throw new Error(\"Response has no body\");\n\t\tconst body = response.body;\n\t\treturn { [Symbol.asyncIterator]: async function* () {\n\t\t\tlet chunkStart = performance.now();\n\t\t\tfor await (const chunk of new ChunkedStreamIterable(body, ...minChunkSize !== void 0 ? [{ minChunkSize }] : [])) {\n\t\t\t\tconst elapsed = performance.now() - chunkStart;\n\t\t\t\tconst next = sampleBandwidth(throughput.get(), elapsed, chunk.byteLength);\n\t\t\t\tthroughput.set(next);\n\t\t\t\tonSample?.(next);\n\t\t\t\tyield chunk;\n\t\t\t\tchunkStart = performance.now();\n\t\t\t}\n\t\t} };\n\t};\n}\n/**\n* Non-tracking fetch: eagerly starts the request and returns the response body\n* as a lazy chunk iterable. Used for audio tracks which don't sample bandwidth.\n* Pass `minChunkSize: Infinity` to accumulate the full body as a single chunk\n* (equivalent to arrayBuffer() but through the same streaming path).\n*/\nasync function fetchStream(addressable, options) {\n\tconst { minChunkSize, ...fetchOptions } = options ?? {};\n\tconst response = await fetchResolvable(addressable, fetchOptions);\n\tif (!response.body) throw new Error(\"Response has no body\");\n\treturn new ChunkedStreamIterable(response.body, ...minChunkSize !== void 0 ? [{ minChunkSize }] : []);\n}\nfunction selectLoadingInputs([segmentsCanLoad, state], type) {\n\tconst { playbackInitiated, preload, currentTime } = state;\n\treturn {\n\t\tplaybackInitiated,\n\t\tpreload,\n\t\tcurrentTime,\n\t\ttrack: getSelectedTrack(state, type),\n\t\tsegmentsCanLoad\n\t};\n}\n/**\n* Equality function encoding the condition hierarchy for relevant changes.\n*\n* Pre-play (!playbackInitiated):\n* Only preload changes matter. currentTime and resolvedTrackId are ignored\n* (track changes not supported pre-play; currentTime value is used at\n* trigger time but changes don't re-trigger).\n*\n* playbackInitiated transition:\n* Always fires (handled in the subscriber; preload='auto' suppression\n* applied there since equality functions have no memory of prior values).\n*\n* Post-play (playbackInitiated):\n* resolvedTrackId changes (track switch or previously-unresolved track\n* resolving) and currentTime changes both trigger. preload is irrelevant.\n*/\nconst segmentStartFor = (currentTime, track) => {\n\tif (currentTime == null) return void 0;\n\treturn track?.segments.find(({ startTime, duration }, i, segments) => currentTime >= startTime && (currentTime < startTime + duration || i === segments.length - 1))?.startTime;\n};\n/**\n* Returns true when the inputs are equal (no meaningful change — don't fire).\n* Returns false when the inputs differ in a way that requires a new message.\n*\n* This IS the shouldLoadSegments logic, expressed as an equality function.\n*/\nfunction loadingInputsEq(prevState, curState) {\n\tif (!curState.segmentsCanLoad) return true;\n\tif (!curState.playbackInitiated) {\n\t\tif (curState.preload === \"none\") return true;\n\t\treturn curState.preload === prevState.preload;\n\t}\n\tif (!prevState.playbackInitiated && curState.playbackInitiated) {\n\t\tif (prevState.preload !== \"auto\") return false;\n\t}\n\tif (!curState.track || !isResolvedTrack(curState.track)) return true;\n\tif (prevState.track?.id !== curState.track.id && isResolvedTrack(curState.track)) return false;\n\treturn segmentStartFor(prevState.currentTime, curState.track) === segmentStartFor(curState.currentTime, curState.track);\n}\n/**\n* Load segments orchestration — Reactor layer.\n*\n* Sends typed load messages to a SegmentLoaderActor when relevant conditions\n* change. Uses targeted subscriptions rather than broad combineLatest so only\n* meaningful state changes trigger evaluation.\n*\n* Condition hierarchy (see SegmentLoadingKey for detail):\n*\n* !playbackInitiated\n* preload==='none' (or unset) → dormant; no trigger\n* preload==='metadata' → trigger on transition to 'metadata'\n* preload==='auto' → trigger on transition to 'auto'\n*\n* !playbackInitiated → playbackInitiated\n* preload !== 'auto' → trigger (message shape changes)\n* preload === 'auto' → suppressed (was already full-range mode;\n* let segmentStart take over post-play)\n* KNOWN LIMITATION: seek-before-play with\n* preload='auto' is not supported — if the\n* user seeks before pressing play, the\n* first re-send is delayed until the next\n* segment boundary crossing post-play.\n*\n* playbackInitiated\n* resolvedTrackId changes → trigger\n* segmentStart(currentTime) changes → trigger (segment boundary only)\n*\n* @example\n* const cleanup = loadSegments({ state, owners }, { type: 'video' });\n*/\nfunction loadSegments({ state, owners }, config) {\n\tconst { type } = config;\n\tconst actorKey = ActorKeyByType[type];\n\tconst initialBandwidth = state.get().bandwidthState;\n\tconst throughput = signal(initialBandwidth ?? {\n\t\tfastEstimate: 0,\n\t\tfastTotalWeight: 0,\n\t\tslowEstimate: 0,\n\t\tslowTotalWeight: 0,\n\t\tbytesSampled: 0\n\t});\n\tconst fetchBytes = type === \"video\" ? createTrackedFetch(throughput, initialBandwidth !== void 0 ? (next) => {\n\t\tstate.set(Object.assign({}, state.get(), { bandwidthState: next }));\n\t} : void 0) : fetchStream;\n\tconst segmentLoader = signal(void 0);\n\tconst actorSource = computed(() => owners.get()[actorKey]);\n\tlet currentLoader;\n\tconst cleanupActorLifecycle = effect(() => {\n\t\tconst actor = actorSource.get();\n\t\tif (currentLoader) {\n\t\t\tcurrentLoader.destroy();\n\t\t\tsegmentLoader.set(void 0);\n\t\t\tcurrentLoader = void 0;\n\t\t}\n\t\tif (actor) {\n\t\t\tconst loader = createSegmentLoaderActor(actor, fetchBytes);\n\t\t\tcurrentLoader = loader;\n\t\t\tsegmentLoader.set(loader);\n\t\t}\n\t});\n\tconst segmentsCanLoad = computed(() => {\n\t\tconst track = getSelectedTrack(state.get(), type);\n\t\treturn !!track && isResolvedTrack(track) && !!segmentLoader.get();\n\t});\n\tconst loadingInputs = computed(() => selectLoadingInputs([segmentsCanLoad.get(), state.get()], type));\n\tlet prevInputs;\n\tconst cleanupLoadEffect = effect(() => {\n\t\tconst inputs = loadingInputs.get();\n\t\tif (prevInputs !== void 0 && loadingInputsEq(prevInputs, inputs)) return;\n\t\tconst { preload, playbackInitiated, currentTime, track, segmentsCanLoad: canLoad } = inputs;\n\t\tif (!canLoad) return;\n\t\tprevInputs = inputs;\n\t\tif (!(preload === \"auto\" || !!playbackInitiated))\n /** @ts-expect-error */\n\t\tsegmentLoader.get()?.send({\n\t\t\ttype: \"load\",\n\t\t\ttrack\n\t\t});\n\t\telse segmentLoader.get()?.send({\n\t\t\ttype: \"load\",\n\t\t\ttrack,\n\t\t\trange: {\n\t\t\t\tstart: currentTime,\n\t\t\t\tend: currentTime + DEFAULT_FORWARD_BUFFER_CONFIG.bufferDuration\n\t\t\t}\n\t\t});\n\t});\n\treturn () => {\n\t\tcleanupActorLifecycle();\n\t\tcleanupLoadEffect();\n\t\tcurrentLoader?.destroy();\n\t};\n}\n//#endregion\nexport { loadSegments };\n\n//# sourceMappingURL=load-segments.js.map","//#region src/dom/text/parse-vtt-segment.ts\n/**\n* Parse a VTT segment using browser's native parser.\n*\n* Creates a dummy video element with a track element to leverage\n* the browser's optimized VTT parsing. Returns parsed VTTCue objects.\n*/\nlet dummyVideo = null;\nfunction ensureDummyVideo() {\n\tif (!dummyVideo) {\n\t\tdummyVideo = document.createElement(\"video\");\n\t\tdummyVideo.muted = true;\n\t\tdummyVideo.preload = \"none\";\n\t\tdummyVideo.style.display = \"none\";\n\t\tdummyVideo.crossOrigin = \"anonymous\";\n\t}\n\treturn dummyVideo;\n}\nfunction parseVttSegment(url) {\n\tconst video = ensureDummyVideo();\n\tconst track = document.createElement(\"track\");\n\ttrack.kind = \"subtitles\";\n\ttrack.default = true;\n\treturn new Promise((resolve, reject) => {\n\t\tconst onLoad = () => {\n\t\t\tconst cues = [];\n\t\t\tconst textTrack = track.track;\n\t\t\tif (textTrack.cues) for (let i = 0; i < textTrack.cues.length; i++) {\n\t\t\t\tconst cue = textTrack.cues[i];\n\t\t\t\tif (cue) cues.push(cue);\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tresolve(cues);\n\t\t};\n\t\tconst onError = () => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`Failed to load VTT segment: ${url}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\ttrack.removeEventListener(\"load\", onLoad);\n\t\t\ttrack.removeEventListener(\"error\", onError);\n\t\t\tvideo.removeChild(track);\n\t\t};\n\t\ttrack.addEventListener(\"load\", onLoad);\n\t\ttrack.addEventListener(\"error\", onError);\n\t\tvideo.appendChild(track);\n\t\ttrack.src = url;\n\t});\n}\nfunction destroyVttParser() {\n\tdummyVideo = null;\n}\n//#endregion\nexport { destroyVttParser, parseVttSegment };\n\n//# sourceMappingURL=parse-vtt-segment.js.map","import { effect } from \"./signals/effect.js\";\nimport { untrack } from \"./signals/primitives.js\";\nimport { createMachineCore } from \"./machine.js\";\n//#region src/core/create-machine-reactor.ts\nconst toArray = (x) => x === void 0 ? [] : Array.isArray(x) ? x : [x];\n/**\n* Creates a reactive Reactor from a declarative definition.\n*\n* A Reactor is driven by subscriptions to external signals rather than\n* imperative messages. Each state holds an array of effect functions —\n* every element becomes one independent `effect()` call gated on that state,\n* with its own dependency tracking and cleanup lifecycle.\n*\n* `'destroying'` and `'destroyed'` are always implicit terminal states.\n* `destroy()` transitions through both in sequence: `'destroying'` first (for\n* potential async teardown in a future extension), then immediately `'destroyed'`\n* for the synchronous base case. Active effect cleanups fire via disposal.\n*\n* @example\n* const reactor = createMachineReactor({\n* initial: 'waiting',\n* monitor: () => srcSignal.get() ? 'active' : 'waiting',\n* states: {\n* active: {\n* // entry: runs once on state entry; fn body is automatically untracked.\n* entry: () => listen(el, 'play', handler),\n* // effects: re-runs whenever tracked signals change.\n* effects: () => { currentTimeSignal.get(); return cleanup; },\n* },\n* waiting: {},\n* }\n* });\n*/\nfunction createMachineReactor(def) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({ value: def.initial });\n\tconst effectDisposals = [];\n\tconst wrapResult = (result) => {\n\t\tif (!result) return void 0;\n\t\tif (typeof result === \"function\") return result;\n\t\treturn () => result.abort();\n\t};\n\tconst untracked = (baseCall) => () => untrack(baseCall);\n\tconst isTerminal = (snapshot) => snapshot.value === \"destroying\" || snapshot.value === \"destroyed\";\n\tconst descriptors = [...toArray(def.monitor).map((fn) => ({\n\t\tfn: () => {\n\t\t\tconst target = fn();\n\t\t\tif (target !== getState()) transition(target);\n\t\t},\n\t\tshouldSkip: isTerminal\n\t})), ...Object.entries(def.states).flatMap(([state, stateDef]) => {\n\t\tconst isNotState = (snapshot) => snapshot.value !== state;\n\t\treturn [...toArray(stateDef.entry).map((fn) => ({\n\t\t\tfn,\n\t\t\tshouldSkip: isNotState,\n\t\t\ttoFnCall: untracked\n\t\t})), ...toArray(stateDef.effects).map((fn) => ({\n\t\t\tfn,\n\t\t\tshouldSkip: isNotState\n\t\t}))];\n\t})];\n\tconst toEffect = ({ fn, shouldSkip, toFnCall = (baseCall) => baseCall }) => effect(() => {\n\t\tif (shouldSkip(snapshotSignal.get())) return;\n\t\tconst baseCall = () => fn();\n\t\treturn wrapResult(toFnCall(baseCall)());\n\t});\n\teffectDisposals.push(...descriptors.map(toEffect));\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tdestroy() {\n\t\t\tconst state = getState();\n\t\t\tif (state === \"destroying\" || state === \"destroyed\") return;\n\t\t\ttransition(\"destroying\");\n\t\t\ttransition(\"destroyed\");\n\t\t\tfor (const dispose of effectDisposals) dispose();\n\t\t}\n\t};\n}\n//#endregion\nexport { createMachineReactor };\n\n//# sourceMappingURL=create-machine-reactor.js.map","import { getSegmentsToLoad } from \"../../core/buffer/forward-buffer.js\";\nimport { untrack } from \"../../core/signals/primitives.js\";\nimport { SerialRunner, Task } from \"../../core/task.js\";\nimport { parseVttSegment } from \"../text/parse-vtt-segment.js\";\n//#region src/dom/features/text-track-segment-loader-actor.ts\n/**\n* Loads VTT segments for a text track and delegates cue management to a\n* TextTracksActor. Mirrors the SegmentLoaderActor/SourceBufferActor pattern\n* for the text track equivalent.\n*\n* Planning is done in the load handler: segments already recorded in\n* TextTracksActor's context are skipped. Each load preempts in-flight work\n* via abortAll() before scheduling fresh tasks.\n*/\nfunction createTextTrackSegmentLoaderActor(textTracksActor) {\n\tconst runner = new SerialRunner();\n\tlet destroyed = false;\n\treturn {\n\t\tsend({ track, currentTime }) {\n\t\t\tif (destroyed) return;\n\t\t\tconst trackId = track.id;\n\t\t\tconst bufferedSegments = untrack(() => textTracksActor.snapshot.get().context.segments[trackId] ?? []);\n\t\t\tconst segmentsToLoad = getSegmentsToLoad(track.segments, bufferedSegments, currentTime);\n\t\t\trunner.abortAll();\n\t\t\tfor (const segment of segmentsToLoad) runner.schedule(new Task(async (signal) => {\n\t\t\t\tif (signal.aborted) return;\n\t\t\t\ttry {\n\t\t\t\t\tconst cues = await parseVttSegment(segment.url);\n\t\t\t\t\tif (signal.aborted) return;\n\t\t\t\t\ttextTracksActor.send({\n\t\t\t\t\t\ttype: \"add-cues\",\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\ttrackId,\n\t\t\t\t\t\t\tid: segment.id,\n\t\t\t\t\t\t\tstartTime: segment.startTime,\n\t\t\t\t\t\t\tduration: segment.duration\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcues\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"Failed to load VTT segment:\", error);\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\t\t\tdestroyed = true;\n\t\t\trunner.destroy();\n\t\t}\n\t};\n}\n//#endregion\nexport { createTextTrackSegmentLoaderActor };\n\n//# sourceMappingURL=text-track-segment-loader-actor.js.map","import { untrack, update } from \"./signals/primitives.js\";\nimport { createMachineCore } from \"./machine.js\";\n//#region src/core/create-transition-actor.ts\n/**\n* Creates a reducer-shaped actor from an initial context and a reducer function.\n*\n* The reducer receives the current context and a message and returns the next\n* context. Returning the same reference (by identity) skips the signal update —\n* so early-returning `context` unchanged is both the no-op and the optimization.\n*\n* Side effects (e.g. DOM mutations) may be performed inside the reducer.\n* They run synchronously before the signal is updated.\n*\n* @example\n* const actor = createTransitionActor(\n* { count: 0 },\n* (context, message: { type: 'increment' }) => ({ count: context.count + 1 })\n* );\n*/\nfunction createTransitionActor(initialContext, reducer) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: \"active\",\n\t\tcontext: initialContext\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => update(snapshotSignal, { context });\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\tconst context = getContext();\n\t\t\tconst newContext = reducer(context, message);\n\t\t\tif (newContext !== context) setContext(newContext);\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createTransitionActor };\n\n//# sourceMappingURL=create-transition-actor.js.map","import { createTransitionActor } from \"../../core/create-transition-actor.js\";\n//#region src/dom/features/text-tracks-actor.ts\nfunction isDuplicateCue(cue, existing) {\n\treturn existing.some((r) => r.startTime === cue.startTime && r.endTime === cue.endTime && r.text === cue.text);\n}\n/** TextTrack actor: wraps all text tracks on a media element, owns cue operations. */\nfunction createTextTracksActor(mediaElement) {\n\treturn createTransitionActor({\n\t\tloaded: {},\n\t\tsegments: {}\n\t}, (context, message) => {\n\t\tconst { meta, cues } = message;\n\t\tconst { trackId, id: segmentId, startTime, duration } = meta;\n\t\tconst textTrack = Array.from(mediaElement.textTracks).find((t) => t.id === trackId);\n\t\tif (!textTrack) return context;\n\t\tconst existingCues = context.loaded[trackId] ?? [];\n\t\tconst existingSegments = context.segments[trackId] ?? [];\n\t\tconst prunedCues = cues.filter((cue) => !isDuplicateCue(cue, existingCues));\n\t\tconst segmentAlreadyLoaded = existingSegments.some((s) => s.id === segmentId);\n\t\tif (prunedCues.length === 0 && segmentAlreadyLoaded) return context;\n\t\tfor (const cue of prunedCues) textTrack.addCue(cue);\n\t\treturn {\n\t\t\t...context,\n\t\t\tloaded: {\n\t\t\t\t...context.loaded,\n\t\t\t\t[trackId]: [...existingCues, ...prunedCues]\n\t\t\t},\n\t\t\tsegments: segmentAlreadyLoaded ? context.segments : {\n\t\t\t\t...context.segments,\n\t\t\t\t[trackId]: [...existingSegments, {\n\t\t\t\t\tid: segmentId,\n\t\t\t\t\tstartTime,\n\t\t\t\t\tduration\n\t\t\t\t}]\n\t\t\t}\n\t\t};\n\t});\n}\n//#endregion\nexport { createTextTracksActor };\n\n//# sourceMappingURL=text-tracks-actor.js.map","import { computed, untrack, update } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { createMachineReactor } from \"../../core/create-machine-reactor.js\";\nimport { createTextTrackSegmentLoaderActor } from \"./text-track-segment-loader-actor.js\";\nimport { createTextTracksActor } from \"./text-tracks-actor.js\";\n//#region src/dom/features/load-text-track-cues.ts\nfunction getTextTracks(presentation) {\n\treturn presentation?.selectionSets?.find((s) => s.type === \"text\")?.switchingSets[0]?.tracks;\n}\nfunction findSelectedTrack(state) {\n\tconst track = getTextTracks(state.presentation)?.find((t) => t.id === state.selectedTextTrackId);\n\treturn track && isResolvedTrack(track) ? track : void 0;\n}\n/**\n* Derives the correct state from current state and owners.\n*\n* States are mutually exclusive and exhaustive:\n* - `'preconditions-unmet'`: no mediaElement, or no resolved presentation with text tracks\n* - `'setting-up'`: preconditions met; actors not yet in owners\n* - `'pending'`: actors alive; no selection, or selected track not yet resolved/in DOM\n* - `'monitoring-for-loads'`: selected track resolved, in DOM — ready to dispatch load messages\n*/\nfunction deriveState(state, owners) {\n\tif (!owners.mediaElement || !getTextTracks(state.presentation)?.length) return \"preconditions-unmet\";\n\tif (!owners.textTracksActor || !owners.segmentLoaderActor) return \"setting-up\";\n\tconst track = findSelectedTrack(state);\n\tif (!track || track.segments.length === 0) return \"pending\";\n\tif (!Array.from(owners.mediaElement.textTracks).some((t) => t.id === state.selectedTextTrackId)) return \"pending\";\n\treturn \"monitoring-for-loads\";\n}\nfunction teardownActors(owners) {\n\tconst { textTracksActor, segmentLoaderActor } = untrack(() => owners.get());\n\tif (!textTracksActor && !segmentLoaderActor) return;\n\ttextTracksActor?.destroy();\n\tsegmentLoaderActor?.destroy();\n\tupdate(owners, {\n\t\ttextTracksActor: void 0,\n\t\tsegmentLoaderActor: void 0\n\t});\n}\n/**\n* Text track cue loading orchestration.\n*\n* A single `always` monitor keeps the reactor in sync with conditions.\n* Actor lifecycle is managed across two states:\n*\n* - **`'setting-up'`** — creates `TextTracksActor` and `TextTrackSegmentLoaderActor`\n* and writes them to owners. Entry resets any stale actors first.\n* - **`'preconditions-unmet'`** — destroys any actors in owners and resets them to\n* `undefined`. Handles all paths back from active states.\n* - **`'monitoring-for-loads'`** — reactive dispatch: re-runs whenever `state`\n* changes (selection, currentTime, presentation) and sends a `load` message to\n* the segment loader.\n*\n* **Destroy note:** actors written to owners are NOT auto-destroyed when\n* `reactor.destroy()` is called. Callers must read them from owners and destroy\n* them explicitly alongside the reactor.\n*\n* @example\n* const reactor = loadTextTrackCues({ state, owners });\n* // later:\n* const { textTracksActor, segmentLoaderActor } = owners.get();\n* textTracksActor?.destroy();\n* segmentLoaderActor?.destroy();\n* reactor.destroy();\n*/\nfunction loadTextTrackCues({ state, owners }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.get(), owners.get()));\n\tconst currentTimeSignal = computed(() => state.get().currentTime ?? 0);\n\tconst selectedTrackSignal = computed(() => findSelectedTrack(state.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": { entry: () => {\n\t\t\t\tteardownActors(owners);\n\t\t\t} },\n\t\t\t\"setting-up\": { entry: () => {\n\t\t\t\tteardownActors(owners);\n\t\t\t\tconst mediaElement = owners.get().mediaElement;\n\t\t\t\tconst textTracksActor = createTextTracksActor(mediaElement);\n\t\t\t\tupdate(owners, {\n\t\t\t\t\ttextTracksActor,\n\t\t\t\t\tsegmentLoaderActor: createTextTrackSegmentLoaderActor(textTracksActor)\n\t\t\t\t});\n\t\t\t} },\n\t\t\tpending: {},\n\t\t\t\"monitoring-for-loads\": { effects: () => {\n\t\t\t\tconst currentTime = currentTimeSignal.get();\n\t\t\t\tconst track = selectedTrackSignal.get();\n\t\t\t\tconst { segmentLoaderActor } = untrack(() => owners.get());\n\t\t\t\tsegmentLoaderActor.send({\n\t\t\t\t\ttype: \"load\",\n\t\t\t\t\ttrack,\n\t\t\t\t\tcurrentTime\n\t\t\t\t});\n\t\t\t} }\n\t\t}\n\t});\n}\n//#endregion\nexport { loadTextTrackCues };\n\n//# sourceMappingURL=load-text-track-cues.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { update } from \"../../core/signals/primitives.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/dom/features/track-current-time.ts\n/**\n* Track current playback position from the media element.\n*\n* Mirrors `mediaElement.currentTime` into reactive state on:\n* - `timeupdate` — fires during playback (~4 Hz)\n* - `seeking` — fires when a seek begins; per spec, `currentTime` is\n* already at the new position when this event dispatches, so buffer\n* management can react immediately rather than waiting for `timeupdate`,\n* which does not fire while paused.\n*\n* Also syncs immediately when a media element becomes available.\n*\n* @example\n* const cleanup = trackCurrentTime({ state, owners });\n*/\nfunction trackCurrentTime({ state, owners }) {\n\tlet lastMediaElement;\n\tlet removeListeners = null;\n\tconst cleanupEffect = effect(() => {\n\t\tconst { mediaElement } = owners.get();\n\t\tif (mediaElement === lastMediaElement) return;\n\t\tremoveListeners?.();\n\t\tremoveListeners = null;\n\t\tlastMediaElement = mediaElement;\n\t\tif (!mediaElement) return;\n\t\tconst sync = () => {\n\t\t\tupdate(state, { currentTime: mediaElement.currentTime });\n\t\t};\n\t\tsync();\n\t\tconst removeTimeupdate = listen(mediaElement, \"timeupdate\", sync);\n\t\tconst removeSeeking = listen(mediaElement, \"seeking\", sync);\n\t\tremoveListeners = () => {\n\t\t\tremoveTimeupdate();\n\t\t\tremoveSeeking();\n\t\t};\n\t});\n\treturn () => {\n\t\tremoveListeners?.();\n\t\tcleanupEffect();\n\t};\n}\n//#endregion\nexport { trackCurrentTime };\n\n//# sourceMappingURL=track-current-time.js.map","import { computed, update } from \"../../core/signals/primitives.js\";\nimport { createMachineReactor } from \"../../core/create-machine-reactor.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/dom/features/track-playback-initiated.ts\n/**\n* FSM states for playback initiation tracking.\n*\n* ```\n* 'preconditions-unmet' ──── element + URL ────→ 'monitoring'\n* ↑ ↑ │\n* │ preconditions lost │ play / !paused\n* │ │ ↓\n* └────────────── 'playback-initiated' ←──────┘\n* (exit cleanup resets state.playbackInitiated → false)\n*\n* any state ──── destroy() ────→ 'destroying' ────→ 'destroyed'\n* ```\n*/\nfunction deriveState(state, owners) {\n\tif (!owners.mediaElement || !state.presentation?.url) return \"preconditions-unmet\";\n\tif (state.playbackInitiated) return \"playback-initiated\";\n\treturn \"monitoring\";\n}\n/**\n* Track whether playback has been initiated for the current presentation URL.\n*\n* A three-state Reactor FSM driven by `state.playbackInitiated` and the\n* `deriveState` pattern:\n* - `'preconditions-unmet'` — no element or URL yet; no effects.\n* - `'monitoring'` — checks `!el.paused` on entry; listens for `play`.\n* - `'playback-initiated'` — tracks element and URL; exit cleanup resets\n* `state.playbackInitiated` to `false` on any change or lost preconditions.\n*\n* @example\n* const reactor = trackPlaybackInitiated({ state, owners });\n* // later:\n* reactor.destroy();\n*/\nfunction trackPlaybackInitiated({ state, owners }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.get(), owners.get()));\n\tconst mediaElementSignal = computed(() => owners.get().mediaElement);\n\tconst urlSignal = computed(() => state.get().presentation?.url);\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\tmonitoring: { entry: () => {\n\t\t\t\tconst el = mediaElementSignal.get();\n\t\t\t\tupdate(state, { playbackInitiated: !el.paused });\n\t\t\t\treturn listen(el, \"play\", () => {\n\t\t\t\t\tupdate(state, { playbackInitiated: !el.paused });\n\t\t\t\t});\n\t\t\t} },\n\t\t\t\"playback-initiated\": { effects: () => {\n\t\t\t\tmediaElementSignal.get();\n\t\t\t\turlSignal.get();\n\t\t\t\treturn () => update(state, { playbackInitiated: false });\n\t\t\t} }\n\t\t}\n\t});\n}\n//#endregion\nexport { trackPlaybackInitiated };\n\n//# sourceMappingURL=track-playback-initiated.js.map","//#region src/dom/media/append-segment.ts\n/**\n* Append media data to a SourceBuffer.\n*\n* Accepts either a full ArrayBuffer (single append) or an AsyncIterable of\n* Uint8Array chunks (one append per chunk, in order). Waits for `updateend`\n* between each call so appends are serialized correctly.\n*\n* Errors from the SourceBuffer (`error` event) or from the iterable are\n* propagated as rejections.\n*/\nasync function appendSegment(sourceBuffer, data, signal) {\n\tif (data instanceof ArrayBuffer) await appendChunk(sourceBuffer, data);\n\telse try {\n\t\tfor await (const chunk of data) {\n\t\t\tif (signal?.aborted) throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n\t\t\tawait appendChunk(sourceBuffer, chunk);\n\t\t}\n\t} catch (e) {\n\t\tif (e instanceof DOMException && e.name === \"AbortError\" && !sourceBuffer.updating) try {\n\t\t\tsourceBuffer.abort();\n\t\t} catch {}\n\t\tthrow e;\n\t}\n}\nasync function appendChunk(sourceBuffer, data) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer append error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.appendBuffer(data);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n//#endregion\nexport { appendSegment };\n\n//# sourceMappingURL=append-segment.js.map","//#region src/dom/media/buffer-flusher.ts\n/**\n* Buffer flusher helper (P12)\n*\n* Removes a time range from a SourceBuffer to manage memory.\n*/\n/**\n* Remove a time range from a SourceBuffer.\n*\n* Waits for the SourceBuffer to be ready (not updating), then removes\n* the specified range. Returns a promise that resolves when removal completes.\n*\n* @param sourceBuffer - The SourceBuffer to remove data from\n* @param start - Start of the time range to remove (seconds)\n* @param end - End of the time range to remove (seconds)\n* @returns Promise that resolves when removal completes\n*\n* @example\n* await flushBuffer(videoSourceBuffer, 0, 30);\n*/\nasync function flushBuffer(sourceBuffer, start, end) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer remove error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.remove(start, end);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n//#endregion\nexport { flushBuffer };\n\n//# sourceMappingURL=buffer-flusher.js.map","import { effect } from \"../signals/effect.js\";\nimport { isResolvedTrack } from \"../types/index.js\";\nimport { getSelectedTrack } from \"../utils/track-selection.js\";\n//#region src/core/features/calculate-presentation-duration.ts\n/**\n* Check if we can calculate presentation duration (have required data).\n*/\nfunction canCalculateDuration(state) {\n\tif (!state.presentation) return false;\n\treturn !!(state.selectedVideoTrackId || state.selectedAudioTrackId);\n}\n/**\n* Check if we should calculate presentation duration (conditions met).\n*/\nfunction shouldCalculateDuration(state) {\n\tif (!canCalculateDuration(state)) return false;\n\tconst { presentation } = state;\n\tif (presentation.duration !== void 0) return false;\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\treturn !!(videoTrack && isResolvedTrack(videoTrack) || audioTrack && isResolvedTrack(audioTrack));\n}\n/**\n* Get duration from the first resolved track (prefer video, fallback to audio).\n*/\nfunction getDurationFromResolvedTracks(state) {\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tif (videoTrack && isResolvedTrack(videoTrack)) return videoTrack.duration;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\tif (audioTrack && isResolvedTrack(audioTrack)) return audioTrack.duration;\n}\n/**\n* Calculate and set presentation duration from resolved tracks.\n*/\nfunction calculatePresentationDuration({ state }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!shouldCalculateDuration(currentState)) return;\n\t\tconst duration = getDurationFromResolvedTracks(currentState);\n\t\tif (duration === void 0 || !Number.isFinite(duration)) return;\n\t\tstate.set({\n\t\t\t...currentState,\n\t\t\tpresentation: {\n\t\t\t\t...currentState.presentation,\n\t\t\t\tduration\n\t\t\t}\n\t\t});\n\t});\n}\n//#endregion\nexport { calculatePresentationDuration };\n\n//# sourceMappingURL=calculate-presentation-duration.js.map","//#region src/core/abr/quality-selection.ts\n/**\n* Default quality selection configuration.\n* Values match Shaka Player upgrade threshold (0.85 = 15% headroom).\n*/\nconst DEFAULT_QUALITY_CONFIG = { safetyMargin: .85 };\n/**\n* Select the best video track based on current bandwidth estimate.\n*\n* Selects the highest quality track where bandwidth is sufficient with safety margin:\n* - currentBandwidth >= track.bandwidth / safetyMargin\n* - Default safetyMargin 0.85 means track uses ≤85% of bandwidth (15% headroom)\n* - At same bandwidth, prefers higher resolution\n*\n* @param tracks - Available video tracks (can be unsorted)\n* @param currentBandwidth - Current bandwidth estimate in bits per second\n* @param config - Optional quality selection configuration\n* @returns Selected track, or undefined if no tracks available\n*\n* @example\n* const tracks = [\n* { id: '360p', bandwidth: 500_000, ... },\n* { id: '720p', bandwidth: 2_000_000, ... },\n* { id: '1080p', bandwidth: 4_000_000, ... },\n* ];\n*\n* // With 2.5 Mbps, selects 720p (1080p needs 4M/0.85 = 4.7 Mbps)\n* const selected = selectQuality(tracks, 2_500_000);\n*/\nfunction selectQuality(tracks, currentBandwidth, config = DEFAULT_QUALITY_CONFIG) {\n\tif (tracks.length === 0) return;\n\tconst sortedTracks = tracks.slice().sort((a, b) => a.bandwidth - b.bandwidth);\n\tlet chosen;\n\tfor (const track of sortedTracks) if (currentBandwidth >= track.bandwidth / config.safetyMargin) {\n\t\tif (!chosen || track.bandwidth > chosen.bandwidth || track.bandwidth === chosen.bandwidth && hasHigherResolution(track, chosen)) chosen = track;\n\t}\n\treturn chosen ?? sortedTracks[0];\n}\n/**\n* Check if track A has higher resolution than track B.\n* Compares by total pixel count (width × height).\n*\n* @param trackA - First track to compare\n* @param trackB - Second track to compare\n* @returns True if trackA has more pixels than trackB\n*/\nfunction hasHigherResolution(trackA, trackB) {\n\treturn (trackA.width ?? 0) * (trackA.height ?? 0) > (trackB.width ?? 0) * (trackB.height ?? 0);\n}\n//#endregion\nexport { selectQuality };\n\n//# sourceMappingURL=quality-selection.js.map","import { getBandwidthEstimate } from \"../abr/bandwidth-estimator.js\";\nimport { effect } from \"../signals/effect.js\";\nimport { update } from \"../signals/primitives.js\";\nimport { selectQuality } from \"../abr/quality-selection.js\";\n//#region src/core/features/quality-switching.ts\n/**\n* Default quality switching configuration.\n*/\nconst DEFAULT_SWITCHING_CONFIG = {\n\tsafetyMargin: .85,\n\tminUpgradeInterval: 8e3,\n\tdefaultBandwidth: 5e6\n};\n/**\n* Get all video tracks from a presentation's first switching set.\n* Returns [] when the presentation is still unresolved (no selectionSets yet).\n*/\nfunction getVideoTracks(presentation) {\n\treturn (presentation.selectionSets?.find((s) => s.type === \"video\"))?.switchingSets[0]?.tracks ?? [];\n}\n/**\n* Quality switching orchestration (F9).\n*\n* Reacts to bandwidth estimate changes and updates `selectedVideoTrackId`\n* when a different quality is optimal:\n*\n* - **Downgrades** happen immediately to avoid buffering stalls.\n* - **Upgrades** are gated by `minUpgradeInterval` to prevent oscillation.\n* - The first switch (from any track, or no track) is always immediate.\n*\n* Smooth switching is handled downstream: when `selectedVideoTrackId` changes,\n* `resolveTrack` fetches the new playlist and `loadSegments` reloads the init\n* segment, then appends media segments from the current position in the new\n* quality. The browser's SourceBuffer replaces the overlapping buffered range.\n*\n* @example\n* const cleanup = switchQuality({ state });\n* // Later, when done:\n* cleanup();\n*/\nfunction switchQuality({ state }, config = {}) {\n\tconst safetyMargin = config.safetyMargin ?? DEFAULT_SWITCHING_CONFIG.safetyMargin;\n\tconst minUpgradeInterval = config.minUpgradeInterval ?? DEFAULT_SWITCHING_CONFIG.minUpgradeInterval;\n\tconst defaultBandwidth = config.defaultBandwidth ?? DEFAULT_SWITCHING_CONFIG.defaultBandwidth;\n\tlet lastUpgradeTime = Date.now();\n\tlet firstMeaningfulFire = true;\n\treturn effect(() => {\n\t\tconst { presentation, bandwidthState, selectedVideoTrackId, abrDisabled } = state.get();\n\t\tif (abrDisabled === true) return;\n\t\tif (!presentation || !bandwidthState) return;\n\t\tconst videoTracks = getVideoTracks(presentation);\n\t\tif (videoTracks.length === 0) return;\n\t\tconst isFirst = firstMeaningfulFire;\n\t\tfirstMeaningfulFire = false;\n\t\tconst optimal = selectQuality(videoTracks, getBandwidthEstimate(bandwidthState, defaultBandwidth), { safetyMargin });\n\t\tif (!optimal || optimal.id === selectedVideoTrackId) return;\n\t\tconst currentTrack = videoTracks.find((t) => t.id === selectedVideoTrackId);\n\t\tif (!currentTrack || optimal.bandwidth > currentTrack.bandwidth) {\n\t\t\tconst now = Date.now();\n\t\t\tif (!isFirst && now - lastUpgradeTime < minUpgradeInterval) return;\n\t\t\tlastUpgradeTime = now;\n\t\t}\n\t\tupdate(state, { selectedVideoTrackId: optimal.id });\n\t});\n}\n//#endregion\nexport { switchQuality };\n\n//# sourceMappingURL=quality-switching.js.map","//#region src/core/hls/parse-attributes.ts\n/**\n* Parse HLS attribute list from a tag line.\n* Handles both quoted and unquoted values.\n*/\nfunction parseAttributeList(line) {\n\tconst attributes = /* @__PURE__ */ new Map();\n\tfor (const match of line.matchAll(/([A-Z0-9-]+)=(?:\"([^\"]*)\"|([^,]*))/g)) {\n\t\tconst key = match[1];\n\t\tconst value = match[2] ?? match[3] ?? \"\";\n\t\tif (key) attributes.set(key, value);\n\t}\n\treturn attributes;\n}\n/**\n* Parse RESOLUTION attribute value (WIDTHxHEIGHT).\n*/\nfunction parseResolution(value) {\n\tconst match = /^(\\d+)x(\\d+)$/.exec(value);\n\tif (!match) return null;\n\treturn {\n\t\twidth: Number.parseInt(match[1], 10),\n\t\theight: Number.parseInt(match[2], 10)\n\t};\n}\n/**\n* Parse FRAME-RATE attribute to rational frame rate.\n*/\nfunction parseFrameRate(value) {\n\tconst fps = Number.parseFloat(value);\n\tif (Number.isNaN(fps) || fps <= 0) return void 0;\n\tif (Math.abs(fps - 23.976) < .01) return {\n\t\tframeRateNumerator: 24e3,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 29.97) < .01) return {\n\t\tframeRateNumerator: 3e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 59.94) < .01) return {\n\t\tframeRateNumerator: 6e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (fps % 1 === 0) return { frameRateNumerator: Math.round(fps) };\n\treturn { frameRateNumerator: Math.round(fps) };\n}\n/**\n* Parse CODECS attribute into separate video and audio codecs.\n*/\nfunction parseCodecs(codecs) {\n\tconst parts = codecs.split(\",\").map((s) => s.trim());\n\tconst result = {};\n\tfor (const codec of parts) if (codec.startsWith(\"avc1.\") || codec.startsWith(\"hvc1.\") || codec.startsWith(\"hev1.\")) result.video = codec;\n\telse if (codec.startsWith(\"mp4a.\")) result.audio = codec;\n\treturn result;\n}\n/**\n* Parse #EXTINF duration value.\n*/\nfunction parseExtInfDuration(value) {\n\tconst durationPart = value.split(\",\")[0] ?? value;\n\tconst duration = Number.parseFloat(durationPart);\n\treturn Number.isNaN(duration) ? 0 : duration;\n}\n/**\n* Parse BYTERANGE attribute value.\n* Format: \"length[@offset]\"\n* If offset is omitted, it continues from the previous byte range end.\n*/\nfunction parseByteRange(value, previousEnd) {\n\tconst match = /^(\\d+)(?:@(\\d+))?$/.exec(value);\n\tif (!match) return null;\n\tconst length = Number.parseInt(match[1], 10);\n\tif (Number.isNaN(length)) return null;\n\tlet start;\n\tif (match[2] !== void 0) {\n\t\tstart = Number.parseInt(match[2], 10);\n\t\tif (Number.isNaN(start)) return null;\n\t} else if (previousEnd !== void 0) start = previousEnd;\n\telse return null;\n\treturn {\n\t\tstart,\n\t\tend: start + length - 1\n\t};\n}\n/**\n* Create AttributeList from raw attribute string.\n*/\nfunction createAttributeList(line) {\n\tconst map = parseAttributeList(line);\n\treturn {\n\t\tget(key) {\n\t\t\treturn map.get(key);\n\t\t},\n\t\tgetInt(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseInt(value, 10);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetFloat(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseFloat(value);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetBool(key) {\n\t\t\treturn map.get(key) === \"YES\";\n\t\t},\n\t\tgetResolution(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseResolution(value) ?? void 0;\n\t\t},\n\t\tgetFrameRate(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseFrameRate(value);\n\t\t}\n\t};\n}\n/**\n* Match a tag and extract its attributes.\n* Returns null if the line doesn't match the tag.\n*/\nfunction matchTag(line, tag) {\n\tconst prefix = `#${tag}:`;\n\tif (!line.startsWith(prefix)) return null;\n\treturn createAttributeList(line.slice(prefix.length));\n}\n//#endregion\nexport { matchTag, parseByteRange, parseCodecs, parseExtInfDuration };\n\n//# sourceMappingURL=parse-attributes.js.map","//#region src/core/hls/resolve-url.ts\n/**\n* Resolve a potentially relative URL against a base URL using native URL API.\n*/\nfunction resolveUrl(url, baseUrl) {\n\treturn new URL(url, baseUrl).href;\n}\n//#endregion\nexport { resolveUrl };\n\n//# sourceMappingURL=resolve-url.js.map","import { generateId } from \"../utils/generate-id.js\";\nimport { matchTag, parseCodecs } from \"./parse-attributes.js\";\nimport { resolveUrl } from \"./resolve-url.js\";\n//#region src/core/hls/parse-multivariant.ts\n/**\n* Parse HLS multivariant playlist into a Presentation.\n*\n* Returns Presentation with partially resolved tracks (no segment information).\n* Tracks contain metadata from multivariant playlist (bandwidth, resolution, codecs)\n* but segment information is added when media playlists are fetched.\n*\n* @param text - Raw playlist text content\n* @param unresolved - Unresolved presentation (contains URL for base URL resolution)\n* @returns Presentation with partially resolved tracks (duration is undefined)\n*/\nfunction parseMultivariantPlaylist(text, unresolved) {\n\tconst baseUrl = unresolved.url;\n\tconst lines = text.split(/\\r?\\n/);\n\tconst streams = [];\n\tconst audioRenditions = [];\n\tconst subtitleRenditions = [];\n\tlet pendingStreamInfo = null;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mediaAttrs = matchTag(trimmed, \"EXT-X-MEDIA\");\n\t\tif (mediaAttrs) {\n\t\t\tconst type = mediaAttrs.get(\"TYPE\");\n\t\t\tconst groupId = mediaAttrs.get(\"GROUP-ID\");\n\t\t\tconst name = mediaAttrs.get(\"NAME\");\n\t\t\tif (type === \"AUDIO\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\taudioRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: uri ? resolveUrl(uri, baseUrl) : void 0,\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type === \"SUBTITLES\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\tif (uri) subtitleRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: resolveUrl(uri, baseUrl),\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\"),\n\t\t\t\t\tforced: mediaAttrs.getBool(\"FORCED\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst streamInfAttrs = matchTag(trimmed, \"EXT-X-STREAM-INF\");\n\t\tif (streamInfAttrs) {\n\t\t\tpendingStreamInfo = {\n\t\t\t\tbandwidth: streamInfAttrs.getInt(\"BANDWIDTH\", 0),\n\t\t\t\tresolution: streamInfAttrs.getResolution(\"RESOLUTION\"),\n\t\t\t\tcodecs: streamInfAttrs.get(\"CODECS\"),\n\t\t\t\tframeRate: streamInfAttrs.getFrameRate(\"FRAME-RATE\"),\n\t\t\t\taudioGroupId: streamInfAttrs.get(\"AUDIO\")\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\t\tif (!trimmed.startsWith(\"#\") && pendingStreamInfo) {\n\t\t\tstreams.push({\n\t\t\t\t...pendingStreamInfo,\n\t\t\t\turi: resolveUrl(trimmed, baseUrl)\n\t\t\t});\n\t\t\tpendingStreamInfo = null;\n\t\t}\n\t}\n\tconst videoStreams = [];\n\tconst audioOnlyStreams = [];\n\tfor (const stream of streams) {\n\t\tif (!stream.codecs) {\n\t\t\tvideoStreams.push(stream);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsedCodecs = parseCodecs(stream.codecs);\n\t\tif (stream.codecs.split(\",\").length === 1) if (parsedCodecs.audio && !parsedCodecs.video) audioOnlyStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t}\n\tconst videoTracks = videoStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\tconst track = {\n\t\t\ttype: \"video\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"video/mp4\",\n\t\t\tcodecs: []\n\t\t};\n\t\tif (stream.resolution?.width !== void 0) track.width = stream.resolution.width;\n\t\tif (stream.resolution?.height !== void 0) track.height = stream.resolution.height;\n\t\tif (codecs?.video) track.codecs = [codecs.video];\n\t\tif (stream.frameRate) track.frameRate = stream.frameRate;\n\t\tif (stream.audioGroupId) track.audioGroupId = stream.audioGroupId;\n\t\treturn track;\n\t});\n\tconst audioOnlyTracks = audioOnlyStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\treturn {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tcodecs: codecs?.audio ? [codecs.audio] : [],\n\t\t\tgroupId: stream.audioGroupId || \"default\",\n\t\t\tname: \"Default\",\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2\n\t\t};\n\t});\n\tconst audioTracks = [...audioRenditions.map((rendition) => {\n\t\tlet audioCodecs;\n\t\tfor (const stream of streams) if (stream.audioGroupId === rendition.groupId && stream.codecs) {\n\t\t\tconst codecs = parseCodecs(stream.codecs);\n\t\t\tif (codecs.audio) {\n\t\t\t\taudioCodecs = [codecs.audio];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst track = {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri ?? \"\",\n\t\t\tgroupId: rendition.groupId,\n\t\t\tname: rendition.name,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tbandwidth: 0,\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2,\n\t\t\tcodecs: []\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (audioCodecs) track.codecs = audioCodecs;\n\t\tif (rendition.default) track.default = rendition.default;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\treturn track;\n\t}), ...audioOnlyTracks];\n\tconst textTracks = subtitleRenditions.map((rendition) => {\n\t\tconst track = {\n\t\t\ttype: \"text\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri,\n\t\t\tgroupId: rendition.groupId,\n\t\t\tlabel: rendition.name,\n\t\t\tkind: \"subtitles\",\n\t\t\tmimeType: \"text/vtt\",\n\t\t\tbandwidth: 0\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (rendition.default && rendition.autoselect) track.default = true;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\tif (rendition.forced) track.forced = rendition.forced;\n\t\treturn track;\n\t});\n\tconst selectionSets = [];\n\tif (videoTracks.length > 0) {\n\t\tconst videoSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\ttracks: videoTracks\n\t\t};\n\t\tconst videoSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\tswitchingSets: [videoSwitchingSet]\n\t\t};\n\t\tselectionSets.push(videoSelectionSet);\n\t}\n\tif (audioTracks.length > 0) {\n\t\tconst audioSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\ttracks: audioTracks\n\t\t};\n\t\tconst audioSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\tswitchingSets: [audioSwitchingSet]\n\t\t};\n\t\tselectionSets.push(audioSelectionSet);\n\t}\n\tif (textTracks.length > 0) {\n\t\tconst textSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\ttracks: textTracks\n\t\t};\n\t\tconst textSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\tswitchingSets: [textSwitchingSet]\n\t\t};\n\t\tselectionSets.push(textSelectionSet);\n\t}\n\treturn {\n\t\tid: generateId(),\n\t\turl: unresolved.url,\n\t\tstartTime: 0,\n\t\tselectionSets\n\t};\n}\n//#endregion\nexport { parseMultivariantPlaylist };\n\n//# sourceMappingURL=parse-multivariant.js.map","import { computed, update } from \"../signals/primitives.js\";\nimport { fetchResolvable, getResponseText } from \"../../dom/network/fetch.js\";\nimport { createMachineReactor } from \"../create-machine-reactor.js\";\nimport { parseMultivariantPlaylist } from \"../hls/parse-multivariant.js\";\n//#region src/core/features/resolve-presentation.ts\n/**\n* Determines if resolution conditions are met based on preload policy and playback state.\n*\n* Resolution conditions:\n* - State-driven: preload is 'auto' or 'metadata'\n* - Playback-driven: playbackInitiated is true\n*\n* @param state - Current presentation state\n* @returns true if resolution conditions are met\n*/\nfunction shouldResolve(state) {\n\tconst { preload, playbackInitiated } = state;\n\treturn [\"auto\", \"metadata\"].includes(preload) || !!playbackInitiated;\n}\n/**\n* Derives the correct state from current state conditions.\n*\n* States are mutually exclusive and exhaustive:\n* - `'preconditions-unmet'`: no presentation, or presentation has no URL\n* - `'idle'`: URL present, unresolved (no id), shouldResolve not met\n* - `'resolving'`: URL present, unresolved (no id), shouldResolve met\n* - `'resolved'`: URL present, resolved (has id)\n*/\nfunction deriveState(state) {\n\tconst { presentation } = state;\n\tif (!presentation || !(\"url\" in presentation)) return \"preconditions-unmet\";\n\tif (\"id\" in presentation) return \"resolved\";\n\treturn shouldResolve(state) ? \"resolving\" : \"idle\";\n}\n/**\n* Resolves unresolved presentations using reactive composition.\n*\n* FSM driven by `deriveState` — a single `always` monitor keeps the state in\n* sync with conditions at all times. `'resolving'` additionally runs the fetch\n* task and returns an AbortController so the framework aborts it on state exit.\n*\n* @example\n* const reactor = resolvePresentation({ state });\n* // later:\n* reactor.destroy();\n*/\nfunction resolvePresentation({ state }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\tidle: {},\n\t\t\tresolving: { entry: () => {\n\t\t\t\tconst presentation = state.get().presentation;\n\t\t\t\tconst ac = new AbortController();\n\t\t\t\tfetchResolvable(presentation, { signal: ac.signal }).then((response) => getResponseText(response)).then((text) => {\n\t\t\t\t\tupdate(state, { presentation: parseMultivariantPlaylist(text, presentation) });\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") return;\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t\treturn ac;\n\t\t\t} },\n\t\t\tresolved: {}\n\t\t}\n\t});\n}\n//#endregion\nexport { resolvePresentation };\n\n//# sourceMappingURL=resolve-presentation.js.map","import { matchTag, parseByteRange, parseExtInfDuration } from \"./parse-attributes.js\";\nimport { resolveUrl } from \"./resolve-url.js\";\n//#region src/core/hls/parse-media-playlist.ts\n/**\n* Parse HLS media playlist and resolve track with segments.\n*\n* Takes an unresolved track (from multivariant playlist) and media playlist text,\n* returns a HAM-compliant resolved track with segments.\n*\n* @param text - Media playlist text content\n* @param unresolved - Unresolved track from parseMultivariantPlaylist\n* @returns Resolved track with segments (type inferred from input)\n*/\nfunction parseMediaPlaylist(text, unresolved) {\n\tconst lines = text.split(/\\r?\\n/);\n\tconst baseUrl = unresolved.url;\n\tconst segments = [];\n\tlet initSegmentUrl;\n\tlet initSegmentByteRange;\n\tlet currentDuration = 0;\n\tlet currentByteRange;\n\tlet currentTime = 0;\n\tlet segmentIndex = 0;\n\tlet previousByteRangeEnd;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-TARGETDURATION:\") || trimmed.startsWith(\"#EXT-X-PLAYLIST-TYPE:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mapAttrs = matchTag(trimmed, \"EXT-X-MAP\");\n\t\tif (mapAttrs) {\n\t\t\tconst uri = mapAttrs.get(\"URI\");\n\t\t\tif (uri) {\n\t\t\t\tinitSegmentUrl = resolveUrl(uri, baseUrl);\n\t\t\t\tconst byteRangeStr = mapAttrs.get(\"BYTERANGE\");\n\t\t\t\tif (byteRangeStr) initSegmentByteRange = parseByteRange(byteRangeStr, 0) ?? void 0;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXTINF:\")) {\n\t\t\tcurrentDuration = parseExtInfDuration(trimmed.slice(8));\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXT-X-BYTERANGE:\")) {\n\t\t\tcurrentByteRange = parseByteRange(trimmed.slice(17), previousByteRangeEnd) ?? void 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed === \"#EXT-X-ENDLIST\") continue;\n\t\tif (!trimmed.startsWith(\"#\") && currentDuration > 0) {\n\t\t\tconst segment = {\n\t\t\t\tid: `segment-${segmentIndex}`,\n\t\t\t\turl: resolveUrl(trimmed, baseUrl),\n\t\t\t\tduration: currentDuration,\n\t\t\t\tstartTime: currentTime\n\t\t\t};\n\t\t\tif (currentByteRange) {\n\t\t\t\tsegment.byteRange = currentByteRange;\n\t\t\t\tpreviousByteRangeEnd = currentByteRange.end + 1;\n\t\t\t} else previousByteRangeEnd = void 0;\n\t\t\tsegments.push(segment);\n\t\t\tcurrentTime += currentDuration;\n\t\t\tsegmentIndex++;\n\t\t\tcurrentDuration = 0;\n\t\t\tcurrentByteRange = void 0;\n\t\t}\n\t}\n\tconst totalDuration = currentTime;\n\tconst initialization = unresolved.type === \"text\" && !initSegmentUrl ? void 0 : initSegmentUrl ? {\n\t\turl: initSegmentUrl,\n\t\t...initSegmentByteRange ? { byteRange: initSegmentByteRange } : {}\n\t} : { url: \"\" };\n\treturn {\n\t\t...unresolved,\n\t\tstartTime: 0,\n\t\tduration: totalDuration,\n\t\tsegments,\n\t\tinitialization\n\t};\n}\n//#endregion\nexport { parseMediaPlaylist };\n\n//# sourceMappingURL=parse-media-playlist.js.map","import { effect } from \"../signals/effect.js\";\nimport { isResolvedTrack } from \"../types/index.js\";\nimport { getSelectedTrack } from \"../utils/track-selection.js\";\nimport { fetchResolvable, getResponseText } from \"../../dom/network/fetch.js\";\nimport { ConcurrentRunner, Task } from \"../task.js\";\nimport { parseMediaPlaylist } from \"../hls/parse-media-playlist.js\";\n//#region src/core/features/resolve-track.ts\nfunction canResolve(state, config) {\n\tconst track = getSelectedTrack(state, config.type);\n\tif (!track) return false;\n\treturn !isResolvedTrack(track);\n}\n/**\n* Updates a track within a presentation (immutably).\n* Generic - works for video, audio, or text tracks.\n*/\nfunction updateTrackInPresentation(presentation, resolvedTrack) {\n\tconst trackId = resolvedTrack.id;\n\treturn {\n\t\t...presentation,\n\t\tselectionSets: presentation.selectionSets.map((selectionSet) => ({\n\t\t\t...selectionSet,\n\t\t\tswitchingSets: selectionSet.switchingSets.map((switchingSet) => ({\n\t\t\t\t...switchingSet,\n\t\t\t\ttracks: switchingSet.tracks.map((track) => track.id === trackId ? resolvedTrack : track)\n\t\t\t}))\n\t\t}))\n\t};\n}\n/**\n* Resolves unresolved tracks using reactive composition.\n*\n* Reacts to state changes and schedules fetch tasks via ConcurrentRunner when\n* a selected track is unresolved. The ConcurrentRunner handles deduplication,\n* parallel execution, and cleanup.\n*\n* Generic version that works for video, audio, or text tracks based on config.\n* Type parameter T is inferred from config.type (use 'as const' for inference).\n*/\nfunction resolveTrack({ state }, config) {\n\tconst runner = new ConcurrentRunner();\n\tconst cleanup = effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canResolve(currentState, config)) return;\n\t\tconst track = getSelectedTrack(currentState, config.type);\n\t\tif (!track) return;\n\t\tconst resolvedTrack = track;\n\t\trunner.schedule(new Task(async (signal) => {\n\t\t\tconst mediaTrack = parseMediaPlaylist(await getResponseText(await fetchResolvable(resolvedTrack, { signal })), resolvedTrack);\n\t\t\tconst latest = state.get();\n\t\t\tconst updatedPresentation = updateTrackInPresentation(latest.presentation, mediaTrack);\n\t\t\tstate.set({\n\t\t\t\t...latest,\n\t\t\t\tpresentation: updatedPresentation\n\t\t\t});\n\t\t}, { id: track.id }));\n\t});\n\treturn () => {\n\t\trunner.abortAll();\n\t\tcleanup();\n\t};\n}\n//#endregion\nexport { resolveTrack };\n\n//# sourceMappingURL=resolve-track.js.map","import { effect } from \"../signals/effect.js\";\nimport { update } from \"../signals/primitives.js\";\nimport { SelectedTrackIdKeyByType } from \"../utils/track-selection.js\";\n//#region src/core/features/select-tracks.ts\n/**\n* Pick text track to activate.\n*\n* Selection priority (if enabled):\n* 1. User preference (preferredSubtitleLanguage)\n* 2. DEFAULT track (if enableDefaultTrack is true and track has DEFAULT=YES + AUTOSELECT=YES)\n* 3. No auto-selection (user opt-in)\n*\n* By default, FORCED tracks are excluded per Apple's HLS spec.\n*\n* @param presentation - Presentation with text tracks\n* @param config - Selection configuration\n* @returns Track ID or undefined (no auto-selection)\n*/\nfunction pickTextTrack(presentation, config) {\n\tconst textSet = presentation.selectionSets.find((set) => set.type === \"text\");\n\tif (!textSet?.switchingSets?.[0]?.tracks.length) return void 0;\n\tconst tracks = textSet.switchingSets[0].tracks;\n\tconst availableTracks = config.includeForcedTracks ? tracks : tracks.filter((track) => !track.forced);\n\tif (availableTracks.length === 0) return void 0;\n\tconst { preferredSubtitleLanguage, enableDefaultTrack = false } = config;\n\tif (preferredSubtitleLanguage) {\n\t\tconst languageMatch = availableTracks.find((track) => track.language === preferredSubtitleLanguage);\n\t\tif (languageMatch) return languageMatch.id;\n\t}\n\tif (enableDefaultTrack) {\n\t\tconst defaultTrack = availableTracks.find((track) => track.default === true);\n\t\tif (defaultTrack) return defaultTrack.id;\n\t}\n}\n/**\n* Check if we can select a track of the given type.\n*\n* Returns true when:\n* - Presentation exists\n* - Has tracks of the specified type\n*\n* Generic over track type - works for video, audio, or text.\n*/\nfunction canSelectTrack(state, config) {\n\treturn !!state?.presentation?.selectionSets?.find(({ type }) => type === config.type)?.switchingSets?.[0]?.tracks.length;\n}\n/**\n* Check if we should select a track of the given type.\n*\n* Returns true when:\n* - Track of this type is not already selected\n*\n* Generic over track type - works for video, audio, or text.\n*\n* @TODO figure out reactive model for ABR cases - right now we're only selecting\n* if we have nothing selected (CJP)\n*/\nfunction shouldSelectTrack(state, config) {\n\treturn !state[SelectedTrackIdKeyByType[config.type]];\n}\n/**\n* Select video track orchestration.\n*\n* Selects video track when:\n* - Presentation exists\n* - No video track is selected yet\n*\n* Uses bandwidth-based quality selection algorithm.\n*\n* @example\n* const cleanup = selectVideoTrack(\n* { state, owners, events },\n* { initialBandwidth: 2_000_000 }\n* );\n*/\nfunction selectVideoTrack({ state }, config = { type: \"video\" }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config)) return;\n\t\tconst selectedTrackId = currentState.presentation?.selectionSets.find(({ type }) => type === config.type)?.switchingSets[0]?.tracks[0]?.id;\n\t\tif (selectedTrackId) update(state, { [SelectedTrackIdKeyByType[config.type]]: selectedTrackId });\n\t});\n}\n/**\n* Select audio track orchestration.\n*\n* Selects audio track when:\n* - Presentation exists\n* - No audio track is selected yet\n*\n* Uses language and preference-based selection.\n*\n* @example\n* const cleanup = selectAudioTrack(\n* { state, owners, events },\n* { preferredAudioLanguage: 'en' }\n* );\n*/\nfunction selectAudioTrack({ state }, config = { type: \"audio\" }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config)) return;\n\t\tconst selectedTrackId = currentState.presentation?.selectionSets.find(({ type }) => type === \"audio\")?.switchingSets[0]?.tracks[0]?.id;\n\t\tif (selectedTrackId) update(state, { selectedAudioTrackId: selectedTrackId });\n\t});\n}\n/**\n* Select text track orchestration.\n*\n* Selects text track when:\n* - Presentation exists\n* - No text track is selected yet\n*\n* Note: Currently does not auto-select (user opt-in).\n*\n* @example\n* const cleanup = selectTextTrack({ state, owners, events }, {});\n*/\nfunction selectTextTrack({ state }, config = { type: \"text\" }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config)) return;\n\t\tconst selectedTextTrackId = pickTextTrack(currentState.presentation, config);\n\t\tif (selectedTextTrackId) update(state, { selectedTextTrackId });\n\t});\n}\n//#endregion\nexport { selectAudioTrack, selectTextTrack, selectVideoTrack };\n\n//# sourceMappingURL=select-tracks.js.map","import { effect } from \"../signals/effect.js\";\nimport { computed, update } from \"../signals/primitives.js\";\n//#region src/core/features/sync-preload-attribute.ts\n/**\n* Syncs preload attribute from mediaElement to state.\n*\n* Watches the owners signal for mediaElement changes and copies the\n* preload attribute to state when no explicit value has been set.\n* An explicit value (set via SpfMedia.preload) always wins.\n*\n* @example\n* const cleanup = syncPreloadAttribute({ state, owners });\n*/\nfunction syncPreloadAttribute({ state, owners }) {\n\tconst mediaElement = computed(() => owners.get().mediaElement);\n\treturn effect(() => {\n\t\tif (state.get().preload !== void 0) return;\n\t\tconst preload = mediaElement.get()?.preload || void 0;\n\t\tif (preload === void 0) return;\n\t\tupdate(state, { preload });\n\t});\n}\n//#endregion\nexport { syncPreloadAttribute };\n\n//# sourceMappingURL=sync-preload-attribute.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { computed } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { getSelectedTrack } from \"../../core/utils/track-selection.js\";\n//#region src/dom/features/end-of-stream.ts\n/**\n* Check if the last segment of a track has been appended to a SourceBuffer.\n*\n* Checks by segment ID rather than a pipeline flag, so it is robust across\n* quality switches (different tracks have different segment IDs) and\n* back-buffer flushes (flushed segment IDs are removed from the model).\n*/\nfunction isLastSegmentAppended(segments, actor) {\n\tif (segments.length === 0) return true;\n\tconst lastSeg = segments[segments.length - 1];\n\tif (!lastSeg) return false;\n\treturn actor?.snapshot.get().context.segments.some((s) => s.id === lastSeg.id && !s.partial) ?? false;\n}\n/**\n* Check if the last segment has been appended for each selected track.\n*\n* Handles video-only, audio-only, and video+audio scenarios.\n* A track with no segments (e.g. unresolved) is considered not ready.\n*/\nfunction hasLastSegmentLoaded(state, owners) {\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\tif (videoTrack && !isResolvedTrack(videoTrack)) return false;\n\tif (audioTrack && !isResolvedTrack(audioTrack)) return false;\n\tif (videoTrack && isResolvedTrack(videoTrack)) {\n\t\tif (!isLastSegmentAppended(videoTrack.segments, owners.videoBufferActor)) return false;\n\t}\n\tif (audioTrack && isResolvedTrack(audioTrack)) {\n\t\tif (!isLastSegmentAppended(audioTrack.segments, owners.audioBufferActor)) return false;\n\t}\n\treturn true;\n}\n/**\n* Check if we can call endOfStream.\n*/\nfunction canEndStream(state, owners) {\n\treturn !!(owners.mediaSource && state.presentation);\n}\n/**\n* Check if we should call endOfStream.\n*/\nfunction shouldEndStream(state, owners) {\n\tif (!canEndStream(state, owners)) return false;\n\tconst { mediaElement } = owners;\n\tif ((owners.mediaSourceReadyState?.get() ?? owners.mediaSource?.readyState) !== \"open\") return false;\n\tif (mediaElement && mediaElement.readyState < HTMLMediaElement.HAVE_METADATA) return false;\n\tconst hasVideoTrack = !!state.selectedVideoTrackId;\n\tconst hasAudioTrack = !!state.selectedAudioTrackId;\n\tif (hasVideoTrack && !owners.videoBuffer) return false;\n\tif (hasAudioTrack && !owners.audioBuffer) return false;\n\tif (owners.videoBufferActor?.snapshot.get().value === \"updating\") return false;\n\tif (owners.audioBufferActor?.snapshot.get().value === \"updating\") return false;\n\tif (!hasLastSegmentLoaded(state, owners)) return false;\n\tif (mediaElement) {\n\t\tconst videoTrack = hasVideoTrack ? getSelectedTrack(state, \"video\") : void 0;\n\t\tconst audioTrack = hasAudioTrack ? getSelectedTrack(state, \"audio\") : void 0;\n\t\tconst refTrack = videoTrack && isResolvedTrack(videoTrack) ? videoTrack : audioTrack && isResolvedTrack(audioTrack) ? audioTrack : void 0;\n\t\tif (refTrack && refTrack.segments.length > 0) {\n\t\t\tconst lastSeg = refTrack.segments[refTrack.segments.length - 1];\n\t\t\tif (mediaElement.currentTime < lastSeg.startTime) return false;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n* Wait for all currently-updating SourceBufferActors to finish.\n* Uses actor state rather than raw SourceBuffer.updating so the wait is\n* aligned with the same abstraction that owns all buffer operations.\n*/\nfunction waitForSourceBuffersReady(owners) {\n\tconst updatingActors = [owners.videoBufferActor, owners.audioBufferActor].filter((actor) => actor !== void 0 && actor.snapshot.get().value === \"updating\");\n\tif (updatingActors.length === 0) return Promise.resolve();\n\treturn Promise.all(updatingActors.map((actor) => new Promise((resolve) => {\n\t\tlet cleanup;\n\t\tlet resolved = false;\n\t\tcleanup = effect(() => {\n\t\t\tif (actor.snapshot.get().value !== \"updating\") {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t\tqueueMicrotask(() => cleanup?.());\n\t\t\t}\n\t\t});\n\t}))).then(() => void 0);\n}\n/**\n* Get the highest buffered end time across all active SourceBuffers.\n* Used to set the final duration from actual container timestamps rather\n* than playlist metadata, which handles both shorter and longer cases.\n*/\nfunction getMaxBufferedEnd(owners) {\n\tlet max = 0;\n\tfor (const buf of [owners.videoBuffer, owners.audioBuffer]) if (buf && buf.buffered.length > 0) {\n\t\tconst end = buf.buffered.end(buf.buffered.length - 1);\n\t\tif (end > max) max = end;\n\t}\n\treturn max;\n}\n/**\n* End of stream task (module-level, pure).\n* Sets the final duration from actual buffered end time, then calls endOfStream().\n*/\nconst endOfStreamTask = async ({ currentOwners }, _context) => {\n\tconst { mediaSource } = currentOwners;\n\tif (mediaSource.readyState === \"ended\") return;\n\tawait waitForSourceBuffersReady(currentOwners);\n\tif (mediaSource.readyState !== \"open\") return;\n\tconst bufferedEnd = getMaxBufferedEnd(currentOwners);\n\tif (bufferedEnd > 0) mediaSource.duration = bufferedEnd;\n\tmediaSource.endOfStream();\n\tawait new Promise((resolve) => requestAnimationFrame(resolve));\n};\n/**\n* Call endOfStream when the last segment has been appended.\n* This signals to the browser that the stream is complete.\n*\n* Per the MSE spec, appendBuffer() remains valid after endOfStream() —\n* seeks that require re-appending earlier segments will still work.\n* What becomes blocked is calling endOfStream() again, addSourceBuffer(),\n* and MediaSource.duration updates.\n*/\nfunction endOfStream({ state, owners }) {\n\tconst shouldEnd = computed(() => shouldEndStream(state.get(), owners.get()));\n\tlet hasEnded = false;\n\treturn effect(() => {\n\t\tif (!shouldEnd.get()) return;\n\t\tconst currentOwners = owners.get();\n\t\tif (hasEnded) {\n\t\t\tif ((currentOwners.mediaSourceReadyState?.get() ?? currentOwners.mediaSource?.readyState) !== \"open\") return;\n\t\t\thasEnded = false;\n\t\t}\n\t\thasEnded = true;\n\t\tendOfStreamTask({ currentOwners }, {}).catch((error) => console.error(\"Failed to call endOfStream:\", error));\n\t});\n}\n//#endregion\nexport { endOfStream };\n\n//# sourceMappingURL=end-of-stream.js.map","import { signal } from \"../../core/signals/primitives.js\";\n//#region src/dom/media/mediasource-setup.ts\n/**\n* MediaSource Setup\n*\n* Utilities for creating and configuring MediaSource/ManagedMediaSource\n* for MSE (Media Source Extensions) playback.\n*\n* Global ManagedMediaSource types are defined in ./mediasource.d.ts\n*/\n/**\n* Check if MediaSource API is supported.\n*/\nfunction supportsMediaSource() {\n\treturn typeof MediaSource !== \"undefined\";\n}\n/**\n* Check if ManagedMediaSource API is supported.\n* ManagedMediaSource is a newer Safari API with better lifecycle management.\n*/\nfunction supportsManagedMediaSource() {\n\treturn typeof ManagedMediaSource !== \"undefined\";\n}\n/**\n* Create a MediaSource or ManagedMediaSource instance.\n*\n* @param options - Creation options\n* @returns A MediaSource or ManagedMediaSource instance\n* @throws Error if no MediaSource API is available\n*\n* @example\n* const mediaSource = createMediaSource();\n* const mediaElement = document.querySelector('video');\n* attachMediaSource(mediaSource, mediaElement);\n*/\nfunction createMediaSource(options = {}) {\n\tconst { preferManaged = false } = options;\n\tif (preferManaged && supportsManagedMediaSource()) return new ManagedMediaSource();\n\tif (supportsMediaSource()) return new MediaSource();\n\tthrow new Error(\"MediaSource API is not supported\");\n}\n/**\n* Attach a MediaSource to an HTMLMediaElement.\n*\n* Uses srcObject for ManagedMediaSource (Safari), or createObjectURL for regular MediaSource.\n*\n* @param mediaSource - The MediaSource to attach\n* @param mediaElement - The media element to attach to\n* @returns Object with URL and detach function\n*\n* @example\n* const mediaSource = createMediaSource();\n* const { detach } = attachMediaSource(mediaSource, videoElement);\n* // Use mediaSource...\n* // Later, to clean up:\n* detach();\n*/\nfunction attachMediaSource(mediaSource, mediaElement) {\n\tif (supportsManagedMediaSource() && mediaSource instanceof ManagedMediaSource) {\n\t\tmediaElement.disableRemotePlayback = true;\n\t\tmediaElement.srcObject = mediaSource;\n\t\tconst detach = () => {\n\t\t\tmediaElement.srcObject = null;\n\t\t\tmediaElement.load();\n\t\t};\n\t\treturn {\n\t\t\turl: \"\",\n\t\t\tdetach\n\t\t};\n\t}\n\tconst url = URL.createObjectURL(mediaSource);\n\tmediaElement.src = url;\n\tconst detach = () => {\n\t\tmediaElement.removeAttribute(\"src\");\n\t\tmediaElement.load();\n\t\tURL.revokeObjectURL(url);\n\t};\n\treturn {\n\t\turl,\n\t\tdetach\n\t};\n}\n/**\n* Create a SourceBuffer on a MediaSource.\n*\n* @param mediaSource - The MediaSource (must be in 'open' state)\n* @param mimeCodec - MIME type with codecs (e.g., 'video/mp4; codecs=\"avc1.42E01E\"')\n* @returns The created SourceBuffer\n* @throws Error if MediaSource is not open or codec is unsupported\n*\n* @example\n* const buffer = createSourceBuffer(mediaSource, 'video/mp4; codecs=\"avc1.42E01E\"');\n*/\nfunction createSourceBuffer(mediaSource, mimeCodec) {\n\tif (mediaSource.readyState !== \"open\") throw new Error(\"MediaSource is not open\");\n\tif (!isCodecSupported(mimeCodec)) throw new Error(`Codec not supported: ${mimeCodec}`);\n\treturn mediaSource.addSourceBuffer(mimeCodec);\n}\n/**\n* Check if a codec is supported.\n*\n* @param mimeCodec - MIME type with codecs string\n* @returns True if the codec is supported\n*\n* @example\n* if (isCodecSupported('video/mp4; codecs=\"avc1.42E01E\"')) {\n* // Create source buffer\n* }\n*/\nfunction isCodecSupported(mimeCodec) {\n\tif (!supportsMediaSource()) return false;\n\treturn MediaSource.isTypeSupported(mimeCodec);\n}\n/**\n* Create a reactive signal that mirrors `mediaSource.readyState`.\n*\n* Listens to `sourceopen`, `sourceended`, and `sourceclose` events and updates\n* the signal accordingly, making readyState visible to the TC39 signal graph.\n* Listeners are automatically removed when `signal` is aborted.\n*\n* @param mediaSource - The MediaSource to observe\n* @param signal - AbortSignal that controls listener lifetime\n* @returns A `Signal.ReadonlyState` that reflects the current `readyState`\n*\n* @example\n* const controller = new AbortController();\n* const readyState = observeMediaSourceReadyState(mediaSource, controller.signal);\n* effect(() => {\n* if (readyState.get() === 'open') { ... }\n* });\n* // Later:\n* controller.abort();\n*/\nfunction observeMediaSourceReadyState(mediaSource, abortSignal) {\n\tconst readyState = signal(mediaSource.readyState);\n\tconst update = () => readyState.set(mediaSource.readyState);\n\tconst options = { signal: abortSignal };\n\tmediaSource.addEventListener(\"sourceopen\", update, options);\n\tmediaSource.addEventListener(\"sourceended\", update, options);\n\tmediaSource.addEventListener(\"sourceclose\", update, options);\n\treturn readyState;\n}\n//#endregion\nexport { attachMediaSource, createMediaSource, createSourceBuffer, observeMediaSourceReadyState };\n\n//# sourceMappingURL=mediasource-setup.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { computed } from \"../../core/signals/primitives.js\";\nimport { attachMediaSource, createMediaSource, observeMediaSourceReadyState } from \"../media/mediasource-setup.js\";\n//#region src/dom/features/setup-mediasource.ts\n/**\n* Setup MediaSource orchestration.\n*\n* Creates and attaches MediaSource when:\n* - mediaElement exists in owners\n* - presentation.url exists in state\n*\n* Updates owners.mediaSource after successful setup.\n*/\nfunction setupMediaSource({ state, owners }) {\n\tconst abortController = new AbortController();\n\tconst mediaElementSignal = computed(() => owners.get().mediaElement);\n\tconst presentationUrlSignal = computed(() => state.get().presentation?.url);\n\tconst canSetupSignal = computed(() => !!mediaElementSignal.get() && !!presentationUrlSignal.get());\n\tconst mediaElementSrcSignal = computed(() => mediaElementSignal.get()?.src);\n\tconst mediaSourceSignal = computed(() => owners.get().mediaSource);\n\tconst shouldSetupSignal = computed(() => !mediaElementSrcSignal.get());\n\tconst cleanupEffect = effect(() => {\n\t\tif (!canSetupSignal.get() || !shouldSetupSignal.get()) return;\n\t\tconst mediaElement = mediaElementSignal.get();\n\t\tconst { signal } = abortController;\n\t\tconst mediaSource = createMediaSource({ preferManaged: true });\n\t\tconst mediaSourceReadyState = observeMediaSourceReadyState(mediaSource, signal);\n\t\tattachMediaSource(mediaSource, mediaElement);\n\t\tconst cleanupOwnersUpdateEffect = effect(() => {\n\t\t\tif (!!mediaSourceSignal.get() || mediaSourceReadyState.get() !== \"open\") return;\n\t\t\towners.set(Object.assign({}, owners.get(), {\n\t\t\t\tmediaSource,\n\t\t\t\tmediaSourceReadyState\n\t\t\t}));\n\t\t});\n\t\treturn () => {\n\t\t\tcleanupOwnersUpdateEffect();\n\t\t};\n\t});\n\treturn () => {\n\t\tabortController?.abort();\n\t\tcleanupEffect();\n\t};\n}\n//#endregion\nexport { setupMediaSource };\n\n//# sourceMappingURL=setup-mediasource.js.map","import { createMachineActor } from \"../../core/create-machine-actor.js\";\nimport { SerialRunner, Task } from \"../../core/task.js\";\nimport { appendSegment } from \"./append-segment.js\";\nimport { flushBuffer } from \"./buffer-flusher.js\";\n//#region src/dom/media/source-buffer-actor.ts\nfunction snapshotBuffered(buffered) {\n\tconst ranges = [];\n\tfor (let i = 0; i < buffered.length; i++) ranges.push({\n\t\tstart: buffered.start(i),\n\t\tend: buffered.end(i)\n\t});\n\treturn ranges;\n}\nfunction appendInitTask(message, { getContext, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait appendSegment(sourceBuffer, message.data);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tinitTrackId: message.meta.trackId\n\t\t};\n\t});\n}\nfunction appendSegmentTask(message, { getContext, sourceBuffer, setContext }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tconst { meta } = message;\n\t\tconst EPSILON = 1e-4;\n\t\tconst filtered = ctx.segments.filter((s) => Math.abs(s.startTime - meta.startTime) >= EPSILON);\n\t\tif (!(message.data instanceof ArrayBuffer)) setContext({\n\t\t\t...ctx,\n\t\t\tsegments: [...filtered, {\n\t\t\t\tid: meta.id,\n\t\t\t\tstartTime: meta.startTime,\n\t\t\t\tduration: meta.duration,\n\t\t\t\ttrackId: meta.trackId,\n\t\t\t\t...meta.trackBandwidth !== void 0 && { trackBandwidth: meta.trackBandwidth },\n\t\t\t\tpartial: true\n\t\t\t}],\n\t\t\tbufferedRanges: ctx.bufferedRanges\n\t\t});\n\t\tawait appendSegment(sourceBuffer, message.data, taskSignal);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: [...filtered, {\n\t\t\t\tid: meta.id,\n\t\t\t\tstartTime: meta.startTime,\n\t\t\t\tduration: meta.duration,\n\t\t\t\ttrackId: meta.trackId,\n\t\t\t\t...meta.trackBandwidth !== void 0 && { trackBandwidth: meta.trackBandwidth }\n\t\t\t}],\n\t\t\tbufferedRanges: snapshotBuffered(sourceBuffer.buffered)\n\t\t};\n\t});\n}\nfunction removeTask(message, { getContext, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait flushBuffer(sourceBuffer, message.start, message.end);\n\t\tconst bufferedRanges = snapshotBuffered(sourceBuffer.buffered);\n\t\tconst filtered = ctx.segments.filter((s) => {\n\t\t\tconst midpoint = s.startTime + s.duration / 2;\n\t\t\treturn bufferedRanges.some((r) => midpoint >= r.start && midpoint < r.end);\n\t\t});\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: filtered,\n\t\t\tbufferedRanges\n\t\t};\n\t});\n}\nconst messageTaskFactories = {\n\t\"append-init\": appendInitTask,\n\t\"append-segment\": appendSegmentTask,\n\tremove: removeTask\n};\nfunction messageToTask(message, options) {\n\tconst factory = messageTaskFactories[message.type];\n\treturn factory(message, options);\n}\nfunction createSourceBufferActor(sourceBuffer, initialContext) {\n\tconst handleError = (e) => {\n\t\tif (!(e instanceof Error && e.name === \"AbortError\")) console.error(\"SourceBuffer operation failed:\", e);\n\t};\n\tconst onMessage = (msg, { transition, setContext, getContext, runner }) => {\n\t\ttransition(\"updating\");\n\t\tconst task = messageToTask(msg, {\n\t\t\tgetContext,\n\t\t\tsourceBuffer,\n\t\t\tsetContext\n\t\t});\n\t\trunner.schedule(task).then(setContext, handleError);\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tsegments: [],\n\t\t\tbufferedRanges: [],\n\t\t\tinitTrackId: void 0,\n\t\t\t...initialContext\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: {\n\t\t\t\t\"append-init\": onMessage,\n\t\t\t\t\"append-segment\": onMessage,\n\t\t\t\tremove: onMessage,\n\t\t\t\tbatch: (msg, { transition, setContext, getContext, runner }) => {\n\t\t\t\t\tconst { messages } = msg;\n\t\t\t\t\tif (messages.length === 0) return;\n\t\t\t\t\ttransition(\"updating\");\n\t\t\t\t\tmessages.forEach((msg) => {\n\t\t\t\t\t\tconst task = messageToTask(msg, {\n\t\t\t\t\t\t\tgetContext,\n\t\t\t\t\t\t\tsourceBuffer,\n\t\t\t\t\t\t\tsetContext\n\t\t\t\t\t\t});\n\t\t\t\t\t\trunner.schedule(task).then(setContext, handleError);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} },\n\t\t\tupdating: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { cancel: (_, { runner }) => {\n\t\t\t\t\trunner.abortAll();\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createSourceBufferActor };\n\n//# sourceMappingURL=source-buffer-actor.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { computed, update } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { BufferKeyByType, getSelectedTrack } from \"../../core/utils/track-selection.js\";\nimport { createSourceBuffer } from \"../media/mediasource-setup.js\";\nimport { createSourceBufferActor } from \"../media/source-buffer-actor.js\";\n//#region src/dom/features/setup-sourcebuffer.ts\nconst ActorKeyByType = {\n\tvideo: \"videoBufferActor\",\n\taudio: \"audioBufferActor\"\n};\n/**\n* Build MIME codec string from track metadata.\n*\n* @param track - Resolved track with mimeType and codecs\n* @returns MIME codec string (e.g., 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"')\n*\n* @example\n* buildMimeCodec({ mimeType: 'video/mp4', codecs: ['avc1.42E01E'] })\n* // => 'video/mp4; codecs=\"avc1.42E01E\"'\n*/\nfunction buildMimeCodec(track) {\n\tconst codecString = track.codecs?.join(\",\") ?? \"\";\n\treturn `${track.mimeType}; codecs=\"${codecString}\"`;\n}\n/**\n* Setup all needed SourceBuffers as a single coordinated operation.\n*\n* Waits until ALL media tracks in the presentation are resolved with codecs,\n* then creates every SourceBuffer in one synchronous block before setting\n* owners. This guarantees that downstream consumers (e.g. loadSegments) never\n* see a partial set of SourceBuffers — preventing the Firefox bug where\n* appending to a video SourceBuffer before the audio SourceBuffer exists\n* causes mozHasAudio to be permanently false.\n*\n* Handles video-only, audio-only, and combined presentations correctly:\n* track types are derived from the presentation rather than hardcoded.\n*\n* @example\n* const cleanup = setupSourceBuffers({ state, owners });\n*/\nfunction setupSourceBuffers({ state, owners }) {\n\tconst presentationTypesSignal = computed(() => {\n\t\tconst { presentation } = state.get();\n\t\tif (!presentation || !(\"selectionSets\" in presentation)) return [];\n\t\treturn presentation.selectionSets.map(({ type }) => type).filter((type) => type === \"video\" || type === \"audio\");\n\t});\n\tconst canSetupSignal = computed(() => {\n\t\tconst types = presentationTypesSignal.get();\n\t\tif (!owners.get().mediaSource || types.length === 0) return false;\n\t\tconst s = state.get();\n\t\treturn types.every((type) => {\n\t\t\tconst track = getSelectedTrack(s, type);\n\t\t\treturn track && isResolvedTrack(track) && !!track.codecs?.length;\n\t\t});\n\t});\n\tconst shouldSetupSignal = computed(() => {\n\t\tconst o = owners.get();\n\t\treturn presentationTypesSignal.get().every((type) => !o[BufferKeyByType[type]]);\n\t});\n\treturn effect(() => {\n\t\tif (!canSetupSignal.get() || !shouldSetupSignal.get()) return;\n\t\tconst s = state.get();\n\t\tconst o = owners.get();\n\t\tconst patch = {};\n\t\tfor (const type of presentationTypesSignal.get()) {\n\t\t\tconst track = getSelectedTrack(s, type);\n\t\t\tconst buffer = createSourceBuffer(o.mediaSource, buildMimeCodec(track));\n\t\t\tpatch[BufferKeyByType[type]] = buffer;\n\t\t\tpatch[ActorKeyByType[type]] = createSourceBufferActor(buffer);\n\t\t}\n\t\tupdate(owners, patch);\n\t});\n}\n//#endregion\nexport { setupSourceBuffers };\n\n//# sourceMappingURL=setup-sourcebuffer.js.map","import { computed, untrack, update } from \"../../core/signals/primitives.js\";\nimport { createMachineReactor } from \"../../core/create-machine-reactor.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/dom/features/sync-text-tracks.ts\nfunction createTrackElement(track) {\n\tconst el = document.createElement(\"track\");\n\tel.id = track.id;\n\tel.kind = track.kind;\n\tel.label = track.label;\n\tel.toggleAttribute(\"data-src-track\", true);\n\tif (track.language) el.srclang = track.language;\n\tif (track.default) el.default = true;\n\treturn el;\n}\nfunction getModelTextTracks(presentation) {\n\treturn presentation?.selectionSets?.find((s) => s.type === \"text\")?.switchingSets[0]?.tracks;\n}\nfunction syncModes(textTracks, selectedId) {\n\tfor (let i = 0; i < textTracks.length; i++) {\n\t\tconst track = textTracks[i];\n\t\tif (track.kind !== \"subtitles\" && track.kind !== \"captions\") continue;\n\t\ttrack.mode = track.id === selectedId ? \"showing\" : \"disabled\";\n\t}\n}\n/**\n* Text track sync orchestration.\n*\n* A single `always` monitor keeps the reactor in sync with preconditions.\n* `'set-up'` owns the full lifecycle of `<track>` elements:\n*\n* - **Effect 1** — creates `<track>` elements on entry; exit cleanup removes\n* them and clears `selectedTextTrackId` on any outbound transition.\n* - **Effect 2** — owns mode sync, the Chromium settling-window guard, and\n* the `'change'` listener that bridges DOM state back to\n* `selectedTextTrackId`.\n*\n* @example\n* const reactor = syncTextTracks({ state, owners });\n* // later:\n* reactor.destroy();\n*/\nfunction syncTextTracks({ state, owners }) {\n\tconst mediaElementSignal = computed(() => owners.get().mediaElement);\n\tconst modelTextTracksSignal = computed(() => getModelTextTracks(state.get().presentation), { equals(prevTextTracks, nextTextTracks) {\n\t\tif (prevTextTracks === nextTextTracks) return true;\n\t\tif (typeof prevTextTracks !== typeof nextTextTracks) return false;\n\t\tif (prevTextTracks?.length !== nextTextTracks?.length) return false;\n\t\treturn !!nextTextTracks && nextTextTracks.every((nextTextTrack) => prevTextTracks?.some((prevTextTrack) => prevTextTrack.id === nextTextTrack.id));\n\t} });\n\tconst selectedTextTrackIdSignal = computed(() => state.get().selectedTextTrackId);\n\tconst preconditionsMetSignal = computed(() => !!mediaElementSignal.get() && !!modelTextTracksSignal.get()?.length);\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => preconditionsMetSignal.get() ? \"set-up\" : \"preconditions-unmet\",\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"set-up\": {\n\t\t\t\tentry: () => {\n\t\t\t\t\tconst mediaElement = mediaElementSignal.get();\n\t\t\t\t\tmodelTextTracksSignal.get().forEach((track) => mediaElement.appendChild(createTrackElement(track)));\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tmediaElement.querySelectorAll(\"track[data-src-track]:is([kind=\\\"subtitles\\\"],[kind=\\\"captions\\\"]\").forEach((trackEl) => trackEl.remove());\n\t\t\t\t\t\tupdate(state, { selectedTextTrackId: void 0 });\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\teffects: () => {\n\t\t\t\t\tconst mediaElement = untrack(() => mediaElementSignal.get());\n\t\t\t\t\tconst selectedId = selectedTextTrackIdSignal.get();\n\t\t\t\t\tsyncModes(mediaElement.textTracks, selectedId);\n\t\t\t\t\tlet syncTimeout = setTimeout(() => {\n\t\t\t\t\t\tsyncTimeout = void 0;\n\t\t\t\t\t}, 0);\n\t\t\t\t\tconst onChange = () => {\n\t\t\t\t\t\tif (syncTimeout) {\n\t\t\t\t\t\t\tsyncModes(mediaElement.textTracks, untrack(() => selectedTextTrackIdSignal.get()));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst newId = Array.from(mediaElement.textTracks).find((t) => t.mode === \"showing\" && (t.kind === \"subtitles\" || t.kind === \"captions\"))?.id;\n\t\t\t\t\t\tif (newId === untrack(() => selectedTextTrackIdSignal.get())) return;\n\t\t\t\t\t\tupdate(state, { selectedTextTrackId: newId });\n\t\t\t\t\t};\n\t\t\t\t\tconst unlisten = listen(mediaElement.textTracks, \"change\", onChange);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tclearTimeout(syncTimeout ?? void 0);\n\t\t\t\t\t\tunlisten();\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { syncTextTracks };\n\n//# sourceMappingURL=sync-text-tracks.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { hasPresentationDuration } from \"../../core/types/index.js\";\n//#region src/dom/features/update-duration.ts\n/**\n* Check if we can update MediaSource duration (have required data).\n*/\nfunction canUpdateDuration(state, owners) {\n\treturn !!(owners.mediaSource && state.presentation && hasPresentationDuration(state.presentation));\n}\n/**\n* Get the maximum buffered end time across all SourceBuffers.\n*/\nfunction getMaxBufferedEnd(owners) {\n\tlet maxEnd = 0;\n\tconst buffers = [owners.videoSourceBuffer, owners.audioSourceBuffer].filter((buf) => buf !== void 0);\n\tfor (const buffer of buffers) {\n\t\tconst { buffered } = buffer;\n\t\tif (buffered.length > 0) {\n\t\t\tconst end = buffered.end(buffered.length - 1);\n\t\t\tif (end > maxEnd) maxEnd = end;\n\t\t}\n\t}\n\treturn maxEnd;\n}\n/**\n* Check if we should update MediaSource duration (conditions met).\n*/\nfunction shouldUpdateDuration(state, owners) {\n\tif (!canUpdateDuration(state, owners)) return false;\n\tconst { mediaSource } = owners;\n\tconst { presentation } = state;\n\tif ((owners.mediaSourceReadyState?.get() ?? owners.mediaSource?.readyState) !== \"open\") return false;\n\tconst duration = presentation.duration;\n\tif (!Number.isFinite(duration) || Number.isNaN(duration) || duration <= 0) return false;\n\treturn Number.isNaN(mediaSource.duration);\n}\n/**\n* Wait for all currently-updating SourceBuffers to finish.\n*\n* The MSE spec forbids setting MediaSource.duration while any attached\n* SourceBuffer has updating === true. This defers until all are idle.\n*/\nfunction waitForSourceBuffersReady(owners) {\n\tconst updating = [owners.videoSourceBuffer, owners.audioSourceBuffer].filter((buf) => buf?.updating === true);\n\tif (updating.length === 0) return Promise.resolve();\n\treturn Promise.all(updating.map((buf) => new Promise((resolve) => buf.addEventListener(\"updateend\", () => resolve(), { once: true })))).then(() => void 0);\n}\n/**\n* Update MediaSource duration when presentation duration becomes available.\n*/\nfunction updateDuration({ state, owners }) {\n\tlet destroyed = false;\n\tlet running = false;\n\tconst cleanupEffect = effect(() => {\n\t\tconst currentState = state.get();\n\t\tconst currentOwners = owners.get();\n\t\tif (!shouldUpdateDuration(currentState, currentOwners) || running) return;\n\t\tconst { mediaSource } = currentOwners;\n\t\trunning = true;\n\t\twaitForSourceBuffersReady(currentOwners).then(() => {\n\t\t\tif (destroyed || mediaSource.readyState !== \"open\") return;\n\t\t\tlet duration = currentState.presentation.duration;\n\t\t\tconst maxBufferedEnd = getMaxBufferedEnd(currentOwners);\n\t\t\tif (maxBufferedEnd > duration) duration = maxBufferedEnd;\n\t\t\tmediaSource.duration = duration;\n\t\t}).finally(() => {\n\t\t\trunning = false;\n\t\t});\n\t});\n\treturn () => {\n\t\tdestroyed = true;\n\t\tcleanupEffect();\n\t};\n}\n//#endregion\nexport { updateDuration };\n\n//# sourceMappingURL=update-duration.js.map","import { signal } from \"../../core/signals/primitives.js\";\nimport { loadSegments } from \"../features/load-segments.js\";\nimport { destroyVttParser } from \"../text/parse-vtt-segment.js\";\nimport { loadTextTrackCues } from \"../features/load-text-track-cues.js\";\nimport { trackCurrentTime } from \"../features/track-current-time.js\";\nimport { trackPlaybackInitiated } from \"../features/track-playback-initiated.js\";\nimport { calculatePresentationDuration } from \"../../core/features/calculate-presentation-duration.js\";\nimport { switchQuality } from \"../../core/features/quality-switching.js\";\nimport { resolvePresentation } from \"../../core/features/resolve-presentation.js\";\nimport { resolveTrack } from \"../../core/features/resolve-track.js\";\nimport { selectAudioTrack, selectTextTrack, selectVideoTrack } from \"../../core/features/select-tracks.js\";\nimport { syncPreloadAttribute } from \"../../core/features/sync-preload-attribute.js\";\nimport { endOfStream } from \"../features/end-of-stream.js\";\nimport { setupMediaSource } from \"../features/setup-mediasource.js\";\nimport { setupSourceBuffers } from \"../features/setup-sourcebuffer.js\";\nimport { syncTextTracks } from \"../features/sync-text-tracks.js\";\nimport { updateDuration } from \"../features/update-duration.js\";\n//#region src/dom/playback-engine/engine.ts\n/**\n* Create a POC playback engine.\n*\n* Wires together all orchestrations to create a reactive playback pipeline:\n* 1. Resolve presentation (multivariant playlist)\n* 2. Select initial video and audio tracks\n* 3. Resolve selected tracks (media playlists)\n* 4. Setup MediaSource\n* 5. Setup SourceBuffers for video and audio\n*\n* Note: This is a POC - does not yet load/append segments.\n*\n* @param config - Playback engine configuration\n* @returns Playback engine instance with state, owners, and destroy function\n*\n* @example\n* const engine = createPlaybackEngine({\n* initialBandwidth: 2_000_000,\n* preferredAudioLanguage: 'en',\n* });\n*\n* // Initialize by setting state and owners\n* engine.owners.set({ ...engine.owners.get(), mediaElement: document.querySelector('video') });\n* engine.state.set({\n* ...engine.state.get(),\n* presentation: { url: 'https://example.com/playlist.m3u8' },\n* preload: 'auto',\n* });\n*\n* // Inspect state\n* console.log(engine.state.get());\n*\n* // Cleanup\n* engine.destroy();\n*/\nfunction createPlaybackEngine(config = {}) {\n\tconst state = signal({ bandwidthState: {\n\t\tfastEstimate: 0,\n\t\tfastTotalWeight: 0,\n\t\tslowEstimate: 0,\n\t\tslowTotalWeight: 0,\n\t\tbytesSampled: 0\n\t} });\n\tconst owners = signal({});\n\tconst cleanups = [\n\t\tsyncPreloadAttribute({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\ttrackPlaybackInitiated({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tresolvePresentation({ state }),\n\t\tselectVideoTrack({ state }, {\n\t\t\ttype: \"video\",\n\t\t\t...config.initialBandwidth !== void 0 && { initialBandwidth: config.initialBandwidth }\n\t\t}),\n\t\tselectAudioTrack({ state }, {\n\t\t\ttype: \"audio\",\n\t\t\t...config.preferredAudioLanguage !== void 0 && { preferredAudioLanguage: config.preferredAudioLanguage }\n\t\t}),\n\t\tselectTextTrack({ state }, {\n\t\t\ttype: \"text\",\n\t\t\t...config.preferredSubtitleLanguage !== void 0 && { preferredSubtitleLanguage: config.preferredSubtitleLanguage },\n\t\t\t...config.includeForcedTracks !== void 0 && { includeForcedTracks: config.includeForcedTracks },\n\t\t\t...config.enableDefaultTrack !== void 0 && { enableDefaultTrack: config.enableDefaultTrack }\n\t\t}),\n\t\tresolveTrack({ state }, { type: \"video\" }),\n\t\tresolveTrack({ state }, { type: \"audio\" }),\n\t\tresolveTrack({ state }, { type: \"text\" }),\n\t\tcalculatePresentationDuration({ state }),\n\t\tsetupMediaSource({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tupdateDuration({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsetupSourceBuffers({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\ttrackCurrentTime({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tswitchQuality({ state }, config.initialBandwidth !== void 0 ? { defaultBandwidth: config.initialBandwidth } : {}),\n\t\tloadSegments({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"video\" }),\n\t\tloadSegments({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"audio\" }),\n\t\tendOfStream({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsyncTextTracks({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tloadTextTrackCues({\n\t\t\tstate,\n\t\t\towners\n\t\t})\n\t];\n\treturn {\n\t\tstate,\n\t\towners,\n\t\tdestroy: () => {\n\t\t\tcleanups.forEach((cleanup) => typeof cleanup === \"function\" ? cleanup() : cleanup.destroy());\n\t\t\tfor (const value of Object.values(owners.get())) if (value !== null && typeof value === \"object\" && typeof value.destroy === \"function\") value.destroy();\n\t\t\tdestroyVttParser();\n\t\t}\n\t};\n}\n//#endregion\nexport { createPlaybackEngine };\n\n//# sourceMappingURL=engine.js.map","import { update } from \"../../core/signals/primitives.js\";\nimport { createPlaybackEngine } from \"./engine.js\";\n//#region src/dom/playback-engine/adapter.ts\nconst spfMediaDefaultProps = {\n\tsrc: \"\",\n\tpreload: \"\"\n};\n/**\n* Mixin that adds SPF playback engine behavior to any base class.\n*\n* Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n* be used anywhere a media element API is expected.\n*\n* A new engine is created on every src assignment — this fully tears down all\n* state, SourceBuffers, and in-flight requests from the previous source before\n* the next one begins. The media element reference is preserved across src\n* changes and re-applied to the new engine automatically.\n*\n* @example\n* class SimpleHlsMedia extends SpfMediaMixin(HTMLVideoElementHost) {}\n*\n* const media = new SimpleHlsMedia();\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*/\nfunction SpfMediaMixin(BaseClass) {\n\tclass SpfMediaImpl extends BaseClass {\n\t\t#engine;\n\t\t#config;\n\t\t#preload = spfMediaDefaultProps.preload;\n\t\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t\t#loadstartListener = null;\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { config } = args?.[0] ?? {};\n\t\t\tthis.#config = config;\n\t\t\tthis.#engine = createPlaybackEngine(config);\n\t\t}\n\t\tget engine() {\n\t\t\treturn this.#engine;\n\t\t}\n\t\tattach(mediaElement) {\n\t\t\tsuper.attach?.(mediaElement);\n\t\t\tupdate(this.#engine.owners, { mediaElement });\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tupdate(this.#engine.owners, { mediaElement: void 0 });\n\t\t\tsuper.detach?.();\n\t\t}\n\t\tdestroy() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#engine.destroy();\n\t\t}\n\t\tget preload() {\n\t\t\treturn this.#preload;\n\t\t}\n\t\tset preload(value) {\n\t\t\tthis.#preload = value;\n\t\t\tif (value) update(this.#engine.state, { preload: value });\n\t\t}\n\t\tget src() {\n\t\t\treturn this.#engine.state.get().presentation?.url ?? \"\";\n\t\t}\n\t\tset src(value) {\n\t\t\tconst prevMediaElement = this.#engine.owners.get().mediaElement;\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#engine.destroy();\n\t\t\tthis.#engine = createPlaybackEngine(this.#config);\n\t\t\tif (this.#preload) update(this.#engine.state, { preload: this.#preload });\n\t\t\tif (prevMediaElement) update(this.#engine.owners, { mediaElement: prevMediaElement });\n\t\t\tif (value) update(this.#engine.state, { presentation: { url: value } });\n\t\t}\n\t\tplay() {\n\t\t\tconst { mediaElement } = this.#engine.owners.get();\n\t\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"SpfMedia: no media element attached\"));\n\t\t\tupdate(this.#engine.state, { playbackInitiated: true });\n\t\t\treturn mediaElement.play().catch((err) => {\n\t\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t\t};\n\t\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t\t});\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\t#cancelPendingPlay() {\n\t\t\tif (!this.#loadstartListener) return;\n\t\t\tconst { mediaElement } = this.#engine.owners.get();\n\t\t\tmediaElement?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\t\tthis.#loadstartListener = null;\n\t\t}\n\t}\n\treturn SpfMediaImpl;\n}\n/** Standalone SPF media adapter with no base class. */\nvar SpfMedia = class extends SpfMediaMixin(class {}) {};\n//#endregion\nexport { SpfMedia, SpfMediaMixin, spfMediaDefaultProps };\n\n//# sourceMappingURL=adapter.js.map","import { HTMLVideoElementHost } from \"../video-host.js\";\nimport { SpfMediaMixin } from \"@videojs/spf/dom\";\n//#region src/dom/media/simple-hls/index.ts\nvar SimpleHlsMedia = class extends SpfMediaMixin(HTMLVideoElementHost) {};\n//#endregion\nexport { SimpleHlsMedia };\n\n//# sourceMappingURL=index.js.map","import { CustomMediaElement } from '@videojs/core/dom/media/custom-media-element';\nimport { SimpleHlsMedia } from '@videojs/core/dom/media/simple-hls';\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\nexport class SimpleHlsVideo extends MediaAttachMixin(CustomMediaElement('video', SimpleHlsMedia)) {}\n","import { SimpleHlsVideo } from '../../media/simple-hls-video';\nimport { safeDefine } from '../safe-define';\n\nexport class SimpleHlsVideoElement extends SimpleHlsVideo {\n static readonly tagName = 'simple-hls-video';\n}\n\nsafeDefine(SimpleHlsVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [SimpleHlsVideoElement.tagName]: SimpleHlsVideoElement;\n }\n}\n"],"x_google_ignoreList":[3],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"simple-hls-video.dev.js","names":["#runFn","#signal","#abortController","#status","#value","#error","#destroyed","#pending","#settled","#resolveSettled","#chain","#current","deriveState","deriveState","#readableStream","deriveState","deriveState","deriveState","#config","#engine","#createEngine","#signals","#cancelPendingPlay","#preload","#loadstartListener"],"sources":["../../../utils/dist/string/generate-id.js","../../../../node_modules/.pnpm/signal-polyfill@0.2.2/node_modules/signal-polyfill/dist/index.js","../../../spf/dist/dev/core/signals/primitives.js","../../../spf/dist/dev/core/composition/create-composition.js","../../../spf/dist/dev/core/composition/share-signals.js","../../../spf/dist/dev/media/dom/text/resolve-vtt-segment.js","../../../spf/dist/dev/core/signals/effect.js","../../../spf/dist/dev/core/machine.js","../../../spf/dist/dev/core/reactors/create-machine-reactor.js","../../../spf/dist/dev/media/buffer/forward-buffer.js","../../../spf/dist/dev/media/types/index.js","../../../spf/dist/dev/media/utils/tracks.js","../../../spf/dist/dev/playback/behaviors/track-types.js","../../../spf/dist/dev/playback/behaviors/dom/load-segments.js","../../../spf/dist/dev/core/actors/create-transition-actor.js","../../../spf/dist/dev/playback/actors/dom/text-tracks.js","../../../spf/dist/dev/core/tasks/task.js","../../../spf/dist/dev/core/actors/create-machine-actor.js","../../../spf/dist/dev/playback/actors/text-track-segment-loader.js","../../../spf/dist/dev/playback/behaviors/dom/setup-text-track-actors.js","../../../spf/dist/dev/playback/behaviors/dom/track-current-time.js","../../../spf/dist/dev/playback/behaviors/dom/track-load-triggers.js","../../../spf/dist/dev/media/dom/text/text-track-slots.js","../../../spf/dist/dev/media/hls/parse-attributes.js","../../../spf/dist/dev/media/hls/resolve-url.js","../../../spf/dist/dev/media/hls/parse-multivariant.js","../../../spf/dist/dev/media/utils/track-selection.js","../../../spf/dist/dev/playback/behaviors/calculate-presentation-duration.js","../../../spf/dist/dev/media/dom/mse/duration.js","../../../spf/dist/dev/media/dom/mse/end-of-stream.js","../../../spf/dist/dev/media/dom/mse/mediasource-setup.js","../../../spf/dist/dev/playback/behaviors/dom/end-of-stream.js","../../../spf/dist/dev/network/ewma.js","../../../spf/dist/dev/network/bandwidth-estimator.js","../../../spf/dist/dev/network/chunked-stream-iterable.js","../../../spf/dist/dev/network/fetch.js","../../../spf/dist/dev/media/buffer/back-buffer.js","../../../spf/dist/dev/playback/actors/dom/segment-loader.js","../../../spf/dist/dev/media/dom/mse/append-segment.js","../../../spf/dist/dev/media/dom/mse/buffer-flusher.js","../../../spf/dist/dev/playback/actors/dom/source-buffer.js","../../../spf/dist/dev/playback/behaviors/dom/setup-buffer-actors.js","../../../spf/dist/dev/playback/behaviors/dom/setup-mediasource.js","../../../spf/dist/dev/playback/behaviors/dom/sync-text-tracks.js","../../../spf/dist/dev/playback/behaviors/dom/update-mediasource-duration.js","../../../spf/dist/dev/media/abr/quality-selection.js","../../../spf/dist/dev/playback/behaviors/quality-switching.js","../../../spf/dist/dev/media/utils/preload.js","../../../spf/dist/dev/playback/behaviors/resolve-presentation.js","../../../spf/dist/dev/media/hls/parse-media-playlist.js","../../../spf/dist/dev/playback/behaviors/resolve-track.js","../../../spf/dist/dev/media/primitives/select-tracks.js","../../../spf/dist/dev/playback/behaviors/select-tracks.js","../../../spf/dist/dev/playback/behaviors/sync-preload.js","../../../spf/dist/dev/playback/engines/hls/engine.js","../../../spf/dist/dev/playback/engines/hls/adapter.js","../../../core/dist/dev/dom/media/simple-hls/index.js","../../src/media/simple-hls-video/index.ts","../../src/define/media/simple-hls-video.ts"],"sourcesContent":["//#region src/string/generate-id.ts\n/**\n* Generate a unique-ish string ID via timestamp + random.\n*\n* @returns String in `timestamp-random` format (e.g. `\"1738423156789-542891\"`).\n*\n* @example\n* const id = generateId(); // \"1738423156789-542891\"\n*/\nfunction generateId() {\n\treturn `${Date.now()}-${Math.floor(Math.random() * 1e6)}`;\n}\n//#endregion\nexport { generateId };\n\n//# sourceMappingURL=generate-id.js.map","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nvar __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateIn = (member, obj) => {\n if (Object(obj) !== obj)\n throw TypeError('Cannot use the \"in\" operator on this value');\n return member.has(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction defaultEquals(a, b) {\n return Object.is(a, b);\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet activeConsumer = null;\nlet inNotificationPhase = false;\nlet epoch = 1;\nconst SIGNAL = /* @__PURE__ */ Symbol(\"SIGNAL\");\nfunction setActiveConsumer(consumer) {\n const prev = activeConsumer;\n activeConsumer = consumer;\n return prev;\n}\nfunction getActiveConsumer() {\n return activeConsumer;\n}\nfunction isInNotificationPhase() {\n return inNotificationPhase;\n}\nconst REACTIVE_NODE = {\n version: 0,\n lastCleanEpoch: 0,\n dirty: false,\n producerNode: void 0,\n producerLastReadVersion: void 0,\n producerIndexOfThis: void 0,\n nextProducerIndex: 0,\n liveConsumerNode: void 0,\n liveConsumerIndexOfThis: void 0,\n consumerAllowSignalWrites: false,\n consumerIsAlwaysLive: false,\n producerMustRecompute: () => false,\n producerRecomputeValue: () => {\n },\n consumerMarkedDirty: () => {\n },\n consumerOnSignalRead: () => {\n }\n};\nfunction producerAccessed(node) {\n if (inNotificationPhase) {\n throw new Error(\n typeof ngDevMode !== \"undefined\" && ngDevMode ? `Assertion error: signal read during notification phase` : \"\"\n );\n }\n if (activeConsumer === null) {\n return;\n }\n activeConsumer.consumerOnSignalRead(node);\n const idx = activeConsumer.nextProducerIndex++;\n assertConsumerNode(activeConsumer);\n if (idx < activeConsumer.producerNode.length && activeConsumer.producerNode[idx] !== node) {\n if (consumerIsLive(activeConsumer)) {\n const staleProducer = activeConsumer.producerNode[idx];\n producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]);\n }\n }\n if (activeConsumer.producerNode[idx] !== node) {\n activeConsumer.producerNode[idx] = node;\n activeConsumer.producerIndexOfThis[idx] = consumerIsLive(activeConsumer) ? producerAddLiveConsumer(node, activeConsumer, idx) : 0;\n }\n activeConsumer.producerLastReadVersion[idx] = node.version;\n}\nfunction producerIncrementEpoch() {\n epoch++;\n}\nfunction producerUpdateValueVersion(node) {\n if (!node.dirty && node.lastCleanEpoch === epoch) {\n return;\n }\n if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) {\n node.dirty = false;\n node.lastCleanEpoch = epoch;\n return;\n }\n node.producerRecomputeValue(node);\n node.dirty = false;\n node.lastCleanEpoch = epoch;\n}\nfunction producerNotifyConsumers(node) {\n if (node.liveConsumerNode === void 0) {\n return;\n }\n const prev = inNotificationPhase;\n inNotificationPhase = true;\n try {\n for (const consumer of node.liveConsumerNode) {\n if (!consumer.dirty) {\n consumerMarkDirty(consumer);\n }\n }\n } finally {\n inNotificationPhase = prev;\n }\n}\nfunction producerUpdatesAllowed() {\n return (activeConsumer == null ? void 0 : activeConsumer.consumerAllowSignalWrites) !== false;\n}\nfunction consumerMarkDirty(node) {\n var _a;\n node.dirty = true;\n producerNotifyConsumers(node);\n (_a = node.consumerMarkedDirty) == null ? void 0 : _a.call(node.wrapper ?? node);\n}\nfunction consumerBeforeComputation(node) {\n node && (node.nextProducerIndex = 0);\n return setActiveConsumer(node);\n}\nfunction consumerAfterComputation(node, prevConsumer) {\n setActiveConsumer(prevConsumer);\n if (!node || node.producerNode === void 0 || node.producerIndexOfThis === void 0 || node.producerLastReadVersion === void 0) {\n return;\n }\n if (consumerIsLive(node)) {\n for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n }\n }\n while (node.producerNode.length > node.nextProducerIndex) {\n node.producerNode.pop();\n node.producerLastReadVersion.pop();\n node.producerIndexOfThis.pop();\n }\n}\nfunction consumerPollProducersForChange(node) {\n assertConsumerNode(node);\n for (let i = 0; i < node.producerNode.length; i++) {\n const producer = node.producerNode[i];\n const seenVersion = node.producerLastReadVersion[i];\n if (seenVersion !== producer.version) {\n return true;\n }\n producerUpdateValueVersion(producer);\n if (seenVersion !== producer.version) {\n return true;\n }\n }\n return false;\n}\nfunction producerAddLiveConsumer(node, consumer, indexOfThis) {\n var _a;\n assertProducerNode(node);\n assertConsumerNode(node);\n if (node.liveConsumerNode.length === 0) {\n (_a = node.watched) == null ? void 0 : _a.call(node.wrapper);\n for (let i = 0; i < node.producerNode.length; i++) {\n node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i);\n }\n }\n node.liveConsumerIndexOfThis.push(indexOfThis);\n return node.liveConsumerNode.push(consumer) - 1;\n}\nfunction producerRemoveLiveConsumerAtIndex(node, idx) {\n var _a;\n assertProducerNode(node);\n assertConsumerNode(node);\n if (typeof ngDevMode !== \"undefined\" && ngDevMode && idx >= node.liveConsumerNode.length) {\n throw new Error(\n `Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`\n );\n }\n if (node.liveConsumerNode.length === 1) {\n (_a = node.unwatched) == null ? void 0 : _a.call(node.wrapper);\n for (let i = 0; i < node.producerNode.length; i++) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n }\n }\n const lastIdx = node.liveConsumerNode.length - 1;\n node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx];\n node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx];\n node.liveConsumerNode.length--;\n node.liveConsumerIndexOfThis.length--;\n if (idx < node.liveConsumerNode.length) {\n const idxProducer = node.liveConsumerIndexOfThis[idx];\n const consumer = node.liveConsumerNode[idx];\n assertConsumerNode(consumer);\n consumer.producerIndexOfThis[idxProducer] = idx;\n }\n}\nfunction consumerIsLive(node) {\n var _a;\n return node.consumerIsAlwaysLive || (((_a = node == null ? void 0 : node.liveConsumerNode) == null ? void 0 : _a.length) ?? 0) > 0;\n}\nfunction assertConsumerNode(node) {\n node.producerNode ?? (node.producerNode = []);\n node.producerIndexOfThis ?? (node.producerIndexOfThis = []);\n node.producerLastReadVersion ?? (node.producerLastReadVersion = []);\n}\nfunction assertProducerNode(node) {\n node.liveConsumerNode ?? (node.liveConsumerNode = []);\n node.liveConsumerIndexOfThis ?? (node.liveConsumerIndexOfThis = []);\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction computedGet(node) {\n producerUpdateValueVersion(node);\n producerAccessed(node);\n if (node.value === ERRORED) {\n throw node.error;\n }\n return node.value;\n}\nfunction createComputed(computation) {\n const node = Object.create(COMPUTED_NODE);\n node.computation = computation;\n const computed = () => computedGet(node);\n computed[SIGNAL] = node;\n return computed;\n}\nconst UNSET = /* @__PURE__ */ Symbol(\"UNSET\");\nconst COMPUTING = /* @__PURE__ */ Symbol(\"COMPUTING\");\nconst ERRORED = /* @__PURE__ */ Symbol(\"ERRORED\");\nconst COMPUTED_NODE = /* @__PURE__ */ (() => {\n return {\n ...REACTIVE_NODE,\n value: UNSET,\n dirty: true,\n error: null,\n equal: defaultEquals,\n producerMustRecompute(node) {\n return node.value === UNSET || node.value === COMPUTING;\n },\n producerRecomputeValue(node) {\n if (node.value === COMPUTING) {\n throw new Error(\"Detected cycle in computations.\");\n }\n const oldValue = node.value;\n node.value = COMPUTING;\n const prevConsumer = consumerBeforeComputation(node);\n let newValue;\n let wasEqual = false;\n try {\n newValue = node.computation.call(node.wrapper);\n const oldOk = oldValue !== UNSET && oldValue !== ERRORED;\n wasEqual = oldOk && node.equal.call(node.wrapper, oldValue, newValue);\n } catch (err) {\n newValue = ERRORED;\n node.error = err;\n } finally {\n consumerAfterComputation(node, prevConsumer);\n }\n if (wasEqual) {\n node.value = oldValue;\n return;\n }\n node.value = newValue;\n node.version++;\n }\n };\n})();\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction defaultThrowError() {\n throw new Error();\n}\nlet throwInvalidWriteToSignalErrorFn = defaultThrowError;\nfunction throwInvalidWriteToSignalError() {\n throwInvalidWriteToSignalErrorFn();\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction createSignal(initialValue) {\n const node = Object.create(SIGNAL_NODE);\n node.value = initialValue;\n const getter = () => {\n producerAccessed(node);\n return node.value;\n };\n getter[SIGNAL] = node;\n return getter;\n}\nfunction signalGetFn() {\n producerAccessed(this);\n return this.value;\n}\nfunction signalSetFn(node, newValue) {\n if (!producerUpdatesAllowed()) {\n throwInvalidWriteToSignalError();\n }\n if (!node.equal.call(node.wrapper, node.value, newValue)) {\n node.value = newValue;\n signalValueChanged(node);\n }\n}\nconst SIGNAL_NODE = /* @__PURE__ */ (() => {\n return {\n ...REACTIVE_NODE,\n equal: defaultEquals,\n value: void 0\n };\n})();\nfunction signalValueChanged(node) {\n node.version++;\n producerIncrementEpoch();\n producerNotifyConsumers(node);\n}\n/**\n * @license\n * Copyright 2024 Bloomberg Finance L.P.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst NODE = Symbol(\"node\");\nvar Signal;\n((Signal2) => {\n var _a, _brand, brand_fn, _b, _brand2, brand_fn2;\n class State {\n constructor(initialValue, options = {}) {\n __privateAdd(this, _brand);\n __publicField(this, _a);\n const ref = createSignal(initialValue);\n const node = ref[SIGNAL];\n this[NODE] = node;\n node.wrapper = this;\n if (options) {\n const equals = options.equals;\n if (equals) {\n node.equal = equals;\n }\n node.watched = options[Signal2.subtle.watched];\n node.unwatched = options[Signal2.subtle.unwatched];\n }\n }\n get() {\n if (!(0, Signal2.isState)(this))\n throw new TypeError(\"Wrong receiver type for Signal.State.prototype.get\");\n return signalGetFn.call(this[NODE]);\n }\n set(newValue) {\n if (!(0, Signal2.isState)(this))\n throw new TypeError(\"Wrong receiver type for Signal.State.prototype.set\");\n if (isInNotificationPhase()) {\n throw new Error(\"Writes to signals not permitted during Watcher callback\");\n }\n const ref = this[NODE];\n signalSetFn(ref, newValue);\n }\n }\n _a = NODE;\n _brand = new WeakSet();\n brand_fn = function() {\n };\n Signal2.isState = (s) => typeof s === \"object\" && __privateIn(_brand, s);\n Signal2.State = State;\n class Computed {\n // Create a Signal which evaluates to the value returned by the callback.\n // Callback is called with this signal as the parameter.\n constructor(computation, options) {\n __privateAdd(this, _brand2);\n __publicField(this, _b);\n const ref = createComputed(computation);\n const node = ref[SIGNAL];\n node.consumerAllowSignalWrites = true;\n this[NODE] = node;\n node.wrapper = this;\n if (options) {\n const equals = options.equals;\n if (equals) {\n node.equal = equals;\n }\n node.watched = options[Signal2.subtle.watched];\n node.unwatched = options[Signal2.subtle.unwatched];\n }\n }\n get() {\n if (!(0, Signal2.isComputed)(this))\n throw new TypeError(\"Wrong receiver type for Signal.Computed.prototype.get\");\n return computedGet(this[NODE]);\n }\n }\n _b = NODE;\n _brand2 = new WeakSet();\n brand_fn2 = function() {\n };\n Signal2.isComputed = (c) => typeof c === \"object\" && __privateIn(_brand2, c);\n Signal2.Computed = Computed;\n ((subtle2) => {\n var _a2, _brand3, brand_fn3, _assertSignals, assertSignals_fn;\n function untrack(cb) {\n let output;\n let prevActiveConsumer = null;\n try {\n prevActiveConsumer = setActiveConsumer(null);\n output = cb();\n } finally {\n setActiveConsumer(prevActiveConsumer);\n }\n return output;\n }\n subtle2.untrack = untrack;\n function introspectSources(sink) {\n var _a3;\n if (!(0, Signal2.isComputed)(sink) && !(0, Signal2.isWatcher)(sink)) {\n throw new TypeError(\"Called introspectSources without a Computed or Watcher argument\");\n }\n return ((_a3 = sink[NODE].producerNode) == null ? void 0 : _a3.map((n) => n.wrapper)) ?? [];\n }\n subtle2.introspectSources = introspectSources;\n function introspectSinks(signal) {\n var _a3;\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called introspectSinks without a Signal argument\");\n }\n return ((_a3 = signal[NODE].liveConsumerNode) == null ? void 0 : _a3.map((n) => n.wrapper)) ?? [];\n }\n subtle2.introspectSinks = introspectSinks;\n function hasSinks(signal) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called hasSinks without a Signal argument\");\n }\n const liveConsumerNode = signal[NODE].liveConsumerNode;\n if (!liveConsumerNode)\n return false;\n return liveConsumerNode.length > 0;\n }\n subtle2.hasSinks = hasSinks;\n function hasSources(signal) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isWatcher)(signal)) {\n throw new TypeError(\"Called hasSources without a Computed or Watcher argument\");\n }\n const producerNode = signal[NODE].producerNode;\n if (!producerNode)\n return false;\n return producerNode.length > 0;\n }\n subtle2.hasSources = hasSources;\n class Watcher {\n // When a (recursive) source of Watcher is written to, call this callback,\n // if it hasn't already been called since the last `watch` call.\n // No signals may be read or written during the notify.\n constructor(notify) {\n __privateAdd(this, _brand3);\n __privateAdd(this, _assertSignals);\n __publicField(this, _a2);\n let node = Object.create(REACTIVE_NODE);\n node.wrapper = this;\n node.consumerMarkedDirty = notify;\n node.consumerIsAlwaysLive = true;\n node.consumerAllowSignalWrites = false;\n node.producerNode = [];\n this[NODE] = node;\n }\n // Add these signals to the Watcher's set, and set the watcher to run its\n // notify callback next time any signal in the set (or one of its dependencies) changes.\n // Can be called with no arguments just to reset the \"notified\" state, so that\n // the notify callback will be invoked again.\n watch(...signals) {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called unwatch without Watcher receiver\");\n }\n __privateMethod(this, _assertSignals, assertSignals_fn).call(this, signals);\n const node = this[NODE];\n node.dirty = false;\n const prev = setActiveConsumer(node);\n for (const signal of signals) {\n producerAccessed(signal[NODE]);\n }\n setActiveConsumer(prev);\n }\n // Remove these signals from the watched set (e.g., for an effect which is disposed)\n unwatch(...signals) {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called unwatch without Watcher receiver\");\n }\n __privateMethod(this, _assertSignals, assertSignals_fn).call(this, signals);\n const node = this[NODE];\n assertConsumerNode(node);\n for (let i = node.producerNode.length - 1; i >= 0; i--) {\n if (signals.includes(node.producerNode[i].wrapper)) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n const lastIdx = node.producerNode.length - 1;\n node.producerNode[i] = node.producerNode[lastIdx];\n node.producerIndexOfThis[i] = node.producerIndexOfThis[lastIdx];\n node.producerNode.length--;\n node.producerIndexOfThis.length--;\n node.nextProducerIndex--;\n if (i < node.producerNode.length) {\n const idxConsumer = node.producerIndexOfThis[i];\n const producer = node.producerNode[i];\n assertProducerNode(producer);\n producer.liveConsumerIndexOfThis[idxConsumer] = i;\n }\n }\n }\n }\n // Returns the set of computeds in the Watcher's set which are still yet\n // to be re-evaluated\n getPending() {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called getPending without Watcher receiver\");\n }\n const node = this[NODE];\n return node.producerNode.filter((n) => n.dirty).map((n) => n.wrapper);\n }\n }\n _a2 = NODE;\n _brand3 = new WeakSet();\n brand_fn3 = function() {\n };\n _assertSignals = new WeakSet();\n assertSignals_fn = function(signals) {\n for (const signal of signals) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called watch/unwatch without a Computed or State argument\");\n }\n }\n };\n Signal2.isWatcher = (w) => __privateIn(_brand3, w);\n subtle2.Watcher = Watcher;\n function currentComputed() {\n var _a3;\n return (_a3 = getActiveConsumer()) == null ? void 0 : _a3.wrapper;\n }\n subtle2.currentComputed = currentComputed;\n subtle2.watched = Symbol(\"watched\");\n subtle2.unwatched = Symbol(\"unwatched\");\n })(Signal2.subtle || (Signal2.subtle = {}));\n})(Signal || (Signal = {}));\nexport {\n Signal\n};\n","import { Signal } from \"signal-polyfill\";\n//#region src/core/signals/primitives.ts\n/** Read a signal value without tracking it as a dependency. */\nconst untrack = Signal.subtle.untrack;\n/**\n* Read a signal's current value without tracking it as a dependency. Sugar\n* for `untrack(() => signal.get())` to reduce boilerplate at single-read\n* sites. Structurally typed to accept any signal-like (Signal, Computed,\n* ReadonlySignal).\n*\n* Accepts an optional `transform` to project the value in the same call;\n* the default is the identity function so the single-arg form returns `T`\n* unchanged.\n*\n* @example\n* const value = peek(someSignal);\n* const id = peek(presentationSignal, (p) => p?.id);\n*/\nfunction peek(source, transform = (v) => v) {\n\treturn untrack(() => transform(source.get()));\n}\n/** Create a writable reactive value. */\nfunction signal(initialValue, options) {\n\treturn new Signal.State(initialValue, options);\n}\n/** Create a computed reactive value. */\nfunction computed(fn, options) {\n\treturn new Signal.Computed(fn, options);\n}\nfunction update(signal, updater) {\n\tconst current = untrack(() => signal.get());\n\tif (typeof updater === \"function\") signal.set(updater(current));\n\telse signal.set({\n\t\t...current,\n\t\t...updater\n\t});\n}\n/**\n* Read every signal in a map and return a plain object snapshot. Each read\n* tracks in the surrounding Computed/Effect — equivalent to calling `.get()`\n* on a single `Signal<S>` over the merged shape.\n*\n* Convenience for behaviors that pass whole state/context snapshots to pure\n* helpers; prefer per-field reads when only a few fields are needed.\n*/\nfunction snapshot(map) {\n\tconst out = {};\n\tfor (const key in map) out[key] = map[key].get();\n\treturn out;\n}\n//#endregion\nexport { computed, peek, signal, snapshot, untrack, update };\n\n//# sourceMappingURL=primitives.js.map","import { signal } from \"../signals/primitives.js\";\n//#region src/core/composition/create-composition.ts\n/**\n* Create a composition from a set of behaviors.\n*\n* Composition unions the behaviors' declared `stateKeys` / `contextKeys`\n* to know which signals to create. Each signal is seeded from\n* `initialState` / `initialContext` when supplied, defaulting to\n* `undefined`. Behaviors are responsible for writing their own slots\n* once their preconditions are met.\n*\n* Cross-behavior type conflicts (e.g. two behaviors disagreeing on a\n* field's type) surface as a compose-time type error via\n* `ValidateComposition`.\n*\n* @example\n* ```ts\n* const composition = createComposition([resolvePresentation, switchVideoQuality], {\n* config: { parsePresentation: parseMultivariantPlaylist, initialBandwidth: 2_000_000 },\n* initialState: { bandwidthState: { fastEstimate: 0, ... } },\n* });\n* ```\n*/\n/**\n* Create a typed signal map for a given set of keys, seeded from an\n* optional partial initial value.\n*\n* Pipeline: `Set` dedupes the iterable (insertion order preserved, so\n* first occurrence wins) → `Object.fromEntries` materializes one\n* `signal()` per unique key, seeded from `initial[key]` or `undefined`.\n*\n* Per-key value types live in TypeScript only — at runtime every signal\n* is `Signal<unknown>`. The boundary cast at the return narrows the wide\n* `Record<PropertyKey, Signal<unknown>>` shape to the caller's expected\n* per-key types from `S`.\n*\n* Used by `createComposition` to derive engine state/context maps from\n* the union of behaviors' declared `stateKeys` / `contextKeys`.\n*\n* @example\n* ```ts\n* interface State { count?: number; label?: string }\n* const state = buildSignalMap<State>(['count', 'label'], { count: 5 });\n* state.count.get(); // 5\n* state.label.get(); // undefined\n* ```\n*/\nfunction buildSignalMap(keys, initial) {\n\tconst init = initial;\n\tconst uniqueKeys = new Set(keys);\n\treturn Object.fromEntries([...uniqueKeys].map((key) => [key, signal(init[key])]));\n}\nfunction createComposition(behaviors, options) {\n\tconst validBehaviors = behaviors;\n\tconst state = buildSignalMap(validBehaviors.flatMap((b) => b.stateKeys), options?.initialState ?? {});\n\tconst context = buildSignalMap(validBehaviors.flatMap((b) => b.contextKeys), options?.initialContext ?? {});\n\tconst deps = {\n\t\tstate,\n\t\tcontext,\n\t\tconfig: options?.config ?? {}\n\t};\n\tconst cleanups = validBehaviors.map((behavior) => behavior.setup(deps));\n\treturn {\n\t\tstate,\n\t\tcontext,\n\t\tasync destroy() {\n\t\t\tconst results = [];\n\t\t\tfor (const cleanup of cleanups) {\n\t\t\t\tif (cleanup == null) continue;\n\t\t\t\tif (typeof cleanup === \"function\") results.push(cleanup());\n\t\t\t\telse if (\"destroy\" in cleanup) results.push(cleanup.destroy());\n\t\t\t}\n\t\t\tawait Promise.all(results);\n\t\t\tfor (const sig of Object.values(state)) sig.set(void 0);\n\t\t\tfor (const sig of Object.values(context)) sig.set(void 0);\n\t\t}\n\t};\n}\nfunction defineBehavior(behavior) {\n\treturn behavior;\n}\n//#endregion\nexport { createComposition, defineBehavior };\n\n//# sourceMappingURL=create-composition.js.map","//#region src/core/composition/share-signals.ts\n/**\n* Behavior factory that hands the composition's signal refs to a\n* consumer-supplied callback (`config.onSignalsReady`) at setup time.\n*\n* Generic over `S` and `C` — the caller instantiates with their own\n* state/context types, and the callback's parameter shape is fully\n* type-driven from those. Suitable for both reads and writes (per-slot\n* intent can be expressed by typing captured refs as `Signal<T>` or\n* `ReadonlySignal<T>` at the call site).\n*\n* Declares no keys of its own (`stateKeys: []`, `contextKeys: []`); the\n* composition's state/context maps come from other behaviors' key\n* declarations. This behavior just observes/forwards whatever signals\n* the composition built.\n*\n* Uses a `Behavior<>` literal (not `defineBehavior`) so the empty key\n* arrays don't trip the exhaustiveness check — the setup-param state/\n* context shapes here describe what the consumer's callback receives,\n* not keys this behavior needs created.\n*/\nfunction makeShareSignals() {\n\treturn {\n\t\tstateKeys: [],\n\t\tcontextKeys: [],\n\t\tsetup: ({ state, context, config }) => {\n\t\t\tconfig.onSignalsReady?.({\n\t\t\t\tstate,\n\t\t\t\tcontext\n\t\t\t});\n\t\t}\n\t};\n}\n//#endregion\nexport { makeShareSignals };\n\n//# sourceMappingURL=share-signals.js.map","//#region src/media/dom/text/resolve-vtt-segment.ts\n/**\n* Parse a VTT segment using browser's native parser.\n*\n* Creates a dummy video element with a track element to leverage\n* the browser's optimized VTT parsing. Returns parsed VTTCue objects.\n*/\nlet dummyVideo = null;\nfunction ensureDummyVideo() {\n\tif (!dummyVideo) {\n\t\tdummyVideo = document.createElement(\"video\");\n\t\tdummyVideo.muted = true;\n\t\tdummyVideo.preload = \"none\";\n\t\tdummyVideo.style.display = \"none\";\n\t\tdummyVideo.crossOrigin = \"anonymous\";\n\t}\n\treturn dummyVideo;\n}\nfunction resolveVttSegment(url) {\n\tconst video = ensureDummyVideo();\n\tconst track = document.createElement(\"track\");\n\ttrack.kind = \"subtitles\";\n\ttrack.default = true;\n\treturn new Promise((resolve, reject) => {\n\t\tconst onLoad = () => {\n\t\t\tconst cues = [];\n\t\t\tconst textTrack = track.track;\n\t\t\tif (textTrack.cues) for (let i = 0; i < textTrack.cues.length; i++) {\n\t\t\t\tconst cue = textTrack.cues[i];\n\t\t\t\tif (cue) cues.push(cue);\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tresolve(cues);\n\t\t};\n\t\tconst onError = () => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`Failed to load VTT segment: ${url}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\ttrack.removeEventListener(\"load\", onLoad);\n\t\t\ttrack.removeEventListener(\"error\", onError);\n\t\t\tvideo.removeChild(track);\n\t\t};\n\t\ttrack.addEventListener(\"load\", onLoad);\n\t\ttrack.addEventListener(\"error\", onError);\n\t\tvideo.appendChild(track);\n\t\ttrack.src = url;\n\t});\n}\nfunction destroyVttResolver() {\n\tdummyVideo = null;\n}\n//#endregion\nexport { destroyVttResolver, resolveVttSegment };\n\n//# sourceMappingURL=resolve-vtt-segment.js.map","import { Signal } from \"signal-polyfill\";\n//#region src/core/signals/effect.ts\nconst pending = /* @__PURE__ */ new Set();\nconst watcher = new Signal.subtle.Watcher(() => {\n\tqueueMicrotask(runPending);\n});\nfunction runPending() {\n\tfor (const c of watcher.getPending()) pending.add(c);\n\twatcher.watch();\n\tfor (const c of pending) {\n\t\tpending.delete(c);\n\t\tc.get();\n\t}\n}\n/**\n* Run a side effect whenever its signal dependencies change.\n*\n* Executes immediately (synchronous initial run), then re-runs on the next\n* microtask after any dependency changes. If the callback returns a function,\n* it is called before each re-run and when the effect is stopped — the same\n* cleanup contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.\n*\n* Returns a cleanup function that stops the effect.\n*/\nfunction effect(fn) {\n\tlet cleanup;\n\tconst c = new Signal.Computed(() => {\n\t\tif (typeof cleanup === \"function\") cleanup();\n\t\tcleanup = fn();\n\t});\n\twatcher.watch(c);\n\tc.get();\n\treturn () => {\n\t\twatcher.unwatch(c);\n\t\tif (typeof cleanup === \"function\") cleanup();\n\t};\n}\n//#endregion\nexport { effect };\n\n//# sourceMappingURL=effect.js.map","import { signal, untrack, update } from \"./signals/primitives.js\";\n//#region src/core/machine.ts\n/**\n* Provisions the shared mechanics for all machine-like primitives: a snapshot\n* signal, an untracked state reader, and a transition function.\n*\n* Internal — consumed by `createMachineActor` and `createMachineReactor`. Not part of the\n* public API.\n*/\nfunction createMachineCore(initialSnapshot) {\n\tconst snapshotSignal = signal(initialSnapshot);\n\tconst getState = () => untrack(() => snapshotSignal.get().value);\n\tconst transition = (to) => update(snapshotSignal, (current) => ({\n\t\t...current,\n\t\tvalue: to\n\t}));\n\treturn {\n\t\tsnapshotSignal,\n\t\tgetState,\n\t\ttransition\n\t};\n}\n//#endregion\nexport { createMachineCore };\n\n//# sourceMappingURL=machine.js.map","import { untrack } from \"../signals/primitives.js\";\nimport { effect } from \"../signals/effect.js\";\nimport { createMachineCore } from \"../machine.js\";\n//#region src/core/reactors/create-machine-reactor.ts\nconst toArray = (x) => x === void 0 ? [] : Array.isArray(x) ? x : [x];\n/**\n* Creates a reactive Reactor from a declarative definition.\n*\n* A Reactor is driven by subscriptions to external signals rather than\n* imperative messages. Each state holds an array of effect functions —\n* every element becomes one independent `effect()` call gated on that state,\n* with its own dependency tracking and cleanup lifecycle.\n*\n* `'destroying'` and `'destroyed'` are always implicit terminal states.\n* `destroy()` transitions through both in sequence: `'destroying'` first (for\n* potential async teardown in a future extension), then immediately `'destroyed'`\n* for the synchronous base case. Active effect cleanups fire via disposal.\n*\n* @example\n* const reactor = createMachineReactor({\n* initial: 'waiting',\n* monitor: () => srcSignal.get() ? 'active' : 'waiting',\n* states: {\n* active: {\n* // entry: runs once on state entry; fn body is automatically untracked.\n* entry: () => listen(el, 'play', handler),\n* // effects: re-runs whenever tracked signals change.\n* effects: () => { currentTimeSignal.get(); return cleanup; },\n* },\n* waiting: {},\n* }\n* });\n*/\nfunction createMachineReactor(def) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({ value: def.initial });\n\tconst effectDisposals = [];\n\tconst wrapResult = (result) => {\n\t\tif (!result) return void 0;\n\t\tif (typeof result === \"function\") return result;\n\t\treturn () => result.abort();\n\t};\n\tconst untracked = (baseCall) => () => untrack(baseCall);\n\tconst isTerminal = (snapshot) => snapshot.value === \"destroying\" || snapshot.value === \"destroyed\";\n\tconst descriptors = [...toArray(def.monitor).map((fn) => ({\n\t\tfn: () => {\n\t\t\tconst target = fn();\n\t\t\tif (target !== getState()) transition(target);\n\t\t},\n\t\tshouldSkip: isTerminal\n\t})), ...Object.entries(def.states).flatMap(([state, stateDef]) => {\n\t\tconst isNotState = (snapshot) => snapshot.value !== state;\n\t\treturn [...toArray(stateDef.entry).map((fn) => ({\n\t\t\tfn,\n\t\t\tshouldSkip: isNotState,\n\t\t\ttoFnCall: untracked\n\t\t})), ...toArray(stateDef.effects).map((fn) => ({\n\t\t\tfn,\n\t\t\tshouldSkip: isNotState\n\t\t}))];\n\t})];\n\tconst toEffect = ({ fn, shouldSkip, toFnCall = (baseCall) => baseCall }) => effect(() => {\n\t\tif (shouldSkip(snapshotSignal.get())) return;\n\t\tconst baseCall = () => fn();\n\t\treturn wrapResult(toFnCall(baseCall)());\n\t});\n\teffectDisposals.push(...descriptors.map(toEffect));\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tdestroy() {\n\t\t\tconst state = getState();\n\t\t\tif (state === \"destroying\" || state === \"destroyed\") return;\n\t\t\ttransition(\"destroying\");\n\t\t\ttransition(\"destroyed\");\n\t\t\tfor (const dispose of effectDisposals) dispose();\n\t\t}\n\t};\n}\n//#endregion\nexport { createMachineReactor };\n\n//# sourceMappingURL=create-machine-reactor.js.map","//#region src/media/buffer/forward-buffer.ts\n/**\n* Default forward buffer configuration.\n*/\nconst DEFAULT_FORWARD_BUFFER_CONFIG = { bufferDuration: 30 };\n/**\n* Get segments that need to be loaded for forward buffer.\n*\n* Determines which segments to load to maintain target buffer duration.\n* Handles discontiguous buffering (gaps after seeks).\n*\n* Algorithm:\n* 1. Calculate target time: currentTime + bufferDuration\n* 2. Find all segments in range [currentTime, targetTime)\n* 3. Filter out segments already buffered at that time position\n* 4. Return segments to load (fills gaps + extends to target)\n*\n* @param segments - All available segments from playlist\n* @param bufferedSegments - Segments already buffered (ordered by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Array of segments to load (empty if buffer is sufficient)\n*\n* @example\n* // After seek: buffered [0-12, 18-30], playing at 7s\n* const toLoad = getSegmentsToLoad(segments, buffered, 7, { bufferDuration: 24 });\n* // Returns [seg-12, seg-30] (fills gap, extends to target 31s)\n*/\n/**\n* Calculate the start time from which to flush forward buffer content.\n*\n* Content that starts at or beyond `currentTime + bufferDuration` is no\n* longer needed for the current playback position and should be removed\n* from the SourceBuffer. This prevents unbounded accumulation of scattered\n* SourceBuffer content after seeks, which can cause QuotaExceededError on\n* long-form content.\n*\n* Returns `Infinity` when nothing needs flushing (no buffered segments\n* exist beyond the threshold).\n*\n* @param bufferedSegments - Segments currently tracked in the buffer model\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Start time to flush from (flush range: [flushStart, Infinity)),\n* or Infinity if no flush is needed\n*\n* @example\n* // Playing at 0s, buffered [0,6,12,18,24,30,36], bufferDuration=30\n* const flushStart = calculateForwardFlushPoint(segments, 0);\n* // Returns 30 — flush [30, Infinity), keep [0, 30)\n*/\nfunction calculateForwardFlushPoint(bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (bufferedSegments.length === 0) return Infinity;\n\tconst threshold = currentTime + config.bufferDuration;\n\tconst beyond = bufferedSegments.filter((seg) => seg.startTime >= threshold);\n\tif (beyond.length === 0) return Infinity;\n\treturn Math.min(...beyond.map((seg) => seg.startTime));\n}\n/**\n* Find the start time of the segment containing `currentTime` (or the last\n* segment if `currentTime` is past the end). Returns `undefined` when\n* `currentTime` is undefined or when no segment matches.\n*\n* Used to detect \"meaningful currentTime change\" — two times that map to the\n* same segment start aren't a load-trigger; crossing a segment boundary is.\n*/\nfunction segmentStartForTime(currentTime, segments) {\n\tif (currentTime == null) return void 0;\n\treturn segments?.find(({ startTime, duration }, i, all) => currentTime >= startTime && (currentTime < startTime + duration || i === all.length - 1))?.startTime;\n}\nfunction getSegmentsToLoad(segments, bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (segments.length === 0) return [];\n\tconst targetTime = currentTime + config.bufferDuration;\n\tconst bufferedStartTimes = new Set(bufferedSegments.map((seg) => seg.startTime));\n\treturn segments.filter((seg) => {\n\t\tconst segmentEnd = seg.startTime + seg.duration;\n\t\tconst isInRange = seg.startTime < targetTime && segmentEnd > currentTime;\n\t\tconst isNotBuffered = !bufferedStartTimes.has(seg.startTime);\n\t\treturn isInRange && isNotBuffered;\n\t});\n}\n//#endregion\nexport { DEFAULT_FORWARD_BUFFER_CONFIG, calculateForwardFlushPoint, getSegmentsToLoad, segmentStartForTime };\n\n//# sourceMappingURL=forward-buffer.js.map","//#region src/media/types/index.ts\n/**\n* Floating-point tolerance for matching segments by `startTime`. Two\n* segments are considered the same position when\n* `Math.abs(a.startTime - b.startTime) < SEGMENT_TIME_EPSILON`. Used by\n* the source-buffer dedup and segment-loader quality-aware filter to\n* tolerate sub-millisecond drift in segment timestamps across multiple\n* playlists / quality levels.\n*/\nconst SEGMENT_TIME_EPSILON = 1e-4;\nfunction isResolvedTrack(track) {\n\treturn \"segments\" in track;\n}\n/**\n* Check if a presentation has duration (at least one track resolved).\n* Narrows type to include required duration.\n*/\nfunction hasPresentationDuration(presentation) {\n\treturn presentation.duration !== void 0;\n}\n/**\n* Narrows a `MaybeResolvedPresentation` to a fully resolved `Presentation`.\n*\n* A presentation is resolved once `resolvePresentation` has parsed the\n* manifest and populated both `id` and `selectionSets`. Both must be\n* present — a partial value with only one of them isn't usable, and\n* letting it through would have downstream behaviors crash when they\n* access `selectionSets`.\n*/\nfunction isResolvedPresentation(presentation) {\n\treturn presentation !== void 0 && presentation.id !== void 0 && presentation.selectionSets !== void 0;\n}\n//#endregion\nexport { SEGMENT_TIME_EPSILON, hasPresentationDuration, isResolvedPresentation, isResolvedTrack };\n\n//# sourceMappingURL=index.js.map","import { isResolvedTrack } from \"../types/index.js\";\n//#region src/media/utils/tracks.ts\n/**\n* Get the tracks of the given type from a presentation's first switching set.\n*\n* Returns `[]` when the presentation is unresolved, when no selection set of\n* `type` exists, or when its first switching set is empty. Returned tracks may\n* be partially resolved (URL only) or fully resolved (with segments) — callers\n* narrow as needed.\n*\n* The \"first switching set\" assumption matches the rest of the codebase\n* (HLS typically has one switching set per type); multi-group / multi-period\n* support would generalize this.\n*/\nfunction getTracksByType(presentation, type) {\n\treturn presentation.selectionSets?.find(({ type: t }) => t === type)?.switchingSets[0]?.tracks ?? [];\n}\n/**\n* Find a track of the given type and id within a presentation.\n*\n* Returns the matching track from the first switching set of the matching\n* selection set, or `undefined` if either is missing. The returned track may\n* be partially resolved (URL only) or fully resolved (with segments) — callers\n* narrow as needed.\n*/\nfunction findTrack(presentation, type, trackId) {\n\treturn getTracksByType(presentation, type).find(({ id }) => id === trackId);\n}\n/**\n* Find a track by id across all selection sets in a presentation, without\n* knowing its type up front. Used when the caller has a track id obtained\n* from a downstream consumer (e.g. `SourceBufferActor.initTrackId`) and\n* needs to locate the corresponding track in the presentation.\n*\n* Track ids are unique within a presentation per the HLS spec; the first\n* match wins.\n*/\nfunction findTrackById(presentation, trackId) {\n\tfor (const selectionSet of presentation.selectionSets ?? []) {\n\t\tconst track = selectionSet.switchingSets[0]?.tracks.find(({ id }) => id === trackId);\n\t\tif (track) return track;\n\t}\n}\n/**\n* Find a text track of the given id within a presentation and narrow it to\n* the fully-resolved `TextTrack` shape (segments populated). Returns\n* `undefined` if no track matches the id, the matching track isn't a text\n* track, or it hasn't been resolved yet.\n*\n* The segments-non-empty check stays at the call site — a resolved track\n* with zero segments is a valid state, distinct from \"ready to load.\"\n*/\nfunction findResolvedTextTrack(presentation, trackId) {\n\tif (!presentation || !trackId) return void 0;\n\tconst track = findTrack(presentation, \"text\", trackId);\n\tif (!track || track.type !== \"text\" || !isResolvedTrack(track)) return void 0;\n\treturn track;\n}\nfunction findResolvedVideoTrack(presentation, trackId) {\n\tif (!presentation || !trackId) return void 0;\n\tconst track = findTrack(presentation, \"video\", trackId);\n\tif (!track || track.type !== \"video\" || !isResolvedTrack(track)) return void 0;\n\treturn track;\n}\nfunction findResolvedAudioTrack(presentation, trackId) {\n\tif (!presentation || !trackId) return void 0;\n\tconst track = findTrack(presentation, \"audio\", trackId);\n\tif (!track || track.type !== \"audio\" || !isResolvedTrack(track)) return void 0;\n\treturn track;\n}\n/**\n* Whether a track carries a non-empty `codecs` array. Both partially-\n* resolved and fully-resolved tracks may carry codecs — they come from\n* the multivariant playlist's `EXT-X-STREAM-INF` line, not from the\n* per-type media playlist — so this works at either resolution stage.\n*\n* `TextTrack` doesn't declare a `codecs` field; the `'codecs' in track`\n* check narrows it out for the false branch.\n*/\nfunction hasCodecs(track) {\n\treturn !!track && \"codecs\" in track && !!track.codecs?.length;\n}\n/**\n* Updates a track within a presentation (immutably). Generic — works for\n* video, audio, or text tracks.\n*/\nfunction updateTrackInPresentation(presentation, resolvedTrack) {\n\tconst trackId = resolvedTrack.id;\n\treturn {\n\t\t...presentation,\n\t\tselectionSets: presentation.selectionSets.map((selectionSet) => ({\n\t\t\t...selectionSet,\n\t\t\tswitchingSets: selectionSet.switchingSets.map((switchingSet) => ({\n\t\t\t\t...switchingSet,\n\t\t\t\ttracks: switchingSet.tracks.map((track) => track.id === trackId ? resolvedTrack : track)\n\t\t\t}))\n\t\t}))\n\t};\n}\n//#endregion\nexport { findResolvedAudioTrack, findResolvedTextTrack, findResolvedVideoTrack, findTrack, findTrackById, getTracksByType, hasCodecs, updateTrackInPresentation };\n\n//# sourceMappingURL=tracks.js.map","//#region src/playback/behaviors/track-types.ts\n/**\n* **Per-type config bundles for per-type behavior variants.**\n*\n* Each `*_TYPE_CONFIG` constant names the per-type slot keys that\n* per-type-variant setup-shape helpers consume. Variants reference the\n* shared constant at their `defineBehavior` setup body rather than\n* constructing the config inline, so the per-type identity (which state\n* slot, which context slot, which discriminant) lives in one place per\n* type.\n*\n* Variants spread their composition-time `config` over the defaults so\n* engines can layer composition-supplied additions on top (e.g. a\n* custom fetch closure, a non-default segment resolver). Defaults\n* first, engine config second.\n*\n* Helpers continue to consume their slice via the existing typed-key\n* generics (`<K extends SelectedTrackKey>` etc.); the extra fields on\n* the config object (carrying facets other helpers care about) are fine\n* under structural typing.\n*/\n/**\n* Type-identity bundle for video-track-typed behaviors.\n*\n* @see setupVideoBufferActors, loadVideoSegments\n*/\nconst VIDEO_TYPE_CONFIG = {\n\ttype: \"video\",\n\tselectedKey: \"selectedVideoTrackId\",\n\tactorKey: \"videoBufferActor\",\n\tloaderKey: \"videoSegmentLoaderActor\"\n};\n/**\n* Type-identity bundle for audio-track-typed behaviors.\n*\n* @see setupAudioBufferActors, loadAudioSegments\n*/\nconst AUDIO_TYPE_CONFIG = {\n\ttype: \"audio\",\n\tselectedKey: \"selectedAudioTrackId\",\n\tactorKey: \"audioBufferActor\",\n\tloaderKey: \"audioSegmentLoaderActor\"\n};\n/**\n* Type-identity bundle for text-track-typed behaviors. Text tracks have\n* no `SourceBufferActor` (MSE doesn't apply), so this bundle omits\n* `actorKey`. The `loaderKey` points at the text-track-segment-loader\n* actor (a `MessageActor` with continue-vs-preempt semantics, parallel\n* to v/a's `SegmentLoaderActor`).\n*\n* @see loadTextTrackSegments, setupTextTrackActors\n*/\nconst TEXT_TYPE_CONFIG = {\n\ttype: \"text\",\n\tselectedKey: \"selectedTextTrackId\",\n\tloaderKey: \"textTrackSegmentLoaderActor\"\n};\n//#endregion\nexport { AUDIO_TYPE_CONFIG, TEXT_TYPE_CONFIG, VIDEO_TYPE_CONFIG };\n\n//# sourceMappingURL=track-types.js.map","import { computed, peek } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { DEFAULT_FORWARD_BUFFER_CONFIG, segmentStartForTime } from \"../../../media/buffer/forward-buffer.js\";\nimport { findResolvedAudioTrack, findResolvedTextTrack, findResolvedVideoTrack } from \"../../../media/utils/tracks.js\";\nimport { AUDIO_TYPE_CONFIG, TEXT_TYPE_CONFIG, VIDEO_TYPE_CONFIG } from \"../track-types.js\";\n//#region src/playback/behaviors/dom/load-segments.ts\n/**\n* **Per-type segment loading dispatch.** Per available track type (video /\n* audio / text), reads the per-type segment-loader actor from context and\n* sends typed `'load'` messages whenever a meaningful loading condition\n* changes (selected track, current time crossing a segment boundary).\n*\n* Loader-actor lifecycle is owned upstream:\n* - Video: `setupVideoBufferActors`\n* - Audio: `setupAudioBufferActors`\n* - Text: `setupTextTrackActors`\n*\n* This behavior is pure-consumer: it reads `context[loaderKey]` and\n* dispatches typed messages via the variant's per-type `findResolvedTrack`\n* resolver.\n*\n* # Load modes as reactor states\n*\n* Four states encode the load-gating policy directly:\n*\n* - `'preconditions-unmet'` — no loader actor in context, or the selected\n* track hasn't resolved.\n* - `'dormant'` — `preload === 'none' && !loadActivated`. Nothing fires.\n* - `'metadata-only'` — `!loadActivated && preload !== 'auto' && preload !== 'none'`.\n* Fires an init-segment-only `load` message **once on entry**. The\n* variant's loader actor decides what to do — v/a's actor fetches the\n* init segment; text's actor no-ops (no init concept).\n* - `'full-range'` — `loadActivated || preload === 'auto'`. Effect re-fires\n* on selected-track change and on segment-boundary crossing.\n*\n* # Per-type parameterization (inference-driven)\n*\n* The helper is generic over `Track` — the resolved-track type. Each\n* variant supplies its own `findResolvedTrack` resolver via config; TS\n* infers `Track` from the resolver's return type. The loader signal's\n* value type is constrained to `SegmentLoaderLike<Track>` — anything with\n* a `send` method accepting the `Track`-parameterized message. Concrete\n* actor types (`SegmentLoaderActor`, `TextTrackSegmentLoaderActor`)\n* satisfy this via function-parameter contravariance: an actor whose\n* `.send` accepts a wider track type is assignable to a slot expecting a\n* narrower track type.\n*\n* No widening of actor message types is needed; no casts inside the\n* helper. Per-variant wiring (right loader paired with right resolver)\n* is enforced at the variant call site.\n*/\n/**\n* Specialization helper. Generic over `Track` (inferred from\n* `findResolvedTrack`'s return type). The loader value type is\n* constrained to `SegmentLoaderLike<Track>` — concrete actor types\n* (whose `.send` accepts a wider track union) satisfy this via\n* function-parameter contravariance.\n*\n* Tracks that the helper handles must have a `segments` field — used by\n* `segmentBoundarySignal` to compute the load-anchor boundary. Each\n* variant's resolver narrows to the right resolved-track shape.\n*/\nfunction setupSegmentLoading({ state, context, config }) {\n\tconst { selectedKey, loaderKey, findResolvedTrack } = config;\n\tconst bufferDuration = config.forwardBuffer?.bufferDuration ?? DEFAULT_FORWARD_BUFFER_CONFIG.bufferDuration;\n\tconst selectedTrack = computed(() => findResolvedTrack(state.presentation.get(), state[selectedKey].get()));\n\tconst segmentBoundarySignal = computed(() => {\n\t\tconst track = selectedTrack.get();\n\t\tif (!track) return void 0;\n\t\treturn segmentStartForTime(state.currentTime.get() ?? 0, track.segments);\n\t});\n\tconst derivedStateSignal = computed(() => {\n\t\tif (!context[loaderKey].get() || !selectedTrack.get()) return \"preconditions-unmet\";\n\t\tif (state.loadActivated.get() || state.preload.get() === \"auto\") return \"full-range\";\n\t\tif (state.preload.get() === \"none\") return \"dormant\";\n\t\treturn \"metadata-only\";\n\t});\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\tdormant: {},\n\t\t\t\"metadata-only\": { entry: () => {\n\t\t\t\tconst track = selectedTrack.get();\n\t\t\t\tcontext[loaderKey].get().send({\n\t\t\t\t\ttype: \"load\",\n\t\t\t\t\ttrack\n\t\t\t\t});\n\t\t\t} },\n\t\t\t\"full-range\": { effects: () => {\n\t\t\t\tconst track = selectedTrack.get();\n\t\t\t\tsegmentBoundarySignal.get();\n\t\t\t\tconst currentTime = peek(state.currentTime) ?? 0;\n\t\t\t\tpeek(context[loaderKey]).send({\n\t\t\t\t\ttype: \"load\",\n\t\t\t\t\ttrack,\n\t\t\t\t\trange: {\n\t\t\t\t\t\tstart: currentTime,\n\t\t\t\t\t\tend: currentTime + bufferDuration\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} }\n\t\t}\n\t});\n}\nconst VIDEO_SEGMENT_LOADING_CONFIG = {\n\t...VIDEO_TYPE_CONFIG,\n\tfindResolvedTrack: findResolvedVideoTrack\n};\nconst AUDIO_SEGMENT_LOADING_CONFIG = {\n\t...AUDIO_TYPE_CONFIG,\n\tfindResolvedTrack: findResolvedAudioTrack\n};\nconst TEXT_SEGMENT_LOADING_CONFIG = {\n\t...TEXT_TYPE_CONFIG,\n\tfindResolvedTrack: findResolvedTextTrack\n};\nconst loadVideoSegments = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"preload\",\n\t\t\"currentTime\",\n\t\t\"loadActivated\",\n\t\t\"selectedVideoTrackId\"\n\t],\n\tcontextKeys: [\"videoSegmentLoaderActor\"],\n\tsetup: ({ state, context, config = {} }) => setupSegmentLoading({\n\t\tstate,\n\t\tcontext,\n\t\tconfig: {\n\t\t\t...VIDEO_SEGMENT_LOADING_CONFIG,\n\t\t\t...config\n\t\t}\n\t})\n});\nconst loadAudioSegments = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"preload\",\n\t\t\"currentTime\",\n\t\t\"loadActivated\",\n\t\t\"selectedAudioTrackId\"\n\t],\n\tcontextKeys: [\"audioSegmentLoaderActor\"],\n\tsetup: ({ state, context, config = {} }) => setupSegmentLoading({\n\t\tstate,\n\t\tcontext,\n\t\tconfig: {\n\t\t\t...AUDIO_SEGMENT_LOADING_CONFIG,\n\t\t\t...config\n\t\t}\n\t})\n});\nconst loadTextTrackSegments = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"preload\",\n\t\t\"currentTime\",\n\t\t\"loadActivated\",\n\t\t\"selectedTextTrackId\"\n\t],\n\tcontextKeys: [\"textTrackSegmentLoaderActor\"],\n\tsetup: ({ state, context, config = {} }) => setupSegmentLoading({\n\t\tstate,\n\t\tcontext,\n\t\tconfig: {\n\t\t\t...TEXT_SEGMENT_LOADING_CONFIG,\n\t\t\t...config\n\t\t}\n\t})\n});\n//#endregion\nexport { loadAudioSegments, loadTextTrackSegments, loadVideoSegments };\n\n//# sourceMappingURL=load-segments.js.map","import { untrack, update } from \"../signals/primitives.js\";\nimport { createMachineCore } from \"../machine.js\";\n//#region src/core/actors/create-transition-actor.ts\n/**\n* Creates a reducer-shaped actor from an initial context and a reducer function.\n*\n* The reducer receives the current context and a message and returns the next\n* context. Returning the same reference (by identity) skips the signal update —\n* so early-returning `context` unchanged is both the no-op and the optimization.\n*\n* Side effects (e.g. DOM mutations) may be performed inside the reducer.\n* They run synchronously before the signal is updated.\n*\n* @example\n* const actor = createTransitionActor(\n* { count: 0 },\n* (context, message: { type: 'increment' }) => ({ count: context.count + 1 })\n* );\n*/\nfunction createTransitionActor(initialContext, reducer) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: \"active\",\n\t\tcontext: initialContext\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => update(snapshotSignal, { context });\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\tconst context = getContext();\n\t\t\tconst newContext = reducer(context, message);\n\t\t\tif (newContext !== context) setContext(newContext);\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createTransitionActor };\n\n//# sourceMappingURL=create-transition-actor.js.map","import { createTransitionActor } from \"../../../core/actors/create-transition-actor.js\";\n//#region src/playback/actors/dom/text-tracks.ts\nfunction isDuplicateCue(cue, existing) {\n\treturn existing.some((r) => r.startTime === cue.startTime && r.endTime === cue.endTime && r.text === cue.text);\n}\n/** TextTrack actor: wraps all text tracks on a media element, owns cue operations. */\nfunction createTextTracksActor(mediaElement) {\n\treturn createTransitionActor({\n\t\tloaded: {},\n\t\tsegments: {}\n\t}, (context, message) => {\n\t\tif (message.type === \"clear\") return {\n\t\t\tloaded: {},\n\t\t\tsegments: {}\n\t\t};\n\t\tconst { meta, cues } = message;\n\t\tconst { trackId, id: segmentId, startTime, duration } = meta;\n\t\tconst textTrack = Array.from(mediaElement.textTracks).find((t) => t.id === trackId);\n\t\tif (!textTrack) return context;\n\t\tconst existingCues = context.loaded[trackId] ?? [];\n\t\tconst existingSegments = context.segments[trackId] ?? [];\n\t\tconst prunedCues = cues.filter((cue) => !isDuplicateCue(cue, existingCues));\n\t\tconst segmentAlreadyLoaded = existingSegments.some((s) => s.id === segmentId);\n\t\tif (prunedCues.length === 0 && segmentAlreadyLoaded) return context;\n\t\tfor (const cue of prunedCues) textTrack.addCue(cue);\n\t\treturn {\n\t\t\t...context,\n\t\t\tloaded: {\n\t\t\t\t...context.loaded,\n\t\t\t\t[trackId]: [...existingCues, ...prunedCues]\n\t\t\t},\n\t\t\tsegments: segmentAlreadyLoaded ? context.segments : {\n\t\t\t\t...context.segments,\n\t\t\t\t[trackId]: [...existingSegments, {\n\t\t\t\t\tid: segmentId,\n\t\t\t\t\tstartTime,\n\t\t\t\t\tduration\n\t\t\t\t}]\n\t\t\t}\n\t\t};\n\t});\n}\n//#endregion\nexport { createTextTracksActor };\n\n//# sourceMappingURL=text-tracks.js.map","import { anyAbortSignal } from \"@videojs/utils/events\";\nimport { generateId } from \"@videojs/utils/string\";\n//#region src/core/tasks/task.ts\n/**\n* Generic reusable task that wraps an async run function.\n*\n* Owns its own AbortController so it can always be aborted independently.\n* Optionally composes an external AbortSignal so that a parent's cancellation\n* propagates into the task's work without requiring the caller to track the\n* task separately.\n*\n* Ordering guarantee: `value` is written before `status` transitions to `'done'`;\n* `error` is written before `status` transitions to `'error'`. Any reader\n* observing `status === 'done'` is guaranteed `value` is already present.\n*/\nvar Task = class {\n\tid;\n\t#runFn;\n\t#abortController = new AbortController();\n\t#signal;\n\t#status = \"pending\";\n\t#value = void 0;\n\t#error = void 0;\n\tconstructor(runFn, config) {\n\t\tthis.#runFn = runFn;\n\t\tconst rawId = config?.id;\n\t\tthis.id = typeof rawId === \"function\" ? rawId() : rawId ?? generateId();\n\t\tthis.#signal = config?.signal ? anyAbortSignal([this.#abortController.signal, config.signal]) : this.#abortController.signal;\n\t}\n\tget status() {\n\t\treturn this.#status;\n\t}\n\tget value() {\n\t\treturn this.#value;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tasync run() {\n\t\tthis.#status = \"running\";\n\t\ttry {\n\t\t\tconst result = await this.#runFn(this.#signal);\n\t\t\tthis.#value = result;\n\t\t\tthis.#status = \"done\";\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tthis.#error = e;\n\t\t\tthis.#status = \"error\";\n\t\t\tthrow e;\n\t\t}\n\t}\n\tabort() {\n\t\tthis.#abortController.abort();\n\t}\n};\n/**\n* Runs tasks concurrently, deduplicated by task id.\n*\n* If a task with a given id is already in flight, subsequent schedule() calls\n* for that id are silently ignored until the first completes. Tasks are stored\n* so abortAll() can cancel any in-flight work (e.g. on engine cleanup).\n*/\nvar ConcurrentRunner = class {\n\t#pending = /* @__PURE__ */ new Map();\n\t#settled = Promise.resolve();\n\t#resolveSettled = null;\n\t#destroyed = false;\n\tschedule(task) {\n\t\tif (this.#destroyed) return Promise.resolve();\n\t\tconst existing = this.#pending.get(task.id);\n\t\tif (existing) return existing.promise;\n\t\tif (this.#pending.size === 0) this.#settled = new Promise((resolve) => {\n\t\t\tthis.#resolveSettled = resolve;\n\t\t});\n\t\tconst promise = task.run();\n\t\tpromise.catch(() => {});\n\t\tconst cleanup = () => {\n\t\t\tthis.#pending.delete(task.id);\n\t\t\tif (this.#pending.size === 0) {\n\t\t\t\tthis.#resolveSettled?.();\n\t\t\t\tthis.#resolveSettled = null;\n\t\t\t}\n\t\t};\n\t\tpromise.then(cleanup, cleanup);\n\t\tthis.#pending.set(task.id, {\n\t\t\ttask,\n\t\t\tpromise\n\t\t});\n\t\treturn promise;\n\t}\n\t/**\n\t* Registers a callback to fire when all currently in-flight tasks settle.\n\t* If the runner is already idle, the callback is never called. If abortAll()\n\t* is called before the batch settles, the callback is superseded and silently\n\t* dropped — no stale callbacks, no generation token required by the caller.\n\t*/\n\twhenSettled(callback) {\n\t\tif (this.#pending.size === 0) return;\n\t\tconst captured = this.#settled;\n\t\tcaptured.then(() => {\n\t\t\tif (this.#settled !== captured) return;\n\t\t\tcallback();\n\t\t}, () => {});\n\t}\n\tabortAll() {\n\t\tfor (const { task } of this.#pending.values()) task.abort();\n\t\tthis.#pending.clear();\n\t\tthis.#resolveSettled?.();\n\t\tthis.#resolveSettled = null;\n\t\tthis.#settled = Promise.resolve();\n\t}\n\tdestroy() {\n\t\tthis.#destroyed = true;\n\t\tthis.abortAll();\n\t}\n};\n/**\n* Runs tasks one at a time in submission order.\n*\n* Each schedule() call returns a Promise that resolves or rejects with the\n* task's result when it is eventually executed. Tasks wait in queue until the\n* prior task completes.\n*\n* Serialization is achieved by chaining each task's run() onto the tail of a\n* shared promise chain — no explicit queue or drain loop needed.\n*\n* abortAll() aborts all pending (not yet started) tasks and the currently\n* in-flight task. Pending tasks still run briefly but receive an aborted\n* signal and are expected to exit early.\n*/\nvar SerialRunner = class {\n\t#chain = Promise.resolve();\n\t#pending = /* @__PURE__ */ new Set();\n\t#current = null;\n\t#destroyed = false;\n\tschedule(task) {\n\t\tif (this.#destroyed) return Promise.resolve();\n\t\tconst t = task;\n\t\tthis.#pending.add(t);\n\t\tconst result = this.#chain.then(() => {\n\t\t\tthis.#pending.delete(t);\n\t\t\tthis.#current = t;\n\t\t\treturn task.run();\n\t\t}).finally(() => {\n\t\t\tthis.#current = null;\n\t\t});\n\t\tthis.#chain = result.then(() => {}, () => {});\n\t\treturn result;\n\t}\n\t/**\n\t* A promise that resolves when all currently-scheduled tasks have settled.\n\t* Use the reference as a generation token: capture it after scheduling a\n\t* batch, then check identity in the resolution callback to detect whether\n\t* a subsequent abortAll() + new batch has superseded this one.\n\t*/\n\tget settled() {\n\t\treturn this.#chain;\n\t}\n\t/**\n\t* Registers a callback to fire when all currently-pending tasks settle.\n\t* If the runner is already idle (no pending or running tasks), the callback\n\t* is never called. If new tasks are scheduled before the current batch\n\t* settles, the callback is superseded and silently dropped — no stale\n\t* callbacks, no generation token required by the caller.\n\t*/\n\twhenSettled(callback) {\n\t\tif (this.#pending.size === 0 && this.#current === null) return;\n\t\tconst currentChain = this.#chain;\n\t\tcurrentChain.then(() => {\n\t\t\tif (this.#chain !== currentChain) return;\n\t\t\tcallback();\n\t\t}, () => {});\n\t}\n\t/** Aborts and clears queued tasks without touching the in-flight task. */\n\tabortPending() {\n\t\tfor (const task of this.#pending) task.abort();\n\t\tthis.#pending.clear();\n\t}\n\tabortAll() {\n\t\tthis.abortPending();\n\t\tthis.#current?.abort();\n\t}\n\tdestroy() {\n\t\tthis.#destroyed = true;\n\t\tthis.abortAll();\n\t}\n};\n//#endregion\nexport { ConcurrentRunner, SerialRunner, Task };\n\n//# sourceMappingURL=task.js.map","import { untrack, update } from \"../signals/primitives.js\";\nimport { createMachineCore } from \"../machine.js\";\n//#region src/core/actors/create-machine-actor.ts\n/**\n* Creates a message-driven actor from a declarative definition.\n*\n* The actor owns a reactive snapshot signal (state + context), an optional\n* runner, and dispatches incoming messages to per-state handlers. `'destroyed'`\n* is always the implicit terminal state — `destroy()` transitions there\n* unconditionally and all subsequent `send()` calls are no-ops.\n*\n* When a state declares `onSettled`, the framework calls `runner.whenSettled()`\n* after the handler returns. The runner owns the generation-token logic — if\n* new tasks are scheduled before the current batch settles, the callback is\n* automatically superseded.\n*\n* @example\n* const actor = createMachineActor({\n* runner: () => new SerialRunner(),\n* initial: 'idle',\n* context: {},\n* states: {\n* idle: {\n* on: {\n* load: (msg, { transition, runner }) => {\n* segments.forEach(s => runner.schedule(new Task(...)));\n* transition('loading');\n* }\n* }\n* },\n* loading: {\n* onSettled: 'idle',\n* on: {\n* load: (msg, { runner }) => {\n* runner.abortAll();\n* segments.forEach(s => runner.schedule(new Task(...)));\n* }\n* }\n* }\n* }\n* });\n*/\nfunction createMachineActor(def) {\n\tconst runner = def.runner?.();\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: def.initial,\n\t\tcontext: def.context\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => {\n\t\tupdate(snapshotSignal, { context });\n\t};\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tconst state = getState();\n\t\t\tif (state === \"destroyed\") return;\n\t\t\tconst handler = def.states[state]?.on?.[message.type];\n\t\t\tif (!handler) return;\n\t\t\thandler(message, {\n\t\t\t\tcontext: getContext(),\n\t\t\t\tgetContext,\n\t\t\t\ttransition: (to) => transition(to),\n\t\t\t\tsetContext,\n\t\t\t\t...runner ? { runner } : {}\n\t\t\t});\n\t\t\tconst newState = getState();\n\t\t\tif (newState !== \"destroyed\") {\n\t\t\t\tconst newStateDef = def.states[newState];\n\t\t\t\tif (newStateDef?.onSettled && runner) {\n\t\t\t\t\tconst targetState = newStateDef.onSettled;\n\t\t\t\t\trunner.whenSettled(() => {\n\t\t\t\t\t\tif (getState() !== newState) return;\n\t\t\t\t\t\ttransition(targetState);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\trunner?.destroy();\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createMachineActor };\n\n//# sourceMappingURL=create-machine-actor.js.map","import { peek } from \"../../core/signals/primitives.js\";\nimport { SerialRunner, Task } from \"../../core/tasks/task.js\";\nimport { createMachineActor } from \"../../core/actors/create-machine-actor.js\";\nimport { DEFAULT_FORWARD_BUFFER_CONFIG, getSegmentsToLoad } from \"../../media/buffer/forward-buffer.js\";\n//#region src/playback/actors/text-track-segment-loader.ts\n/**\n* Loads text-track segments for a track and delegates cue management\n* to a TextTracksActor. Mirrors the v/a `SegmentLoaderActor` shape (FSM\n* with `idle` / `loading` and `inFlight*` context for continue-vs-preempt),\n* adapted to text:\n*\n* - No init segment, no flush ops (text cues don't need eviction — they're\n* small and the playhead-relative window is enforced by the runtime).\n* - Single in-flight identity (`inFlightSegmentId`) — text has only the\n* media-segment path, no init-segment path.\n*\n* Planning is done in the load handler on every incoming message:\n* `getSegmentsToLoad` filters to the forward window, then the segments\n* not already in `TextTracksActor`'s context are scheduled. When a new\n* `load` arrives mid-run, the handler replans and either:\n*\n* - **Continues**: the in-flight segment is still in the new plan →\n* `abortPending` only, schedule the rest of the plan (minus the\n* in-flight item, which covers its slot).\n* - **Preempts**: in-flight segment is no longer wanted (track switch,\n* large seek out of window) → `abortAll`, schedule the new plan\n* from scratch.\n*\n* The cue parser is injected so this factory is host-agnostic. A DOM\n* host supplies a VTT parser backed by `<track>`/`TextTrack` APIs; a\n* non-DOM host (worker, test fake, alternate runtime) supplies its own.\n*/\nfunction createTextTrackSegmentLoaderActor(textTracksActor, resolveSegment, config = {}) {\n\tconst forwardBufferConfig = {\n\t\t...DEFAULT_FORWARD_BUFFER_CONFIG,\n\t\t...config.forwardBuffer\n\t};\n\t/**\n\t* Translate a load message into an ordered TextLoadTask list based on\n\t* committed actor state. In-flight awareness is handled separately in\n\t* the `loading` state's load handler.\n\t*\n\t* Metadata mode (no `range`) is a no-op for text — text tracks have\n\t* no init-segment concept, so there's nothing to load until a range\n\t* arrives via `'full-range'` dispatch.\n\t*/\n\tconst planTasks = (message) => {\n\t\tconst { track, range } = message;\n\t\tif (!range) return [];\n\t\tconst trackId = track.id;\n\t\tconst bufferedSegments = peek(textTracksActor.snapshot).context.segments[trackId] ?? [];\n\t\treturn getSegmentsToLoad(track.segments, bufferedSegments, range.start, forwardBufferConfig).map((segment) => ({\n\t\t\tsegment,\n\t\t\ttrackId\n\t\t}));\n\t};\n\t/**\n\t* Wraps a TextLoadTask into a Task that fetches + dispatches `add-cues`.\n\t* Updates `inFlightSegmentId` around the fetch so the load handler can\n\t* make accurate continue/preempt decisions.\n\t*/\n\tconst makeLoadTask = (op, { getContext, setContext }) => {\n\t\treturn new Task(async (signal) => {\n\t\t\tif (signal.aborted) return;\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightTrackId: op.trackId,\n\t\t\t\tinFlightSegmentId: op.segment.id\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst cues = await resolveSegment(op.segment.url);\n\t\t\t\tif (signal.aborted) return;\n\t\t\t\ttextTracksActor.send({\n\t\t\t\t\ttype: \"add-cues\",\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttrackId: op.trackId,\n\t\t\t\t\t\tid: op.segment.id,\n\t\t\t\t\t\tstartTime: op.segment.startTime,\n\t\t\t\t\t\tduration: op.segment.duration\n\t\t\t\t\t},\n\t\t\t\t\tcues\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to load text-track segment:\", error);\n\t\t\t} finally {\n\t\t\t\tsetContext({\n\t\t\t\t\t...getContext(),\n\t\t\t\t\tinFlightTrackId: null,\n\t\t\t\t\tinFlightSegmentId: null\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t};\n\tconst scheduleAll = (tasks, ctx) => {\n\t\tfor (const op of tasks) ctx.runner.schedule(makeLoadTask(op, ctx)).then(void 0, (e) => {\n\t\t\tif (e instanceof Error && e.name === \"AbortError\") return;\n\t\t\tconsole.error(\"Unexpected error in text-track segment loader:\", e);\n\t\t\tctx.runner.abortPending();\n\t\t});\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tinFlightTrackId: null,\n\t\t\tinFlightSegmentId: null\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: { load: (msg, ctx) => {\n\t\t\t\tconst tasks = planTasks(msg);\n\t\t\t\tif (tasks.length === 0) return;\n\t\t\t\tctx.transition(\"loading\");\n\t\t\t\tscheduleAll(tasks, ctx);\n\t\t\t} } },\n\t\t\tloading: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { load: (msg, ctx) => {\n\t\t\t\t\tconst { context, runner } = ctx;\n\t\t\t\t\tconst tasks = planTasks(msg);\n\t\t\t\t\tif (context.inFlightTrackId !== null && context.inFlightSegmentId !== null && tasks.some((t) => t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)) {\n\t\t\t\t\t\trunner.abortPending();\n\t\t\t\t\t\tscheduleAll(tasks.filter((t) => !(t.trackId === context.inFlightTrackId && t.segment.id === context.inFlightSegmentId)), ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trunner.abortAll();\n\t\t\t\t\t\tscheduleAll(tasks, ctx);\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createTextTrackSegmentLoaderActor };\n\n//# sourceMappingURL=text-track-segment-loader.js.map","import { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { effect } from \"../../../core/signals/effect.js\";\nimport { createTextTracksActor } from \"../../actors/dom/text-tracks.js\";\nimport { createTextTrackSegmentLoaderActor } from \"../../actors/text-track-segment-loader.js\";\n//#region src/playback/behaviors/dom/setup-text-track-actors.ts\n/**\n* **Own the TextTracks actor pair for the current `mediaElement`.** When a\n* `mediaElement` is in scope, creates the `TextTracksActor` (bound to the\n* element's `textTracks`) and the `TextTrackSegmentLoaderActor` (bound to\n* that actor + the injected cue resolver), and publishes both on\n* `context`. On element identity change or behavior destroy, destroys both\n* actors and clears the slots.\n*\n* Single-resource synchronous create/destroy driven by one signal — the\n* simple-effect form is the right shape (per `behaviors.md` → \"Where both\n* shapes are legitimate\": criterion 4b applies; sole writer of\n* `textTracksActor` / `textTrackSegmentLoaderActor`, the effect's cleanup\n* return handles destroy + slot clear structurally).\n*\n* Pairs with the `loadTextTrackSegments` behavior (a per-type variant of\n* `setupSegmentLoading` in `load-segments.ts`), which only reads\n* `textTrackSegmentLoaderActor`. The cue resolver is injected via\n* `config` so this behavior owns the DOM-bound part of the text-track\n* pipeline.\n*/\nfunction setupTextTrackActorsSetup({ context, config }) {\n\treturn effect(() => {\n\t\tconst mediaElement = context.mediaElement.get();\n\t\tif (!mediaElement) return;\n\t\tconst textTracksActor = createTextTracksActor(mediaElement);\n\t\tconst textTrackSegmentLoaderActor = createTextTrackSegmentLoaderActor(textTracksActor, config.resolveTextTrackSegment, { forwardBuffer: config.forwardBuffer });\n\t\tcontext.textTracksActor.set(textTracksActor);\n\t\tcontext.textTrackSegmentLoaderActor.set(textTrackSegmentLoaderActor);\n\t\treturn () => {\n\t\t\ttextTracksActor.destroy();\n\t\t\ttextTrackSegmentLoaderActor.destroy();\n\t\t\tcontext.textTracksActor.set(void 0);\n\t\t\tcontext.textTrackSegmentLoaderActor.set(void 0);\n\t\t};\n\t});\n}\nconst setupTextTrackActors = defineBehavior({\n\tstateKeys: [],\n\tcontextKeys: [\n\t\t\"mediaElement\",\n\t\t\"textTracksActor\",\n\t\t\"textTrackSegmentLoaderActor\"\n\t],\n\tsetup: setupTextTrackActorsSetup\n});\n//#endregion\nexport { setupTextTrackActors };\n\n//# sourceMappingURL=setup-text-track-actors.js.map","import { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { effect } from \"../../../core/signals/effect.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/playback/behaviors/dom/track-current-time.ts\n/**\n* Mirror `mediaElement.currentTime` into reactive state. Listens for:\n* - `timeupdate` — fires during playback (~4 Hz)\n* - `seeking` — fires when a seek begins; per spec, `currentTime` is already\n* at the new position when this event dispatches, so buffer management can\n* react immediately rather than waiting for `timeupdate`, which does not\n* fire while paused.\n*\n* Also syncs immediately when a media element becomes available.\n*\n* When no media element is attached, writes `config.defaultCurrentTime`\n* (default-default `0`, matching the HTMLMediaElement spec) so consumers\n* always see a defined position. Read-only mirror; does not push\n* `state.currentTime` back to the element.\n*/\nfunction trackCurrentTimeSetup({ state, context, config }) {\n\tconst defaultCurrentTime = config?.defaultCurrentTime ?? 0;\n\treturn effect(() => {\n\t\tconst mediaElement = context.mediaElement.get();\n\t\tif (!mediaElement) {\n\t\t\tstate.currentTime.set(defaultCurrentTime);\n\t\t\treturn;\n\t\t}\n\t\tconst sync = () => state.currentTime.set(mediaElement.currentTime);\n\t\tsync();\n\t\tconst removeTimeupdate = listen(mediaElement, \"timeupdate\", sync);\n\t\tconst removeSeeking = listen(mediaElement, \"seeking\", sync);\n\t\treturn () => {\n\t\t\tremoveTimeupdate();\n\t\t\tremoveSeeking();\n\t\t};\n\t});\n}\nconst trackCurrentTime = defineBehavior({\n\tstateKeys: [\"currentTime\"],\n\tcontextKeys: [\"mediaElement\"],\n\tsetup: trackCurrentTimeSetup\n});\n//#endregion\nexport { trackCurrentTime };\n\n//# sourceMappingURL=track-current-time.js.map","import { computed } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/playback/behaviors/dom/track-load-triggers.ts\n/**\n* Slot-driven FSM. The slot `loadActivated` is the canonical externally-\n* observable state; `deriveState` reads it (and the preconditions) to\n* derive the local FSM state. The slot is *both* the state and the data —\n* no separate internal bookkeeping.\n*\n* ```\n* 'preconditions-unmet' ⟷ 'monitoring' ⟷ 'load-active'\n*\n* preconditions-unmet → monitoring element + URL appear\n* monitoring → load-active slot flips true (listener fires\n* or external write)\n* load-active → monitoring within-state cleanup resets slot\n* (URL or element identity change)\n* any → preconditions-unmet element or URL → undefined\n*\n* any state → destroying → destroyed on destroy()\n* ```\n*/\nfunction deriveState(presentation, mediaElement, loadActivated) {\n\tif (!mediaElement || !presentation?.url) return \"preconditions-unmet\";\n\tif (loadActivated) return \"load-active\";\n\treturn \"monitoring\";\n}\n/**\n* Track preload-overriding events per source.\n*\n* Writes `state.loadActivated = true` the first time a `play` or `seeking`\n* event fires on the attached media element for the current source — or\n* immediately on entry if the element is already in such a state\n* (`!el.paused` or `el.seeking`), mirroring autoplay / native-controls /\n* direct-DOM-`play()` scenarios.\n*\n* Sticky-true *within a source identity*: subsequent play/pause/seek\n* cycles don't flip back. Source identity = (mediaElement, presentation\n* URL). Either changing — including direct in-place swap with no\n* `undefined` intermediate — resets the slot to `false`.\n*\n* Multi-writer with `hls/adapter.ts:play()` (which writes `true` directly\n* on programmatic play) is intentional — different domains. The adapter\n* records programmatic intent; this behavior is the DOM-side observer.\n* Pre-existing `true` writes are honored because `deriveState` reads the\n* slot — a `true` value routes directly to `'load-active'` without\n* entering `'monitoring'`.\n*\n* @example\n* const reactor = trackLoadTriggers.setup({ state, context });\n* // later:\n* reactor.destroy();\n*/\nfunction trackLoadTriggersSetup({ state, context }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), context.mediaElement.get(), state.loadActivated.get()));\n\tconst urlSignal = computed(() => state.presentation.get()?.url);\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\tmonitoring: { effects: () => {\n\t\t\t\tconst el = context.mediaElement.get();\n\t\t\t\tconst setLoadActivated = () => state.loadActivated.set(true);\n\t\t\t\tif (!el.paused || el.seeking) {\n\t\t\t\t\tsetLoadActivated();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cleanupPlay = listen(el, \"play\", setLoadActivated);\n\t\t\t\tconst cleanupSeeking = listen(el, \"seeking\", setLoadActivated);\n\t\t\t\treturn () => {\n\t\t\t\t\tcleanupPlay();\n\t\t\t\t\tcleanupSeeking();\n\t\t\t\t};\n\t\t\t} },\n\t\t\t\"load-active\": { effects: () => {\n\t\t\t\tcontext.mediaElement.get();\n\t\t\t\turlSignal.get();\n\t\t\t\treturn () => state.loadActivated.set(false);\n\t\t\t} }\n\t\t}\n\t});\n}\nconst trackLoadTriggers = defineBehavior({\n\tstateKeys: [\"loadActivated\", \"presentation\"],\n\tcontextKeys: [\"mediaElement\"],\n\tsetup: trackLoadTriggersSetup\n});\n//#endregion\nexport { trackLoadTriggers };\n\n//# sourceMappingURL=track-load-triggers.js.map","//#region src/media/dom/text/text-track-slots.ts\n/**\n* SPF-owned `<track>` selector. Each slot created by\n* `addSubtitlesTracksToMedia` carries this attribute so reads and removals can\n* filter SPF-owned tracks from host-page-owned ones.\n*/\nconst SPF_TRACK_SELECTOR = \"track[data-src-track]\";\n/**\n* Allocate text-track slots on `mediaElement` for each model track by creating\n* and appending `<track>` children. Marks each element with `data-src-track`\n* so it can be distinguished from `<track>` children the host page added\n* directly — used by `getShowingSubtitlesTrackFromMedia` and\n* `removeAllSubtitlesTracksFromMedia` to scope their reads/removals to\n* SPF-owned slots. The spec has no `removeTextTrack` API, so creating\n* `<track>` elements is the only mechanism for adding *and* removing entries\n* to `mediaElement.textTracks`.\n*/\nfunction addSubtitlesTracksToMedia(mediaElement, modelTextTracks) {\n\tfor (const modelTrack of modelTextTracks) {\n\t\tconst el = document.createElement(\"track\");\n\t\tel.id = modelTrack.id;\n\t\tel.kind = modelTrack.kind;\n\t\tel.label = modelTrack.label;\n\t\tel.toggleAttribute(\"data-src-track\", true);\n\t\tif (modelTrack.language) el.srclang = modelTrack.language;\n\t\tif (modelTrack.default) el.default = true;\n\t\tmediaElement.appendChild(el);\n\t}\n}\n/**\n* Return the SPF-owned subtitle/caption `TextTrack` currently in `'showing'`\n* mode, or `undefined` if none. Restricts the search to slots created by\n* `addSubtitlesTracksToMedia` (via the `data-src-track` selector) so a showing\n* track that the host page added directly is ignored — SPF selection only\n* mirrors tracks it owns.\n*/\nfunction getShowingSubtitlesTrackFromMedia(mediaElement) {\n\tconst elements = mediaElement.querySelectorAll(SPF_TRACK_SELECTOR);\n\tfor (const el of elements) {\n\t\tconst track = el.track;\n\t\tif (track.mode === \"showing\" && (track.kind === \"subtitles\" || track.kind === \"captions\")) return track;\n\t}\n}\n/**\n* Remove every SPF-owned `<track>` child from `mediaElement` (those tagged\n* with `data-src-track` by `addSubtitlesTracksToMedia`). `<track>` elements\n* the host page added directly are left in place.\n*/\nfunction removeAllSubtitlesTracksFromMedia(mediaElement) {\n\tconst elements = mediaElement.querySelectorAll(SPF_TRACK_SELECTOR);\n\tfor (const el of elements) el.remove();\n}\n/**\n* Apply a selection to a `TextTrackList` by setting each subtitle/caption\n* track's `mode` to `'showing'` if its `id` matches `selectedId` and\n* `'disabled'` otherwise. Tracks of other kinds (chapters, metadata,\n* descriptions) are left untouched — they may be owned by the host page.\n*/\nfunction syncTextTrackModes(textTracks, selectedId) {\n\tfor (let i = 0; i < textTracks.length; i++) {\n\t\tconst track = textTracks[i];\n\t\tif (track.kind !== \"subtitles\" && track.kind !== \"captions\") continue;\n\t\ttrack.mode = track.id === selectedId ? \"showing\" : \"disabled\";\n\t}\n}\n//#endregion\nexport { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia, syncTextTrackModes };\n\n//# sourceMappingURL=text-track-slots.js.map","//#region src/media/hls/parse-attributes.ts\n/**\n* Parse HLS attribute list from a tag line.\n* Handles both quoted and unquoted values.\n*/\nfunction parseAttributeList(line) {\n\tconst attributes = /* @__PURE__ */ new Map();\n\tfor (const match of line.matchAll(/([A-Z0-9-]+)=(?:\"([^\"]*)\"|([^,]*))/g)) {\n\t\tconst key = match[1];\n\t\tconst value = match[2] ?? match[3] ?? \"\";\n\t\tif (key) attributes.set(key, value);\n\t}\n\treturn attributes;\n}\n/**\n* Parse RESOLUTION attribute value (WIDTHxHEIGHT).\n*/\nfunction parseResolution(value) {\n\tconst match = /^(\\d+)x(\\d+)$/.exec(value);\n\tif (!match) return null;\n\treturn {\n\t\twidth: Number.parseInt(match[1], 10),\n\t\theight: Number.parseInt(match[2], 10)\n\t};\n}\n/**\n* Parse FRAME-RATE attribute to rational frame rate.\n*/\nfunction parseFrameRate(value) {\n\tconst fps = Number.parseFloat(value);\n\tif (Number.isNaN(fps) || fps <= 0) return void 0;\n\tif (Math.abs(fps - 23.976) < .01) return {\n\t\tframeRateNumerator: 24e3,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 29.97) < .01) return {\n\t\tframeRateNumerator: 3e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 59.94) < .01) return {\n\t\tframeRateNumerator: 6e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (fps % 1 === 0) return { frameRateNumerator: Math.round(fps) };\n\treturn { frameRateNumerator: Math.round(fps) };\n}\n/**\n* Parse CODECS attribute into separate video and audio codecs.\n*/\nfunction parseCodecs(codecs) {\n\tconst parts = codecs.split(\",\").map((s) => s.trim());\n\tconst result = {};\n\tfor (const codec of parts) if (codec.startsWith(\"avc1.\") || codec.startsWith(\"hvc1.\") || codec.startsWith(\"hev1.\")) result.video = codec;\n\telse if (codec.startsWith(\"mp4a.\")) result.audio = codec;\n\treturn result;\n}\n/**\n* Parse #EXTINF duration value.\n*/\nfunction parseExtInfDuration(value) {\n\tconst durationPart = value.split(\",\")[0] ?? value;\n\tconst duration = Number.parseFloat(durationPart);\n\treturn Number.isNaN(duration) ? 0 : duration;\n}\n/**\n* Parse BYTERANGE attribute value.\n* Format: \"length[@offset]\"\n* If offset is omitted, it continues from the previous byte range end.\n*/\nfunction parseByteRange(value, previousEnd) {\n\tconst match = /^(\\d+)(?:@(\\d+))?$/.exec(value);\n\tif (!match) return null;\n\tconst length = Number.parseInt(match[1], 10);\n\tif (Number.isNaN(length)) return null;\n\tlet start;\n\tif (match[2] !== void 0) {\n\t\tstart = Number.parseInt(match[2], 10);\n\t\tif (Number.isNaN(start)) return null;\n\t} else if (previousEnd !== void 0) start = previousEnd;\n\telse return null;\n\treturn {\n\t\tstart,\n\t\tend: start + length - 1\n\t};\n}\n/**\n* Create AttributeList from raw attribute string.\n*/\nfunction createAttributeList(line) {\n\tconst map = parseAttributeList(line);\n\treturn {\n\t\tget(key) {\n\t\t\treturn map.get(key);\n\t\t},\n\t\tgetInt(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseInt(value, 10);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetFloat(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseFloat(value);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetBool(key) {\n\t\t\treturn map.get(key) === \"YES\";\n\t\t},\n\t\tgetResolution(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseResolution(value) ?? void 0;\n\t\t},\n\t\tgetFrameRate(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseFrameRate(value);\n\t\t}\n\t};\n}\n/**\n* Match a tag and extract its attributes.\n* Returns null if the line doesn't match the tag.\n*/\nfunction matchTag(line, tag) {\n\tconst prefix = `#${tag}:`;\n\tif (!line.startsWith(prefix)) return null;\n\treturn createAttributeList(line.slice(prefix.length));\n}\n//#endregion\nexport { matchTag, parseByteRange, parseCodecs, parseExtInfDuration };\n\n//# sourceMappingURL=parse-attributes.js.map","//#region src/media/hls/resolve-url.ts\n/**\n* Resolve a potentially relative URL against a base URL using native URL API.\n*/\nfunction resolveUrl(url, baseUrl) {\n\treturn new URL(url, baseUrl).href;\n}\n//#endregion\nexport { resolveUrl };\n\n//# sourceMappingURL=resolve-url.js.map","import { matchTag, parseCodecs } from \"./parse-attributes.js\";\nimport { resolveUrl } from \"./resolve-url.js\";\nimport { generateId } from \"@videojs/utils/string\";\n//#region src/media/hls/parse-multivariant.ts\n/**\n* Parse HLS multivariant playlist into a Presentation.\n*\n* Returns Presentation with partially resolved tracks (no segment information).\n* Tracks contain metadata from multivariant playlist (bandwidth, resolution, codecs)\n* but segment information is added when media playlists are fetched.\n*\n* @param text - Raw playlist text content\n* @param unresolved - Unresolved presentation (contains URL for base URL resolution)\n* @returns Presentation with partially resolved tracks (duration is undefined)\n*/\nfunction parseMultivariantPlaylist(text, unresolved) {\n\tconst baseUrl = unresolved.url;\n\tconst lines = text.split(/\\r?\\n/);\n\tconst streams = [];\n\tconst audioRenditions = [];\n\tconst subtitleRenditions = [];\n\tlet pendingStreamInfo = null;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mediaAttrs = matchTag(trimmed, \"EXT-X-MEDIA\");\n\t\tif (mediaAttrs) {\n\t\t\tconst type = mediaAttrs.get(\"TYPE\");\n\t\t\tconst groupId = mediaAttrs.get(\"GROUP-ID\");\n\t\t\tconst name = mediaAttrs.get(\"NAME\");\n\t\t\tif (type === \"AUDIO\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\taudioRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: uri ? resolveUrl(uri, baseUrl) : void 0,\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type === \"SUBTITLES\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\tif (uri) subtitleRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: resolveUrl(uri, baseUrl),\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\"),\n\t\t\t\t\tforced: mediaAttrs.getBool(\"FORCED\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst streamInfAttrs = matchTag(trimmed, \"EXT-X-STREAM-INF\");\n\t\tif (streamInfAttrs) {\n\t\t\tpendingStreamInfo = {\n\t\t\t\tbandwidth: streamInfAttrs.getInt(\"BANDWIDTH\", 0),\n\t\t\t\tresolution: streamInfAttrs.getResolution(\"RESOLUTION\"),\n\t\t\t\tcodecs: streamInfAttrs.get(\"CODECS\"),\n\t\t\t\tframeRate: streamInfAttrs.getFrameRate(\"FRAME-RATE\"),\n\t\t\t\taudioGroupId: streamInfAttrs.get(\"AUDIO\")\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\t\tif (!trimmed.startsWith(\"#\") && pendingStreamInfo) {\n\t\t\tstreams.push({\n\t\t\t\t...pendingStreamInfo,\n\t\t\t\turi: resolveUrl(trimmed, baseUrl)\n\t\t\t});\n\t\t\tpendingStreamInfo = null;\n\t\t}\n\t}\n\tconst videoStreams = [];\n\tconst audioOnlyStreams = [];\n\tfor (const stream of streams) {\n\t\tif (!stream.codecs) {\n\t\t\tvideoStreams.push(stream);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsedCodecs = parseCodecs(stream.codecs);\n\t\tif (stream.codecs.split(\",\").length === 1) if (parsedCodecs.audio && !parsedCodecs.video) audioOnlyStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t}\n\tconst videoTracks = videoStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\tconst track = {\n\t\t\ttype: \"video\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"video/mp4\",\n\t\t\tcodecs: []\n\t\t};\n\t\tif (stream.resolution?.width !== void 0) track.width = stream.resolution.width;\n\t\tif (stream.resolution?.height !== void 0) track.height = stream.resolution.height;\n\t\tif (codecs?.video) track.codecs = [codecs.video];\n\t\tif (stream.frameRate) track.frameRate = stream.frameRate;\n\t\tif (stream.audioGroupId) track.audioGroupId = stream.audioGroupId;\n\t\treturn track;\n\t});\n\tconst audioOnlyTracks = audioOnlyStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\treturn {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tcodecs: codecs?.audio ? [codecs.audio] : [],\n\t\t\tgroupId: stream.audioGroupId || \"default\",\n\t\t\tname: \"Default\",\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2\n\t\t};\n\t});\n\tconst audioTracks = [...audioRenditions.map((rendition) => {\n\t\tlet audioCodecs;\n\t\tfor (const stream of streams) if (stream.audioGroupId === rendition.groupId && stream.codecs) {\n\t\t\tconst codecs = parseCodecs(stream.codecs);\n\t\t\tif (codecs.audio) {\n\t\t\t\taudioCodecs = [codecs.audio];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst track = {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri ?? \"\",\n\t\t\tgroupId: rendition.groupId,\n\t\t\tname: rendition.name,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tbandwidth: 0,\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2,\n\t\t\tcodecs: []\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (audioCodecs) track.codecs = audioCodecs;\n\t\tif (rendition.default) track.default = rendition.default;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\treturn track;\n\t}), ...audioOnlyTracks];\n\tconst textTracks = subtitleRenditions.map((rendition) => {\n\t\tconst track = {\n\t\t\ttype: \"text\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri,\n\t\t\tgroupId: rendition.groupId,\n\t\t\tlabel: rendition.name,\n\t\t\tkind: \"subtitles\",\n\t\t\tmimeType: \"text/vtt\",\n\t\t\tbandwidth: 0\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (rendition.default && rendition.autoselect) track.default = true;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\tif (rendition.forced) track.forced = rendition.forced;\n\t\treturn track;\n\t});\n\tconst selectionSets = [];\n\tif (videoTracks.length > 0) {\n\t\tconst videoSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\ttracks: videoTracks\n\t\t};\n\t\tconst videoSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\tswitchingSets: [videoSwitchingSet]\n\t\t};\n\t\tselectionSets.push(videoSelectionSet);\n\t}\n\tif (audioTracks.length > 0) {\n\t\tconst audioSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\ttracks: audioTracks\n\t\t};\n\t\tconst audioSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\tswitchingSets: [audioSwitchingSet]\n\t\t};\n\t\tselectionSets.push(audioSelectionSet);\n\t}\n\tif (textTracks.length > 0) {\n\t\tconst textSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\ttracks: textTracks\n\t\t};\n\t\tconst textSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\tswitchingSets: [textSwitchingSet]\n\t\t};\n\t\tselectionSets.push(textSelectionSet);\n\t}\n\treturn {\n\t\tid: generateId(),\n\t\turl: unresolved.url,\n\t\tstartTime: 0,\n\t\tselectionSets\n\t};\n}\n//#endregion\nexport { parseMultivariantPlaylist };\n\n//# sourceMappingURL=parse-multivariant.js.map","import { isResolvedTrack } from \"../types/index.js\";\n//#region src/media/utils/track-selection.ts\n/**\n* Map track type to selected track ID property key in state.\n*/\nconst SelectedTrackIdKeyByType = {\n\tvideo: \"selectedVideoTrackId\",\n\taudio: \"selectedAudioTrackId\",\n\ttext: \"selectedTextTrackId\"\n};\n/**\n* Get selected track from state by type.\n* Returns properly typed track (partially or fully resolved) or undefined.\n* Type parameter T is inferred from the type argument.\n*\n* @example\n* const videoTrack = getSelectedTrack(state, 'video');\n* if (videoTrack && isResolvedTrack(videoTrack)) {\n* // videoTrack is VideoTrack\n* }\n*/\nfunction getSelectedTrack(state, type) {\n\tconst { presentation } = state;\n\tif (!presentation?.selectionSets) return void 0;\n\tconst trackId = state[SelectedTrackIdKeyByType[type]];\n\treturn presentation.selectionSets.find(({ type: selectionSetType }) => selectionSetType === type)?.switchingSets[0]?.tracks.find(({ id }) => id === trackId);\n}\n/**\n* Returns the duration of the first resolved selected track, preferring\n* video over audio. A track is \"resolved\" once its media playlist has been\n* parsed (per {@link isResolvedTrack}). Returns `undefined` if neither\n* selected track is resolved.\n*/\nfunction getResolvedSelectedTrackDuration(state) {\n\tif (state.selectedVideoTrackId) {\n\t\tconst video = getSelectedTrack(state, \"video\");\n\t\tif (video && isResolvedTrack(video)) return video.duration;\n\t}\n\tif (state.selectedAudioTrackId) {\n\t\tconst audio = getSelectedTrack(state, \"audio\");\n\t\tif (audio && isResolvedTrack(audio)) return audio.duration;\n\t}\n}\n//#endregion\nexport { getResolvedSelectedTrackDuration, getSelectedTrack };\n\n//# sourceMappingURL=track-selection.js.map","import { snapshot, untrack, update } from \"../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../core/composition/create-composition.js\";\nimport { effect } from \"../../core/signals/effect.js\";\n//#region src/playback/behaviors/calculate-presentation-duration.ts\n/**\n* **Populate presentation duration via a config-supplied resolver.**\n*\n* Once a presentation is in place and its `duration` is still undefined,\n* calls `config.resolveDuration(state)` whenever a tracked slot changes. The\n* resolver decides what counts as \"duration is now derivable\" for the variant\n* in play; the behavior itself stays variant-agnostic:\n*\n* - **VoD** — derive from the first resolved selected track's `duration`\n* (video preferred, audio fallback). The HLS engine wires\n* `getResolvedSelectedTrackDuration` from `media/utils/track-selection.ts`\n* as the default. Audio-only falls out of the same resolver naturally\n* (no video selected → audio is the first resolved track).\n* - **Live** — return `Number.POSITIVE_INFINITY` once the presentation is\n* established as live. This is the MSE-spec value for `mediaSource.duration`\n* under live playback; downstream `updateMediaSourceDuration` propagates it through.\n*\n* Validation: writes whatever the resolver returns as long as it's a positive\n* number, including `Infinity`. `undefined` / `NaN` / `<= 0` are skipped.\n*\n* Fires at most once per presentation — an already-set `duration` is never\n* overwritten, and the next reset arrives structurally when a new\n* (unresolved) presentation replaces the current one. The resolver may\n* return `undefined` while duration is still indeterminate; subsequent\n* tracked-slot changes re-run the effect until the resolver commits a value.\n*\n* Downstream of `resolveVideoTrack` / `resolveAudioTrack`; upstream of\n* `updateMediaSourceDuration` (which writes the value through to `mediaSource.duration`).\n*/\nfunction calculatePresentationDurationSetup({ state, config }) {\n\treturn effect(() => {\n\t\tconst presentation = state.presentation.get();\n\t\tif (!presentation || presentation.duration !== void 0) return;\n\t\tconst duration = config.resolveDuration(untrack(() => snapshot(state)));\n\t\tif (duration === void 0 || Number.isNaN(duration) || duration <= 0) return;\n\t\tupdate(state.presentation, (current) => current ? {\n\t\t\t...current,\n\t\t\tduration\n\t\t} : current);\n\t});\n}\nconst calculatePresentationDuration = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"selectedVideoTrackId\",\n\t\t\"selectedAudioTrackId\"\n\t],\n\tcontextKeys: [],\n\tsetup: calculatePresentationDurationSetup\n});\n//#endregion\nexport { calculatePresentationDuration };\n\n//# sourceMappingURL=calculate-presentation-duration.js.map","import { hasPresentationDuration } from \"../../types/index.js\";\n//#region src/media/dom/mse/duration.ts\n/**\n* Check if we have the basics to update MediaSource duration:\n* a `mediaSource` and a `presentation` with a numeric duration.\n*/\nfunction canUpdateDuration(presentation, mediaSource) {\n\treturn !!(mediaSource && presentation && hasPresentationDuration(presentation));\n}\n/**\n* Get the maximum buffered end time across an iterable of SourceBuffers\n* (typically `mediaSource.sourceBuffers`). Returns `0` when the collection is\n* empty or no buffer has any buffered ranges.\n*/\nfunction getMaxBufferedEnd(buffers) {\n\tlet maxEnd = 0;\n\tfor (const buffer of buffers) {\n\t\tconst { buffered } = buffer;\n\t\tif (buffered.length > 0) {\n\t\t\tconst end = buffered.end(buffered.length - 1);\n\t\t\tif (end > maxEnd) maxEnd = end;\n\t\t}\n\t}\n\treturn maxEnd;\n}\n/**\n* Check if the preconditions are met to *attempt* a `mediaSource.duration`\n* write: a `mediaSource` is in scope and the presentation has a valid\n* positive duration (or `Infinity` for live).\n*\n* Does **not** check `mediaSource.readyState` or `mediaSource.duration` —\n* those are DOM properties the caller resolves at write time (e.g., by\n* `await`ing `waitForMediaSourceOpen` and re-checking `readyState` after,\n* and guarding on the existing `mediaSource.duration` for idempotency).\n* Keeping these off the signal-driven predicate lets callers use this\n* inside reactor state derivation without smuggling non-reactive DOM\n* reads into `computed(...)`.\n*\n* `Infinity` is allowed — per the MSE spec, `mediaSource.duration = +Infinity`\n* is how live playback signals an indefinite duration.\n*/\nfunction shouldUpdateDuration(presentation, mediaSource) {\n\tif (!canUpdateDuration(presentation, mediaSource)) return false;\n\tconst duration = presentation.duration;\n\tif (Number.isNaN(duration) || duration <= 0) return false;\n\treturn true;\n}\n/**\n* Wait for all currently-updating SourceBuffers in `buffers` to finish, or\n* until `signal` aborts — whichever fires first.\n*\n* The MSE spec forbids setting `MediaSource.duration` while any attached\n* SourceBuffer has `updating === true`. This defers until all are idle.\n* Listeners are registered with `{ signal }` so an abort tears them down\n* up-front rather than leaving them dangling until the next `updateend`.\n*/\nfunction waitForSourceBuffersReady(buffers, signal) {\n\tif (signal.aborted) return Promise.resolve();\n\tconst updating = [];\n\tfor (const buf of buffers) if (buf.updating) updating.push(buf);\n\tif (updating.length === 0) return Promise.resolve();\n\treturn new Promise((resolve) => {\n\t\tlet remaining = updating.length;\n\t\tconst onUpdateEnd = () => {\n\t\t\tremaining--;\n\t\t\tif (remaining === 0) resolve();\n\t\t};\n\t\tfor (const buf of updating) buf.addEventListener(\"updateend\", onUpdateEnd, {\n\t\t\tonce: true,\n\t\t\tsignal\n\t\t});\n\t\tsignal.addEventListener(\"abort\", () => resolve(), { once: true });\n\t});\n}\n//#endregion\nexport { getMaxBufferedEnd, shouldUpdateDuration, waitForSourceBuffersReady };\n\n//# sourceMappingURL=duration.js.map","//#region src/media/dom/mse/end-of-stream.ts\n/**\n* Check if the temporally last segment of `expectedSegments` is present in\n* `appendedSegments` and not marked partial.\n*\n* Compares by segment ID rather than by a pipeline flag, so the result\n* stays correct across quality switches (different tracks have different\n* segment IDs) and back-buffer flushes (flushed segment IDs are removed\n* from the appended list).\n*/\nfunction isLastSegmentAppended(expectedSegments, appendedSegments) {\n\tif (expectedSegments.length === 0) return true;\n\tconst lastSeg = expectedSegments[expectedSegments.length - 1];\n\tif (!lastSeg) return false;\n\treturn appendedSegments?.some((s) => s.id === lastSeg.id && !s.partial) ?? false;\n}\n//#endregion\nexport { isLastSegmentAppended };\n\n//# sourceMappingURL=end-of-stream.js.map","//#region src/media/dom/mse/mediasource-setup.ts\n/**\n* MediaSource Setup\n*\n* Utilities for creating and configuring MediaSource/ManagedMediaSource\n* for MSE (Media Source Extensions) playback.\n*\n* Global ManagedMediaSource types are defined in ./mediasource.d.ts\n*/\n/**\n* Check if MediaSource API is supported.\n*/\nfunction supportsMediaSource() {\n\treturn typeof MediaSource !== \"undefined\";\n}\n/**\n* Check if ManagedMediaSource API is supported.\n* ManagedMediaSource is a newer Safari API with better lifecycle management.\n*/\nfunction supportsManagedMediaSource() {\n\treturn typeof ManagedMediaSource !== \"undefined\";\n}\n/**\n* Create a MediaSource or ManagedMediaSource instance.\n*\n* @param options - Creation options\n* @returns A MediaSource or ManagedMediaSource instance\n* @throws Error if no MediaSource API is available\n*\n* @example\n* const mediaSource = createMediaSource();\n* const mediaElement = document.querySelector('video');\n* attachMediaSource(mediaSource, mediaElement);\n*/\nfunction createMediaSource(options = {}) {\n\tconst { preferManaged = false } = options;\n\tif (preferManaged && supportsManagedMediaSource()) return new ManagedMediaSource();\n\tif (supportsMediaSource()) return new MediaSource();\n\tthrow new Error(\"MediaSource API is not supported\");\n}\n/**\n* Attach a MediaSource to an HTMLMediaElement.\n*\n* Uses srcObject for ManagedMediaSource (Safari), or createObjectURL for regular MediaSource.\n*\n* @param mediaSource - The MediaSource to attach\n* @param mediaElement - The media element to attach to\n* @returns Object with URL and detach function\n*\n* @example\n* const mediaSource = createMediaSource();\n* const { detach } = attachMediaSource(mediaSource, videoElement);\n* // Use mediaSource...\n* // Later, to clean up:\n* detach();\n*/\nfunction attachMediaSource(mediaSource, mediaElement) {\n\tif (supportsManagedMediaSource() && mediaSource instanceof ManagedMediaSource) {\n\t\tmediaElement.disableRemotePlayback = true;\n\t\tmediaElement.srcObject = mediaSource;\n\t\tconst detach = () => {\n\t\t\tmediaElement.srcObject = null;\n\t\t\tmediaElement.load();\n\t\t};\n\t\treturn {\n\t\t\turl: \"\",\n\t\t\tdetach\n\t\t};\n\t}\n\tconst url = URL.createObjectURL(mediaSource);\n\tmediaElement.src = url;\n\tconst detach = () => {\n\t\tmediaElement.removeAttribute(\"src\");\n\t\tmediaElement.load();\n\t\tURL.revokeObjectURL(url);\n\t};\n\treturn {\n\t\turl,\n\t\tdetach\n\t};\n}\n/**\n* Create a SourceBuffer on a MediaSource.\n*\n* @param mediaSource - The MediaSource (must be in 'open' state)\n* @param mimeCodec - MIME type with codecs (e.g., 'video/mp4; codecs=\"avc1.42E01E\"')\n* @returns The created SourceBuffer\n* @throws Error if MediaSource is not open or codec is unsupported\n*\n* @example\n* const buffer = createSourceBuffer(mediaSource, 'video/mp4; codecs=\"avc1.42E01E\"');\n*/\nfunction createSourceBuffer(mediaSource, mimeCodec) {\n\tif (mediaSource.readyState !== \"open\") throw new Error(\"MediaSource is not open\");\n\tif (!isCodecSupported(mimeCodec)) throw new Error(`Codec not supported: ${mimeCodec}`);\n\treturn mediaSource.addSourceBuffer(mimeCodec);\n}\n/**\n* Build a MIME codec string from a track's `mimeType` + `codecs`. Works\n* on partially-resolved tracks — both fields come from the multivariant\n* playlist and are available before media-playlist resolution.\n*\n* @param track - Track carrying `mimeType` and `codecs`\n* @returns MIME codec string suitable for `MediaSource.addSourceBuffer`\n*\n* @example\n* buildMimeCodec({ mimeType: 'video/mp4', codecs: ['avc1.42E01E'] })\n* // => 'video/mp4; codecs=\"avc1.42E01E\"'\n*/\nfunction buildMimeCodec(track) {\n\tconst codecString = track.codecs?.join(\",\") ?? \"\";\n\treturn `${track.mimeType}; codecs=\"${codecString}\"`;\n}\n/**\n* Check if a codec is supported.\n*\n* @param mimeCodec - MIME type with codecs string\n* @returns True if the codec is supported\n*\n* @example\n* if (isCodecSupported('video/mp4; codecs=\"avc1.42E01E\"')) {\n* // Create source buffer\n* }\n*/\nfunction isCodecSupported(mimeCodec) {\n\tif (!supportsMediaSource()) return false;\n\treturn MediaSource.isTypeSupported(mimeCodec);\n}\n/**\n* Observe `mediaSource.readyState` changes via DOM events.\n*\n* Listens to `sourceopen`, `sourceended`, and `sourceclose` and invokes\n* `onChange` with the current `readyState` after each event. Listeners\n* are automatically removed when `abortSignal` is aborted.\n*\n* @param mediaSource - The MediaSource to observe\n* @param abortSignal - AbortSignal that controls listener lifetime\n* @param onChange - Called with the current readyState after each change\n*\n* @example\n* const controller = new AbortController();\n* onMediaSourceReadyStateChange(mediaSource, controller.signal, (state) => {\n* if (state === 'open') { ... }\n* });\n* // Later: controller.abort();\n*/\nfunction onMediaSourceReadyStateChange(mediaSource, abortSignal, onChange) {\n\tconst update = () => onChange(mediaSource.readyState);\n\tconst options = { signal: abortSignal };\n\tmediaSource.addEventListener(\"sourceopen\", update, options);\n\tmediaSource.addEventListener(\"sourceended\", update, options);\n\tmediaSource.addEventListener(\"sourceclose\", update, options);\n}\n/**\n* Wait until `mediaSource.readyState` transitions away from `'closed'`\n* (the next `sourceopen`/`sourceended`/`sourceclose` event), or until\n* `signal` aborts — whichever fires first.\n*\n* Resolves immediately when `readyState` is already `'open'` or `'ended'`\n* (no further transition is coming, so there's nothing to wait for). The\n* caller is expected to re-check `readyState` after the await to\n* distinguish `'open'` from terminal states.\n*\n* Companion to `onMediaSourceReadyStateChange` for one-shot use in async\n* sequences (e.g., a behavior's reactor entry that needs to wait for the\n* MediaSource to attach before performing a spec-conforming mutation).\n*\n* @example\n* await waitForMediaSourceOpen(mediaSource, signal);\n* if (signal.aborted || mediaSource.readyState !== 'open') return;\n* // safe to perform 'open'-state-only work\n*/\nfunction waitForMediaSourceOpen(mediaSource, signal) {\n\tif (signal.aborted) return Promise.resolve();\n\tif (mediaSource.readyState !== \"closed\") return Promise.resolve();\n\treturn new Promise((resolve) => {\n\t\tconst done = () => resolve();\n\t\tconst options = {\n\t\t\tonce: true,\n\t\t\tsignal\n\t\t};\n\t\tmediaSource.addEventListener(\"sourceopen\", done, options);\n\t\tmediaSource.addEventListener(\"sourceended\", done, options);\n\t\tmediaSource.addEventListener(\"sourceclose\", done, options);\n\t\tsignal.addEventListener(\"abort\", done, { once: true });\n\t});\n}\n//#endregion\nexport { attachMediaSource, buildMimeCodec, createMediaSource, createSourceBuffer, onMediaSourceReadyStateChange, waitForMediaSourceOpen };\n\n//# sourceMappingURL=mediasource-setup.js.map","import { computed, signal } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { effect } from \"../../../core/signals/effect.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { isResolvedTrack } from \"../../../media/types/index.js\";\nimport { findTrackById } from \"../../../media/utils/tracks.js\";\nimport { getMaxBufferedEnd, waitForSourceBuffersReady } from \"../../../media/dom/mse/duration.js\";\nimport { isLastSegmentAppended } from \"../../../media/dom/mse/end-of-stream.js\";\nimport { onMediaSourceReadyStateChange } from \"../../../media/dom/mse/mediasource-setup.js\";\n//#region src/playback/behaviors/dom/end-of-stream.ts\n/**\n* **Drive each `open → ended` transition of the MediaSource.** Calls\n* `MediaSource.endOfStream()` once the temporally last segments of every\n* active buffer actor's currently-loading track are fully appended and\n* the user has reached them — letting the browser finalize duration and\n* fire `ended` on the media element.\n*\n* Re-fires on every subsequent `open → ended → open` cycle. Per the MSE\n* spec, `appendBuffer()` after `endOfStream()` transitions the MediaSource\n* back to `'open'`; seek-back replays and back-buffer refills that re-load\n* earlier segments take this path, so the behavior must call\n* `endOfStream()` again once the last segments are reappended. The reactor's\n* `'preconditions-unmet'` ↔ `'eos-ready'` cycle *is* the re-arm mechanism:\n* a successful `endOfStream()` flips `mediaSource.readyState` to `'ended'`,\n* which (via the local `msIsOpen` signal) exits `'eos-ready'`; the next\n* `'open'` re-evaluates preconditions and may re-enter.\n*\n* # Tracking what's in the buffer\n*\n* Each `SourceBufferActor` knows which track it's currently loading via\n* `initTrackId` (set on the most recent `append-init` message) and which\n* segments it has appended. `deriveState` iterates over the available\n* buffer actors (`[videoBufferActor, audioBufferActor].filter(Boolean)`),\n* resolves each to its track via `findTrackById`, and checks that track's\n* last segment is appended. This means audio-only / video-only / mixed\n* configurations compose uniformly — the body iterates whatever's in\n* scope. No reliance on `selectedTrackId` slots: the actor's view IS the\n* source of truth for \"what's being loaded into this buffer.\"\n*\n* **Two-fire on mid-end ABR switches**: when a quality switch occurs near\n* end-of-stream, the actor's `initTrackId` still reflects the *old* track\n* until the new init segment is appended. The reactor may fire\n* `endOfStream()` against the old track's last-segment-appended state,\n* then the new init's `appendBuffer()` re-opens the MS, which re-arms us\n* to fire again once the new track's last segment lands. Functionally\n* correct (the browser re-fires `ended` after the re-arm), at the cost of\n* one extra call. Accepted as the price of dropping `selectedTrackId`\n* dependence.\n*\n* # Buffer-actor idle gate\n*\n* Each actor must be `'idle'` (no queued or in-flight tasks) before we\n* fire. `buffer.updating === false` alone is insufficient: for chunked\n* fMP4 streaming, `updateend` fires after each chunk while the actor's\n* for-await loop synchronously enqueues the next `appendBuffer()` — so\n* the buffer flips `!updating → updating` across a microtask boundary.\n* The actor's `'updating'` state spans the entire multi-chunk append, so\n* `actor.snapshot.value === 'idle'` is the canonical \"no more pending or\n* in-flight work\" oracle.\n*\n* This bet (actor models the pipeline; `mediaSource.sourceBuffers` models\n* DOM state) is durable as long as the segment loader is the sole writer\n* of `appendBuffer()` calls. A future loop-mode that auto-fetches earlier\n* segments mid-`ended` would require a broader coordination story\n* between SourceBuffers and the MediaSource — possibly via a\n* `MediaSourceActor` — and that's where this gate would want\n* re-evaluating.\n*\n* # currentTime gate\n*\n* `currentTime` must have reached at least one active track's last\n* segment startTime. Prevents `'eos-ready'` entry when a back-buffer\n* `remove()` / `appendBuffer()` briefly re-opens the MediaSource while\n* the user is mid-stream. HLS rendition time-alignment means any active\n* track works as the reference.\n*\n* # MS readyState — local subscription\n*\n* The behavior subscribes to `mediaSource`'s readyState changes inside\n* its setup (via `onMediaSourceReadyStateChange`) and mirrors `'open'` to\n* a behavior-local `msIsOpen` signal that `deriveState` reads. No shared\n* `mediaSourceReadyState` slot dependency. Anticipates a future\n* `MediaSourceActor` whose snapshot would expose the same signal — the\n* consumer code wouldn't change.\n*\n* # `endOfStream` entry sequence\n*\n* 1. Wait for all SourceBuffers to be idle (DOM-level — defensive,\n* should already hold given the actor-idle gate in `deriveState`).\n* 2. Set `mediaSource.duration` from `getMaxBufferedEnd` to match actual\n* container timestamps (`endOfStream()` only clamps up implicitly;\n* setting it explicitly here keeps the final value deterministic).\n* 3. Call `mediaSource.endOfStream()`.\n*\n* State-exit cleanup (`controller.abort()`) cancels any in-flight wait\n* on source unload, presentation replace, or behavior destroy.\n*\n* # Coordination with `updateMediaSourceDuration`\n*\n* `updateMediaSourceDuration` writes the initial `mediaSource.duration`\n* from `presentation.duration` once per source; this behavior writes the\n* final value from the buffered end. Decision domains don't overlap.\n*/\nfunction deriveState(presentation, mediaSource, msIsOpen, videoBufferActor, audioBufferActor, currentTime) {\n\tif (!mediaSource || !presentation || !msIsOpen) return \"preconditions-unmet\";\n\tconst actors = [videoBufferActor, audioBufferActor].filter((a) => a !== void 0);\n\tif (actors.length === 0) return \"preconditions-unmet\";\n\tlet lastSegStart;\n\tfor (const actor of actors) {\n\t\tconst snapshot = actor.snapshot.get();\n\t\tif (snapshot.value !== \"idle\") return \"preconditions-unmet\";\n\t\tconst { initTrackId, segments: appended } = snapshot.context;\n\t\tif (!initTrackId) return \"preconditions-unmet\";\n\t\tconst track = findTrackById(presentation, initTrackId);\n\t\tif (!track || !isResolvedTrack(track)) return \"preconditions-unmet\";\n\t\tif (!isLastSegmentAppended(track.segments, appended)) return \"preconditions-unmet\";\n\t\tif (track.segments.length > 0) {\n\t\t\tconst start = track.segments[track.segments.length - 1].startTime;\n\t\t\tif (lastSegStart === void 0 || start > lastSegStart) lastSegStart = start;\n\t\t}\n\t}\n\tif (lastSegStart !== void 0 && (currentTime ?? 0) < lastSegStart) return \"preconditions-unmet\";\n\treturn \"eos-ready\";\n}\nfunction endOfStreamSetup({ state, context }) {\n\tconst msIsOpen = signal(false);\n\tconst cleanupMsListener = effect(() => {\n\t\tconst mediaSource = context.mediaSource.get();\n\t\tif (!mediaSource) {\n\t\t\tmsIsOpen.set(false);\n\t\t\treturn;\n\t\t}\n\t\tmsIsOpen.set(mediaSource.readyState === \"open\");\n\t\tconst controller = new AbortController();\n\t\tonMediaSourceReadyStateChange(mediaSource, controller.signal, (rs) => {\n\t\t\tmsIsOpen.set(rs === \"open\");\n\t\t});\n\t\treturn () => controller.abort();\n\t});\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), context.mediaSource.get(), msIsOpen.get(), context.videoBufferActor.get(), context.audioBufferActor.get(), state.currentTime.get()));\n\tconst reactor = createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"eos-ready\": { entry: () => {\n\t\t\t\tconst mediaSource = context.mediaSource.get();\n\t\t\t\tconst controller = new AbortController();\n\t\t\t\tconst endStreamWhenReady = async () => {\n\t\t\t\t\tawait waitForSourceBuffersReady(mediaSource.sourceBuffers, controller.signal);\n\t\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\t\tconst bufferedEnd = getMaxBufferedEnd(mediaSource.sourceBuffers);\n\t\t\t\t\tif (bufferedEnd > 0) mediaSource.duration = bufferedEnd;\n\t\t\t\t\tmediaSource.endOfStream();\n\t\t\t\t};\n\t\t\t\tendStreamWhenReady().catch((err) => console.error(\"Failed to call endOfStream:\", err));\n\t\t\t\treturn () => controller.abort();\n\t\t\t} }\n\t\t}\n\t});\n\treturn () => {\n\t\tcleanupMsListener();\n\t\treactor.destroy();\n\t};\n}\nconst endOfStream = defineBehavior({\n\tstateKeys: [\"presentation\", \"currentTime\"],\n\tcontextKeys: [\n\t\t\"mediaSource\",\n\t\t\"videoBufferActor\",\n\t\t\"audioBufferActor\"\n\t],\n\tsetup: endOfStreamSetup\n});\n//#endregion\nexport { endOfStream };\n\n//# sourceMappingURL=end-of-stream.js.map","//#region src/network/ewma.ts\n/**\n* Exponentially Weighted Moving Average (EWMA)\n*\n* Pure functional implementation of EWMA calculations.\n* Based on Shaka Player's EWMA algorithm.\n*/\n/**\n* Calculate alpha (decay factor) from half-life.\n*\n* Alpha determines how quickly old data \"expires\":\n* - alpha close to 1 = slow decay (long memory)\n* - alpha close to 0 = fast decay (short memory)\n*\n* @param halfLife - The quantity of prior samples (by weight) that make up\n* half of the new estimate. Must be positive.\n* @returns Alpha value between 0 and 1\n*\n* @example\n* const alpha = calculateAlpha(2); // ≈ 0.7071 for 2-second half-life\n*/\nfunction calculateAlpha(halfLife) {\n\treturn Math.exp(Math.log(.5) / halfLife);\n}\n/**\n* Calculate exponentially weighted moving average.\n*\n* Updates an estimate by blending a new value with the previous estimate,\n* weighted by the sample duration. Longer samples have more influence.\n*\n* @param prevEstimate - Previous EWMA estimate\n* @param value - New sample value to incorporate\n* @param weight - Sample weight (typically duration in seconds)\n* @param halfLife - Half-life for decay (typically 2-5 seconds)\n* @returns Updated EWMA estimate\n*\n* @example\n* let estimate = 0;\n* estimate = calculateEwma(estimate, 1_000_000, 1, 2); // First sample\n* estimate = calculateEwma(estimate, 2_000_000, 1, 2); // Second sample\n*/\nfunction calculateEwma(prevEstimate, value, weight, halfLife) {\n\tconst adjAlpha = calculateAlpha(halfLife) ** weight;\n\treturn value * (1 - adjAlpha) + adjAlpha * prevEstimate;\n}\n/**\n* Apply zero-factor correction to EWMA estimate.\n*\n* The zero-factor correction compensates for bias when starting from zero.\n* Without this correction, early estimates would be artificially low.\n*\n* As totalWeight increases, the correction factor approaches 1, meaning\n* the estimate becomes more reliable and needs less correction.\n*\n* @param estimate - Raw EWMA estimate (uncorrected)\n* @param totalWeight - Accumulated weight from all samples\n* @param halfLife - Half-life used in EWMA calculation\n* @returns Corrected estimate, or 0 if totalWeight is 0\n*\n* @example\n* const raw = calculateEwma(0, 1_000_000, 1, 2);\n* const corrected = applyZeroFactor(raw, 1, 2); // ≈ 1_000_000\n*/\nfunction applyZeroFactor(estimate, totalWeight, halfLife) {\n\tif (totalWeight === 0) return 0;\n\treturn estimate / (1 - calculateAlpha(halfLife) ** totalWeight);\n}\n//#endregion\nexport { applyZeroFactor, calculateEwma };\n\n//# sourceMappingURL=ewma.js.map","import { applyZeroFactor, calculateEwma } from \"./ewma.js\";\n//#region src/network/bandwidth-estimator.ts\n/**\n* Dual EWMA Bandwidth Estimator\n*\n* Estimates available bandwidth using two EWMA calculations with different\n* half-lives, taking the minimum of both. This approach (from Shaka Player):\n*\n* - **Fast EWMA** (2s half-life): Reacts quickly to bandwidth drops\n* - **Slow EWMA** (5s half-life): Provides stability during fluctuations\n* - **min(fast, slow)**: Adapts down quickly, up slowly\n*\n* This naturally provides asymmetric behavior needed for good QoE:\n* avoiding stalls (quick downgrade) while preventing oscillation (slow upgrade).\n*/\n/**\n* Default bandwidth estimator configuration.\n*\n* Values match Shaka Player defaults based on experimentation.\n*/\nconst DEFAULT_BANDWIDTH_CONFIG = {\n\tfastHalfLife: 2,\n\tslowHalfLife: 5,\n\tminTotalBytes: 128e3,\n\tminBytes: 16e3,\n\tminDuration: 5\n};\n/**\n* Add a bandwidth sample from a segment download.\n*\n* Samples are filtered based on:\n* - Minimum bytes (filters TTFB-dominated small segments)\n* - Minimum duration (filters cached responses)\n*\n* Valid samples update both fast and slow EWMA estimates.\n*\n* @param state - Current estimator state\n* @param durationMs - Download duration in milliseconds\n* @param numBytes - Number of bytes downloaded\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns New estimator state with sample incorporated (or unchanged if filtered)\n*\n* @example\n* let state = { fastEstimate: 0, fastTotalWeight: 0, ... };\n* // Sample: 1MB in 1 second\n* state = sampleBandwidth(state, 1000, 1_000_000);\n*/\nfunction sampleBandwidth(state, durationMs, numBytes, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tconst updatedBytesSampled = state.bytesSampled + numBytes;\n\tif (numBytes < config.minBytes) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tif (durationMs < config.minDuration) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tconst bandwidth = 8e3 * numBytes / durationMs;\n\tconst weight = durationMs / 1e3;\n\treturn {\n\t\tfastEstimate: calculateEwma(state.fastEstimate, bandwidth, weight, config.fastHalfLife),\n\t\tfastTotalWeight: state.fastTotalWeight + weight,\n\t\tslowEstimate: calculateEwma(state.slowEstimate, bandwidth, weight, config.slowHalfLife),\n\t\tslowTotalWeight: state.slowTotalWeight + weight,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n}\n/**\n* Get the current bandwidth estimate.\n*\n* Returns the **minimum** of the fast and slow EWMA estimates.\n* This provides the key asymmetric behavior:\n* - When bandwidth drops, fast EWMA reacts first and dominates (quick adaptation)\n* - When bandwidth rises, slow EWMA lags behind and dominates (slow adaptation)\n*\n* Uses default estimate until enough data has been sampled — and when no\n* estimator state exists at all (`state === undefined`).\n*\n* @param state - Current estimator state, or `undefined` before any samples have been collected\n* @param defaultEstimate - Fallback estimate before sufficient samples (bps)\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns Bandwidth estimate in bits per second\n*\n* @example\n* const estimate = getBandwidthEstimate(state, 5_000_000); // 5 Mbps default\n*/\nfunction getBandwidthEstimate(state, defaultEstimate, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tif (!state || state.bytesSampled < config.minTotalBytes) return defaultEstimate;\n\tconst fastEstimate = applyZeroFactor(state.fastEstimate, state.fastTotalWeight, config.fastHalfLife);\n\tconst slowEstimate = applyZeroFactor(state.slowEstimate, state.slowTotalWeight, config.slowHalfLife);\n\treturn Math.min(fastEstimate, slowEstimate);\n}\n//#endregion\nexport { DEFAULT_BANDWIDTH_CONFIG, getBandwidthEstimate, sampleBandwidth };\n\n//# sourceMappingURL=bandwidth-estimator.js.map","//#region src/network/chunked-stream-iterable.ts\nconst DEFAULT_MIN_CHUNK_SIZE = 2 ** 17;\n/**\n* Adapts a `ReadableStream<Uint8Array>` (e.g. `response.body`) into an\n* `AsyncIterable<Uint8Array>` that yields chunks no smaller than\n* `minChunkSize` bytes. Smaller network chunks are accumulated and yielded\n* together once the threshold is met. Any remainder is flushed on stream end.\n*\n* Errors from the underlying stream propagate naturally — the reader lock is\n* always released via `finally`.\n*/\nvar ChunkedStreamIterable = class {\n\tminChunkSize;\n\t#readableStream;\n\tconstructor(readableStream, { minChunkSize = DEFAULT_MIN_CHUNK_SIZE } = {}) {\n\t\tthis.#readableStream = readableStream;\n\t\tthis.minChunkSize = minChunkSize;\n\t}\n\tasync *[Symbol.asyncIterator]() {\n\t\tlet pending;\n\t\tconst reader = this.#readableStream.getReader();\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) {\n\t\t\t\t\tif (pending) yield pending;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpending = pending ? concat(pending, value) : value;\n\t\t\t\tif (pending.length >= this.minChunkSize) {\n\t\t\t\t\tyield pending;\n\t\t\t\t\tpending = void 0;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock();\n\t\t}\n\t}\n};\nfunction concat(a, b) {\n\tconst result = new Uint8Array(a.length + b.length);\n\tresult.set(a);\n\tresult.set(b, a.length);\n\treturn result;\n}\n//#endregion\nexport { ChunkedStreamIterable };\n\n//# sourceMappingURL=chunked-stream-iterable.js.map","import { sampleBandwidth } from \"./bandwidth-estimator.js\";\nimport { ChunkedStreamIterable } from \"./chunked-stream-iterable.js\";\n//#region src/network/fetch.ts\n/**\n* HTTP Fetch Wrapper\n*\n* Composable building blocks:\n* - fetchResolvable() — fetch a Resource (handles byte ranges); returns Response\n* - getResponseText() — extract text from Response\n* - fetchResolvableStream() — single-stage async generator over body chunks\n* - fetchStream() — two-stage: await connection establishment, then lazily\n* iterate body chunks. Use when timing the connection start independently\n* of body consumption matters (e.g., observable fetch timing for ABR).\n* - createTrackedFetch() — factory for a fetchStream-shape function that\n* samples bandwidth (via EWMA) per chunk and notifies via callback.\n*/\n/**\n* Fetch resolvable from a Resource.\n*\n* Handles byte range requests if byteRange is present.\n* Returns native fetch Response for composability (can extract text, stream, etc.).\n*\n* @param addressable - Resource to fetch (url + optional byteRange)\n* @returns Promise resolving to Response\n*\n* @example\n* const response = await fetchResolvable({ url: 'https://example.com/segment.m4s' });\n* const text = await getResponseText(response);\n*\n* @example\n* // With byte range\n* const response = await fetchResolvable({\n* url: 'https://example.com/file.mp4',\n* byteRange: { start: 1000, end: 1999 }\n* });\n*/\nasync function fetchResolvable(addressable, options) {\n\tconst headers = new Headers(options?.headers);\n\tif (addressable.byteRange) {\n\t\tconst { start, end } = addressable.byteRange;\n\t\theaders.set(\"Range\", `bytes=${start}-${end}`);\n\t}\n\tconst request = new Request(addressable.url, {\n\t\tmethod: \"GET\",\n\t\theaders,\n\t\t...options\n\t});\n\treturn fetch(request);\n}\n/**\n* Extract text from Response.\n*\n* Accepts minimal Response-like object (just needs text() method).\n* Returns promise from response.text().\n*\n* @param response - Response-like object with text() method\n* @returns Promise resolving to text content\n*\n* @example\n* const response = await fetchResolvable(addressable);\n* const text = await getResponseText(response);\n*/\nfunction getResponseText(response) {\n\treturn response.text();\n}\nasync function fetchStream(addressable, options) {\n\tconst { minChunkSize, ...fetchOptions } = options ?? {};\n\tconst response = await fetchResolvable(addressable, fetchOptions);\n\tif (!response.body) throw new Error(\"Response has no body\");\n\treturn new ChunkedStreamIterable(response.body, ...minChunkSize !== void 0 ? [{ minChunkSize }] : []);\n}\n/**\n* Returns a {@link FetchBytes} function that samples bandwidth via EWMA\n* per body chunk. The factory captures the running bandwidth state\n* internally; per chunk it computes the next state and notifies the\n* supplied `onSample` callback.\n*\n* The factory's internal accumulator is seeded from `initial` and updated\n* on every chunk; callers don't need to thread it back in. `onSample`\n* receives the *new* state after each chunk — typical use is to bridge\n* samples back into engine state for ABR consumers.\n*\n* @param initial - Starting `BandwidthState` (commonly zeros or the\n* engine's current accumulator).\n* @param onSample - Called with the new `BandwidthState` after each chunk.\n*/\nfunction createTrackedFetch(initial, onSample) {\n\tlet state = initial;\n\treturn async (addressable, options) => {\n\t\tconst { minChunkSize, ...fetchOptions } = options ?? {};\n\t\tconst response = await fetchResolvable(addressable, fetchOptions);\n\t\tif (!response.body) throw new Error(\"Response has no body\");\n\t\tconst body = response.body;\n\t\treturn { [Symbol.asyncIterator]: async function* () {\n\t\t\tlet chunkStart = performance.now();\n\t\t\tfor await (const chunk of new ChunkedStreamIterable(body, ...minChunkSize !== void 0 ? [{ minChunkSize }] : [])) {\n\t\t\t\tconst elapsed = performance.now() - chunkStart;\n\t\t\t\tstate = sampleBandwidth(state, elapsed, chunk.byteLength);\n\t\t\t\tonSample(state);\n\t\t\t\tyield chunk;\n\t\t\t\tchunkStart = performance.now();\n\t\t\t}\n\t\t} };\n\t};\n}\n//#endregion\nexport { createTrackedFetch, fetchResolvable, fetchStream, getResponseText };\n\n//# sourceMappingURL=fetch.js.map","//#region src/media/buffer/back-buffer.ts\n/**\n* Default back buffer configuration.\n*/\nconst DEFAULT_BACK_BUFFER_CONFIG = { keepSegments: 2 };\n/**\n* Calculate back buffer flush point.\n*\n* Determines where to flush old segments from the back buffer.\n* Keeps a fixed number of segments behind the current playback position.\n*\n* Algorithm:\n* 1. Find segments before currentTime\n* 2. Count back N segments (keepSegments)\n* 3. Return startTime of segment N+1 back (flush everything before this)\n*\n* @param segments - Available segments (should be sorted by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional back buffer configuration\n* @returns Time in seconds to flush up to (flush range: [0, flushEnd))\n*\n* @example\n* const segments = [\n* { startTime: 0, duration: 6, ... },\n* { startTime: 6, duration: 6, ... },\n* { startTime: 12, duration: 6, ... },\n* { startTime: 18, duration: 6, ... },\n* ];\n*\n* // Playing at 18s, keep 2 segments\n* const flushEnd = calculateBackBufferFlushPoint(segments, 18);\n* // Returns 6 (flush [0, 6), keep [6-18))\n*/\nfunction calculateBackBufferFlushPoint(segments, currentTime, config = DEFAULT_BACK_BUFFER_CONFIG) {\n\tif (segments.length === 0) return 0;\n\tconst segmentsBefore = segments.filter((seg) => seg.startTime < currentTime);\n\tif (segmentsBefore.length === 0) return 0;\n\tconst segmentsToFlush = segmentsBefore.length - config.keepSegments;\n\tif (segmentsToFlush <= 0) return 0;\n\tif (segmentsToFlush >= segmentsBefore.length) return currentTime;\n\treturn segmentsBefore[segmentsToFlush].startTime;\n}\n//#endregion\nexport { DEFAULT_BACK_BUFFER_CONFIG, calculateBackBufferFlushPoint };\n\n//# sourceMappingURL=back-buffer.js.map","import { peek } from \"../../../core/signals/primitives.js\";\nimport { effect } from \"../../../core/signals/effect.js\";\nimport { SerialRunner, Task } from \"../../../core/tasks/task.js\";\nimport { createMachineActor } from \"../../../core/actors/create-machine-actor.js\";\nimport { DEFAULT_FORWARD_BUFFER_CONFIG, calculateForwardFlushPoint, getSegmentsToLoad } from \"../../../media/buffer/forward-buffer.js\";\nimport { SEGMENT_TIME_EPSILON } from \"../../../media/types/index.js\";\nimport { DEFAULT_BACK_BUFFER_CONFIG, calculateBackBufferFlushPoint } from \"../../../media/buffer/back-buffer.js\";\n//#region src/playback/actors/dom/segment-loader.ts\n/**\n* Resolves when the SourceBufferActor snapshot reaches 'idle'.\n* Rejects if the signal is aborted or the actor is destroyed.\n*\n* Used to sequence SourceBufferActor operations without awaiting send()\n* directly — send() is fire-and-forget; callers observe completion via\n* state transition.\n*/\nfunction waitForIdle(snapshot, signal) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (snapshot.get().value === \"idle\") {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tif (snapshot.get().value === \"destroyed\") {\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\treturn;\n\t\t}\n\t\tif (signal.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tlet stop;\n\t\tconst cleanup = (fn) => {\n\t\t\tstop?.();\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tfn();\n\t\t};\n\t\tconst onAbort = () => cleanup(() => reject(signal.reason));\n\t\tstop = effect(() => {\n\t\t\tconst value = snapshot.get().value;\n\t\t\tif (value === \"idle\") cleanup(resolve);\n\t\t\telse if (value === \"destroyed\") cleanup(() => reject(new DOMException(\"Aborted\", \"AbortError\")));\n\t\t});\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n/**\n* Wraps a LoadTask descriptor into a Task that fetches (if needed) and\n* forwards to SourceBufferActor. Updates in-flight context around async\n* operations so the loading handler can make accurate continue/preempt\n* decisions at any point.\n*/\nfunction makeLoadTask(op, { getContext, setContext, fetchBytes, sourceBufferActor }) {\n\treturn new Task(async (taskSignal) => {\n\t\tif (taskSignal.aborted) return;\n\t\tif (op.type === \"remove\") {\n\t\t\tsourceBufferActor.send(op);\n\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\treturn;\n\t\t}\n\t\tif (op.type === \"append-init\") {\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightInitTrackId: op.meta.trackId\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst data = await fetchBytes(op, {\n\t\t\t\t\tsignal: taskSignal,\n\t\t\t\t\tminChunkSize: Infinity\n\t\t\t\t});\n\t\t\t\tif (!taskSignal.aborted) {\n\t\t\t\t\tsourceBufferActor.send({\n\t\t\t\t\t\ttype: \"append-init\",\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tmeta: op.meta\n\t\t\t\t\t});\n\t\t\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetContext({\n\t\t\t\t\t...getContext(),\n\t\t\t\t\tinFlightInitTrackId: null\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsetContext({\n\t\t\t...getContext(),\n\t\t\tinFlightSegmentId: op.meta.id\n\t\t});\n\t\ttry {\n\t\t\tconst stream = await fetchBytes(op, { signal: taskSignal });\n\t\t\tif (!taskSignal.aborted) {\n\t\t\t\tsourceBufferActor.send({\n\t\t\t\t\ttype: \"append-segment\",\n\t\t\t\t\tdata: stream,\n\t\t\t\t\tmeta: op.meta\n\t\t\t\t});\n\t\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightSegmentId: null\n\t\t\t});\n\t\t}\n\t});\n}\n/**\n* Creates a SegmentLoaderActor for one track type (video or audio).\n*\n* Receives load assignments via `send()` and owns all execution: planning,\n* removes, fetches, and appends. Coordinates with the SourceBufferActor for\n* all physical SourceBuffer operations.\n*\n* Planning (Cases 1–3) happens in the `load` handler on every incoming\n* message, producing an ordered LoadTask list. The runner drains that list\n* sequentially via SerialRunner. When a new message arrives mid-run, the\n* handler replans and either continues the in-flight operation (abortPending\n* + schedule new remainder) or preempts it (abortAll + cancel SourceBuffer\n* if needed + schedule new plan).\n*\n* @param sourceBufferActor - Shared SourceBufferActor reference (not owned)\n* @param fetchBytes - Tracked fetch closure (owns throughput sampling for segments).\n* Accepts an optional `minChunkSize` in options; init segments pass `Infinity`\n* so the entire body accumulates as one chunk before appending.\n*/\nfunction createSegmentLoaderActor(sourceBufferActor, fetchBytes, config = {}) {\n\tconst forwardBufferConfig = {\n\t\t...DEFAULT_FORWARD_BUFFER_CONFIG,\n\t\t...config.forwardBuffer\n\t};\n\tconst backBufferConfig = {\n\t\t...DEFAULT_BACK_BUFFER_CONFIG,\n\t\t...config.backBuffer\n\t};\n\tconst getBufferedSegments = (allSegments) => {\n\t\tconst bufferedIds = new Set(peek(sourceBufferActor.snapshot).context.segments.filter((s) => !s.partial).map((s) => s.id));\n\t\treturn allSegments.filter((s) => bufferedIds.has(s.id));\n\t};\n\t/**\n\t* Translate a load message into an ordered LoadTask list based on committed\n\t* actor state. In-flight awareness is handled separately in the load handler.\n\t*\n\t* @todo Rename alongside LoadTask (e.g. planOps).\n\t*\n\t* Case 1 — Removes: forward and back buffer flush points, segment-aligned.\n\t* No flush on track switch: appending new content overwrites existing buffer\n\t* ranges, and the actor's time-aligned deduplication keeps the segment model\n\t* accurate as new segments arrive.\n\t*\n\t* Case 2 — Init: schedule if not yet committed for this track.\n\t*\n\t* Case 3 — Segments: all segments in the load window not yet committed.\n\t*/\n\tconst planTasks = (message) => {\n\t\tconst { track, range } = message;\n\t\tconst actorCtx = peek(sourceBufferActor.snapshot).context;\n\t\tconst bufferedSegments = getBufferedSegments(track.segments);\n\t\tconst currentTime = range?.start ?? 0;\n\t\tconst tasks = [];\n\t\tif (range) {\n\t\t\tconst forwardFlushStart = calculateForwardFlushPoint(bufferedSegments, currentTime, forwardBufferConfig);\n\t\t\tif (forwardFlushStart < Infinity) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: forwardFlushStart,\n\t\t\t\tend: Infinity\n\t\t\t});\n\t\t\tconst backFlushEnd = calculateBackBufferFlushPoint(bufferedSegments, currentTime, backBufferConfig);\n\t\t\tif (backFlushEnd > 0) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: 0,\n\t\t\t\tend: backFlushEnd\n\t\t\t});\n\t\t}\n\t\tif (actorCtx.initTrackId !== track.id) tasks.push({\n\t\t\ttype: \"append-init\",\n\t\t\tmeta: { trackId: track.id },\n\t\t\turl: track.initialization.url,\n\t\t\t...track.initialization.byteRange !== void 0 && { byteRange: track.initialization.byteRange }\n\t\t});\n\t\tif (range) {\n\t\t\tconst segmentsToLoad = getSegmentsToLoad(track.segments, bufferedSegments, currentTime, forwardBufferConfig).filter((seg) => {\n\t\t\t\tconst existing = actorCtx.segments.find((s) => Math.abs(s.startTime - seg.startTime) < SEGMENT_TIME_EPSILON);\n\t\t\t\tif (existing?.partial) return true;\n\t\t\t\tif (!existing?.trackBandwidth || !track.bandwidth) return true;\n\t\t\t\treturn track.bandwidth > existing.trackBandwidth;\n\t\t\t});\n\t\t\tfor (const segment of segmentsToLoad) tasks.push({\n\t\t\t\ttype: \"append-segment\",\n\t\t\t\tmeta: {\n\t\t\t\t\tid: segment.id,\n\t\t\t\t\tstartTime: segment.startTime,\n\t\t\t\t\tduration: segment.duration,\n\t\t\t\t\ttrackId: track.id,\n\t\t\t\t\ttrackBandwidth: track.bandwidth\n\t\t\t\t},\n\t\t\t\turl: segment.url,\n\t\t\t\t...segment.byteRange !== void 0 && { byteRange: segment.byteRange }\n\t\t\t});\n\t\t}\n\t\treturn tasks;\n\t};\n\tconst scheduleAll = (tasks, { getContext, setContext, runner }) => {\n\t\ttasks.forEach((op) => {\n\t\t\trunner.schedule(makeLoadTask(op, {\n\t\t\t\tgetContext,\n\t\t\t\tsetContext,\n\t\t\t\tfetchBytes,\n\t\t\t\tsourceBufferActor\n\t\t\t})).then(void 0, (e) => {\n\t\t\t\tif (e instanceof Error && e.name === \"AbortError\") return;\n\t\t\t\tconsole.error(\"Unexpected error in segment loader:\", e);\n\t\t\t\trunner.abortPending();\n\t\t\t});\n\t\t});\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tinFlightInitTrackId: null,\n\t\t\tinFlightSegmentId: null\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: { load: (msg, ctx) => {\n\t\t\t\tconst allTasks = planTasks(msg);\n\t\t\t\tif (allTasks.length === 0) return;\n\t\t\t\tctx.transition(\"loading\");\n\t\t\t\tscheduleAll(allTasks, ctx);\n\t\t\t} } },\n\t\t\tloading: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { load: (msg, ctx) => {\n\t\t\t\t\tconst { context, runner } = ctx;\n\t\t\t\t\tconst allTasks = planTasks(msg);\n\t\t\t\t\tif (context.inFlightSegmentId !== null && allTasks.some((t) => t.type === \"append-segment\" && t.meta.id === context.inFlightSegmentId) || context.inFlightInitTrackId !== null && allTasks.some((t) => t.type === \"append-init\" && t.meta.trackId === context.inFlightInitTrackId)) {\n\t\t\t\t\t\trunner.abortPending();\n\t\t\t\t\t\tscheduleAll(allTasks.filter((t) => !(t.type === \"append-segment\" && t.meta.id === context.inFlightSegmentId) && !(t.type === \"append-init\" && t.meta.trackId === context.inFlightInitTrackId)), ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trunner.abortAll();\n\t\t\t\t\t\tif (context.inFlightSegmentId !== null || context.inFlightInitTrackId !== null && allTasks.some((t) => t.type === \"append-init\" && t.meta.trackId !== context.inFlightInitTrackId)) sourceBufferActor.send({ type: \"cancel\" });\n\t\t\t\t\t\tscheduleAll(allTasks, ctx);\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createSegmentLoaderActor };\n\n//# sourceMappingURL=segment-loader.js.map","//#region src/media/dom/mse/append-segment.ts\n/**\n* Append media data to a SourceBuffer.\n*\n* Accepts either a full ArrayBuffer (single append) or an AsyncIterable of\n* Uint8Array chunks (one append per chunk, in order). Waits for `updateend`\n* between each call so appends are serialized correctly.\n*\n* Errors from the SourceBuffer (`error` event) or from the iterable are\n* propagated as rejections.\n*/\nasync function appendSegment(sourceBuffer, data, signal) {\n\tif (data instanceof ArrayBuffer) await appendChunk(sourceBuffer, data);\n\telse try {\n\t\tfor await (const chunk of data) {\n\t\t\tif (signal?.aborted) throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n\t\t\tawait appendChunk(sourceBuffer, chunk);\n\t\t}\n\t} catch (e) {\n\t\tif (e instanceof DOMException && e.name === \"AbortError\" && !sourceBuffer.updating) try {\n\t\t\tsourceBuffer.abort();\n\t\t} catch {}\n\t\tthrow e;\n\t}\n}\nasync function appendChunk(sourceBuffer, data) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer append error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.appendBuffer(data);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n//#endregion\nexport { appendSegment };\n\n//# sourceMappingURL=append-segment.js.map","//#region src/media/dom/mse/buffer-flusher.ts\n/**\n* Buffer flusher helper (P12)\n*\n* Removes a time range from a SourceBuffer to manage memory.\n*/\n/**\n* Remove a time range from a SourceBuffer.\n*\n* Waits for the SourceBuffer to be ready (not updating), then removes\n* the specified range. Returns a promise that resolves when removal completes.\n*\n* @param sourceBuffer - The SourceBuffer to remove data from\n* @param start - Start of the time range to remove (seconds)\n* @param end - End of the time range to remove (seconds)\n* @returns Promise that resolves when removal completes\n*\n* @example\n* await flushBuffer(videoSourceBuffer, 0, 30);\n*/\nasync function flushBuffer(sourceBuffer, start, end) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer remove error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.remove(start, end);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n//#endregion\nexport { flushBuffer };\n\n//# sourceMappingURL=buffer-flusher.js.map","import { SerialRunner, Task } from \"../../../core/tasks/task.js\";\nimport { createMachineActor } from \"../../../core/actors/create-machine-actor.js\";\nimport { appendSegment } from \"../../../media/dom/mse/append-segment.js\";\nimport { flushBuffer } from \"../../../media/dom/mse/buffer-flusher.js\";\nimport { SEGMENT_TIME_EPSILON } from \"../../../media/types/index.js\";\n//#region src/playback/actors/dom/source-buffer.ts\nfunction snapshotBuffered(buffered) {\n\tconst ranges = [];\n\tfor (let i = 0; i < buffered.length; i++) ranges.push({\n\t\tstart: buffered.start(i),\n\t\tend: buffered.end(i)\n\t});\n\treturn ranges;\n}\nfunction appendInitTask(message, { getContext, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait appendSegment(sourceBuffer, message.data);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tinitTrackId: message.meta.trackId\n\t\t};\n\t});\n}\nfunction appendSegmentTask(message, { getContext, sourceBuffer, setContext }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tconst { meta } = message;\n\t\tconst filtered = ctx.segments.filter((s) => Math.abs(s.startTime - meta.startTime) >= SEGMENT_TIME_EPSILON);\n\t\tif (!(message.data instanceof ArrayBuffer)) setContext({\n\t\t\t...ctx,\n\t\t\tsegments: [...filtered, {\n\t\t\t\tid: meta.id,\n\t\t\t\tstartTime: meta.startTime,\n\t\t\t\tduration: meta.duration,\n\t\t\t\ttrackId: meta.trackId,\n\t\t\t\t...meta.trackBandwidth !== void 0 && { trackBandwidth: meta.trackBandwidth },\n\t\t\t\tpartial: true\n\t\t\t}],\n\t\t\tbufferedRanges: ctx.bufferedRanges\n\t\t});\n\t\tawait appendSegment(sourceBuffer, message.data, taskSignal);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: [...filtered, {\n\t\t\t\tid: meta.id,\n\t\t\t\tstartTime: meta.startTime,\n\t\t\t\tduration: meta.duration,\n\t\t\t\ttrackId: meta.trackId,\n\t\t\t\t...meta.trackBandwidth !== void 0 && { trackBandwidth: meta.trackBandwidth }\n\t\t\t}],\n\t\t\tbufferedRanges: snapshotBuffered(sourceBuffer.buffered)\n\t\t};\n\t});\n}\nfunction removeTask(message, { getContext, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait flushBuffer(sourceBuffer, message.start, message.end);\n\t\tconst bufferedRanges = snapshotBuffered(sourceBuffer.buffered);\n\t\tconst filtered = ctx.segments.filter((s) => {\n\t\t\tconst midpoint = s.startTime + s.duration / 2;\n\t\t\treturn bufferedRanges.some((r) => midpoint >= r.start && midpoint < r.end);\n\t\t});\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: filtered,\n\t\t\tbufferedRanges\n\t\t};\n\t});\n}\nconst messageTaskFactories = {\n\t\"append-init\": appendInitTask,\n\t\"append-segment\": appendSegmentTask,\n\tremove: removeTask\n};\nfunction messageToTask(message, options) {\n\tconst factory = messageTaskFactories[message.type];\n\treturn factory(message, options);\n}\nfunction createSourceBufferActor(sourceBuffer, initialContext) {\n\tconst handleError = (e) => {\n\t\tif (!(e instanceof Error && e.name === \"AbortError\")) console.error(\"SourceBuffer operation failed:\", e);\n\t};\n\tconst onMessage = (msg, { transition, setContext, getContext, runner }) => {\n\t\ttransition(\"updating\");\n\t\tconst task = messageToTask(msg, {\n\t\t\tgetContext,\n\t\t\tsourceBuffer,\n\t\t\tsetContext\n\t\t});\n\t\trunner.schedule(task).then(setContext, handleError);\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tsegments: [],\n\t\t\tbufferedRanges: [],\n\t\t\tinitTrackId: void 0,\n\t\t\t...initialContext\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: {\n\t\t\t\t\"append-init\": onMessage,\n\t\t\t\t\"append-segment\": onMessage,\n\t\t\t\tremove: onMessage,\n\t\t\t\tbatch: (msg, { transition, setContext, getContext, runner }) => {\n\t\t\t\t\tconst { messages } = msg;\n\t\t\t\t\tif (messages.length === 0) return;\n\t\t\t\t\ttransition(\"updating\");\n\t\t\t\t\tmessages.forEach((msg) => {\n\t\t\t\t\t\tconst task = messageToTask(msg, {\n\t\t\t\t\t\t\tgetContext,\n\t\t\t\t\t\t\tsourceBuffer,\n\t\t\t\t\t\t\tsetContext\n\t\t\t\t\t\t});\n\t\t\t\t\t\trunner.schedule(task).then(setContext, handleError);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} },\n\t\t\tupdating: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { cancel: (_, { runner }) => {\n\t\t\t\t\trunner.abortAll();\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createSourceBufferActor };\n\n//# sourceMappingURL=source-buffer.js.map","import { computed } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { hasCodecs } from \"../../../media/utils/tracks.js\";\nimport { AUDIO_TYPE_CONFIG, VIDEO_TYPE_CONFIG } from \"../track-types.js\";\nimport { getSelectedTrack } from \"../../../media/utils/track-selection.js\";\nimport { buildMimeCodec, createSourceBuffer } from \"../../../media/dom/mse/mediasource-setup.js\";\nimport { createTrackedFetch, fetchStream } from \"../../../network/fetch.js\";\nimport { createSegmentLoaderActor } from \"../../actors/dom/segment-loader.js\";\nimport { createSourceBufferActor } from \"../../actors/dom/source-buffer.js\";\n//#region src/playback/behaviors/dom/setup-buffer-actors.ts\n/**\n* **Per-type buffer + segment-loader actor setup.** Per available track\n* type (video / audio), when `mediaSource` is attached and the selected\n* track of that type is present in the presentation with codecs (partial\n* resolution from the multivariant playlist is enough — codecs live on\n* the `EXT-X-STREAM-INF` line, not in the per-type media playlist),\n* creates a `SourceBuffer`, a `SourceBufferActor`, and a\n* `SegmentLoaderActor` bound to that buffer-actor; publishes the per-type\n* actor slots. On `mediaSource` detach or behavior destroy, destroys both\n* actors in reverse order and clears the per-type slots so the next\n* source starts fresh.\n*\n* Each per-type variant (`setupVideoBufferActors` /\n* `setupAudioBufferActors`) is a single-positive-state reactor\n* (`'preconditions-unmet'` ↔ `'buffer-ready'`) gating only on its own\n* type. No cross-type coupling in `stateKeys` —\n* `setupVideoBufferActors` carries only `selectedVideoTrackId` (plus\n* `bandwidthState`, written by its trackedFetch), and audio mirrors.\n*\n* # Firefox `mozHasAudio` invariant\n*\n* Appending to a video `SourceBuffer` before the audio `SourceBuffer`\n* exists causes `mozHasAudio` to be permanently false in Firefox. With\n* the two per-type variants decoupled, the invariant is no longer\n* structural to a single `entry` body (as it was when both buffers were\n* created in one synchronous block inside a merged behavior). It's now\n* preserved by a chain of assumptions about how this behavior composes\n* with its upstream and downstream siblings:\n*\n* 1. **Upstream — default selections land in one `runPending`.**\n* `selectAudioTrack` (default audio) and `switchVideoQuality`\n* (default video) both subscribe to `state.presentation` flipping to\n* resolved; their effects run in the same `runPending` iteration and\n* write `selectedAudioTrackId` + `selectedVideoTrackId` within it.\n* 2. **Self — both per-type monitors flip in one `runPending`.**\n* After (1), both monitors re-evaluate and flip to `'buffer-ready'`\n* in the next `runPending`. Both `entry` bodies run synchronously\n* within that iteration — both `addSourceBuffer` calls land before\n* the iteration ends.\n* 3. **Downstream — `appendBuffer` is async.** `loadVideoSegments` /\n* `loadAudioSegments` read the per-type `xSegmentLoaderActor` slots;\n* their effects fire in the *next* `runPending` and the actual\n* `appendBuffer` requires a network round-trip via the\n* `SegmentLoaderActor` — many microtasks past both `addSourceBuffer`\n* calls.\n*\n* The cross-tick failure mode — a user-initiated audio track switch\n* *after* video segments have begun appending — is out of scope for\n* this behavior and would be addressed in the buffer/segment-loading\n* path via `changeType`-aware logic.\n*\n* # Sole writer\n*\n* `setupVideoBufferActors` is sole writer of `videoBufferActor` +\n* `videoSegmentLoaderActor` (and `bandwidthState` via its\n* trackedFetch); `setupAudioBufferActors` is sole writer of\n* `audioBufferActor` + `audioSegmentLoaderActor`. Both read\n* `mediaSource` from `setupMediaSource`. Downstream MSE behaviors\n* (`loadVideoSegments`, `loadAudioSegments`, `endOfStream`,\n* `updateMediaSourceDuration`) only read these slots.\n*/\nfunction setupBufferActors({ state, context, config }) {\n\tconst { type, selectedKey, actorKey, loaderKey, fetch, forwardBuffer, backBuffer } = config;\n\tconst derivedStateSignal = computed(() => {\n\t\tif (!context.mediaSource.get()) return \"preconditions-unmet\";\n\t\treturn hasCodecs(getSelectedTrack({\n\t\t\tpresentation: state.presentation.get(),\n\t\t\t[selectedKey]: state[selectedKey].get()\n\t\t}, type)) ? \"buffer-ready\" : \"preconditions-unmet\";\n\t});\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"buffer-ready\": { entry: () => {\n\t\t\t\tconst bufferActor = createSourceBufferActor(createSourceBuffer(context.mediaSource.get(), buildMimeCodec(getSelectedTrack({\n\t\t\t\t\tpresentation: state.presentation.get(),\n\t\t\t\t\t[selectedKey]: state[selectedKey].get()\n\t\t\t\t}, type))));\n\t\t\t\tconst segmentLoader = createSegmentLoaderActor(bufferActor, fetch, {\n\t\t\t\t\tforwardBuffer,\n\t\t\t\t\tbackBuffer\n\t\t\t\t});\n\t\t\t\tcontext[actorKey].set(bufferActor);\n\t\t\t\tcontext[loaderKey].set(segmentLoader);\n\t\t\t\treturn () => {\n\t\t\t\t\tsegmentLoader.destroy();\n\t\t\t\t\tbufferActor.destroy();\n\t\t\t\t\tcontext[loaderKey].set(void 0);\n\t\t\t\t\tcontext[actorKey].set(void 0);\n\t\t\t\t};\n\t\t\t} }\n\t\t}\n\t});\n}\n/**\n* Set up the video `SourceBufferActor` + `SegmentLoaderActor`. Fires\n* when `mediaSource` is attached and the selected video track is\n* present in the presentation with codecs. Gates only on video state —\n* no cross-type coupling. Owns a bandwidth-sampling `trackedFetch` and\n* is sole writer of `state.bandwidthState`.\n*/\nconst setupVideoBufferActors = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"selectedVideoTrackId\",\n\t\t\"bandwidthState\"\n\t],\n\tcontextKeys: [\n\t\t\"mediaSource\",\n\t\t\"videoBufferActor\",\n\t\t\"videoSegmentLoaderActor\"\n\t],\n\tsetup: ({ state, context, config = {} }) => {\n\t\tconst trackedFetch = createTrackedFetch(state.bandwidthState.get() ?? {\n\t\t\tfastEstimate: 0,\n\t\t\tfastTotalWeight: 0,\n\t\t\tslowEstimate: 0,\n\t\t\tslowTotalWeight: 0,\n\t\t\tbytesSampled: 0\n\t\t}, (next) => state.bandwidthState.set(next));\n\t\treturn setupBufferActors({\n\t\t\tstate,\n\t\t\tcontext,\n\t\t\tconfig: {\n\t\t\t\t...VIDEO_TYPE_CONFIG,\n\t\t\t\tfetch: trackedFetch,\n\t\t\t\t...config\n\t\t\t}\n\t\t});\n\t}\n});\n/**\n* Set up the audio `SourceBufferActor` + `SegmentLoaderActor`. Same\n* shape as `setupVideoBufferActors`, narrowed to audio. Today supplies\n* a non-sampling `fetchStream` (no audio ABR); adding audio ABR is a\n* localized change to this setup body (swap `fetchStream` for a\n* `createTrackedFetch` call + declare `bandwidthState` writable here)\n* without touching the shared helper.\n*/\nconst setupAudioBufferActors = defineBehavior({\n\tstateKeys: [\"presentation\", \"selectedAudioTrackId\"],\n\tcontextKeys: [\n\t\t\"mediaSource\",\n\t\t\"audioBufferActor\",\n\t\t\"audioSegmentLoaderActor\"\n\t],\n\tsetup: ({ state, context, config = {} }) => setupBufferActors({\n\t\tstate,\n\t\tcontext,\n\t\tconfig: {\n\t\t\t...AUDIO_TYPE_CONFIG,\n\t\t\tfetch: fetchStream,\n\t\t\t...config\n\t\t}\n\t})\n});\n//#endregion\nexport { setupAudioBufferActors, setupVideoBufferActors };\n\n//# sourceMappingURL=setup-buffer-actors.js.map","import { computed } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { isResolvedPresentation } from \"../../../media/types/index.js\";\nimport { attachMediaSource, createMediaSource, waitForMediaSourceOpen } from \"../../../media/dom/mse/mediasource-setup.js\";\n//#region src/playback/behaviors/dom/setup-mediasource.ts\n/**\n* **Own the MediaSource lifecycle for the current source.** When a resolved\n* presentation and a mediaElement are both in scope, creates a MediaSource,\n* attaches it to the element, waits for `'open'`, and publishes it on\n* `context.mediaSource`. On source change or behavior destroy, detaches the\n* MediaSource and clears the slot so the next source starts fresh.\n*\n* Single-positive-state reactor (`'preconditions-unmet'` ↔ `'mediasource-attached'`):\n* state derivation gates on `mediaElement + isResolvedPresentation`. Riding the\n* resolver's resolved/unresolved lifecycle makes direct URL replacement\n* structural — `resolvePresentation` routes the presentation back through\n* unresolved on URL change, which drives this reactor through\n* `'preconditions-unmet'` so the entry's state-exit cleanup detaches the old\n* MediaSource before the new one is built.\n*\n* The entry resolves preconditions in sequence before publishing:\n*\n* 1. **Create + attach** — `createMediaSource` + `attachMediaSource` run\n* synchronously on entry. The `detach` closure returned by\n* `attachMediaSource` is captured for state-exit cleanup, so the cleanup\n* is always bound to its setup even if the wait below is aborted.\n* 2. **Wait for `'open'`** — `waitForMediaSourceOpen` defers until the first\n* `sourceopen` event (or any readyState transition out of `'closed'`).\n* 3. **Publish on `'open'`** — re-check `readyState === 'open'` after the\n* await (covers `'ended'` / `'closed'` race) before writing to\n* `context.mediaSource`. Downstream `setupVideoBufferActors` /\n* `setupAudioBufferActors` call `addSourceBuffer` directly, which\n* throws on non-open, so publish-only-when-open is the load-bearing\n* contract.\n*\n* State-exit cleanup aborts the in-flight wait, detaches the MediaSource,\n* and clears `context.mediaSource`. Order: abort first (prevents a late\n* publish racing the slot clear), then detach, then clear.\n*\n* Sole writer of `context.mediaSource`; other MSE behaviors\n* (`setupVideoBufferActors`, `setupAudioBufferActors`,\n* `updateMediaSourceDuration`, `endOfStream`, `loadVideoSegments`) only\n* read.\n*/\nfunction deriveState(presentation, mediaElement) {\n\tif (!mediaElement || !isResolvedPresentation(presentation)) return \"preconditions-unmet\";\n\treturn \"mediasource-attached\";\n}\nfunction setupMediaSourceSetup({ state, context }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), context.mediaElement.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"mediasource-attached\": { entry: () => {\n\t\t\t\tconst mediaElement = context.mediaElement.get();\n\t\t\t\tconst controller = new AbortController();\n\t\t\t\tconst mediaSource = createMediaSource({ preferManaged: true });\n\t\t\t\tconst { detach } = attachMediaSource(mediaSource, mediaElement);\n\t\t\t\tconst publishWhenOpen = async () => {\n\t\t\t\t\tawait waitForMediaSourceOpen(mediaSource, controller.signal);\n\t\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\t\tif (mediaSource.readyState !== \"open\") {\n\t\t\t\t\t\tconsole.warn(`[setupMediaSource] MediaSource transitioned to '${mediaSource.readyState}' before first 'sourceopen' — slot left unpublished; recoverable on next source reset.`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcontext.mediaSource.set(mediaSource);\n\t\t\t\t};\n\t\t\t\tpublishWhenOpen().catch((err) => console.error(\"[setupMediaSource] failed to publish MediaSource:\", err));\n\t\t\t\treturn () => {\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t\tdetach();\n\t\t\t\t\tcontext.mediaSource.set(void 0);\n\t\t\t\t};\n\t\t\t} }\n\t\t}\n\t});\n}\nconst setupMediaSource = defineBehavior({\n\tstateKeys: [\"presentation\"],\n\tcontextKeys: [\"mediaElement\", \"mediaSource\"],\n\tsetup: setupMediaSourceSetup\n});\n//#endregion\nexport { setupMediaSource };\n\n//# sourceMappingURL=setup-mediasource.js.map","import { computed, peek } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { getTracksByType } from \"../../../media/utils/tracks.js\";\nimport { syncTextTrackModes } from \"../../../media/dom/text/text-track-slots.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/playback/behaviors/dom/sync-text-tracks.ts\n/**\n* **Own the text-track slots on the host media element, mirroring the SPF\n* model.** When a presentation is resolved and a media element is\n* available, allocate one slot in `mediaElement.textTracks` per model text\n* track — via creating `<track>` children, since that's the only spec\n* mechanism for adding *and* removing entries to `textTracks` (no\n* `removeTextTrack` API exists). Once slots are provisioned, mirror\n* `selectedTextTrackId` into their `mode`s, and propagate user-initiated\n* DOM `change` events back to `selectedTextTrackId` so non-SPF consumers\n* (host-page captions buttons, browser native UI, video.js store) remain\n* the canonical write path for selection.\n*\n* Single-positive-state reactor (`'preconditions-unmet'` ↔ `'sync-active'`):\n* the entry allocates the slots, applies the initial selection, attaches\n* the `change` listener, and opens a brief Chromium settling-window guard —\n* all transition-driven, fire-once on state entry, with paired cleanup on\n* state exit. A single `effects:` mirrors subsequent\n* `selectedTextTrackId` changes into `mode`s; that's the only\n* continuous-reactivity concern.\n*\n* State-exit cleanup also sends a `'clear'` message to the\n* `TextTracksActor` so its cue+segment cache (keyed by trackId) is\n* dropped alongside the DOM `<track>` slots. The actor itself is owned\n* by `setupTextTrackActors` and bound to mediaElement, not presentation,\n* so it survives source resets; clearing its context here keeps the\n* cache consistent with the DOM. Without this, a subsequent\n* presentation reusing a trackId would have `getSegmentsToLoad` treat\n* its segments as already-buffered and skip loading them.\n*\n* Multi-writer with `selectTextTrack` is intentional and orthogonal:\n* `selectTextTrack` owns the *default-on-load / clear-on-unload* contract\n* for `selectedTextTrackId`; this behavior writes only from DOM `change`\n* events. They reflect distinct decision-making domains (config-driven\n* intent vs DOM-driven user action), so this behavior never clears the\n* slot on source unload — that's `selectTextTrack`'s contract. (It *does*\n* write `undefined` when a user disables all tracks via native UI, since\n* that's a real user action that should round-trip into SPF state.)\n*/\nfunction deriveState(presentation, mediaElement) {\n\tif (!mediaElement || !presentation) return \"preconditions-unmet\";\n\treturn getTracksByType(presentation, \"text\").length > 0 ? \"sync-active\" : \"preconditions-unmet\";\n}\nfunction syncTextTracksSetup({ state, context, config }) {\n\tconst { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } = config;\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), context.mediaElement.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"sync-active\": {\n\t\t\t\tentry: () => {\n\t\t\t\t\tconst mediaElement = context.mediaElement.get();\n\t\t\t\t\taddSubtitlesTracksToMedia(mediaElement, getTracksByType(state.presentation.get(), \"text\"));\n\t\t\t\t\tsyncTextTrackModes(mediaElement.textTracks, state.selectedTextTrackId.get());\n\t\t\t\t\tlet inSettlingWindow = true;\n\t\t\t\t\tconst settlingTimeout = setTimeout(() => {\n\t\t\t\t\t\tinSettlingWindow = false;\n\t\t\t\t\t}, 0);\n\t\t\t\t\tconst onChange = () => {\n\t\t\t\t\t\tif (inSettlingWindow) {\n\t\t\t\t\t\t\tsyncTextTrackModes(mediaElement.textTracks, state.selectedTextTrackId.get());\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst nextId = getShowingSubtitlesTrackFromMedia(mediaElement)?.id || void 0;\n\t\t\t\t\t\tif (nextId === state.selectedTextTrackId.get()) return;\n\t\t\t\t\t\tstate.selectedTextTrackId.set(nextId);\n\t\t\t\t\t};\n\t\t\t\t\tconst unlisten = listen(mediaElement.textTracks, \"change\", onChange);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tunlisten();\n\t\t\t\t\t\tclearTimeout(settlingTimeout);\n\t\t\t\t\t\tremoveAllSubtitlesTracksFromMedia(mediaElement);\n\t\t\t\t\t\tpeek(context.textTracksActor)?.send({ type: \"clear\" });\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\teffects: () => {\n\t\t\t\t\tsyncTextTrackModes(peek(context.mediaElement).textTracks, state.selectedTextTrackId.get());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\nconst syncTextTracks = defineBehavior({\n\tstateKeys: [\"presentation\", \"selectedTextTrackId\"],\n\tcontextKeys: [\"mediaElement\", \"textTracksActor\"],\n\tsetup: syncTextTracksSetup\n});\n//#endregion\nexport { syncTextTracks };\n\n//# sourceMappingURL=sync-text-tracks.js.map","import { computed } from \"../../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../../core/reactors/create-machine-reactor.js\";\nimport { getMaxBufferedEnd, shouldUpdateDuration, waitForSourceBuffersReady } from \"../../../media/dom/mse/duration.js\";\nimport { waitForMediaSourceOpen } from \"../../../media/dom/mse/mediasource-setup.js\";\n//#region src/playback/behaviors/dom/update-mediasource-duration.ts\n/**\n* **Propagate `presentation.duration` to `mediaSource.duration` — exactly\n* once per MediaSource.**\n*\n* When the presentation has a valid positive duration (including `Infinity`\n* for live) and a MediaSource is in context, writes the value through to\n* `mediaSource.duration` on initial setup — once, while `mediaSource.duration`\n* is still `NaN`. Once any non-NaN value is present (set by us, or by\n* `endOfStream` from the buffered end), the behavior leaves the property\n* alone; re-syncing a drift against `presentation.duration` would race with\n* concurrent `appendBuffer()` calls.\n*\n* The entry resolves three async preconditions in order before writing:\n*\n* 1. **MediaSource open** — `waitForMediaSourceOpen` defers until the first\n* `sourceopen` event (or any readyState transition, since `'ended'` /\n* `'closed'` mean we've missed the window and should bail).\n* 2. **All SourceBuffers idle** — `waitForSourceBuffersReady` defers per\n* the MSE-spec rule that `duration` cannot be set while any buffer has\n* `updating === true`.\n* 3. **Buffered-range clamp** — `getMaxBufferedEnd` ensures the written\n* duration is at least the highest buffered end (MSE spec disallows\n* a smaller `duration` than any buffered range).\n*\n* The buffer-set helpers operate across `mediaSource.sourceBuffers` (the\n* canonical aggregate), so the behavior composes uniformly across\n* audio-only, video-only, and mixed configurations.\n*\n* Single-positive-state reactor (`'preconditions-unmet'` ↔ `'duration-writable'`):\n* state derivation is purely signal-driven (presentation validity +\n* mediaSource existence). MediaSource lifecycle state (`readyState`) and\n* the `duration` itself are non-signal DOM properties resolved inside the\n* entry's async sequence. The state-exit cleanup aborts the in-flight\n* wait, so source resets and behavior destroy structurally cancel the\n* pending write. A post-await re-check of `mediaSource.readyState ===\n* 'open'` covers the narrow race where `endOfStream()` synchronously\n* transitions readyState to `'ended'` between our `waitForMediaSourceOpen`\n* resolution and the `mediaSource.duration` write.\n*\n* Downstream of `calculatePresentationDuration` (which writes\n* `presentation.duration`); concurrent with `endOfStream` (which may later\n* write `mediaSource.duration` — the \"exactly once\" contract keeps us out\n* of that path).\n*/\nfunction deriveState(presentation, mediaSource) {\n\treturn shouldUpdateDuration(presentation, mediaSource) ? \"duration-writable\" : \"preconditions-unmet\";\n}\nfunction updateMediaSourceDurationSetup({ state, context }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), context.mediaSource.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"duration-writable\": { entry: () => {\n\t\t\t\tconst presentation = state.presentation.get();\n\t\t\t\tconst mediaSource = context.mediaSource.get();\n\t\t\t\tif (!Number.isNaN(mediaSource.duration)) return;\n\t\t\t\tconst controller = new AbortController();\n\t\t\t\tconst writeWhenReady = async () => {\n\t\t\t\t\tawait waitForMediaSourceOpen(mediaSource, controller.signal);\n\t\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\t\tif (mediaSource.readyState !== \"open\") return;\n\t\t\t\t\tawait waitForSourceBuffersReady(mediaSource.sourceBuffers, controller.signal);\n\t\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\t\tif (mediaSource.readyState !== \"open\") return;\n\t\t\t\t\tconst maxBufferedEnd = getMaxBufferedEnd(mediaSource.sourceBuffers);\n\t\t\t\t\tmediaSource.duration = maxBufferedEnd > presentation.duration ? maxBufferedEnd : presentation.duration;\n\t\t\t\t};\n\t\t\t\twriteWhenReady();\n\t\t\t\treturn () => controller.abort();\n\t\t\t} }\n\t\t}\n\t});\n}\nconst updateMediaSourceDuration = defineBehavior({\n\tstateKeys: [\"presentation\"],\n\tcontextKeys: [\"mediaSource\"],\n\tsetup: updateMediaSourceDurationSetup\n});\n//#endregion\nexport { updateMediaSourceDuration };\n\n//# sourceMappingURL=update-mediasource-duration.js.map","//#region src/media/abr/quality-selection.ts\n/**\n* Default quality selection configuration.\n* Values match Shaka Player upgrade threshold (0.85 = 15% headroom).\n*/\nconst DEFAULT_QUALITY_CONFIG = {\n\tsafetyMargin: .85,\n\tupgradeMargin: 1.15\n};\n/**\n* Select the track to apply now, given current bandwidth, a current\n* selection (optional), and tuning. Returns:\n*\n* - The bandwidth-fitting optimal when no `currentTrack` is supplied.\n* - The optimal when it's a downgrade vs. `currentTrack` (downgrades\n* apply immediately — no hysteresis).\n* - The optimal when it clears `currentTrack.bandwidth * upgradeMargin`\n* (upgrade clears hysteresis).\n* - `currentTrack` itself when an upgrade doesn't clear the margin\n* (stay put — caller checks identity to no-op).\n*\n* \"Optimal\" is the highest-bandwidth track where the available bandwidth\n* meets the safety requirement (`currentBandwidth >= track.bandwidth / safetyMargin`).\n* Falls back to the lowest-bandwidth track when nothing fits the safety\n* margin (preserves a definitive pick under under-bandwidth conditions).\n*\n* @example\n* const tracks = [low, mid, high];\n* selectQuality(tracks, 5_000_000, { currentTrack: low });\n* // Returns `high` if 5 Mbps clears safety AND high.bandwidth >= low.bandwidth * upgradeMargin.\n* // Returns `low` (no-op signal) otherwise.\n*/\nfunction selectQuality(tracks, currentBandwidth, opts = {}) {\n\tif (tracks.length === 0) return;\n\tconst safetyMargin = opts.safetyMargin ?? DEFAULT_QUALITY_CONFIG.safetyMargin;\n\tconst upgradeMargin = opts.upgradeMargin ?? DEFAULT_QUALITY_CONFIG.upgradeMargin;\n\tconst { currentTrack } = opts;\n\tconst sortedTracks = tracks.slice().sort((a, b) => a.bandwidth - b.bandwidth);\n\tlet chosen;\n\tfor (const track of sortedTracks) if (currentBandwidth >= track.bandwidth / safetyMargin) {\n\t\tif (!chosen || track.bandwidth > chosen.bandwidth || track.bandwidth === chosen.bandwidth && hasHigherResolution(track, chosen)) chosen = track;\n\t}\n\tconst optimal = chosen ?? sortedTracks[0];\n\tif (!optimal) return void 0;\n\tif (!currentTrack) return optimal;\n\tif (optimal.bandwidth < currentTrack.bandwidth) return optimal;\n\tif (optimal.bandwidth >= currentTrack.bandwidth * upgradeMargin) return optimal;\n\treturn currentTrack;\n}\n/**\n* Select the lowest-bandwidth track from the candidate set.\n*\n* Used as a safety-net fallback by callers that need a definitive pick when\n* a primary selection algorithm declines to choose. Pairs naturally with\n* `selectQuality` — when ABR has no good answer (e.g., all candidates\n* exceed available bandwidth and the algorithm doesn't fall back\n* internally), the lowest bitrate is the safest default.\n*\n* @param tracks - Candidate tracks (can be unsorted)\n* @returns The lowest-bandwidth track, or `undefined` if `tracks` is empty\n*\n* @example\n* const fallback = selectLowestQuality(tracks);\n*/\nfunction selectLowestQuality(tracks) {\n\tif (tracks.length === 0) return void 0;\n\treturn tracks.reduce((min, t) => t.bandwidth < min.bandwidth ? t : min);\n}\n/**\n* Check if track A has higher resolution than track B.\n* Compares by total pixel count (width × height).\n*\n* @param trackA - First track to compare\n* @param trackB - Second track to compare\n* @returns True if trackA has more pixels than trackB\n*/\nfunction hasHigherResolution(trackA, trackB) {\n\treturn (trackA.width ?? 0) * (trackA.height ?? 0) > (trackB.width ?? 0) * (trackB.height ?? 0);\n}\n//#endregion\nexport { DEFAULT_QUALITY_CONFIG, selectLowestQuality, selectQuality };\n\n//# sourceMappingURL=quality-selection.js.map","import { computed, peek } from \"../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../core/reactors/create-machine-reactor.js\";\nimport { isResolvedPresentation } from \"../../media/types/index.js\";\nimport { getTracksByType } from \"../../media/utils/tracks.js\";\nimport { DEFAULT_BANDWIDTH_CONFIG, getBandwidthEstimate } from \"../../network/bandwidth-estimator.js\";\nimport { DEFAULT_QUALITY_CONFIG, selectLowestQuality, selectQuality } from \"../../media/abr/quality-selection.js\";\nfunction setupQualitySwitching({ state, config }) {\n\tconst safetyMargin = config.quality?.safetyMargin ?? DEFAULT_QUALITY_CONFIG.safetyMargin;\n\tconst upgradeMargin = config.quality?.upgradeMargin ?? DEFAULT_QUALITY_CONFIG.upgradeMargin;\n\tconst initialBandwidth = config.initialBandwidth ?? 5e6;\n\tconst bandwidthConfig = {\n\t\t...DEFAULT_BANDWIDTH_CONFIG,\n\t\t...config.bandwidth\n\t};\n\tconst { selectionKey, userSelectionKey, getTracks, selectOptimal } = config;\n\tconst derivedStateSignal = computed(() => isResolvedPresentation(state.presentation.get()) ? \"presentation-resolved\" : \"presentation-unresolved\");\n\treturn createMachineReactor({\n\t\tinitial: \"presentation-unresolved\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"presentation-unresolved\": {},\n\t\t\t\"presentation-resolved\": {\n\t\t\t\tentry: () => () => state[selectionKey].set(void 0),\n\t\t\t\teffects: [() => {\n\t\t\t\t\tconst presentation = peek(state.presentation);\n\t\t\t\t\tif (!presentation) return;\n\t\t\t\t\tconst allTracks = getTracks(presentation);\n\t\t\t\t\tconst [firstAllTrack] = allTracks;\n\t\t\t\t\tif (!firstAllTrack) return;\n\t\t\t\t\tconst userFilter = state[userSelectionKey].get();\n\t\t\t\t\tconst matching = userFilter ? allTracks.filter((track) => {\n\t\t\t\t\t\tfor (const key in userFilter) {\n\t\t\t\t\t\t\tconst filterValue = userFilter[key];\n\t\t\t\t\t\t\tif (filterValue !== void 0 && track[key] !== filterValue) return false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}) : allTracks;\n\t\t\t\t\tconst candidates = matching.length > 0 ? matching : allTracks;\n\t\t\t\t\tif (!candidates.length) return;\n\t\t\t\t\tconst selectedId = state[selectionKey].get();\n\t\t\t\t\tif (candidates.length === 1) {\n\t\t\t\t\t\tif (candidates[0].id !== selectedId) state[selectionKey].set(candidates[0].id);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst bandwidth = getBandwidthEstimate(state.bandwidthState.get(), initialBandwidth, bandwidthConfig);\n\t\t\t\t\tif (!selectedId && config.picker) {\n\t\t\t\t\t\tconst id = config.picker(presentation, config);\n\t\t\t\t\t\tif (id) {\n\t\t\t\t\t\t\tstate[selectionKey].set(id);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst optimal = selectOptimal(candidates, bandwidth, {\n\t\t\t\t\t\tsafetyMargin,\n\t\t\t\t\t\tupgradeMargin,\n\t\t\t\t\t\tcurrentTrack: candidates.find((t) => t.id === selectedId)\n\t\t\t\t\t}) ?? selectLowestQuality(candidates);\n\t\t\t\t\tif (optimal.id !== selectedId) state[selectionKey].set(optimal.id);\n\t\t\t\t}]\n\t\t\t}\n\t\t}\n\t});\n}\n/**\n* Manage `selectedVideoTrackId`: pick a default on src load, dynamically\n* adjust based on bandwidth, clear on src unload. Honors\n* `userVideoTrackSelection` as a partial-track constraint on candidates;\n* short-circuits ABR when the constraint narrows to a single track.\n*\n* @example\n* const reactor = switchVideoQuality.setup({ state });\n*/\nconst switchVideoQuality = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"bandwidthState\",\n\t\t\"selectedVideoTrackId\",\n\t\t\"userVideoTrackSelection\"\n\t],\n\tcontextKeys: [],\n\tsetup: ({ state, config }) => setupQualitySwitching({\n\t\tstate,\n\t\tconfig: {\n\t\t\t...config,\n\t\t\tselectionKey: \"selectedVideoTrackId\",\n\t\t\tuserSelectionKey: \"userVideoTrackSelection\",\n\t\t\tgetTracks: (presentation) => getTracksByType(presentation, \"video\"),\n\t\t\tselectOptimal: selectQuality\n\t\t}\n\t})\n});\n//#endregion\nexport { switchVideoQuality };\n\n//# sourceMappingURL=quality-switching.js.map","//#region src/media/utils/preload.ts\nfunction isStandardPreload(value) {\n\treturn value === \"auto\" || value === \"metadata\" || value === \"none\";\n}\n/**\n* Default `preload` value used as the fallback across behaviors\n* (`syncPreload`, `resolvePresentation`, `isBlockingPreload`). Matches the\n* `<video>`/`<audio>` element's implicit default.\n*/\nconst DEFAULT_PRELOAD = \"metadata\";\n/**\n* True when the preload value blocks initial resolution / loading.\n* Falsy values (undefined, empty) fall back to `defaultPreload` (default\n* `DEFAULT_PRELOAD`); the resolved value blocks iff it is `'none'`.\n*/\nfunction isBlockingPreload(preload, defaultPreload = DEFAULT_PRELOAD) {\n\treturn (preload || defaultPreload) === \"none\";\n}\n//#endregion\nexport { DEFAULT_PRELOAD, isBlockingPreload, isStandardPreload };\n\n//# sourceMappingURL=preload.js.map","import { computed } from \"../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../core/reactors/create-machine-reactor.js\";\nimport { isResolvedPresentation } from \"../../media/types/index.js\";\nimport { fetchResolvable, getResponseText } from \"../../network/fetch.js\";\nimport { isBlockingPreload } from \"../../media/utils/preload.js\";\n//#region src/playback/behaviors/resolve-presentation.ts\n/**\n* **Resolve an unresolved presentation by fetching and parsing its manifest.**\n*\n* Reads `state.presentation`; when it holds `{ url }` (unresolved) and the\n* preload / load-activation gate is met, fetches the manifest, parses it via\n* the **required** `config.parsePresentation`, and writes the resolved\n* `Presentation` back to the same slot. The behavior is format-neutral: the\n* composing engine wires in its parser (e.g. the HLS engine supplies the\n* multivariant-playlist parser).\n*\n* Source-identity-driven, expressed as a 4-state machine:\n*\n* ```\n* 'preconditions-unmet' → 'idle' → 'resolving' → 'resolved'\n* ```\n*\n* - `'preconditions-unmet'`: no presentation, or presentation has no URL.\n* - `'idle'`: URL present, unresolved, gate unmet (blocking preload + no\n* load-activation). Waits for the gate to open.\n* - `'resolving'`: URL present, unresolved, gate met. Entry starts the fetch\n* and returns the AbortController — the reactor calls `.abort()` on state\n* exit, so source change / gate-close / destroy all cancel cleanly.\n* - `'resolved'`: `state.presentation` holds a resolved `Presentation`.\n*\n* Gate semantics: `state.preload` (or `config.defaultPreload`, default\n* `'metadata'`, when state.preload is unset) blocks resolution when its\n* value is `'none'` (see `isBlockingPreload` in `media/utils/preload`).\n* `state.loadActivated` is an override — true bypasses the preload gate\n* entirely.\n*\n* Multi-writer with the engine adapter, which writes the initial unresolved\n* `{ url }` to `state.presentation` from src input. Different domains\n* (config-input vs. derived state via fetch) — legitimate multi-writer.\n*/\nfunction deriveState(presentation, preload, loadActivated, defaultPreload) {\n\tif (!presentation?.url) return \"preconditions-unmet\";\n\tif (isResolvedPresentation(presentation)) return \"resolved\";\n\treturn !!loadActivated || !isBlockingPreload(preload, defaultPreload) ? \"resolving\" : \"idle\";\n}\nfunction resolvePresentationSetup({ state, config }) {\n\tconst { parsePresentation } = config;\n\tconst defaultPreload = config.defaultPreload ?? \"metadata\";\n\tconst derivedStateSignal = computed(() => deriveState(state.presentation.get(), state.preload.get(), state.loadActivated.get(), defaultPreload));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\tidle: {},\n\t\t\tresolving: { entry: () => {\n\t\t\t\tconst presentation = state.presentation.get();\n\t\t\t\tconst ac = new AbortController();\n\t\t\t\tfetchResolvable(presentation, { signal: ac.signal }).then((response) => getResponseText(response)).then((text) => {\n\t\t\t\t\tconst parsed = parsePresentation(text, presentation);\n\t\t\t\t\tstate.presentation.set(parsed);\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") return;\n\t\t\t\t\tconsole.error(\"[resolvePresentation] manifest fetch/parse failed:\", error);\n\t\t\t\t});\n\t\t\t\treturn ac;\n\t\t\t} },\n\t\t\tresolved: {}\n\t\t}\n\t});\n}\nconst resolvePresentation = defineBehavior({\n\tstateKeys: [\n\t\t\"presentation\",\n\t\t\"preload\",\n\t\t\"loadActivated\"\n\t],\n\tcontextKeys: [],\n\tsetup: resolvePresentationSetup\n});\n//#endregion\nexport { resolvePresentation };\n\n//# sourceMappingURL=resolve-presentation.js.map","import { matchTag, parseByteRange, parseExtInfDuration } from \"./parse-attributes.js\";\nimport { resolveUrl } from \"./resolve-url.js\";\n//#region src/media/hls/parse-media-playlist.ts\n/**\n* Parse HLS media playlist and resolve track with segments.\n*\n* Takes an unresolved track (from multivariant playlist) and media playlist text,\n* returns a HAM-compliant resolved track with segments.\n*\n* @param text - Media playlist text content\n* @param unresolved - Unresolved track from parseMultivariantPlaylist\n* @returns Resolved track with segments (type inferred from input)\n*/\nfunction parseMediaPlaylist(text, unresolved) {\n\tconst lines = text.split(/\\r?\\n/);\n\tconst baseUrl = unresolved.url;\n\tconst segments = [];\n\tlet initSegmentUrl;\n\tlet initSegmentByteRange;\n\tlet currentDuration = 0;\n\tlet currentByteRange;\n\tlet currentTime = 0;\n\tlet segmentIndex = 0;\n\tlet previousByteRangeEnd;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-TARGETDURATION:\") || trimmed.startsWith(\"#EXT-X-PLAYLIST-TYPE:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mapAttrs = matchTag(trimmed, \"EXT-X-MAP\");\n\t\tif (mapAttrs) {\n\t\t\tconst uri = mapAttrs.get(\"URI\");\n\t\t\tif (uri) {\n\t\t\t\tinitSegmentUrl = resolveUrl(uri, baseUrl);\n\t\t\t\tconst byteRangeStr = mapAttrs.get(\"BYTERANGE\");\n\t\t\t\tif (byteRangeStr) initSegmentByteRange = parseByteRange(byteRangeStr, 0) ?? void 0;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXTINF:\")) {\n\t\t\tcurrentDuration = parseExtInfDuration(trimmed.slice(8));\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXT-X-BYTERANGE:\")) {\n\t\t\tcurrentByteRange = parseByteRange(trimmed.slice(17), previousByteRangeEnd) ?? void 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed === \"#EXT-X-ENDLIST\") continue;\n\t\tif (!trimmed.startsWith(\"#\") && currentDuration > 0) {\n\t\t\tconst segment = {\n\t\t\t\tid: `segment-${segmentIndex}`,\n\t\t\t\turl: resolveUrl(trimmed, baseUrl),\n\t\t\t\tduration: currentDuration,\n\t\t\t\tstartTime: currentTime\n\t\t\t};\n\t\t\tif (currentByteRange) {\n\t\t\t\tsegment.byteRange = currentByteRange;\n\t\t\t\tpreviousByteRangeEnd = currentByteRange.end + 1;\n\t\t\t} else previousByteRangeEnd = void 0;\n\t\t\tsegments.push(segment);\n\t\t\tcurrentTime += currentDuration;\n\t\t\tsegmentIndex++;\n\t\t\tcurrentDuration = 0;\n\t\t\tcurrentByteRange = void 0;\n\t\t}\n\t}\n\tconst totalDuration = currentTime;\n\tconst initialization = unresolved.type === \"text\" && !initSegmentUrl ? void 0 : initSegmentUrl ? {\n\t\turl: initSegmentUrl,\n\t\t...initSegmentByteRange ? { byteRange: initSegmentByteRange } : {}\n\t} : { url: \"\" };\n\treturn {\n\t\t...unresolved,\n\t\tstartTime: 0,\n\t\tduration: totalDuration,\n\t\tsegments,\n\t\tinitialization\n\t};\n}\n//#endregion\nexport { parseMediaPlaylist };\n\n//# sourceMappingURL=parse-media-playlist.js.map","import { computed, peek, update } from \"../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../core/composition/create-composition.js\";\nimport { ConcurrentRunner, Task } from \"../../core/tasks/task.js\";\nimport { createMachineReactor } from \"../../core/reactors/create-machine-reactor.js\";\nimport { isResolvedPresentation, isResolvedTrack } from \"../../media/types/index.js\";\nimport { findTrack, updateTrackInPresentation } from \"../../media/utils/tracks.js\";\nimport { AUDIO_TYPE_CONFIG, TEXT_TYPE_CONFIG, VIDEO_TYPE_CONFIG } from \"./track-types.js\";\nimport { fetchResolvable, getResponseText } from \"../../network/fetch.js\";\nimport { parseMediaPlaylist } from \"../../media/hls/parse-media-playlist.js\";\n//#region src/playback/behaviors/resolve-track.ts\nfunction setupTrackResolution({ state, config: { selectedKey, findTrackToResolve } }) {\n\tconst runner = new ConcurrentRunner();\n\tconst derivedStateSignal = computed(() => isResolvedPresentation(state.presentation.get()) ? \"presentation-resolved\" : \"presentation-unresolved\");\n\treturn createMachineReactor({\n\t\tinitial: \"presentation-unresolved\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"presentation-unresolved\": {},\n\t\t\t\"presentation-resolved\": {\n\t\t\t\tentry: () => () => runner.abortAll(),\n\t\t\t\teffects: [() => {\n\t\t\t\t\tconst presentation = peek(state.presentation);\n\t\t\t\t\tconst trackId = state[selectedKey].get();\n\t\t\t\t\tif (!presentation || !trackId) return;\n\t\t\t\t\tconst track = findTrackToResolve(presentation, trackId);\n\t\t\t\t\tif (!track || isResolvedTrack(track)) return;\n\t\t\t\t\trunner.schedule(new Task(async (signal) => {\n\t\t\t\t\t\tconst mediaTrack = parseMediaPlaylist(await getResponseText(await fetchResolvable(track, { signal })), track);\n\t\t\t\t\t\tupdate(state.presentation, (current) => isResolvedPresentation(current) ? updateTrackInPresentation(current, mediaTrack) : current);\n\t\t\t\t\t}, { id: track.id }));\n\t\t\t\t}]\n\t\t\t}\n\t\t}\n\t});\n}\nconst VIDEO_TRACK_RESOLUTION_CONFIG = {\n\t...VIDEO_TYPE_CONFIG,\n\tfindTrackToResolve: (presentation, trackId) => findTrack(presentation, \"video\", trackId)\n};\nconst AUDIO_TRACK_RESOLUTION_CONFIG = {\n\t...AUDIO_TYPE_CONFIG,\n\tfindTrackToResolve: (presentation, trackId) => findTrack(presentation, \"audio\", trackId)\n};\nconst TEXT_TRACK_RESOLUTION_CONFIG = {\n\t...TEXT_TYPE_CONFIG,\n\tfindTrackToResolve: (presentation, trackId) => findTrack(presentation, \"text\", trackId)\n};\n/**\n* Resolve unresolved video tracks. Schedules a fetch task whenever the\n* selected video track is partially resolved, parses the manifest, and\n* writes the resolved track back into `state.presentation`.\n*/\nconst resolveVideoTrack = defineBehavior({\n\tstateKeys: [\"presentation\", \"selectedVideoTrackId\"],\n\tcontextKeys: [],\n\tsetup: ({ state, config = {} }) => setupTrackResolution({\n\t\tstate,\n\t\tconfig: {\n\t\t\t...VIDEO_TRACK_RESOLUTION_CONFIG,\n\t\t\t...config\n\t\t}\n\t})\n});\n/**\n* Resolve unresolved audio tracks. Same shape as `resolveVideoTrack`,\n* narrowed to audio.\n*/\nconst resolveAudioTrack = defineBehavior({\n\tstateKeys: [\"presentation\", \"selectedAudioTrackId\"],\n\tcontextKeys: [],\n\tsetup: ({ state, config = {} }) => setupTrackResolution({\n\t\tstate,\n\t\tconfig: {\n\t\t\t...AUDIO_TRACK_RESOLUTION_CONFIG,\n\t\t\t...config\n\t\t}\n\t})\n});\n/**\n* Resolve unresolved text tracks. Same shape as `resolveVideoTrack`,\n* narrowed to text.\n*/\nconst resolveTextTrack = defineBehavior({\n\tstateKeys: [\"presentation\", \"selectedTextTrackId\"],\n\tcontextKeys: [],\n\tsetup: ({ state, config = {} }) => setupTrackResolution({\n\t\tstate,\n\t\tconfig: {\n\t\t\t...TEXT_TRACK_RESOLUTION_CONFIG,\n\t\t\t...config\n\t\t}\n\t})\n});\n//#endregion\nexport { resolveAudioTrack, resolveTextTrack, resolveVideoTrack };\n\n//# sourceMappingURL=resolve-track.js.map","//#region src/media/primitives/select-tracks.ts\n/**\n* Pick the first track of the given type from a presentation.\n*\n* Returns the first track in the first switching set of the matching\n* selection set, or `undefined` if either is missing. POC-shaped\n* default-pick — `pickVideoTrack` / `pickAudioTrack` honor bandwidth +\n* language preferences and will replace this once selection callers are\n* ready.\n*/\nfunction pickFirstTrackId(presentation, type) {\n\treturn presentation.selectionSets?.find((set) => set.type === type)?.switchingSets[0]?.tracks[0]?.id;\n}\n/**\n* Pick text track to activate. Conforms to the `TrackPicker` contract so it\n* can be used directly as a default picker for `selectTextTrack` without an\n* adapter wrapper.\n*\n* Selection priority (if enabled):\n* 1. User preference (preferredSubtitleLanguage)\n* 2. DEFAULT track (if enableDefaultTrack is true and track has DEFAULT=YES + AUTOSELECT=YES)\n* 3. No auto-selection (user opt-in)\n*\n* By default, FORCED tracks are excluded per Apple's HLS spec.\n*/\nfunction pickTextTrack(presentation, config) {\n\tconst textSet = presentation.selectionSets?.find((set) => set.type === \"text\");\n\tif (!textSet?.switchingSets?.[0]?.tracks.length) return void 0;\n\tconst tracks = textSet.switchingSets[0].tracks;\n\tconst availableTracks = config?.includeForcedTracks ? tracks : tracks.filter((track) => !track.forced);\n\tif (availableTracks.length === 0) return void 0;\n\tconst { preferredSubtitleLanguage, enableDefaultTrack = false } = config ?? {};\n\tif (preferredSubtitleLanguage) {\n\t\tconst languageMatch = availableTracks.find((track) => track.language === preferredSubtitleLanguage);\n\t\tif (languageMatch) return languageMatch.id;\n\t}\n\tif (enableDefaultTrack) {\n\t\tconst defaultTrack = availableTracks.find((track) => track.default === true);\n\t\tif (defaultTrack) return defaultTrack.id;\n\t}\n}\n//#endregion\nexport { pickFirstTrackId, pickTextTrack };\n\n//# sourceMappingURL=select-tracks.js.map","import { computed } from \"../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../core/composition/create-composition.js\";\nimport { createMachineReactor } from \"../../core/reactors/create-machine-reactor.js\";\nimport { isResolvedPresentation } from \"../../media/types/index.js\";\nimport { AUDIO_TYPE_CONFIG, TEXT_TYPE_CONFIG, VIDEO_TYPE_CONFIG } from \"./track-types.js\";\nimport { pickFirstTrackId, pickTextTrack } from \"../../media/primitives/select-tracks.js\";\n//#region src/playback/behaviors/select-tracks.ts\n/**\n* **Default audio/text track selection on src load / unselect on src unload.**\n* When a presentation is resolved, sets `selectedAudioTrackId` /\n* `selectedTextTrackId` to a per-type-picker default if no selection already\n* exists. When the presentation is unset/reset (transitions back to\n* unresolved), clears the selection so a stale id from the previous source\n* doesn't persist.\n*\n* Lifecycle-driven: each transition fires its work once. Does not police\n* the selection between transitions; external writes (user picks) are left\n* alone.\n*\n* Picker is config-driven: each per-type export wires a sensible default\n* (`pickFirstTrackId` for audio, `pickTextTrack` for text) and the caller\n* can supply their own via `config.picker` for custom selection logic\n* (language preferences, default-track handling, etc.). The behavior's\n* `config` is forwarded to the picker as its second argument, so options\n* like `preferredAudioLanguage` / `preferredSubtitleLanguage` reach the\n* picker without an intermediate wrapping layer.\n*\n* Compose `selectVideoTrack` for the simple \"pick a default video track\"\n* behavior, or `switchVideoQuality` (`./quality-switching.ts`) for the\n* ABR-driven variant — they're alternatives, not stackable (both write\n* `selectedVideoTrackId`). The simple variant tree-shakes out the\n* ABR machinery (bandwidth-estimator, quality-selection algorithms).\n*/\nfunction setupTrackSelection({ state, config: { selectedKey, picker, pickerConfig } }) {\n\tconst derivedStateSignal = computed(() => isResolvedPresentation(state.presentation.get()) ? \"presentation-resolved\" : \"presentation-unresolved\");\n\treturn createMachineReactor({\n\t\tinitial: \"presentation-unresolved\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"presentation-unresolved\": {},\n\t\t\t\"presentation-resolved\": { entry: () => {\n\t\t\t\tif (!state[selectedKey].get()) {\n\t\t\t\t\tconst id = picker(state.presentation.get(), pickerConfig);\n\t\t\t\t\tif (id) state[selectedKey].set(id);\n\t\t\t\t}\n\t\t\t\treturn () => state[selectedKey].set(void 0);\n\t\t\t} }\n\t\t}\n\t});\n}\n/** Default video picker: first track in the video selection set. */\nconst defaultVideoPicker = (presentation) => pickFirstTrackId(presentation, \"video\");\nconst VIDEO_TRACK_SELECTION_CONFIG = {\n\t...VIDEO_TYPE_CONFIG,\n\tpicker: defaultVideoPicker\n};\n/** Default audio picker: first track in the audio selection set. */\nconst defaultAudioPicker = (presentation) => pickFirstTrackId(presentation, \"audio\");\nconst AUDIO_TRACK_SELECTION_CONFIG = {\n\t...AUDIO_TYPE_CONFIG,\n\tpicker: defaultAudioPicker\n};\nconst TEXT_TRACK_SELECTION_CONFIG = {\n\t...TEXT_TYPE_CONFIG,\n\tpicker: pickTextTrack\n};\ndefineBehavior({\n\tstateKeys: [\"presentation\", \"selectedVideoTrackId\"],\n\tcontextKeys: [],\n\tsetup: ({ state, config }) => setupTrackSelection({\n\t\tstate,\n\t\tconfig: {\n\t\t\t...VIDEO_TRACK_SELECTION_CONFIG,\n\t\t\tpicker: config?.picker ?? VIDEO_TRACK_SELECTION_CONFIG.picker,\n\t\t\tpickerConfig: config\n\t\t}\n\t})\n});\n/**\n* Select an audio track when a presentation loads. Clears the selection\n* on src unload.\n*\n* @example\n* const reactor = selectAudioTrack.setup({ state });\n*\n* @example\n* // Custom picker with language preference\n* const reactor = selectAudioTrack.setup({\n* state,\n* config: { preferredAudioLanguage: 'en', picker: myLanguageAwarePicker },\n* });\n*/\nconst selectAudioTrack = defineBehavior({\n\tstateKeys: [\"presentation\", \"selectedAudioTrackId\"],\n\tcontextKeys: [],\n\tsetup: ({ state, config }) => setupTrackSelection({\n\t\tstate,\n\t\tconfig: {\n\t\t\t...AUDIO_TRACK_SELECTION_CONFIG,\n\t\t\tpicker: config?.picker ?? AUDIO_TRACK_SELECTION_CONFIG.picker,\n\t\t\tpickerConfig: config\n\t\t}\n\t})\n});\n/**\n* Select a text track based on user preferences (preferred language,\n* default-track auto-select, forced-track filtering). Clears the selection\n* on src unload.\n*\n* Unlike audio selection, the default text picker returns `undefined` when\n* no preference matches, leaving the selection unset — text-track\n* selection is user opt-in.\n*\n* @example\n* const reactor = selectTextTrack.setup({ state, config: { preferredSubtitleLanguage: 'en' } });\n*/\nconst selectTextTrack = defineBehavior({\n\tstateKeys: [\"presentation\", \"selectedTextTrackId\"],\n\tcontextKeys: [],\n\tsetup: ({ state, config }) => setupTrackSelection({\n\t\tstate,\n\t\tconfig: {\n\t\t\t...TEXT_TRACK_SELECTION_CONFIG,\n\t\t\tpicker: config?.picker ?? TEXT_TRACK_SELECTION_CONFIG.picker,\n\t\t\tpickerConfig: config\n\t\t}\n\t})\n});\n//#endregion\nexport { selectAudioTrack, selectTextTrack };\n\n//# sourceMappingURL=select-tracks.js.map","import { computed, peek } from \"../../core/signals/primitives.js\";\nimport { defineBehavior } from \"../../core/composition/create-composition.js\";\nimport { effect } from \"../../core/signals/effect.js\";\nimport { isStandardPreload } from \"../../media/utils/preload.js\";\n//#region src/playback/behaviors/sync-preload.ts\n/**\n* **Bidirectional sync between `state.preload` and `mediaElement.preload`.**\n*\n* Two effects:\n* - **Read (DOM → state)** — on `context.mediaElement` swap or\n* `state.presentation.url` change, copies `mediaElement.preload` into\n* `state.preload` if it's a W3C value and `state.preload` isn't holding\n* an extended (non-W3C) value. When the DOM has no W3C opinion and\n* `state.preload` is undefined, backfills from `config.defaultPreload`\n* (default-default `'metadata'`) so `state.preload` is never undefined\n* in steady state.\n* - **Write (state → DOM)** — on `state.preload` change or\n* `context.mediaElement` swap, writes `state.preload` back to\n* `mediaElement.preload` if the value is W3C.\n*\n* Extended values (e.g. `'canplay'`) written externally to `state.preload`\n* are sticky: read won't overwrite them, write won't push them to the DOM.\n* All writes are deduped to break echo loops and avoid spurious re-triggers\n* downstream (notably `resolvePresentation`, which reads `state.preload`).\n*/\nfunction syncPreloadSetup({ state, context, config }) {\n\tconst defaultPreload = config?.defaultPreload ?? \"metadata\";\n\tconst presentationUrl = computed(() => state.presentation.get()?.url);\n\tconst cleanupRead = effect(() => {\n\t\tpresentationUrl.get();\n\t\tconst mediaElement = context.mediaElement.get();\n\t\tconst current = peek(state.preload);\n\t\tif (current !== void 0 && !isStandardPreload(current)) return;\n\t\tconst target = mediaElement && isStandardPreload(mediaElement.preload) ? mediaElement.preload : current === void 0 ? defaultPreload : void 0;\n\t\tif (target === void 0 || target === current) return;\n\t\tstate.preload.set(target);\n\t});\n\tconst cleanupWrite = effect(() => {\n\t\tconst next = state.preload.get();\n\t\tconst mediaElement = context.mediaElement.get();\n\t\tif (!mediaElement) return;\n\t\tif (!isStandardPreload(next)) return;\n\t\tif (mediaElement.preload === next) return;\n\t\tmediaElement.preload = next;\n\t});\n\treturn () => {\n\t\tcleanupRead();\n\t\tcleanupWrite();\n\t};\n}\nconst syncPreload = defineBehavior({\n\tstateKeys: [\"preload\", \"presentation\"],\n\tcontextKeys: [\"mediaElement\"],\n\tsetup: syncPreloadSetup\n});\n//#endregion\nexport { syncPreload };\n\n//# sourceMappingURL=sync-preload.js.map","import { createComposition } from \"../../../core/composition/create-composition.js\";\nimport { makeShareSignals } from \"../../../core/composition/share-signals.js\";\nimport { resolveVttSegment } from \"../../../media/dom/text/resolve-vtt-segment.js\";\nimport { loadAudioSegments, loadTextTrackSegments, loadVideoSegments } from \"../../behaviors/dom/load-segments.js\";\nimport { setupTextTrackActors } from \"../../behaviors/dom/setup-text-track-actors.js\";\nimport { trackCurrentTime } from \"../../behaviors/dom/track-current-time.js\";\nimport { trackLoadTriggers } from \"../../behaviors/dom/track-load-triggers.js\";\nimport { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } from \"../../../media/dom/text/text-track-slots.js\";\nimport { parseMultivariantPlaylist } from \"../../../media/hls/parse-multivariant.js\";\nimport { getResolvedSelectedTrackDuration } from \"../../../media/utils/track-selection.js\";\nimport { calculatePresentationDuration } from \"../../behaviors/calculate-presentation-duration.js\";\nimport { endOfStream } from \"../../behaviors/dom/end-of-stream.js\";\nimport { setupAudioBufferActors, setupVideoBufferActors } from \"../../behaviors/dom/setup-buffer-actors.js\";\nimport { setupMediaSource } from \"../../behaviors/dom/setup-mediasource.js\";\nimport { syncTextTracks } from \"../../behaviors/dom/sync-text-tracks.js\";\nimport { updateMediaSourceDuration } from \"../../behaviors/dom/update-mediasource-duration.js\";\nimport { switchVideoQuality } from \"../../behaviors/quality-switching.js\";\nimport { resolvePresentation } from \"../../behaviors/resolve-presentation.js\";\nimport { resolveAudioTrack, resolveTextTrack, resolveVideoTrack } from \"../../behaviors/resolve-track.js\";\nimport { selectAudioTrack, selectTextTrack } from \"../../behaviors/select-tracks.js\";\nimport { syncPreload } from \"../../behaviors/sync-preload.js\";\n//#region src/playback/engines/hls/engine.ts\n/**\n* Generic `shareSignals` instantiated against the HLS engine's full state\n* and context — captures composition signal refs into the consumer's\n* `onSignalsReady` callback at setup time.\n*/\nconst shareSignals = makeShareSignals();\n/**\n* Create an HLS playback engine.\n*\n* Composes SPF behaviors into a reactive pipeline for HLS playback over MSE:\n* manifest resolution, track selection, ABR, segment loading, and\n* end-of-stream coordination.\n*\n* @example\n* ```ts\n* let signals: SimpleHlsEngineSignals;\n* const engine = createSimpleHlsEngine({\n* initialBandwidth: 2_000_000,\n* preferredAudioLanguage: 'en',\n* onSignalsReady: (refs) => {\n* signals = refs;\n* },\n* });\n*\n* signals.context.mediaElement.set(videoEl);\n* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n*\n* videoEl.play();\n*\n* await engine.destroy();\n* ```\n*/\nfunction createSimpleHlsEngine(config = {}) {\n\tconst finalConfig = {\n\t\t...config,\n\t\tresolveTextTrackSegment: config.resolveTextTrackSegment ?? resolveVttSegment,\n\t\tresolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,\n\t\tparsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n\t\taddSubtitlesTracksToMedia: config.addSubtitlesTracksToMedia ?? addSubtitlesTracksToMedia,\n\t\tgetShowingSubtitlesTrackFromMedia: config.getShowingSubtitlesTrackFromMedia ?? getShowingSubtitlesTrackFromMedia,\n\t\tremoveAllSubtitlesTracksFromMedia: config.removeAllSubtitlesTracksFromMedia ?? removeAllSubtitlesTracksFromMedia\n\t};\n\treturn createComposition([\n\t\tsyncPreload,\n\t\ttrackLoadTriggers,\n\t\tresolvePresentation,\n\t\tselectAudioTrack,\n\t\tselectTextTrack,\n\t\tresolveVideoTrack,\n\t\tresolveAudioTrack,\n\t\tresolveTextTrack,\n\t\tcalculatePresentationDuration,\n\t\tsetupMediaSource,\n\t\tupdateMediaSourceDuration,\n\t\tsetupVideoBufferActors,\n\t\tsetupAudioBufferActors,\n\t\ttrackCurrentTime,\n\t\tswitchVideoQuality,\n\t\tloadVideoSegments,\n\t\tloadAudioSegments,\n\t\tendOfStream,\n\t\tsyncTextTracks,\n\t\tsetupTextTrackActors,\n\t\tloadTextTrackSegments,\n\t\tshareSignals\n\t], {\n\t\tconfig: finalConfig,\n\t\tinitialState: { bandwidthState: {\n\t\t\tfastEstimate: 0,\n\t\t\tfastTotalWeight: 0,\n\t\t\tslowEstimate: 0,\n\t\t\tslowTotalWeight: 0,\n\t\t\tbytesSampled: 0\n\t\t} }\n\t});\n}\n//#endregion\nexport { createSimpleHlsEngine };\n\n//# sourceMappingURL=engine.js.map","import { createSimpleHlsEngine } from \"./engine.js\";\n//#region src/playback/engines/hls/adapter.ts\nconst simpleHlsMediaDefaultProps = {\n\tsrc: \"\",\n\tpreload: \"\"\n};\n/**\n* Mixin that adds SPF playback engine behavior to any base class.\n*\n* Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n* be used anywhere a media element API is expected.\n*\n* A new engine is created on every src assignment — this fully tears down all\n* state, SourceBuffers, and in-flight requests from the previous source before\n* the next one begins. The media element reference is preserved across src\n* changes and re-applied to the new engine automatically.\n*\n* @example\n* class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}\n*\n* const media = new SimpleHlsMedia();\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*/\nfunction SimpleHlsMediaMixin(BaseClass) {\n\tclass SimpleHlsMediaImpl extends BaseClass {\n\t\t#engine;\n\t\t#config;\n\t\t#signals;\n\t\t#preload = simpleHlsMediaDefaultProps.preload;\n\t\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t\t#loadstartListener = null;\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { config } = args?.[0] ?? {};\n\t\t\tthis.#config = config;\n\t\t\tthis.#engine = this.#createEngine();\n\t\t}\n\t\tget engine() {\n\t\t\treturn this.#engine;\n\t\t}\n\t\tattach(mediaElement) {\n\t\t\tsuper.attach?.(mediaElement);\n\t\t\tthis.#signals.context.mediaElement.set(mediaElement);\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.context.mediaElement.set(void 0);\n\t\t\tsuper.detach?.();\n\t\t}\n\t\tdestroy() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#engine.destroy();\n\t\t}\n\t\tget preload() {\n\t\t\treturn this.#preload;\n\t\t}\n\t\tset preload(value) {\n\t\t\tthis.#preload = value;\n\t\t\tif (value) this.#signals.state.preload.set(value);\n\t\t}\n\t\tget src() {\n\t\t\treturn this.#signals.state.presentation.get()?.url ?? \"\";\n\t\t}\n\t\tset src(value) {\n\t\t\tconst prevMediaElement = this.#signals.context.mediaElement.get();\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#engine.destroy();\n\t\t\tthis.#engine = this.#createEngine();\n\t\t\tif (this.#preload) this.#signals.state.preload.set(this.#preload);\n\t\t\tif (prevMediaElement) this.#signals.context.mediaElement.set(prevMediaElement);\n\t\t\tif (value) this.#signals.state.presentation.set({ url: value });\n\t\t}\n\t\tplay() {\n\t\t\tconst mediaElement = this.#signals.context.mediaElement.get();\n\t\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"SimpleHlsMediaElement: no media element attached\"));\n\t\t\tthis.#signals.state.loadActivated.set(true);\n\t\t\treturn mediaElement.play().catch((err) => {\n\t\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t\t};\n\t\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t\t});\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\t#createEngine() {\n\t\t\treturn createSimpleHlsEngine({\n\t\t\t\t...this.#config,\n\t\t\t\tonSignalsReady: (signals) => {\n\t\t\t\t\tthis.#signals = signals;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t#cancelPendingPlay() {\n\t\t\tif (!this.#loadstartListener) return;\n\t\t\tthis.#signals.context.mediaElement.get()?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\t\tthis.#loadstartListener = null;\n\t\t}\n\t}\n\treturn SimpleHlsMediaImpl;\n}\n/** Standalone SPF media adapter with no base class. */\nvar SimpleHlsMediaElement = class extends SimpleHlsMediaMixin(class {}) {};\n//#endregion\nexport { SimpleHlsMediaElement, SimpleHlsMediaMixin, simpleHlsMediaDefaultProps };\n\n//# sourceMappingURL=adapter.js.map","import { HTMLVideoElementHost } from \"../video-host.js\";\nimport { SimpleHlsMediaMixin } from \"@videojs/spf/hls\";\n//#region src/dom/media/simple-hls/index.ts\nvar SimpleHlsMedia = class extends SimpleHlsMediaMixin(HTMLVideoElementHost) {};\n//#endregion\nexport { SimpleHlsMedia };\n\n//# sourceMappingURL=index.js.map","import { CustomMediaElement } from '@videojs/core/dom/media/custom-media-element';\nimport { SimpleHlsMedia } from '@videojs/core/dom/media/simple-hls';\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\nexport class SimpleHlsVideo extends MediaAttachMixin(CustomMediaElement('video', SimpleHlsMedia)) {}\n","import { SimpleHlsVideo } from '../../media/simple-hls-video';\nimport { safeDefine } from '../safe-define';\n\nexport class SimpleHlsVideoElement extends SimpleHlsVideo {\n static readonly tagName = 'simple-hls-video';\n}\n\nsafeDefine(SimpleHlsVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [SimpleHlsVideoElement.tagName]: SimpleHlsVideoElement;\n }\n}\n"],"x_google_ignoreList":[1],"mappings":";;;;;;;;;;;;;;;AASA,SAAS,aAAa;AACrB,QAAO,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI;;;;;ACVxD,IAAI,YAAY,OAAO;AACvB,IAAI,mBAAmB,KAAK,KAAK,UAAU,OAAO,MAAM,UAAU,KAAK,KAAK;CAAE,YAAY;CAAM,cAAc;CAAM,UAAU;CAAM;CAAO,CAAC,GAAG,IAAI,OAAO;AAC1J,IAAI,iBAAiB,KAAK,KAAK,UAAU;AACvC,iBAAgB,KAAK,OAAO,QAAQ,WAAW,MAAM,KAAK,KAAK,MAAM;AACrE,QAAO;;AAET,IAAI,iBAAiB,KAAK,QAAQ,QAAQ;AACxC,KAAI,CAAC,OAAO,IAAI,IAAI,CAClB,OAAM,UAAU,YAAY,IAAI;;AAEpC,IAAI,eAAe,QAAQ,QAAQ;AACjC,KAAI,OAAO,IAAI,KAAK,IAClB,OAAM,UAAU,+CAA6C;AAC/D,QAAO,OAAO,IAAI,IAAI;;AAExB,IAAI,gBAAgB,KAAK,QAAQ,UAAU;AACzC,KAAI,OAAO,IAAI,IAAI,CACjB,OAAM,UAAU,oDAAoD;AACtE,mBAAkB,UAAU,OAAO,IAAI,IAAI,GAAG,OAAO,IAAI,KAAK,MAAM;;AAEtE,IAAI,mBAAmB,KAAK,QAAQ,WAAW;AAC7C,eAAc,KAAK,QAAQ,wBAAwB;AACnD,QAAO;;;;;;;;;AAST,SAAS,cAAc,GAAG,GAAG;AAC3B,QAAO,OAAO,GAAG,GAAG,EAAE;;;;;;;;;AASxB,IAAI,iBAAiB;AACrB,IAAI,sBAAsB;AAC1B,IAAI,QAAQ;AACZ,MAAM,SAAyB,uBAAO,SAAS;AAC/C,SAAS,kBAAkB,UAAU;CACnC,MAAM,OAAO;AACb,kBAAiB;AACjB,QAAO;;AAET,SAAS,oBAAoB;AAC3B,QAAO;;AAET,SAAS,wBAAwB;AAC/B,QAAO;;AAET,MAAM,gBAAgB;CACpB,SAAS;CACT,gBAAgB;CAChB,OAAO;CACP,cAAc,KAAK;CACnB,yBAAyB,KAAK;CAC9B,qBAAqB,KAAK;CAC1B,mBAAmB;CACnB,kBAAkB,KAAK;CACvB,yBAAyB,KAAK;CAC9B,2BAA2B;CAC3B,sBAAsB;CACtB,6BAA6B;CAC7B,8BAA8B;CAE9B,2BAA2B;CAE3B,4BAA4B;CAE7B;AACD,SAAS,iBAAiB,MAAM;AAC9B,KAAI,oBACF,OAAM,IAAI,MACR,OAAO,cAAc,eAAe,YAAY,2DAA2D,GAC5G;AAEH,KAAI,mBAAmB,KACrB;AAEF,gBAAe,qBAAqB,KAAK;CACzC,MAAM,MAAM,eAAe;AAC3B,oBAAmB,eAAe;AAClC,KAAI,MAAM,eAAe,aAAa,UAAU,eAAe,aAAa,SAAS,MACnF;MAAI,eAAe,eAAe,EAAE;GAClC,MAAM,gBAAgB,eAAe,aAAa;AAClD,qCAAkC,eAAe,eAAe,oBAAoB,KAAK;;;AAG7F,KAAI,eAAe,aAAa,SAAS,MAAM;AAC7C,iBAAe,aAAa,OAAO;AACnC,iBAAe,oBAAoB,OAAO,eAAe,eAAe,GAAG,wBAAwB,MAAM,gBAAgB,IAAI,GAAG;;AAElI,gBAAe,wBAAwB,OAAO,KAAK;;AAErD,SAAS,yBAAyB;AAChC;;AAEF,SAAS,2BAA2B,MAAM;AACxC,KAAI,CAAC,KAAK,SAAS,KAAK,mBAAmB,MACzC;AAEF,KAAI,CAAC,KAAK,sBAAsB,KAAK,IAAI,CAAC,+BAA+B,KAAK,EAAE;AAC9E,OAAK,QAAQ;AACb,OAAK,iBAAiB;AACtB;;AAEF,MAAK,uBAAuB,KAAK;AACjC,MAAK,QAAQ;AACb,MAAK,iBAAiB;;AAExB,SAAS,wBAAwB,MAAM;AACrC,KAAI,KAAK,qBAAqB,KAAK,EACjC;CAEF,MAAM,OAAO;AACb,uBAAsB;AACtB,KAAI;AACF,OAAK,MAAM,YAAY,KAAK,iBAC1B,KAAI,CAAC,SAAS,MACZ,mBAAkB,SAAS;WAGvB;AACR,wBAAsB;;;AAG1B,SAAS,yBAAyB;AAChC,SAAQ,kBAAkB,OAAO,KAAK,IAAI,eAAe,+BAA+B;;AAE1F,SAAS,kBAAkB,MAAM;CAC/B,IAAI;AACJ,MAAK,QAAQ;AACb,yBAAwB,KAAK;AAC7B,EAAC,KAAK,KAAK,wBAAwB,QAAgB,GAAG,KAAK,KAAK,WAAW,KAAK;;AAElF,SAAS,0BAA0B,MAAM;AACvC,UAAS,KAAK,oBAAoB;AAClC,QAAO,kBAAkB,KAAK;;AAEhC,SAAS,yBAAyB,MAAM,cAAc;AACpD,mBAAkB,aAAa;AAC/B,KAAI,CAAC,QAAQ,KAAK,iBAAiB,KAAK,KAAK,KAAK,wBAAwB,KAAK,KAAK,KAAK,4BAA4B,KAAK,EACxH;AAEF,KAAI,eAAe,KAAK,CACtB,MAAK,IAAI,IAAI,KAAK,mBAAmB,IAAI,KAAK,aAAa,QAAQ,IACjE,mCAAkC,KAAK,aAAa,IAAI,KAAK,oBAAoB,GAAG;AAGxF,QAAO,KAAK,aAAa,SAAS,KAAK,mBAAmB;AACxD,OAAK,aAAa,KAAK;AACvB,OAAK,wBAAwB,KAAK;AAClC,OAAK,oBAAoB,KAAK;;;AAGlC,SAAS,+BAA+B,MAAM;AAC5C,oBAAmB,KAAK;AACxB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,aAAa,QAAQ,KAAK;EACjD,MAAM,WAAW,KAAK,aAAa;EACnC,MAAM,cAAc,KAAK,wBAAwB;AACjD,MAAI,gBAAgB,SAAS,QAC3B,QAAO;AAET,6BAA2B,SAAS;AACpC,MAAI,gBAAgB,SAAS,QAC3B,QAAO;;AAGX,QAAO;;AAET,SAAS,wBAAwB,MAAM,UAAU,aAAa;CAC5D,IAAI;AACJ,oBAAmB,KAAK;AACxB,oBAAmB,KAAK;AACxB,KAAI,KAAK,iBAAiB,WAAW,GAAG;AACtC,GAAC,KAAK,KAAK,YAAY,QAAgB,GAAG,KAAK,KAAK,QAAQ;AAC5D,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,aAAa,QAAQ,IAC5C,MAAK,oBAAoB,KAAK,wBAAwB,KAAK,aAAa,IAAI,MAAM,EAAE;;AAGxF,MAAK,wBAAwB,KAAK,YAAY;AAC9C,QAAO,KAAK,iBAAiB,KAAK,SAAS,GAAG;;AAEhD,SAAS,kCAAkC,MAAM,KAAK;CACpD,IAAI;AACJ,oBAAmB,KAAK;AACxB,oBAAmB,KAAK;AACxB,KAAI,OAAO,cAAc,eAAe,aAAa,OAAO,KAAK,iBAAiB,OAChF,OAAM,IAAI,MACR,0CAA0C,IAAI,uBAAuB,KAAK,iBAAiB,OAAO,aACnG;AAEH,KAAI,KAAK,iBAAiB,WAAW,GAAG;AACtC,GAAC,KAAK,KAAK,cAAc,QAAgB,GAAG,KAAK,KAAK,QAAQ;AAC9D,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,aAAa,QAAQ,IAC5C,mCAAkC,KAAK,aAAa,IAAI,KAAK,oBAAoB,GAAG;;CAGxF,MAAM,UAAU,KAAK,iBAAiB,SAAS;AAC/C,MAAK,iBAAiB,OAAO,KAAK,iBAAiB;AACnD,MAAK,wBAAwB,OAAO,KAAK,wBAAwB;AACjE,MAAK,iBAAiB;AACtB,MAAK,wBAAwB;AAC7B,KAAI,MAAM,KAAK,iBAAiB,QAAQ;EACtC,MAAM,cAAc,KAAK,wBAAwB;EACjD,MAAM,WAAW,KAAK,iBAAiB;AACvC,qBAAmB,SAAS;AAC5B,WAAS,oBAAoB,eAAe;;;AAGhD,SAAS,eAAe,MAAM;CAC5B,IAAI;AACJ,QAAO,KAAK,2BAA2B,KAAK,QAAQ,OAAO,KAAK,IAAI,KAAK,qBAAqB,OAAO,KAAK,IAAI,GAAG,WAAW,KAAK;;AAEnI,SAAS,mBAAmB,MAAM;AAChC,MAAK,iBAAiB,KAAK,eAAe,EAAE;AAC5C,MAAK,wBAAwB,KAAK,sBAAsB,EAAE;AAC1D,MAAK,4BAA4B,KAAK,0BAA0B,EAAE;;AAEpE,SAAS,mBAAmB,MAAM;AAChC,MAAK,qBAAqB,KAAK,mBAAmB,EAAE;AACpD,MAAK,4BAA4B,KAAK,0BAA0B,EAAE;;;;;;;;;AASpE,SAAS,YAAY,MAAM;AACzB,4BAA2B,KAAK;AAChC,kBAAiB,KAAK;AACtB,KAAI,KAAK,UAAU,QACjB,OAAM,KAAK;AAEb,QAAO,KAAK;;AAEd,SAAS,eAAe,aAAa;CACnC,MAAM,OAAO,OAAO,OAAO,cAAc;AACzC,MAAK,cAAc;CACnB,MAAM,iBAAiB,YAAY,KAAK;AACxC,UAAS,UAAU;AACnB,QAAO;;AAET,MAAM,QAAwB,uBAAO,QAAQ;AAC7C,MAAM,YAA4B,uBAAO,YAAY;AACrD,MAAM,UAA0B,uBAAO,UAAU;AACjD,MAAM,gBACG;CACL,GAAG;CACH,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,sBAAsB,MAAM;AAC1B,SAAO,KAAK,UAAU,SAAS,KAAK,UAAU;;CAEhD,uBAAuB,MAAM;AAC3B,MAAI,KAAK,UAAU,UACjB,OAAM,IAAI,MAAM,kCAAkC;EAEpD,MAAM,WAAW,KAAK;AACtB,OAAK,QAAQ;EACb,MAAM,eAAe,0BAA0B,KAAK;EACpD,IAAI;EACJ,IAAI,WAAW;AACf,MAAI;AACF,cAAW,KAAK,YAAY,KAAK,KAAK,QAAQ;AAE9C,cADc,aAAa,SAAS,aAAa,WAC7B,KAAK,MAAM,KAAK,KAAK,SAAS,UAAU,SAAS;WAC9D,KAAK;AACZ,cAAW;AACX,QAAK,QAAQ;YACL;AACR,4BAAyB,MAAM,aAAa;;AAE9C,MAAI,UAAU;AACZ,QAAK,QAAQ;AACb;;AAEF,OAAK,QAAQ;AACb,OAAK;;CAER;;;;;;;;AASH,SAAS,oBAAoB;AAC3B,OAAM,IAAI,OAAO;;AAEnB,IAAI,mCAAmC;AACvC,SAAS,iCAAiC;AACxC,mCAAkC;;;;;;;;;AASpC,SAAS,aAAa,cAAc;CAClC,MAAM,OAAO,OAAO,OAAO,YAAY;AACvC,MAAK,QAAQ;CACb,MAAM,eAAe;AACnB,mBAAiB,KAAK;AACtB,SAAO,KAAK;;AAEd,QAAO,UAAU;AACjB,QAAO;;AAET,SAAS,cAAc;AACrB,kBAAiB,KAAK;AACtB,QAAO,KAAK;;AAEd,SAAS,YAAY,MAAM,UAAU;AACnC,KAAI,CAAC,wBAAwB,CAC3B,iCAAgC;AAElC,KAAI,CAAC,KAAK,MAAM,KAAK,KAAK,SAAS,KAAK,OAAO,SAAS,EAAE;AACxD,OAAK,QAAQ;AACb,qBAAmB,KAAK;;;AAG5B,MAAM,cACG;CACL,GAAG;CACH,OAAO;CACP,OAAO,KAAK;CACb;AAEH,SAAS,mBAAmB,MAAM;AAChC,MAAK;AACL,yBAAwB;AACxB,yBAAwB,KAAK;;;;;;;;;;;;;;;;;;AAkB/B,MAAM,OAAO,OAAO,OAAO;AAC3B,IAAI;EACF,YAAY;CACZ,IAAI,IAAI,QAAkB,IAAI;CAC9B,MAAM,MAAM;EACV,YAAY,cAAc,UAAU,EAAE,EAAE;AACtC,gBAAa,MAAM,OAAO;AAC1B,iBAAc,MAAM,GAAG;GAEvB,MAAM,OADM,aAAa,aAAa,CACrB;AACjB,QAAK,QAAQ;AACb,QAAK,UAAU;AACf,OAAI,SAAS;IACX,MAAM,SAAS,QAAQ;AACvB,QAAI,OACF,MAAK,QAAQ;AAEf,SAAK,UAAU,QAAQ,QAAQ,OAAO;AACtC,SAAK,YAAY,QAAQ,QAAQ,OAAO;;;EAG5C,MAAM;AACJ,OAAI,EAAE,GAAG,QAAQ,SAAS,KAAK,CAC7B,OAAM,IAAI,UAAU,qDAAqD;AAC3E,UAAO,YAAY,KAAK,KAAK,MAAM;;EAErC,IAAI,UAAU;AACZ,OAAI,EAAE,GAAG,QAAQ,SAAS,KAAK,CAC7B,OAAM,IAAI,UAAU,qDAAqD;AAC3E,OAAI,uBAAuB,CACzB,OAAM,IAAI,MAAM,0DAA0D;GAE5E,MAAM,MAAM,KAAK;AACjB,eAAY,KAAK,SAAS;;;AAG9B,MAAK;AACL,0BAAS,IAAI,SAAS;AAGtB,SAAQ,WAAW,MAAM,OAAO,MAAM,YAAY,YAAY,QAAQ,EAAE;AACxE,SAAQ,QAAQ;CAChB,MAAM,SAAS;EAGb,YAAY,aAAa,SAAS;AAChC,gBAAa,MAAM,QAAQ;AAC3B,iBAAc,MAAM,GAAG;GAEvB,MAAM,OADM,eAAe,YAAY,CACtB;AACjB,QAAK,4BAA4B;AACjC,QAAK,QAAQ;AACb,QAAK,UAAU;AACf,OAAI,SAAS;IACX,MAAM,SAAS,QAAQ;AACvB,QAAI,OACF,MAAK,QAAQ;AAEf,SAAK,UAAU,QAAQ,QAAQ,OAAO;AACtC,SAAK,YAAY,QAAQ,QAAQ,OAAO;;;EAG5C,MAAM;AACJ,OAAI,EAAE,GAAG,QAAQ,YAAY,KAAK,CAChC,OAAM,IAAI,UAAU,wDAAwD;AAC9E,UAAO,YAAY,KAAK,MAAM;;;AAGlC,MAAK;AACL,2BAAU,IAAI,SAAS;AAGvB,SAAQ,cAAc,MAAM,OAAO,MAAM,YAAY,YAAY,SAAS,EAAE;AAC5E,SAAQ,WAAW;AACnB,GAAE,YAAY;EACZ,IAAI,KAAK,SAAoB,gBAAgB;EAC7C,SAAS,QAAQ,IAAI;GACnB,IAAI;GACJ,IAAI,qBAAqB;AACzB,OAAI;AACF,yBAAqB,kBAAkB,KAAK;AAC5C,aAAS,IAAI;aACL;AACR,sBAAkB,mBAAmB;;AAEvC,UAAO;;AAET,UAAQ,UAAU;EAClB,SAAS,kBAAkB,MAAM;GAC/B,IAAI;AACJ,OAAI,EAAE,GAAG,QAAQ,YAAY,KAAK,IAAI,EAAE,GAAG,QAAQ,WAAW,KAAK,CACjE,OAAM,IAAI,UAAU,kEAAkE;AAExF,YAAS,MAAM,KAAK,MAAM,iBAAiB,OAAO,KAAK,IAAI,IAAI,KAAK,MAAM,EAAE,QAAQ,KAAK,EAAE;;AAE7F,UAAQ,oBAAoB;EAC5B,SAAS,gBAAgB,QAAQ;GAC/B,IAAI;AACJ,OAAI,EAAE,GAAG,QAAQ,YAAY,OAAO,IAAI,EAAE,GAAG,QAAQ,SAAS,OAAO,CACnE,OAAM,IAAI,UAAU,mDAAmD;AAEzE,YAAS,MAAM,OAAO,MAAM,qBAAqB,OAAO,KAAK,IAAI,IAAI,KAAK,MAAM,EAAE,QAAQ,KAAK,EAAE;;AAEnG,UAAQ,kBAAkB;EAC1B,SAAS,SAAS,QAAQ;AACxB,OAAI,EAAE,GAAG,QAAQ,YAAY,OAAO,IAAI,EAAE,GAAG,QAAQ,SAAS,OAAO,CACnE,OAAM,IAAI,UAAU,4CAA4C;GAElE,MAAM,mBAAmB,OAAO,MAAM;AACtC,OAAI,CAAC,iBACH,QAAO;AACT,UAAO,iBAAiB,SAAS;;AAEnC,UAAQ,WAAW;EACnB,SAAS,WAAW,QAAQ;AAC1B,OAAI,EAAE,GAAG,QAAQ,YAAY,OAAO,IAAI,EAAE,GAAG,QAAQ,WAAW,OAAO,CACrE,OAAM,IAAI,UAAU,2DAA2D;GAEjF,MAAM,eAAe,OAAO,MAAM;AAClC,OAAI,CAAC,aACH,QAAO;AACT,UAAO,aAAa,SAAS;;AAE/B,UAAQ,aAAa;EACrB,MAAM,QAAQ;GAIZ,YAAY,QAAQ;AAClB,iBAAa,MAAM,QAAQ;AAC3B,iBAAa,MAAM,eAAe;AAClC,kBAAc,MAAM,IAAI;IACxB,IAAI,OAAO,OAAO,OAAO,cAAc;AACvC,SAAK,UAAU;AACf,SAAK,sBAAsB;AAC3B,SAAK,uBAAuB;AAC5B,SAAK,4BAA4B;AACjC,SAAK,eAAe,EAAE;AACtB,SAAK,QAAQ;;GAMf,MAAM,GAAG,SAAS;AAChB,QAAI,EAAE,GAAG,QAAQ,WAAW,KAAK,CAC/B,OAAM,IAAI,UAAU,0CAA0C;AAEhE,oBAAgB,MAAM,gBAAgB,iBAAiB,CAAC,KAAK,MAAM,QAAQ;IAC3E,MAAM,OAAO,KAAK;AAClB,SAAK,QAAQ;IACb,MAAM,OAAO,kBAAkB,KAAK;AACpC,SAAK,MAAM,UAAU,QACnB,kBAAiB,OAAO,MAAM;AAEhC,sBAAkB,KAAK;;GAGzB,QAAQ,GAAG,SAAS;AAClB,QAAI,EAAE,GAAG,QAAQ,WAAW,KAAK,CAC/B,OAAM,IAAI,UAAU,0CAA0C;AAEhE,oBAAgB,MAAM,gBAAgB,iBAAiB,CAAC,KAAK,MAAM,QAAQ;IAC3E,MAAM,OAAO,KAAK;AAClB,uBAAmB,KAAK;AACxB,SAAK,IAAI,IAAI,KAAK,aAAa,SAAS,GAAG,KAAK,GAAG,IACjD,KAAI,QAAQ,SAAS,KAAK,aAAa,GAAG,QAAQ,EAAE;AAClD,uCAAkC,KAAK,aAAa,IAAI,KAAK,oBAAoB,GAAG;KACpF,MAAM,UAAU,KAAK,aAAa,SAAS;AAC3C,UAAK,aAAa,KAAK,KAAK,aAAa;AACzC,UAAK,oBAAoB,KAAK,KAAK,oBAAoB;AACvD,UAAK,aAAa;AAClB,UAAK,oBAAoB;AACzB,UAAK;AACL,SAAI,IAAI,KAAK,aAAa,QAAQ;MAChC,MAAM,cAAc,KAAK,oBAAoB;MAC7C,MAAM,WAAW,KAAK,aAAa;AACnC,yBAAmB,SAAS;AAC5B,eAAS,wBAAwB,eAAe;;;;GAOxD,aAAa;AACX,QAAI,EAAE,GAAG,QAAQ,WAAW,KAAK,CAC/B,OAAM,IAAI,UAAU,6CAA6C;AAGnE,WADa,KAAK,MACN,aAAa,QAAQ,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,EAAE,QAAQ;;;AAGzE,QAAM;AACN,4BAAU,IAAI,SAAS;AAGvB,mCAAiB,IAAI,SAAS;AAC9B,qBAAmB,SAAS,SAAS;AACnC,QAAK,MAAM,UAAU,QACnB,KAAI,EAAE,GAAG,QAAQ,YAAY,OAAO,IAAI,EAAE,GAAG,QAAQ,SAAS,OAAO,CACnE,OAAM,IAAI,UAAU,4DAA4D;;AAItF,UAAQ,aAAa,MAAM,YAAY,SAAS,EAAE;AAClD,UAAQ,UAAU;EAClB,SAAS,kBAAkB;GACzB,IAAI;AACJ,WAAQ,MAAM,mBAAmB,KAAK,OAAO,KAAK,IAAI,IAAI;;AAE5D,UAAQ,kBAAkB;AAC1B,UAAQ,UAAU,OAAO,UAAU;AACnC,UAAQ,YAAY,OAAO,YAAY;IACtC,QAAQ,WAAW,QAAQ,SAAS,EAAE,EAAE;GAC1C,WAAW,SAAS,EAAE,EAAE;;;;;AChkB3B,MAAM,UAAU,OAAO,OAAO;;;;;;;;;;;;;;;AAe9B,SAAS,KAAK,QAAQ,aAAa,MAAM,GAAG;AAC3C,QAAO,cAAc,UAAU,OAAO,KAAK,CAAC,CAAC;;;AAG9C,SAAS,OAAO,cAAc,SAAS;AACtC,QAAO,IAAI,OAAO,MAAM,cAAc,QAAQ;;;AAG/C,SAAS,SAAS,IAAI,SAAS;AAC9B,QAAO,IAAI,OAAO,SAAS,IAAI,QAAQ;;AAExC,SAAS,OAAO,QAAQ,SAAS;CAChC,MAAM,UAAU,cAAc,OAAO,KAAK,CAAC;AAC3C,KAAI,OAAO,YAAY,WAAY,QAAO,IAAI,QAAQ,QAAQ,CAAC;KAC1D,QAAO,IAAI;EACf,GAAG;EACH,GAAG;EACH,CAAC;;;;;;;;;;AAUH,SAAS,SAAS,KAAK;CACtB,MAAM,MAAM,EAAE;AACd,MAAK,MAAM,OAAO,IAAK,KAAI,OAAO,IAAI,KAAK,KAAK;AAChD,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDR,SAAS,eAAe,MAAM,SAAS;CACtC,MAAM,OAAO;CACb,MAAM,aAAa,IAAI,IAAI,KAAK;AAChC,QAAO,OAAO,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC;;AAElF,SAAS,kBAAkB,WAAW,SAAS;CAC9C,MAAM,iBAAiB;CACvB,MAAM,QAAQ,eAAe,eAAe,SAAS,MAAM,EAAE,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACrG,MAAM,UAAU,eAAe,eAAe,SAAS,MAAM,EAAE,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC3G,MAAM,OAAO;EACZ;EACA;EACA,QAAQ,SAAS,UAAU,EAAE;EAC7B;CACD,MAAM,WAAW,eAAe,KAAK,aAAa,SAAS,MAAM,KAAK,CAAC;AACvE,QAAO;EACN;EACA;EACA,MAAM,UAAU;GACf,MAAM,UAAU,EAAE;AAClB,QAAK,MAAM,WAAW,UAAU;AAC/B,QAAI,WAAW,KAAM;AACrB,QAAI,OAAO,YAAY,WAAY,SAAQ,KAAK,SAAS,CAAC;aACjD,aAAa,QAAS,SAAQ,KAAK,QAAQ,SAAS,CAAC;;AAE/D,SAAM,QAAQ,IAAI,QAAQ;AAC1B,QAAK,MAAM,OAAO,OAAO,OAAO,MAAM,CAAE,KAAI,IAAI,KAAK,EAAE;AACvD,QAAK,MAAM,OAAO,OAAO,OAAO,QAAQ,CAAE,KAAI,IAAI,KAAK,EAAE;;EAE1D;;AAEF,SAAS,eAAe,UAAU;AACjC,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;AC1DR,SAAS,mBAAmB;AAC3B,QAAO;EACN,WAAW,EAAE;EACb,aAAa,EAAE;EACf,QAAQ,EAAE,OAAO,SAAS,aAAa;AACtC,UAAO,iBAAiB;IACvB;IACA;IACA,CAAC;;EAEH;;;;;;;;;;;ACxBF,IAAI,aAAa;AACjB,SAAS,mBAAmB;AAC3B,KAAI,CAAC,YAAY;AAChB,eAAa,SAAS,cAAc,QAAQ;AAC5C,aAAW,QAAQ;AACnB,aAAW,UAAU;AACrB,aAAW,MAAM,UAAU;AAC3B,aAAW,cAAc;;AAE1B,QAAO;;AAER,SAAS,kBAAkB,KAAK;CAC/B,MAAM,QAAQ,kBAAkB;CAChC,MAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,OAAM,OAAO;AACb,OAAM,UAAU;AAChB,QAAO,IAAI,SAAS,SAAS,WAAW;EACvC,MAAM,eAAe;GACpB,MAAM,OAAO,EAAE;GACf,MAAM,YAAY,MAAM;AACxB,OAAI,UAAU,KAAM,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK,QAAQ,KAAK;IACnE,MAAM,MAAM,UAAU,KAAK;AAC3B,QAAI,IAAK,MAAK,KAAK,IAAI;;AAExB,YAAS;AACT,WAAQ,KAAK;;EAEd,MAAM,gBAAgB;AACrB,YAAS;AACT,0BAAuB,IAAI,MAAM,+BAA+B,MAAM,CAAC;;EAExE,MAAM,gBAAgB;AACrB,SAAM,oBAAoB,QAAQ,OAAO;AACzC,SAAM,oBAAoB,SAAS,QAAQ;AAC3C,SAAM,YAAY,MAAM;;AAEzB,QAAM,iBAAiB,QAAQ,OAAO;AACtC,QAAM,iBAAiB,SAAS,QAAQ;AACxC,QAAM,YAAY,MAAM;AACxB,QAAM,MAAM;GACX;;;;;AC7CH,MAAM,0BAA0B,IAAI,KAAK;AACzC,MAAM,UAAU,IAAI,OAAO,OAAO,cAAc;AAC/C,gBAAe,WAAW;EACzB;AACF,SAAS,aAAa;AACrB,MAAK,MAAM,KAAK,QAAQ,YAAY,CAAE,SAAQ,IAAI,EAAE;AACpD,SAAQ,OAAO;AACf,MAAK,MAAM,KAAK,SAAS;AACxB,UAAQ,OAAO,EAAE;AACjB,IAAE,KAAK;;;;;;;;;;;;;AAaT,SAAS,OAAO,IAAI;CACnB,IAAI;CACJ,MAAM,IAAI,IAAI,OAAO,eAAe;AACnC,MAAI,OAAO,YAAY,WAAY,UAAS;AAC5C,YAAU,IAAI;GACb;AACF,SAAQ,MAAM,EAAE;AAChB,GAAE,KAAK;AACP,cAAa;AACZ,UAAQ,QAAQ,EAAE;AAClB,MAAI,OAAO,YAAY,WAAY,UAAS;;;;;;;;;;;;;ACzB9C,SAAS,kBAAkB,iBAAiB;CAC3C,MAAM,iBAAiB,OAAO,gBAAgB;CAC9C,MAAM,iBAAiB,cAAc,eAAe,KAAK,CAAC,MAAM;CAChE,MAAM,cAAc,OAAO,OAAO,iBAAiB,aAAa;EAC/D,GAAG;EACH,OAAO;EACP,EAAE;AACH,QAAO;EACN;EACA;EACA;EACA;;;;;AChBF,MAAM,WAAW,MAAM,MAAM,KAAK,IAAI,EAAE,GAAG,MAAM,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BrE,SAAS,qBAAqB,KAAK;CAClC,MAAM,EAAE,gBAAgB,UAAU,eAAe,kBAAkB,EAAE,OAAO,IAAI,SAAS,CAAC;CAC1F,MAAM,kBAAkB,EAAE;CAC1B,MAAM,cAAc,WAAW;AAC9B,MAAI,CAAC,OAAQ,QAAO,KAAK;AACzB,MAAI,OAAO,WAAW,WAAY,QAAO;AACzC,eAAa,OAAO,OAAO;;CAE5B,MAAM,aAAa,mBAAmB,QAAQ,SAAS;CACvD,MAAM,cAAc,aAAa,SAAS,UAAU,gBAAgB,SAAS,UAAU;CACvF,MAAM,cAAc,CAAC,GAAG,QAAQ,IAAI,QAAQ,CAAC,KAAK,QAAQ;EACzD,UAAU;GACT,MAAM,SAAS,IAAI;AACnB,OAAI,WAAW,UAAU,CAAE,YAAW,OAAO;;EAE9C,YAAY;EACZ,EAAE,EAAE,GAAG,OAAO,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,OAAO,cAAc;EACjE,MAAM,cAAc,aAAa,SAAS,UAAU;AACpD,SAAO,CAAC,GAAG,QAAQ,SAAS,MAAM,CAAC,KAAK,QAAQ;GAC/C;GACA,YAAY;GACZ,UAAU;GACV,EAAE,EAAE,GAAG,QAAQ,SAAS,QAAQ,CAAC,KAAK,QAAQ;GAC9C;GACA,YAAY;GACZ,EAAE,CAAC;GACH,CAAC;CACH,MAAM,YAAY,EAAE,IAAI,YAAY,YAAY,aAAa,eAAe,aAAa;AACxF,MAAI,WAAW,eAAe,KAAK,CAAC,CAAE;EACtC,MAAM,iBAAiB,IAAI;AAC3B,SAAO,WAAW,SAAS,SAAS,EAAE,CAAC;GACtC;AACF,iBAAgB,KAAK,GAAG,YAAY,IAAI,SAAS,CAAC;AAClD,QAAO;EACN,IAAI,WAAW;AACd,UAAO;;EAER,UAAU;GACT,MAAM,QAAQ,UAAU;AACxB,OAAI,UAAU,gBAAgB,UAAU,YAAa;AACrD,cAAW,aAAa;AACxB,cAAW,YAAY;AACvB,QAAK,MAAM,WAAW,gBAAiB,UAAS;;EAEjD;;;;;;;;ACzEF,MAAM,gCAAgC,EAAE,gBAAgB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+C5D,SAAS,2BAA2B,kBAAkB,aAAa,SAAS,+BAA+B;AAC1G,KAAI,iBAAiB,WAAW,EAAG,QAAO;CAC1C,MAAM,YAAY,cAAc,OAAO;CACvC,MAAM,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,aAAa,UAAU;AAC3E,KAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAO,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC;;;;;;;;;;AAUvD,SAAS,oBAAoB,aAAa,UAAU;AACnD,KAAI,eAAe,KAAM,QAAO,KAAK;AACrC,QAAO,UAAU,MAAM,EAAE,WAAW,YAAY,GAAG,QAAQ,eAAe,cAAc,cAAc,YAAY,YAAY,MAAM,IAAI,SAAS,GAAG,EAAE;;AAEvJ,SAAS,kBAAkB,UAAU,kBAAkB,aAAa,SAAS,+BAA+B;AAC3G,KAAI,SAAS,WAAW,EAAG,QAAO,EAAE;CACpC,MAAM,aAAa,cAAc,OAAO;CACxC,MAAM,qBAAqB,IAAI,IAAI,iBAAiB,KAAK,QAAQ,IAAI,UAAU,CAAC;AAChF,QAAO,SAAS,QAAQ,QAAQ;EAC/B,MAAM,aAAa,IAAI,YAAY,IAAI;EACvC,MAAM,YAAY,IAAI,YAAY,cAAc,aAAa;EAC7D,MAAM,gBAAgB,CAAC,mBAAmB,IAAI,IAAI,UAAU;AAC5D,SAAO,aAAa;GACnB;;;;;;;;;;;;;ACtEH,MAAM,uBAAuB;AAC7B,SAAS,gBAAgB,OAAO;AAC/B,QAAO,cAAc;;;;;;AAMtB,SAAS,wBAAwB,cAAc;AAC9C,QAAO,aAAa,aAAa,KAAK;;;;;;;;;;;AAWvC,SAAS,uBAAuB,cAAc;AAC7C,QAAO,iBAAiB,KAAK,KAAK,aAAa,OAAO,KAAK,KAAK,aAAa,kBAAkB,KAAK;;;;;;;;;;;;;;;;;AChBrG,SAAS,gBAAgB,cAAc,MAAM;AAC5C,QAAO,aAAa,eAAe,MAAM,EAAE,MAAM,QAAQ,MAAM,KAAK,EAAE,cAAc,IAAI,UAAU,EAAE;;;;;;;;;;AAUrG,SAAS,UAAU,cAAc,MAAM,SAAS;AAC/C,QAAO,gBAAgB,cAAc,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,QAAQ;;;;;;;;;;;AAW5E,SAAS,cAAc,cAAc,SAAS;AAC7C,MAAK,MAAM,gBAAgB,aAAa,iBAAiB,EAAE,EAAE;EAC5D,MAAM,QAAQ,aAAa,cAAc,IAAI,OAAO,MAAM,EAAE,SAAS,OAAO,QAAQ;AACpF,MAAI,MAAO,QAAO;;;;;;;;;;;;AAYpB,SAAS,sBAAsB,cAAc,SAAS;AACrD,KAAI,CAAC,gBAAgB,CAAC,QAAS,QAAO,KAAK;CAC3C,MAAM,QAAQ,UAAU,cAAc,QAAQ,QAAQ;AACtD,KAAI,CAAC,SAAS,MAAM,SAAS,UAAU,CAAC,gBAAgB,MAAM,CAAE,QAAO,KAAK;AAC5E,QAAO;;AAER,SAAS,uBAAuB,cAAc,SAAS;AACtD,KAAI,CAAC,gBAAgB,CAAC,QAAS,QAAO,KAAK;CAC3C,MAAM,QAAQ,UAAU,cAAc,SAAS,QAAQ;AACvD,KAAI,CAAC,SAAS,MAAM,SAAS,WAAW,CAAC,gBAAgB,MAAM,CAAE,QAAO,KAAK;AAC7E,QAAO;;AAER,SAAS,uBAAuB,cAAc,SAAS;AACtD,KAAI,CAAC,gBAAgB,CAAC,QAAS,QAAO,KAAK;CAC3C,MAAM,QAAQ,UAAU,cAAc,SAAS,QAAQ;AACvD,KAAI,CAAC,SAAS,MAAM,SAAS,WAAW,CAAC,gBAAgB,MAAM,CAAE,QAAO,KAAK;AAC7E,QAAO;;;;;;;;;;;AAWR,SAAS,UAAU,OAAO;AACzB,QAAO,CAAC,CAAC,SAAS,YAAY,SAAS,CAAC,CAAC,MAAM,QAAQ;;;;;;AAMxD,SAAS,0BAA0B,cAAc,eAAe;CAC/D,MAAM,UAAU,cAAc;AAC9B,QAAO;EACN,GAAG;EACH,eAAe,aAAa,cAAc,KAAK,kBAAkB;GAChE,GAAG;GACH,eAAe,aAAa,cAAc,KAAK,kBAAkB;IAChE,GAAG;IACH,QAAQ,aAAa,OAAO,KAAK,UAAU,MAAM,OAAO,UAAU,gBAAgB,MAAM;IACxF,EAAE;GACH,EAAE;EACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvEF,MAAM,oBAAoB;CACzB,MAAM;CACN,aAAa;CACb,UAAU;CACV,WAAW;CACX;;;;;;AAMD,MAAM,oBAAoB;CACzB,MAAM;CACN,aAAa;CACb,UAAU;CACV,WAAW;CACX;;;;;;;;;;AAUD,MAAM,mBAAmB;CACxB,MAAM;CACN,aAAa;CACb,WAAW;CACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACOD,SAAS,oBAAoB,EAAE,OAAO,SAAS,UAAU;CACxD,MAAM,EAAE,aAAa,WAAW,sBAAsB;CACtD,MAAM,iBAAiB,OAAO,eAAe,kBAAkB,8BAA8B;CAC7F,MAAM,gBAAgB,eAAe,kBAAkB,MAAM,aAAa,KAAK,EAAE,MAAM,aAAa,KAAK,CAAC,CAAC;CAC3G,MAAM,wBAAwB,eAAe;EAC5C,MAAM,QAAQ,cAAc,KAAK;AACjC,MAAI,CAAC,MAAO,QAAO,KAAK;AACxB,SAAO,oBAAoB,MAAM,YAAY,KAAK,IAAI,GAAG,MAAM,SAAS;GACvE;CACF,MAAM,qBAAqB,eAAe;AACzC,MAAI,CAAC,QAAQ,WAAW,KAAK,IAAI,CAAC,cAAc,KAAK,CAAE,QAAO;AAC9D,MAAI,MAAM,cAAc,KAAK,IAAI,MAAM,QAAQ,KAAK,KAAK,OAAQ,QAAO;AACxE,MAAI,MAAM,QAAQ,KAAK,KAAK,OAAQ,QAAO;AAC3C,SAAO;GACN;AACF,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,SAAS,EAAE;GACX,iBAAiB,EAAE,aAAa;IAC/B,MAAM,QAAQ,cAAc,KAAK;AACjC,YAAQ,WAAW,KAAK,CAAC,KAAK;KAC7B,MAAM;KACN;KACA,CAAC;MACA;GACH,cAAc,EAAE,eAAe;IAC9B,MAAM,QAAQ,cAAc,KAAK;AACjC,0BAAsB,KAAK;IAC3B,MAAM,cAAc,KAAK,MAAM,YAAY,IAAI;AAC/C,SAAK,QAAQ,WAAW,CAAC,KAAK;KAC7B,MAAM;KACN;KACA,OAAO;MACN,OAAO;MACP,KAAK,cAAc;MACnB;KACD,CAAC;MACA;GACH;EACD,CAAC;;AAEH,MAAM,+BAA+B;CACpC,GAAG;CACH,mBAAmB;CACnB;AACD,MAAM,+BAA+B;CACpC,GAAG;CACH,mBAAmB;CACnB;AACD,MAAM,8BAA8B;CACnC,GAAG;CACH,mBAAmB;CACnB;AACD,MAAM,oBAAoB,eAAe;CACxC,WAAW;EACV;EACA;EACA;EACA;EACA;EACA;CACD,aAAa,CAAC,0BAA0B;CACxC,QAAQ,EAAE,OAAO,SAAS,SAAS,EAAE,OAAO,oBAAoB;EAC/D;EACA;EACA,QAAQ;GACP,GAAG;GACH,GAAG;GACH;EACD,CAAC;CACF,CAAC;AACF,MAAM,oBAAoB,eAAe;CACxC,WAAW;EACV;EACA;EACA;EACA;EACA;EACA;CACD,aAAa,CAAC,0BAA0B;CACxC,QAAQ,EAAE,OAAO,SAAS,SAAS,EAAE,OAAO,oBAAoB;EAC/D;EACA;EACA,QAAQ;GACP,GAAG;GACH,GAAG;GACH;EACD,CAAC;CACF,CAAC;AACF,MAAM,wBAAwB,eAAe;CAC5C,WAAW;EACV;EACA;EACA;EACA;EACA;EACA;CACD,aAAa,CAAC,8BAA8B;CAC5C,QAAQ,EAAE,OAAO,SAAS,SAAS,EAAE,OAAO,oBAAoB;EAC/D;EACA;EACA,QAAQ;GACP,GAAG;GACH,GAAG;GACH;EACD,CAAC;CACF,CAAC;;;;;;;;;;;;;;;;;;;;ACzJF,SAAS,sBAAsB,gBAAgB,SAAS;CACvD,MAAM,EAAE,gBAAgB,UAAU,eAAe,kBAAkB;EAClE,OAAO;EACP,SAAS;EACT,CAAC;CACF,MAAM,mBAAmB,cAAc,eAAe,KAAK,CAAC,QAAQ;CACpE,MAAM,cAAc,YAAY,OAAO,gBAAgB,EAAE,SAAS,CAAC;AACnE,QAAO;EACN,IAAI,WAAW;AACd,UAAO;;EAER,KAAK,SAAS;AACb,OAAI,UAAU,KAAK,YAAa;GAChC,MAAM,UAAU,YAAY;GAC5B,MAAM,aAAa,QAAQ,SAAS,QAAQ;AAC5C,OAAI,eAAe,QAAS,YAAW,WAAW;;EAEnD,UAAU;AACT,OAAI,UAAU,KAAK,YAAa;AAChC,cAAW,YAAY;;EAExB;;;;;ACtCF,SAAS,eAAe,KAAK,UAAU;AACtC,QAAO,SAAS,MAAM,MAAM,EAAE,cAAc,IAAI,aAAa,EAAE,YAAY,IAAI,WAAW,EAAE,SAAS,IAAI,KAAK;;;AAG/G,SAAS,sBAAsB,cAAc;AAC5C,QAAO,sBAAsB;EAC5B,QAAQ,EAAE;EACV,UAAU,EAAE;EACZ,GAAG,SAAS,YAAY;AACxB,MAAI,QAAQ,SAAS,QAAS,QAAO;GACpC,QAAQ,EAAE;GACV,UAAU,EAAE;GACZ;EACD,MAAM,EAAE,MAAM,SAAS;EACvB,MAAM,EAAE,SAAS,IAAI,WAAW,WAAW,aAAa;EACxD,MAAM,YAAY,MAAM,KAAK,aAAa,WAAW,CAAC,MAAM,MAAM,EAAE,OAAO,QAAQ;AACnF,MAAI,CAAC,UAAW,QAAO;EACvB,MAAM,eAAe,QAAQ,OAAO,YAAY,EAAE;EAClD,MAAM,mBAAmB,QAAQ,SAAS,YAAY,EAAE;EACxD,MAAM,aAAa,KAAK,QAAQ,QAAQ,CAAC,eAAe,KAAK,aAAa,CAAC;EAC3E,MAAM,uBAAuB,iBAAiB,MAAM,MAAM,EAAE,OAAO,UAAU;AAC7E,MAAI,WAAW,WAAW,KAAK,qBAAsB,QAAO;AAC5D,OAAK,MAAM,OAAO,WAAY,WAAU,OAAO,IAAI;AACnD,SAAO;GACN,GAAG;GACH,QAAQ;IACP,GAAG,QAAQ;KACV,UAAU,CAAC,GAAG,cAAc,GAAG,WAAW;IAC3C;GACD,UAAU,uBAAuB,QAAQ,WAAW;IACnD,GAAG,QAAQ;KACV,UAAU,CAAC,GAAG,kBAAkB;KAChC,IAAI;KACJ;KACA;KACA,CAAC;IACF;GACD;GACA;;;;;;;;;;;;;;;;;ACzBH,IAAI,OAAO,MAAM;CAChB;CACA;CACA,mBAAmB,IAAI,iBAAiB;CACxC;CACA,UAAU;CACV,SAAS,KAAK;CACd,SAAS,KAAK;CACd,YAAY,OAAO,QAAQ;AAC1B,QAAKA,QAAS;EACd,MAAM,QAAQ,QAAQ;AACtB,OAAK,KAAK,OAAO,UAAU,aAAa,OAAO,GAAG,SAAS,YAAY;AACvE,QAAKC,SAAU,QAAQ,SAAS,eAAe,CAAC,MAAKC,gBAAiB,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAKA,gBAAiB;;CAEvH,IAAI,SAAS;AACZ,SAAO,MAAKC;;CAEb,IAAI,QAAQ;AACX,SAAO,MAAKC;;CAEb,IAAI,QAAQ;AACX,SAAO,MAAKC;;CAEb,MAAM,MAAM;AACX,QAAKF,SAAU;AACf,MAAI;GACH,MAAM,SAAS,MAAM,MAAKH,MAAO,MAAKC,OAAQ;AAC9C,SAAKG,QAAS;AACd,SAAKD,SAAU;AACf,UAAO;WACC,GAAG;AACX,SAAKE,QAAS;AACd,SAAKF,SAAU;AACf,SAAM;;;CAGR,QAAQ;AACP,QAAKD,gBAAiB,OAAO;;;;;;;;;;AAU/B,IAAI,mBAAmB,MAAM;CAC5B,2BAA2B,IAAI,KAAK;CACpC,WAAW,QAAQ,SAAS;CAC5B,kBAAkB;CAClB,aAAa;CACb,SAAS,MAAM;AACd,MAAI,MAAKI,UAAY,QAAO,QAAQ,SAAS;EAC7C,MAAM,WAAW,MAAKC,QAAS,IAAI,KAAK,GAAG;AAC3C,MAAI,SAAU,QAAO,SAAS;AAC9B,MAAI,MAAKA,QAAS,SAAS,EAAG,OAAKC,UAAW,IAAI,SAAS,YAAY;AACtE,SAAKC,iBAAkB;IACtB;EACF,MAAM,UAAU,KAAK,KAAK;AAC1B,UAAQ,YAAY,GAAG;EACvB,MAAM,gBAAgB;AACrB,SAAKF,QAAS,OAAO,KAAK,GAAG;AAC7B,OAAI,MAAKA,QAAS,SAAS,GAAG;AAC7B,UAAKE,kBAAmB;AACxB,UAAKA,iBAAkB;;;AAGzB,UAAQ,KAAK,SAAS,QAAQ;AAC9B,QAAKF,QAAS,IAAI,KAAK,IAAI;GAC1B;GACA;GACA,CAAC;AACF,SAAO;;;;;;;;CAQR,YAAY,UAAU;AACrB,MAAI,MAAKA,QAAS,SAAS,EAAG;EAC9B,MAAM,WAAW,MAAKC;AACtB,WAAS,WAAW;AACnB,OAAI,MAAKA,YAAa,SAAU;AAChC,aAAU;WACF,GAAG;;CAEb,WAAW;AACV,OAAK,MAAM,EAAE,UAAU,MAAKD,QAAS,QAAQ,CAAE,MAAK,OAAO;AAC3D,QAAKA,QAAS,OAAO;AACrB,QAAKE,kBAAmB;AACxB,QAAKA,iBAAkB;AACvB,QAAKD,UAAW,QAAQ,SAAS;;CAElC,UAAU;AACT,QAAKF,YAAa;AAClB,OAAK,UAAU;;;;;;;;;;;;;;;;;AAiBjB,IAAI,eAAe,MAAM;CACxB,SAAS,QAAQ,SAAS;CAC1B,2BAA2B,IAAI,KAAK;CACpC,WAAW;CACX,aAAa;CACb,SAAS,MAAM;AACd,MAAI,MAAKA,UAAY,QAAO,QAAQ,SAAS;EAC7C,MAAM,IAAI;AACV,QAAKC,QAAS,IAAI,EAAE;EACpB,MAAM,SAAS,MAAKG,MAAO,WAAW;AACrC,SAAKH,QAAS,OAAO,EAAE;AACvB,SAAKI,UAAW;AAChB,UAAO,KAAK,KAAK;IAChB,CAAC,cAAc;AAChB,SAAKA,UAAW;IACf;AACF,QAAKD,QAAS,OAAO,WAAW,UAAU,GAAG;AAC7C,SAAO;;;;;;;;CAQR,IAAI,UAAU;AACb,SAAO,MAAKA;;;;;;;;;CASb,YAAY,UAAU;AACrB,MAAI,MAAKH,QAAS,SAAS,KAAK,MAAKI,YAAa,KAAM;EACxD,MAAM,eAAe,MAAKD;AAC1B,eAAa,WAAW;AACvB,OAAI,MAAKA,UAAW,aAAc;AAClC,aAAU;WACF,GAAG;;;CAGb,eAAe;AACd,OAAK,MAAM,QAAQ,MAAKH,QAAU,MAAK,OAAO;AAC9C,QAAKA,QAAS,OAAO;;CAEtB,WAAW;AACV,OAAK,cAAc;AACnB,QAAKI,SAAU,OAAO;;CAEvB,UAAU;AACT,QAAKL,YAAa;AAClB,OAAK,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9IjB,SAAS,mBAAmB,KAAK;CAChC,MAAM,SAAS,IAAI,UAAU;CAC7B,MAAM,EAAE,gBAAgB,UAAU,eAAe,kBAAkB;EAClE,OAAO,IAAI;EACX,SAAS,IAAI;EACb,CAAC;CACF,MAAM,mBAAmB,cAAc,eAAe,KAAK,CAAC,QAAQ;CACpE,MAAM,cAAc,YAAY;AAC/B,SAAO,gBAAgB,EAAE,SAAS,CAAC;;AAEpC,QAAO;EACN,IAAI,WAAW;AACd,UAAO;;EAER,KAAK,SAAS;GACb,MAAM,QAAQ,UAAU;AACxB,OAAI,UAAU,YAAa;GAC3B,MAAM,UAAU,IAAI,OAAO,QAAQ,KAAK,QAAQ;AAChD,OAAI,CAAC,QAAS;AACd,WAAQ,SAAS;IAChB,SAAS,YAAY;IACrB;IACA,aAAa,OAAO,WAAW,GAAG;IAClC;IACA,GAAG,SAAS,EAAE,QAAQ,GAAG,EAAE;IAC3B,CAAC;GACF,MAAM,WAAW,UAAU;AAC3B,OAAI,aAAa,aAAa;IAC7B,MAAM,cAAc,IAAI,OAAO;AAC/B,QAAI,aAAa,aAAa,QAAQ;KACrC,MAAM,cAAc,YAAY;AAChC,YAAO,kBAAkB;AACxB,UAAI,UAAU,KAAK,SAAU;AAC7B,iBAAW,YAAY;OACtB;;;;EAIL,UAAU;AACT,OAAI,UAAU,KAAK,YAAa;AAChC,WAAQ,SAAS;AACjB,cAAW,YAAY;;EAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrDF,SAAS,kCAAkC,iBAAiB,gBAAgB,SAAS,EAAE,EAAE;CACxF,MAAM,sBAAsB;EAC3B,GAAG;EACH,GAAG,OAAO;EACV;;;;;;;;;;CAUD,MAAM,aAAa,YAAY;EAC9B,MAAM,EAAE,OAAO,UAAU;AACzB,MAAI,CAAC,MAAO,QAAO,EAAE;EACrB,MAAM,UAAU,MAAM;EACtB,MAAM,mBAAmB,KAAK,gBAAgB,SAAS,CAAC,QAAQ,SAAS,YAAY,EAAE;AACvF,SAAO,kBAAkB,MAAM,UAAU,kBAAkB,MAAM,OAAO,oBAAoB,CAAC,KAAK,aAAa;GAC9G;GACA;GACA,EAAE;;;;;;;CAOJ,MAAM,gBAAgB,IAAI,EAAE,YAAY,iBAAiB;AACxD,SAAO,IAAI,KAAK,OAAO,WAAW;AACjC,OAAI,OAAO,QAAS;AACpB,cAAW;IACV,GAAG,YAAY;IACf,iBAAiB,GAAG;IACpB,mBAAmB,GAAG,QAAQ;IAC9B,CAAC;AACF,OAAI;IACH,MAAM,OAAO,MAAM,eAAe,GAAG,QAAQ,IAAI;AACjD,QAAI,OAAO,QAAS;AACpB,oBAAgB,KAAK;KACpB,MAAM;KACN,MAAM;MACL,SAAS,GAAG;MACZ,IAAI,GAAG,QAAQ;MACf,WAAW,GAAG,QAAQ;MACtB,UAAU,GAAG,QAAQ;MACrB;KACD;KACA,CAAC;YACM,OAAO;AACf,YAAQ,MAAM,sCAAsC,MAAM;aACjD;AACT,eAAW;KACV,GAAG,YAAY;KACf,iBAAiB;KACjB,mBAAmB;KACnB,CAAC;;IAEF;;CAEH,MAAM,eAAe,OAAO,QAAQ;AACnC,OAAK,MAAM,MAAM,MAAO,KAAI,OAAO,SAAS,aAAa,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,MAAM;AACtF,OAAI,aAAa,SAAS,EAAE,SAAS,aAAc;AACnD,WAAQ,MAAM,kDAAkD,EAAE;AAClE,OAAI,OAAO,cAAc;IACxB;;AAEH,QAAO,mBAAmB;EACzB,cAAc,IAAI,cAAc;EAChC,SAAS;EACT,SAAS;GACR,iBAAiB;GACjB,mBAAmB;GACnB;EACD,QAAQ;GACP,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,QAAQ;IACjC,MAAM,QAAQ,UAAU,IAAI;AAC5B,QAAI,MAAM,WAAW,EAAG;AACxB,QAAI,WAAW,UAAU;AACzB,gBAAY,OAAO,IAAI;MACrB,EAAE;GACL,SAAS;IACR,WAAW;IACX,IAAI,EAAE,OAAO,KAAK,QAAQ;KACzB,MAAM,EAAE,SAAS,WAAW;KAC5B,MAAM,QAAQ,UAAU,IAAI;AAC5B,SAAI,QAAQ,oBAAoB,QAAQ,QAAQ,sBAAsB,QAAQ,MAAM,MAAM,MAAM,EAAE,YAAY,QAAQ,mBAAmB,EAAE,QAAQ,OAAO,QAAQ,kBAAkB,EAAE;AACrL,aAAO,cAAc;AACrB,kBAAY,MAAM,QAAQ,MAAM,EAAE,EAAE,YAAY,QAAQ,mBAAmB,EAAE,QAAQ,OAAO,QAAQ,mBAAmB,EAAE,IAAI;YACvH;AACN,aAAO,UAAU;AACjB,kBAAY,OAAO,IAAI;;OAEtB;IACH;GACD;EACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;ACxGH,SAAS,0BAA0B,EAAE,SAAS,UAAU;AACvD,QAAO,aAAa;EACnB,MAAM,eAAe,QAAQ,aAAa,KAAK;AAC/C,MAAI,CAAC,aAAc;EACnB,MAAM,kBAAkB,sBAAsB,aAAa;EAC3D,MAAM,8BAA8B,kCAAkC,iBAAiB,OAAO,yBAAyB,EAAE,eAAe,OAAO,eAAe,CAAC;AAC/J,UAAQ,gBAAgB,IAAI,gBAAgB;AAC5C,UAAQ,4BAA4B,IAAI,4BAA4B;AACpE,eAAa;AACZ,mBAAgB,SAAS;AACzB,+BAA4B,SAAS;AACrC,WAAQ,gBAAgB,IAAI,KAAK,EAAE;AACnC,WAAQ,4BAA4B,IAAI,KAAK,EAAE;;GAE/C;;AAEH,MAAM,uBAAuB,eAAe;CAC3C,WAAW,EAAE;CACb,aAAa;EACZ;EACA;EACA;EACA;CACD,OAAO;CACP,CAAC;;;;;;;;;;;;;;;;;;;AC9BF,SAAS,sBAAsB,EAAE,OAAO,SAAS,UAAU;CAC1D,MAAM,qBAAqB,QAAQ,sBAAsB;AACzD,QAAO,aAAa;EACnB,MAAM,eAAe,QAAQ,aAAa,KAAK;AAC/C,MAAI,CAAC,cAAc;AAClB,SAAM,YAAY,IAAI,mBAAmB;AACzC;;EAED,MAAM,aAAa,MAAM,YAAY,IAAI,aAAa,YAAY;AAClE,QAAM;EACN,MAAM,mBAAmB,OAAO,cAAc,cAAc,KAAK;EACjE,MAAM,gBAAgB,OAAO,cAAc,WAAW,KAAK;AAC3D,eAAa;AACZ,qBAAkB;AAClB,kBAAe;;GAEf;;AAEH,MAAM,mBAAmB,eAAe;CACvC,WAAW,CAAC,cAAc;CAC1B,aAAa,CAAC,eAAe;CAC7B,OAAO;CACP,CAAC;;;;;;;;;;;;;;;;;;;;;;;ACjBF,SAASM,cAAY,cAAc,cAAc,eAAe;AAC/D,KAAI,CAAC,gBAAgB,CAAC,cAAc,IAAK,QAAO;AAChD,KAAI,cAAe,QAAO;AAC1B,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BR,SAAS,uBAAuB,EAAE,OAAO,WAAW;CACnD,MAAM,qBAAqB,eAAeA,cAAY,MAAM,aAAa,KAAK,EAAE,QAAQ,aAAa,KAAK,EAAE,MAAM,cAAc,KAAK,CAAC,CAAC;CACvI,MAAM,YAAY,eAAe,MAAM,aAAa,KAAK,EAAE,IAAI;AAC/D,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,YAAY,EAAE,eAAe;IAC5B,MAAM,KAAK,QAAQ,aAAa,KAAK;IACrC,MAAM,yBAAyB,MAAM,cAAc,IAAI,KAAK;AAC5D,QAAI,CAAC,GAAG,UAAU,GAAG,SAAS;AAC7B,uBAAkB;AAClB;;IAED,MAAM,cAAc,OAAO,IAAI,QAAQ,iBAAiB;IACxD,MAAM,iBAAiB,OAAO,IAAI,WAAW,iBAAiB;AAC9D,iBAAa;AACZ,kBAAa;AACb,qBAAgB;;MAEf;GACH,eAAe,EAAE,eAAe;AAC/B,YAAQ,aAAa,KAAK;AAC1B,cAAU,KAAK;AACf,iBAAa,MAAM,cAAc,IAAI,MAAM;MACzC;GACH;EACD,CAAC;;AAEH,MAAM,oBAAoB,eAAe;CACxC,WAAW,CAAC,iBAAiB,eAAe;CAC5C,aAAa,CAAC,eAAe;CAC7B,OAAO;CACP,CAAC;;;;;;;;;ACnFF,MAAM,qBAAqB;;;;;;;;;;;AAW3B,SAAS,0BAA0B,cAAc,iBAAiB;AACjE,MAAK,MAAM,cAAc,iBAAiB;EACzC,MAAM,KAAK,SAAS,cAAc,QAAQ;AAC1C,KAAG,KAAK,WAAW;AACnB,KAAG,OAAO,WAAW;AACrB,KAAG,QAAQ,WAAW;AACtB,KAAG,gBAAgB,kBAAkB,KAAK;AAC1C,MAAI,WAAW,SAAU,IAAG,UAAU,WAAW;AACjD,MAAI,WAAW,QAAS,IAAG,UAAU;AACrC,eAAa,YAAY,GAAG;;;;;;;;;;AAU9B,SAAS,kCAAkC,cAAc;CACxD,MAAM,WAAW,aAAa,iBAAiB,mBAAmB;AAClE,MAAK,MAAM,MAAM,UAAU;EAC1B,MAAM,QAAQ,GAAG;AACjB,MAAI,MAAM,SAAS,cAAc,MAAM,SAAS,eAAe,MAAM,SAAS,YAAa,QAAO;;;;;;;;AAQpG,SAAS,kCAAkC,cAAc;CACxD,MAAM,WAAW,aAAa,iBAAiB,mBAAmB;AAClE,MAAK,MAAM,MAAM,SAAU,IAAG,QAAQ;;;;;;;;AAQvC,SAAS,mBAAmB,YAAY,YAAY;AACnD,MAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC3C,MAAM,QAAQ,WAAW;AACzB,MAAI,MAAM,SAAS,eAAe,MAAM,SAAS,WAAY;AAC7D,QAAM,OAAO,MAAM,OAAO,aAAa,YAAY;;;;;;;;;;ACzDrD,SAAS,mBAAmB,MAAM;CACjC,MAAM,6BAA6B,IAAI,KAAK;AAC5C,MAAK,MAAM,SAAS,KAAK,SAAS,sCAAsC,EAAE;EACzE,MAAM,MAAM,MAAM;EAClB,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM;AACtC,MAAI,IAAK,YAAW,IAAI,KAAK,MAAM;;AAEpC,QAAO;;;;;AAKR,SAAS,gBAAgB,OAAO;CAC/B,MAAM,QAAQ,gBAAgB,KAAK,MAAM;AACzC,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO;EACN,OAAO,OAAO,SAAS,MAAM,IAAI,GAAG;EACpC,QAAQ,OAAO,SAAS,MAAM,IAAI,GAAG;EACrC;;;;;AAKF,SAAS,eAAe,OAAO;CAC9B,MAAM,MAAM,OAAO,WAAW,MAAM;AACpC,KAAI,OAAO,MAAM,IAAI,IAAI,OAAO,EAAG,QAAO,KAAK;AAC/C,KAAI,KAAK,IAAI,MAAM,OAAO,GAAG,IAAK,QAAO;EACxC,oBAAoB;EACpB,sBAAsB;EACtB;AACD,KAAI,KAAK,IAAI,MAAM,MAAM,GAAG,IAAK,QAAO;EACvC,oBAAoB;EACpB,sBAAsB;EACtB;AACD,KAAI,KAAK,IAAI,MAAM,MAAM,GAAG,IAAK,QAAO;EACvC,oBAAoB;EACpB,sBAAsB;EACtB;AACD,KAAI,MAAM,MAAM,EAAG,QAAO,EAAE,oBAAoB,KAAK,MAAM,IAAI,EAAE;AACjE,QAAO,EAAE,oBAAoB,KAAK,MAAM,IAAI,EAAE;;;;;AAK/C,SAAS,YAAY,QAAQ;CAC5B,MAAM,QAAQ,OAAO,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;CACpD,MAAM,SAAS,EAAE;AACjB,MAAK,MAAM,SAAS,MAAO,KAAI,MAAM,WAAW,QAAQ,IAAI,MAAM,WAAW,QAAQ,IAAI,MAAM,WAAW,QAAQ,CAAE,QAAO,QAAQ;UAC1H,MAAM,WAAW,QAAQ,CAAE,QAAO,QAAQ;AACnD,QAAO;;;;;AAKR,SAAS,oBAAoB,OAAO;CACnC,MAAM,eAAe,MAAM,MAAM,IAAI,CAAC,MAAM;CAC5C,MAAM,WAAW,OAAO,WAAW,aAAa;AAChD,QAAO,OAAO,MAAM,SAAS,GAAG,IAAI;;;;;;;AAOrC,SAAS,eAAe,OAAO,aAAa;CAC3C,MAAM,QAAQ,qBAAqB,KAAK,MAAM;AAC9C,KAAI,CAAC,MAAO,QAAO;CACnB,MAAM,SAAS,OAAO,SAAS,MAAM,IAAI,GAAG;AAC5C,KAAI,OAAO,MAAM,OAAO,CAAE,QAAO;CACjC,IAAI;AACJ,KAAI,MAAM,OAAO,KAAK,GAAG;AACxB,UAAQ,OAAO,SAAS,MAAM,IAAI,GAAG;AACrC,MAAI,OAAO,MAAM,MAAM,CAAE,QAAO;YACtB,gBAAgB,KAAK,EAAG,SAAQ;KACtC,QAAO;AACZ,QAAO;EACN;EACA,KAAK,QAAQ,SAAS;EACtB;;;;;AAKF,SAAS,oBAAoB,MAAM;CAClC,MAAM,MAAM,mBAAmB,KAAK;AACpC,QAAO;EACN,IAAI,KAAK;AACR,UAAO,IAAI,IAAI,IAAI;;EAEpB,OAAO,KAAK,cAAc;GACzB,MAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,OAAI,UAAU,KAAK,EAAG,QAAO;GAC7B,MAAM,SAAS,OAAO,SAAS,OAAO,GAAG;AACzC,UAAO,OAAO,MAAM,OAAO,GAAG,eAAe;;EAE9C,SAAS,KAAK,cAAc;GAC3B,MAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,OAAI,UAAU,KAAK,EAAG,QAAO;GAC7B,MAAM,SAAS,OAAO,WAAW,MAAM;AACvC,UAAO,OAAO,MAAM,OAAO,GAAG,eAAe;;EAE9C,QAAQ,KAAK;AACZ,UAAO,IAAI,IAAI,IAAI,KAAK;;EAEzB,cAAc,KAAK;GAClB,MAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,OAAI,CAAC,MAAO,QAAO,KAAK;AACxB,UAAO,gBAAgB,MAAM,IAAI,KAAK;;EAEvC,aAAa,KAAK;GACjB,MAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,OAAI,CAAC,MAAO,QAAO,KAAK;AACxB,UAAO,eAAe,MAAM;;EAE7B;;;;;;AAMF,SAAS,SAAS,MAAM,KAAK;CAC5B,MAAM,SAAS,IAAI,IAAI;AACvB,KAAI,CAAC,KAAK,WAAW,OAAO,CAAE,QAAO;AACrC,QAAO,oBAAoB,KAAK,MAAM,OAAO,OAAO,CAAC;;;;;;;;AC5HtD,SAAS,WAAW,KAAK,SAAS;AACjC,QAAO,IAAI,IAAI,KAAK,QAAQ,CAAC;;;;;;;;;;;;;;;;ACU9B,SAAS,0BAA0B,MAAM,YAAY;CACpD,MAAM,UAAU,WAAW;CAC3B,MAAM,QAAQ,KAAK,MAAM,QAAQ;CACjC,MAAM,UAAU,EAAE;CAClB,MAAM,kBAAkB,EAAE;CAC1B,MAAM,qBAAqB,EAAE;CAC7B,IAAI,oBAAoB;AACxB,MAAK,MAAM,QAAQ,OAAO;EACzB,MAAM,UAAU,KAAK,MAAM;AAC3B,MAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,IAAI,CAAC,QAAQ,WAAW,OAAO,CAAE;AACxE,MAAI,YAAY,aAAa,QAAQ,WAAW,kBAAkB,IAAI,QAAQ,WAAW,8BAA8B,CAAE;EACzH,MAAM,aAAa,SAAS,SAAS,cAAc;AACnD,MAAI,YAAY;GACf,MAAM,OAAO,WAAW,IAAI,OAAO;GACnC,MAAM,UAAU,WAAW,IAAI,WAAW;GAC1C,MAAM,OAAO,WAAW,IAAI,OAAO;AACnC,OAAI,SAAS,WAAW,WAAW,MAAM;IACxC,MAAM,MAAM,WAAW,IAAI,MAAM;AACjC,oBAAgB,KAAK;KACpB;KACA;KACA,UAAU,WAAW,IAAI,WAAW;KACpC,KAAK,MAAM,WAAW,KAAK,QAAQ,GAAG,KAAK;KAC3C,SAAS,WAAW,QAAQ,UAAU;KACtC,YAAY,WAAW,QAAQ,aAAa;KAC5C,CAAC;;AAEH,OAAI,SAAS,eAAe,WAAW,MAAM;IAC5C,MAAM,MAAM,WAAW,IAAI,MAAM;AACjC,QAAI,IAAK,oBAAmB,KAAK;KAChC;KACA;KACA,UAAU,WAAW,IAAI,WAAW;KACpC,KAAK,WAAW,KAAK,QAAQ;KAC7B,SAAS,WAAW,QAAQ,UAAU;KACtC,YAAY,WAAW,QAAQ,aAAa;KAC5C,QAAQ,WAAW,QAAQ,SAAS;KACpC,CAAC;;AAEH;;EAED,MAAM,iBAAiB,SAAS,SAAS,mBAAmB;AAC5D,MAAI,gBAAgB;AACnB,uBAAoB;IACnB,WAAW,eAAe,OAAO,aAAa,EAAE;IAChD,YAAY,eAAe,cAAc,aAAa;IACtD,QAAQ,eAAe,IAAI,SAAS;IACpC,WAAW,eAAe,aAAa,aAAa;IACpD,cAAc,eAAe,IAAI,QAAQ;IACzC;AACD;;AAED,MAAI,CAAC,QAAQ,WAAW,IAAI,IAAI,mBAAmB;AAClD,WAAQ,KAAK;IACZ,GAAG;IACH,KAAK,WAAW,SAAS,QAAQ;IACjC,CAAC;AACF,uBAAoB;;;CAGtB,MAAM,eAAe,EAAE;CACvB,MAAM,mBAAmB,EAAE;AAC3B,MAAK,MAAM,UAAU,SAAS;AAC7B,MAAI,CAAC,OAAO,QAAQ;AACnB,gBAAa,KAAK,OAAO;AACzB;;EAED,MAAM,eAAe,YAAY,OAAO,OAAO;AAC/C,MAAI,OAAO,OAAO,MAAM,IAAI,CAAC,WAAW,EAAG,KAAI,aAAa,SAAS,CAAC,aAAa,MAAO,kBAAiB,KAAK,OAAO;MAClH,cAAa,KAAK,OAAO;MACzB,cAAa,KAAK,OAAO;;CAE/B,MAAM,cAAc,aAAa,KAAK,WAAW;EAChD,MAAM,SAAS,OAAO,SAAS,YAAY,OAAO,OAAO,GAAG,KAAK;EACjE,MAAM,QAAQ;GACb,MAAM;GACN,IAAI,YAAY;GAChB,KAAK,OAAO;GACZ,WAAW,OAAO;GAClB,UAAU;GACV,QAAQ,EAAE;GACV;AACD,MAAI,OAAO,YAAY,UAAU,KAAK,EAAG,OAAM,QAAQ,OAAO,WAAW;AACzE,MAAI,OAAO,YAAY,WAAW,KAAK,EAAG,OAAM,SAAS,OAAO,WAAW;AAC3E,MAAI,QAAQ,MAAO,OAAM,SAAS,CAAC,OAAO,MAAM;AAChD,MAAI,OAAO,UAAW,OAAM,YAAY,OAAO;AAC/C,MAAI,OAAO,aAAc,OAAM,eAAe,OAAO;AACrD,SAAO;GACN;CACF,MAAM,kBAAkB,iBAAiB,KAAK,WAAW;EACxD,MAAM,SAAS,OAAO,SAAS,YAAY,OAAO,OAAO,GAAG,KAAK;AACjE,SAAO;GACN,MAAM;GACN,IAAI,YAAY;GAChB,KAAK,OAAO;GACZ,WAAW,OAAO;GAClB,UAAU;GACV,QAAQ,QAAQ,QAAQ,CAAC,OAAO,MAAM,GAAG,EAAE;GAC3C,SAAS,OAAO,gBAAgB;GAChC,MAAM;GACN,YAAY;GACZ,UAAU;GACV;GACA;CACF,MAAM,cAAc,CAAC,GAAG,gBAAgB,KAAK,cAAc;EAC1D,IAAI;AACJ,OAAK,MAAM,UAAU,QAAS,KAAI,OAAO,iBAAiB,UAAU,WAAW,OAAO,QAAQ;GAC7F,MAAM,SAAS,YAAY,OAAO,OAAO;AACzC,OAAI,OAAO,OAAO;AACjB,kBAAc,CAAC,OAAO,MAAM;AAC5B;;;EAGF,MAAM,QAAQ;GACb,MAAM;GACN,IAAI,YAAY;GAChB,KAAK,UAAU,OAAO;GACtB,SAAS,UAAU;GACnB,MAAM,UAAU;GAChB,UAAU;GACV,WAAW;GACX,YAAY;GACZ,UAAU;GACV,QAAQ,EAAE;GACV;AACD,MAAI,UAAU,SAAU,OAAM,WAAW,UAAU;AACnD,MAAI,YAAa,OAAM,SAAS;AAChC,MAAI,UAAU,QAAS,OAAM,UAAU,UAAU;AACjD,MAAI,UAAU,WAAY,OAAM,aAAa,UAAU;AACvD,SAAO;GACN,EAAE,GAAG,gBAAgB;CACvB,MAAM,aAAa,mBAAmB,KAAK,cAAc;EACxD,MAAM,QAAQ;GACb,MAAM;GACN,IAAI,YAAY;GAChB,KAAK,UAAU;GACf,SAAS,UAAU;GACnB,OAAO,UAAU;GACjB,MAAM;GACN,UAAU;GACV,WAAW;GACX;AACD,MAAI,UAAU,SAAU,OAAM,WAAW,UAAU;AACnD,MAAI,UAAU,WAAW,UAAU,WAAY,OAAM,UAAU;AAC/D,MAAI,UAAU,WAAY,OAAM,aAAa,UAAU;AACvD,MAAI,UAAU,OAAQ,OAAM,SAAS,UAAU;AAC/C,SAAO;GACN;CACF,MAAM,gBAAgB,EAAE;AACxB,KAAI,YAAY,SAAS,GAAG;EAC3B,MAAM,oBAAoB;GACzB,IAAI,YAAY;GAChB,MAAM;GACN,QAAQ;GACR;EACD,MAAM,oBAAoB;GACzB,IAAI,YAAY;GAChB,MAAM;GACN,eAAe,CAAC,kBAAkB;GAClC;AACD,gBAAc,KAAK,kBAAkB;;AAEtC,KAAI,YAAY,SAAS,GAAG;EAC3B,MAAM,oBAAoB;GACzB,IAAI,YAAY;GAChB,MAAM;GACN,QAAQ;GACR;EACD,MAAM,oBAAoB;GACzB,IAAI,YAAY;GAChB,MAAM;GACN,eAAe,CAAC,kBAAkB;GAClC;AACD,gBAAc,KAAK,kBAAkB;;AAEtC,KAAI,WAAW,SAAS,GAAG;EAC1B,MAAM,mBAAmB;GACxB,IAAI,YAAY;GAChB,MAAM;GACN,QAAQ;GACR;EACD,MAAM,mBAAmB;GACxB,IAAI,YAAY;GAChB,MAAM;GACN,eAAe,CAAC,iBAAiB;GACjC;AACD,gBAAc,KAAK,iBAAiB;;AAErC,QAAO;EACN,IAAI,YAAY;EAChB,KAAK,WAAW;EAChB,WAAW;EACX;EACA;;;;;;;;AC3MF,MAAM,2BAA2B;CAChC,OAAO;CACP,OAAO;CACP,MAAM;CACN;;;;;;;;;;;;AAYD,SAAS,iBAAiB,OAAO,MAAM;CACtC,MAAM,EAAE,iBAAiB;AACzB,KAAI,CAAC,cAAc,cAAe,QAAO,KAAK;CAC9C,MAAM,UAAU,MAAM,yBAAyB;AAC/C,QAAO,aAAa,cAAc,MAAM,EAAE,MAAM,uBAAuB,qBAAqB,KAAK,EAAE,cAAc,IAAI,OAAO,MAAM,EAAE,SAAS,OAAO,QAAQ;;;;;;;;AAQ7J,SAAS,iCAAiC,OAAO;AAChD,KAAI,MAAM,sBAAsB;EAC/B,MAAM,QAAQ,iBAAiB,OAAO,QAAQ;AAC9C,MAAI,SAAS,gBAAgB,MAAM,CAAE,QAAO,MAAM;;AAEnD,KAAI,MAAM,sBAAsB;EAC/B,MAAM,QAAQ,iBAAiB,OAAO,QAAQ;AAC9C,MAAI,SAAS,gBAAgB,MAAM,CAAE,QAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACPpD,SAAS,mCAAmC,EAAE,OAAO,UAAU;AAC9D,QAAO,aAAa;EACnB,MAAM,eAAe,MAAM,aAAa,KAAK;AAC7C,MAAI,CAAC,gBAAgB,aAAa,aAAa,KAAK,EAAG;EACvD,MAAM,WAAW,OAAO,gBAAgB,cAAc,SAAS,MAAM,CAAC,CAAC;AACvE,MAAI,aAAa,KAAK,KAAK,OAAO,MAAM,SAAS,IAAI,YAAY,EAAG;AACpE,SAAO,MAAM,eAAe,YAAY,UAAU;GACjD,GAAG;GACH;GACA,GAAG,QAAQ;GACX;;AAEH,MAAM,gCAAgC,eAAe;CACpD,WAAW;EACV;EACA;EACA;EACA;CACD,aAAa,EAAE;CACf,OAAO;CACP,CAAC;;;;;;;;AC/CF,SAAS,kBAAkB,cAAc,aAAa;AACrD,QAAO,CAAC,EAAE,eAAe,gBAAgB,wBAAwB,aAAa;;;;;;;AAO/E,SAAS,kBAAkB,SAAS;CACnC,IAAI,SAAS;AACb,MAAK,MAAM,UAAU,SAAS;EAC7B,MAAM,EAAE,aAAa;AACrB,MAAI,SAAS,SAAS,GAAG;GACxB,MAAM,MAAM,SAAS,IAAI,SAAS,SAAS,EAAE;AAC7C,OAAI,MAAM,OAAQ,UAAS;;;AAG7B,QAAO;;;;;;;;;;;;;;;;;;AAkBR,SAAS,qBAAqB,cAAc,aAAa;AACxD,KAAI,CAAC,kBAAkB,cAAc,YAAY,CAAE,QAAO;CAC1D,MAAM,WAAW,aAAa;AAC9B,KAAI,OAAO,MAAM,SAAS,IAAI,YAAY,EAAG,QAAO;AACpD,QAAO;;;;;;;;;;;AAWR,SAAS,0BAA0B,SAAS,QAAQ;AACnD,KAAI,OAAO,QAAS,QAAO,QAAQ,SAAS;CAC5C,MAAM,WAAW,EAAE;AACnB,MAAK,MAAM,OAAO,QAAS,KAAI,IAAI,SAAU,UAAS,KAAK,IAAI;AAC/D,KAAI,SAAS,WAAW,EAAG,QAAO,QAAQ,SAAS;AACnD,QAAO,IAAI,SAAS,YAAY;EAC/B,IAAI,YAAY,SAAS;EACzB,MAAM,oBAAoB;AACzB;AACA,OAAI,cAAc,EAAG,UAAS;;AAE/B,OAAK,MAAM,OAAO,SAAU,KAAI,iBAAiB,aAAa,aAAa;GAC1E,MAAM;GACN;GACA,CAAC;AACF,SAAO,iBAAiB,eAAe,SAAS,EAAE,EAAE,MAAM,MAAM,CAAC;GAChE;;;;;;;;;;;;;;AC9DH,SAAS,sBAAsB,kBAAkB,kBAAkB;AAClE,KAAI,iBAAiB,WAAW,EAAG,QAAO;CAC1C,MAAM,UAAU,iBAAiB,iBAAiB,SAAS;AAC3D,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,kBAAkB,MAAM,MAAM,EAAE,OAAO,QAAQ,MAAM,CAAC,EAAE,QAAQ,IAAI;;;;;;;;;;;;;;;;ACF5E,SAAS,sBAAsB;AAC9B,QAAO,OAAO,gBAAgB;;;;;;AAM/B,SAAS,6BAA6B;AACrC,QAAO,OAAO,uBAAuB;;;;;;;;;;;;;;AActC,SAAS,kBAAkB,UAAU,EAAE,EAAE;CACxC,MAAM,EAAE,gBAAgB,UAAU;AAClC,KAAI,iBAAiB,4BAA4B,CAAE,QAAO,IAAI,oBAAoB;AAClF,KAAI,qBAAqB,CAAE,QAAO,IAAI,aAAa;AACnD,OAAM,IAAI,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;AAkBpD,SAAS,kBAAkB,aAAa,cAAc;AACrD,KAAI,4BAA4B,IAAI,uBAAuB,oBAAoB;AAC9E,eAAa,wBAAwB;AACrC,eAAa,YAAY;EACzB,MAAM,eAAe;AACpB,gBAAa,YAAY;AACzB,gBAAa,MAAM;;AAEpB,SAAO;GACN,KAAK;GACL;GACA;;CAEF,MAAM,MAAM,IAAI,gBAAgB,YAAY;AAC5C,cAAa,MAAM;CACnB,MAAM,eAAe;AACpB,eAAa,gBAAgB,MAAM;AACnC,eAAa,MAAM;AACnB,MAAI,gBAAgB,IAAI;;AAEzB,QAAO;EACN;EACA;EACA;;;;;;;;;;;;;AAaF,SAAS,mBAAmB,aAAa,WAAW;AACnD,KAAI,YAAY,eAAe,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AACjF,KAAI,CAAC,iBAAiB,UAAU,CAAE,OAAM,IAAI,MAAM,wBAAwB,YAAY;AACtF,QAAO,YAAY,gBAAgB,UAAU;;;;;;;;;;;;;;AAc9C,SAAS,eAAe,OAAO;CAC9B,MAAM,cAAc,MAAM,QAAQ,KAAK,IAAI,IAAI;AAC/C,QAAO,GAAG,MAAM,SAAS,YAAY,YAAY;;;;;;;;;;;;;AAalD,SAAS,iBAAiB,WAAW;AACpC,KAAI,CAAC,qBAAqB,CAAE,QAAO;AACnC,QAAO,YAAY,gBAAgB,UAAU;;;;;;;;;;;;;;;;;;;;AAoB9C,SAAS,8BAA8B,aAAa,aAAa,UAAU;CAC1E,MAAM,eAAe,SAAS,YAAY,WAAW;CACrD,MAAM,UAAU,EAAE,QAAQ,aAAa;AACvC,aAAY,iBAAiB,cAAc,QAAQ,QAAQ;AAC3D,aAAY,iBAAiB,eAAe,QAAQ,QAAQ;AAC5D,aAAY,iBAAiB,eAAe,QAAQ,QAAQ;;;;;;;;;;;;;;;;;;;;;AAqB7D,SAAS,uBAAuB,aAAa,QAAQ;AACpD,KAAI,OAAO,QAAS,QAAO,QAAQ,SAAS;AAC5C,KAAI,YAAY,eAAe,SAAU,QAAO,QAAQ,SAAS;AACjE,QAAO,IAAI,SAAS,YAAY;EAC/B,MAAM,aAAa,SAAS;EAC5B,MAAM,UAAU;GACf,MAAM;GACN;GACA;AACD,cAAY,iBAAiB,cAAc,MAAM,QAAQ;AACzD,cAAY,iBAAiB,eAAe,MAAM,QAAQ;AAC1D,cAAY,iBAAiB,eAAe,MAAM,QAAQ;AAC1D,SAAO,iBAAiB,SAAS,MAAM,EAAE,MAAM,MAAM,CAAC;GACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFH,SAASC,cAAY,cAAc,aAAa,UAAU,kBAAkB,kBAAkB,aAAa;AAC1G,KAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAU,QAAO;CACvD,MAAM,SAAS,CAAC,kBAAkB,iBAAiB,CAAC,QAAQ,MAAM,MAAM,KAAK,EAAE;AAC/E,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,IAAI;AACJ,MAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,WAAW,MAAM,SAAS,KAAK;AACrC,MAAI,SAAS,UAAU,OAAQ,QAAO;EACtC,MAAM,EAAE,aAAa,UAAU,aAAa,SAAS;AACrD,MAAI,CAAC,YAAa,QAAO;EACzB,MAAM,QAAQ,cAAc,cAAc,YAAY;AACtD,MAAI,CAAC,SAAS,CAAC,gBAAgB,MAAM,CAAE,QAAO;AAC9C,MAAI,CAAC,sBAAsB,MAAM,UAAU,SAAS,CAAE,QAAO;AAC7D,MAAI,MAAM,SAAS,SAAS,GAAG;GAC9B,MAAM,QAAQ,MAAM,SAAS,MAAM,SAAS,SAAS,GAAG;AACxD,OAAI,iBAAiB,KAAK,KAAK,QAAQ,aAAc,gBAAe;;;AAGtE,KAAI,iBAAiB,KAAK,MAAM,eAAe,KAAK,aAAc,QAAO;AACzE,QAAO;;AAER,SAAS,iBAAiB,EAAE,OAAO,WAAW;CAC7C,MAAM,WAAW,OAAO,MAAM;CAC9B,MAAM,oBAAoB,aAAa;EACtC,MAAM,cAAc,QAAQ,YAAY,KAAK;AAC7C,MAAI,CAAC,aAAa;AACjB,YAAS,IAAI,MAAM;AACnB;;AAED,WAAS,IAAI,YAAY,eAAe,OAAO;EAC/C,MAAM,aAAa,IAAI,iBAAiB;AACxC,gCAA8B,aAAa,WAAW,SAAS,OAAO;AACrE,YAAS,IAAI,OAAO,OAAO;IAC1B;AACF,eAAa,WAAW,OAAO;GAC9B;CACF,MAAM,qBAAqB,eAAeA,cAAY,MAAM,aAAa,KAAK,EAAE,QAAQ,YAAY,KAAK,EAAE,SAAS,KAAK,EAAE,QAAQ,iBAAiB,KAAK,EAAE,QAAQ,iBAAiB,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC,CAAC;CACpN,MAAM,UAAU,qBAAqB;EACpC,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,aAAa,EAAE,aAAa;IAC3B,MAAM,cAAc,QAAQ,YAAY,KAAK;IAC7C,MAAM,aAAa,IAAI,iBAAiB;IACxC,MAAM,qBAAqB,YAAY;AACtC,WAAM,0BAA0B,YAAY,eAAe,WAAW,OAAO;AAC7E,SAAI,WAAW,OAAO,QAAS;KAC/B,MAAM,cAAc,kBAAkB,YAAY,cAAc;AAChE,SAAI,cAAc,EAAG,aAAY,WAAW;AAC5C,iBAAY,aAAa;;AAE1B,wBAAoB,CAAC,OAAO,QAAQ,QAAQ,MAAM,+BAA+B,IAAI,CAAC;AACtF,iBAAa,WAAW,OAAO;MAC7B;GACH;EACD,CAAC;AACF,cAAa;AACZ,qBAAmB;AACnB,UAAQ,SAAS;;;AAGnB,MAAM,cAAc,eAAe;CAClC,WAAW,CAAC,gBAAgB,cAAc;CAC1C,aAAa;EACZ;EACA;EACA;EACA;CACD,OAAO;CACP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACxJF,SAAS,eAAe,UAAU;AACjC,QAAO,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,SAAS;;;;;;;;;;;;;;;;;;;AAmBzC,SAAS,cAAc,cAAc,OAAO,QAAQ,UAAU;CAC7D,MAAM,WAAW,eAAe,SAAS,IAAI;AAC7C,QAAO,SAAS,IAAI,YAAY,WAAW;;;;;;;;;;;;;;;;;;;;AAoB5C,SAAS,gBAAgB,UAAU,aAAa,UAAU;AACzD,KAAI,gBAAgB,EAAG,QAAO;AAC9B,QAAO,YAAY,IAAI,eAAe,SAAS,IAAI;;;;;;;;;;;;;;;;;;;;;;;AC7CpD,MAAM,2BAA2B;CAChC,cAAc;CACd,cAAc;CACd,eAAe;CACf,UAAU;CACV,aAAa;CACb;;;;;;;;;;;;;;;;;;;;;AAqBD,SAAS,gBAAgB,OAAO,YAAY,UAAU,SAAS,0BAA0B;CACxF,MAAM,sBAAsB,MAAM,eAAe;AACjD,KAAI,WAAW,OAAO,SAAU,QAAO;EACtC,GAAG;EACH,cAAc;EACd;AACD,KAAI,aAAa,OAAO,YAAa,QAAO;EAC3C,GAAG;EACH,cAAc;EACd;CACD,MAAM,YAAY,MAAM,WAAW;CACnC,MAAM,SAAS,aAAa;AAC5B,QAAO;EACN,cAAc,cAAc,MAAM,cAAc,WAAW,QAAQ,OAAO,aAAa;EACvF,iBAAiB,MAAM,kBAAkB;EACzC,cAAc,cAAc,MAAM,cAAc,WAAW,QAAQ,OAAO,aAAa;EACvF,iBAAiB,MAAM,kBAAkB;EACzC,cAAc;EACd;;;;;;;;;;;;;;;;;;;;;AAqBF,SAAS,qBAAqB,OAAO,iBAAiB,SAAS,0BAA0B;AACxF,KAAI,CAAC,SAAS,MAAM,eAAe,OAAO,cAAe,QAAO;CAChE,MAAM,eAAe,gBAAgB,MAAM,cAAc,MAAM,iBAAiB,OAAO,aAAa;CACpG,MAAM,eAAe,gBAAgB,MAAM,cAAc,MAAM,iBAAiB,OAAO,aAAa;AACpG,QAAO,KAAK,IAAI,cAAc,aAAa;;;;;ACzF5C,MAAM,yBAAyB,KAAK;;;;;;;;;;AAUpC,IAAI,wBAAwB,MAAM;CACjC;CACA;CACA,YAAY,gBAAgB,EAAE,eAAe,2BAA2B,EAAE,EAAE;AAC3E,QAAKC,iBAAkB;AACvB,OAAK,eAAe;;CAErB,QAAQ,OAAO,iBAAiB;EAC/B,IAAI;EACJ,MAAM,SAAS,MAAKA,eAAgB,WAAW;AAC/C,MAAI;AACH,UAAO,MAAM;IACZ,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,QAAI,MAAM;AACT,SAAI,QAAS,OAAM;AACnB;;AAED,cAAU,UAAU,OAAO,SAAS,MAAM,GAAG;AAC7C,QAAI,QAAQ,UAAU,KAAK,cAAc;AACxC,WAAM;AACN,eAAU,KAAK;;;YAGR;AACT,UAAO,aAAa;;;;AAIvB,SAAS,OAAO,GAAG,GAAG;CACrB,MAAM,SAAS,IAAI,WAAW,EAAE,SAAS,EAAE,OAAO;AAClD,QAAO,IAAI,EAAE;AACb,QAAO,IAAI,GAAG,EAAE,OAAO;AACvB,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACPR,eAAe,gBAAgB,aAAa,SAAS;CACpD,MAAM,UAAU,IAAI,QAAQ,SAAS,QAAQ;AAC7C,KAAI,YAAY,WAAW;EAC1B,MAAM,EAAE,OAAO,QAAQ,YAAY;AACnC,UAAQ,IAAI,SAAS,SAAS,MAAM,GAAG,MAAM;;CAE9C,MAAM,UAAU,IAAI,QAAQ,YAAY,KAAK;EAC5C,QAAQ;EACR;EACA,GAAG;EACH,CAAC;AACF,QAAO,MAAM,QAAQ;;;;;;;;;;;;;;;AAetB,SAAS,gBAAgB,UAAU;AAClC,QAAO,SAAS,MAAM;;AAEvB,eAAe,YAAY,aAAa,SAAS;CAChD,MAAM,EAAE,cAAc,GAAG,iBAAiB,WAAW,EAAE;CACvD,MAAM,WAAW,MAAM,gBAAgB,aAAa,aAAa;AACjE,KAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,uBAAuB;AAC3D,QAAO,IAAI,sBAAsB,SAAS,MAAM,GAAG,iBAAiB,KAAK,IAAI,CAAC,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;;;;;;;;;;;;;;;;;AAiBtG,SAAS,mBAAmB,SAAS,UAAU;CAC9C,IAAI,QAAQ;AACZ,QAAO,OAAO,aAAa,YAAY;EACtC,MAAM,EAAE,cAAc,GAAG,iBAAiB,WAAW,EAAE;EACvD,MAAM,WAAW,MAAM,gBAAgB,aAAa,aAAa;AACjE,MAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,uBAAuB;EAC3D,MAAM,OAAO,SAAS;AACtB,SAAO,EAAE,CAAC,OAAO,gBAAgB,mBAAmB;GACnD,IAAI,aAAa,YAAY,KAAK;AAClC,cAAW,MAAM,SAAS,IAAI,sBAAsB,MAAM,GAAG,iBAAiB,KAAK,IAAI,CAAC,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE;IAChH,MAAM,UAAU,YAAY,KAAK,GAAG;AACpC,YAAQ,gBAAgB,OAAO,SAAS,MAAM,WAAW;AACzD,aAAS,MAAM;AACf,UAAM;AACN,iBAAa,YAAY,KAAK;;KAE7B;;;;;;;;;AClGL,MAAM,6BAA6B,EAAE,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BtD,SAAS,8BAA8B,UAAU,aAAa,SAAS,4BAA4B;AAClG,KAAI,SAAS,WAAW,EAAG,QAAO;CAClC,MAAM,iBAAiB,SAAS,QAAQ,QAAQ,IAAI,YAAY,YAAY;AAC5E,KAAI,eAAe,WAAW,EAAG,QAAO;CACxC,MAAM,kBAAkB,eAAe,SAAS,OAAO;AACvD,KAAI,mBAAmB,EAAG,QAAO;AACjC,KAAI,mBAAmB,eAAe,OAAQ,QAAO;AACrD,QAAO,eAAe,iBAAiB;;;;;;;;;;;;;ACxBxC,SAAS,YAAY,UAAU,QAAQ;AACtC,QAAO,IAAI,SAAS,SAAS,WAAW;AACvC,MAAI,SAAS,KAAK,CAAC,UAAU,QAAQ;AACpC,YAAS;AACT;;AAED,MAAI,SAAS,KAAK,CAAC,UAAU,aAAa;AACzC,UAAO,IAAI,aAAa,WAAW,aAAa,CAAC;AACjD;;AAED,MAAI,OAAO,SAAS;AACnB,UAAO,OAAO,OAAO;AACrB;;EAED,IAAI;EACJ,MAAM,WAAW,OAAO;AACvB,WAAQ;AACR,UAAO,oBAAoB,SAAS,QAAQ;AAC5C,OAAI;;EAEL,MAAM,gBAAgB,cAAc,OAAO,OAAO,OAAO,CAAC;AAC1D,SAAO,aAAa;GACnB,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC7B,OAAI,UAAU,OAAQ,SAAQ,QAAQ;YAC7B,UAAU,YAAa,eAAc,OAAO,IAAI,aAAa,WAAW,aAAa,CAAC,CAAC;IAC/F;AACF,SAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;GACxD;;;;;;;;AAQH,SAAS,aAAa,IAAI,EAAE,YAAY,YAAY,YAAY,qBAAqB;AACpF,QAAO,IAAI,KAAK,OAAO,eAAe;AACrC,MAAI,WAAW,QAAS;AACxB,MAAI,GAAG,SAAS,UAAU;AACzB,qBAAkB,KAAK,GAAG;AAC1B,SAAM,YAAY,kBAAkB,UAAU,WAAW;AACzD;;AAED,MAAI,GAAG,SAAS,eAAe;AAC9B,cAAW;IACV,GAAG,YAAY;IACf,qBAAqB,GAAG,KAAK;IAC7B,CAAC;AACF,OAAI;IACH,MAAM,OAAO,MAAM,WAAW,IAAI;KACjC,QAAQ;KACR,cAAc;KACd,CAAC;AACF,QAAI,CAAC,WAAW,SAAS;AACxB,uBAAkB,KAAK;MACtB,MAAM;MACN;MACA,MAAM,GAAG;MACT,CAAC;AACF,WAAM,YAAY,kBAAkB,UAAU,WAAW;;aAEjD;AACT,eAAW;KACV,GAAG,YAAY;KACf,qBAAqB;KACrB,CAAC;;AAEH;;AAED,aAAW;GACV,GAAG,YAAY;GACf,mBAAmB,GAAG,KAAK;GAC3B,CAAC;AACF,MAAI;GACH,MAAM,SAAS,MAAM,WAAW,IAAI,EAAE,QAAQ,YAAY,CAAC;AAC3D,OAAI,CAAC,WAAW,SAAS;AACxB,sBAAkB,KAAK;KACtB,MAAM;KACN,MAAM;KACN,MAAM,GAAG;KACT,CAAC;AACF,UAAM,YAAY,kBAAkB,UAAU,WAAW;;YAEjD;AACT,cAAW;IACV,GAAG,YAAY;IACf,mBAAmB;IACnB,CAAC;;GAEF;;;;;;;;;;;;;;;;;;;;;AAqBH,SAAS,yBAAyB,mBAAmB,YAAY,SAAS,EAAE,EAAE;CAC7E,MAAM,sBAAsB;EAC3B,GAAG;EACH,GAAG,OAAO;EACV;CACD,MAAM,mBAAmB;EACxB,GAAG;EACH,GAAG,OAAO;EACV;CACD,MAAM,uBAAuB,gBAAgB;EAC5C,MAAM,cAAc,IAAI,IAAI,KAAK,kBAAkB,SAAS,CAAC,QAAQ,SAAS,QAAQ,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,MAAM,EAAE,GAAG,CAAC;AACzH,SAAO,YAAY,QAAQ,MAAM,YAAY,IAAI,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiBxD,MAAM,aAAa,YAAY;EAC9B,MAAM,EAAE,OAAO,UAAU;EACzB,MAAM,WAAW,KAAK,kBAAkB,SAAS,CAAC;EAClD,MAAM,mBAAmB,oBAAoB,MAAM,SAAS;EAC5D,MAAM,cAAc,OAAO,SAAS;EACpC,MAAM,QAAQ,EAAE;AAChB,MAAI,OAAO;GACV,MAAM,oBAAoB,2BAA2B,kBAAkB,aAAa,oBAAoB;AACxG,OAAI,oBAAoB,SAAU,OAAM,KAAK;IAC5C,MAAM;IACN,OAAO;IACP,KAAK;IACL,CAAC;GACF,MAAM,eAAe,8BAA8B,kBAAkB,aAAa,iBAAiB;AACnG,OAAI,eAAe,EAAG,OAAM,KAAK;IAChC,MAAM;IACN,OAAO;IACP,KAAK;IACL,CAAC;;AAEH,MAAI,SAAS,gBAAgB,MAAM,GAAI,OAAM,KAAK;GACjD,MAAM;GACN,MAAM,EAAE,SAAS,MAAM,IAAI;GAC3B,KAAK,MAAM,eAAe;GAC1B,GAAG,MAAM,eAAe,cAAc,KAAK,KAAK,EAAE,WAAW,MAAM,eAAe,WAAW;GAC7F,CAAC;AACF,MAAI,OAAO;GACV,MAAM,iBAAiB,kBAAkB,MAAM,UAAU,kBAAkB,aAAa,oBAAoB,CAAC,QAAQ,QAAQ;IAC5H,MAAM,WAAW,SAAS,SAAS,MAAM,MAAM,KAAK,IAAI,EAAE,YAAY,IAAI,UAAU,GAAG,qBAAqB;AAC5G,QAAI,UAAU,QAAS,QAAO;AAC9B,QAAI,CAAC,UAAU,kBAAkB,CAAC,MAAM,UAAW,QAAO;AAC1D,WAAO,MAAM,YAAY,SAAS;KACjC;AACF,QAAK,MAAM,WAAW,eAAgB,OAAM,KAAK;IAChD,MAAM;IACN,MAAM;KACL,IAAI,QAAQ;KACZ,WAAW,QAAQ;KACnB,UAAU,QAAQ;KAClB,SAAS,MAAM;KACf,gBAAgB,MAAM;KACtB;IACD,KAAK,QAAQ;IACb,GAAG,QAAQ,cAAc,KAAK,KAAK,EAAE,WAAW,QAAQ,WAAW;IACnE,CAAC;;AAEH,SAAO;;CAER,MAAM,eAAe,OAAO,EAAE,YAAY,YAAY,aAAa;AAClE,QAAM,SAAS,OAAO;AACrB,UAAO,SAAS,aAAa,IAAI;IAChC;IACA;IACA;IACA;IACA,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,MAAM;AACvB,QAAI,aAAa,SAAS,EAAE,SAAS,aAAc;AACnD,YAAQ,MAAM,uCAAuC,EAAE;AACvD,WAAO,cAAc;KACpB;IACD;;AAEH,QAAO,mBAAmB;EACzB,cAAc,IAAI,cAAc;EAChC,SAAS;EACT,SAAS;GACR,qBAAqB;GACrB,mBAAmB;GACnB;EACD,QAAQ;GACP,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,QAAQ;IACjC,MAAM,WAAW,UAAU,IAAI;AAC/B,QAAI,SAAS,WAAW,EAAG;AAC3B,QAAI,WAAW,UAAU;AACzB,gBAAY,UAAU,IAAI;MACxB,EAAE;GACL,SAAS;IACR,WAAW;IACX,IAAI,EAAE,OAAO,KAAK,QAAQ;KACzB,MAAM,EAAE,SAAS,WAAW;KAC5B,MAAM,WAAW,UAAU,IAAI;AAC/B,SAAI,QAAQ,sBAAsB,QAAQ,SAAS,MAAM,MAAM,EAAE,SAAS,oBAAoB,EAAE,KAAK,OAAO,QAAQ,kBAAkB,IAAI,QAAQ,wBAAwB,QAAQ,SAAS,MAAM,MAAM,EAAE,SAAS,iBAAiB,EAAE,KAAK,YAAY,QAAQ,oBAAoB,EAAE;AACnR,aAAO,cAAc;AACrB,kBAAY,SAAS,QAAQ,MAAM,EAAE,EAAE,SAAS,oBAAoB,EAAE,KAAK,OAAO,QAAQ,sBAAsB,EAAE,EAAE,SAAS,iBAAiB,EAAE,KAAK,YAAY,QAAQ,qBAAqB,EAAE,IAAI;YAC9L;AACN,aAAO,UAAU;AACjB,UAAI,QAAQ,sBAAsB,QAAQ,QAAQ,wBAAwB,QAAQ,SAAS,MAAM,MAAM,EAAE,SAAS,iBAAiB,EAAE,KAAK,YAAY,QAAQ,oBAAoB,CAAE,mBAAkB,KAAK,EAAE,MAAM,UAAU,CAAC;AAC9N,kBAAY,UAAU,IAAI;;OAEzB;IACH;GACD;EACD,CAAC;;;;;;;;;;;;;;;AC3OH,eAAe,cAAc,cAAc,MAAM,QAAQ;AACxD,KAAI,gBAAgB,YAAa,OAAM,YAAY,cAAc,KAAK;KACjE,KAAI;AACR,aAAW,MAAM,SAAS,MAAM;AAC/B,OAAI,QAAQ,QAAS,OAAM,OAAO,UAAU,IAAI,aAAa,WAAW,aAAa;AACrF,SAAM,YAAY,cAAc,MAAM;;UAE/B,GAAG;AACX,MAAI,aAAa,gBAAgB,EAAE,SAAS,gBAAgB,CAAC,aAAa,SAAU,KAAI;AACvF,gBAAa,OAAO;UACb;AACR,QAAM;;;AAGR,eAAe,YAAY,cAAc,MAAM;AAC9C,KAAI,aAAa,SAAU,OAAM,IAAI,SAAS,YAAY;EACzD,MAAM,oBAAoB;AACzB,gBAAa,oBAAoB,aAAa,YAAY;AAC1D,YAAS;;AAEV,eAAa,iBAAiB,aAAa,YAAY;GACtD;AACF,QAAO,IAAI,SAAS,SAAS,WAAW;EACvC,MAAM,oBAAoB;AACzB,YAAS;AACT,YAAS;;EAEV,MAAM,WAAW,UAAU;AAC1B,YAAS;AACT,0BAAuB,IAAI,MAAM,8BAA8B,MAAM,OAAO,CAAC;;EAE9E,MAAM,gBAAgB;AACrB,gBAAa,oBAAoB,aAAa,YAAY;AAC1D,gBAAa,oBAAoB,SAAS,QAAQ;;AAEnD,eAAa,iBAAiB,aAAa,YAAY;AACvD,eAAa,iBAAiB,SAAS,QAAQ;AAC/C,MAAI;AACH,gBAAa,aAAa,KAAK;WACvB,OAAO;AACf,YAAS;AACT,UAAO,MAAM;;GAEb;;;;;;;;;;;;;;;;;;;;;;;;AClCH,eAAe,YAAY,cAAc,OAAO,KAAK;AACpD,KAAI,aAAa,SAAU,OAAM,IAAI,SAAS,YAAY;EACzD,MAAM,oBAAoB;AACzB,gBAAa,oBAAoB,aAAa,YAAY;AAC1D,YAAS;;AAEV,eAAa,iBAAiB,aAAa,YAAY;GACtD;AACF,QAAO,IAAI,SAAS,SAAS,WAAW;EACvC,MAAM,oBAAoB;AACzB,YAAS;AACT,YAAS;;EAEV,MAAM,WAAW,UAAU;AAC1B,YAAS;AACT,0BAAuB,IAAI,MAAM,8BAA8B,MAAM,OAAO,CAAC;;EAE9E,MAAM,gBAAgB;AACrB,gBAAa,oBAAoB,aAAa,YAAY;AAC1D,gBAAa,oBAAoB,SAAS,QAAQ;;AAEnD,eAAa,iBAAiB,aAAa,YAAY;AACvD,eAAa,iBAAiB,SAAS,QAAQ;AAC/C,MAAI;AACH,gBAAa,OAAO,OAAO,IAAI;WACvB,OAAO;AACf,YAAS;AACT,UAAO,MAAM;;GAEb;;;;;AC3CH,SAAS,iBAAiB,UAAU;CACnC,MAAM,SAAS,EAAE;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAK,QAAO,KAAK;EACrD,OAAO,SAAS,MAAM,EAAE;EACxB,KAAK,SAAS,IAAI,EAAE;EACpB,CAAC;AACF,QAAO;;AAER,SAAS,eAAe,SAAS,EAAE,YAAY,gBAAgB;AAC9D,QAAO,IAAI,KAAK,OAAO,eAAe;EACrC,MAAM,MAAM,YAAY;AACxB,MAAI,WAAW,QAAS,QAAO;AAC/B,QAAM,cAAc,cAAc,QAAQ,KAAK;AAC/C,SAAO;GACN,GAAG;GACH,aAAa,QAAQ,KAAK;GAC1B;GACA;;AAEH,SAAS,kBAAkB,SAAS,EAAE,YAAY,cAAc,cAAc;AAC7E,QAAO,IAAI,KAAK,OAAO,eAAe;EACrC,MAAM,MAAM,YAAY;AACxB,MAAI,WAAW,QAAS,QAAO;EAC/B,MAAM,EAAE,SAAS;EACjB,MAAM,WAAW,IAAI,SAAS,QAAQ,MAAM,KAAK,IAAI,EAAE,YAAY,KAAK,UAAU,IAAI,qBAAqB;AAC3G,MAAI,EAAE,QAAQ,gBAAgB,aAAc,YAAW;GACtD,GAAG;GACH,UAAU,CAAC,GAAG,UAAU;IACvB,IAAI,KAAK;IACT,WAAW,KAAK;IAChB,UAAU,KAAK;IACf,SAAS,KAAK;IACd,GAAG,KAAK,mBAAmB,KAAK,KAAK,EAAE,gBAAgB,KAAK,gBAAgB;IAC5E,SAAS;IACT,CAAC;GACF,gBAAgB,IAAI;GACpB,CAAC;AACF,QAAM,cAAc,cAAc,QAAQ,MAAM,WAAW;AAC3D,SAAO;GACN,GAAG;GACH,UAAU,CAAC,GAAG,UAAU;IACvB,IAAI,KAAK;IACT,WAAW,KAAK;IAChB,UAAU,KAAK;IACf,SAAS,KAAK;IACd,GAAG,KAAK,mBAAmB,KAAK,KAAK,EAAE,gBAAgB,KAAK,gBAAgB;IAC5E,CAAC;GACF,gBAAgB,iBAAiB,aAAa,SAAS;GACvD;GACA;;AAEH,SAAS,WAAW,SAAS,EAAE,YAAY,gBAAgB;AAC1D,QAAO,IAAI,KAAK,OAAO,eAAe;EACrC,MAAM,MAAM,YAAY;AACxB,MAAI,WAAW,QAAS,QAAO;AAC/B,QAAM,YAAY,cAAc,QAAQ,OAAO,QAAQ,IAAI;EAC3D,MAAM,iBAAiB,iBAAiB,aAAa,SAAS;EAC9D,MAAM,WAAW,IAAI,SAAS,QAAQ,MAAM;GAC3C,MAAM,WAAW,EAAE,YAAY,EAAE,WAAW;AAC5C,UAAO,eAAe,MAAM,MAAM,YAAY,EAAE,SAAS,WAAW,EAAE,IAAI;IACzE;AACF,SAAO;GACN,GAAG;GACH,UAAU;GACV;GACA;GACA;;AAEH,MAAM,uBAAuB;CAC5B,eAAe;CACf,kBAAkB;CAClB,QAAQ;CACR;AACD,SAAS,cAAc,SAAS,SAAS;CACxC,MAAM,UAAU,qBAAqB,QAAQ;AAC7C,QAAO,QAAQ,SAAS,QAAQ;;AAEjC,SAAS,wBAAwB,cAAc,gBAAgB;CAC9D,MAAM,eAAe,MAAM;AAC1B,MAAI,EAAE,aAAa,SAAS,EAAE,SAAS,cAAe,SAAQ,MAAM,kCAAkC,EAAE;;CAEzG,MAAM,aAAa,KAAK,EAAE,YAAY,YAAY,YAAY,aAAa;AAC1E,aAAW,WAAW;EACtB,MAAM,OAAO,cAAc,KAAK;GAC/B;GACA;GACA;GACA,CAAC;AACF,SAAO,SAAS,KAAK,CAAC,KAAK,YAAY,YAAY;;AAEpD,QAAO,mBAAmB;EACzB,cAAc,IAAI,cAAc;EAChC,SAAS;EACT,SAAS;GACR,UAAU,EAAE;GACZ,gBAAgB,EAAE;GAClB,aAAa,KAAK;GAClB,GAAG;GACH;EACD,QAAQ;GACP,MAAM,EAAE,IAAI;IACX,eAAe;IACf,kBAAkB;IAClB,QAAQ;IACR,QAAQ,KAAK,EAAE,YAAY,YAAY,YAAY,aAAa;KAC/D,MAAM,EAAE,aAAa;AACrB,SAAI,SAAS,WAAW,EAAG;AAC3B,gBAAW,WAAW;AACtB,cAAS,SAAS,QAAQ;MACzB,MAAM,OAAO,cAAc,KAAK;OAC/B;OACA;OACA;OACA,CAAC;AACF,aAAO,SAAS,KAAK,CAAC,KAAK,YAAY,YAAY;OAClD;;IAEH,EAAE;GACH,UAAU;IACT,WAAW;IACX,IAAI,EAAE,SAAS,GAAG,EAAE,aAAa;AAChC,YAAO,UAAU;OACf;IACH;GACD;EACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3DH,SAAS,kBAAkB,EAAE,OAAO,SAAS,UAAU;CACtD,MAAM,EAAE,MAAM,aAAa,UAAU,WAAW,OAAO,eAAe,eAAe;CACrF,MAAM,qBAAqB,eAAe;AACzC,MAAI,CAAC,QAAQ,YAAY,KAAK,CAAE,QAAO;AACvC,SAAO,UAAU,iBAAiB;GACjC,cAAc,MAAM,aAAa,KAAK;IACrC,cAAc,MAAM,aAAa,KAAK;GACvC,EAAE,KAAK,CAAC,GAAG,iBAAiB;GAC5B;AACF,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,gBAAgB,EAAE,aAAa;IAC9B,MAAM,cAAc,wBAAwB,mBAAmB,QAAQ,YAAY,KAAK,EAAE,eAAe,iBAAiB;KACzH,cAAc,MAAM,aAAa,KAAK;MACrC,cAAc,MAAM,aAAa,KAAK;KACvC,EAAE,KAAK,CAAC,CAAC,CAAC;IACX,MAAM,gBAAgB,yBAAyB,aAAa,OAAO;KAClE;KACA;KACA,CAAC;AACF,YAAQ,UAAU,IAAI,YAAY;AAClC,YAAQ,WAAW,IAAI,cAAc;AACrC,iBAAa;AACZ,mBAAc,SAAS;AACvB,iBAAY,SAAS;AACrB,aAAQ,WAAW,IAAI,KAAK,EAAE;AAC9B,aAAQ,UAAU,IAAI,KAAK,EAAE;;MAE5B;GACH;EACD,CAAC;;;;;;;;;AASH,MAAM,yBAAyB,eAAe;CAC7C,WAAW;EACV;EACA;EACA;EACA;CACD,aAAa;EACZ;EACA;EACA;EACA;CACD,QAAQ,EAAE,OAAO,SAAS,SAAS,EAAE,OAAO;EAC3C,MAAM,eAAe,mBAAmB,MAAM,eAAe,KAAK,IAAI;GACrE,cAAc;GACd,iBAAiB;GACjB,cAAc;GACd,iBAAiB;GACjB,cAAc;GACd,GAAG,SAAS,MAAM,eAAe,IAAI,KAAK,CAAC;AAC5C,SAAO,kBAAkB;GACxB;GACA;GACA,QAAQ;IACP,GAAG;IACH,OAAO;IACP,GAAG;IACH;GACD,CAAC;;CAEH,CAAC;;;;;;;;;AASF,MAAM,yBAAyB,eAAe;CAC7C,WAAW,CAAC,gBAAgB,uBAAuB;CACnD,aAAa;EACZ;EACA;EACA;EACA;CACD,QAAQ,EAAE,OAAO,SAAS,SAAS,EAAE,OAAO,kBAAkB;EAC7D;EACA;EACA,QAAQ;GACP,GAAG;GACH,OAAO;GACP,GAAG;GACH;EACD,CAAC;CACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3HF,SAASC,cAAY,cAAc,cAAc;AAChD,KAAI,CAAC,gBAAgB,CAAC,uBAAuB,aAAa,CAAE,QAAO;AACnE,QAAO;;AAER,SAAS,sBAAsB,EAAE,OAAO,WAAW;CAClD,MAAM,qBAAqB,eAAeA,cAAY,MAAM,aAAa,KAAK,EAAE,QAAQ,aAAa,KAAK,CAAC,CAAC;AAC5G,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,wBAAwB,EAAE,aAAa;IACtC,MAAM,eAAe,QAAQ,aAAa,KAAK;IAC/C,MAAM,aAAa,IAAI,iBAAiB;IACxC,MAAM,cAAc,kBAAkB,EAAE,eAAe,MAAM,CAAC;IAC9D,MAAM,EAAE,WAAW,kBAAkB,aAAa,aAAa;IAC/D,MAAM,kBAAkB,YAAY;AACnC,WAAM,uBAAuB,aAAa,WAAW,OAAO;AAC5D,SAAI,WAAW,OAAO,QAAS;AAC/B,SAAI,YAAY,eAAe,QAAQ;AACtC,cAAQ,KAAK,mDAAmD,YAAY,WAAW,wFAAwF;AAC/K;;AAED,aAAQ,YAAY,IAAI,YAAY;;AAErC,qBAAiB,CAAC,OAAO,QAAQ,QAAQ,MAAM,qDAAqD,IAAI,CAAC;AACzG,iBAAa;AACZ,gBAAW,OAAO;AAClB,aAAQ;AACR,aAAQ,YAAY,IAAI,KAAK,EAAE;;MAE9B;GACH;EACD,CAAC;;AAEH,MAAM,mBAAmB,eAAe;CACvC,WAAW,CAAC,eAAe;CAC3B,aAAa,CAAC,gBAAgB,cAAc;CAC5C,OAAO;CACP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCF,SAASC,cAAY,cAAc,cAAc;AAChD,KAAI,CAAC,gBAAgB,CAAC,aAAc,QAAO;AAC3C,QAAO,gBAAgB,cAAc,OAAO,CAAC,SAAS,IAAI,gBAAgB;;AAE3E,SAAS,oBAAoB,EAAE,OAAO,SAAS,UAAU;CACxD,MAAM,EAAE,2BAA2B,mCAAmC,sCAAsC;CAC5G,MAAM,qBAAqB,eAAeA,cAAY,MAAM,aAAa,KAAK,EAAE,QAAQ,aAAa,KAAK,CAAC,CAAC;AAC5G,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,eAAe;IACd,aAAa;KACZ,MAAM,eAAe,QAAQ,aAAa,KAAK;AAC/C,+BAA0B,cAAc,gBAAgB,MAAM,aAAa,KAAK,EAAE,OAAO,CAAC;AAC1F,wBAAmB,aAAa,YAAY,MAAM,oBAAoB,KAAK,CAAC;KAC5E,IAAI,mBAAmB;KACvB,MAAM,kBAAkB,iBAAiB;AACxC,yBAAmB;QACjB,EAAE;KACL,MAAM,iBAAiB;AACtB,UAAI,kBAAkB;AACrB,0BAAmB,aAAa,YAAY,MAAM,oBAAoB,KAAK,CAAC;AAC5E;;MAED,MAAM,SAAS,kCAAkC,aAAa,EAAE,MAAM,KAAK;AAC3E,UAAI,WAAW,MAAM,oBAAoB,KAAK,CAAE;AAChD,YAAM,oBAAoB,IAAI,OAAO;;KAEtC,MAAM,WAAW,OAAO,aAAa,YAAY,UAAU,SAAS;AACpE,kBAAa;AACZ,gBAAU;AACV,mBAAa,gBAAgB;AAC7B,wCAAkC,aAAa;AAC/C,WAAK,QAAQ,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;;;IAGxD,eAAe;AACd,wBAAmB,KAAK,QAAQ,aAAa,CAAC,YAAY,MAAM,oBAAoB,KAAK,CAAC;;IAE3F;GACD;EACD,CAAC;;AAEH,MAAM,iBAAiB,eAAe;CACrC,WAAW,CAAC,gBAAgB,sBAAsB;CAClD,aAAa,CAAC,gBAAgB,kBAAkB;CAChD,OAAO;CACP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5CF,SAASC,cAAY,cAAc,aAAa;AAC/C,QAAO,qBAAqB,cAAc,YAAY,GAAG,sBAAsB;;AAEhF,SAAS,+BAA+B,EAAE,OAAO,WAAW;CAC3D,MAAM,qBAAqB,eAAeA,cAAY,MAAM,aAAa,KAAK,EAAE,QAAQ,YAAY,KAAK,CAAC,CAAC;AAC3G,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,qBAAqB,EAAE,aAAa;IACnC,MAAM,eAAe,MAAM,aAAa,KAAK;IAC7C,MAAM,cAAc,QAAQ,YAAY,KAAK;AAC7C,QAAI,CAAC,OAAO,MAAM,YAAY,SAAS,CAAE;IACzC,MAAM,aAAa,IAAI,iBAAiB;IACxC,MAAM,iBAAiB,YAAY;AAClC,WAAM,uBAAuB,aAAa,WAAW,OAAO;AAC5D,SAAI,WAAW,OAAO,QAAS;AAC/B,SAAI,YAAY,eAAe,OAAQ;AACvC,WAAM,0BAA0B,YAAY,eAAe,WAAW,OAAO;AAC7E,SAAI,WAAW,OAAO,QAAS;AAC/B,SAAI,YAAY,eAAe,OAAQ;KACvC,MAAM,iBAAiB,kBAAkB,YAAY,cAAc;AACnE,iBAAY,WAAW,iBAAiB,aAAa,WAAW,iBAAiB,aAAa;;AAE/F,oBAAgB;AAChB,iBAAa,WAAW,OAAO;MAC7B;GACH;EACD,CAAC;;AAEH,MAAM,4BAA4B,eAAe;CAChD,WAAW,CAAC,eAAe;CAC3B,aAAa,CAAC,cAAc;CAC5B,OAAO;CACP,CAAC;;;;;;;;AChFF,MAAM,yBAAyB;CAC9B,cAAc;CACd,eAAe;CACf;;;;;;;;;;;;;;;;;;;;;;;;AAwBD,SAAS,cAAc,QAAQ,kBAAkB,OAAO,EAAE,EAAE;AAC3D,KAAI,OAAO,WAAW,EAAG;CACzB,MAAM,eAAe,KAAK,gBAAgB,uBAAuB;CACjE,MAAM,gBAAgB,KAAK,iBAAiB,uBAAuB;CACnE,MAAM,EAAE,iBAAiB;CACzB,MAAM,eAAe,OAAO,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,UAAU;CAC7E,IAAI;AACJ,MAAK,MAAM,SAAS,aAAc,KAAI,oBAAoB,MAAM,YAAY,cAC3E;MAAI,CAAC,UAAU,MAAM,YAAY,OAAO,aAAa,MAAM,cAAc,OAAO,aAAa,oBAAoB,OAAO,OAAO,CAAE,UAAS;;CAE3I,MAAM,UAAU,UAAU,aAAa;AACvC,KAAI,CAAC,QAAS,QAAO,KAAK;AAC1B,KAAI,CAAC,aAAc,QAAO;AAC1B,KAAI,QAAQ,YAAY,aAAa,UAAW,QAAO;AACvD,KAAI,QAAQ,aAAa,aAAa,YAAY,cAAe,QAAO;AACxE,QAAO;;;;;;;;;;;;;;;;;AAiBR,SAAS,oBAAoB,QAAQ;AACpC,KAAI,OAAO,WAAW,EAAG,QAAO,KAAK;AACrC,QAAO,OAAO,QAAQ,KAAK,MAAM,EAAE,YAAY,IAAI,YAAY,IAAI,IAAI;;;;;;;;;;AAUxE,SAAS,oBAAoB,QAAQ,QAAQ;AAC5C,SAAQ,OAAO,SAAS,MAAM,OAAO,UAAU,MAAM,OAAO,SAAS,MAAM,OAAO,UAAU;;;;;ACtE7F,SAAS,sBAAsB,EAAE,OAAO,UAAU;CACjD,MAAM,eAAe,OAAO,SAAS,gBAAgB,uBAAuB;CAC5E,MAAM,gBAAgB,OAAO,SAAS,iBAAiB,uBAAuB;CAC9E,MAAM,mBAAmB,OAAO,oBAAoB;CACpD,MAAM,kBAAkB;EACvB,GAAG;EACH,GAAG,OAAO;EACV;CACD,MAAM,EAAE,cAAc,kBAAkB,WAAW,kBAAkB;CACrE,MAAM,qBAAqB,eAAe,uBAAuB,MAAM,aAAa,KAAK,CAAC,GAAG,0BAA0B,0BAA0B;AACjJ,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,2BAA2B,EAAE;GAC7B,yBAAyB;IACxB,mBAAmB,MAAM,cAAc,IAAI,KAAK,EAAE;IAClD,SAAS,OAAO;KACf,MAAM,eAAe,KAAK,MAAM,aAAa;AAC7C,SAAI,CAAC,aAAc;KACnB,MAAM,YAAY,UAAU,aAAa;KACzC,MAAM,CAAC,iBAAiB;AACxB,SAAI,CAAC,cAAe;KACpB,MAAM,aAAa,MAAM,kBAAkB,KAAK;KAChD,MAAM,WAAW,aAAa,UAAU,QAAQ,UAAU;AACzD,WAAK,MAAM,OAAO,YAAY;OAC7B,MAAM,cAAc,WAAW;AAC/B,WAAI,gBAAgB,KAAK,KAAK,MAAM,SAAS,YAAa,QAAO;;AAElE,aAAO;OACN,GAAG;KACL,MAAM,aAAa,SAAS,SAAS,IAAI,WAAW;AACpD,SAAI,CAAC,WAAW,OAAQ;KACxB,MAAM,aAAa,MAAM,cAAc,KAAK;AAC5C,SAAI,WAAW,WAAW,GAAG;AAC5B,UAAI,WAAW,GAAG,OAAO,WAAY,OAAM,cAAc,IAAI,WAAW,GAAG,GAAG;AAC9E;;KAED,MAAM,YAAY,qBAAqB,MAAM,eAAe,KAAK,EAAE,kBAAkB,gBAAgB;AACrG,SAAI,CAAC,cAAc,OAAO,QAAQ;MACjC,MAAM,KAAK,OAAO,OAAO,cAAc,OAAO;AAC9C,UAAI,IAAI;AACP,aAAM,cAAc,IAAI,GAAG;AAC3B;;;KAGF,MAAM,UAAU,cAAc,YAAY,WAAW;MACpD;MACA;MACA,cAAc,WAAW,MAAM,MAAM,EAAE,OAAO,WAAW;MACzD,CAAC,IAAI,oBAAoB,WAAW;AACrC,SAAI,QAAQ,OAAO,WAAY,OAAM,cAAc,IAAI,QAAQ,GAAG;MACjE;IACF;GACD;EACD,CAAC;;;;;;;;;;;AAWH,MAAM,qBAAqB,eAAe;CACzC,WAAW;EACV;EACA;EACA;EACA;EACA;CACD,aAAa,EAAE;CACf,QAAQ,EAAE,OAAO,aAAa,sBAAsB;EACnD;EACA,QAAQ;GACP,GAAG;GACH,cAAc;GACd,kBAAkB;GAClB,YAAY,iBAAiB,gBAAgB,cAAc,QAAQ;GACnE,eAAe;GACf;EACD,CAAC;CACF,CAAC;;;;AC1FF,SAAS,kBAAkB,OAAO;AACjC,QAAO,UAAU,UAAU,UAAU,cAAc,UAAU;;;;;;;AAO9D,MAAM,kBAAkB;;;;;;AAMxB,SAAS,kBAAkB,SAAS,iBAAiB,iBAAiB;AACrE,SAAQ,WAAW,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACyBxC,SAAS,YAAY,cAAc,SAAS,eAAe,gBAAgB;AAC1E,KAAI,CAAC,cAAc,IAAK,QAAO;AAC/B,KAAI,uBAAuB,aAAa,CAAE,QAAO;AACjD,QAAO,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,SAAS,eAAe,GAAG,cAAc;;AAEvF,SAAS,yBAAyB,EAAE,OAAO,UAAU;CACpD,MAAM,EAAE,sBAAsB;CAC9B,MAAM,iBAAiB,OAAO,kBAAkB;CAChD,MAAM,qBAAqB,eAAe,YAAY,MAAM,aAAa,KAAK,EAAE,MAAM,QAAQ,KAAK,EAAE,MAAM,cAAc,KAAK,EAAE,eAAe,CAAC;AAChJ,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,uBAAuB,EAAE;GACzB,MAAM,EAAE;GACR,WAAW,EAAE,aAAa;IACzB,MAAM,eAAe,MAAM,aAAa,KAAK;IAC7C,MAAM,KAAK,IAAI,iBAAiB;AAChC,oBAAgB,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC,MAAM,aAAa,gBAAgB,SAAS,CAAC,CAAC,MAAM,SAAS;KACjH,MAAM,SAAS,kBAAkB,MAAM,aAAa;AACpD,WAAM,aAAa,IAAI,OAAO;MAC7B,CAAC,OAAO,UAAU;AACnB,SAAI,iBAAiB,SAAS,MAAM,SAAS,aAAc;AAC3D,aAAQ,MAAM,sDAAsD,MAAM;MACzE;AACF,WAAO;MACL;GACH,UAAU,EAAE;GACZ;EACD,CAAC;;AAEH,MAAM,sBAAsB,eAAe;CAC1C,WAAW;EACV;EACA;EACA;EACA;CACD,aAAa,EAAE;CACf,OAAO;CACP,CAAC;;;;;;;;;;;;;;ACnEF,SAAS,mBAAmB,MAAM,YAAY;CAC7C,MAAM,QAAQ,KAAK,MAAM,QAAQ;CACjC,MAAM,UAAU,WAAW;CAC3B,MAAM,WAAW,EAAE;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI,kBAAkB;CACtB,IAAI;CACJ,IAAI,cAAc;CAClB,IAAI,eAAe;CACnB,IAAI;AACJ,MAAK,MAAM,QAAQ,OAAO;EACzB,MAAM,UAAU,KAAK,MAAM;AAC3B,MAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,IAAI,CAAC,QAAQ,WAAW,OAAO,CAAE;AACxE,MAAI,YAAY,aAAa,QAAQ,WAAW,kBAAkB,IAAI,QAAQ,WAAW,yBAAyB,IAAI,QAAQ,WAAW,wBAAwB,IAAI,QAAQ,WAAW,8BAA8B,CAAE;EACxN,MAAM,WAAW,SAAS,SAAS,YAAY;AAC/C,MAAI,UAAU;GACb,MAAM,MAAM,SAAS,IAAI,MAAM;AAC/B,OAAI,KAAK;AACR,qBAAiB,WAAW,KAAK,QAAQ;IACzC,MAAM,eAAe,SAAS,IAAI,YAAY;AAC9C,QAAI,aAAc,wBAAuB,eAAe,cAAc,EAAE,IAAI,KAAK;;AAElF;;AAED,MAAI,QAAQ,WAAW,WAAW,EAAE;AACnC,qBAAkB,oBAAoB,QAAQ,MAAM,EAAE,CAAC;AACvD;;AAED,MAAI,QAAQ,WAAW,oBAAoB,EAAE;AAC5C,sBAAmB,eAAe,QAAQ,MAAM,GAAG,EAAE,qBAAqB,IAAI,KAAK;AACnF;;AAED,MAAI,YAAY,iBAAkB;AAClC,MAAI,CAAC,QAAQ,WAAW,IAAI,IAAI,kBAAkB,GAAG;GACpD,MAAM,UAAU;IACf,IAAI,WAAW;IACf,KAAK,WAAW,SAAS,QAAQ;IACjC,UAAU;IACV,WAAW;IACX;AACD,OAAI,kBAAkB;AACrB,YAAQ,YAAY;AACpB,2BAAuB,iBAAiB,MAAM;SACxC,wBAAuB,KAAK;AACnC,YAAS,KAAK,QAAQ;AACtB,kBAAe;AACf;AACA,qBAAkB;AAClB,sBAAmB,KAAK;;;CAG1B,MAAM,gBAAgB;CACtB,MAAM,iBAAiB,WAAW,SAAS,UAAU,CAAC,iBAAiB,KAAK,IAAI,iBAAiB;EAChG,KAAK;EACL,GAAG,uBAAuB,EAAE,WAAW,sBAAsB,GAAG,EAAE;EAClE,GAAG,EAAE,KAAK,IAAI;AACf,QAAO;EACN,GAAG;EACH,WAAW;EACX,UAAU;EACV;EACA;EACA;;;;;AClEF,SAAS,qBAAqB,EAAE,OAAO,QAAQ,EAAE,aAAa,wBAAwB;CACrF,MAAM,SAAS,IAAI,kBAAkB;CACrC,MAAM,qBAAqB,eAAe,uBAAuB,MAAM,aAAa,KAAK,CAAC,GAAG,0BAA0B,0BAA0B;AACjJ,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,2BAA2B,EAAE;GAC7B,yBAAyB;IACxB,mBAAmB,OAAO,UAAU;IACpC,SAAS,OAAO;KACf,MAAM,eAAe,KAAK,MAAM,aAAa;KAC7C,MAAM,UAAU,MAAM,aAAa,KAAK;AACxC,SAAI,CAAC,gBAAgB,CAAC,QAAS;KAC/B,MAAM,QAAQ,mBAAmB,cAAc,QAAQ;AACvD,SAAI,CAAC,SAAS,gBAAgB,MAAM,CAAE;AACtC,YAAO,SAAS,IAAI,KAAK,OAAO,WAAW;MAC1C,MAAM,aAAa,mBAAmB,MAAM,gBAAgB,MAAM,gBAAgB,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM;AAC7G,aAAO,MAAM,eAAe,YAAY,uBAAuB,QAAQ,GAAG,0BAA0B,SAAS,WAAW,GAAG,QAAQ;QACjI,EAAE,IAAI,MAAM,IAAI,CAAC,CAAC;MACpB;IACF;GACD;EACD,CAAC;;AAEH,MAAM,gCAAgC;CACrC,GAAG;CACH,qBAAqB,cAAc,YAAY,UAAU,cAAc,SAAS,QAAQ;CACxF;AACD,MAAM,gCAAgC;CACrC,GAAG;CACH,qBAAqB,cAAc,YAAY,UAAU,cAAc,SAAS,QAAQ;CACxF;AACD,MAAM,+BAA+B;CACpC,GAAG;CACH,qBAAqB,cAAc,YAAY,UAAU,cAAc,QAAQ,QAAQ;CACvF;;;;;;AAMD,MAAM,oBAAoB,eAAe;CACxC,WAAW,CAAC,gBAAgB,uBAAuB;CACnD,aAAa,EAAE;CACf,QAAQ,EAAE,OAAO,SAAS,EAAE,OAAO,qBAAqB;EACvD;EACA,QAAQ;GACP,GAAG;GACH,GAAG;GACH;EACD,CAAC;CACF,CAAC;;;;;AAKF,MAAM,oBAAoB,eAAe;CACxC,WAAW,CAAC,gBAAgB,uBAAuB;CACnD,aAAa,EAAE;CACf,QAAQ,EAAE,OAAO,SAAS,EAAE,OAAO,qBAAqB;EACvD;EACA,QAAQ;GACP,GAAG;GACH,GAAG;GACH;EACD,CAAC;CACF,CAAC;;;;;AAKF,MAAM,mBAAmB,eAAe;CACvC,WAAW,CAAC,gBAAgB,sBAAsB;CAClD,aAAa,EAAE;CACf,QAAQ,EAAE,OAAO,SAAS,EAAE,OAAO,qBAAqB;EACvD;EACA,QAAQ;GACP,GAAG;GACH,GAAG;GACH;EACD,CAAC;CACF,CAAC;;;;;;;;;;;;;AClFF,SAAS,iBAAiB,cAAc,MAAM;AAC7C,QAAO,aAAa,eAAe,MAAM,QAAQ,IAAI,SAAS,KAAK,EAAE,cAAc,IAAI,OAAO,IAAI;;;;;;;;;;;;;;AAcnG,SAAS,cAAc,cAAc,QAAQ;CAC5C,MAAM,UAAU,aAAa,eAAe,MAAM,QAAQ,IAAI,SAAS,OAAO;AAC9E,KAAI,CAAC,SAAS,gBAAgB,IAAI,OAAO,OAAQ,QAAO,KAAK;CAC7D,MAAM,SAAS,QAAQ,cAAc,GAAG;CACxC,MAAM,kBAAkB,QAAQ,sBAAsB,SAAS,OAAO,QAAQ,UAAU,CAAC,MAAM,OAAO;AACtG,KAAI,gBAAgB,WAAW,EAAG,QAAO,KAAK;CAC9C,MAAM,EAAE,2BAA2B,qBAAqB,UAAU,UAAU,EAAE;AAC9E,KAAI,2BAA2B;EAC9B,MAAM,gBAAgB,gBAAgB,MAAM,UAAU,MAAM,aAAa,0BAA0B;AACnG,MAAI,cAAe,QAAO,cAAc;;AAEzC,KAAI,oBAAoB;EACvB,MAAM,eAAe,gBAAgB,MAAM,UAAU,MAAM,YAAY,KAAK;AAC5E,MAAI,aAAc,QAAO,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLxC,SAAS,oBAAoB,EAAE,OAAO,QAAQ,EAAE,aAAa,QAAQ,kBAAkB;CACtF,MAAM,qBAAqB,eAAe,uBAAuB,MAAM,aAAa,KAAK,CAAC,GAAG,0BAA0B,0BAA0B;AACjJ,QAAO,qBAAqB;EAC3B,SAAS;EACT,eAAe,mBAAmB,KAAK;EACvC,QAAQ;GACP,2BAA2B,EAAE;GAC7B,yBAAyB,EAAE,aAAa;AACvC,QAAI,CAAC,MAAM,aAAa,KAAK,EAAE;KAC9B,MAAM,KAAK,OAAO,MAAM,aAAa,KAAK,EAAE,aAAa;AACzD,SAAI,GAAI,OAAM,aAAa,IAAI,GAAG;;AAEnC,iBAAa,MAAM,aAAa,IAAI,KAAK,EAAE;MACzC;GACH;EACD,CAAC;;;AAGH,MAAM,sBAAsB,iBAAiB,iBAAiB,cAAc,QAAQ;AACpF,MAAM,+BAA+B;CACpC,GAAG;CACH,QAAQ;CACR;;AAED,MAAM,sBAAsB,iBAAiB,iBAAiB,cAAc,QAAQ;AACpF,MAAM,+BAA+B;CACpC,GAAG;CACH,QAAQ;CACR;AACD,MAAM,8BAA8B;CACnC,GAAG;CACH,QAAQ;CACR;AACD,eAAe;CACd,WAAW,CAAC,gBAAgB,uBAAuB;CACnD,aAAa,EAAE;CACf,QAAQ,EAAE,OAAO,aAAa,oBAAoB;EACjD;EACA,QAAQ;GACP,GAAG;GACH,QAAQ,QAAQ,UAAU,6BAA6B;GACvD,cAAc;GACd;EACD,CAAC;CACF,CAAC;;;;;;;;;;;;;;;AAeF,MAAM,mBAAmB,eAAe;CACvC,WAAW,CAAC,gBAAgB,uBAAuB;CACnD,aAAa,EAAE;CACf,QAAQ,EAAE,OAAO,aAAa,oBAAoB;EACjD;EACA,QAAQ;GACP,GAAG;GACH,QAAQ,QAAQ,UAAU,6BAA6B;GACvD,cAAc;GACd;EACD,CAAC;CACF,CAAC;;;;;;;;;;;;;AAaF,MAAM,kBAAkB,eAAe;CACtC,WAAW,CAAC,gBAAgB,sBAAsB;CAClD,aAAa,EAAE;CACf,QAAQ,EAAE,OAAO,aAAa,oBAAoB;EACjD;EACA,QAAQ;GACP,GAAG;GACH,QAAQ,QAAQ,UAAU,4BAA4B;GACtD,cAAc;GACd;EACD,CAAC;CACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACtGF,SAAS,iBAAiB,EAAE,OAAO,SAAS,UAAU;CACrD,MAAM,iBAAiB,QAAQ,kBAAkB;CACjD,MAAM,kBAAkB,eAAe,MAAM,aAAa,KAAK,EAAE,IAAI;CACrE,MAAM,cAAc,aAAa;AAChC,kBAAgB,KAAK;EACrB,MAAM,eAAe,QAAQ,aAAa,KAAK;EAC/C,MAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,MAAI,YAAY,KAAK,KAAK,CAAC,kBAAkB,QAAQ,CAAE;EACvD,MAAM,SAAS,gBAAgB,kBAAkB,aAAa,QAAQ,GAAG,aAAa,UAAU,YAAY,KAAK,IAAI,iBAAiB,KAAK;AAC3I,MAAI,WAAW,KAAK,KAAK,WAAW,QAAS;AAC7C,QAAM,QAAQ,IAAI,OAAO;GACxB;CACF,MAAM,eAAe,aAAa;EACjC,MAAM,OAAO,MAAM,QAAQ,KAAK;EAChC,MAAM,eAAe,QAAQ,aAAa,KAAK;AAC/C,MAAI,CAAC,aAAc;AACnB,MAAI,CAAC,kBAAkB,KAAK,CAAE;AAC9B,MAAI,aAAa,YAAY,KAAM;AACnC,eAAa,UAAU;GACtB;AACF,cAAa;AACZ,eAAa;AACb,gBAAc;;;AAGhB,MAAM,cAAc,eAAe;CAClC,WAAW,CAAC,WAAW,eAAe;CACtC,aAAa,CAAC,eAAe;CAC7B,OAAO;CACP,CAAC;;;;;;;;;AC3BF,MAAM,eAAe,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BvC,SAAS,sBAAsB,SAAS,EAAE,EAAE;CAC3C,MAAM,cAAc;EACnB,GAAG;EACH,yBAAyB,OAAO,2BAA2B;EAC3D,iBAAiB,OAAO,mBAAmB;EAC3C,mBAAmB,OAAO,qBAAqB;EAC/C,2BAA2B,OAAO,6BAA6B;EAC/D,mCAAmC,OAAO,qCAAqC;EAC/E,mCAAmC,OAAO,qCAAqC;EAC/E;AACD,QAAO,kBAAkB;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE;EACF,QAAQ;EACR,cAAc,EAAE,gBAAgB;GAC/B,cAAc;GACd,iBAAiB;GACjB,cAAc;GACd,iBAAiB;GACjB,cAAc;GACd,EAAE;EACH,CAAC;;;;;AC9FH,MAAM,6BAA6B;CAClC,KAAK;CACL,SAAS;CACT;;;;;;;;;;;;;;;;;;;AAmBD,SAAS,oBAAoB,WAAW;CACvC,MAAM,2BAA2B,UAAU;EAC1C;EACA;EACA;EACA,WAAW,2BAA2B;;EAEtC,qBAAqB;EACrB,YAAY,GAAG,MAAM;AACpB,SAAM,GAAG,KAAK;GACd,MAAM,EAAE,WAAW,OAAO,MAAM,EAAE;AAClC,SAAKC,SAAU;AACf,SAAKC,SAAU,MAAKC,cAAe;;EAEpC,IAAI,SAAS;AACZ,UAAO,MAAKD;;EAEb,OAAO,cAAc;AACpB,SAAM,SAAS,aAAa;AAC5B,SAAKE,QAAS,QAAQ,aAAa,IAAI,aAAa;;EAErD,SAAS;AACR,SAAKC,mBAAoB;AACzB,SAAKD,QAAS,QAAQ,aAAa,IAAI,KAAK,EAAE;AAC9C,SAAM,UAAU;;EAEjB,UAAU;AACT,SAAKC,mBAAoB;AACzB,SAAKH,OAAQ,SAAS;;EAEvB,IAAI,UAAU;AACb,UAAO,MAAKI;;EAEb,IAAI,QAAQ,OAAO;AAClB,SAAKA,UAAW;AAChB,OAAI,MAAO,OAAKF,QAAS,MAAM,QAAQ,IAAI,MAAM;;EAElD,IAAI,MAAM;AACT,UAAO,MAAKA,QAAS,MAAM,aAAa,KAAK,EAAE,OAAO;;EAEvD,IAAI,IAAI,OAAO;GACd,MAAM,mBAAmB,MAAKA,QAAS,QAAQ,aAAa,KAAK;AACjE,SAAKC,mBAAoB;AACzB,SAAKH,OAAQ,SAAS;AACtB,SAAKA,SAAU,MAAKC,cAAe;AACnC,OAAI,MAAKG,QAAU,OAAKF,QAAS,MAAM,QAAQ,IAAI,MAAKE,QAAS;AACjE,OAAI,iBAAkB,OAAKF,QAAS,QAAQ,aAAa,IAAI,iBAAiB;AAC9E,OAAI,MAAO,OAAKA,QAAS,MAAM,aAAa,IAAI,EAAE,KAAK,OAAO,CAAC;;EAEhE,OAAO;GACN,MAAM,eAAe,MAAKA,QAAS,QAAQ,aAAa,KAAK;AAC7D,OAAI,CAAC,aAAc,QAAO,QAAQ,uBAAuB,IAAI,MAAM,mDAAmD,CAAC;AACvH,SAAKA,QAAS,MAAM,cAAc,IAAI,KAAK;AAC3C,UAAO,aAAa,MAAM,CAAC,OAAO,QAAQ;AACzC,QAAI,KAAK,IAAK,QAAO,IAAI,SAAS,SAAS,WAAW;KACrD,MAAM,iBAAiB;AACtB,YAAKG,oBAAqB;AAC1B,mBAAa,MAAM,CAAC,KAAK,SAAS,OAAO;;AAE1C,WAAKA,oBAAqB;AAC1B,kBAAa,iBAAiB,aAAa,UAAU,EAAE,MAAM,MAAM,CAAC;MACnE;AACF,UAAM;KACL;;EAEH,gBAAgB;AACf,UAAO,sBAAsB;IAC5B,GAAG,MAAKN;IACR,iBAAiB,YAAY;AAC5B,WAAKG,UAAW;;IAEjB,CAAC;;EAEH,qBAAqB;AACpB,OAAI,CAAC,MAAKG,kBAAoB;AAC9B,SAAKH,QAAS,QAAQ,aAAa,KAAK,EAAE,oBAAoB,aAAa,MAAKG,kBAAmB;AACnG,SAAKA,oBAAqB;;;AAG5B,QAAO;;;AAGR,IAAI,wBAAwB,cAAc,oBAAoB,MAAM,GAAG,CAAC;;;;ACvGxE,IAAI,iBAAiB,cAAc,oBAAoB,qBAAqB,CAAC;;;;ACC7E,IAAa,iBAAb,cAAoC,iBAAiB,mBAAmB,SAAS,eAAe,CAAC,CAAC;;;;ACDlG,IAAa,wBAAb,cAA2C,eAAe;;iBAC9B;;;AAG5B,WAAW,sBAAsB"}
|