@vkontakte/videoplayer-core 2.0.163-dev.2ed41cd75.0 → 2.0.163-dev.3ec5a1ede.0
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/es2015.cjs +6 -6
- package/es2015.esm.js +15 -15
- package/esnext.cjs +6 -6
- package/esnext.esm.js +6 -6
- package/evergreen.esm.js +6 -6
- package/package.json +2 -2
- package/types/providers/DashProvider/lib/player.d.ts +1 -1
- package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +3 -3
- package/types/providers/HlsProvider/manifestDataExtractor.d.ts +6 -1
package/es2015.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @vkontakte/videoplayer-core v2.0.163-dev.
|
|
3
|
-
*
|
|
2
|
+
* @vkontakte/videoplayer-core v2.0.163-dev.3ec5a1ede.0
|
|
3
|
+
* Tue, 09 Jun 2026 14:53:13 GMT
|
|
4
4
|
* https://st.mycdn.me/static/vkontakte-videoplayer/2-0-163/doc/
|
|
5
5
|
*/
|
|
6
|
-
const e=[`url`],t=[`url`],n=[`downloadingItems`],r=[`container`];var i=require(`@oxc-project/runtime/helpers/defineProperty`),a=require(`@oxc-project/runtime/helpers/asyncToGenerator`),o=require(`@oxc-project/runtime/helpers/objectSpread2`),s=require(`@oxc-project/runtime/helpers/awaitAsyncGenerator`),c=require(`@oxc-project/runtime/helpers/wrapAsyncGenerator`),l=require(`@oxc-project/runtime/helpers/objectWithoutProperties`),u=Object.defineProperty,d=Object.getOwnPropertyNames,f=Object.getOwnPropertyDescriptor,p=Object.prototype.hasOwnProperty;function m(e){return this[e]}var h=e=>{var t=(g??=new WeakMap).get(e),n;if(t)return t;if(t=u({},`__esModule`,{value:!0}),e&&typeof e==`object`||typeof e==`function`)for(var r of d(e))p.call(t,r)||u(t,r,{get:m.bind(e,r),enumerable:!(n=f(e,r))||n.enumerable});return g.set(e,t),t},g,_=e=>e;function v(e,t){this[e]=_.bind(null,t)}var y=(e,t)=>{for(var n in t)u(e,n,{get:t[n],enumerable:!0,configurable:!0,set:v.bind(t,n)})},b={};y(b,{isMobile:()=>we,clientChecker:()=>j,areValidLiveRecordSources:()=>Je,WebmCodecStrategy:()=>yr,VideoQuality:()=>Au.VideoQuality,VideoFormat:()=>C,VideoCodecName:()=>w,ValueSubject:()=>Au.ValueSubject,VERSION:()=>x,Surface:()=>ee,Subscription:()=>Au.Subscription,Subject:()=>Au.Subject,SDK_VERSION:()=>ju,PredefinedQualityLimits:()=>te,Player:()=>ku,PlaybackState:()=>S,Observable:()=>Au.Observable,HttpConnectionType:()=>E,ChromecastState:()=>T}),module.exports=h(b);var x=`2.0.163-dev.2ed41cd75.0`,S;(e=>{e.STOPPED=`stopped`,e.READY=`ready`,e.PLAYING=`playing`,e.PAUSED=`paused`})(S||={});var C;(e=>{e.MPEG=`MPEG`,e.DASH=`DASH`,e.DASH_SEP=`DASH_SEP`,e.DASH_SEP_VK=`DASH_SEP`,e.DASH_WEBM=`DASH_WEBM`,e.DASH_WEBM_AV1=`DASH_WEBM_AV1`,e.DASH_STREAMS=`DASH_STREAMS`,e.DASH_WEBM_VK=`DASH_WEBM`,e.DASH_ONDEMAND=`DASH_ONDEMAND`,e.DASH_ONDEMAND_VK=`DASH_ONDEMAND`,e.DASH_LIVE=`DASH_LIVE`,e.DASH_LIVE_CMAF=`DASH_LIVE_CMAF`,e.DASH_LIVE_WEBM=`DASH_LIVE_WEBM`,e.HLS=`HLS`,e.HLS_ONDEMAND=`HLS_ONDEMAND`,e.HLS_JS=`HLS`,e.HLS_FMP4=`HLS_FMP4`,e.HLS_LIVE=`HLS_LIVE`,e.HLS_LIVE_CMAF=`HLS_LIVE_CMAF`,e.WEB_RTC_LIVE=`WEB_RTC_LIVE`})(C||={});var w;(e=>{e.AV1=`av1`,e.VP9=`vp9`,e.AVC1=`avc1`,e.HEV1=`hev1`})(w||={});var T;(e=>{e.NOT_AVAILABLE=`NOT_AVAILABLE`,e.AVAILABLE=`AVAILABLE`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`})(T||={});var E;(e=>{e.HTTP1=`http1`,e.HTTP2=`http2`,e.QUIC=`quic`})(E||={});var ee;(e=>{e.NONE=`none`,e.INLINE=`inline`,e.FULLSCREEN=`fullscreen`,e.SECOND_SCREEN=`second_screen`,e.PIP=`pip`,e.INVISIBLE=`invisible`})(ee||={});var te;(e=>{e.TRAFFIC_SAVING=`traffic_saving`,e.HIGH_QUALITY=`high_quality`,e.UNKNOWN=`unknown`})(te||={});var ne=require(`@vkontakte/videoplayer-shared`),re=require(`@vkontakte/videoplayer-shared`),ie=require(`@vkontakte/videoplayer-shared`),D=require(`@vkontakte/videoplayer-shared`),ae=e=>new Promise((t,n)=>{let r=document.createElement(`script`);r.setAttribute(`src`,e),r.onload=()=>t(),r.onerror=e=>n(e),document.body.appendChild(r)});class oe{constructor(e){i(this,`connection$`,new D.ValueSubject(void 0)),i(this,`castState$`,new D.ValueSubject(`NOT_AVAILABLE`)),i(this,`errorEvent$`,new D.Subject),i(this,`contentId`,void 0),i(this,`realCastState$`,new D.ValueSubject(`NOT_AVAILABLE`)),i(this,`subscription`,new D.Subscription),i(this,`log`,void 0),i(this,`params`,void 0),i(this,`isDestroyed`,!1),this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`ChromecastInitializer`);let t=`chrome`in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;let n=D.isNonNullable(window.chrome?.cast),r=!!window.__onGCastApiAvailable;n?this.initializeCastApi():(window.__onGCastApiAvailable=e=>{delete window.__onGCastApiAvailable,e&&!this.isDestroyed&&this.initializeCastApi()},r||ae(`https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1`).catch(()=>this.errorEvent$.next({id:`ChromecastLoading`,category:D.ErrorCategory.NETWORK,message:`Script loading failed!`})))}connect(){cast.framework.CastContext.getInstance()?.requestSession()}disconnect(){var e;(e=cast.framework.CastContext.getInstance())==null||(e=e.getCurrentSession())==null||e.endSession(!0)}stopMedia(){return new Promise((e,t)=>{var n;(n=cast.framework.CastContext.getInstance())==null||(n=n.getCurrentSession())==null||(n=n.getMediaSession())==null||n.stop(new chrome.cast.media.StopRequest,e,t)})}toggleConnection(){D.isNonNullable(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();D.isNullable(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();D.isNullable(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.isDestroyed=!0,this.subscription.unsubscribe()}initListeners(){let e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),n=cast.framework.CastContext.getInstance();this.subscription.add(D.fromEvent(n,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(e=>{switch(e.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:var t;this.contentId=(t=n.getCurrentSession())==null||(t=t.getMediaSession())==null||(t=t.media)==null?void 0:t.contentId;break;case cast.framework.SessionState.NO_SESSION:case cast.framework.SessionState.SESSION_ENDING:case cast.framework.SessionState.SESSION_ENDED:case cast.framework.SessionState.SESSION_START_FAILED:this.contentId=void 0;break;default:return D.assertNever(e.sessionState)}})).add(D.merge(D.fromEvent(n,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(D.tap(e=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(e)}`})}),D.map(e=>e.castState)),D.observableFrom([n.getCastState()])).pipe(D.filterChanged(),D.map(se),D.tap(e=>{this.log({message:`realCastState$: ${e}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let i=r===`CONNECTED`,a=D.isNonNullable(this.connection$.getValue());if(i&&!a){var o;let r=n.getCurrentSession();D.assertNonNullable(r);let i=r.getCastDevice(),a=(o=r.getMediaSession())==null||(o=o.media)==null?void 0:o.contentId;(D.isNullable(a)||a===this.contentId)&&(this.log({message:`connection created`}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:r,castDevice:i}))}else !i&&a&&(this.log({message:`connection destroyed`}),this.connection$.next(void 0));this.castState$.next(r===`CONNECTED`?D.isNonNullable(this.connection$.getValue())?`CONNECTED`:`AVAILABLE`:r)}))}initializeCastApi(){let e,t,n;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,n=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:n}),this.initListeners()}catch(e){this.errorEvent$.next({id:`ChromecastInitializer`,category:D.ErrorCategory.EXTERNAL_API,message:`[initializeCastApi] failed`,thrown:e})}}}var se=e=>{switch(e){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return`NOT_AVAILABLE`;case cast.framework.CastState.NOT_CONNECTED:return`AVAILABLE`;case cast.framework.CastState.CONNECTING:return`CONNECTING`;case cast.framework.CastState.CONNECTED:return`CONNECTED`;default:return D.assertNever(e)}},O=require(`@vkontakte/videoplayer-shared`),ce=require(`@vkontakte/videoplayer-shared`),le=require(`@vkontakte/videoplayer-shared`),ue=(e,t=0,n=0)=>{switch(n){case 0:return e.replace(`_offset_p`,t===0?``:`_`+t.toFixed(0));case 1:{if(t===0)return e;let n=new URL(e);return n.searchParams.append(`playback_shift`,t.toFixed(0)),n.toString()}case 2:{let n=new URL(e);return!n.searchParams.get(`offset_p`)&&t===0?e:(n.searchParams.set(`offset_p`,t.toFixed(0)),n.toString())}default:le.assertNever(n)}return e},de=(e,t)=>{switch(t){case 0:return NaN;case 1:{let t=new URL(e);return Number(t.searchParams.get(`playback_shift`))}case 2:{let t=new URL(e);return Number(t.searchParams.get(`offset_p`)??0)}default:le.assertNever(t)}},fe=e=>{let{source:t,format:n,meta:r,output:i}=e,a,o,s;switch(n){case`MPEG`:{let e=t[n];ce.assertNonNullable(e);let r=ce.getHighestQuality(Object.keys(e));ce.assertNonNullable(r);let i=e[r];ce.assertNonNullable(i),a=i,o=`video/mp4`,s=pe();break}case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:{let e=t[n];ce.assertNonNullable(e),a=e.url,o=`application/x-mpegurl`,s=pe();break}case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:{let e=t[n];ce.assertNonNullable(e),a=e.url,o=`application/dash+xml`,s=pe();break}case`DASH_LIVE_CMAF`:{let e=t[n];ce.assertNonNullable(e),a=e.url,o=`application/dash+xml`,s=me();break}case`HLS_LIVE`:case`HLS_LIVE_CMAF`:{let e=t[n];ce.assertNonNullable(e),a=ue(e.url),o=`application/x-mpegurl`,s=me();break}case`DASH_LIVE`:case`WEB_RTC_LIVE`:{let e=`Unsupported format for Chromecast`,t=Error(e);throw i.error$.next({id:`ChromecastProvider.createMediaInfo()`,category:ce.ErrorCategory.VIDEO_PIPELINE,message:e,thrown:t}),t}case`DASH`:case`DASH_LIVE_WEBM`:throw Error(`${n} is no longer supported`);default:return ce.assertNever(n)}let c=he(r.videoId??a,o);c.contentUrl=a,c.streamType=s,c.metadata=ge();let{title:l,subtitle:u}=r;return ce.isNonNullable(l)&&(c.metadata.title=l),ce.isNonNullable(u)&&(c.metadata.subtitle=u),c};function pe(){var e;return((e=chrome.cast)==null||(e=e.media)==null||(e=e.StreamType)==null?void 0:e.BUFFERED)??`BUFFERED`}function me(){var e;return((e=chrome.cast)==null||(e=e.media)==null||(e=e.StreamType)==null?void 0:e.LIVE)??`LIVE`}function he(e,t){var n;return!((n=chrome.cast)==null||(n=n.media)==null)&&n.MediaInfo?new chrome.cast.media.MediaInfo(e,t):{contentId:e,contentType:t,metadata:{title:``,subtitle:``},streamType:pe()}}function ge(){var e;return!((e=chrome.cast)==null||(e=e.media)==null)&&e.GenericMediaMetadata?new chrome.cast.media.GenericMediaMetadata:{images:[],metadataType:0,releaseDate:``,subtitle:``,title:``,releaseYear:1970,type:0}}var k=(e,t,n=!1)=>{let r=e.getTransition();(n||!r||r.to===t)&&e.setState(t)};class _e{constructor(e){i(this,`params`,void 0),i(this,`interval`,0),i(this,`startVideoPosition`,void 0),i(this,`startTs`,void 0),this.params=e}start(e=0){clearInterval(this.interval),this.startVideoPosition=e,this.startTs=Date.now(),this.interval=window.setInterval(()=>{let e=(Date.now()-this.startTs)/1e3,t=this.startVideoPosition+e;this.params.output.position$.next(t)},1e3)}pause(){clearInterval(this.interval)}destroy(){clearInterval(this.interval)}}var ve=require(`@vkontakte/videoplayer-shared`),ye=require(`@vkontakte/videoplayer-shared`),be=require(`@vkontakte/videoplayer-shared`),xe=require(`@vkontakte/videoplayer-shared`);class Se{constructor(){i(this,`_current`,void 0),i(this,`_current_version`,void 0),i(this,`_chromeVersion`,void 0),i(this,`_firefoxVersion`,void 0),i(this,`_safariVersion`,void 0),i(this,`_operaVersion`,void 0),i(this,`_edgeVersion`,void 0),i(this,`_yandexVersion`,void 0),i(this,`_isMiuiBrowser`,!1)}get current(){return this._current}get isChrome(){return this.current===`Chrome`}get isChromiumBased(){return be.arrayIncludes([`Chrome`,`Chromium`,`Opera`,`Yandex`,`Edge`,`SamsungBrowser`],this.current)}get isFirefox(){return this.current===`Firefox`}get isSafari(){return this.current===`Safari`}get isOpera(){return this.current===`Opera`}get isEdge(){return this.current===`Edge`}get isYandex(){return this.current===`Yandex`}get isSamsungBrowser(){return this.current===`SamsungBrowser`}get currentVersion(){return this._current_version}get chromeVersion(){return this._chromeVersion}get firefoxVersion(){return this._firefoxVersion}get safariVersion(){return this._safariVersion}get operaVersion(){return this._operaVersion}get edgeVersion(){return this._edgeVersion}get yandexVersion(){return this._yandexVersion}get isMiuiBrowser(){return this._isMiuiBrowser}detect(){let{userAgent:e}=navigator;try{let t=/yabrowser/i.test(e)?`Yandex`:void 0,n=/samsungbrowser/i.test(e)?`SamsungBrowser`:void 0,r=/chrome|crios/i.test(e)?`Chrome`:void 0,i=/chromium/i.test(e)?`Chromium`:void 0,a=/firefox|fxios/i.test(e)?`Firefox`:void 0,o=/webkit|safari|khtml/i.test(e)?`Safari`:void 0,s=/opr\//i.test(e)?`Opera`:void 0,c=/edg/i.test(e)?`Edge`:void 0;this._isMiuiBrowser=/(XiaoMi)|(MiuiBrowser)/i.test(e),this._current=t||n||a||s||c||r||i||o||`Rest`}catch(e){console.error(e)}this.isChrome&&this.detectChromeVersion(),this.isFirefox&&this.detectFirefoxVersion(),this.isSafari&&this.detectSafariVersion(),this.isOpera&&this.detectOperaVersion(),this.isEdge&&this.detectEdgeVersion(),this.isYandex&&this.detectYandexVersion()}detectVersion(e){try{let{userAgent:t}=xe.getWindow().navigator,n=t.match(e);if(!n)return;let r=n[1],i=parseInt(r,10);if(!isNaN(i))return this._current_version=i,i}catch(e){console.error(e)}}detectChromeVersion(){this._chromeVersion=this.detectVersion(/Chrome\/(\d+\.\d+)/)}detectFirefoxVersion(){this._firefoxVersion=this.detectVersion(/Firefox\/(\d+\.\d+)/)}detectSafariVersion(){this._safariVersion=this.detectVersion(/Version\/(\d+)/)}detectOperaVersion(){this._operaVersion=this.detectVersion(/OPR\/(\d+\.\d+)/)}detectEdgeVersion(){this._edgeVersion=this.detectVersion(/Edg\/(\d+\.\d+)/)}detectYandexVersion(){this._yandexVersion=this.detectVersion(/YaBrowser\/(\d+\.\d+\.\d+)/)}}var A=require(`@vkontakte/videoplayer-shared`),Ce=require(`@vkontakte/videoplayer-shared`),we=()=>{var e;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||((e=navigator)==null||(e=e.userAgentData)==null?void 0:e.mobile)};class Te{constructor(e){i(this,`_displayChecker`,void 0),i(this,`_isMobile`,void 0),i(this,`_current`,void 0),i(this,`_iosVersion`,void 0),i(this,`_highEntropyValues`,{}),i(this,`_os`,{name:`Unknown`,version:`Unknown`,full:`Unknown`}),i(this,`_details`,{vendor:`Unknown`,model:`Unknown`}),this._displayChecker=e}get current(){return this._current}get os(){return this._os}get details(){return this._details}get isIOS(){return this._highEntropyValues.platform===`iOS`||A.arrayIncludes(this.os.name.toLowerCase(),`ios`)||A.arrayIncludes([`iPhone`,`iPad`,`iPod`],this.current)}get isMac(){return this._highEntropyValues.platform===`macOS`||A.arrayIncludes(this.os.name.toLowerCase(),`mac`)||this.current===`Mac`}get isApple(){return this.isIOS||this.isMac}get isIphoneOrOldIpad(){if(!this.isApple||!this._displayChecker.isTouch)return!1;let e=this.current===`iPad`||this._displayChecker.width>700,t=this._iosVersion;return!e||e&&!!t&&t<16}get isAndroid(){return this._highEntropyValues.platform===`Android`||A.arrayIncludes(this.os.name.toLowerCase(),`android`)||this.current===`Android`}get isWindows(){return A.arrayIncludes(this.os.name.toLowerCase(),`windows`)}get isLinux(){return A.arrayIncludes(this.os.name.toLowerCase(),`linux`)&&!this.isAndroid}get isMobile(){return this._highEntropyValues.mobile||this._isMobile}get iOSVersion(){return this._iosVersion}detect(){let e=Ce.getWindow();if(!Ce.isBrowserWindow(e))return;let{userAgent:t}=e.navigator;try{this._isMobile=we()}catch(e){console.error(`DeviceChecker: calling isMobile error - `,e)}this.detectDevice(t),this.detectOS(t),this.detectDeviceDetails(t),this.detectHighEntropyValues(),this.isIOS&&this.detectIOSVersion()}detectHighEntropyValues(){var e=this;return a(function*(){let t=Ce.getWindow();if(!Ce.isBrowserWindow(t))return;let{userAgentData:n}=t.navigator;if(n?.getHighEntropyValues){let t=yield n.getHighEntropyValues([`architecture`,`bitness`,`brands`,`mobile`,`platform`,`formFactor`,`model`,`platformVersion`,`wow64`]);e._highEntropyValues=t,t.platform&&(e._os.name=e.normalizeOSName(t.platform),t.platformVersion&&(e._os.version=e.normalizeOSVersion(t.platformVersion),e._os.full=`${e._os.name} ${e._os.version}`)),t.model&&(e._details.model=t.model)}})()}detectDevice(e){try{let t=/android/i.test(e)?`Android`:void 0,n=/iphone/i.test(e)?`iPhone`:void 0,r=/ipad/i.test(e)?`iPad`:void 0,i=/ipod/i.test(e)?`iPod`:void 0,a=/mac/i.test(e)?`Mac`:void 0,o=/webOS|BlackBerry|IEMobile|Opera Mini/i.test(e)?`RestMobile`:void 0;this._current=t||n||r||i||o||a||`Desktop`}catch(e){console.error(`DeviceChecker: device detection error - `,e)}}detectOS(e){try{for(let[t,n]of[[/(windows nt) (6\.[23]); arm/i,[`Windows RT`]],[/(windows nt) (6\.3); arm/i,[`Windows RT 8.1`]],[/(windows (?:phone|mobile|iot))(?: os)?[/ ]?([\d.]+)/i,[`Windows Mobile`,2]],[/(windows)[/ ](xp|vista|7|8(\.1)?|10|11|2000|me)/i,[1,1]],[/windows nt ?([\d.]+)/i,[`Windows`,1]],[/(windows)[/ ](95|98|me|2000|xp|vista|7|8|8\.1|10|11)/i,[1,2]],[/(iphone os|cpu iphone os) ([\d_.]+)/i,[`iOS`,2]],[/(ipad os|cpu os) ([\d_.]+)/i,[`iPadOS`,2]],[/(ipod os|cpu ipod os) ([\d_.]+)/i,[`iOS`,2]],[/(?:ios|os) ([\d_.]+) like mac os x/i,[`iOS`,1]],[/cfnetwork\/.+darwin/i,[`iOS`]],[/(mac os x) ?([\d_.]+)/i,[`macOS`,2]],[/(macintosh|mac os)/i,[`macOS`]],[/(android) ([\d.]+)/i,[1,2]],[/(harmonyos)[/ ]?([\d.]*)/i,[`HarmonyOS`,2]],[/\b(ubuntu|debian|fedora|centos|arch|linux)(?:[-/ ]([\w.]+))?/i,[1,2]],[/(cros)\D*([\d.]+)/i,[`Chrome OS`,2]],[/(freebsd|openbsd|netbsd|dragonfly)[/ ]?([\w.]*)/i,[1,2]],[/(sunos|solaris)?([\d.]*)/i,[`Solaris`,2]],[/(aix)?([\d.]*)/i,[`AIX`,2]]]){let r=e.match(t);if(r){let t=n.length>0,i=n.length>1,a=`Unknown`,o=`Unknown`;if(t){let e=n[0];typeof e==`number`?e<r.length&&r[e]!==void 0&&(a=r[e]):a=e}if(i){let e=n[1];typeof e==`number`?e<r.length&&r[e]!==void 0&&(o=r[e]):e!==void 0&&(o=e)}else r[2]===void 0?r[1]!==void 0&&t&&typeof n[0]==`string`&&(o=r[1]):o=r[2];a=this.normalizeOSName(a),o=this.normalizeOSVersion(o,a),a===`iOS`&&/ipad/i.test(e)?a=`iPadOS`:a===`iPadOS`&&/ip(hone|od)/i.test(e)&&(a=`iOS`),this._os={name:a,version:o||`Unknown`,full:o&&o!==`Unknown`?`${a} ${o}`:a};break}}}catch(e){console.error(`DeviceChecker: OS detection error - `,e)}}normalizeOSName(e){if(!e)return`Unknown`;let t=e.toLowerCase();return A.arrayIncludes(t,`windows`)?`Windows`:A.arrayIncludes(t,`mac os`)||A.arrayIncludes(t,`macintosh`)?`macOS`:A.arrayIncludes(t,`iphone`)||A.arrayIncludes(t,`ios`)?`iOS`:A.arrayIncludes(t,`ipados`)?`iPadOS`:A.arrayIncludes(t,`android`)?`Android`:A.arrayIncludes(t,`harmonyos`)?`HarmonyOS`:A.arrayIncludes(t,`linux`)?`Linux`:A.arrayIncludes(t,`cros`)?`Chrome OS`:A.arrayIncludes(t,`freebsd`)?`FreeBSD`:A.arrayIncludes(t,`openbsd`)?`OpenBSD`:A.arrayIncludes(t,`solaris`)||A.arrayIncludes(t,`sunos`)?`Solaris`:A.arrayIncludes(t,`aix`)?`AIX`:e}normalizeOSVersion(e,t){if(!e)return`Unknown`;if(e!==`Unknown`&&(e=e.replace(/_/g,`.`),t===`Windows`)){let t=parseFloat(e);if(!isNaN(t)){if(t>=11)return`11`;if(t>=10)return`10`;if(t===6.3)return`8.1`;if(t===6.2)return`8`;if(t===6.1)return`7`;if(t===6)return`Vista`;if(t===5.1||t===5.2)return`XP`;if(t===5)return`2000`;if(t===4)return`NT 4.0`}}return e}detectDeviceDetails(e){try{for(let[t,n]of[[/(iphone)/i,[`Apple`,`iPhone`]],[/(ipad)/i,[`Apple`,`iPad`]],[/(ipod)/i,[`Apple`,`iPod`]],[/(macintosh)/i,[`Apple`,`Macintosh`]],[/(windows[\w\-_ ]*phone)/i,[`Microsoft`,0]],[/(windows nt|win64|win32|wow64)/i,[`Microsoft`,`PC`]],[/\b(sch-i[89]0\d|shw-m380s|sm-[ptxs]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i,[`Samsung`,1]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?\d+a?|galaxy nexus)/i,[`Samsung`,1]],[/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,[`Samsung`,1]],[/sec-(sgh\w+)/i,[`Samsung`,1]],[/smart-tv.+(samsung)/i,[`Samsung`,`Smart TV`]],[/(samsung).*tizen/i,[`Samsung`,`Smart TV`]],[/(pixel (?:c|tablet|[0-9a-z ]+))/i,[`Google`,1]],[/(pixelbook(?: go)?)/i,[`Google`,1]],[/nexus [0-9]/i,[`Google`,0]],[/(redmi[-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(mi[\w\-_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(poco[\w ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(hm[-_ ]?note?[\w ]*)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(?:xiao)?mi[\w\-_ ]+pad/i,[`Xiaomi`,0]],[/(?:huawei|honor) ?([-\w ]+)[;)]/i,[`Huawei`,1]],[/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i,[`Huawei`,1]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?)/i,[`Huawei`,1]],[/(?:one)?(?:plus)? ?([a\d0]\d\d\d?)(?: b|\))/i,[`OnePlus`,1]],[/droid.+; (cph2[3-6]\d[13579]|((?:gm|hd)19|(?:ac|be|in|kb)20|(?:d[en]|eb|le|mt)21|ne22)[0-2]\d)(?: bui|\))/i,[`OnePlus`,1]],[/(oneplus)[-_ ]?([-\w]*)/i,[`OnePlus`,2]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i,[`Realme`,1]],[/(realme)[-_ ]?([-\w]*)/i,[`Realme`,2]],[/; (\w+) bui.+ oppo/i,[`OPPO`,1]],[/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i,[`OPPO`,1]],[/\b(opd2(\d{3}a?))(?: bui|\))/i,[`OPPO`,1]],[/(oppo)[-_ ]?([-\w]*)/i,[`OPPO`,2]],[/; vivo (\w+)(?: bui|\))/i,[`Vivo`,1]],[/\b(v[12]\d{3}\w?[at])(?: bui|;)/i,[`Vivo`,1]],[/(vivo)[-_ ]?([-\w]*)/i,[`Vivo`,2]],[/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,[`Motorola`,1]],[/((?:moto(?! 360)[-\w() ]+|xt\d{3,4}[cgkosw+]?[-\d]*|nexus 6)(?= bui|\)))/i,[`Motorola`,1]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b/i,[`Motorola`,0]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i,[`Motorola`,0]],[/droid.+; ([a-z]?\d[0-2]{2}[a-z]{2}|[c-g]\d{4}|so[-gl]\w+|xq-[a-z]{2}\d\d)(?= bui|\))/i,[`Sony`,1]],[/sony tablet [ps]/i,[`Sony`,`Xperia Tablet`]],[/\b(?:sony)?sgp\w+(?: bui|\))/i,[`Sony`,0]],[/(sony)[-_ ]?([-\w]*)/i,[`Sony`,2]],[/\blg[-e;/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,[`LG`,1]],[/\blg-?([\d\w]+) bui/i,[`LG`,1]],[/(lm(?:-?f100[nv]?|-[\w.]+)(?= bui|\))|nexus [45])/i,[`LG`,1]],[/((?=lg)?[vl]k-?\d{3}) bui/i,[`LG`,0]],[/(lg)[-_ ]?([-\w]*)/i,[`LG`,2]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,[`Nokia`,1]],[/nokia[-_ ]?(([-\w. ]*?))(?: bui|\)|;|\/)/i,[`Nokia`,1]],[/(nokia) (t[12][01])/i,[`Nokia`,2]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i,[`ASUS`,1]],[/(?:asus[-_ ])?(zenfone[\w\-_ ]*)/i,[`ASUS`,1]],[/(rog[\w\-_ ]*)/i,[`ASUS`,1]],[/(asus)[-_ ]?([-\w]*)/i,[`ASUS`,2]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i,[`Lenovo`,1]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])(?: bui|;|\)|\/)/i,[`Lenovo`,1]],[/(thinkpad[\w\-_ ]*)/i,[`Lenovo`,0]],[/(kf[a-z]{2}[a-z]*)(?: bui|\))/i,[`Amazon`,1]],[/(alexa)webm/i,[`Amazon`,`Echo`]],[/(fire[\w\-_ ]*)/i,[`Amazon`,0]],[/(amazon)[-_ ]?([-\w]*)/i,[`Amazon`,2]],[/(?:blackberry|\(bb10;) (\w+)/i,[`BlackBerry`,1]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,[`BlackBerry`,1]],[/(playbook);[-\w),; ]+(rim)/i,[`BlackBerry`,1]],[/(microsoft); (lumia[\w ]+)/i,[`Microsoft`,2]],[/(surface duo)/i,[`Microsoft`,`Surface Duo`]],[/(surface[\w\-_ ]*)/i,[`Microsoft`,0]],[/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,[`ZTE`,2]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,[`HTC`,2]],[/(alcatel|tcl)[-_ ]?([-\w]*)/i,[1,2]],[/(meizu)[-_ ]?([-\w]*)/i,[`Meizu`,2]],[/(tecno)[-_ ]?([-\w]*)/i,[`Tecno`,2]],[/(infinix)[-_ ]?([-\w]*)/i,[`Infinix`,2]],[/(micromax)[-_ ]?([-\w]*)/i,[`Micromax`,2]],[/(lava)[-_ ]?([-\w]*)/i,[`Lava`,2]],[/(panasonic)[-_ ]?([-\w]*)/i,[`Panasonic`,2]],[/(sharp)\/?([-\w]*)/i,[`Sharp`,2]],[/(benq)[-_ ]?([-\w]*)/i,[`BenQ`,2]],[/(palm)[-_ ]?([-\w]*)/i,[`Palm`,2]],[/(vertu)[-_ ]?([-\w]*)/i,[`Vertu`,2]],[/(gionee)[-_ ]?([-\w]*)/i,[`Gionee`,2]],[/(doogee)[-_ ]?([-\w]*)/i,[`Doogee`,2]],[/(ulefone)[-_ ]?([-\w]*)/i,[`Ulefone`,2]],[/(blackview)[-_ ]?([-\w]*)/i,[`Blackview`,2]],[/(cubot)[-_ ]?([-\w]*)/i,[`Cubot`,2]],[/(umidigi)[-_ ]?([-\w]*)/i,[`UMIDIGI`,2]],[/(oukitel)[-_ ]?([-\w]*)/i,[`Oukitel`,2]],[/(fairphone)[-_ ]?([-\w]*)/i,[`Fairphone`,2]],[/(cat)[-_ ]?([-\w]*)/i,[`Cat`,2]],[/(energy)[-_ ]?([-\w]*)/i,[`Energizer`,2]],[/(land rover)[-_ ]?([-\w]*)/i,[`Land Rover`,2]],[/(shield[\w\-_ ]*)/i,[`Nvidia`,0]],[/(crkey)/i,[`Google`,`Chromecast`]],[/(roku)[\dx]*/i,[`Roku`,0]],[/(apple)[-_ ]?tv/i,[`Apple`,`TV`]],[/(amazon)[-_ ]?tv/i,[`Amazon`,`Fire TV`]],[/(google)[-_ ]?tv/i,[`Google`,`TV`]],[/(smart[\w\-_ ]*tv)/i,[0,`Smart TV`]],[/(playstation[\w\-_ ]*)/i,[`Sony`,0]],[/(nintendo[\w\-_ ]*)/i,[`Nintendo`,0]],[/(xbox[\w\-_ ]*)/i,[`Microsoft`,0]],[/(googlebot)/i,[`Google`,`Bot`]],[/(bingbot)/i,[`Microsoft`,`Bing Bot`]],[/(yandexbot)/i,[`Yandex`,`Bot`]],[/(slackbot)/i,[`Slack`,`Bot`]],[/(twitterbot)/i,[`Twitter`,`Bot`]],[/(facebookbot)/i,[`Facebook`,`Bot`]],[/(linkedinbot)/i,[`LinkedIn`,`Bot`]],[/(tesla)[-_ ]?([-\w]*)/i,[`Tesla`,2]],[/(raspberry[\w\-_ ]*)/i,[`Raspberry Pi`,0]]]){let r=e.match(t);if(r){let e=n[0],t=n[1],i=typeof e==`number`?r[e]===void 0?`Unknown`:this.normalizeVendorName(r[e]):this.normalizeVendorName(e),a=`Unknown`;typeof t==`number`?a=r[t]===void 0?`Unknown`:r[t]:t===void 0?r[1]===void 0?r[0]!==void 0&&(a=r[0]):a=r[1]:a=t,a=this.normalizeModelName(a,i),this.details.vendor=i,this.details.model=a;break}}}catch(e){console.error(`DeviceChecker: device details detection error - `,e)}}normalizeVendorName(e){return e?{apple:`Apple`,samsung:`Samsung`,google:`Google`,xiaomi:`Xiaomi`,huawei:`Huawei`,oneplus:`OnePlus`,oppo:`OPPO`,vivo:`Vivo`,realme:`Realme`,motorola:`Motorola`,sony:`Sony`,lg:`LG`,nokia:`Nokia`,asus:`ASUS`,lenovo:`Lenovo`,amazon:`Amazon`,blackberry:`BlackBerry`,microsoft:`Microsoft`,zte:`ZTE`,htc:`HTC`,alcatel:`Alcatel`,tcl:`TCL`,meizu:`Meizu`,tecno:`Tecno`,infinix:`Infinix`,micromax:`Micromax`,lava:`Lava`,panasonic:`Panasonic`,sharp:`Sharp`,benq:`BenQ`,palm:`Palm`,honor:`Honor`,nvidia:`NVIDIA`,roku:`Roku`}[e.toLowerCase()]||e.charAt(0).toUpperCase()+e.slice(1).toLowerCase():`Unknown`}normalizeModelName(e,t){if(!e||e===`Unknown`)return e;if(e===`0`)return`Unknown`;let n=e.replace(/^build\//i,``).replace(/\s+bui$/i,``).replace(/\)$/,``).replace(/[;,)]/g,``).replace(/\s*\(.*?\)\s*/g,``).trim(),r=t.toLowerCase();return A.arrayIncludes(r,`samsung`)?n=n.replace(/^(sm-|gt-|sgh-|sch-)/i,``):A.arrayIncludes(r,`xiaomi`)?n=n.replace(/^(mi[\s\-_]*|redmi[\s\-_]*)/i,``):A.arrayIncludes(r,`oneplus`)?n=n.replace(/^oneplus[\s\-_]*/i,``):A.arrayIncludes(r,`google`)&&(n=n.replace(/^(pixel[\s\-_]*|nexus[\s\-_]*)/i,``)),n=n.replace(/_/g,` `).replace(/-/g,` `).replace(/\s+/g,` `).trim(),n?(n.length>0&&/^[a-z]/.test(n)&&(n=n.charAt(0).toUpperCase()+n.slice(1)),n):`Unknown`}detectIOSVersion(){try{let e=Ce.getWindow();if(!Ce.isBrowserWindow(e))return;if(this._highEntropyValues.platformVersion){let e=this._highEntropyValues.platformVersion.split(`.`).slice(0,2).join(`.`);this._iosVersion=parseFloat(e);return}if(this._os.version!==`Unknown`){let e=this._os.version.split(`.`),t=e.length>=2?`${e[0]}.${e[1]}`:e[0];this._iosVersion=parseFloat(t);return}let t=e.navigator.userAgent.match(/OS (\d+(_\d+)?)/i);t?.[1]&&(this._iosVersion=parseFloat(t[1].replace(/_/g,`.`)))}catch(e){console.error(`DeviceChecker: iOS version detection error - `,e)}}}var Ee=require(`@vkontakte/videoplayer-shared`);class De{constructor(){i(this,`_maxTouchPoints`,void 0),i(this,`_height`,void 0),i(this,`_width`,void 0),i(this,`_isHdr`,void 0),i(this,`_pixelRatio`,void 0),i(this,`_screenHeight`,void 0),i(this,`_screenWidth`,void 0),i(this,`_colorDepth`,void 0)}get isTouch(){return typeof this._maxTouchPoints==`number`?this._maxTouchPoints>1:`ontouchstart`in Ee.getWindow()}get maxTouchPoints(){return this._maxTouchPoints}get height(){return this._height}get width(){return this._width}get screenHeight(){return this._screenHeight}get screenWidth(){return this._screenWidth}get pixelRatio(){return this._pixelRatio}get isHDR(){return this._isHdr}get colorDepth(){return this._colorDepth}detect(){let e=Ee.getWindow();if(!Ee.isBrowserWindow(e))return;let{navigator:t,screen:n}=e,{maxTouchPoints:r}=t;try{this._maxTouchPoints=r??0,this._isHdr=!!e.matchMedia(`(dynamic-range: high)`)?.matches,this._colorDepth=n.colorDepth}catch(e){console.error(e)}try{this._pixelRatio=e.devicePixelRatio||1,this._height=n.height,this._width=n.width,this._height=n.height,this._screenHeight=this._height*this._pixelRatio,this._screenWidth=this._width*this._pixelRatio}catch(e){console.error(e)}}}var Oe=require(`@vkontakte/videoplayer-shared`),ke=()=>window.ManagedMediaSource||window.MediaSource,Ae=()=>{var e;return!!(window.ManagedMediaSource&&!((e=window.ManagedSourceBuffer)==null||(e=e.prototype)==null)&&e.appendBuffer)},je=()=>{var e;return!!(window.MediaSource&&!((e=window.SourceBuffer)==null||(e=e.prototype)==null)&&e.appendBuffer)},Me=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource,Ne=Oe.getWindow().document?.createElement(`video`),Pe=`video/mp4; codecs="avc1.42000a,mp4a.40.2"`,Fe=`video/mp4; codecs="hev1.1.6.L93.B0"`,Ie=`video/webm; codecs="vp09.00.10.08"`,Le=`video/webm; codecs="av01.0.00M.08"`,Re=`audio/mp4; codecs="mp4a.40.2"`,ze=`audio/webm; codecs="opus"`,Be;(function(){var e=a(function*(){let e=Oe.getWindow();if(!Oe.isBrowserWindow(e)||!(`mediaCapabilities`in e.navigator))return;let t={type:`media-source`,video:{contentType:`video/webm`,width:1280,height:720,bitrate:1e6,framerate:30}},[n,r]=yield Promise.all([e.navigator.mediaCapabilities.decodingInfo(o(o({},t),{},{video:o(o({},t.video),{},{contentType:Le})})),e.navigator.mediaCapabilities.decodingInfo(o(o({},t),{},{video:o(o({},t.video),{},{contentType:Ie})}))]);Be={DASH_WEBM_AV1:n,DASH_WEBM:r}});return function(){return e.apply(this,arguments)}})()().catch(e=>{console.log(Ne),console.error(e)});class Ve{constructor(e,t){i(this,`_video`,void 0),i(this,`_deviceChecker`,void 0),i(this,`_browserChecker`,void 0),i(this,`_protocols`,void 0),i(this,`_containers`,void 0),i(this,`_codecs`,void 0),i(this,`_nativeHlsSupported`,void 0),this._deviceChecker=e,this._browserChecker=t}get protocols(){return this._protocols}get containers(){return this._containers}get codecs(){return this._codecs}get webmDecodingInfo(){return Be}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){let e=Oe.getWindow();if(Oe.isBrowserWindow(e)){this._video=e.document.createElement(`video`);try{var t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g;this._protocols={mms:Ae(),mse:je(),hls:!!((t=this._video).canPlayType?.call(t,`application/x-mpegurl`)||(n=this._video).canPlayType?.call(n,`vnd.apple.mpegURL`)),webrtc:!!e.RTCPeerConnection,ws:!!e.WebSocket},this._containers={mp4:!!(r=this._video).canPlayType?.call(r,`video/mp4`),webm:!!(i=this._video).canPlayType?.call(i,`video/webm`),cmaf:!0};let _=!!(!((a=ke())==null||(o=a.isTypeSupported)==null)&&o.call(a,Pe)),v=!!(!((s=ke())==null||(c=s.isTypeSupported)==null)&&c.call(s,Fe)),y=!!(!((l=ke())==null||(u=l.isTypeSupported)==null)&&u.call(l,Re));this._codecs={h264:_,h265:v,vp9:!!(!((d=ke())==null||(f=d.isTypeSupported)==null)&&f.call(d,Ie)),av1:!!(!((p=ke())==null||(m=p.isTypeSupported)==null)&&m.call(p,Le)),aac:y,opus:!!(!((h=ke())==null||(g=h.isTypeSupported)==null)&&g.call(h,ze)),mpeg:(_||v)&&y},this._nativeHlsSupported=this._protocols.hls&&this._containers.mp4}catch(e){console.error(e)}try{this.destroyVideoElement()}catch(e){console.error(`Error destroying video element:`,e)}}}destroyVideoElement(){if(!this._video)return;if(this._video.pause(),this._video.currentTime=0,this._video.removeAttribute(`src`),this._video.src=``,this._video.load(),this._video.remove){this._video.remove(),this._video=null;return}this._video.parentNode&&this._video.parentNode.removeChild(this._video);let e=this._video.cloneNode(!1);this._video.parentNode?.replaceChild(e,this._video),this._video=null}}var He=require(`@vkontakte/videoplayer-shared`),Ue=`audio/mpeg`;class We{constructor(){i(this,`_audio`,void 0),i(this,`_containers`,void 0),i(this,`_codecs`,void 0)}supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){let e=He.getWindow();if(He.isBrowserWindow(e)){this._audio=e.document.createElement(`audio`);try{var t,n,r;this._containers={mpeg:!!(t=this._audio).canPlayType?.call(t,Ue)},this._codecs={mp3:!!(!((n=ke())==null||(r=n.isTypeSupported)==null)&&r.call(n,Ue))}}catch(e){console.error(e)}try{this.destroyAudioElement()}catch(e){console.error(`Error destroying audio element:`,e)}}}destroyAudioElement(){if(!this._audio)return;if(this._audio.pause(),this._audio.currentTime=0,this._audio.removeAttribute(`src`),this._audio.src=``,this._audio.load(),this._audio.remove){this._audio.remove(),this._audio=null;return}this._audio.parentNode&&this._audio.parentNode.removeChild(this._audio);let e=this._audio.cloneNode(!1);this._audio.parentNode?.replaceChild(e,this._audio),this._audio=null}}class Ge{constructor(){i(this,`isInited$`,new ye.ValueSubject(!1)),i(this,`_displayChecker`,void 0),i(this,`_deviceChecker`,void 0),i(this,`_browserChecker`,void 0),i(this,`_videoChecker`,void 0),i(this,`_audioChecker`,void 0),this._displayChecker=new De,this._deviceChecker=new Te(this._displayChecker),this._browserChecker=new Se,this._videoChecker=new Ve(this._deviceChecker,this._browserChecker),this._audioChecker=new We,this.detect()}get display(){return this._displayChecker}get device(){return this._deviceChecker}get browser(){return this._browserChecker}get video(){return this._videoChecker}get audio(){return this._audioChecker}detect(){var e=this;return a(function*(){ye.isBrowserWindow()&&(e._displayChecker.detect(),e._deviceChecker.detect(),e._browserChecker.detect(),e._videoChecker.detect(),e._audioChecker.detect(),e.isInited$.next(!0))})()}}var j=new Ge,Ke=(e,t=!1)=>{let{containers:n,protocols:r,codecs:i,nativeHlsSupported:a}=j.video,{isMobile:o}=j.device,s=j.device.isMac&&j.browser.isSafari,c=t&&!o&&!s,l=(i.h264||i.h265)&&i.aac,u=r.mse||r.mms;return e.filter(e=>{switch(e){case`DASH_SEP`:return u&&n.mp4&&l;case`DASH_WEBM`:return u&&n.webm&&i.vp9&&i.opus;case`DASH_WEBM_AV1`:return u&&n.webm&&i.av1&&i.opus;case`DASH_STREAMS`:return u&&(n.mp4&&l||n.webm&&(i.vp9||i.av1)&&(i.opus||i.aac));case`DASH_LIVE`:return u&&n.mp4&&l;case`DASH_LIVE_CMAF`:return u&&n.mp4&&l&&n.cmaf;case`DASH_ONDEMAND`:return u&&n.mp4&&l;case`HLS`:case`HLS_ONDEMAND`:case`HLS_FMP4`:case`HLS_LIVE`:case`HLS_LIVE_CMAF`:return a&&!c;case`MPEG`:return n.mp4;case`DASH`:case`DASH_LIVE_WEBM`:return!1;case`WEB_RTC_LIVE`:return r.webrtc&&r.ws&&i.h264&&(n.mp4||n.webm);default:return ve.assertNever(e)}})},qe=e=>{switch(e){case`MPEG`:case`DASH`:case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:return!1;case`DASH_LIVE`:case`DASH_LIVE_CMAF`:case`HLS_LIVE`:case`HLS_LIVE_CMAF`:case`DASH_LIVE_WEBM`:case`WEB_RTC_LIVE`:return!0;default:return ve.assertNever(e)}},Je=(e,t=!1)=>Ke(Object.keys(e).filter(e=>!qe(e)),t).length>0;class Ye{constructor(e){i(this,`subscription`,new O.Subscription),i(this,`log`,void 0),i(this,`params`,void 0),i(this,`sessionId$`,new O.ValueSubject(null)),i(this,`mediaSessionId$`,new O.ValueSubject(null)),i(this,`contentId$`,new O.ValueSubject(null)),i(this,`progressTicker`,void 0),i(this,`isMobile`,we()),i(this,`mobileVolumeState`,{muted:!1,volume:0}),i(this,`media`,null),i(this,`lastRequestedVolume`,null),i(this,`syncMediaState`,e=>{if(O.isNullable(e))return;this.media=e,this.mediaSessionId$.next(e.mediaSessionId??null);let t=e.media?.contentId;t&&this.contentId$.next(t),this.syncPlaybackState(e);let n=e.media?.duration;O.isNonNullable(n)&&this.params.output.duration$.next(Math.max(0,n));let r=e.currentTime;if(O.isNonNullable(r)){this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.params.output.position$.next(r);let t=this.params.output.isLive$.getValue();e.playerState===`PLAYING`&&!t?this.progressTicker.start(r):this.progressTicker.pause()}}),this.params=e,this.progressTicker=new _e(e),this.log=this.params.dependencies.logger.createComponentLog(`ChromecastPresentationApiProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(qe(e.format)),this.subscribe()}subscribe(){let e=e=>{this.params.output.error$.next({category:O.ErrorCategory.WTF,id:`ChromecastPresentationApiProvider`,message:e?.message??`Unknown error`,thrown:e})};this.subscription.add(this.params.chromecastConnector.message$.pipe(O.filter(e=>!!e)).subscribe(e=>{this.handleMessage(e)},e)),this.subscription.add(this.sessionId$.pipe(O.filter(O.isNonNullable),O.filterChanged(),O.debounce(0)).subscribe(()=>{this.loadMedia()},e));let t=this.contentId$.pipe(O.filterChanged(),O.map(Boolean));this.subscription.add(O.combine({seekState:this.params.desiredState.seekState.stateChangeEnded$,mediaLoaded:t}).pipe(O.filter(({mediaLoaded:e})=>e)).subscribe(()=>{let e=this.params.desiredState.seekState.getState();e.state===`requested`&&this.seek(e.position/1e3)},e));let n=O.combine({playbackState:this.params.desiredState.playbackState.stateChangeStarted$,mediaLoaded:t});this.subscription.add(n.pipe(O.filter(({mediaLoaded:e})=>e),O.debounce(0)).subscribe(()=>{this.syncPlayback()},e)),this.subscription.add(n.pipe(O.filter(({mediaLoaded:e,playbackState:{from:t,to:n}})=>!e&&t===`stopped`&&n===`playing`)).subscribe(()=>{this.loadMedia()},e)),this.subscription.add(O.combine({volumeState:this.params.desiredState.volume.stateChangeStarted$.pipe(O.debounce(30)),mediaLoaded:t}).pipe(O.filter(({mediaLoaded:e})=>e)).subscribe(({volumeState:e})=>{let{muted:t,volume:n}=e.to;this.setVolume(n,t)},e))}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:{var t;this.sessionId$.next(e.message.sessionId);let n=(t=e.message)==null||(t=t.media)==null?void 0:t[0];this.syncMediaState(n);let r=e.message?.receiver.volume;this.syncVolumeState(r)}break;case`v2_message`:switch(e.message?.type){case`MEDIA_STATUS`:{var n;let t=(n=e.message)==null||(n=n.status)==null?void 0:n[0];this.syncMediaState(t);break}}break}}loadMedia(){let e=fe(this.params),t=this.media?.currentTime,n=this.params.desiredState.seekState.getState(),r=t??(n.state===`none`?0:n.position/1e3),i=this.params.desiredState.playbackState.getState()===`playing`;this.params.chromecastConnector.sendV2Message({type:`LOAD`,requestId:0,media:e,autoplay:i,currentTime:r,customData:null,activeTrackIds:null}),this.params.output.willSeekEvent$.next()}stop(){this.params.chromecastConnector.stopMedia()}play(){let e=this.mediaSessionId$.getValue();O.assertNonNullable(e,`play on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PLAY`,mediaSessionId:e,customData:null})}pause(){let e=this.mediaSessionId$.getValue();O.assertNonNullable(e,`pause on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PAUSE`,mediaSessionId:e,customData:null})}seek(e){let t=this.mediaSessionId$.getValue();O.assertNonNullable(t,`seek on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`SEEK`,currentTime:e,mediaSessionId:t}),this.params.output.willSeekEvent$.next()}setVolume(e,t){let n=e,r=`[setVolume] volume: ${e}, muted: ${t}`;this.isMobile&&(n=this.mobileVolumeState.volume,r+=`, mobile next volume: ${n}`),this.log({message:r}),this.lastRequestedVolume={volume:n,muted:t},this.params.chromecastConnector.sendV2Message({type:`SET_VOLUME`,requestId:0,volume:{level:t?0:n,muted:t?!0:null}})}syncPlaybackState({playerState:e,idleReason:t}){let n=this.params.output.isBuffering$.getValue(),r=e===`BUFFERING`;switch(n!==r&&this.params.output.isBuffering$.next(r),e){case`PAUSED`:k(this.params.desiredState.playbackState,`paused`);break;case`PLAYING`:k(this.params.desiredState.playbackState,`playing`);break;case`IDLE`:t===`FINISHED`?(this.params.output.endedEvent$.next(),k(this.params.desiredState.playbackState,`stopped`),this.contentId$.next(null)):k(this.params.desiredState.playbackState,`ready`);break;case`BUFFERING`:break}}syncPlayback(){let e=this.params.desiredState.playbackState.getState();switch(this.log({message:`[syncPlayback] ${e}`}),e){case`ready`:break;case`playing`:this.play();break;case`paused`:this.pause();break;case`stopped`:this.stop();break}}syncVolumeState(e){if(O.isNullable(e))return;let{level:t,muted:n}=e,r={muted:n??!1,volume:t??0};this.lastRequestedVolume&&=(n&&(r.volume=this.lastRequestedVolume.volume),this.lastRequestedVolume.muted&&!t&&!n&&(r.volume=this.lastRequestedVolume.volume,r.muted=!0),null);let i=`[syncVolumeState] volume: ${r.volume}, muted: ${r.muted}`;this.isMobile&&(this.mobileVolumeState.volume=r.volume,this.mobileVolumeState.muted=r.muted,r.volume=this.params.output.volume$.getValue().volume,i+=`, volume passed to state machine: ${r.volume}`),this.log({message:i}),this.params.output.volume$.next(r)}destroy(){this.progressTicker.destroy(),this.subscription.unsubscribe()}}var M=require(`@vkontakte/videoplayer-shared`),Xe=e=>({castDevice:{friendlyName:e},remotePlayer:{},remotePlayerController:{},session:{}}),Ze=()=>String(Date.now())+String(Math.floor(Math.random()*1e5));class Qe{constructor(e){i(this,`params`,void 0),i(this,`clientId`,void 0),i(this,`capabilities`,[`WEB`]),i(this,`presentationRequest$`,new M.ValueSubject(null)),i(this,`log`,void 0),i(this,`sessionId$`,new M.ValueSubject(null)),i(this,`broadcastChannel`,new BroadcastChannel(`vk_player_chromecast_events`)),i(this,`subscription`,new M.Subscription),i(this,`subscriptionEvents`,new M.Subscription),i(this,`isDestroyed`,!1),i(this,`sequenceNumber`,0),i(this,`presentationAvailable$`,new M.ValueSubject(!1)),i(this,`presentationConnection$`,new M.ValueSubject(null)),i(this,`message$`,new M.ValueSubject(null)),i(this,`friendlyName$`,new M.ValueSubject(null)),i(this,`errorEvent$`,new M.Subject),this.clientId=this.getClientId(),this.params=e,this.log=e.logger.createComponentLog(`ChromecastPresentationApiConnector`),this.log({message:`constructor`}),this.safeReinitPresentation(),this.subscribe()}destroy(){this.log({message:`destroy`}),this.subscription.unsubscribe(),this.subscriptionEvents.unsubscribe(),this.broadcastChannel.close(),this.isDestroyed=!0}disconnect(e=!0){this.log({message:`disconnect`}),e&&this.stopMedia(),this.presentationRequest$.next(null);let t=this.presentationConnection$.getValue();t&&t.close(),this.presentationConnection$.next(null),this.friendlyName$.next(null),this.resetSequenceNumber(),this.resetSubscriptionEvents()}stopMedia(){this.log({message:`stopMedia`}),this.sendV2Message({type:`STOP`})}reinitPresentation(e=!0){let t=this.createCastUrl(),n=new PresentationRequest(t);this.presentationRequest$.next(n),this.log({message:`PresentationRequest created`}),n.getAvailability().then(e=>{let t=()=>{this.log({message:`PresentationRequest presentation availability: ${e.value}`}),this.presentationAvailable$.next(e.value)};this.subscriptionEvents.add(M.fromEvent(e,`change`).subscribe(()=>{t()})),t()}).catch(()=>{this.presentationAvailable$.next(!0)}),M.getWindow().navigator.presentation.defaultRequest=n,e&&n.reconnect(`auto-join`).then(e=>{this.log({message:`PresentationRequest reconnect success`}),this.handleConnection(e)}).catch(()=>{this.log({message:`PresentationRequest reconnect failed`})})}safeReinitPresentation(e){try{this.reinitPresentation(e)}catch(e){this.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`reinitPresentation error`,thrown:e})}}connect(){var e=this;return a(function*(){e.log({message:`connect`});try{e.presentationRequest$.getValue()||(e.log({message:`reinitPresentation`}),e.reinitPresentation(!1));let t=e.presentationRequest$.getValue();M.assertNonNullable(t,`connect with null presentationRequest`);let n=yield t.start();e.handleConnection(n)}catch(t){switch(t?.name){case`AbortError`:case`NotAllowedError`:break;default:e.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:t?.message??`connect error`,thrown:t});break}}})()}subscribe(){this.subscription.add(M.fromEvent(this.broadcastChannel,`message`).subscribe(e=>{this.log({message:`broadcast connection data: ${e.data}`}),e.data===`connection`&&this.disconnect(!1)})),this.subscription.add(this.presentationAvailable$.subscribe(e=>{this.log({message:`presentationAvailable$: ${e}`})})),this.subscription.add(this.presentationConnection$.pipe(M.tap(e=>{this.log({message:`presentationConnection$: ${!!e}`})}),M.filter(e=>!!e)).subscribe(e=>{let t=M.fromEvent(e,`message`).subscribe(e=>{let t=JSON.parse(e.data);t.clientId===this.clientId&&(this.log({message:`[onmessage] ${e.data}`}),this.handleMessage(t),this.message$.next(t))}),n=M.fromEvent(e,`connect`).subscribe(()=>{this.send(`client_connect`)}),r=M.fromEvent(e,`close`).subscribe(e=>{switch(e.reason){case`error`:this.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:`Session error`,thrown:e});break;case`closed`:break}});this.subscriptionEvents.add(t),this.subscriptionEvents.add(n),this.subscriptionEvents.add(r)}))}send(e){switch(e){case`client_connect`:{let e={type:`client_connect`,message:this.clientId,sequenceNumber:-1,timeoutMillis:0,clientId:this.clientId};this.safeSend(JSON.stringify(e));break}}}sendV2Message(e){let t=this.sessionId$.getValue();if(t){let n={type:`v2_message`,sequenceNumber:this.getSequenceNumber(),timeoutMillis:0,clientId:this.clientId,message:o(o({},e),{},{sessionId:t})};this.safeSend(JSON.stringify(n))}}safeSend(e){try{this.log({message:`[send] ${e}`});let t=this.presentationConnection$.getValue();t?.state===`connected`&&t?.send(e)}catch(t){this.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:`PresentationConnection send error`,data:{message:e},thrown:t})}}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:this.sessionId$.next(e.message.sessionId),this.friendlyName$.next(e.message.receiver.friendlyName||`Chromecast Device`);break;case`receiver_action`:e.message?.action===`stop`&&this.disconnect();break}}createCastUrl(){return`cast:${this.params.appId}?clientId=${this.clientId}&autoJoinPolicy=tab_and_origin_scoped&defaultActionPolicy=create_session&launchTimeout=60000&supportedAppTypes=${this.capabilities}&appParams=%7B%22launchCheckerParams%22%3A%7B%7D%7D`}getSequenceNumber(){let e=this.sequenceNumber;return this.sequenceNumber=(this.sequenceNumber+1)%(2**53-1),e}resetSequenceNumber(){this.sequenceNumber=0}getClientId(){let e=`__vk_player_chromecast_id`;return M.getWindow()[e]=M.getWindow()[e]||Ze()}resetSubscriptionEvents(){this.subscriptionEvents.unsubscribe(),this.subscriptionEvents=new M.Subscription}handleConnection(e){this.log({message:`connection available`}),this.isDestroyed?(this.log({message:`connected on already destroyed component`}),e.close()):(this.broadcastChannel.postMessage(`connection`),this.presentationConnection$.next(e))}}var $e=require(`@vkontakte/videoplayer-shared`);class et{static isSupported(){return`chrome`in window&&`presentation`in navigator&&`BroadcastChannel`in window}constructor(e){i(this,`subscription`,new $e.Subscription),i(this,`log`,void 0),i(this,`contentId`,void 0),i(this,`connection$`,new $e.ValueSubject(void 0)),i(this,`castState$`,new $e.ValueSubject(`NOT_AVAILABLE`)),i(this,`errorEvent$`,new $e.Subject),i(this,`chromecastConnector`,void 0);let t=et.isSupported();this.log=e.dependencies.logger.createComponentLog(`ChromecastPresentationApiInitializer`),this.log({message:`[constructor] receiverApplicationId: ${e.receiverApplicationId}, isDisabled: ${e.isDisabled}, isSupported: ${t}`}),!(!t||e.isDisabled||!e.receiverApplicationId)&&(this.chromecastConnector=new Qe({appId:e.receiverApplicationId,logger:e.dependencies.logger}),this.subscribe())}subscribe(){$e.assertNonNullable(this.chromecastConnector,`subscribe with null chromecastConnector`),this.subscription.add(this.chromecastConnector.errorEvent$.subscribe(this.errorEvent$));let e=$e.combine({connection:this.chromecastConnector.presentationConnection$,available:this.chromecastConnector.presentationAvailable$,friendlyName:this.chromecastConnector.friendlyName$.pipe($e.filterChanged())});this.subscription.add(e.pipe($e.map(({connection:e,friendlyName:t})=>!!(e&&t)),$e.filterChanged()).subscribe(e=>{let t=this.chromecastConnector?.friendlyName$.getValue()??``;this.connection$.next(e?Xe(t):void 0)})).add(e.subscribe(({available:e,connection:t})=>{e?t?this.castState$.next(`CONNECTED`):this.castState$.next(`AVAILABLE`):this.castState$.next(`NOT_AVAILABLE`)}))}connect(){this.log({message:`connect`}),this.chromecastConnector?.connect()}disconnect(){this.log({message:`disconnect`}),this.chromecastConnector?.disconnect()}stopMedia(){var e=this;return a(function*(){e.log({message:`stopMedia`}),e.chromecastConnector?.stopMedia()})()}toggleConnection(){let e=!!this.chromecastConnector?.presentationConnection$.getValue();this.log({message:`toggleConnection: isConnected - ${e}`}),e?this.disconnect():this.connect()}setVolume(e){}setMuted(e){}destroy(){this.log({message:`destroy`}),this.chromecastConnector?.destroy(),this.subscription.unsubscribe()}}var tt=require(`@vkontakte/videoplayer-shared`),nt=require(`@vkontakte/videoplayer-shared`),rt=require(`@vkontakte/videoplayer-shared`),it=require(`@vkontakte/videoplayer-shared`),at=require(`@vkontakte/videoplayer-shared`);require(`@vkontakte/videoplayer-shared`);var ot=(e,t)=>e===t;class st{constructor(e,t=ot){i(this,`comparator`,void 0),i(this,`state`,void 0),i(this,`prevState`,void 0),i(this,`transition`,void 0),i(this,`transitionStarted$`,new at.Subject),i(this,`transitionEnded$`,new at.Subject),i(this,`transitionUpdated$`,new at.Subject),i(this,`forceChanged$`,new at.Subject),i(this,`stateChangeStarted$`,at.merge(this.transitionStarted$,this.transitionUpdated$)),i(this,`stateChangeEnded$`,at.merge(this.transitionEnded$,this.forceChanged$)),this.comparator=t,this.state=e,this.prevState=void 0}setState(e){let t=this.transition,n=this.state;this.transition=void 0,this.prevState=n,this.state=e,t?this.comparator(t.to,e)?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:n,to:e,canceledTransition:t})}startTransitionTo(e){let t=this.transition,n=this.state;this.comparator(n,e)||at.isNonNullable(t)&&this.comparator(t.to,e)||(this.prevState=n,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:n,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}var N=require(`@vkontakte/videoplayer-shared`),ct=5,lt=5,ut=500,dt=7e3;class ft{constructor(e){i(this,`subscription`,new N.Subscription),i(this,`loadMediaTimeoutSubscription`,new N.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`params`,void 0),i(this,`log`,void 0),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.videoState.getTransition(),n=this.params.desiredState.playbackState.getState(),r=this.params.desiredState.playbackState.getTransition(),i=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${n}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(i)};`}),n===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.stop());return}if(!t){if(r?.to!==`paused`&&i.state===`requested`&&e!==`stopped`){this.seek(i.position/1e3);return}switch(n){case`ready`:switch(e){case`playing`:case`paused`:case`ready`:break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:N.assertNever(e)}break;case`playing`:switch(e){case`playing`:break;case`paused`:this.videoState.startTransitionTo(`playing`),this.params.connection.remotePlayerController.playOrPause();break;case`ready`:this.videoState.startTransitionTo(`playing`),this.params.connection.remotePlayerController.playOrPause();break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:N.assertNever(e)}break;case`paused`:switch(e){case`playing`:this.videoState.startTransitionTo(`paused`),this.params.connection.remotePlayerController.playOrPause();break;case`paused`:break;case`ready`:this.videoState.startTransitionTo(`paused`),this.videoState.setState(`paused`);break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:N.assertNever(e)}break;default:N.assertNever(n)}}}),this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`ChromecastProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(qe(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});let t=this.params.connection.session.getMediaSession();t&&this.restoreSession(t),this.subscribe()}destroy(){this.log({message:`[destroy]`}),this.subscription.unsubscribe()}subscribe(){this.subscription.add(this.loadMediaTimeoutSubscription);let e=new N.Subscription;this.subscription.add(e),this.subscription.add(N.merge(this.videoState.stateChangeStarted$.pipe(N.map(e=>`stateChangeStarted$ ${JSON.stringify(e)}`)),this.videoState.stateChangeEnded$.pipe(N.map(e=>`stateChangeEnded$ ${JSON.stringify(e)}`))).subscribe(e=>this.log({message:`[videoState] ${e}`})));let t=(e,t)=>this.subscription.add(e.subscribe(t));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{let t=new N.Subject;e.add(t.pipe(N.debounce(ut)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let n=NaN;e.add(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(e=>{this.logRemoteEvent(e);let r=e.value;this.params.output.position$.next(r),(this.params.desiredState.seekState.getState().state===`applying`||Math.abs(r-n)>ct)&&t.next(r),n=r})),e.add(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(e=>{this.logRemoteEvent(e),this.params.output.duration$.next(e.value)}))}t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),t=>{this.logRemoteEvent(t),t.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),e=>{this.logRemoteEvent(e),e.value?this.handleRemotePause():this.handleRemotePlay()}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),e=>{this.logRemoteEvent(e);let{remotePlayer:t}=this.params.connection,n=e.value,r=this.params.output.isBuffering$.getValue(),i=n===chrome.cast.media.PlayerState.BUFFERING;switch(r!==i&&this.params.output.isBuffering$.next(i),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&t.duration-t.currentTime<lt&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),k(this.params.desiredState.playbackState,`stopped`);break;case chrome.cast.media.PlayerState.PAUSED:this.handleRemotePause();break;case chrome.cast.media.PlayerState.PLAYING:this.handleRemotePlay();break;case chrome.cast.media.PlayerState.BUFFERING:break;default:N.assertNever(n)}}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({volume:e.value})}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({muted:e.value})}),t(N.merge(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,N.observableFrom([`init`])).pipe(N.debounce(0)),this.syncPlayback)}restoreSession(e){this.log({message:`restoreSession`});let{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):(this.videoState.setState(`playing`),k(this.params.desiredState.playbackState,`playing`));let e=this.params.output.isLive$.getValue();this.params.output.duration$.next(e?0:t.duration),this.params.output.position$.next(e?0:t.currentTime),this.params.desiredState.seekState.setState({state:`none`})}}prepare(){let e=this.params.format;this.log({message:`[prepare] format: ${e}`});let t=fe(this.params),n=this.createLoadRequest(t);this.loadMedia(n)}handleRemotePause(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`paused`||e===`playing`)&&(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`playing`||e===`paused`)&&(this.videoState.setState(`playing`),k(this.params.desiredState.playbackState,`playing`))}handleRemoteReady(){this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.params.desiredState.playbackState.getTransition()?.to===`ready`&&k(this.params.desiredState.playbackState,`ready`)}handleRemoteStop(){this.videoState.getState()!==`stopped`&&this.videoState.setState(`stopped`)}handleRemoteVolumeChange(e){let t=this.params.output.volume$.getValue(),n={volume:e.volume??t.volume,muted:e.muted??t.muted};(n.volume!==t.volume||n.muted!==n.muted)&&this.params.output.volume$.next(n)}seek(e){this.params.output.willSeekEvent$.next();let{remotePlayer:t,remotePlayerController:n}=this.params.connection;t.currentTime=e,n.seek()}stop(){let{remotePlayerController:e}=this.params.connection;e.stop()}createLoadRequest(e){let t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;let n=this.params.desiredState.seekState.getState();return n.state===`applying`||n.state===`requested`?t.currentTime=this.params.output.isLive$.getValue()?0:n.position/1e3:t.currentTime=0,t}loadMedia(e){let t=this.params.connection.session.loadMedia(e),n=new Promise((e,t)=>{this.loadMediaTimeoutSubscription.add(N.timeout(dt).subscribe(()=>t(`timeout(${dt})`)))});it.promiseFinally(Promise.race([t,n]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},e=>{let t=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${e}`;this.log({message:t}),this.params.output.error$.next({id:`ChromecastProvider.loadMedia`,category:N.ErrorCategory.VIDEO_PIPELINE,message:t,thrown:e})}),()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}}var pt=require(`@vkontakte/videoplayer-shared`),mt=require(`@vkontakte/videoplayer-shared`),ht=require(`@vkontakte/videoplayer-shared`),gt=(e,t)=>{try{e.pause(),e.playbackRate=0,ht.clearVideoElement(e,t),e.remove()}catch(e){console.error(e)}},_t=`__spvc`;class vt{constructor(){i(this,`attribute`,`data-pool-reused`)}get(e){return e.hasAttribute(this.attribute)}set(e,t){e.toggleAttribute(this.attribute,t)}delete(e){e.removeAttribute(this.attribute)}}var yt=mt.getWindow(),bt=yt.WeakMap?new yt.WeakMap:new vt,xt=yt.WeakMap?new yt.WeakMap:new Map,St=(e,t=20)=>{let n=0;return mt.fromEvent(e,`ratechange`).subscribe(r=>{n++,n>=t&&(e.currentTime=e.currentTime,n=0)})};function Ct(e){e.style.position=`fixed`,e.style.left=`100%`,e.setAttribute(`data-role`,`screen`),mt.getWindow().document.body.appendChild(e)}function wt(e,t){e.style.position=``,e.style.left=``,t.appendChild(e)}var Tt=(e,{audioVideoSyncRate:t,disableYandexPiP:n,clearVideoElementInnerHTML:r,reuseOwnVideoElement:i})=>{let a,o=e.querySelector(`video`),s=!!o,c=mt.getWindow().document.querySelector(`body > video[data-role=screen]`)||void 0;i?yt[_t]=c:(c?.remove(),delete yt[_t]),o?(a=o,mt.clearVideoElement(a,r)):c&&c===yt[_t]?(a=c,wt(a,e)):(a=mt.getWindow().document.createElement(`video`),e.appendChild(a),i&&(yt[_t]=a)),bt.set(a,s);let l=new mt.Subscription;return l.add(St(a,t)),xt.set(a,l),a.setAttribute(`crossorigin`,`anonymous`),a.setAttribute(`playsinline`,`playsinline`),n&&a.setAttribute(`x-yandex-pip`,`false`),a.controls=!1,a.setAttribute(`poster`,`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=`),a},Et=e=>(e.setAttribute(`crossorigin`,`anonymous`),e.controls=!1,e),Dt=(e,t)=>{if(e instanceof HTMLAudioElement){gt(e,!0);return}if(e instanceof HTMLVideoElement){Ot(e,t);return}};function Ot(e,{keepVideoElement:t,clearVideoElementInnerHTML:n,reuseOwnVideoElement:r}){xt.get(e)?.unsubscribe(),xt.delete(e);let i=bt.get(e);bt.delete(e),i||t?mt.clearVideoElement(e,n):r?(mt.clearVideoElement(e,n),Ct(e)):gt(e,n)}var kt=require(`@vkontakte/videoplayer-shared`),At=require(`@vkontakte/videoplayer-shared`),P=require(`@vkontakte/videoplayer-shared`),jt=require(`@vkontakte/videoplayer-shared`),Mt=(e,t,n,{equal:r=(e,t)=>e===t,changed$:i,onError:a}={})=>{let o=e.getState(),s=t(),c=jt.isNullable(i),l=new jt.Subscription;return i&&l.add(i.subscribe(t=>{r(t,e.getState())&&e.setState(t)},a)),r(s,o)||(n(o),c&&e.setState(o)),l.add(e.stateChangeStarted$.subscribe(t=>{n(t.to),c&&e.setState(t.to)},a)),l},Nt=(e,t,n)=>Mt(t,()=>e.loop,t=>{jt.isNonNullable(t)&&(e.loop=t)},{onError:n}),Pt=(e,t,n,r,i)=>Mt(t,()=>({muted:e.muted,volume:e.volume}),t=>{i?.skipVideoElVolumeSync$.getValue()||jt.isNonNullable(t)&&(e.muted=t.muted,e.volume=t.volume)},{equal:(e,t)=>e===t||e?.muted===t?.muted&&e?.volume===t?.volume,changed$:n,onError:r}),Ft=(e,t,n,r)=>Mt(t,()=>e.playbackRate,t=>{jt.isNonNullable(t)&&(e.playbackRate=t)},{changed$:n,onError:r}),It=Mt,Lt=e=>[`__`,e.language,e.label].join(`|`),Rt=(e,t)=>{if(e.id===t)return!0;let[n,r,i]=t.split(`|`);return e.language===r&&e.label===i};class zt{constructor(e){i(this,`available$`,new P.Subject),i(this,`current$`,new P.ValueSubject(void 0)),i(this,`error$`,new P.Subject),i(this,`video`,void 0),i(this,`cueSettings`,void 0),i(this,`subscription`,new P.Subscription),i(this,`externalTracks`,new Map),i(this,`internalTracks`,new Map),i(this,`baseURL`,void 0),this.baseURL=e}connect(e,t,n){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();let r=e=>{this.error$.next({id:`TextTracksManager`,category:P.ErrorCategory.WTF,message:`Generic HtmlVideoTextTrackManager error`,thrown:e})};this.subscription.add(this.available$.subscribe(n.availableTextTracks$)),this.subscription.add(this.current$.subscribe(n.currentTextTrack$)),this.subscription.add(this.error$.subscribe(n.error$)),this.subscription.add(It(t.internalTextTracks,()=>kt.objectValues(this.internalTracks),e=>{P.isNonNullable(e)&&this.setInternal(e)},{equal:(e,t)=>P.isNonNullable(e)&&P.isNonNullable(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(P.map(e=>e.filter(({type:e})=>e===`internal`))),onError:r})),this.subscription.add(It(t.externalTextTracks,()=>kt.objectValues(this.externalTracks),e=>{P.isNonNullable(e)&&this.setExternal(e)},{equal:(e,t)=>P.isNonNullable(e)&&P.isNonNullable(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(P.map(e=>e.filter(({type:e})=>e===`external`))),onError:r})),this.subscription.add(It(t.currentTextTrack,()=>{if(this.video)return;let e=this.htmlTextTracksAsArray().find(({mode:e})=>e===`showing`);return e&&this.htmlTextTrackToITextTrack(e).id},e=>this.select(e),{changed$:this.current$,onError:r})),this.subscription.add(It(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(let e of this.htmlTextTracksAsArray())this.applyCueSettings(e.cues),this.applyCueSettings(e.activeCues)}))}subscribe(){P.assertNonNullable(this.video);let{textTracks:e}=this.video;this.subscription.add(P.fromEvent(e,`addtrack`).subscribe(()=>{let e=this.current$.getValue();e&&this.select(e)})),this.subscription.add(P.merge(P.fromEvent(e,`addtrack`),P.fromEvent(e,`removetrack`),P.observableFrom([`init`])).pipe(P.map(()=>this.htmlTextTracksAsArray().map(e=>this.htmlTextTrackToITextTrack(e))),P.filterChanged((e,t)=>e.length===t.length&&e.every(({id:e},n)=>e===t[n].id))).subscribe(this.available$)),this.subscription.add(P.merge(P.fromEvent(e,`change`),P.observableFrom([`init`])).pipe(P.map(()=>this.htmlTextTracksAsArray().find(({mode:e})=>e===`showing`)),P.map(e=>e&&this.htmlTextTrackToITextTrack(e).id),P.filterChanged()).subscribe(this.current$));let t=e=>this.applyCueSettings(e.target?.activeCues??null);this.subscription.add(P.fromEvent(e,`addtrack`).subscribe(e=>{e.track?.addEventListener(`cuechange`,t);let n=e=>{let t=e.target?.cues??null;t&&t.length&&(this.applyCueSettings(e.target?.cues??null),e.target?.removeEventListener(`cuechange`,n))};e.track?.addEventListener(`cuechange`,n)})),this.subscription.add(P.fromEvent(e,`removetrack`).subscribe(e=>{e.track?.removeEventListener(`cuechange`,t)}))}applyCueSettings(e){if(!e||!e.length)return;let t=this.cueSettings.getState();for(let n of Array.from(e)){let e=n;P.isNonNullable(t.align)&&(e.align=t.align),P.isNonNullable(t.position)&&(e.position=t.position),P.isNonNullable(t.size)&&(e.size=t.size),P.isNonNullable(t.line)&&(e.line=t.line)}}htmlTextTracksAsArray(e=!1){P.assertNonNullable(this.video);let t=[...this.video.textTracks];return e?t:t.filter(zt.isHealthyTrack)}htmlTextTrackToITextTrack(e){let{language:t,label:n}=e,r=e.id?e.id:Lt(e),i=this.externalTracks.has(r),a=(i?this.externalTracks.get(r)?.isAuto:this.internalTracks.get(r)?.isAuto)??At.arrayIncludes(r,`auto`);return i?{id:r,type:`external`,isAuto:a,language:t,label:n,url:this.externalTracks.get(r)?.url}:{id:r,type:`internal`,isAuto:a,language:t,label:n,url:this.internalTracks.get(r)?.url}}static isHealthyTrack(e){return!(e.kind===`metadata`||e.groupId||e.id===``&&e.label===``&&e.language===``)}setExternal(e){this.internalTracks.size>0&&Array.from(this.internalTracks).forEach(([,e])=>this.detach(e)),e.filter(({id:e})=>!this.externalTracks.has(e)).forEach(e=>this.attach(e)),Array.from(this.externalTracks).filter(([t])=>!e.find(e=>e.id===t)).forEach(([,e])=>this.detach(e))}setInternal(e){let t=[...this.externalTracks];e.filter(({id:e,language:n,isAuto:r})=>!this.internalTracks.has(e)&&!t.some(([,e])=>e.language===n&&e.isAuto===r)).forEach(e=>this.attach(e)),Array.from(this.internalTracks).filter(([t])=>!e.find(e=>e.id===t)).forEach(([,e])=>this.detach(e))}select(e){P.assertNonNullable(this.video);for(let e of this.htmlTextTracksAsArray(!0))e.mode=`showing`;for(let t of this.htmlTextTracksAsArray(!0))(P.isNullable(e)||!Rt(t,e))&&(t.mode=`disabled`)}destroy(){if(this.subscription.unsubscribe(),this.video)for(let e of Array.from(this.video.getElementsByTagName(`track`))){let t=e.getAttribute(`id`);t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){P.assertNonNullable(this.video);let t=document.createElement(`track`);this.baseURL?t.setAttribute(`src`,new URL(e.url,this.baseURL).toString()):t.setAttribute(`src`,e.url),t.setAttribute(`id`,e.id),e.label&&t.setAttribute(`label`,e.label),e.language&&t.setAttribute(`srclang`,e.language),e.type===`external`?this.externalTracks.set(e.id,e):e.type===`internal`&&this.internalTracks.set(e.id,e),this.video.appendChild(t)}detach(e){P.assertNonNullable(this.video);let t=Array.prototype.find.call(this.video.getElementsByTagName(`track`),t=>t.getAttribute(`id`)===e.id);t&&this.video.removeChild(t),e.type===`external`?this.externalTracks.delete(e.id):e.type===`internal`&&this.internalTracks.delete(e.id)}}var Bt=zt;class Vt{constructor(){i(this,`pausedTime`,0),i(this,`streamOffset`,0),i(this,`pauseTimestamp`,0)}getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}var Ht=e=>{let t=e;for(;!(t instanceof Document)&&!(t instanceof ShadowRoot)&&t!==null;)t=t?.parentNode;return t??void 0},Ut=e=>{let t=Ht(e);return!!(t&&t.fullscreenElement&&t.fullscreenElement===e)},Wt=e=>{let t=Ht(e);return!!(t&&t.pictureInPictureElement&&t.pictureInPictureElement===e)},F=require(`@vkontakte/videoplayer-shared`),Gt=3,Kt=(e,t,n=Gt)=>{let r=0,i=0;for(let a=0;a<e.length;a++){let o=e.start(a),s=e.end(a);if(o<=t&&t<=s){if(r=o,i=s,!n)return{from:r,to:i};for(let t=a-1;t>=0;t--)e.end(t)+n>=r&&(r=e.start(t));for(let t=a+1;t<e.length;t++)e.start(t)-n<=i&&(i=e.end(t))}}return{from:r,to:i}},qt=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t},Jt=e=>{let t=t=>F.fromEvent(e,t).pipe(F.mapTo(void 0),F.shareReplay(1)),n=new F.Subscription,r=()=>n.unsubscribe(),i=F.merge(F.fromEvent(e,`progress`),F.fromEvent(e,`timeupdate`)).pipe(F.map(()=>Kt(e.buffered,e.currentTime)),F.shareReplay(1)),a=j.browser.isSafari?F.combine({play:t(`play`).pipe(F.once()),playing:t(`playing`)}).pipe(F.mapTo(void 0),F.shareReplay(1)):t(`playing`),o=F.fromEvent(e,`volumechange`).pipe(F.map(()=>({muted:e.muted,volume:e.volume})),F.shareReplay(1)),s=F.fromEvent(e,`ratechange`).pipe(F.map(()=>e.playbackRate),F.shareReplay(1)),c=F.fromEvent(e,`error`).pipe(F.filter(()=>!!(e.error||e.played.length)),F.map(()=>{let t=e.error;return{id:t?`MediaError#${t.code}`:`HtmlVideoError`,category:F.ErrorCategory.VIDEO_PIPELINE,message:t?t.message:`Error event from HTML video element`,thrown:e.error??void 0}}),F.shareReplay(1)),l=F.fromEvent(e,`timeupdate`).pipe(F.map(()=>e.currentTime),F.shareReplay(1)),u=F.merge(F.fromEvent(e,`loadedmetadata`),F.fromEvent(e,`timeupdate`),F.fromEvent(e,`pause`),F.fromEvent(e,`seeked`),F.fromEvent(e,`ended`)).pipe(F.map(()=>qt(e.played)),F.filterChanged(),F.shareReplay(1)),d=[`waiting`,`seeking`,`seeked`,`timeupdate`],f=new F.Subject,p=.3,m;n.add(F.merge(...d.map(t=>F.fromEvent(e,t))).subscribe(t=>{let n=e.currentTime;e.loop&&F.isNonNullable(m)&&F.isNonNullable(n)&&m>=e.duration-p&&n<=p&&f.next(m),m=n}));let h=t(`pause`).pipe(F.filter(()=>!e.error&&m!==e.duration),F.shareReplay(1)),g=F.fromEvent(e,`enterpictureinpicture`).pipe(F.shareReplay(1)),_=F.fromEvent(e,`leavepictureinpicture`).pipe(F.shareReplay(1)),v=new F.ValueSubject(Wt(e));n.add(g.subscribe(()=>v.next(!0))),n.add(_.subscribe(()=>v.next(!1)));let y=new F.ValueSubject(Ut(e)),b=F.fromEvent(e,`fullscreenchange`).pipe(F.shareReplay(1));n.add(b.pipe(F.map(()=>Ut(e))).subscribe(y));let x=F.fromEvent(e,`timeupdate`).pipe(F.map(t=>e.duration-e.currentTime<.1),F.filterChanged(),F.shareReplay(1)),S=F.merge(x.pipe(F.filter(t=>!e.loop&&t)),F.fromEvent(e,`ended`)).pipe(F.throttle(1e3),F.mapTo(void 0),F.shareReplay(1)),C=F.merge(...[`waiting`,`pause`,`canplay`,`play`,`canplaythrough`,`playing`,`seeking`,`seeked`,`ended`].map(t=>F.fromEvent(e,t)),x.pipe(F.map(e=>({type:e?`ended`:`unknown`})))).pipe(F.map(t=>j.browser.isFirefox&&t.type===`ended`?e.readyState<2:e.readyState<3),F.filterChanged(),F.shareReplay(1));return{playing$:a,pause$:h,canplay$:t(`canplay`),ended$:S,looped$:f,error$:c,seeked$:t(`seeked`),seeking$:t(`seeking`),progress$:t(`progress`),loadStart$:t(`loadstart`),loadedMetadata$:t(`loadedmetadata`),loadedData$:t(`loadeddata`),timeUpdate$:l,durationChange$:F.fromEvent(e,`durationchange`).pipe(F.map(()=>e.duration),F.shareReplay(1)),playedTime$:u,isBuffering$:C,currentBuffer$:i,volumeState$:o,playbackRateState$:s,inPiP$:v,inFullscreen$:y,enterPip$:g,leavePip$:_,destroy:r}},Yt=require(`@vkontakte/videoplayer-shared`),Xt=e=>{switch(e){case`mobile`:return Yt.VideoQuality.Q_144P;case`lowest`:return Yt.VideoQuality.Q_240P;case`low`:return Yt.VideoQuality.Q_360P;case`sd`:case`medium`:return Yt.VideoQuality.Q_480P;case`hd`:case`high`:return Yt.VideoQuality.Q_720P;case`fullhd`:case`full`:return Yt.VideoQuality.Q_1080P;case`quadhd`:case`quad`:return Yt.VideoQuality.Q_1440P;case`ultrahd`:case`ultra`:return Yt.VideoQuality.Q_2160P}},Zt=require(`@vkontakte/videoplayer-shared`),Qt=require(`@vkontakte/videoplayer-shared`),$t=require(`@vkontakte/videoplayer-shared`),I=require(`@vkontakte/videoplayer-shared`),en=!1,tn={},nn=e=>{en=e},rn=()=>{tn={}},an=e=>{e(tn)},on=(e,t)=>{en&&(tn.meta=tn.meta??{},tn.meta[e]=t)};class sn{constructor(e){i(this,`name`,void 0),this.name=e}next(e){if(!en)return;tn.series=tn.series??{};let t=tn.series[this.name]??[];t.push([Date.now(),e]),tn.series[this.name]=t}}var cn=require(`@vkontakte/videoplayer-shared`);function ln(e,t,n){return!e.max&&e.min===t?`high_quality`:!e.min&&e.max===n?`traffic_saving`:`unknown`}function un(e,t,n){return cn.isNullable(e)||cn.isNonNullable(e.min)&&cn.isNonNullable(e.max)&&cn.isLower(e.max,e.min)||cn.isNonNullable(e.min)&&cn.isNonNullable(t)&&cn.isHigher(e.min,t)||cn.isNonNullable(e.max)&&cn.isNonNullable(n)&&cn.isLower(e.max,n)}function dn({limits:e,highestAvailableHeight:t,lowestAvailableHeight:n}){return un({max:e?.max?cn.videoHeightToQuality(e.max):void 0,min:e?.min?cn.videoHeightToQuality(e.min):void 0},t?cn.videoHeightToQuality(t):void 0,n?cn.videoHeightToQuality(n):void 0)}var fn=new sn(`best_bitrate`),pn=(e,t,n)=>(t-n)*2**(-10*e)+n,mn=e=>(t,n)=>e*(Number(t.bitrate)-Number(n.bitrate));class hn{constructor(){i(this,`last`,void 0),i(this,`history`,{})}recordSelection(e){this.history[e.id]=I.now()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}var gn=`Assertion "ABR Tracks is empty array" failed`,_n=new WeakMap,vn=new WeakMap,yn=new WeakMap,bn=(e,t,n,r)=>{let i=[...t].sort(mn(1)),a=[...n].sort(mn(1)),o=a.filter(t=>I.isNonNullable(t.bitrate)&&I.isNonNullable(e.bitrate)?e.bitrate/t.bitrate>r:!0),s=Zt.arrayAt(a,Math.round(a.length*i.indexOf(e)/(i.length+1)))??Zt.arrayAt(a,-1);return s&&Qt.arrayIncludes(o,s)?s:o.length?Zt.arrayAt(o,-1):Zt.arrayAt(a,0)},xn=(e,t,n,r)=>{let i=_n.get(t);i||(i=[...t].sort(mn(1)),_n.set(t,i));let a=_n.get(n);a||(a=[...n].sort(mn(1)),_n.set(n,a));let o=yn.get(e);o||(o=a.filter(t=>I.isNonNullable(t.bitrate)&&I.isNonNullable(e.bitrate)?e.bitrate/t.bitrate>r:!0),yn.set(e,o));let s=Zt.arrayAt(a,Math.round(a.length*i.indexOf(e)/(i.length+1)))??Zt.arrayAt(a,-1);return s&&Qt.arrayIncludes(o,s)?s:o.length?Zt.arrayAt(o,-1):Zt.arrayAt(a,0)},Sn=e=>`quality`in e,Cn=(e,t,n,r)=>{var i;let a=I.isNonNullable(r==null||(i=r.last)==null?void 0:i.bitrate)&&I.isNonNullable(n?.bitrate)&&r.last.bitrate<n.bitrate?e.trackCooldownIncreaseQuality:e.trackCooldownDecreaseQuality,o=n&&r&&r.history[n.id]&&I.now()-r.history[n.id]<=a&&(!r.last||n.id!==r.last.id);if(n?.id&&r&&!o&&r.recordSelection(n),o&&r?.last){let e=r.last;return r?.recordSwitch(e),t({message:`
|
|
6
|
+
const e=[`url`],t=[`url`],n=[`downloadingItems`],r=[`container`];var i=require(`@oxc-project/runtime/helpers/defineProperty`),a=require(`@oxc-project/runtime/helpers/asyncToGenerator`),o=require(`@oxc-project/runtime/helpers/objectSpread2`),s=require(`@oxc-project/runtime/helpers/awaitAsyncGenerator`),c=require(`@oxc-project/runtime/helpers/wrapAsyncGenerator`),l=require(`@oxc-project/runtime/helpers/objectWithoutProperties`),u=Object.defineProperty,d=Object.getOwnPropertyNames,f=Object.getOwnPropertyDescriptor,p=Object.prototype.hasOwnProperty;function m(e){return this[e]}var h=e=>{var t=(g??=new WeakMap).get(e),n;if(t)return t;if(t=u({},`__esModule`,{value:!0}),e&&typeof e==`object`||typeof e==`function`)for(var r of d(e))p.call(t,r)||u(t,r,{get:m.bind(e,r),enumerable:!(n=f(e,r))||n.enumerable});return g.set(e,t),t},g,_=e=>e;function v(e,t){this[e]=_.bind(null,t)}var y=(e,t)=>{for(var n in t)u(e,n,{get:t[n],enumerable:!0,configurable:!0,set:v.bind(t,n)})},b={};y(b,{isMobile:()=>we,clientChecker:()=>j,areValidLiveRecordSources:()=>Je,WebmCodecStrategy:()=>yr,VideoQuality:()=>Au.VideoQuality,VideoFormat:()=>C,VideoCodecName:()=>w,ValueSubject:()=>Au.ValueSubject,VERSION:()=>x,Surface:()=>ee,Subscription:()=>Au.Subscription,Subject:()=>Au.Subject,SDK_VERSION:()=>ju,PredefinedQualityLimits:()=>te,Player:()=>ku,PlaybackState:()=>S,Observable:()=>Au.Observable,HttpConnectionType:()=>E,ChromecastState:()=>T}),module.exports=h(b);var x=`2.0.163-dev.3ec5a1ede.0`,S;(e=>{e.STOPPED=`stopped`,e.READY=`ready`,e.PLAYING=`playing`,e.PAUSED=`paused`})(S||={});var C;(e=>{e.MPEG=`MPEG`,e.DASH=`DASH`,e.DASH_SEP=`DASH_SEP`,e.DASH_SEP_VK=`DASH_SEP`,e.DASH_WEBM=`DASH_WEBM`,e.DASH_WEBM_AV1=`DASH_WEBM_AV1`,e.DASH_STREAMS=`DASH_STREAMS`,e.DASH_WEBM_VK=`DASH_WEBM`,e.DASH_ONDEMAND=`DASH_ONDEMAND`,e.DASH_ONDEMAND_VK=`DASH_ONDEMAND`,e.DASH_LIVE=`DASH_LIVE`,e.DASH_LIVE_CMAF=`DASH_LIVE_CMAF`,e.DASH_LIVE_WEBM=`DASH_LIVE_WEBM`,e.HLS=`HLS`,e.HLS_ONDEMAND=`HLS_ONDEMAND`,e.HLS_JS=`HLS`,e.HLS_FMP4=`HLS_FMP4`,e.HLS_LIVE=`HLS_LIVE`,e.HLS_LIVE_CMAF=`HLS_LIVE_CMAF`,e.WEB_RTC_LIVE=`WEB_RTC_LIVE`})(C||={});var w;(e=>{e.AV1=`av1`,e.VP9=`vp9`,e.AVC1=`avc1`,e.HEV1=`hev1`})(w||={});var T;(e=>{e.NOT_AVAILABLE=`NOT_AVAILABLE`,e.AVAILABLE=`AVAILABLE`,e.CONNECTING=`CONNECTING`,e.CONNECTED=`CONNECTED`})(T||={});var E;(e=>{e.HTTP1=`http1`,e.HTTP2=`http2`,e.QUIC=`quic`})(E||={});var ee;(e=>{e.NONE=`none`,e.INLINE=`inline`,e.FULLSCREEN=`fullscreen`,e.SECOND_SCREEN=`second_screen`,e.PIP=`pip`,e.INVISIBLE=`invisible`})(ee||={});var te;(e=>{e.TRAFFIC_SAVING=`traffic_saving`,e.HIGH_QUALITY=`high_quality`,e.UNKNOWN=`unknown`})(te||={});var ne=require(`@vkontakte/videoplayer-shared`),re=require(`@vkontakte/videoplayer-shared`),ie=require(`@vkontakte/videoplayer-shared`),D=require(`@vkontakte/videoplayer-shared`),ae=e=>new Promise((t,n)=>{let r=document.createElement(`script`);r.setAttribute(`src`,e),r.onload=()=>t(),r.onerror=e=>n(e),document.body.appendChild(r)});class oe{constructor(e){i(this,`connection$`,new D.ValueSubject(void 0)),i(this,`castState$`,new D.ValueSubject(`NOT_AVAILABLE`)),i(this,`errorEvent$`,new D.Subject),i(this,`contentId`,void 0),i(this,`realCastState$`,new D.ValueSubject(`NOT_AVAILABLE`)),i(this,`subscription`,new D.Subscription),i(this,`log`,void 0),i(this,`params`,void 0),i(this,`isDestroyed`,!1),this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`ChromecastInitializer`);let t=`chrome`in window;if(this.log({message:`[constructor] receiverApplicationId: ${this.params.receiverApplicationId}, isDisabled: ${this.params.isDisabled}, isSupported: ${t}`}),e.isDisabled||!t)return;let n=D.isNonNullable(window.chrome?.cast),r=!!window.__onGCastApiAvailable;n?this.initializeCastApi():(window.__onGCastApiAvailable=e=>{delete window.__onGCastApiAvailable,e&&!this.isDestroyed&&this.initializeCastApi()},r||ae(`https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1`).catch(()=>this.errorEvent$.next({id:`ChromecastLoading`,category:D.ErrorCategory.NETWORK,message:`Script loading failed!`})))}connect(){cast.framework.CastContext.getInstance()?.requestSession()}disconnect(){var e;(e=cast.framework.CastContext.getInstance())==null||(e=e.getCurrentSession())==null||e.endSession(!0)}stopMedia(){return new Promise((e,t)=>{var n;(n=cast.framework.CastContext.getInstance())==null||(n=n.getCurrentSession())==null||(n=n.getMediaSession())==null||n.stop(new chrome.cast.media.StopRequest,e,t)})}toggleConnection(){D.isNonNullable(this.connection$.getValue())?this.disconnect():this.connect()}setVolume(e){let t=this.connection$.getValue();D.isNullable(t)||(t.remotePlayer.volumeLevel=e,t.remotePlayerController.setVolumeLevel())}setMuted(e){let t=this.connection$.getValue();D.isNullable(t)||e!==t.remotePlayer.isMuted&&t.remotePlayerController.muteOrUnmute()}destroy(){this.isDestroyed=!0,this.subscription.unsubscribe()}initListeners(){let e=new cast.framework.RemotePlayer,t=new cast.framework.RemotePlayerController(e),n=cast.framework.CastContext.getInstance();this.subscription.add(D.fromEvent(n,cast.framework.CastContextEventType.SESSION_STATE_CHANGED).subscribe(e=>{switch(e.sessionState){case cast.framework.SessionState.SESSION_STARTED:case cast.framework.SessionState.SESSION_STARTING:case cast.framework.SessionState.SESSION_RESUMED:var t;this.contentId=(t=n.getCurrentSession())==null||(t=t.getMediaSession())==null||(t=t.media)==null?void 0:t.contentId;break;case cast.framework.SessionState.NO_SESSION:case cast.framework.SessionState.SESSION_ENDING:case cast.framework.SessionState.SESSION_ENDED:case cast.framework.SessionState.SESSION_START_FAILED:this.contentId=void 0;break;default:return D.assertNever(e.sessionState)}})).add(D.merge(D.fromEvent(n,cast.framework.CastContextEventType.CAST_STATE_CHANGED).pipe(D.tap(e=>{this.log({message:`[cast.framework.RemotePlayerEventType.CAST_STATE_CHANGED]: ${JSON.stringify(e)}`})}),D.map(e=>e.castState)),D.observableFrom([n.getCastState()])).pipe(D.filterChanged(),D.map(se),D.tap(e=>{this.log({message:`realCastState$: ${e}`})})).subscribe(this.realCastState$)).add(this.realCastState$.subscribe(r=>{let i=r===`CONNECTED`,a=D.isNonNullable(this.connection$.getValue());if(i&&!a){var o;let r=n.getCurrentSession();D.assertNonNullable(r);let i=r.getCastDevice(),a=(o=r.getMediaSession())==null||(o=o.media)==null?void 0:o.contentId;(D.isNullable(a)||a===this.contentId)&&(this.log({message:`connection created`}),this.connection$.next({remotePlayer:e,remotePlayerController:t,session:r,castDevice:i}))}else !i&&a&&(this.log({message:`connection destroyed`}),this.connection$.next(void 0));this.castState$.next(r===`CONNECTED`?D.isNonNullable(this.connection$.getValue())?`CONNECTED`:`AVAILABLE`:r)}))}initializeCastApi(){let e,t,n;try{e=cast.framework.CastContext.getInstance(),t=chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,n=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED}catch{return}try{e.setOptions({receiverApplicationId:this.params.receiverApplicationId??t,autoJoinPolicy:n}),this.initListeners()}catch(e){this.errorEvent$.next({id:`ChromecastInitializer`,category:D.ErrorCategory.EXTERNAL_API,message:`[initializeCastApi] failed`,thrown:e})}}}var se=e=>{switch(e){case cast.framework.CastState.NO_DEVICES_AVAILABLE:return`NOT_AVAILABLE`;case cast.framework.CastState.NOT_CONNECTED:return`AVAILABLE`;case cast.framework.CastState.CONNECTING:return`CONNECTING`;case cast.framework.CastState.CONNECTED:return`CONNECTED`;default:return D.assertNever(e)}},O=require(`@vkontakte/videoplayer-shared`),ce=require(`@vkontakte/videoplayer-shared`),le=require(`@vkontakte/videoplayer-shared`),ue=(e,t=0,n=0)=>{switch(n){case 0:return e.replace(`_offset_p`,t===0?``:`_`+t.toFixed(0));case 1:{if(t===0)return e;let n=new URL(e);return n.searchParams.append(`playback_shift`,t.toFixed(0)),n.toString()}case 2:{let n=new URL(e);return!n.searchParams.get(`offset_p`)&&t===0?e:(n.searchParams.set(`offset_p`,t.toFixed(0)),n.toString())}default:le.assertNever(n)}return e},de=(e,t)=>{switch(t){case 0:return NaN;case 1:{let t=new URL(e);return Number(t.searchParams.get(`playback_shift`))}case 2:{let t=new URL(e);return Number(t.searchParams.get(`offset_p`)??0)}default:le.assertNever(t)}},fe=e=>{let{source:t,format:n,meta:r,output:i}=e,a,o,s;switch(n){case`MPEG`:{let e=t[n];ce.assertNonNullable(e);let r=ce.getHighestQuality(Object.keys(e));ce.assertNonNullable(r);let i=e[r];ce.assertNonNullable(i),a=i,o=`video/mp4`,s=pe();break}case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:{let e=t[n];ce.assertNonNullable(e),a=e.url,o=`application/x-mpegurl`,s=pe();break}case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:{let e=t[n];ce.assertNonNullable(e),a=e.url,o=`application/dash+xml`,s=pe();break}case`DASH_LIVE_CMAF`:{let e=t[n];ce.assertNonNullable(e),a=e.url,o=`application/dash+xml`,s=me();break}case`HLS_LIVE`:case`HLS_LIVE_CMAF`:{let e=t[n];ce.assertNonNullable(e),a=ue(e.url),o=`application/x-mpegurl`,s=me();break}case`DASH_LIVE`:case`WEB_RTC_LIVE`:{let e=`Unsupported format for Chromecast`,t=Error(e);throw i.error$.next({id:`ChromecastProvider.createMediaInfo()`,category:ce.ErrorCategory.VIDEO_PIPELINE,message:e,thrown:t}),t}case`DASH`:case`DASH_LIVE_WEBM`:throw Error(`${n} is no longer supported`);default:return ce.assertNever(n)}let c=he(r.videoId??a,o);c.contentUrl=a,c.streamType=s,c.metadata=ge();let{title:l,subtitle:u}=r;return ce.isNonNullable(l)&&(c.metadata.title=l),ce.isNonNullable(u)&&(c.metadata.subtitle=u),c};function pe(){var e;return((e=chrome.cast)==null||(e=e.media)==null||(e=e.StreamType)==null?void 0:e.BUFFERED)??`BUFFERED`}function me(){var e;return((e=chrome.cast)==null||(e=e.media)==null||(e=e.StreamType)==null?void 0:e.LIVE)??`LIVE`}function he(e,t){var n;return!((n=chrome.cast)==null||(n=n.media)==null)&&n.MediaInfo?new chrome.cast.media.MediaInfo(e,t):{contentId:e,contentType:t,metadata:{title:``,subtitle:``},streamType:pe()}}function ge(){var e;return!((e=chrome.cast)==null||(e=e.media)==null)&&e.GenericMediaMetadata?new chrome.cast.media.GenericMediaMetadata:{images:[],metadataType:0,releaseDate:``,subtitle:``,title:``,releaseYear:1970,type:0}}var k=(e,t,n=!1)=>{let r=e.getTransition();(n||!r||r.to===t)&&e.setState(t)};class _e{constructor(e){i(this,`params`,void 0),i(this,`interval`,0),i(this,`startVideoPosition`,void 0),i(this,`startTs`,void 0),this.params=e}start(e=0){clearInterval(this.interval),this.startVideoPosition=e,this.startTs=Date.now(),this.interval=window.setInterval(()=>{let e=(Date.now()-this.startTs)/1e3,t=this.startVideoPosition+e;this.params.output.position$.next(t)},1e3)}pause(){clearInterval(this.interval)}destroy(){clearInterval(this.interval)}}var ve=require(`@vkontakte/videoplayer-shared`),ye=require(`@vkontakte/videoplayer-shared`),be=require(`@vkontakte/videoplayer-shared`),xe=require(`@vkontakte/videoplayer-shared`);class Se{constructor(){i(this,`_current`,void 0),i(this,`_current_version`,void 0),i(this,`_chromeVersion`,void 0),i(this,`_firefoxVersion`,void 0),i(this,`_safariVersion`,void 0),i(this,`_operaVersion`,void 0),i(this,`_edgeVersion`,void 0),i(this,`_yandexVersion`,void 0),i(this,`_isMiuiBrowser`,!1)}get current(){return this._current}get isChrome(){return this.current===`Chrome`}get isChromiumBased(){return be.arrayIncludes([`Chrome`,`Chromium`,`Opera`,`Yandex`,`Edge`,`SamsungBrowser`],this.current)}get isFirefox(){return this.current===`Firefox`}get isSafari(){return this.current===`Safari`}get isOpera(){return this.current===`Opera`}get isEdge(){return this.current===`Edge`}get isYandex(){return this.current===`Yandex`}get isSamsungBrowser(){return this.current===`SamsungBrowser`}get currentVersion(){return this._current_version}get chromeVersion(){return this._chromeVersion}get firefoxVersion(){return this._firefoxVersion}get safariVersion(){return this._safariVersion}get operaVersion(){return this._operaVersion}get edgeVersion(){return this._edgeVersion}get yandexVersion(){return this._yandexVersion}get isMiuiBrowser(){return this._isMiuiBrowser}detect(){let{userAgent:e}=navigator;try{let t=/yabrowser/i.test(e)?`Yandex`:void 0,n=/samsungbrowser/i.test(e)?`SamsungBrowser`:void 0,r=/chrome|crios/i.test(e)?`Chrome`:void 0,i=/chromium/i.test(e)?`Chromium`:void 0,a=/firefox|fxios/i.test(e)?`Firefox`:void 0,o=/webkit|safari|khtml/i.test(e)?`Safari`:void 0,s=/opr\//i.test(e)?`Opera`:void 0,c=/edg/i.test(e)?`Edge`:void 0;this._isMiuiBrowser=/(XiaoMi)|(MiuiBrowser)/i.test(e),this._current=t||n||a||s||c||r||i||o||`Rest`}catch(e){console.error(e)}this.isChrome&&this.detectChromeVersion(),this.isFirefox&&this.detectFirefoxVersion(),this.isSafari&&this.detectSafariVersion(),this.isOpera&&this.detectOperaVersion(),this.isEdge&&this.detectEdgeVersion(),this.isYandex&&this.detectYandexVersion()}detectVersion(e){try{let{userAgent:t}=xe.getWindow().navigator,n=t.match(e);if(!n)return;let r=n[1],i=parseInt(r,10);if(!isNaN(i))return this._current_version=i,i}catch(e){console.error(e)}}detectChromeVersion(){this._chromeVersion=this.detectVersion(/Chrome\/(\d+\.\d+)/)}detectFirefoxVersion(){this._firefoxVersion=this.detectVersion(/Firefox\/(\d+\.\d+)/)}detectSafariVersion(){this._safariVersion=this.detectVersion(/Version\/(\d+)/)}detectOperaVersion(){this._operaVersion=this.detectVersion(/OPR\/(\d+\.\d+)/)}detectEdgeVersion(){this._edgeVersion=this.detectVersion(/Edg\/(\d+\.\d+)/)}detectYandexVersion(){this._yandexVersion=this.detectVersion(/YaBrowser\/(\d+\.\d+\.\d+)/)}}var A=require(`@vkontakte/videoplayer-shared`),Ce=require(`@vkontakte/videoplayer-shared`),we=()=>{var e;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion??navigator.userAgent)||((e=navigator)==null||(e=e.userAgentData)==null?void 0:e.mobile)};class Te{constructor(e){i(this,`_displayChecker`,void 0),i(this,`_isMobile`,void 0),i(this,`_current`,void 0),i(this,`_iosVersion`,void 0),i(this,`_highEntropyValues`,{}),i(this,`_os`,{name:`Unknown`,version:`Unknown`,full:`Unknown`}),i(this,`_details`,{vendor:`Unknown`,model:`Unknown`}),this._displayChecker=e}get current(){return this._current}get os(){return this._os}get details(){return this._details}get isIOS(){return this._highEntropyValues.platform===`iOS`||A.arrayIncludes(this.os.name.toLowerCase(),`ios`)||A.arrayIncludes([`iPhone`,`iPad`,`iPod`],this.current)}get isMac(){return this._highEntropyValues.platform===`macOS`||A.arrayIncludes(this.os.name.toLowerCase(),`mac`)||this.current===`Mac`}get isApple(){return this.isIOS||this.isMac}get isIphoneOrOldIpad(){if(!this.isApple||!this._displayChecker.isTouch)return!1;let e=this.current===`iPad`||this._displayChecker.width>700,t=this._iosVersion;return!e||e&&!!t&&t<16}get isAndroid(){return this._highEntropyValues.platform===`Android`||A.arrayIncludes(this.os.name.toLowerCase(),`android`)||this.current===`Android`}get isWindows(){return A.arrayIncludes(this.os.name.toLowerCase(),`windows`)}get isLinux(){return A.arrayIncludes(this.os.name.toLowerCase(),`linux`)&&!this.isAndroid}get isMobile(){return this._highEntropyValues.mobile||this._isMobile}get iOSVersion(){return this._iosVersion}detect(){let e=Ce.getWindow();if(!Ce.isBrowserWindow(e))return;let{userAgent:t}=e.navigator;try{this._isMobile=we()}catch(e){console.error(`DeviceChecker: calling isMobile error - `,e)}this.detectDevice(t),this.detectOS(t),this.detectDeviceDetails(t),this.detectHighEntropyValues(),this.isIOS&&this.detectIOSVersion()}detectHighEntropyValues(){var e=this;return a(function*(){let t=Ce.getWindow();if(!Ce.isBrowserWindow(t))return;let{userAgentData:n}=t.navigator;if(n?.getHighEntropyValues){let t=yield n.getHighEntropyValues([`architecture`,`bitness`,`brands`,`mobile`,`platform`,`formFactor`,`model`,`platformVersion`,`wow64`]);e._highEntropyValues=t,t.platform&&(e._os.name=e.normalizeOSName(t.platform),t.platformVersion&&(e._os.version=e.normalizeOSVersion(t.platformVersion),e._os.full=`${e._os.name} ${e._os.version}`)),t.model&&(e._details.model=t.model)}})()}detectDevice(e){try{let t=/android/i.test(e)?`Android`:void 0,n=/iphone/i.test(e)?`iPhone`:void 0,r=/ipad/i.test(e)?`iPad`:void 0,i=/ipod/i.test(e)?`iPod`:void 0,a=/mac/i.test(e)?`Mac`:void 0,o=/webOS|BlackBerry|IEMobile|Opera Mini/i.test(e)?`RestMobile`:void 0;this._current=t||n||r||i||o||a||`Desktop`}catch(e){console.error(`DeviceChecker: device detection error - `,e)}}detectOS(e){try{for(let[t,n]of[[/(windows nt) (6\.[23]); arm/i,[`Windows RT`]],[/(windows nt) (6\.3); arm/i,[`Windows RT 8.1`]],[/(windows (?:phone|mobile|iot))(?: os)?[/ ]?([\d.]+)/i,[`Windows Mobile`,2]],[/(windows)[/ ](xp|vista|7|8(\.1)?|10|11|2000|me)/i,[1,1]],[/windows nt ?([\d.]+)/i,[`Windows`,1]],[/(windows)[/ ](95|98|me|2000|xp|vista|7|8|8\.1|10|11)/i,[1,2]],[/(iphone os|cpu iphone os) ([\d_.]+)/i,[`iOS`,2]],[/(ipad os|cpu os) ([\d_.]+)/i,[`iPadOS`,2]],[/(ipod os|cpu ipod os) ([\d_.]+)/i,[`iOS`,2]],[/(?:ios|os) ([\d_.]+) like mac os x/i,[`iOS`,1]],[/cfnetwork\/.+darwin/i,[`iOS`]],[/(mac os x) ?([\d_.]+)/i,[`macOS`,2]],[/(macintosh|mac os)/i,[`macOS`]],[/(android) ([\d.]+)/i,[1,2]],[/(harmonyos)[/ ]?([\d.]*)/i,[`HarmonyOS`,2]],[/\b(ubuntu|debian|fedora|centos|arch|linux)(?:[-/ ]([\w.]+))?/i,[1,2]],[/(cros)\D*([\d.]+)/i,[`Chrome OS`,2]],[/(freebsd|openbsd|netbsd|dragonfly)[/ ]?([\w.]*)/i,[1,2]],[/(sunos|solaris)?([\d.]*)/i,[`Solaris`,2]],[/(aix)?([\d.]*)/i,[`AIX`,2]]]){let r=e.match(t);if(r){let t=n.length>0,i=n.length>1,a=`Unknown`,o=`Unknown`;if(t){let e=n[0];typeof e==`number`?e<r.length&&r[e]!==void 0&&(a=r[e]):a=e}if(i){let e=n[1];typeof e==`number`?e<r.length&&r[e]!==void 0&&(o=r[e]):e!==void 0&&(o=e)}else r[2]===void 0?r[1]!==void 0&&t&&typeof n[0]==`string`&&(o=r[1]):o=r[2];a=this.normalizeOSName(a),o=this.normalizeOSVersion(o,a),a===`iOS`&&/ipad/i.test(e)?a=`iPadOS`:a===`iPadOS`&&/ip(hone|od)/i.test(e)&&(a=`iOS`),this._os={name:a,version:o||`Unknown`,full:o&&o!==`Unknown`?`${a} ${o}`:a};break}}}catch(e){console.error(`DeviceChecker: OS detection error - `,e)}}normalizeOSName(e){if(!e)return`Unknown`;let t=e.toLowerCase();return A.arrayIncludes(t,`windows`)?`Windows`:A.arrayIncludes(t,`mac os`)||A.arrayIncludes(t,`macintosh`)?`macOS`:A.arrayIncludes(t,`iphone`)||A.arrayIncludes(t,`ios`)?`iOS`:A.arrayIncludes(t,`ipados`)?`iPadOS`:A.arrayIncludes(t,`android`)?`Android`:A.arrayIncludes(t,`harmonyos`)?`HarmonyOS`:A.arrayIncludes(t,`linux`)?`Linux`:A.arrayIncludes(t,`cros`)?`Chrome OS`:A.arrayIncludes(t,`freebsd`)?`FreeBSD`:A.arrayIncludes(t,`openbsd`)?`OpenBSD`:A.arrayIncludes(t,`solaris`)||A.arrayIncludes(t,`sunos`)?`Solaris`:A.arrayIncludes(t,`aix`)?`AIX`:e}normalizeOSVersion(e,t){if(!e)return`Unknown`;if(e!==`Unknown`&&(e=e.replace(/_/g,`.`),t===`Windows`)){let t=parseFloat(e);if(!isNaN(t)){if(t>=11)return`11`;if(t>=10)return`10`;if(t===6.3)return`8.1`;if(t===6.2)return`8`;if(t===6.1)return`7`;if(t===6)return`Vista`;if(t===5.1||t===5.2)return`XP`;if(t===5)return`2000`;if(t===4)return`NT 4.0`}}return e}detectDeviceDetails(e){try{for(let[t,n]of[[/(iphone)/i,[`Apple`,`iPhone`]],[/(ipad)/i,[`Apple`,`iPad`]],[/(ipod)/i,[`Apple`,`iPod`]],[/(macintosh)/i,[`Apple`,`Macintosh`]],[/(windows[\w\-_ ]*phone)/i,[`Microsoft`,0]],[/(windows nt|win64|win32|wow64)/i,[`Microsoft`,`PC`]],[/\b(sch-i[89]0\d|shw-m380s|sm-[ptxs]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i,[`Samsung`,1]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?\d+a?|galaxy nexus)/i,[`Samsung`,1]],[/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,[`Samsung`,1]],[/sec-(sgh\w+)/i,[`Samsung`,1]],[/smart-tv.+(samsung)/i,[`Samsung`,`Smart TV`]],[/(samsung).*tizen/i,[`Samsung`,`Smart TV`]],[/(pixel (?:c|tablet|[0-9a-z ]+))/i,[`Google`,1]],[/(pixelbook(?: go)?)/i,[`Google`,1]],[/nexus [0-9]/i,[`Google`,0]],[/(redmi[-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(mi[\w\-_ ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(poco[\w ]+)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(hm[-_ ]?note?[\w ]*)(?: bui|\))/i,[`Xiaomi`,1]],[/\b(?:xiao)?mi[\w\-_ ]+pad/i,[`Xiaomi`,0]],[/(?:huawei|honor) ?([-\w ]+)[;)]/i,[`Huawei`,1]],[/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i,[`Huawei`,1]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?)/i,[`Huawei`,1]],[/(?:one)?(?:plus)? ?([a\d0]\d\d\d?)(?: b|\))/i,[`OnePlus`,1]],[/droid.+; (cph2[3-6]\d[13579]|((?:gm|hd)19|(?:ac|be|in|kb)20|(?:d[en]|eb|le|mt)21|ne22)[0-2]\d)(?: bui|\))/i,[`OnePlus`,1]],[/(oneplus)[-_ ]?([-\w]*)/i,[`OnePlus`,2]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i,[`Realme`,1]],[/(realme)[-_ ]?([-\w]*)/i,[`Realme`,2]],[/; (\w+) bui.+ oppo/i,[`OPPO`,1]],[/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i,[`OPPO`,1]],[/\b(opd2(\d{3}a?))(?: bui|\))/i,[`OPPO`,1]],[/(oppo)[-_ ]?([-\w]*)/i,[`OPPO`,2]],[/; vivo (\w+)(?: bui|\))/i,[`Vivo`,1]],[/\b(v[12]\d{3}\w?[at])(?: bui|;)/i,[`Vivo`,1]],[/(vivo)[-_ ]?([-\w]*)/i,[`Vivo`,2]],[/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,[`Motorola`,1]],[/((?:moto(?! 360)[-\w() ]+|xt\d{3,4}[cgkosw+]?[-\d]*|nexus 6)(?= bui|\)))/i,[`Motorola`,1]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b/i,[`Motorola`,0]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i,[`Motorola`,0]],[/droid.+; ([a-z]?\d[0-2]{2}[a-z]{2}|[c-g]\d{4}|so[-gl]\w+|xq-[a-z]{2}\d\d)(?= bui|\))/i,[`Sony`,1]],[/sony tablet [ps]/i,[`Sony`,`Xperia Tablet`]],[/\b(?:sony)?sgp\w+(?: bui|\))/i,[`Sony`,0]],[/(sony)[-_ ]?([-\w]*)/i,[`Sony`,2]],[/\blg[-e;/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,[`LG`,1]],[/\blg-?([\d\w]+) bui/i,[`LG`,1]],[/(lm(?:-?f100[nv]?|-[\w.]+)(?= bui|\))|nexus [45])/i,[`LG`,1]],[/((?=lg)?[vl]k-?\d{3}) bui/i,[`LG`,0]],[/(lg)[-_ ]?([-\w]*)/i,[`LG`,2]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,[`Nokia`,1]],[/nokia[-_ ]?(([-\w. ]*?))(?: bui|\)|;|\/)/i,[`Nokia`,1]],[/(nokia) (t[12][01])/i,[`Nokia`,2]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i,[`ASUS`,1]],[/(?:asus[-_ ])?(zenfone[\w\-_ ]*)/i,[`ASUS`,1]],[/(rog[\w\-_ ]*)/i,[`ASUS`,1]],[/(asus)[-_ ]?([-\w]*)/i,[`ASUS`,2]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i,[`Lenovo`,1]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])(?: bui|;|\)|\/)/i,[`Lenovo`,1]],[/(thinkpad[\w\-_ ]*)/i,[`Lenovo`,0]],[/(kf[a-z]{2}[a-z]*)(?: bui|\))/i,[`Amazon`,1]],[/(alexa)webm/i,[`Amazon`,`Echo`]],[/(fire[\w\-_ ]*)/i,[`Amazon`,0]],[/(amazon)[-_ ]?([-\w]*)/i,[`Amazon`,2]],[/(?:blackberry|\(bb10;) (\w+)/i,[`BlackBerry`,1]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,[`BlackBerry`,1]],[/(playbook);[-\w),; ]+(rim)/i,[`BlackBerry`,1]],[/(microsoft); (lumia[\w ]+)/i,[`Microsoft`,2]],[/(surface duo)/i,[`Microsoft`,`Surface Duo`]],[/(surface[\w\-_ ]*)/i,[`Microsoft`,0]],[/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,[`ZTE`,2]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,[`HTC`,2]],[/(alcatel|tcl)[-_ ]?([-\w]*)/i,[1,2]],[/(meizu)[-_ ]?([-\w]*)/i,[`Meizu`,2]],[/(tecno)[-_ ]?([-\w]*)/i,[`Tecno`,2]],[/(infinix)[-_ ]?([-\w]*)/i,[`Infinix`,2]],[/(micromax)[-_ ]?([-\w]*)/i,[`Micromax`,2]],[/(lava)[-_ ]?([-\w]*)/i,[`Lava`,2]],[/(panasonic)[-_ ]?([-\w]*)/i,[`Panasonic`,2]],[/(sharp)\/?([-\w]*)/i,[`Sharp`,2]],[/(benq)[-_ ]?([-\w]*)/i,[`BenQ`,2]],[/(palm)[-_ ]?([-\w]*)/i,[`Palm`,2]],[/(vertu)[-_ ]?([-\w]*)/i,[`Vertu`,2]],[/(gionee)[-_ ]?([-\w]*)/i,[`Gionee`,2]],[/(doogee)[-_ ]?([-\w]*)/i,[`Doogee`,2]],[/(ulefone)[-_ ]?([-\w]*)/i,[`Ulefone`,2]],[/(blackview)[-_ ]?([-\w]*)/i,[`Blackview`,2]],[/(cubot)[-_ ]?([-\w]*)/i,[`Cubot`,2]],[/(umidigi)[-_ ]?([-\w]*)/i,[`UMIDIGI`,2]],[/(oukitel)[-_ ]?([-\w]*)/i,[`Oukitel`,2]],[/(fairphone)[-_ ]?([-\w]*)/i,[`Fairphone`,2]],[/(cat)[-_ ]?([-\w]*)/i,[`Cat`,2]],[/(energy)[-_ ]?([-\w]*)/i,[`Energizer`,2]],[/(land rover)[-_ ]?([-\w]*)/i,[`Land Rover`,2]],[/(shield[\w\-_ ]*)/i,[`Nvidia`,0]],[/(crkey)/i,[`Google`,`Chromecast`]],[/(roku)[\dx]*/i,[`Roku`,0]],[/(apple)[-_ ]?tv/i,[`Apple`,`TV`]],[/(amazon)[-_ ]?tv/i,[`Amazon`,`Fire TV`]],[/(google)[-_ ]?tv/i,[`Google`,`TV`]],[/(smart[\w\-_ ]*tv)/i,[0,`Smart TV`]],[/(playstation[\w\-_ ]*)/i,[`Sony`,0]],[/(nintendo[\w\-_ ]*)/i,[`Nintendo`,0]],[/(xbox[\w\-_ ]*)/i,[`Microsoft`,0]],[/(googlebot)/i,[`Google`,`Bot`]],[/(bingbot)/i,[`Microsoft`,`Bing Bot`]],[/(yandexbot)/i,[`Yandex`,`Bot`]],[/(slackbot)/i,[`Slack`,`Bot`]],[/(twitterbot)/i,[`Twitter`,`Bot`]],[/(facebookbot)/i,[`Facebook`,`Bot`]],[/(linkedinbot)/i,[`LinkedIn`,`Bot`]],[/(tesla)[-_ ]?([-\w]*)/i,[`Tesla`,2]],[/(raspberry[\w\-_ ]*)/i,[`Raspberry Pi`,0]]]){let r=e.match(t);if(r){let e=n[0],t=n[1],i=typeof e==`number`?r[e]===void 0?`Unknown`:this.normalizeVendorName(r[e]):this.normalizeVendorName(e),a=`Unknown`;typeof t==`number`?a=r[t]===void 0?`Unknown`:r[t]:t===void 0?r[1]===void 0?r[0]!==void 0&&(a=r[0]):a=r[1]:a=t,a=this.normalizeModelName(a,i),this.details.vendor=i,this.details.model=a;break}}}catch(e){console.error(`DeviceChecker: device details detection error - `,e)}}normalizeVendorName(e){return e?{apple:`Apple`,samsung:`Samsung`,google:`Google`,xiaomi:`Xiaomi`,huawei:`Huawei`,oneplus:`OnePlus`,oppo:`OPPO`,vivo:`Vivo`,realme:`Realme`,motorola:`Motorola`,sony:`Sony`,lg:`LG`,nokia:`Nokia`,asus:`ASUS`,lenovo:`Lenovo`,amazon:`Amazon`,blackberry:`BlackBerry`,microsoft:`Microsoft`,zte:`ZTE`,htc:`HTC`,alcatel:`Alcatel`,tcl:`TCL`,meizu:`Meizu`,tecno:`Tecno`,infinix:`Infinix`,micromax:`Micromax`,lava:`Lava`,panasonic:`Panasonic`,sharp:`Sharp`,benq:`BenQ`,palm:`Palm`,honor:`Honor`,nvidia:`NVIDIA`,roku:`Roku`}[e.toLowerCase()]||e.charAt(0).toUpperCase()+e.slice(1).toLowerCase():`Unknown`}normalizeModelName(e,t){if(!e||e===`Unknown`)return e;if(e===`0`)return`Unknown`;let n=e.replace(/^build\//i,``).replace(/\s+bui$/i,``).replace(/\)$/,``).replace(/[;,)]/g,``).replace(/\s*\(.*?\)\s*/g,``).trim(),r=t.toLowerCase();return A.arrayIncludes(r,`samsung`)?n=n.replace(/^(sm-|gt-|sgh-|sch-)/i,``):A.arrayIncludes(r,`xiaomi`)?n=n.replace(/^(mi[\s\-_]*|redmi[\s\-_]*)/i,``):A.arrayIncludes(r,`oneplus`)?n=n.replace(/^oneplus[\s\-_]*/i,``):A.arrayIncludes(r,`google`)&&(n=n.replace(/^(pixel[\s\-_]*|nexus[\s\-_]*)/i,``)),n=n.replace(/_/g,` `).replace(/-/g,` `).replace(/\s+/g,` `).trim(),n?(n.length>0&&/^[a-z]/.test(n)&&(n=n.charAt(0).toUpperCase()+n.slice(1)),n):`Unknown`}detectIOSVersion(){try{let e=Ce.getWindow();if(!Ce.isBrowserWindow(e))return;if(this._highEntropyValues.platformVersion){let e=this._highEntropyValues.platformVersion.split(`.`).slice(0,2).join(`.`);this._iosVersion=parseFloat(e);return}if(this._os.version!==`Unknown`){let e=this._os.version.split(`.`),t=e.length>=2?`${e[0]}.${e[1]}`:e[0];this._iosVersion=parseFloat(t);return}let t=e.navigator.userAgent.match(/OS (\d+(_\d+)?)/i);t?.[1]&&(this._iosVersion=parseFloat(t[1].replace(/_/g,`.`)))}catch(e){console.error(`DeviceChecker: iOS version detection error - `,e)}}}var Ee=require(`@vkontakte/videoplayer-shared`);class De{constructor(){i(this,`_maxTouchPoints`,void 0),i(this,`_height`,void 0),i(this,`_width`,void 0),i(this,`_isHdr`,void 0),i(this,`_pixelRatio`,void 0),i(this,`_screenHeight`,void 0),i(this,`_screenWidth`,void 0),i(this,`_colorDepth`,void 0)}get isTouch(){return typeof this._maxTouchPoints==`number`?this._maxTouchPoints>1:`ontouchstart`in Ee.getWindow()}get maxTouchPoints(){return this._maxTouchPoints}get height(){return this._height}get width(){return this._width}get screenHeight(){return this._screenHeight}get screenWidth(){return this._screenWidth}get pixelRatio(){return this._pixelRatio}get isHDR(){return this._isHdr}get colorDepth(){return this._colorDepth}detect(){let e=Ee.getWindow();if(!Ee.isBrowserWindow(e))return;let{navigator:t,screen:n}=e,{maxTouchPoints:r}=t;try{this._maxTouchPoints=r??0,this._isHdr=!!e.matchMedia(`(dynamic-range: high)`)?.matches,this._colorDepth=n.colorDepth}catch(e){console.error(e)}try{this._pixelRatio=e.devicePixelRatio||1,this._height=n.height,this._width=n.width,this._height=n.height,this._screenHeight=this._height*this._pixelRatio,this._screenWidth=this._width*this._pixelRatio}catch(e){console.error(e)}}}var Oe=require(`@vkontakte/videoplayer-shared`),ke=()=>window.ManagedMediaSource||window.MediaSource,Ae=()=>{var e;return!!(window.ManagedMediaSource&&!((e=window.ManagedSourceBuffer)==null||(e=e.prototype)==null)&&e.appendBuffer)},je=()=>{var e;return!!(window.MediaSource&&!((e=window.SourceBuffer)==null||(e=e.prototype)==null)&&e.appendBuffer)},Me=()=>window.ManagedMediaSource?new ManagedMediaSource:new MediaSource,Ne=Oe.getWindow().document?.createElement(`video`),Pe=`video/mp4; codecs="avc1.42000a,mp4a.40.2"`,Fe=`video/mp4; codecs="hev1.1.6.L93.B0"`,Ie=`video/webm; codecs="vp09.00.10.08"`,Le=`video/webm; codecs="av01.0.00M.08"`,Re=`audio/mp4; codecs="mp4a.40.2"`,ze=`audio/webm; codecs="opus"`,Be;(function(){var e=a(function*(){let e=Oe.getWindow();if(!Oe.isBrowserWindow(e)||!(`mediaCapabilities`in e.navigator))return;let t={type:`media-source`,video:{contentType:`video/webm`,width:1280,height:720,bitrate:1e6,framerate:30}},[n,r]=yield Promise.all([e.navigator.mediaCapabilities.decodingInfo(o(o({},t),{},{video:o(o({},t.video),{},{contentType:Le})})),e.navigator.mediaCapabilities.decodingInfo(o(o({},t),{},{video:o(o({},t.video),{},{contentType:Ie})}))]);Be={DASH_WEBM_AV1:n,DASH_WEBM:r}});return function(){return e.apply(this,arguments)}})()().catch(e=>{console.log(Ne),console.error(e)});class Ve{constructor(e,t){i(this,`_video`,void 0),i(this,`_deviceChecker`,void 0),i(this,`_browserChecker`,void 0),i(this,`_protocols`,void 0),i(this,`_containers`,void 0),i(this,`_codecs`,void 0),i(this,`_nativeHlsSupported`,void 0),this._deviceChecker=e,this._browserChecker=t}get protocols(){return this._protocols}get containers(){return this._containers}get codecs(){return this._codecs}get webmDecodingInfo(){return Be}get supportedCodecs(){return Object.keys(this._codecs).filter(e=>this._codecs[e])}get nativeHlsSupported(){return this._nativeHlsSupported}detect(){let e=Oe.getWindow();if(Oe.isBrowserWindow(e)){this._video=e.document.createElement(`video`);try{var t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g;this._protocols={mms:Ae(),mse:je(),hls:!!((t=this._video).canPlayType?.call(t,`application/x-mpegurl`)||(n=this._video).canPlayType?.call(n,`vnd.apple.mpegURL`)),webrtc:!!e.RTCPeerConnection,ws:!!e.WebSocket},this._containers={mp4:!!(r=this._video).canPlayType?.call(r,`video/mp4`),webm:!!(i=this._video).canPlayType?.call(i,`video/webm`),cmaf:!0};let _=!!(!((a=ke())==null||(o=a.isTypeSupported)==null)&&o.call(a,Pe)),v=!!(!((s=ke())==null||(c=s.isTypeSupported)==null)&&c.call(s,Fe)),y=!!(!((l=ke())==null||(u=l.isTypeSupported)==null)&&u.call(l,Re));this._codecs={h264:_,h265:v,vp9:!!(!((d=ke())==null||(f=d.isTypeSupported)==null)&&f.call(d,Ie)),av1:!!(!((p=ke())==null||(m=p.isTypeSupported)==null)&&m.call(p,Le)),aac:y,opus:!!(!((h=ke())==null||(g=h.isTypeSupported)==null)&&g.call(h,ze)),mpeg:(_||v)&&y},this._nativeHlsSupported=this._protocols.hls&&this._containers.mp4}catch(e){console.error(e)}try{this.destroyVideoElement()}catch(e){console.error(`Error destroying video element:`,e)}}}destroyVideoElement(){if(!this._video)return;if(this._video.pause(),this._video.currentTime=0,this._video.removeAttribute(`src`),this._video.src=``,this._video.load(),this._video.remove){this._video.remove(),this._video=null;return}this._video.parentNode&&this._video.parentNode.removeChild(this._video);let e=this._video.cloneNode(!1);this._video.parentNode?.replaceChild(e,this._video),this._video=null}}var He=require(`@vkontakte/videoplayer-shared`),Ue=`audio/mpeg`;class We{constructor(){i(this,`_audio`,void 0),i(this,`_containers`,void 0),i(this,`_codecs`,void 0)}supportMp3(){return this._codecs.mp3&&this._containers.mpeg}detect(){let e=He.getWindow();if(He.isBrowserWindow(e)){this._audio=e.document.createElement(`audio`);try{var t,n,r;this._containers={mpeg:!!(t=this._audio).canPlayType?.call(t,Ue)},this._codecs={mp3:!!(!((n=ke())==null||(r=n.isTypeSupported)==null)&&r.call(n,Ue))}}catch(e){console.error(e)}try{this.destroyAudioElement()}catch(e){console.error(`Error destroying audio element:`,e)}}}destroyAudioElement(){if(!this._audio)return;if(this._audio.pause(),this._audio.currentTime=0,this._audio.removeAttribute(`src`),this._audio.src=``,this._audio.load(),this._audio.remove){this._audio.remove(),this._audio=null;return}this._audio.parentNode&&this._audio.parentNode.removeChild(this._audio);let e=this._audio.cloneNode(!1);this._audio.parentNode?.replaceChild(e,this._audio),this._audio=null}}class Ge{constructor(){i(this,`isInited$`,new ye.ValueSubject(!1)),i(this,`_displayChecker`,void 0),i(this,`_deviceChecker`,void 0),i(this,`_browserChecker`,void 0),i(this,`_videoChecker`,void 0),i(this,`_audioChecker`,void 0),this._displayChecker=new De,this._deviceChecker=new Te(this._displayChecker),this._browserChecker=new Se,this._videoChecker=new Ve(this._deviceChecker,this._browserChecker),this._audioChecker=new We,this.detect()}get display(){return this._displayChecker}get device(){return this._deviceChecker}get browser(){return this._browserChecker}get video(){return this._videoChecker}get audio(){return this._audioChecker}detect(){var e=this;return a(function*(){ye.isBrowserWindow()&&(e._displayChecker.detect(),e._deviceChecker.detect(),e._browserChecker.detect(),e._videoChecker.detect(),e._audioChecker.detect(),e.isInited$.next(!0))})()}}var j=new Ge,Ke=(e,t=!1)=>{let{containers:n,protocols:r,codecs:i,nativeHlsSupported:a}=j.video,{isMobile:o}=j.device,s=j.device.isMac&&j.browser.isSafari,c=t&&!o&&!s,l=(i.h264||i.h265)&&i.aac,u=r.mse||r.mms;return e.filter(e=>{switch(e){case`DASH_SEP`:return u&&n.mp4&&l;case`DASH_WEBM`:return u&&n.webm&&i.vp9&&i.opus;case`DASH_WEBM_AV1`:return u&&n.webm&&i.av1&&i.opus;case`DASH_STREAMS`:return u&&(n.mp4&&l||n.webm&&(i.vp9||i.av1)&&(i.opus||i.aac));case`DASH_LIVE`:return u&&n.mp4&&l;case`DASH_LIVE_CMAF`:return u&&n.mp4&&l&&n.cmaf;case`DASH_ONDEMAND`:return u&&n.mp4&&l;case`HLS`:case`HLS_ONDEMAND`:case`HLS_FMP4`:case`HLS_LIVE`:case`HLS_LIVE_CMAF`:return a&&!c;case`MPEG`:return n.mp4;case`DASH`:case`DASH_LIVE_WEBM`:return!1;case`WEB_RTC_LIVE`:return r.webrtc&&r.ws&&i.h264&&(n.mp4||n.webm);default:return ve.assertNever(e)}})},qe=e=>{switch(e){case`MPEG`:case`DASH`:case`DASH_SEP`:case`DASH_ONDEMAND`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_STREAMS`:case`HLS`:case`HLS_FMP4`:case`HLS_ONDEMAND`:return!1;case`DASH_LIVE`:case`DASH_LIVE_CMAF`:case`HLS_LIVE`:case`HLS_LIVE_CMAF`:case`DASH_LIVE_WEBM`:case`WEB_RTC_LIVE`:return!0;default:return ve.assertNever(e)}},Je=(e,t=!1)=>Ke(Object.keys(e).filter(e=>!qe(e)),t).length>0;class Ye{constructor(e){i(this,`subscription`,new O.Subscription),i(this,`log`,void 0),i(this,`params`,void 0),i(this,`sessionId$`,new O.ValueSubject(null)),i(this,`mediaSessionId$`,new O.ValueSubject(null)),i(this,`contentId$`,new O.ValueSubject(null)),i(this,`progressTicker`,void 0),i(this,`isMobile`,we()),i(this,`mobileVolumeState`,{muted:!1,volume:0}),i(this,`media`,null),i(this,`lastRequestedVolume`,null),i(this,`syncMediaState`,e=>{if(O.isNullable(e))return;this.media=e,this.mediaSessionId$.next(e.mediaSessionId??null);let t=e.media?.contentId;t&&this.contentId$.next(t),this.syncPlaybackState(e);let n=e.media?.duration;O.isNonNullable(n)&&this.params.output.duration$.next(Math.max(0,n));let r=e.currentTime;if(O.isNonNullable(r)){this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.params.output.position$.next(r);let t=this.params.output.isLive$.getValue();e.playerState===`PLAYING`&&!t?this.progressTicker.start(r):this.progressTicker.pause()}}),this.params=e,this.progressTicker=new _e(e),this.log=this.params.dependencies.logger.createComponentLog(`ChromecastPresentationApiProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(qe(e.format)),this.subscribe()}subscribe(){let e=e=>{this.params.output.error$.next({category:O.ErrorCategory.WTF,id:`ChromecastPresentationApiProvider`,message:e?.message??`Unknown error`,thrown:e})};this.subscription.add(this.params.chromecastConnector.message$.pipe(O.filter(e=>!!e)).subscribe(e=>{this.handleMessage(e)},e)),this.subscription.add(this.sessionId$.pipe(O.filter(O.isNonNullable),O.filterChanged(),O.debounce(0)).subscribe(()=>{this.loadMedia()},e));let t=this.contentId$.pipe(O.filterChanged(),O.map(Boolean));this.subscription.add(O.combine({seekState:this.params.desiredState.seekState.stateChangeEnded$,mediaLoaded:t}).pipe(O.filter(({mediaLoaded:e})=>e)).subscribe(()=>{let e=this.params.desiredState.seekState.getState();e.state===`requested`&&this.seek(e.position/1e3)},e));let n=O.combine({playbackState:this.params.desiredState.playbackState.stateChangeStarted$,mediaLoaded:t});this.subscription.add(n.pipe(O.filter(({mediaLoaded:e})=>e),O.debounce(0)).subscribe(()=>{this.syncPlayback()},e)),this.subscription.add(n.pipe(O.filter(({mediaLoaded:e,playbackState:{from:t,to:n}})=>!e&&t===`stopped`&&n===`playing`)).subscribe(()=>{this.loadMedia()},e)),this.subscription.add(O.combine({volumeState:this.params.desiredState.volume.stateChangeStarted$.pipe(O.debounce(30)),mediaLoaded:t}).pipe(O.filter(({mediaLoaded:e})=>e)).subscribe(({volumeState:e})=>{let{muted:t,volume:n}=e.to;this.setVolume(n,t)},e))}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:{var t;this.sessionId$.next(e.message.sessionId);let n=(t=e.message)==null||(t=t.media)==null?void 0:t[0];this.syncMediaState(n);let r=e.message?.receiver.volume;this.syncVolumeState(r)}break;case`v2_message`:switch(e.message?.type){case`MEDIA_STATUS`:{var n;let t=(n=e.message)==null||(n=n.status)==null?void 0:n[0];this.syncMediaState(t);break}}break}}loadMedia(){let e=fe(this.params),t=this.media?.currentTime,n=this.params.desiredState.seekState.getState(),r=t??(n.state===`none`?0:n.position/1e3),i=this.params.desiredState.playbackState.getState()===`playing`;this.params.chromecastConnector.sendV2Message({type:`LOAD`,requestId:0,media:e,autoplay:i,currentTime:r,customData:null,activeTrackIds:null}),this.params.output.willSeekEvent$.next()}stop(){this.params.chromecastConnector.stopMedia()}play(){let e=this.mediaSessionId$.getValue();O.assertNonNullable(e,`play on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PLAY`,mediaSessionId:e,customData:null})}pause(){let e=this.mediaSessionId$.getValue();O.assertNonNullable(e,`pause on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`PAUSE`,mediaSessionId:e,customData:null})}seek(e){let t=this.mediaSessionId$.getValue();O.assertNonNullable(t,`seek on null mediaSessionId`),this.params.chromecastConnector.sendV2Message({type:`SEEK`,currentTime:e,mediaSessionId:t}),this.params.output.willSeekEvent$.next()}setVolume(e,t){let n=e,r=`[setVolume] volume: ${e}, muted: ${t}`;this.isMobile&&(n=this.mobileVolumeState.volume,r+=`, mobile next volume: ${n}`),this.log({message:r}),this.lastRequestedVolume={volume:n,muted:t},this.params.chromecastConnector.sendV2Message({type:`SET_VOLUME`,requestId:0,volume:{level:t?0:n,muted:t?!0:null}})}syncPlaybackState({playerState:e,idleReason:t}){let n=this.params.output.isBuffering$.getValue(),r=e===`BUFFERING`;switch(n!==r&&this.params.output.isBuffering$.next(r),e){case`PAUSED`:k(this.params.desiredState.playbackState,`paused`);break;case`PLAYING`:k(this.params.desiredState.playbackState,`playing`);break;case`IDLE`:t===`FINISHED`?(this.params.output.endedEvent$.next(),k(this.params.desiredState.playbackState,`stopped`),this.contentId$.next(null)):k(this.params.desiredState.playbackState,`ready`);break;case`BUFFERING`:break}}syncPlayback(){let e=this.params.desiredState.playbackState.getState();switch(this.log({message:`[syncPlayback] ${e}`}),e){case`ready`:break;case`playing`:this.play();break;case`paused`:this.pause();break;case`stopped`:this.stop();break}}syncVolumeState(e){if(O.isNullable(e))return;let{level:t,muted:n}=e,r={muted:n??!1,volume:t??0};this.lastRequestedVolume&&=(n&&(r.volume=this.lastRequestedVolume.volume),this.lastRequestedVolume.muted&&!t&&!n&&(r.volume=this.lastRequestedVolume.volume,r.muted=!0),null);let i=`[syncVolumeState] volume: ${r.volume}, muted: ${r.muted}`;this.isMobile&&(this.mobileVolumeState.volume=r.volume,this.mobileVolumeState.muted=r.muted,r.volume=this.params.output.volume$.getValue().volume,i+=`, volume passed to state machine: ${r.volume}`),this.log({message:i}),this.params.output.volume$.next(r)}destroy(){this.progressTicker.destroy(),this.subscription.unsubscribe()}}var M=require(`@vkontakte/videoplayer-shared`),Xe=e=>({castDevice:{friendlyName:e},remotePlayer:{},remotePlayerController:{},session:{}}),Ze=()=>String(Date.now())+String(Math.floor(Math.random()*1e5));class Qe{constructor(e){i(this,`params`,void 0),i(this,`clientId`,void 0),i(this,`capabilities`,[`WEB`]),i(this,`presentationRequest$`,new M.ValueSubject(null)),i(this,`log`,void 0),i(this,`sessionId$`,new M.ValueSubject(null)),i(this,`broadcastChannel`,new BroadcastChannel(`vk_player_chromecast_events`)),i(this,`subscription`,new M.Subscription),i(this,`subscriptionEvents`,new M.Subscription),i(this,`isDestroyed`,!1),i(this,`sequenceNumber`,0),i(this,`presentationAvailable$`,new M.ValueSubject(!1)),i(this,`presentationConnection$`,new M.ValueSubject(null)),i(this,`message$`,new M.ValueSubject(null)),i(this,`friendlyName$`,new M.ValueSubject(null)),i(this,`errorEvent$`,new M.Subject),this.clientId=this.getClientId(),this.params=e,this.log=e.logger.createComponentLog(`ChromecastPresentationApiConnector`),this.log({message:`constructor`}),this.safeReinitPresentation(),this.subscribe()}destroy(){this.log({message:`destroy`}),this.subscription.unsubscribe(),this.subscriptionEvents.unsubscribe(),this.broadcastChannel.close(),this.isDestroyed=!0}disconnect(e=!0){this.log({message:`disconnect`}),e&&this.stopMedia(),this.presentationRequest$.next(null);let t=this.presentationConnection$.getValue();t&&t.close(),this.presentationConnection$.next(null),this.friendlyName$.next(null),this.resetSequenceNumber(),this.resetSubscriptionEvents()}stopMedia(){this.log({message:`stopMedia`}),this.sendV2Message({type:`STOP`})}reinitPresentation(e=!0){let t=this.createCastUrl(),n=new PresentationRequest(t);this.presentationRequest$.next(n),this.log({message:`PresentationRequest created`}),n.getAvailability().then(e=>{let t=()=>{this.log({message:`PresentationRequest presentation availability: ${e.value}`}),this.presentationAvailable$.next(e.value)};this.subscriptionEvents.add(M.fromEvent(e,`change`).subscribe(()=>{t()})),t()}).catch(()=>{this.presentationAvailable$.next(!0)}),M.getWindow().navigator.presentation.defaultRequest=n,e&&n.reconnect(`auto-join`).then(e=>{this.log({message:`PresentationRequest reconnect success`}),this.handleConnection(e)}).catch(()=>{this.log({message:`PresentationRequest reconnect failed`})})}safeReinitPresentation(e){try{this.reinitPresentation(e)}catch(e){this.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:e?.message??`reinitPresentation error`,thrown:e})}}connect(){var e=this;return a(function*(){e.log({message:`connect`});try{e.presentationRequest$.getValue()||(e.log({message:`reinitPresentation`}),e.reinitPresentation(!1));let t=e.presentationRequest$.getValue();M.assertNonNullable(t,`connect with null presentationRequest`);let n=yield t.start();e.handleConnection(n)}catch(t){switch(t?.name){case`AbortError`:case`NotAllowedError`:break;default:e.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:t?.message??`connect error`,thrown:t});break}}})()}subscribe(){this.subscription.add(M.fromEvent(this.broadcastChannel,`message`).subscribe(e=>{this.log({message:`broadcast connection data: ${e.data}`}),e.data===`connection`&&this.disconnect(!1)})),this.subscription.add(this.presentationAvailable$.subscribe(e=>{this.log({message:`presentationAvailable$: ${e}`})})),this.subscription.add(this.presentationConnection$.pipe(M.tap(e=>{this.log({message:`presentationConnection$: ${!!e}`})}),M.filter(e=>!!e)).subscribe(e=>{let t=M.fromEvent(e,`message`).subscribe(e=>{let t=JSON.parse(e.data);t.clientId===this.clientId&&(this.log({message:`[onmessage] ${e.data}`}),this.handleMessage(t),this.message$.next(t))}),n=M.fromEvent(e,`connect`).subscribe(()=>{this.send(`client_connect`)}),r=M.fromEvent(e,`close`).subscribe(e=>{switch(e.reason){case`error`:this.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:`Session error`,thrown:e});break;case`closed`:break}});this.subscriptionEvents.add(t),this.subscriptionEvents.add(n),this.subscriptionEvents.add(r)}))}send(e){switch(e){case`client_connect`:{let e={type:`client_connect`,message:this.clientId,sequenceNumber:-1,timeoutMillis:0,clientId:this.clientId};this.safeSend(JSON.stringify(e));break}}}sendV2Message(e){let t=this.sessionId$.getValue();if(t){let n={type:`v2_message`,sequenceNumber:this.getSequenceNumber(),timeoutMillis:0,clientId:this.clientId,message:o(o({},e),{},{sessionId:t})};this.safeSend(JSON.stringify(n))}}safeSend(e){try{this.log({message:`[send] ${e}`});let t=this.presentationConnection$.getValue();t?.state===`connected`&&t?.send(e)}catch(t){this.errorEvent$.next({category:M.ErrorCategory.WTF,id:`ChromecastPresentationApiConnector`,message:`PresentationConnection send error`,data:{message:e},thrown:t})}}handleMessage(e){switch(e.type){case`new_session`:case`update_session`:this.sessionId$.next(e.message.sessionId),this.friendlyName$.next(e.message.receiver.friendlyName||`Chromecast Device`);break;case`receiver_action`:e.message?.action===`stop`&&this.disconnect();break}}createCastUrl(){return`cast:${this.params.appId}?clientId=${this.clientId}&autoJoinPolicy=tab_and_origin_scoped&defaultActionPolicy=create_session&launchTimeout=60000&supportedAppTypes=${this.capabilities}&appParams=%7B%22launchCheckerParams%22%3A%7B%7D%7D`}getSequenceNumber(){let e=this.sequenceNumber;return this.sequenceNumber=(this.sequenceNumber+1)%(2**53-1),e}resetSequenceNumber(){this.sequenceNumber=0}getClientId(){let e=`__vk_player_chromecast_id`;return M.getWindow()[e]=M.getWindow()[e]||Ze()}resetSubscriptionEvents(){this.subscriptionEvents.unsubscribe(),this.subscriptionEvents=new M.Subscription}handleConnection(e){this.log({message:`connection available`}),this.isDestroyed?(this.log({message:`connected on already destroyed component`}),e.close()):(this.broadcastChannel.postMessage(`connection`),this.presentationConnection$.next(e))}}var $e=require(`@vkontakte/videoplayer-shared`);class et{static isSupported(){return`chrome`in window&&`presentation`in navigator&&`BroadcastChannel`in window}constructor(e){i(this,`subscription`,new $e.Subscription),i(this,`log`,void 0),i(this,`contentId`,void 0),i(this,`connection$`,new $e.ValueSubject(void 0)),i(this,`castState$`,new $e.ValueSubject(`NOT_AVAILABLE`)),i(this,`errorEvent$`,new $e.Subject),i(this,`chromecastConnector`,void 0);let t=et.isSupported();this.log=e.dependencies.logger.createComponentLog(`ChromecastPresentationApiInitializer`),this.log({message:`[constructor] receiverApplicationId: ${e.receiverApplicationId}, isDisabled: ${e.isDisabled}, isSupported: ${t}`}),!(!t||e.isDisabled||!e.receiverApplicationId)&&(this.chromecastConnector=new Qe({appId:e.receiverApplicationId,logger:e.dependencies.logger}),this.subscribe())}subscribe(){$e.assertNonNullable(this.chromecastConnector,`subscribe with null chromecastConnector`),this.subscription.add(this.chromecastConnector.errorEvent$.subscribe(this.errorEvent$));let e=$e.combine({connection:this.chromecastConnector.presentationConnection$,available:this.chromecastConnector.presentationAvailable$,friendlyName:this.chromecastConnector.friendlyName$.pipe($e.filterChanged())});this.subscription.add(e.pipe($e.map(({connection:e,friendlyName:t})=>!!(e&&t)),$e.filterChanged()).subscribe(e=>{let t=this.chromecastConnector?.friendlyName$.getValue()??``;this.connection$.next(e?Xe(t):void 0)})).add(e.subscribe(({available:e,connection:t})=>{e?t?this.castState$.next(`CONNECTED`):this.castState$.next(`AVAILABLE`):this.castState$.next(`NOT_AVAILABLE`)}))}connect(){this.log({message:`connect`}),this.chromecastConnector?.connect()}disconnect(){this.log({message:`disconnect`}),this.chromecastConnector?.disconnect()}stopMedia(){var e=this;return a(function*(){e.log({message:`stopMedia`}),e.chromecastConnector?.stopMedia()})()}toggleConnection(){let e=!!this.chromecastConnector?.presentationConnection$.getValue();this.log({message:`toggleConnection: isConnected - ${e}`}),e?this.disconnect():this.connect()}setVolume(e){}setMuted(e){}destroy(){this.log({message:`destroy`}),this.chromecastConnector?.destroy(),this.subscription.unsubscribe()}}var tt=require(`@vkontakte/videoplayer-shared`),nt=require(`@vkontakte/videoplayer-shared`),rt=require(`@vkontakte/videoplayer-shared`),it=require(`@vkontakte/videoplayer-shared`),at=require(`@vkontakte/videoplayer-shared`);require(`@vkontakte/videoplayer-shared`);var ot=(e,t)=>e===t;class st{constructor(e,t=ot){i(this,`comparator`,void 0),i(this,`state`,void 0),i(this,`prevState`,void 0),i(this,`transition`,void 0),i(this,`transitionStarted$`,new at.Subject),i(this,`transitionEnded$`,new at.Subject),i(this,`transitionUpdated$`,new at.Subject),i(this,`forceChanged$`,new at.Subject),i(this,`stateChangeStarted$`,at.merge(this.transitionStarted$,this.transitionUpdated$)),i(this,`stateChangeEnded$`,at.merge(this.transitionEnded$,this.forceChanged$)),this.comparator=t,this.state=e,this.prevState=void 0}setState(e){let t=this.transition,n=this.state;this.transition=void 0,this.prevState=n,this.state=e,t?this.comparator(t.to,e)?this.transitionEnded$.next(t):this.forceChanged$.next({from:t.from,to:e,canceledTransition:t}):this.forceChanged$.next({from:n,to:e,canceledTransition:t})}startTransitionTo(e){let t=this.transition,n=this.state;this.comparator(n,e)||at.isNonNullable(t)&&this.comparator(t.to,e)||(this.prevState=n,this.state=e,t?(this.transition={from:t.from,to:e,canceledTransition:t},this.transitionUpdated$.next(this.transition)):(this.transition={from:n,to:e},this.transitionStarted$.next(this.transition)))}getTransition(){return this.transition}getState(){return this.state}getPrevState(){return this.prevState}}var N=require(`@vkontakte/videoplayer-shared`),ct=5,lt=5,ut=500,dt=7e3;class ft{constructor(e){i(this,`subscription`,new N.Subscription),i(this,`loadMediaTimeoutSubscription`,new N.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`params`,void 0),i(this,`log`,void 0),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.videoState.getTransition(),n=this.params.desiredState.playbackState.getState(),r=this.params.desiredState.playbackState.getTransition(),i=this.params.desiredState.seekState.getState();if(this.log({message:`[syncPlayback] videoState: ${e}; videoTransition: ${JSON.stringify(t)}; desiredPlaybackState: ${n}; desiredPlaybackStateTransition: ${this.params.desiredState.playbackState.getTransition()}; seekState: ${JSON.stringify(i)};`}),n===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.stop());return}if(!t){if(r?.to!==`paused`&&i.state===`requested`&&e!==`stopped`){this.seek(i.position/1e3);return}switch(n){case`ready`:switch(e){case`playing`:case`paused`:case`ready`:break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:N.assertNever(e)}break;case`playing`:switch(e){case`playing`:break;case`paused`:this.videoState.startTransitionTo(`playing`),this.params.connection.remotePlayerController.playOrPause();break;case`ready`:this.videoState.startTransitionTo(`playing`),this.params.connection.remotePlayerController.playOrPause();break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:N.assertNever(e)}break;case`paused`:switch(e){case`playing`:this.videoState.startTransitionTo(`paused`),this.params.connection.remotePlayerController.playOrPause();break;case`paused`:break;case`ready`:this.videoState.startTransitionTo(`paused`),this.videoState.setState(`paused`);break;case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();break;default:N.assertNever(e)}break;default:N.assertNever(n)}}}),this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`ChromecastProvider`),this.log({message:`constructor, format: ${e.format}`}),this.params.output.isLive$.next(qe(e.format)),this.params.output.isAudioAvailable$.next(!0),this.handleRemoteVolumeChange({volume:this.params.connection.remotePlayer.volumeLevel,muted:this.params.connection.remotePlayer.isMuted});let t=this.params.connection.session.getMediaSession();t&&this.restoreSession(t),this.subscribe()}destroy(){this.log({message:`[destroy]`}),this.subscription.unsubscribe()}subscribe(){this.subscription.add(this.loadMediaTimeoutSubscription);let e=new N.Subscription;this.subscription.add(e),this.subscription.add(N.merge(this.videoState.stateChangeStarted$.pipe(N.map(e=>`stateChangeStarted$ ${JSON.stringify(e)}`)),this.videoState.stateChangeEnded$.pipe(N.map(e=>`stateChangeEnded$ ${JSON.stringify(e)}`))).subscribe(e=>this.log({message:`[videoState] ${e}`})));let t=(e,t)=>this.subscription.add(e.subscribe(t));if(this.params.output.isLive$.getValue())this.params.output.position$.next(0),this.params.output.duration$.next(0);else{let t=new N.Subject;e.add(t.pipe(N.debounce(ut)).subscribe(()=>{this.params.output.seekedEvent$.next()}));let n=NaN;e.add(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED).subscribe(e=>{this.logRemoteEvent(e);let r=e.value;this.params.output.position$.next(r),(this.params.desiredState.seekState.getState().state===`applying`||Math.abs(r-n)>ct)&&t.next(r),n=r})),e.add(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.DURATION_CHANGED).subscribe(e=>{this.logRemoteEvent(e),this.params.output.duration$.next(e.value)}))}t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED),t=>{this.logRemoteEvent(t),t.value?this.handleRemoteReady():(this.handleRemoteStop(),e.unsubscribe())}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED),e=>{this.logRemoteEvent(e),e.value?this.handleRemotePause():this.handleRemotePlay()}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.PLAYER_STATE_CHANGED),e=>{this.logRemoteEvent(e);let{remotePlayer:t}=this.params.connection,n=e.value,r=this.params.output.isBuffering$.getValue(),i=n===chrome.cast.media.PlayerState.BUFFERING;switch(r!==i&&this.params.output.isBuffering$.next(i),n){case chrome.cast.media.PlayerState.IDLE:!this.params.output.isLive$.getValue()&&t.duration-t.currentTime<lt&&this.params.output.endedEvent$.next(),this.handleRemoteStop(),k(this.params.desiredState.playbackState,`stopped`);break;case chrome.cast.media.PlayerState.PAUSED:this.handleRemotePause();break;case chrome.cast.media.PlayerState.PLAYING:this.handleRemotePlay();break;case chrome.cast.media.PlayerState.BUFFERING:break;default:N.assertNever(n)}}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({volume:e.value})}),t(N.fromEvent(this.params.connection.remotePlayerController,cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED),e=>{this.logRemoteEvent(e),this.handleRemoteVolumeChange({muted:e.value})}),t(N.merge(this.params.desiredState.playbackState.stateChangeStarted$,this.params.desiredState.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,N.observableFrom([`init`])).pipe(N.debounce(0)),this.syncPlayback)}restoreSession(e){this.log({message:`restoreSession`});let{remotePlayer:t}=this.params.connection;if(e.playerState!==chrome.cast.media.PlayerState.IDLE){t.isPaused?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):(this.videoState.setState(`playing`),k(this.params.desiredState.playbackState,`playing`));let e=this.params.output.isLive$.getValue();this.params.output.duration$.next(e?0:t.duration),this.params.output.position$.next(e?0:t.currentTime),this.params.desiredState.seekState.setState({state:`none`})}}prepare(){let e=this.params.format;this.log({message:`[prepare] format: ${e}`});let t=fe(this.params),n=this.createLoadRequest(t);this.loadMedia(n)}handleRemotePause(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`paused`||e===`playing`)&&(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`))}handleRemotePlay(){let e=this.videoState.getState();(this.videoState.getTransition()?.to===`playing`||e===`paused`)&&(this.videoState.setState(`playing`),k(this.params.desiredState.playbackState,`playing`))}handleRemoteReady(){this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.params.desiredState.playbackState.getTransition()?.to===`ready`&&k(this.params.desiredState.playbackState,`ready`)}handleRemoteStop(){this.videoState.getState()!==`stopped`&&this.videoState.setState(`stopped`)}handleRemoteVolumeChange(e){let t=this.params.output.volume$.getValue(),n={volume:e.volume??t.volume,muted:e.muted??t.muted};(n.volume!==t.volume||n.muted!==n.muted)&&this.params.output.volume$.next(n)}seek(e){this.params.output.willSeekEvent$.next();let{remotePlayer:t,remotePlayerController:n}=this.params.connection;t.currentTime=e,n.seek()}stop(){let{remotePlayerController:e}=this.params.connection;e.stop()}createLoadRequest(e){let t=new chrome.cast.media.LoadRequest(e);t.autoplay=!1;let n=this.params.desiredState.seekState.getState();return n.state===`applying`||n.state===`requested`?t.currentTime=this.params.output.isLive$.getValue()?0:n.position/1e3:t.currentTime=0,t}loadMedia(e){let t=this.params.connection.session.loadMedia(e),n=new Promise((e,t)=>{this.loadMediaTimeoutSubscription.add(N.timeout(dt).subscribe(()=>t(`timeout(${dt})`)))});it.promiseFinally(Promise.race([t,n]).then(()=>{this.log({message:`[loadMedia] completed, format: ${this.params.format}`}),this.params.desiredState.seekState.getState().state===`applying`&&this.params.output.seekedEvent$.next(),this.handleRemoteReady()},e=>{let t=`[prepare] loadMedia failed, format: ${this.params.format}, reason: ${e}`;this.log({message:t}),this.params.output.error$.next({id:`ChromecastProvider.loadMedia`,category:N.ErrorCategory.VIDEO_PIPELINE,message:t,thrown:e})}),()=>{this.loadMediaTimeoutSubscription.unsubscribe()})}logRemoteEvent(e){this.log({message:`[remoteEvent] ${JSON.stringify(e)}`})}}var pt=require(`@vkontakte/videoplayer-shared`),mt=require(`@vkontakte/videoplayer-shared`),ht=require(`@vkontakte/videoplayer-shared`),gt=(e,t)=>{try{e.pause(),e.playbackRate=0,ht.clearVideoElement(e,t),e.remove()}catch(e){console.error(e)}},_t=`__spvc`;class vt{constructor(){i(this,`attribute`,`data-pool-reused`)}get(e){return e.hasAttribute(this.attribute)}set(e,t){e.toggleAttribute(this.attribute,t)}delete(e){e.removeAttribute(this.attribute)}}var yt=mt.getWindow(),bt=yt.WeakMap?new yt.WeakMap:new vt,xt=yt.WeakMap?new yt.WeakMap:new Map,St=(e,t=20)=>{let n=0;return mt.fromEvent(e,`ratechange`).subscribe(r=>{n++,n>=t&&(e.currentTime=e.currentTime,n=0)})};function Ct(e){e.style.position=`fixed`,e.style.left=`100%`,e.setAttribute(`data-role`,`screen`),mt.getWindow().document.body.appendChild(e)}function wt(e,t){e.style.position=``,e.style.left=``,t.appendChild(e)}var Tt=(e,{audioVideoSyncRate:t,disableYandexPiP:n,clearVideoElementInnerHTML:r,reuseOwnVideoElement:i})=>{let a,o=e.querySelector(`video`),s=!!o,c=mt.getWindow().document.querySelector(`body > video[data-role=screen]`)||void 0;i?yt[_t]=c:(c?.remove(),delete yt[_t]),o?(a=o,mt.clearVideoElement(a,r)):c&&c===yt[_t]?(a=c,wt(a,e)):(a=mt.getWindow().document.createElement(`video`),e.appendChild(a),i&&(yt[_t]=a)),bt.set(a,s);let l=new mt.Subscription;return l.add(St(a,t)),xt.set(a,l),a.setAttribute(`crossorigin`,`anonymous`),a.setAttribute(`playsinline`,`playsinline`),n&&a.setAttribute(`x-yandex-pip`,`false`),a.controls=!1,a.setAttribute(`poster`,`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=`),a},Et=e=>(e.setAttribute(`crossorigin`,`anonymous`),e.controls=!1,e),Dt=(e,t)=>{if(e instanceof HTMLAudioElement){gt(e,!0);return}if(e instanceof HTMLVideoElement){Ot(e,t);return}};function Ot(e,{keepVideoElement:t,clearVideoElementInnerHTML:n,reuseOwnVideoElement:r}){xt.get(e)?.unsubscribe(),xt.delete(e);let i=bt.get(e);bt.delete(e),i||t?mt.clearVideoElement(e,n):r?(mt.clearVideoElement(e,n),Ct(e)):gt(e,n)}var kt=require(`@vkontakte/videoplayer-shared`),At=require(`@vkontakte/videoplayer-shared`),P=require(`@vkontakte/videoplayer-shared`),jt=require(`@vkontakte/videoplayer-shared`),Mt=(e,t,n,{equal:r=(e,t)=>e===t,changed$:i,onError:a}={})=>{let o=e.getState(),s=t(),c=jt.isNullable(i),l=new jt.Subscription;return i&&l.add(i.subscribe(t=>{r(t,e.getState())&&e.setState(t)},a)),r(s,o)||(n(o),c&&e.setState(o)),l.add(e.stateChangeStarted$.subscribe(t=>{n(t.to),c&&e.setState(t.to)},a)),l},Nt=(e,t,n)=>Mt(t,()=>e.loop,t=>{jt.isNonNullable(t)&&(e.loop=t)},{onError:n}),Pt=(e,t,n,r,i)=>Mt(t,()=>({muted:e.muted,volume:e.volume}),t=>{i?.skipVideoElVolumeSync$.getValue()||jt.isNonNullable(t)&&(e.muted=t.muted,e.volume=t.volume)},{equal:(e,t)=>e===t||e?.muted===t?.muted&&e?.volume===t?.volume,changed$:n,onError:r}),Ft=(e,t,n,r)=>Mt(t,()=>e.playbackRate,t=>{jt.isNonNullable(t)&&(e.playbackRate=t)},{changed$:n,onError:r}),It=Mt,Lt=e=>[`__`,e.language,e.label].join(`|`),Rt=(e,t)=>{if(e.id===t)return!0;let[n,r,i]=t.split(`|`);return e.language===r&&e.label===i};class zt{constructor(e){i(this,`available$`,new P.Subject),i(this,`current$`,new P.ValueSubject(void 0)),i(this,`error$`,new P.Subject),i(this,`video`,void 0),i(this,`cueSettings`,void 0),i(this,`subscription`,new P.Subscription),i(this,`externalTracks`,new Map),i(this,`internalTracks`,new Map),i(this,`baseURL`,void 0),this.baseURL=e}connect(e,t,n){this.video=e,this.cueSettings=t.textTrackCuesSettings,this.subscribe();let r=e=>{this.error$.next({id:`TextTracksManager`,category:P.ErrorCategory.WTF,message:`Generic HtmlVideoTextTrackManager error`,thrown:e})};this.subscription.add(this.available$.subscribe(n.availableTextTracks$)),this.subscription.add(this.current$.subscribe(n.currentTextTrack$)),this.subscription.add(this.error$.subscribe(n.error$)),this.subscription.add(It(t.internalTextTracks,()=>kt.objectValues(this.internalTracks),e=>{P.isNonNullable(e)&&this.setInternal(e)},{equal:(e,t)=>P.isNonNullable(e)&&P.isNonNullable(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(P.map(e=>e.filter(({type:e})=>e===`internal`))),onError:r})),this.subscription.add(It(t.externalTextTracks,()=>kt.objectValues(this.externalTracks),e=>{P.isNonNullable(e)&&this.setExternal(e)},{equal:(e,t)=>P.isNonNullable(e)&&P.isNonNullable(t)&&e.length===t.length&&e.every(({id:e},n)=>e===t[n].id),changed$:this.available$.pipe(P.map(e=>e.filter(({type:e})=>e===`external`))),onError:r})),this.subscription.add(It(t.currentTextTrack,()=>{if(this.video)return;let e=this.htmlTextTracksAsArray().find(({mode:e})=>e===`showing`);return e&&this.htmlTextTrackToITextTrack(e).id},e=>this.select(e),{changed$:this.current$,onError:r})),this.subscription.add(It(t.textTrackCuesSettings,()=>({}),()=>{if(this.video)for(let e of this.htmlTextTracksAsArray())this.applyCueSettings(e.cues),this.applyCueSettings(e.activeCues)}))}subscribe(){P.assertNonNullable(this.video);let{textTracks:e}=this.video;this.subscription.add(P.fromEvent(e,`addtrack`).subscribe(()=>{let e=this.current$.getValue();e&&this.select(e)})),this.subscription.add(P.merge(P.fromEvent(e,`addtrack`),P.fromEvent(e,`removetrack`),P.observableFrom([`init`])).pipe(P.map(()=>this.htmlTextTracksAsArray().map(e=>this.htmlTextTrackToITextTrack(e))),P.filterChanged((e,t)=>e.length===t.length&&e.every(({id:e},n)=>e===t[n].id))).subscribe(this.available$)),this.subscription.add(P.merge(P.fromEvent(e,`change`),P.observableFrom([`init`])).pipe(P.map(()=>this.htmlTextTracksAsArray().find(({mode:e})=>e===`showing`)),P.map(e=>e&&this.htmlTextTrackToITextTrack(e).id),P.filterChanged()).subscribe(this.current$));let t=e=>this.applyCueSettings(e.target?.activeCues??null);this.subscription.add(P.fromEvent(e,`addtrack`).subscribe(e=>{e.track?.addEventListener(`cuechange`,t);let n=e=>{let t=e.target?.cues??null;t&&t.length&&(this.applyCueSettings(e.target?.cues??null),e.target?.removeEventListener(`cuechange`,n))};e.track?.addEventListener(`cuechange`,n)})),this.subscription.add(P.fromEvent(e,`removetrack`).subscribe(e=>{e.track?.removeEventListener(`cuechange`,t)}))}applyCueSettings(e){if(!e||!e.length)return;let t=this.cueSettings.getState();for(let n of Array.from(e)){let e=n;P.isNonNullable(t.align)&&(e.align=t.align),P.isNonNullable(t.position)&&(e.position=t.position),P.isNonNullable(t.size)&&(e.size=t.size),P.isNonNullable(t.line)&&(e.line=t.line)}}htmlTextTracksAsArray(e=!1){P.assertNonNullable(this.video);let t=[...this.video.textTracks];return e?t:t.filter(zt.isHealthyTrack)}htmlTextTrackToITextTrack(e){let{language:t,label:n}=e,r=e.id?e.id:Lt(e),i=this.externalTracks.has(r),a=(i?this.externalTracks.get(r)?.isAuto:this.internalTracks.get(r)?.isAuto)??At.arrayIncludes(r,`auto`);return i?{id:r,type:`external`,isAuto:a,language:t,label:n,url:this.externalTracks.get(r)?.url}:{id:r,type:`internal`,isAuto:a,language:t,label:n,url:this.internalTracks.get(r)?.url}}static isHealthyTrack(e){return!(e.kind===`metadata`||e.groupId||e.id===``&&e.label===``&&e.language===``)}setExternal(e){this.internalTracks.size>0&&Array.from(this.internalTracks).forEach(([,e])=>this.detach(e)),e.filter(({id:e})=>!this.externalTracks.has(e)).forEach(e=>this.attach(e)),Array.from(this.externalTracks).filter(([t])=>!e.find(e=>e.id===t)).forEach(([,e])=>this.detach(e))}setInternal(e){let t=[...this.externalTracks];e.filter(({id:e,language:n,isAuto:r})=>!this.internalTracks.has(e)&&!t.some(([,e])=>e.language===n&&e.isAuto===r)).forEach(e=>this.attach(e)),Array.from(this.internalTracks).filter(([t])=>!e.find(e=>e.id===t)).forEach(([,e])=>this.detach(e))}select(e){P.assertNonNullable(this.video);for(let e of this.htmlTextTracksAsArray(!0))e.mode=`showing`;for(let t of this.htmlTextTracksAsArray(!0))(P.isNullable(e)||!Rt(t,e))&&(t.mode=`disabled`)}destroy(){if(this.subscription.unsubscribe(),this.video)for(let e of Array.from(this.video.getElementsByTagName(`track`))){let t=e.getAttribute(`id`);t&&this.externalTracks.has(t)&&this.video.removeChild(e)}this.externalTracks.clear()}attach(e){P.assertNonNullable(this.video);let t=document.createElement(`track`);this.baseURL?t.setAttribute(`src`,new URL(e.url,this.baseURL).toString()):t.setAttribute(`src`,e.url),t.setAttribute(`id`,e.id),e.label&&t.setAttribute(`label`,e.label),e.language&&t.setAttribute(`srclang`,e.language),e.type===`external`?this.externalTracks.set(e.id,e):e.type===`internal`&&this.internalTracks.set(e.id,e),this.video.appendChild(t)}detach(e){P.assertNonNullable(this.video);let t=Array.prototype.find.call(this.video.getElementsByTagName(`track`),t=>t.getAttribute(`id`)===e.id);t&&this.video.removeChild(t),e.type===`external`?this.externalTracks.delete(e.id):e.type===`internal`&&this.internalTracks.delete(e.id)}}var Bt=zt;class Vt{constructor(){i(this,`pausedTime`,0),i(this,`streamOffset`,0),i(this,`pauseTimestamp`,0)}getTotalPausedTime(){return this.pausedTime+this.getCurrentPausedTime()}getCurrentPausedTime(){return this.pauseTimestamp>0?Date.now()-this.pauseTimestamp:0}getStreamOffset(){return this.streamOffset}getTotalOffset(){return this.getTotalPausedTime()+this.streamOffset}pause(){this.pauseTimestamp===0&&(this.pauseTimestamp=Date.now())}resume(){this.pauseTimestamp>0&&(this.pausedTime+=this.getCurrentPausedTime(),this.pauseTimestamp=0)}resetTo(e,t=!1){this.streamOffset=e,this.pauseTimestamp=0,this.pausedTime=0,t&&this.pause()}}var Ht=e=>{let t=e;for(;!(t instanceof Document)&&!(t instanceof ShadowRoot)&&t!==null;)t=t?.parentNode;return t??void 0},Ut=e=>{let t=Ht(e);return!!(t&&t.fullscreenElement&&t.fullscreenElement===e)},Wt=e=>{let t=Ht(e);return!!(t&&t.pictureInPictureElement&&t.pictureInPictureElement===e)},F=require(`@vkontakte/videoplayer-shared`),Gt=3,Kt=(e,t,n=Gt)=>{let r=0,i=0;for(let a=0;a<e.length;a++){let o=e.start(a),s=e.end(a);if(o<=t&&t<=s){if(r=o,i=s,!n)return{from:r,to:i};for(let t=a-1;t>=0;t--)e.end(t)+n>=r&&(r=e.start(t));for(let t=a+1;t<e.length;t++)e.start(t)-n<=i&&(i=e.end(t))}}return{from:r,to:i}},qt=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t},Jt=e=>{let t=t=>F.fromEvent(e,t).pipe(F.mapTo(void 0),F.shareReplay(1)),n=new F.Subscription,r=()=>n.unsubscribe(),i=F.merge(F.fromEvent(e,`progress`),F.fromEvent(e,`timeupdate`)).pipe(F.map(()=>Kt(e.buffered,e.currentTime)),F.shareReplay(1)),a=j.browser.isSafari?F.combine({play:t(`play`).pipe(F.once()),playing:t(`playing`)}).pipe(F.mapTo(void 0),F.shareReplay(1)):t(`playing`),o=F.fromEvent(e,`volumechange`).pipe(F.map(()=>({muted:e.muted,volume:e.volume})),F.shareReplay(1)),s=F.fromEvent(e,`ratechange`).pipe(F.map(()=>e.playbackRate),F.shareReplay(1)),c=F.fromEvent(e,`error`).pipe(F.filter(()=>!!(e.error||e.played.length)),F.map(()=>{let t=e.error;return{id:t?`MediaError#${t.code}`:`HtmlVideoError`,category:F.ErrorCategory.VIDEO_PIPELINE,message:t?t.message:`Error event from HTML video element`,thrown:e.error??void 0}}),F.shareReplay(1)),l=F.fromEvent(e,`timeupdate`).pipe(F.map(()=>e.currentTime),F.shareReplay(1)),u=F.merge(F.fromEvent(e,`loadedmetadata`),F.fromEvent(e,`timeupdate`),F.fromEvent(e,`pause`),F.fromEvent(e,`seeked`),F.fromEvent(e,`ended`)).pipe(F.map(()=>qt(e.played)),F.filterChanged(),F.shareReplay(1)),d=[`waiting`,`seeking`,`seeked`,`timeupdate`],f=new F.Subject,p=.3,m;n.add(F.merge(...d.map(t=>F.fromEvent(e,t))).subscribe(t=>{let n=e.currentTime;e.loop&&F.isNonNullable(m)&&F.isNonNullable(n)&&m>=e.duration-p&&n<=p&&f.next(m),m=n}));let h=t(`pause`).pipe(F.filter(()=>!e.error&&m!==e.duration),F.shareReplay(1)),g=F.fromEvent(e,`enterpictureinpicture`).pipe(F.shareReplay(1)),_=F.fromEvent(e,`leavepictureinpicture`).pipe(F.shareReplay(1)),v=new F.ValueSubject(Wt(e));n.add(g.subscribe(()=>v.next(!0))),n.add(_.subscribe(()=>v.next(!1)));let y=new F.ValueSubject(Ut(e)),b=F.fromEvent(e,`fullscreenchange`).pipe(F.shareReplay(1));n.add(b.pipe(F.map(()=>Ut(e))).subscribe(y));let x=F.fromEvent(e,`timeupdate`).pipe(F.map(t=>e.duration-e.currentTime<.1),F.filterChanged(),F.shareReplay(1)),S=F.merge(x.pipe(F.filter(t=>!e.loop&&t)),F.fromEvent(e,`ended`)).pipe(F.throttle(1e3),F.mapTo(void 0),F.shareReplay(1)),C=F.merge(...[`waiting`,`pause`,`canplay`,`play`,`canplaythrough`,`playing`,`seeking`,`seeked`,`ended`].map(t=>F.fromEvent(e,t)),x.pipe(F.map(e=>({type:e?`ended`:`unknown`})))).pipe(F.map(t=>j.browser.isFirefox&&t.type===`ended`?e.readyState<2:e.readyState<3),F.filterChanged(),F.shareReplay(1));return{playing$:a,pause$:h,canplay$:t(`canplay`),ended$:S,looped$:f,error$:c,seeked$:t(`seeked`),seeking$:t(`seeking`),progress$:t(`progress`),loadStart$:t(`loadstart`),loadedMetadata$:t(`loadedmetadata`),loadedData$:t(`loadeddata`),timeUpdate$:l,durationChange$:F.fromEvent(e,`durationchange`).pipe(F.map(()=>e.duration),F.shareReplay(1)),playedTime$:u,isBuffering$:C,currentBuffer$:i,volumeState$:o,playbackRateState$:s,inPiP$:v,inFullscreen$:y,enterPip$:g,leavePip$:_,destroy:r}},Yt=require(`@vkontakte/videoplayer-shared`),Xt=e=>{switch(e){case`mobile`:return Yt.VideoQuality.Q_144P;case`lowest`:return Yt.VideoQuality.Q_240P;case`low`:return Yt.VideoQuality.Q_360P;case`sd`:case`medium`:return Yt.VideoQuality.Q_480P;case`hd`:case`high`:return Yt.VideoQuality.Q_720P;case`fullhd`:case`full`:return Yt.VideoQuality.Q_1080P;case`quadhd`:case`quad`:return Yt.VideoQuality.Q_1440P;case`ultrahd`:case`ultra`:return Yt.VideoQuality.Q_2160P}},Zt=require(`@vkontakte/videoplayer-shared`),Qt=require(`@vkontakte/videoplayer-shared`),$t=require(`@vkontakte/videoplayer-shared`),I=require(`@vkontakte/videoplayer-shared`),en=!1,tn={},nn=e=>{en=e},rn=()=>{tn={}},an=e=>{e(tn)},on=(e,t)=>{en&&(tn.meta=tn.meta??{},tn.meta[e]=t)};class sn{constructor(e){i(this,`name`,void 0),this.name=e}next(e){if(!en)return;tn.series=tn.series??{};let t=tn.series[this.name]??[];t.push([Date.now(),e]),tn.series[this.name]=t}}var cn=require(`@vkontakte/videoplayer-shared`);function ln(e,t,n){return!e.max&&e.min===t?`high_quality`:!e.min&&e.max===n?`traffic_saving`:`unknown`}function un(e,t,n){return cn.isNullable(e)||cn.isNonNullable(e.min)&&cn.isNonNullable(e.max)&&cn.isLower(e.max,e.min)||cn.isNonNullable(e.min)&&cn.isNonNullable(t)&&cn.isHigher(e.min,t)||cn.isNonNullable(e.max)&&cn.isNonNullable(n)&&cn.isLower(e.max,n)}function dn({limits:e,highestAvailableHeight:t,lowestAvailableHeight:n}){return un({max:e?.max?cn.videoHeightToQuality(e.max):void 0,min:e?.min?cn.videoHeightToQuality(e.min):void 0},t?cn.videoHeightToQuality(t):void 0,n?cn.videoHeightToQuality(n):void 0)}var fn=new sn(`best_bitrate`),pn=(e,t,n)=>(t-n)*2**(-10*e)+n,mn=e=>(t,n)=>e*(Number(t.bitrate)-Number(n.bitrate));class hn{constructor(){i(this,`last`,void 0),i(this,`history`,{})}recordSelection(e){this.history[e.id]=I.now()}recordSwitch(e){this.last=e}clear(){this.last=void 0,this.history={}}}var gn=`Assertion "ABR Tracks is empty array" failed`,_n=new WeakMap,vn=new WeakMap,yn=new WeakMap,bn=(e,t,n,r)=>{let i=[...t].sort(mn(1)),a=[...n].sort(mn(1)),o=a.filter(t=>I.isNonNullable(t.bitrate)&&I.isNonNullable(e.bitrate)?e.bitrate/t.bitrate>r:!0),s=Zt.arrayAt(a,Math.round(a.length*i.indexOf(e)/(i.length+1)))??Zt.arrayAt(a,-1);return s&&Qt.arrayIncludes(o,s)?s:o.length?Zt.arrayAt(o,-1):Zt.arrayAt(a,0)},xn=(e,t,n,r)=>{let i=_n.get(t);i||(i=[...t].sort(mn(1)),_n.set(t,i));let a=_n.get(n);a||(a=[...n].sort(mn(1)),_n.set(n,a));let o=yn.get(e);o||(o=a.filter(t=>I.isNonNullable(t.bitrate)&&I.isNonNullable(e.bitrate)?e.bitrate/t.bitrate>r:!0),yn.set(e,o));let s=Zt.arrayAt(a,Math.round(a.length*i.indexOf(e)/(i.length+1)))??Zt.arrayAt(a,-1);return s&&Qt.arrayIncludes(o,s)?s:o.length?Zt.arrayAt(o,-1):Zt.arrayAt(a,0)},Sn=e=>`quality`in e,Cn=(e,t,n,r)=>{var i;let a=I.isNonNullable(r==null||(i=r.last)==null?void 0:i.bitrate)&&I.isNonNullable(n?.bitrate)&&r.last.bitrate<n.bitrate?e.trackCooldownIncreaseQuality:e.trackCooldownDecreaseQuality,o=n&&r&&r.history[n.id]&&I.now()-r.history[n.id]<=a&&(!r.last||n.id!==r.last.id);if(n?.id&&r&&!o&&r.recordSelection(n),o&&r?.last){let e=r.last;return r?.recordSwitch(e),t({message:`
|
|
7
7
|
[last ${Sn(e)?`video`:`audio`} selected] ${Sn(e)?e.quality:e.bitrate}
|
|
8
8
|
`}),e}return r?.recordSwitch(n),n},wn=(e,t)=>Math.log(t)/Math.log(e),Tn=({tuning:e,container:t,limits:n,panelSize:r})=>{let i=e.containerSizeFactor;if(r)return{containerSizeLimit:r,containerSizeFactor:i};if(e.usePixelRatio&&j.display.pixelRatio){let t=j.display.pixelRatio;if(e.pixelRatioMultiplier)i*=e.pixelRatioMultiplier*(t-1)+1;else{let n=e.pixelRatioLogBase,[r=0,a=0,o=0]=e.pixelRatioLogCoefficients,s=wn(n,r*t+a)+o;Number.isFinite(s)&&(i*=s)}}return I.isNonNullable(n?.min)&&I.isHigherOrEqual(n.min,e.highQualityLimit)&&(i*=2),{containerSizeLimit:e.limitByContainer&&t&&t.width>0&&t.height>0?{width:t.width*i,height:t.height*i}:void 0,containerSizeFactor:i}},En=new WeakMap,Dn=(e,{container:t,estimatedThroughput:n,tuning:r,limits:i,reserve:a=0,forwardBufferHealth:o,playbackRate:s,current:c,failedVideoTrack:l,history:u,visible:d,droppedVideoMaxQualityLimit:f,stallsVideoMaxQualityLimit:p,stallsPredictedThroughput:m,abrLogger:h,panelSize:g})=>{I.assertNotEmptyArray(e,gn);let{containerSizeFactor:_,containerSizeLimit:v}=Tn({container:t,tuning:r,limits:i,panelSize:g}),y=r.considerPlaybackRate&&I.isNonNullable(s)?s:1,b=En.get(e);b||(b=e.filter(e=>!I.isInvariantQuality(e.quality)).sort((e,t)=>I.isHigher(e.quality,t.quality)?-1:1),En.set(e,b));let x=Zt.arrayAt(b,-1)?.quality,S=Zt.arrayAt(b,0)?.quality,C=un(i,S,x),w=y*pn(o??.5,r.bitrateFactorAtEmptyBuffer,r.bitrateFactorAtFullBuffer),T={},E=null;for(let e of b){if(e.tvDisabled){T[e.quality]=`TvDisabled`;continue}let t=!0;if(v)if(e.size)t=e.size.width<=v.width&&e.size.height<=v.height;else{let n=v&&I.videoSizeToQuality(v);t=n?I.isLowerOrEqual(e.quality,n):!0}if(!t){T[e.quality]=`FitsContainer`;continue}let s=m||n,u=I.isNonNullable(s)&&isFinite(s)&&I.isNonNullable(e.bitrate)?s-a>=e.bitrate*w:!0,h=i?.min===e.quality||I.isNonNullable(i?.min)&&I.isNonNullable(S)&&I.isHigher(i.min,S)&&e.quality===S;if(!u&&!h){T[e.quality]=`FitsThroughput`;continue}if(I.isNonNullable(l)&&l.quality===e.quality){T[e.quality]=`FailedVideoTrack`;continue}if(r.lazyQualitySwitch&&I.isNonNullable(r.minBufferToSwitchUp)&&c&&!I.isInvariantQuality(c.quality)&&(o??0)<r.minBufferToSwitchUp&&I.isHigher(e.quality,c.quality)){T[e.quality]=`Buffer`;continue}if(f&&I.isHigherOrEqual(e.quality,f)&&!h){T[e.quality]=`DroppedFramesLimit`;continue}if(p&&I.isHigherOrEqual(e.quality,p)&&!h){T[e.quality]=`StallsLimit`;continue}let g=C||(I.isNullable(i?.max)||I.isLowerOrEqual(e.quality,i.max))&&(I.isNullable(i?.min)||I.isHigherOrEqual(e.quality,i.min)),_=I.isNonNullable(d)&&!d?I.isLowerOrEqual(e.quality,r.backgroundVideoQualityLimit):!0;if(!g||!_){T[e.quality]=`FitsQualityLimits`;continue}E||=e}E&&E.bitrate&&fn.next(E.bitrate);let ee=E??Zt.arrayAt(b,-1)??e[0],te=u?.last,ne=Cn(r,h,ee,u);return I.isNonNullable(u)&&ne.quality!==te?.quality&&h({message:`
|
|
9
9
|
[VIDEO TRACKS ABR]
|
|
@@ -235,15 +235,15 @@ const e=[`url`],t=[`url`],n=[`downloadingItems`],r=[`container`];var i=require(`
|
|
|
235
235
|
selectedTrack: ${e.bitrate}
|
|
236
236
|
lastVideoTrackSelected: ${JSON.stringify(t)}
|
|
237
237
|
tuning.minVideoAudioRatio: ${n.autoTrackSelection.minVideoAudioRatio}
|
|
238
|
-
`}}class Ca{static createRule(e,t=Hi(1)){switch(e){case`throughput_rule`:return new xa(t);case`min_audio_for_video_rule`:return new Sa(t)}}}var wa=Hi(1),Ta={},Ea={},Da=(e,t)=>(t?Ta:Ea)[e]??wa;class Oa{constructor(){i(this,`stallsController`,new _i),i(this,`videoAbrController`,new Pi),i(this,`audioAbrController`,new Pi),i(this,`subscription`,new Fi.Subscription),i(this,`lastVideoTrackSelected$`,new Fi.ValueSubject(void 0)),i(this,`context`,void 0),i(this,`phaseController`,void 0),i(this,`allVideoRules`,[])}init(e){this.context=o(o({},this.context),e),this.initVideoElementAbrContext(),this.stallsController.init(o(o({},this.context),{},{tuning:this.context.tuning.stallsManager,lastVideoTrackSelected$:this.lastVideoTrackSelected$}));let t=this.context.tuning.dash.abrVideoRules,n=[];if(this.context.tuning.dash.useAbrPhases){this.phaseController=new Ui(this.context.isSeeked$);for(let e of t){let t=ya.createRule(e,Da(e,!0));this.allVideoRules.push(t)}n.push(...this.allVideoRules)}else for(let e of t)n.push(ya.createRule(e,Da(e,!1)));let r=this.context.tuning.dash.abrAudioRules.map(e=>Ca.createRule(e)),i=o({},e);this.videoAbrController.init(n,i),this.audioAbrController.init(r,i)}updateContext(e){this.context.isAuto=e.isAuto,this.context.currentVideoTrack=e.currentVideoTrack,this.context.desiredVideoTrack=e.desiredVideoTrack,this.context.limits=e.limits,this.context.forwardBufferHealth=e.forwardBufferHealth,this.context.forwardBufferDuration=e.forwardBufferDuration,this.context.forwardVideoBufferRepresentations=e.forwardVideoBufferRepresentations,this.context.forwardAudioBufferRepresentations=e.forwardAudioBufferRepresentations,this.context.videoSegmentLoadProgress=e.videoSegmentLoadProgress,this.context.isLive=e.isLive,this.context.remainingDurationMs=e.remainingDurationMs,this.context.mpdSegmentDurationMs=e.mpdSegmentDurationMs,this.updateTracksIfneeded(e.videoTracks,e.audioTracks)}autoSelectTrack(e){let t=Ni(this.lastVideoTrackSelected$.getValue(),this.context.videoTracksAsc,this.context.audioTracksAsc??[],this.context.tuning.autoTrackSelection.minVideoAudioRatio)??this.context.audioTracksAsc?.[0],n=this.phaseController?.phase;if(this.videoAbrController.updateContext({videoTracksAsc:this.context.videoTracksAsc,videoTracksDesc:this.context.videoTracksDesc,currentVideoTrack:this.context.currentVideoTrack,tuning:this.context.tuning,abrLogger:this.context.abrLogger,forwardBufferRepresentations:this.context.forwardVideoBufferRepresentations,container:this.context.elementSizeManager?.getValue(),panelSize:this.context.panelSize,estimatedThroughput:this.context.throughput$.getValue(),limits:this.context.limits,reserve:t?.bitrate??0,forwardBufferHealth:this.context.forwardBufferHealth,forwardBufferDuration:this.context.forwardBufferDuration,visible:this.context.elementVisible$.getValue(),playbackRate:this.context.element.playbackRate,lastVideoTrackSelected:this.lastVideoTrackSelected$.getValue(),severeStallOccurred:this.stallsController.severeStallOccurred$.getValue(),lastStallDuration:this.stallsController.lastStallDuration$.getValue(),videoSegmentLoadProgress:this.context.videoSegmentLoadProgress,throughputVariance:this.context.throughputVariance$?.getValue()??0,isLive:this.context.isLive??!1,remainingDurationMs:this.context.remainingDurationMs,mpdSegmentDurationMs:this.context.mpdSegmentDurationMs,phase:n}),this.audioAbrController.updateContext({videoTracksAsc:this.context.videoTracksAsc,videoTracksDesc:this.context.videoTracksDesc,audioTracksAsc:this.context.audioTracksAsc,audioTracksDesc:this.context.audioTracksDesc,tuning:this.context.tuning,abrLogger:this.context.abrLogger,forwardBufferHealth:this.context.forwardBufferHealth,forwardBufferDuration:this.context.forwardBufferDuration,playbackRate:this.context.element.playbackRate,estimatedThroughput:this.context.throughput$.getValue(),reserve:this.lastVideoTrackSelected$.getValue()?.bitrate??0,currentVideoTrack:this.context.currentVideoTrack,lastVideoTrackSelected:this.lastVideoTrackSelected$.getValue(),throughputVariance:0}),e===`audio`)return this.audioAbrController.autoSelectTrack();let r=this.context.desiredVideoTrack;if(this.context.isAuto||Fi.isNullable(r))if(this.phaseController){this.phaseController.updatePhase(this.videoAbrController.context);let e=this.phaseController.phase,t=this.allVideoRules.filter(t=>t.activePhases.has(e));r=this.videoAbrController.autoSelectTrack(t)}else r=this.videoAbrController.autoSelectTrack();return this.lastVideoTrackSelected$.next(r),r}destroy(){this.subscription.unsubscribe(),this.videoAbrController.destroy(),this.audioAbrController.destroy(),this.phaseController?.destroy(),this.stallsController.destroy(),this.context.elementSizeManager?.destroy()}initVideoElementAbrContext(){let e=new Fi.ValueSubject(!1);this.subscription.add(hr(this.context.element,{threshold:this.context.tuning.autoTrackSelection.activeVideoAreaThreshold}).subscribe(e));let t=Jt(this.context.element);this.subscription.add(()=>t?.destroy());let n;this.context.element instanceof HTMLVideoElement&&(n=new pi,n.connect({video:this.context.element,observableVideo:t})),this.context=o(o({},this.context),{},{elementVisible$:e,observableVideo:t,elementSizeManager:n})}updateTracksIfneeded(e=[],t=[]){let{videoTracksAsc:n,videoTracksDesc:r,audioTracksAsc:i,audioTracksDesc:a}=this.context;if(this.isTracksDifferent(e,n,r)){let t=[...e].filter(e=>!Fi.isInvariantQuality(e.quality));this.context.videoTracksAsc=[...t].sort(Oi(1)),this.context.videoTracksDesc=[...t].sort(Oi(-1))}this.isTracksDifferent(t,i,a)&&(this.audioAbrController.historyReset(),this.context.audioTracksAsc=[...t].sort(Di(1)),this.context.audioTracksDesc=[...t].sort(Di(-1)))}isTracksDifferent(e,t=[],n=[]){let r=!1;for(let i of e)(Fi.isNullable(t.find(e=>i.id===e.id))||Fi.isNullable(n.find(e=>i.id===e.id)))&&(r=!0);return t.length!==e.length&&n.length!==e.length||r}}class ka{constructor(e){i(this,`scene3D`,void 0),i(this,`subscription`,new B.Subscription),i(this,`volumeSubscription`,new B.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`allocation`,void 0),i(this,`observableVideo`,null),i(this,`player`,void 0),i(this,`params`,void 0),i(this,`tracer`,void 0),i(this,`textTracksManager`,null),i(this,`droppedFramesManager`,new dr),i(this,`stallsManager`,new di),i(this,`elementSizeManager`,new pi),i(this,`abrManager`,new Oa),i(this,`videoTracksMap`,new Map),i(this,`audioTracksMap`,new Map),i(this,`textTracksMap`,new Map),i(this,`videoStreamsMap`,new Map),i(this,`audioStreamsMap`,new Map),i(this,`videoTrackSwitchHistory`,new hn),i(this,`audioTrackSwitchHistory`,new hn),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(!this.videoState.getTransition()){if(r.state===`requested`&&n?.to!==`paused`&&e!==`stopped`&&t!==`stopped`&&this.seek(r.position,r.forcePrecise),t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.player.stop(),this.allocation.target.load(),this.params.output.position$.next(0),this.params.output.duration$.next(1/0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}switch(e){case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();return;case`ready`:t===`paused`?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`ready`&&k(this.params.desiredState.playbackState,`ready`);return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):t===`playing`&&this.allocation.target.paused?this.playIfAllowed():n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`paused`&&k(this.params.desiredState.playbackState,`paused`);return;default:return B.assertNever(e)}}}),i(this,`init3DScene`,e=>{if(this.scene3D)return;let t=this.params.allocation.parent,n=this.allocation.video;if(!t||!n)return;this.scene3D=new ni(t,n,{fov:this.params.tuning.spherical.fov,orientation:this.params.tuning.spherical.orientation||{x:e.projectionData?.pose.yaw||0,y:e.projectionData?.pose.pitch||0,z:e.projectionData?.pose.roll||0},rotationSpeed:this.params.tuning.spherical.rotationSpeed,maxYawAngle:this.params.tuning.spherical.maxYawAngle,rotationSpeedCorrection:this.params.tuning.spherical.rotationSpeedCorrection,degreeToPixelCorrection:this.params.tuning.spherical.degreeToPixelCorrection,speedFadeTime:this.params.tuning.spherical.speedFadeTime,speedFadeThreshold:this.params.tuning.spherical.speedFadeThreshold});let r=this.elementSizeManager.getValue();r&&this.scene3D.setViewportSize(r.width,r.height)}),i(this,`destroy3DScene`,()=>{this.scene3D&&=(this.scene3D.destroy(),void 0)}),e.tuning.disableSubtitles||(this.textTracksManager=new Bt(e.source.url)),this.params=e,this.allocation=Lr(e.allocation,e.tuning),this.tracer=e.dependencies.tracer.createComponentTracer(this.constructor.name),this.params.output.element$.next(this.allocation.video??void 0),this.params.output.availableVideoTracks$.next([]),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.output.hostname$.next(jn(this.params.source.url)),this.params.output.isLive$.next(!1),this.params.output.autoVideoTrackLimitingAvailable$.next(!0),this.params.output.availableTextTracks$.next([]),this.params.desiredState.internalTextTracks.setState([]),this.player=this.getPlayer(),this.subscribe()}getProviderSubscriptionInfo(){let{output:e,desiredState:t}=this.params;B.isNullable(this.observableVideo)&&(this.observableVideo=Jt(this.allocation.target),this.subscription.add(()=>this.observableVideo?.destroy()));let n=this.constructor.name,r=t=>{e.error$.next({id:n,category:B.ErrorCategory.WTF,message:`${n} internal logic error`,thrown:t})};return{output:e,desiredState:t,observableVideo:this.observableVideo,genericErrorListener:r,connect:(e,t)=>this.subscription.add(e.subscribe(t,r))}}subscribe(){var e=this;let{output:t,desiredState:n,observableVideo:r,genericErrorListener:i,connect:s}=this.getProviderSubscriptionInfo(),c=this.allocation.video;c&&this.subscription.add(this.params.output.availableVideoTracks$.pipe(B.filter(e=>!!e.length),B.once()).subscribe(e=>{this.droppedFramesManager.connect({logger:this.params.dependencies.logger,video:c,droppedFramesChecker:this.params.tuning.droppedFramesChecker,isAuto:this.params.desiredState.autoVideoTrackSwitching,playing$:r.playing$,pause$:r.pause$,tracks:e})}));let l=this.params.desiredState.seekState.stateChangeEnded$.pipe(B.map(e=>e.to.state!==`none`),B.filterChanged());this.abrManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,throughputVariance$:this.params.dependencies.throughputEstimator.throughputVariance$,tuning:this.params.tuning,failedVideoTrack:this.params.failedVideoTrack,element:this.allocation.target,abrLogger:this.params.dependencies.abrLogger}),this.stallsManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,tuning:this.params.tuning.stallsManager,abrParams:this.params.tuning.autoTrackSelection,isBuffering$:r.isBuffering$,looped$:r.looped$,playing$:r.playing$,duration:this.allocation.target.duration}),s(r.ended$,t.endedEvent$),s(r.looped$,t.loopedEvent$),s(r.error$,t.error$),s(r.isBuffering$,t.isBuffering$),s(r.currentBuffer$,t.currentNativeBuffer$),s(r.playing$,t.firstFrameEvent$),s(r.playedTime$,t.playedTime$),s(r.inPiP$,t.inPiP$),s(r.inFullscreen$,t.inFullscreen$),s(r.loadedMetadata$,t.loadedMetadataEvent$),s(this.player.currentBuffer$.pipe(B.filter(e=>e.to>0),B.once(),B.mapTo(void 0)),t.canplay$),s(this.player.error$,t.error$),s(this.player.fetcherRecoverableError$,t.fetcherRecoverableError$),s(this.player.fetcherError$,t.fetcherError$),s(this.player.updateDurationError$,t.updateDurationError$),s(this.player.videoLastDataObtainedTimestamp$,t.videoLastDataObtainedTimestamp$),s(this.player.lastConnectionType$,t.httpConnectionType$),s(this.player.lastConnectionReused$,t.httpConnectionReused$),s(this.player.lastConnectionMetrics$,t.httpConnectionMetrics$),s(this.player.lastDownloadMetrics$,t.httpDownloadMetrics$),s(this.player.isLive$,t.isLive$),s(this.player.currentBuffer$,t.currentBuffer$),s(this.player.lastRequestFirstBytes$.pipe(B.filter(B.isNonNullable),B.once()),t.firstBytesEvent$),s(this.stallsManager.severeStallOccurred$,t.severeStallOccurred$),s(this.videoState.stateChangeEnded$.pipe(B.map(e=>e.to)),this.params.output.playbackState$),this.subscription.add(r.looped$.subscribe(()=>this.player.warmUpMediaSourceIfNeeded(),i)),this.subscription.add(r.seeked$.subscribe(t.seekedEvent$,i)),this.subscription.add(Nt(this.allocation.target,n.isLooped,i)),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(e=>{this.volumeSubscription.unsubscribe(),e?this.volumeSubscription.add(n.volume.stateChangeStarted$.subscribe(({to:e})=>this.params.output.volume$.next(e),i)):this.volumeSubscription.add(r.volumeState$.subscribe(this.params.output.volume$,i))})),hi({subscription:this.subscription,desiredState:n,videoElement$:this.params.output.element$,observableVideo:r}),this.subscription.add(Pt(this.allocation.target,n.volume,r.volumeState$,i,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.subscription.add(Ft(this.allocation.target,n.playbackRate,r.playbackRateState$,i)),this.allocation.video&&this.elementSizeManager.connect({video:this.allocation.video,observableVideo:r}),s(hr(this.allocation.target,{threshold:this.params.tuning.autoTrackSelection.activeVideoAreaThreshold}),t.elementVisible$),this.subscription.add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`),k(n.playbackState,`playing`),this.scene3D&&this.scene3D.play()},i)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)},i)).add(r.canplay$.subscribe(()=>{this.videoState.getState()===`playing`&&this.playIfAllowed()},i)),this.params.tuning.changePlaybackStateToPausedWhenEnded&&this.subscription.add(r.ended$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)})),this.subscription.add(this.player.manifestRequested.subscribe(this.params.output.manifestRequested$)).add(this.player.manifestReceived.subscribe(this.params.output.manifestReceived$)).add(this.player.firstBytesRequested.subscribe(this.params.output.firstBytesRequested$)).add(this.player.firstBytesReceived.subscribe(this.params.output.firstBytesReceived$)),this.subscription.add(this.player.state$.stateChangeEnded$.subscribe(({to:e})=>{if(e===`manifest_ready`){this.videoTracksMap=new Map,this.audioTracksMap=new Map,this.textTracksMap=new Map;let e=this.player.getStreams(),t=this.player.getCodecs();if(B.assertNonNullable(e,`Manifest not loaded or empty`),!this.params.tuning.isAudioDisabled){let t=[];for(let n of e.audio){t.push(Yr(n));let e=[];for(let t of n.representations){let r=Kr(t);e.push(r),this.audioTracksMap.set(r,{stream:n,representation:t})}this.audioStreamsMap.set(n,e)}this.params.output.availableAudioStreams$.next(t)}let n=[];for(let t of e.video){n.push(Xr(t));let e=[];for(let n of t.representations){let r=Gr(o(o({},n),{},{streamId:t.id}));r&&(e.push(r),this.videoTracksMap.set(r,{stream:t,representation:n}))}this.videoStreamsMap.set(t,e)}this.params.output.availableVideoStreams$.next(n);for(let t of e.text)for(let e of t.representations){let n=qr(t,e);this.textTracksMap.set(n,{stream:t,representation:e})}this.params.output.availableVideoTracks$.next(Array.from(this.videoTracksMap.keys())),this.params.output.availableAudioTracks$.next(Array.from(this.audioTracksMap.keys())),this.params.output.isAudioAvailable$.next(!!this.audioTracksMap.size),t?.video&&this.params.output.availableVideoCodecs$.next(t.video),t?.audio&&this.params.output.availableAudioCodecs$.next(t.audio),this.audioTracksMap.size&&this.textTracksMap.size&&this.params.desiredState.internalTextTracks.startTransitionTo(Array.from(this.textTracksMap.keys()))}else e===`representations_ready`&&(this.videoState.setState(`ready`),this.player.initBuffer())},i));let u=B.merge(this.player.currentStallDuration$,this.player.state$.stateChangeEnded$,n.videoTrack.stateChangeStarted$,n.autoVideoTrackSwitching.transitionStarted$,this.params.dependencies.throughputEstimator.rttAdjustedThroughput$,n.autoVideoTrackLimits.stateChangeStarted$,this.elementSizeManager.getObservable(),this.params.output.elementVisible$,this.droppedFramesManager.onDroopedVideoFramesLimit$,B.fromEvent(this.allocation.target,`progress`)).pipe(B.filter(()=>this.videoTracksMap.size>0)),{abrThrottle:d}=this.params.tuning.dash;d&&(u=u.pipe(B.throttle(d))),this.subscription.add(u.subscribe(a(function*(){let t=e.player.state$.getState(),r=e.player.state$.getTransition(),i=n.autoVideoTrackSwitching.getState()?`lazy`:`default`;if(t!==`manifest_ready`&&t!==`running`||r)return;n.autoVideoTrackSwitching.getTransition()&&n.autoVideoTrackSwitching.setState(n.autoVideoTrackSwitching.getState());let a=e.selectVideoAudioRepresentations();if(!a)return;let[o,s]=a,c=[...e.videoTracksMap.keys()].find(t=>e.videoTracksMap.get(t)?.representation.id===o.id);B.isNonNullable(c)&&(e.stallsManager.lastVideoTrackSelected=c);let l=e.params.desiredState.autoVideoTrackLimits.getTransition();l&&e.params.output.autoVideoTrackLimits$.next(l.to),t===`manifest_ready`?yield e.player.initRepresentations(o.id,s?.id,e.params.sourceHls):(yield e.player.switchRepresentation(`video`,o.id,i),s&&(yield e.player.switchRepresentation(`audio`,s.id,`force`)))}),i)),this.subscription.add(n.cameraOrientation.stateChangeEnded$.subscribe(({to:e})=>{this.scene3D&&e&&this.scene3D.pointCameraTo(e.x,e.y)})),this.subscription.add(this.elementSizeManager.subscribe(e=>{this.scene3D&&e&&this.scene3D.setViewportSize(e.width,e.height)})),this.subscription.add(this.player.currentVideoRepresentation$.pipe(B.filterChanged()).subscribe(e=>{let n=[...this.videoTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentVideoTrack$.next(void 0),t.currentVideoStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.videoStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.videoStream.setState(a.to),t.currentVideoTrack$.next(r),t.currentVideoStream$.next(Xr(i))},i)),this.subscription.add(this.player.currentAudioRepresentation$.pipe(B.filterChanged()).subscribe(e=>{let n=[...this.audioTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentAudioStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.audioStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.audioStream.setState(a.to),t.currentAudioStream$.next(Yr(i))},i)),this.subscription.add(this.player.currentVideoRepresentationInit$.subscribe(e=>{if(e?.is3dVideo&&this.params.tuning.spherical?.enabled)try{this.init3DScene(e),t.is3DVideo$.next(!0)}catch(e){t.warning$.next({id:`DashProvider`,message:`DashProvider could not initialize 3D-scene: ${e}`})}else this.destroy3DScene(),this.params.tuning.spherical?.enabled&&t.is3DVideo$.next(!1)},i)),this.subscription.add(this.player.currentVideoSegmentLength$.subscribe(t.currentVideoSegmentLength$,i)),this.subscription.add(this.player.currentAudioSegmentLength$.subscribe(t.currentAudioSegmentLength$,i)),this.allocation.video&&this.textTracksManager?.connect(this.allocation.video,n,t);let f=n.playbackState.stateChangeStarted$.pipe(B.map(({to:e})=>e===`ready`),B.filterChanged());this.subscription.add(B.merge(f,n.autoVideoTrackSwitching.stateChangeStarted$,this.player.state$.stateChangeEnded$,B.observableFrom([`init`])).subscribe(()=>{let e=n.autoVideoTrackSwitching.getState(),t=n.playbackState.getState()===`ready`?this.params.tuning.dash.forwardBufferTargetPreload:e?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;this.player.setBufferTarget(t)})),this.subscription.add(B.merge(f,this.player.state$.stateChangeEnded$,B.observableFrom([`init`])).subscribe(()=>this.player.setPreloadOnly(n.playbackState.getState()===`ready`)));let p=B.merge(n.playbackState.stateChangeStarted$,n.videoTrack.stateChangeStarted$,n.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,B.observableFrom([`init`])).pipe(B.debounce(0));this.subscription.add(p.subscribe(this.syncPlayback,i))}selectVideoAudioRepresentations(){if(this.player.isStreamEnded)return;let e=this.params.tuning.useNewAutoSelectVideoTrack?xn:bn,t=this.params.tuning.useNewAutoSelectVideoTrack?An:kn,n=this.params.tuning.useNewAutoSelectVideoTrack?Dn:On,{desiredState:r,output:i}=this.params,a=r.autoVideoTrackSwitching.getState(),s=r.videoTrack.getState()?.id,c=[...this.videoTracksMap.keys()].find(({id:e})=>e===s),l=i.currentVideoTrack$.getValue(),u=r.videoStream.getState()??(c&&this.videoTracksMap.get(c)?.stream)??this.videoStreamsMap.size===1?this.videoStreamsMap.keys().next().value:void 0;if(!u)return;let d=[...this.videoStreamsMap.keys()].find(({id:e})=>e===u.id),f=d&&this.videoStreamsMap.get(d);if(!f)return;let p=this.player.bufferLength$.getValue(),m;m=this.player.isActiveLive$.getValue()?this.player.isLowLatency$.getValue()?this.params.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.params.tuning.dashCmafLive.normalizedLiveMinBufferSize:this.player.isLive$.getValue()?this.params.tuning.dashCmafLive.normalizedTargetMinBufferSize:a?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;let h=(this.allocation.target.duration*1e3||1/0)-this.allocation.target.currentTime*1e3,g=Math.min(p/Math.min(m,h||1/0),1),_=r.audioStream.getState()??(this.audioStreamsMap.size===1?this.audioStreamsMap.keys().next().value:void 0),v=[...this.audioStreamsMap.keys()].find(({id:e})=>e===_?.id)??this.audioStreamsMap.keys().next().value,y=0;if(v){if(c&&!a){let t=e(c,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}if(l){let t=e(l,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}}let b=this.player.isLive$.getValue(),x=this.allocation.target.duration*1e3,S=!b&&Number.isFinite(x)&&x>0?Math.max(0,x-this.allocation.target.currentTime*1e3):void 0,C=this.params.tuning.dash.useAbrPhases?{videoSegmentLoadProgress:this.player.getActiveVideoSegmentProgress(),isLive:b,remainingDurationMs:S,mpdSegmentDurationMs:this.player.getMpdVideoSegmentDuration()}:{};this.abrManager.updateContext(o({isAuto:a,videoTracks:f,audioTracks:v?this.audioStreamsMap.get(v)??[]:[],currentVideoTrack:l,desiredVideoTrack:c,limits:this.params.desiredState.autoVideoTrackLimits.getState(),forwardBufferHealth:g,forwardBufferDuration:p,forwardVideoBufferRepresentations:this.player.getForwardBufferRepresentations(`video`),forwardAudioBufferRepresentations:this.player.getForwardBufferRepresentations(`audio`)},C));let w=c,T;this.params.tuning.dash.useNewAbr?(w=this.abrManager.autoSelectTrack(`video`),T=v&&this.abrManager.autoSelectTrack(`audio`)):((a||!w)&&(w=n(f,{container:this.elementSizeManager.getValue(),panelSize:this.params.panelSize,estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),tuning:this.stallsManager.abrTuningParams,limits:this.params.desiredState.autoVideoTrackLimits.getState(),reserve:y,forwardBufferHealth:g,current:l,visible:this.params.output.elementVisible$.getValue(),history:this.videoTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,droppedVideoMaxQualityLimit:this.droppedFramesManager.droppedVideoMaxQualityLimit,stallsVideoMaxQualityLimit:this.stallsManager.videoMaxQualityLimit,stallsPredictedThroughput:this.stallsManager.predictedThroughput,abrLogger:this.params.dependencies.abrLogger})),T=v&&t(w,f,this.audioStreamsMap.get(v)??[],{estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),stallsPredictedThroughput:this.stallsManager.predictedThroughput,tuning:this.stallsManager.abrTuningParams,forwardBufferHealth:g,history:this.audioTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,abrLogger:this.params.dependencies.abrLogger}));let E=this.videoTracksMap.get(w)?.representation,ee=T&&this.audioTracksMap.get(T)?.representation;if(E&&ee)return[E,ee];if(E&&!ee&&this.audioTracksMap.size===0)return[E,void 0]}prepare(e=0){this.player.initManifest(this.allocation.target,this.params.source.url,e)}playIfAllowed(){let e=Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}),t=e=>{e||(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`,!0))},n=e=>{this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:B.ErrorCategory.DOM,thrown:e})};this.params.tuning.ignoreForcePlayResultWhenProviderChanged?this.subscription.add(B.observableFrom(e).subscribe(t,n)):e.then(t,n)}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.droppedFramesManager.destroy(),this.stallsManager.destroy(),this.abrManager.destroy(),this.elementSizeManager.destroy(),this.destroy3DScene(),this.textTracksManager?.destroy(),this.player.destroy(),this.params.output.element$.next(void 0),this.params.output.currentVideoStream$.next(void 0),Dt(this.allocation.target,this.params.tuning),this.tracer.end()}}var Aa=require(`@vkontakte/videoplayer-shared`),ja=require(`@vkontakte/videoplayer-shared`),Ma=require(`@vkontakte/videoplayer-shared`),Na=require(`@vkontakte/videoplayer-shared`),Pa=e=>{if(!e)return{id:`EmptyResponse`,category:Na.ErrorCategory.PARSER,message:`Empty response`};if(e.length<=2&&e.match(/^\d+$/))return{id:`UVError#${e}`,category:Na.ErrorCategory.NETWORK,message:`UV Error ${e}`};let t=Ma.stringTrimStart(e).substring(0,100).toLowerCase();if(t.startsWith(`<!doctype`)||t.startsWith(`<html>`)||t.startsWith(`<body>`)||t.startsWith(`<head>`))return{id:`UnexpectedHTML`,category:Na.ErrorCategory.NETWORK,message:`Received unexpected HTML, possibly a ISP block`};if(t.startsWith(`<?xml`))return new DOMParser().parseFromString(e,`text/xml`).querySelector(`parsererror`)?{id:`InvalidXML`,category:Na.ErrorCategory.PARSER,message:`XML parsing error`}:{id:`XMLParserLogicError`,category:Na.ErrorCategory.PARSER,message:`Response is valid XML, but parser failed`}},V=require(`@vkontakte/videoplayer-shared`),Fa=require(`@vkontakte/videoplayer-shared`),Ia=require(`@vkontakte/videoplayer-shared`),La=e=>{let t=new URL(e);return t.searchParams.set(`quic`,`1`),t.toString()},Ra=e=>{let t=e.get(`X-Delivery-Type`),n=e.get(`X-Reused`);return{type:t===null?`http1`:t??void 0,reused:n===null?void 0:{1:!0,0:!1}[n]??void 0}},H=require(`@vkontakte/videoplayer-shared`),za=e=>{let t=new URL(e);return t.searchParams.set(`enable-subtitles`,`yes`),t.toString()},Ba=require(`@vkontakte/videoplayer-shared`),Va=new Set([2,3,4,5,6,9,19]),Ha=new Set([1,8,18,21]),Ua=new Set([10,11,12,13,14,15,16]),Wa=({txtCode:e,error$:t,recoverableError$:n,httpCode:r})=>{let i=parseInt(e);if(isNaN(i))return;let a=o(o({},Ga(i)),{},{httpCode:r,UVBackendErrorCode:e});if(Va.has(i)){t.next(o(o({},a),{},{category:Ba.ErrorCategory.NETWORK}));return}if(Ha.has(i)){n.next(o(o({},a),{},{category:Ba.ErrorCategory.FATAL}));return}if(Ua.has(i)){t.next(o(o({},a),{},{category:Ba.ErrorCategory.FATAL}));return}},Ga=e=>{switch(e){case 1:return{id:`VideoDataLinkExpiredError`,message:`Video data links have expired`};case 5:return{id:`VideoServerError`,message:`Server error`};case 8:return{id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`};case 10:return{id:`UserAgentChange`,message:`User agent changed`};case 11:return{id:`forbiddenReferer`,message:`Forbidden referer`};case 12:case 13:case 14:case 15:case 16:return{id:`OKerror`,message:`Error #${e}`};case 18:return{id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`};case 21:return{id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`};default:return Ka(e)}};function Ka(e){return{id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${e})`}}var qa=require(`@vkontakte/videoplayer-shared`),Ja=`vk_player_cached_fetches`,Ya=[`fromCache`,`expires`,`sig`],Xa=300*1e3,Za=`x-cache-expires`,Qa=function(){var e=a(function*(e){let t=eo(e),n=yield qa.getWindow().caches.open(Ja);return{get:function(){var e=a(function*(){let e=yield n.match(t);return e&&!to(e)?(qa.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_hit`]}),e):(e&&(yield n.delete(t),qa.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_missed`,`expired`]})),null)});return function(){return e.apply(this,arguments)}}(),set:function(){var r=a(function*(r){yield n.put(t,no(r,e))});return function(e){return r.apply(this,arguments)}}()}});return function(t){return e.apply(this,arguments)}}();function $a(){return typeof caches<`u`}function eo(e){try{let t=new URL(e);return t.hostname=`cache.local`,Ya.forEach(e=>t.searchParams.delete(e)),t.toString()}catch{return e}}function to(e){let t=e.headers.get(Za);if(!t)return!0;let n=Number(t);return isNaN(n)||n<=Date.now()}function no(e,t){let n=e.clone();return new Response(n.body,{status:n.status,statusText:n.statusText,headers:new Headers(o(o({},Array.from(n.headers.entries())),{},{[Za]:ro(t).toString()}))})}function ro(e){try{let t=new URL(e).searchParams.get(`expires`);if(t&&!isNaN(Number(t)))return Number(t)}catch{return 0}return Date.now()+Xa}class io{constructor({throughputEstimator:e,requestQuic:t,tracer:n,compatibilityMode:r=!1,useEnableSubtitlesParam:a=!1,handleExtendedNetworkErrorsSet:l=!1,useUrlCacheMechanism:u=!1,measureNonSegmentRequests:d=!1}){i(this,`throughputEstimator`,void 0),i(this,`requestQuic`,void 0),i(this,`tracer`,void 0),i(this,`manifestRequested`,new H.Subject),i(this,`manifestReceived`,new H.Subject),i(this,`firstBytesRequested`,new H.Subject),i(this,`firstBytesReceived`,new H.Subject),i(this,`lastConnectionType$`,new H.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new H.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new H.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new H.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new H.ValueSubject(void 0)),i(this,`recoverableError$`,new H.Subject),i(this,`error$`,new H.Subject),i(this,`abortAllController`,new Fa.AbortControllerPolyfilled),i(this,`subscription`,new H.Subscription),i(this,`compatibilityMode`,void 0),i(this,`useEnableSubtitlesParam`,void 0),i(this,`useUrlCacheMechanism`,void 0),i(this,`measureNonSegmentRequests`,void 0),i(this,`startupPhase`,!0),i(this,`performanceObserver`,null),i(this,`pendingConnectionMetrics`,new Map),i(this,`handleExtendedNetworkErrorsSet`,!1),i(this,`fetchManifest`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e){let t=this.tracer.createComponentTracer(`FetchManifest`),n=e;this.requestQuic&&(n=La(n)),!this.compatibilityMode&&this.useEnableSubtitlesParam&&(n=za(n)),this.trackRequestStart(n,performance.now());let r=H.now();this.manifestRequested.next();let i=yield this.doFetch(n,{signal:this.abortAllController.signal}).catch(H.suppressAbort);if(i){let a=H.now();t.log(`success`,H.flattenObject({url:n,message:`Request successfully executed`})),t.end(),this.manifestReceived.next(),this.onHeadersReceived(i.headers);let o=i.headers.get(`content-length`),c=0;o&&(c=parseInt(o,10));let l=yield s(i.text());if((!o||isNaN(c)||c<=0)&&(c=new TextEncoder().encode(l).length),c>0){let t=a-r,n=c/(t/1e3)*8/1024,i={bytes:c,speed:n,url:e};this.lastDownloadMetrics$.next(i)}if(this.measureNonSegmentRequests&&this.startupPhase&&(this.throughputEstimator?.addRawRtt(a-r),o&&c>0)){let e=H.now();this.throughputEstimator?.addRawSpeed(c,e-r)}return l}else return t.error(`error`,H.flattenObject({url:n,message:`No data in request manifest`})),t.end(),null});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetch`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e,{rangeMethod:t=this.compatibilityMode?0:1,range:n,onProgress:r,priority:i=`auto`,signal:a,measureThroughput:o=!0,isLowLatency:s=!1,bufferOptimisation:l=!1,urlCacheMechanismEnabled:u}={}){let d=e,f=new Headers,p=this.tracer.createComponentTracer(`Fetch`);if(n)switch(t){case 0:f.append(`Range`,`bytes=${n.from}-${n.to}`);break;case 1:{let e=new URL(d,H.getWindow().location.href);e.searchParams.append(`bytes`,`${n.from}-${n.to}`),d=e.toString();break}default:H.assertNever(t)}this.requestQuic&&(d=La(d));let m=this.abortAllController.signal,h;if(a){let e=new Fa.AbortControllerPolyfilled;if(h=H.merge(H.fromEvent(this.abortAllController.signal,`abort`),H.fromEvent(a,`abort`)).subscribe(()=>{try{e.abort()}catch(e){H.suppressAbort(e)}}),this.subscription.add(h),this.abortAllController.signal.aborted||a.aborted)try{e.abort()}catch(e){H.suppressAbort(e)}m=e.signal}let g=0,_=H.now();p.log(`startRequest`,H.flattenObject({url:d,priority:i,rangeMethod:t,range:n,isLowLatency:s,requestStartedAt:_})),this.trackRequestStart(d,performance.now()),this.firstBytesRequested.next();let v=yield this.doFetch(d,{priority:i,headers:f,signal:m},{urlCacheMechanismEnabled:u}),y=H.now();if(!v)return p.error(`error`,{message:`No response in request`}),p.end(),h?.unsubscribe(),null;if(this.throughputEstimator?.addRawRtt(y-_),!v.ok||!v.body){h?.unsubscribe();let e=`Fetch error ${v.status}: ${v.statusText}`;return p.error(`error`,{message:e}),p.end(),Promise.reject(Error(`Fetch error ${v.status}: ${v.statusText}`))}if(this.onHeadersReceived(v.headers),!r&&!o){let e=yield v.arrayBuffer(),t=H.now();if(this.measureNonSegmentRequests&&this.startupPhase){let e=v.headers.get(`content-length`),n=e?parseInt(e,10):NaN;Number.isFinite(n)&&n>0&&this.throughputEstimator?.addRawSpeed(n,t-_)}let n={requestStartedAt:_,requestEndedAt:t,duration:t-_};return p.log(`endRequest`,H.flattenObject(n)),p.end(),h?.unsubscribe(),e}let b=v.body;if(o){this.startupPhase=!1;let e;[b,e]=v.body.tee(),this.throughputEstimator?.trackStream(e,s)}let x=b.getReader(),S,C=parseInt(v.headers.get(`content-length`)??``,10);Number.isFinite(C)&&(S=C),!S&&n&&(S=n.to-n.from+1);let w=S?new Uint8Array(S):new Uint8Array,T=!1,E=e=>{h?.unsubscribe(),T=!0,H.suppressAbort(e)},ee=H.abortable(m,function(){var e=c(function*({done:e,value:t}){if(g===0&&(this.lastRequestFirstBytes$.next(H.now()-_),this.firstBytesReceived.next()),m.aborted){h?.unsubscribe();return}if(!e&&t){if(l&&S)w.set(t,g),g+=t.byteLength;else{let e=new Uint8Array(w.length+t.length);e.set(w),e.set(t,w.length),w=e,g+=t.byteLength}r?.(new DataView(w.buffer),g),yield x?.read().then(ee,E)}});return function(t){return e.apply(this,arguments)}}().bind(this));yield x?.read().then(ee,E),h?.unsubscribe();let te=H.now(),ne={failed:T,requestStartedAt:_,requestEndedAt:te,duration:te-_};if(T)return p.error(`endRequest`,H.flattenObject(ne)),p.end(),null;if(g>0){let t=te-_,n=g/(t/1e3)*8/1024,r={bytes:g,speed:n,url:e};this.lastDownloadMetrics$.next(r)}return p.log(`endRequest`,H.flattenObject(ne)),p.end(),w.buffer});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchByteRangeRepresentation`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t,n,r){if(e.type!==`byteRange`)return null;let{from:i,to:a}=e.initRange,s=i,c=a,l=!1,u,d;e.indexRange&&(u=e.indexRange.from,d=e.indexRange.to,l=a+1===u,l&&(s=Math.min(u,i),c=Math.max(d,a))),s=Math.min(s,0);let f=yield this.fetch(e.url,{range:{from:s,to:c},priority:r,signal:n,measureThroughput:!1,urlCacheMechanismEnabled:!0});if(!f)return null;let p=new DataView(f,i-s,a-s+1);if(!t.validateData(p))throw Error(`Invalid media file`);let m=t.parseInit(p),h=e.indexRange??t.getIndexRange(m);if(!h)throw ReferenceError(`No way to load representation index`);let g;if(l)g=new DataView(f,h.from-s,h.to-h.from+1);else{let t=yield this.fetch(e.url,{range:h,priority:r,signal:n,measureThroughput:!1,urlCacheMechanismEnabled:!0});if(!t)return null;g=new DataView(t)}let _=t.parseSegments(g,m,h).map(e=>o(o({},e),{},{networkStatus:`none`,bufferStatus:`none`}));return{initMetadata:m,initDataView:new DataView(f),segments:_}});return function(t,n,r,i){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchTemplateRepresentation`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t,n){if(e.type!==`template`)return null;let r=new URL(e.initUrl,e.baseUrl).toString(),i=yield this.fetch(r,{priority:n,signal:t,measureThroughput:!1});if(!i)return null;let a=e.segments.map(e=>o(o({},e),{},{networkStatus:`none`,bufferStatus:`none`,size:void 0}));return{initMetadata:null,initDataView:new DataView(i),segments:a}});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),this.throughputEstimator=e,this.requestQuic=t,this.compatibilityMode=r,this.tracer=n.createComponentTracer(`Fetcher`),this.useEnableSubtitlesParam=a,this.handleExtendedNetworkErrorsSet=l,this.measureNonSegmentRequests=d,H.getWindow().PerformanceObserver&&this.setupPerformanceObserver(),this.useUrlCacheMechanism=u}onHeadersReceived(e){let{type:t,reused:n}=Ra(e);this.lastConnectionType$.next(t),this.lastConnectionReused$.next(n)}setupPerformanceObserver(){this.performanceObserver=new(H.getWindow()).PerformanceObserver(e=>{e.getEntriesByType(`resource`).forEach(e=>{this.processResourceTiming(e)})}),this.performanceObserver.observe({entryTypes:[`resource`]})}processResourceTiming(e){let t=this.findMatchingRequest(e);if(!t||!this.pendingConnectionMetrics.get(t))return;this.pendingConnectionMetrics.delete(t);let n=this.extractConnectionMetrics(e);n&&this.lastConnectionMetrics$.next(n)}estimateNetworkType(){if(!(`connection`in H.getWindow().navigator))return`unknown`;let e=H.getWindow().navigator.connection;return e.effectiveType?{"slow-2g":`2g`,"2g":`2g`,"3g":`3g`,"4g":`lte`}[e.effectiveType]||e.effectiveType:e.downlink?e.downlink<1?`2g`:e.downlink<5?`3g`:e.downlink<50?`lte`:`wifi`:e.rtt?e.rtt>500?`2g`:e.rtt>250?`3g`:e.rtt>50?`lte`:`wifi`:`unknown`}extractConnectionMetrics(e){let t=0,n=0,r=0,i=0;return e.domainLookupStart>0&&e.domainLookupEnd>0&&(t=e.domainLookupEnd-e.domainLookupStart),e.connectStart>0&&e.connectEnd>0&&(i=e.connectEnd-e.connectStart,e.secureConnectionStart>0?(r=e.connectEnd-e.secureConnectionStart,n=e.secureConnectionStart-e.connectStart):n=i),{dnsResolveTime:Math.max(0,t),tcpHandshakeTime:Math.max(0,n),tlsHandshakeTime:Math.max(0,r),totalConnectTime:Math.max(0,i),networkType:this.estimateNetworkType(),url:e.name}}findMatchingRequest(e){try{for(let[t,n]of this.pendingConnectionMetrics.entries()){let r=new URL(e.name),i=r.origin+r.pathname,a=new URL(n.url);if(i===a.origin+a.pathname&&e.startTime>=n.startTime-10&&e.startTime<=n.startTime+1e3)return t}}catch{this.recoverableError$.next({id:`VideoDataFetchError`,message:`Video data fetch error with getting download metrics`,category:H.ErrorCategory.WTF})}return null}trackRequestStart(e,t){let n=`${e}_${t}_${Math.random().toString(36).substr(2,9)}`;this.pendingConnectionMetrics.set(n,{url:e,startTime:t})}fetchRepresentation(e,t,n,r=`auto`){var i=this;return a(function*(){let{type:a}=e;switch(a){case`byteRange`:return i.fetchByteRangeRepresentation(e,t,n,r)??null;case`template`:return i.fetchTemplateRepresentation(e,n,r)??null;default:H.assertNever(a)}})()}destroy(){this.abortAllController.abort(),this.subscription.unsubscribe(),this.performanceObserver&&=(this.performanceObserver.disconnect(),null),this.pendingConnectionMetrics.clear(),this.tracer.end()}doFetch(e,t){var n=this;return a(function*(e,t,r={}){let i;if(n.useUrlCacheMechanism&&r.urlCacheMechanismEnabled&&$a()){i=yield Qa(e);let t=yield i.get();if(t)return t}let a=yield Ia.fetchPolyfilled(e,t);if(a.ok)return yield i?.set(a),a;let o=yield a.text();if(n.handleExtendedNetworkErrorsSet){Wa({txtCode:o,httpCode:a.status,error$:n.error$,recoverableError$:n.recoverableError$});return}let s=parseInt(o);if(!isNaN(s))switch(s){case 1:n.recoverableError$.next({id:`VideoDataLinkExpiredError`,message:`Video data links have expired`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;case 8:n.recoverableError$.next({id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;case 18:n.recoverableError$.next({id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;case 21:n.recoverableError$.next({id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;default:n.error$.next({id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${s})`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o})}}).apply(this,arguments)}}var ao=require(`@vkontakte/videoplayer-shared`),oo=require(`@vkontakte/videoplayer-shared`),so=require(`@vkontakte/videoplayer-shared`),co=require(`@vkontakte/videoplayer-shared`),lo=require(`@vkontakte/videoplayer-shared`),uo=require(`@vkontakte/videoplayer-shared`),fo=require(`@vkontakte/videoplayer-shared`),po=e=>{let[t,...n]=e.split(`.`);if(!t)return!1;switch(t){case`av01`:{let[e,t,r]=n;return!!(r&&parseInt(r,10)>8)}case`vp09`:{let[e,t,r]=n;return!!(e&&parseInt(e,10)>=2&&r&&parseInt(r,10)>8)}case`avc1`:{let e=n[0];if(!e||e.length!==6)return!1;let[t,r]=e.toUpperCase(),i=t+r;return fo.arrayIncludes([`6E`,`7A`,`F4`],i)}}return!1},mo=require(`@vkontakte/videoplayer-shared`),ho=require(`@vkontakte/videoplayer-shared`),go=e=>{if(ho.arrayIncludes(e,`/`)){let t=e.split(`/`);return parseInt(t[0])/parseInt(t[1])}else return parseFloat(e)},_o=e=>{try{let t=vo(),{groups:n}=e.match(t)??{};if(n){let e={};if(n.extensions){let t=n.extensions.toLowerCase().match(/(?:[0-9a-wy-z](?:-[a-z0-9]{2,8})+)/g);Array.from(t||[]).forEach(t=>{e[t[0]]=t.slice(2)})}let t=n.variants?.split(/-/).filter(e=>e!==``),r={extlang:n.extlang,langtag:n.langtag,language:n.language,privateuse:n.privateuse||n.privateuse2,region:n.region,script:n.script,extensions:e,variants:t};return Object.keys(r).forEach(e=>{let t=r[e];(t===void 0||t===``)&&delete r[e]}),r}return null}catch{return null}};function vo(){let e=`x(?:-[a-z0-9]{1,8})+`,t=`^(?:(?<langtag>${`
|
|
238
|
+
`}}class Ca{static createRule(e,t=Hi(1)){switch(e){case`throughput_rule`:return new xa(t);case`min_audio_for_video_rule`:return new Sa(t)}}}var wa=Hi(1),Ta={},Ea={},Da=(e,t)=>(t?Ta:Ea)[e]??wa;class Oa{constructor(){i(this,`stallsController`,new _i),i(this,`videoAbrController`,new Pi),i(this,`audioAbrController`,new Pi),i(this,`subscription`,new Fi.Subscription),i(this,`lastVideoTrackSelected$`,new Fi.ValueSubject(void 0)),i(this,`context`,void 0),i(this,`phaseController`,void 0),i(this,`allVideoRules`,[])}init(e){this.context=o(o({},this.context),e),this.initVideoElementAbrContext(),this.stallsController.init(o(o({},this.context),{},{tuning:this.context.tuning.stallsManager,lastVideoTrackSelected$:this.lastVideoTrackSelected$}));let t=this.context.tuning.dash.abrVideoRules,n=[];if(this.context.tuning.dash.useAbrPhases){this.phaseController=new Ui(this.context.isSeeked$);for(let e of t){let t=ya.createRule(e,Da(e,!0));this.allVideoRules.push(t)}n.push(...this.allVideoRules)}else for(let e of t)n.push(ya.createRule(e,Da(e,!1)));let r=this.context.tuning.dash.abrAudioRules.map(e=>Ca.createRule(e)),i=o({},e);this.videoAbrController.init(n,i),this.audioAbrController.init(r,i)}updateContext(e){this.context.isAuto=e.isAuto,this.context.currentVideoTrack=e.currentVideoTrack,this.context.desiredVideoTrack=e.desiredVideoTrack,this.context.limits=e.limits,this.context.forwardBufferHealth=e.forwardBufferHealth,this.context.forwardBufferDuration=e.forwardBufferDuration,this.context.forwardVideoBufferRepresentations=e.forwardVideoBufferRepresentations,this.context.forwardAudioBufferRepresentations=e.forwardAudioBufferRepresentations,this.context.videoSegmentLoadProgress=e.videoSegmentLoadProgress,this.context.isLive=e.isLive,this.context.remainingDurationMs=e.remainingDurationMs,this.context.mpdSegmentDurationMs=e.mpdSegmentDurationMs,this.updateTracksIfneeded(e.videoTracks,e.audioTracks)}autoSelectTrack(e){let t=Ni(this.lastVideoTrackSelected$.getValue(),this.context.videoTracksAsc,this.context.audioTracksAsc??[],this.context.tuning.autoTrackSelection.minVideoAudioRatio)??this.context.audioTracksAsc?.[0],n=this.phaseController?.phase;if(this.videoAbrController.updateContext({videoTracksAsc:this.context.videoTracksAsc,videoTracksDesc:this.context.videoTracksDesc,currentVideoTrack:this.context.currentVideoTrack,tuning:this.context.tuning,abrLogger:this.context.abrLogger,forwardBufferRepresentations:this.context.forwardVideoBufferRepresentations,container:this.context.elementSizeManager?.getValue(),panelSize:this.context.panelSize,estimatedThroughput:this.context.throughput$.getValue(),limits:this.context.limits,reserve:t?.bitrate??0,forwardBufferHealth:this.context.forwardBufferHealth,forwardBufferDuration:this.context.forwardBufferDuration,visible:this.context.elementVisible$.getValue(),playbackRate:this.context.element.playbackRate,lastVideoTrackSelected:this.lastVideoTrackSelected$.getValue(),severeStallOccurred:this.stallsController.severeStallOccurred$.getValue(),lastStallDuration:this.stallsController.lastStallDuration$.getValue(),videoSegmentLoadProgress:this.context.videoSegmentLoadProgress,throughputVariance:this.context.throughputVariance$?.getValue()??0,isLive:this.context.isLive??!1,remainingDurationMs:this.context.remainingDurationMs,mpdSegmentDurationMs:this.context.mpdSegmentDurationMs,phase:n}),this.audioAbrController.updateContext({videoTracksAsc:this.context.videoTracksAsc,videoTracksDesc:this.context.videoTracksDesc,audioTracksAsc:this.context.audioTracksAsc,audioTracksDesc:this.context.audioTracksDesc,tuning:this.context.tuning,abrLogger:this.context.abrLogger,forwardBufferHealth:this.context.forwardBufferHealth,forwardBufferDuration:this.context.forwardBufferDuration,playbackRate:this.context.element.playbackRate,estimatedThroughput:this.context.throughput$.getValue(),reserve:this.lastVideoTrackSelected$.getValue()?.bitrate??0,currentVideoTrack:this.context.currentVideoTrack,lastVideoTrackSelected:this.lastVideoTrackSelected$.getValue(),throughputVariance:0}),e===`audio`)return this.audioAbrController.autoSelectTrack();let r=this.context.desiredVideoTrack;if(this.context.isAuto||Fi.isNullable(r))if(this.phaseController){this.phaseController.updatePhase(this.videoAbrController.context);let e=this.phaseController.phase,t=this.allVideoRules.filter(t=>t.activePhases.has(e));r=this.videoAbrController.autoSelectTrack(t)}else r=this.videoAbrController.autoSelectTrack();return this.lastVideoTrackSelected$.next(r),r}destroy(){this.subscription.unsubscribe(),this.videoAbrController.destroy(),this.audioAbrController.destroy(),this.phaseController?.destroy(),this.stallsController.destroy(),this.context.elementSizeManager?.destroy()}initVideoElementAbrContext(){let e=new Fi.ValueSubject(!1);this.subscription.add(hr(this.context.element,{threshold:this.context.tuning.autoTrackSelection.activeVideoAreaThreshold}).subscribe(e));let t=Jt(this.context.element);this.subscription.add(()=>t?.destroy());let n;this.context.element instanceof HTMLVideoElement&&(n=new pi,n.connect({video:this.context.element,observableVideo:t})),this.context=o(o({},this.context),{},{elementVisible$:e,observableVideo:t,elementSizeManager:n})}updateTracksIfneeded(e=[],t=[]){let{videoTracksAsc:n,videoTracksDesc:r,audioTracksAsc:i,audioTracksDesc:a}=this.context;if(this.isTracksDifferent(e,n,r)){let t=[...e].filter(e=>!Fi.isInvariantQuality(e.quality));this.context.videoTracksAsc=[...t].sort(Oi(1)),this.context.videoTracksDesc=[...t].sort(Oi(-1))}this.isTracksDifferent(t,i,a)&&(this.audioAbrController.historyReset(),this.context.audioTracksAsc=[...t].sort(Di(1)),this.context.audioTracksDesc=[...t].sort(Di(-1)))}isTracksDifferent(e,t=[],n=[]){let r=!1;for(let i of e)(Fi.isNullable(t.find(e=>i.id===e.id))||Fi.isNullable(n.find(e=>i.id===e.id)))&&(r=!0);return t.length!==e.length&&n.length!==e.length||r}}class ka{constructor(e){i(this,`scene3D`,void 0),i(this,`subscription`,new B.Subscription),i(this,`volumeSubscription`,new B.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`allocation`,void 0),i(this,`observableVideo`,null),i(this,`player`,void 0),i(this,`params`,void 0),i(this,`tracer`,void 0),i(this,`textTracksManager`,null),i(this,`droppedFramesManager`,new dr),i(this,`stallsManager`,new di),i(this,`elementSizeManager`,new pi),i(this,`abrManager`,new Oa),i(this,`videoTracksMap`,new Map),i(this,`audioTracksMap`,new Map),i(this,`textTracksMap`,new Map),i(this,`videoStreamsMap`,new Map),i(this,`audioStreamsMap`,new Map),i(this,`videoTrackSwitchHistory`,new hn),i(this,`audioTrackSwitchHistory`,new hn),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(!this.videoState.getTransition()){if(r.state===`requested`&&n?.to!==`paused`&&e!==`stopped`&&t!==`stopped`&&this.seek(r.position,r.forcePrecise),t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.player.stop(),this.allocation.target.load(),this.params.output.position$.next(0),this.params.output.duration$.next(1/0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}switch(e){case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();return;case`ready`:t===`paused`?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`ready`&&k(this.params.desiredState.playbackState,`ready`);return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):t===`playing`&&this.allocation.target.paused?this.playIfAllowed():n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`paused`&&k(this.params.desiredState.playbackState,`paused`);return;default:return B.assertNever(e)}}}),i(this,`init3DScene`,e=>{if(this.scene3D)return;let t=this.params.allocation.parent,n=this.allocation.video;if(!t||!n)return;this.scene3D=new ni(t,n,{fov:this.params.tuning.spherical.fov,orientation:this.params.tuning.spherical.orientation||{x:e.projectionData?.pose.yaw||0,y:e.projectionData?.pose.pitch||0,z:e.projectionData?.pose.roll||0},rotationSpeed:this.params.tuning.spherical.rotationSpeed,maxYawAngle:this.params.tuning.spherical.maxYawAngle,rotationSpeedCorrection:this.params.tuning.spherical.rotationSpeedCorrection,degreeToPixelCorrection:this.params.tuning.spherical.degreeToPixelCorrection,speedFadeTime:this.params.tuning.spherical.speedFadeTime,speedFadeThreshold:this.params.tuning.spherical.speedFadeThreshold});let r=this.elementSizeManager.getValue();r&&this.scene3D.setViewportSize(r.width,r.height)}),i(this,`destroy3DScene`,()=>{this.scene3D&&=(this.scene3D.destroy(),void 0)}),e.tuning.disableSubtitles||(this.textTracksManager=new Bt(e.source.url)),this.params=e,this.allocation=Lr(e.allocation,e.tuning),this.tracer=e.dependencies.tracer.createComponentTracer(this.constructor.name),this.params.output.element$.next(this.allocation.video??void 0),this.params.output.availableVideoTracks$.next([]),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.output.hostname$.next(jn(this.params.source.url)),this.params.output.isLive$.next(!1),this.params.output.autoVideoTrackLimitingAvailable$.next(!0),this.params.output.availableTextTracks$.next([]),this.params.desiredState.internalTextTracks.setState([]),this.player=this.getPlayer(),this.subscribe()}getProviderSubscriptionInfo(){let{output:e,desiredState:t}=this.params;B.isNullable(this.observableVideo)&&(this.observableVideo=Jt(this.allocation.target),this.subscription.add(()=>this.observableVideo?.destroy()));let n=this.constructor.name,r=t=>{e.error$.next({id:n,category:B.ErrorCategory.WTF,message:`${n} internal logic error`,thrown:t})};return{output:e,desiredState:t,observableVideo:this.observableVideo,genericErrorListener:r,connect:(e,t)=>this.subscription.add(e.subscribe(t,r))}}subscribe(){var e=this;let{output:t,desiredState:n,observableVideo:r,genericErrorListener:i,connect:s}=this.getProviderSubscriptionInfo(),c=this.allocation.video;c&&this.subscription.add(this.params.output.availableVideoTracks$.pipe(B.filter(e=>!!e.length),B.once()).subscribe(e=>{this.droppedFramesManager.connect({logger:this.params.dependencies.logger,video:c,droppedFramesChecker:this.params.tuning.droppedFramesChecker,isAuto:this.params.desiredState.autoVideoTrackSwitching,playing$:r.playing$,pause$:r.pause$,tracks:e})}));let l=this.params.desiredState.seekState.stateChangeEnded$.pipe(B.map(e=>e.to.state!==`none`),B.filterChanged());this.abrManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,throughputVariance$:this.params.dependencies.throughputEstimator.throughputVariance$,tuning:this.params.tuning,failedVideoTrack:this.params.failedVideoTrack,element:this.allocation.target,abrLogger:this.params.dependencies.abrLogger}),this.stallsManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,tuning:this.params.tuning.stallsManager,abrParams:this.params.tuning.autoTrackSelection,isBuffering$:r.isBuffering$,looped$:r.looped$,playing$:r.playing$,duration:this.allocation.target.duration}),s(r.ended$,t.endedEvent$),s(r.looped$,t.loopedEvent$),s(r.error$,t.error$),s(r.isBuffering$,t.isBuffering$),s(r.currentBuffer$,t.currentNativeBuffer$),s(r.playing$,t.firstFrameEvent$),s(r.playedTime$,t.playedTime$),s(r.inPiP$,t.inPiP$),s(r.inFullscreen$,t.inFullscreen$),s(r.loadedMetadata$,t.loadedMetadataEvent$),s(this.player.currentBuffer$.pipe(B.filter(e=>e.to>0),B.once(),B.mapTo(void 0)),t.canplay$),s(this.player.error$,t.error$),s(this.player.fetcherRecoverableError$,t.fetcherRecoverableError$),s(this.player.fetcherError$,t.fetcherError$),s(this.player.updateDurationError$,t.updateDurationError$),s(this.player.videoLastDataObtainedTimestamp$,t.videoLastDataObtainedTimestamp$),s(this.player.lastConnectionType$,t.httpConnectionType$),s(this.player.lastConnectionReused$,t.httpConnectionReused$),s(this.player.lastConnectionMetrics$,t.httpConnectionMetrics$),s(this.player.lastDownloadMetrics$,t.httpDownloadMetrics$),s(this.player.isLive$,t.isLive$),s(this.player.currentBuffer$,t.currentBuffer$),s(this.player.lastRequestFirstBytes$.pipe(B.filter(B.isNonNullable),B.once()),t.firstBytesEvent$),s(this.stallsManager.severeStallOccurred$,t.severeStallOccurred$),s(this.videoState.stateChangeEnded$.pipe(B.map(e=>e.to)),this.params.output.playbackState$),this.subscription.add(r.looped$.subscribe(()=>this.player.warmUpMediaSourceIfNeeded(),i)),this.subscription.add(r.seeked$.subscribe(t.seekedEvent$,i)),this.subscription.add(Nt(this.allocation.target,n.isLooped,i)),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(e=>{this.volumeSubscription.unsubscribe(),e?this.volumeSubscription.add(n.volume.stateChangeStarted$.subscribe(({to:e})=>this.params.output.volume$.next(e),i)):this.volumeSubscription.add(r.volumeState$.subscribe(this.params.output.volume$,i))})),hi({subscription:this.subscription,desiredState:n,videoElement$:this.params.output.element$,observableVideo:r}),this.subscription.add(Pt(this.allocation.target,n.volume,r.volumeState$,i,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.subscription.add(Ft(this.allocation.target,n.playbackRate,r.playbackRateState$,i)),this.allocation.video&&this.elementSizeManager.connect({video:this.allocation.video,observableVideo:r}),s(hr(this.allocation.target,{threshold:this.params.tuning.autoTrackSelection.activeVideoAreaThreshold}),t.elementVisible$),this.subscription.add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`),k(n.playbackState,`playing`),this.scene3D&&this.scene3D.play()},i)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)},i)).add(r.canplay$.subscribe(()=>{this.videoState.getState()===`playing`&&this.playIfAllowed()},i)),this.params.tuning.changePlaybackStateToPausedWhenEnded&&this.subscription.add(r.ended$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)})),this.subscription.add(this.player.manifestRequested.subscribe(this.params.output.manifestRequested$)).add(this.player.manifestReceived.subscribe(this.params.output.manifestReceived$)).add(this.player.firstBytesRequested.subscribe(this.params.output.firstBytesRequested$)).add(this.player.firstBytesReceived.subscribe(this.params.output.firstBytesReceived$)),this.subscription.add(this.player.state$.stateChangeEnded$.subscribe(({to:e})=>{if(e===`manifest_ready`){this.videoTracksMap=new Map,this.audioTracksMap=new Map,this.textTracksMap=new Map;let e=this.player.getStreams(),t=this.player.getCodecs();if(B.assertNonNullable(e,`Manifest not loaded or empty`),!this.params.tuning.isAudioDisabled){let t=[];for(let n of e.audio){t.push(Yr(n));let e=[];for(let t of n.representations){let r=Kr(t);e.push(r),this.audioTracksMap.set(r,{stream:n,representation:t})}this.audioStreamsMap.set(n,e)}this.params.output.availableAudioStreams$.next(t)}let n=[];for(let t of e.video){n.push(Xr(t));let e=[];for(let n of t.representations){let r=Gr(o(o({},n),{},{streamId:t.id}));r&&(e.push(r),this.videoTracksMap.set(r,{stream:t,representation:n}))}this.videoStreamsMap.set(t,e)}this.params.output.availableVideoStreams$.next(n);for(let t of e.text)for(let e of t.representations){let n=qr(t,e);this.textTracksMap.set(n,{stream:t,representation:e})}this.params.output.availableVideoTracks$.next(Array.from(this.videoTracksMap.keys())),this.params.output.availableAudioTracks$.next(Array.from(this.audioTracksMap.keys())),this.params.output.isAudioAvailable$.next(!!this.audioTracksMap.size),t?.video&&this.params.output.availableVideoCodecs$.next(t.video),t?.audio&&this.params.output.availableAudioCodecs$.next(t.audio),this.audioTracksMap.size&&this.textTracksMap.size&&this.params.desiredState.internalTextTracks.startTransitionTo(Array.from(this.textTracksMap.keys()))}else e===`representations_ready`&&(this.videoState.setState(`ready`),this.player.initBuffer())},i));let u=B.merge(this.player.currentStallDuration$,this.player.state$.stateChangeEnded$,n.videoTrack.stateChangeStarted$,n.autoVideoTrackSwitching.transitionStarted$,this.params.dependencies.throughputEstimator.rttAdjustedThroughput$,n.autoVideoTrackLimits.stateChangeStarted$,this.elementSizeManager.getObservable(),this.params.output.elementVisible$,this.droppedFramesManager.onDroopedVideoFramesLimit$,B.fromEvent(this.allocation.target,`progress`)).pipe(B.filter(()=>this.videoTracksMap.size>0||this.audioTracksMap.size>0)),{abrThrottle:d}=this.params.tuning.dash;d&&(u=u.pipe(B.throttle(d))),this.subscription.add(u.subscribe(a(function*(){let t=e.player.state$.getState(),r=e.player.state$.getTransition(),i=n.autoVideoTrackSwitching.getState()?`lazy`:`default`;if(t!==`manifest_ready`&&t!==`running`||r)return;n.autoVideoTrackSwitching.getTransition()&&n.autoVideoTrackSwitching.setState(n.autoVideoTrackSwitching.getState());let a=e.selectVideoAudioRepresentations();if(!a){if(e.audioStreamsMap.size){let[,[n]]=e.audioStreamsMap.entries().next().value;t===`manifest_ready`&&(yield e.player.initRepresentations(void 0,n.id,e.params.sourceHls))}return}let[o,s]=a,c=[...e.videoTracksMap.keys()].find(t=>e.videoTracksMap.get(t)?.representation.id===o.id);B.isNonNullable(c)&&(e.stallsManager.lastVideoTrackSelected=c);let l=e.params.desiredState.autoVideoTrackLimits.getTransition();l&&e.params.output.autoVideoTrackLimits$.next(l.to),t===`manifest_ready`?yield e.player.initRepresentations(o.id,s?.id,e.params.sourceHls):(yield e.player.switchRepresentation(`video`,o.id,i),s&&(yield e.player.switchRepresentation(`audio`,s.id,`force`)))}),i)),this.subscription.add(n.cameraOrientation.stateChangeEnded$.subscribe(({to:e})=>{this.scene3D&&e&&this.scene3D.pointCameraTo(e.x,e.y)})),this.subscription.add(this.elementSizeManager.subscribe(e=>{this.scene3D&&e&&this.scene3D.setViewportSize(e.width,e.height)})),this.subscription.add(this.player.currentVideoRepresentation$.pipe(B.filterChanged()).subscribe(e=>{let n=[...this.videoTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentVideoTrack$.next(void 0),t.currentVideoStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.videoStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.videoStream.setState(a.to),t.currentVideoTrack$.next(r),t.currentVideoStream$.next(Xr(i))},i)),this.subscription.add(this.player.currentAudioRepresentation$.pipe(B.filterChanged()).subscribe(e=>{let n=[...this.audioTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentAudioStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.audioStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.audioStream.setState(a.to),t.currentAudioStream$.next(Yr(i))},i)),this.subscription.add(this.player.currentVideoRepresentationInit$.subscribe(e=>{if(e?.is3dVideo&&this.params.tuning.spherical?.enabled)try{this.init3DScene(e),t.is3DVideo$.next(!0)}catch(e){t.warning$.next({id:`DashProvider`,message:`DashProvider could not initialize 3D-scene: ${e}`})}else this.destroy3DScene(),this.params.tuning.spherical?.enabled&&t.is3DVideo$.next(!1)},i)),this.subscription.add(this.player.currentVideoSegmentLength$.subscribe(t.currentVideoSegmentLength$,i)),this.subscription.add(this.player.currentAudioSegmentLength$.subscribe(t.currentAudioSegmentLength$,i)),this.allocation.video&&this.textTracksManager?.connect(this.allocation.video,n,t);let f=n.playbackState.stateChangeStarted$.pipe(B.map(({to:e})=>e===`ready`),B.filterChanged());this.subscription.add(B.merge(f,n.autoVideoTrackSwitching.stateChangeStarted$,this.player.state$.stateChangeEnded$,B.observableFrom([`init`])).subscribe(()=>{let e=n.autoVideoTrackSwitching.getState(),t=n.playbackState.getState()===`ready`?this.params.tuning.dash.forwardBufferTargetPreload:e?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;this.player.setBufferTarget(t)})),this.subscription.add(B.merge(f,this.player.state$.stateChangeEnded$,B.observableFrom([`init`])).subscribe(()=>this.player.setPreloadOnly(n.playbackState.getState()===`ready`)));let p=B.merge(n.playbackState.stateChangeStarted$,n.videoTrack.stateChangeStarted$,n.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,B.observableFrom([`init`])).pipe(B.debounce(0));this.subscription.add(p.subscribe(this.syncPlayback,i))}selectVideoAudioRepresentations(){if(this.player.isStreamEnded)return;let e=this.params.tuning.useNewAutoSelectVideoTrack?xn:bn,t=this.params.tuning.useNewAutoSelectVideoTrack?An:kn,n=this.params.tuning.useNewAutoSelectVideoTrack?Dn:On,{desiredState:r,output:i}=this.params,a=r.autoVideoTrackSwitching.getState(),s=r.videoTrack.getState()?.id,c=[...this.videoTracksMap.keys()].find(({id:e})=>e===s),l=i.currentVideoTrack$.getValue(),u=r.videoStream.getState()??(c&&this.videoTracksMap.get(c)?.stream)??this.videoStreamsMap.size===1?this.videoStreamsMap.keys().next().value:void 0;if(!u)return;let d=[...this.videoStreamsMap.keys()].find(({id:e})=>e===u.id),f=d&&this.videoStreamsMap.get(d);if(!f)return;let p=this.player.bufferLength$.getValue(),m;m=this.player.isActiveLive$.getValue()?this.player.isLowLatency$.getValue()?this.params.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.params.tuning.dashCmafLive.normalizedLiveMinBufferSize:this.player.isLive$.getValue()?this.params.tuning.dashCmafLive.normalizedTargetMinBufferSize:a?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;let h=(this.allocation.target.duration*1e3||1/0)-this.allocation.target.currentTime*1e3,g=Math.min(p/Math.min(m,h||1/0),1),_=r.audioStream.getState()??(this.audioStreamsMap.size===1?this.audioStreamsMap.keys().next().value:void 0),v=[...this.audioStreamsMap.keys()].find(({id:e})=>e===_?.id)??this.audioStreamsMap.keys().next().value,y=0;if(v){if(c&&!a){let t=e(c,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}if(l){let t=e(l,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}}let b=this.player.isLive$.getValue(),x=this.allocation.target.duration*1e3,S=!b&&Number.isFinite(x)&&x>0?Math.max(0,x-this.allocation.target.currentTime*1e3):void 0,C=this.params.tuning.dash.useAbrPhases?{videoSegmentLoadProgress:this.player.getActiveVideoSegmentProgress(),isLive:b,remainingDurationMs:S,mpdSegmentDurationMs:this.player.getMpdVideoSegmentDuration()}:{};this.abrManager.updateContext(o({isAuto:a,videoTracks:f,audioTracks:v?this.audioStreamsMap.get(v)??[]:[],currentVideoTrack:l,desiredVideoTrack:c,limits:this.params.desiredState.autoVideoTrackLimits.getState(),forwardBufferHealth:g,forwardBufferDuration:p,forwardVideoBufferRepresentations:this.player.getForwardBufferRepresentations(`video`),forwardAudioBufferRepresentations:this.player.getForwardBufferRepresentations(`audio`)},C));let w=c,T;this.params.tuning.dash.useNewAbr?(w=this.abrManager.autoSelectTrack(`video`),T=v&&this.abrManager.autoSelectTrack(`audio`)):((a||!w)&&(w=n(f,{container:this.elementSizeManager.getValue(),panelSize:this.params.panelSize,estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),tuning:this.stallsManager.abrTuningParams,limits:this.params.desiredState.autoVideoTrackLimits.getState(),reserve:y,forwardBufferHealth:g,current:l,visible:this.params.output.elementVisible$.getValue(),history:this.videoTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,droppedVideoMaxQualityLimit:this.droppedFramesManager.droppedVideoMaxQualityLimit,stallsVideoMaxQualityLimit:this.stallsManager.videoMaxQualityLimit,stallsPredictedThroughput:this.stallsManager.predictedThroughput,abrLogger:this.params.dependencies.abrLogger})),T=v&&t(w,f,this.audioStreamsMap.get(v)??[],{estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),stallsPredictedThroughput:this.stallsManager.predictedThroughput,tuning:this.stallsManager.abrTuningParams,forwardBufferHealth:g,history:this.audioTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,abrLogger:this.params.dependencies.abrLogger}));let E=this.videoTracksMap.get(w)?.representation,ee=T&&this.audioTracksMap.get(T)?.representation;if(E&&ee)return[E,ee];if(E&&!ee&&this.audioTracksMap.size===0)return[E,void 0]}prepare(e=0){this.player.initManifest(this.allocation.target,this.params.source.url,e)}playIfAllowed(){let e=Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}),t=e=>{e||(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`,!0))},n=e=>{this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:B.ErrorCategory.DOM,thrown:e})};this.params.tuning.ignoreForcePlayResultWhenProviderChanged?this.subscription.add(B.observableFrom(e).subscribe(t,n)):e.then(t,n)}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.droppedFramesManager.destroy(),this.stallsManager.destroy(),this.abrManager.destroy(),this.elementSizeManager.destroy(),this.destroy3DScene(),this.textTracksManager?.destroy(),this.player.destroy(),this.params.output.element$.next(void 0),this.params.output.currentVideoStream$.next(void 0),Dt(this.allocation.target,this.params.tuning),this.tracer.end()}}var Aa=require(`@vkontakte/videoplayer-shared`),ja=require(`@vkontakte/videoplayer-shared`),Ma=require(`@vkontakte/videoplayer-shared`),Na=require(`@vkontakte/videoplayer-shared`),Pa=e=>{if(!e)return{id:`EmptyResponse`,category:Na.ErrorCategory.PARSER,message:`Empty response`};if(e.length<=2&&e.match(/^\d+$/))return{id:`UVError#${e}`,category:Na.ErrorCategory.NETWORK,message:`UV Error ${e}`};let t=Ma.stringTrimStart(e).substring(0,100).toLowerCase();if(t.startsWith(`<!doctype`)||t.startsWith(`<html>`)||t.startsWith(`<body>`)||t.startsWith(`<head>`))return{id:`UnexpectedHTML`,category:Na.ErrorCategory.NETWORK,message:`Received unexpected HTML, possibly a ISP block`};if(t.startsWith(`<?xml`))return new DOMParser().parseFromString(e,`text/xml`).querySelector(`parsererror`)?{id:`InvalidXML`,category:Na.ErrorCategory.PARSER,message:`XML parsing error`}:{id:`XMLParserLogicError`,category:Na.ErrorCategory.PARSER,message:`Response is valid XML, but parser failed`}},V=require(`@vkontakte/videoplayer-shared`),Fa=require(`@vkontakte/videoplayer-shared`),Ia=require(`@vkontakte/videoplayer-shared`),La=e=>{let t=new URL(e);return t.searchParams.set(`quic`,`1`),t.toString()},Ra=e=>{let t=e.get(`X-Delivery-Type`),n=e.get(`X-Reused`);return{type:t===null?`http1`:t??void 0,reused:n===null?void 0:{1:!0,0:!1}[n]??void 0}},H=require(`@vkontakte/videoplayer-shared`),za=e=>{let t=new URL(e);return t.searchParams.set(`enable-subtitles`,`yes`),t.toString()},Ba=require(`@vkontakte/videoplayer-shared`),Va=new Set([2,3,4,5,6,9,19]),Ha=new Set([1,8,18,21]),Ua=new Set([10,11,12,13,14,15,16]),Wa=({txtCode:e,error$:t,recoverableError$:n,httpCode:r})=>{let i=parseInt(e);if(isNaN(i))return;let a=o(o({},Ga(i)),{},{httpCode:r,UVBackendErrorCode:e});if(Va.has(i)){t.next(o(o({},a),{},{category:Ba.ErrorCategory.NETWORK}));return}if(Ha.has(i)){n.next(o(o({},a),{},{category:Ba.ErrorCategory.FATAL}));return}if(Ua.has(i)){t.next(o(o({},a),{},{category:Ba.ErrorCategory.FATAL}));return}},Ga=e=>{switch(e){case 1:return{id:`VideoDataLinkExpiredError`,message:`Video data links have expired`};case 5:return{id:`VideoServerError`,message:`Server error`};case 8:return{id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`};case 10:return{id:`UserAgentChange`,message:`User agent changed`};case 11:return{id:`forbiddenReferer`,message:`Forbidden referer`};case 12:case 13:case 14:case 15:case 16:return{id:`OKerror`,message:`Error #${e}`};case 18:return{id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`};case 21:return{id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`};default:return Ka(e)}};function Ka(e){return{id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${e})`}}var qa=require(`@vkontakte/videoplayer-shared`),Ja=`vk_player_cached_fetches`,Ya=[`fromCache`,`expires`,`sig`],Xa=300*1e3,Za=`x-cache-expires`,Qa=function(){var e=a(function*(e){let t=eo(e),n=yield qa.getWindow().caches.open(Ja);return{get:function(){var e=a(function*(){let e=yield n.match(t);return e&&!to(e)?(qa.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_hit`]}),e):(e&&(yield n.delete(t),qa.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_missed`,`expired`]})),null)});return function(){return e.apply(this,arguments)}}(),set:function(){var r=a(function*(r){yield n.put(t,no(r,e))});return function(e){return r.apply(this,arguments)}}()}});return function(t){return e.apply(this,arguments)}}();function $a(){return typeof caches<`u`}function eo(e){try{let t=new URL(e);return t.hostname=`cache.local`,Ya.forEach(e=>t.searchParams.delete(e)),t.toString()}catch{return e}}function to(e){let t=e.headers.get(Za);if(!t)return!0;let n=Number(t);return isNaN(n)||n<=Date.now()}function no(e,t){let n=e.clone();return new Response(n.body,{status:n.status,statusText:n.statusText,headers:new Headers(o(o({},Array.from(n.headers.entries())),{},{[Za]:ro(t).toString()}))})}function ro(e){try{let t=new URL(e).searchParams.get(`expires`);if(t&&!isNaN(Number(t)))return Number(t)}catch{return 0}return Date.now()+Xa}class io{constructor({throughputEstimator:e,requestQuic:t,tracer:n,compatibilityMode:r=!1,useEnableSubtitlesParam:a=!1,handleExtendedNetworkErrorsSet:l=!1,useUrlCacheMechanism:u=!1,measureNonSegmentRequests:d=!1}){i(this,`throughputEstimator`,void 0),i(this,`requestQuic`,void 0),i(this,`tracer`,void 0),i(this,`manifestRequested`,new H.Subject),i(this,`manifestReceived`,new H.Subject),i(this,`firstBytesRequested`,new H.Subject),i(this,`firstBytesReceived`,new H.Subject),i(this,`lastConnectionType$`,new H.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new H.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new H.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new H.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new H.ValueSubject(void 0)),i(this,`recoverableError$`,new H.Subject),i(this,`error$`,new H.Subject),i(this,`abortAllController`,new Fa.AbortControllerPolyfilled),i(this,`subscription`,new H.Subscription),i(this,`compatibilityMode`,void 0),i(this,`useEnableSubtitlesParam`,void 0),i(this,`useUrlCacheMechanism`,void 0),i(this,`measureNonSegmentRequests`,void 0),i(this,`startupPhase`,!0),i(this,`performanceObserver`,null),i(this,`pendingConnectionMetrics`,new Map),i(this,`handleExtendedNetworkErrorsSet`,!1),i(this,`fetchManifest`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e){let t=this.tracer.createComponentTracer(`FetchManifest`),n=e;this.requestQuic&&(n=La(n)),!this.compatibilityMode&&this.useEnableSubtitlesParam&&(n=za(n)),this.trackRequestStart(n,performance.now());let r=H.now();this.manifestRequested.next();let i=yield this.doFetch(n,{signal:this.abortAllController.signal}).catch(H.suppressAbort);if(i){let a=H.now();t.log(`success`,H.flattenObject({url:n,message:`Request successfully executed`})),t.end(),this.manifestReceived.next(),this.onHeadersReceived(i.headers);let o=i.headers.get(`content-length`),c=0;o&&(c=parseInt(o,10));let l=yield s(i.text());if((!o||isNaN(c)||c<=0)&&(c=new TextEncoder().encode(l).length),c>0){let t=a-r,n=c/(t/1e3)*8/1024,i={bytes:c,speed:n,url:e};this.lastDownloadMetrics$.next(i)}if(this.measureNonSegmentRequests&&this.startupPhase&&(this.throughputEstimator?.addRawRtt(a-r),o&&c>0)){let e=H.now();this.throughputEstimator?.addRawSpeed(c,e-r)}return l}else return t.error(`error`,H.flattenObject({url:n,message:`No data in request manifest`})),t.end(),null});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetch`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e,{rangeMethod:t=this.compatibilityMode?0:1,range:n,onProgress:r,priority:i=`auto`,signal:a,measureThroughput:o=!0,isLowLatency:s=!1,bufferOptimisation:l=!1,urlCacheMechanismEnabled:u}={}){let d=e,f=new Headers,p=this.tracer.createComponentTracer(`Fetch`);if(n)switch(t){case 0:f.append(`Range`,`bytes=${n.from}-${n.to}`);break;case 1:{let e=new URL(d,H.getWindow().location.href);e.searchParams.append(`bytes`,`${n.from}-${n.to}`),d=e.toString();break}default:H.assertNever(t)}this.requestQuic&&(d=La(d));let m=this.abortAllController.signal,h;if(a){let e=new Fa.AbortControllerPolyfilled;if(h=H.merge(H.fromEvent(this.abortAllController.signal,`abort`),H.fromEvent(a,`abort`)).subscribe(()=>{try{e.abort()}catch(e){H.suppressAbort(e)}}),this.subscription.add(h),this.abortAllController.signal.aborted||a.aborted)try{e.abort()}catch(e){H.suppressAbort(e)}m=e.signal}let g=0,_=H.now();p.log(`startRequest`,H.flattenObject({url:d,priority:i,rangeMethod:t,range:n,isLowLatency:s,requestStartedAt:_})),this.trackRequestStart(d,performance.now()),this.firstBytesRequested.next();let v=yield this.doFetch(d,{priority:i,headers:f,signal:m},{urlCacheMechanismEnabled:u}),y=H.now();if(!v)return p.error(`error`,{message:`No response in request`}),p.end(),h?.unsubscribe(),null;if(this.throughputEstimator?.addRawRtt(y-_),!v.ok||!v.body){h?.unsubscribe();let e=`Fetch error ${v.status}: ${v.statusText}`;return p.error(`error`,{message:e}),p.end(),Promise.reject(Error(`Fetch error ${v.status}: ${v.statusText}`))}if(this.onHeadersReceived(v.headers),!r&&!o){let e=yield v.arrayBuffer(),t=H.now();if(this.measureNonSegmentRequests&&this.startupPhase){let e=v.headers.get(`content-length`),n=e?parseInt(e,10):NaN;Number.isFinite(n)&&n>0&&this.throughputEstimator?.addRawSpeed(n,t-_)}let n={requestStartedAt:_,requestEndedAt:t,duration:t-_};return p.log(`endRequest`,H.flattenObject(n)),p.end(),h?.unsubscribe(),e}let b=v.body;if(o){this.startupPhase=!1;let e;[b,e]=v.body.tee(),this.throughputEstimator?.trackStream(e,s)}let x=b.getReader(),S,C=parseInt(v.headers.get(`content-length`)??``,10);Number.isFinite(C)&&(S=C),!S&&n&&(S=n.to-n.from+1);let w=S?new Uint8Array(S):new Uint8Array,T=!1,E=e=>{h?.unsubscribe(),T=!0,H.suppressAbort(e)},ee=H.abortable(m,function(){var e=c(function*({done:e,value:t}){if(g===0&&(this.lastRequestFirstBytes$.next(H.now()-_),this.firstBytesReceived.next()),m.aborted){h?.unsubscribe();return}if(!e&&t){if(l&&S)w.set(t,g),g+=t.byteLength;else{let e=new Uint8Array(w.length+t.length);e.set(w),e.set(t,w.length),w=e,g+=t.byteLength}r?.(new DataView(w.buffer),g),yield x?.read().then(ee,E)}});return function(t){return e.apply(this,arguments)}}().bind(this));yield x?.read().then(ee,E),h?.unsubscribe();let te=H.now(),ne={failed:T,requestStartedAt:_,requestEndedAt:te,duration:te-_};if(T)return p.error(`endRequest`,H.flattenObject(ne)),p.end(),null;if(g>0){let t=te-_,n=g/(t/1e3)*8/1024,r={bytes:g,speed:n,url:e};this.lastDownloadMetrics$.next(r)}return p.log(`endRequest`,H.flattenObject(ne)),p.end(),w.buffer});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchByteRangeRepresentation`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t,n,r){if(e.type!==`byteRange`)return null;let{from:i,to:a}=e.initRange,s=i,c=a,l=!1,u,d;e.indexRange&&(u=e.indexRange.from,d=e.indexRange.to,l=a+1===u,l&&(s=Math.min(u,i),c=Math.max(d,a))),s=Math.min(s,0);let f=yield this.fetch(e.url,{range:{from:s,to:c},priority:r,signal:n,measureThroughput:!1,urlCacheMechanismEnabled:!0});if(!f)return null;let p=new DataView(f,i-s,a-s+1);if(!t.validateData(p))throw Error(`Invalid media file`);let m=t.parseInit(p),h=e.indexRange??t.getIndexRange(m);if(!h)throw ReferenceError(`No way to load representation index`);let g;if(l)g=new DataView(f,h.from-s,h.to-h.from+1);else{let t=yield this.fetch(e.url,{range:h,priority:r,signal:n,measureThroughput:!1,urlCacheMechanismEnabled:!0});if(!t)return null;g=new DataView(t)}let _=t.parseSegments(g,m,h).map(e=>o(o({},e),{},{networkStatus:`none`,bufferStatus:`none`}));return{initMetadata:m,initDataView:new DataView(f),segments:_}});return function(t,n,r,i){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchTemplateRepresentation`,H.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t,n){if(e.type!==`template`)return null;let r=new URL(e.initUrl,e.baseUrl).toString(),i=yield this.fetch(r,{priority:n,signal:t,measureThroughput:!1});if(!i)return null;let a=e.segments.map(e=>o(o({},e),{},{networkStatus:`none`,bufferStatus:`none`,size:void 0}));return{initMetadata:null,initDataView:new DataView(i),segments:a}});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),this.throughputEstimator=e,this.requestQuic=t,this.compatibilityMode=r,this.tracer=n.createComponentTracer(`Fetcher`),this.useEnableSubtitlesParam=a,this.handleExtendedNetworkErrorsSet=l,this.measureNonSegmentRequests=d,H.getWindow().PerformanceObserver&&this.setupPerformanceObserver(),this.useUrlCacheMechanism=u}onHeadersReceived(e){let{type:t,reused:n}=Ra(e);this.lastConnectionType$.next(t),this.lastConnectionReused$.next(n)}setupPerformanceObserver(){this.performanceObserver=new(H.getWindow()).PerformanceObserver(e=>{e.getEntriesByType(`resource`).forEach(e=>{this.processResourceTiming(e)})}),this.performanceObserver.observe({entryTypes:[`resource`]})}processResourceTiming(e){let t=this.findMatchingRequest(e);if(!t||!this.pendingConnectionMetrics.get(t))return;this.pendingConnectionMetrics.delete(t);let n=this.extractConnectionMetrics(e);n&&this.lastConnectionMetrics$.next(n)}estimateNetworkType(){if(!(`connection`in H.getWindow().navigator))return`unknown`;let e=H.getWindow().navigator.connection;return e.effectiveType?{"slow-2g":`2g`,"2g":`2g`,"3g":`3g`,"4g":`lte`}[e.effectiveType]||e.effectiveType:e.downlink?e.downlink<1?`2g`:e.downlink<5?`3g`:e.downlink<50?`lte`:`wifi`:e.rtt?e.rtt>500?`2g`:e.rtt>250?`3g`:e.rtt>50?`lte`:`wifi`:`unknown`}extractConnectionMetrics(e){let t=0,n=0,r=0,i=0;return e.domainLookupStart>0&&e.domainLookupEnd>0&&(t=e.domainLookupEnd-e.domainLookupStart),e.connectStart>0&&e.connectEnd>0&&(i=e.connectEnd-e.connectStart,e.secureConnectionStart>0?(r=e.connectEnd-e.secureConnectionStart,n=e.secureConnectionStart-e.connectStart):n=i),{dnsResolveTime:Math.max(0,t),tcpHandshakeTime:Math.max(0,n),tlsHandshakeTime:Math.max(0,r),totalConnectTime:Math.max(0,i),networkType:this.estimateNetworkType(),url:e.name}}findMatchingRequest(e){try{for(let[t,n]of this.pendingConnectionMetrics.entries()){let r=new URL(e.name),i=r.origin+r.pathname,a=new URL(n.url);if(i===a.origin+a.pathname&&e.startTime>=n.startTime-10&&e.startTime<=n.startTime+1e3)return t}}catch{this.recoverableError$.next({id:`VideoDataFetchError`,message:`Video data fetch error with getting download metrics`,category:H.ErrorCategory.WTF})}return null}trackRequestStart(e,t){let n=`${e}_${t}_${Math.random().toString(36).substr(2,9)}`;this.pendingConnectionMetrics.set(n,{url:e,startTime:t})}fetchRepresentation(e,t,n,r=`auto`){var i=this;return a(function*(){let{type:a}=e;switch(a){case`byteRange`:return i.fetchByteRangeRepresentation(e,t,n,r)??null;case`template`:return i.fetchTemplateRepresentation(e,n,r)??null;default:H.assertNever(a)}})()}destroy(){this.abortAllController.abort(),this.subscription.unsubscribe(),this.performanceObserver&&=(this.performanceObserver.disconnect(),null),this.pendingConnectionMetrics.clear(),this.tracer.end()}doFetch(e,t){var n=this;return a(function*(e,t,r={}){let i;if(n.useUrlCacheMechanism&&r.urlCacheMechanismEnabled&&$a()){i=yield Qa(e);let t=yield i.get();if(t)return t}let a=yield Ia.fetchPolyfilled(e,t);if(a.ok)return yield i?.set(a),a;let o=yield a.text();if(n.handleExtendedNetworkErrorsSet){Wa({txtCode:o,httpCode:a.status,error$:n.error$,recoverableError$:n.recoverableError$});return}let s=parseInt(o);if(!isNaN(s))switch(s){case 1:n.recoverableError$.next({id:`VideoDataLinkExpiredError`,message:`Video data links have expired`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;case 8:n.recoverableError$.next({id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;case 18:n.recoverableError$.next({id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;case 21:n.recoverableError$.next({id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o});break;default:n.error$.next({id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${s})`,category:H.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:o})}}).apply(this,arguments)}}var ao=require(`@vkontakte/videoplayer-shared`),oo=require(`@vkontakte/videoplayer-shared`),so=require(`@vkontakte/videoplayer-shared`),co=require(`@vkontakte/videoplayer-shared`),lo=require(`@vkontakte/videoplayer-shared`),uo=require(`@vkontakte/videoplayer-shared`),fo=require(`@vkontakte/videoplayer-shared`),po=e=>{let[t,...n]=e.split(`.`);if(!t)return!1;switch(t){case`av01`:{let[e,t,r]=n;return!!(r&&parseInt(r,10)>8)}case`vp09`:{let[e,t,r]=n;return!!(e&&parseInt(e,10)>=2&&r&&parseInt(r,10)>8)}case`avc1`:{let e=n[0];if(!e||e.length!==6)return!1;let[t,r]=e.toUpperCase(),i=t+r;return fo.arrayIncludes([`6E`,`7A`,`F4`],i)}}return!1},mo=require(`@vkontakte/videoplayer-shared`),ho=require(`@vkontakte/videoplayer-shared`),go=e=>{if(ho.arrayIncludes(e,`/`)){let t=e.split(`/`);return parseInt(t[0])/parseInt(t[1])}else return parseFloat(e)},_o=e=>{try{let t=vo(),{groups:n}=e.match(t)??{};if(n){let e={};if(n.extensions){let t=n.extensions.toLowerCase().match(/(?:[0-9a-wy-z](?:-[a-z0-9]{2,8})+)/g);Array.from(t||[]).forEach(t=>{e[t[0]]=t.slice(2)})}let t=n.variants?.split(/-/).filter(e=>e!==``),r={extlang:n.extlang,langtag:n.langtag,language:n.language,privateuse:n.privateuse||n.privateuse2,region:n.region,script:n.script,extensions:e,variants:t};return Object.keys(r).forEach(e=>{let t=r[e];(t===void 0||t===``)&&delete r[e]}),r}return null}catch{return null}};function vo(){let e=`x(?:-[a-z0-9]{1,8})+`,t=`^(?:(?<langtag>${`
|
|
239
239
|
(?<language>(?:[a-z]{2,3}(?:-(?<extlang>(?:[a-z]{3}(?:-[a-z]{3}){0,2})))?|[a-z]{4}|[a-z]{5,8}))
|
|
240
240
|
(-(?<script>[a-z]{4}))?
|
|
241
241
|
(-(?<region>(?:[a-z]{2}|[0-9]{3})))?
|
|
242
242
|
(?<variants>(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*)
|
|
243
243
|
(?<extensions>(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*)
|
|
244
244
|
(?:-(?<privateuse>(?:${e})))?
|
|
245
|
-
`})|(?<privateuse2>${e}))$`.replace(/[\s\t\n]/g,``);return new RegExp(t,`i`)}var yo=e=>{if(!e?.startsWith(`P`))return;let t=(e,t)=>{let n=e?parseFloat(e.replace(`,`,`.`)):NaN;return(isNaN(n)?0:n)*t},n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/.exec(e),r=n?.[1]===`-`?-1:1,i={days:t(n?.[5],r),hours:t(n?.[6],r),minutes:t(n?.[7],r),seconds:t(n?.[8],r)};return i.days*24*60*60*1e3+i.hours*60*60*1e3+i.minutes*60*1e3+i.seconds*1e3},bo=(e,t)=>{let n=e;n=ao.stringReplaceAll(n,`$$`,`$`);let r={RepresentationID:t.representationId,Number:t.segmentNumber,Bandwidth:t.bandwidth,Time:t.segmentTime};for(let[e,t]of oo.objectEntries(r)){let r=RegExp(`\\$${e}(?:%0(\\d+)d)?\\$`,`g`);n=ao.stringReplaceAll(n,r,(e,n)=>mo.isNullable(t)?e:mo.isNullable(n)?t:so.stringPadStart(t,parseInt(n,10),`0`))}return n},xo=(e,t)=>{let n=new DOMParser().parseFromString(e,`application/xml`),r={video:[],audio:[],text:[]},i=n.children[0],a=Array.from(i.querySelectorAll(`MPD > BaseURL`).values()).map(e=>e.textContent?.trim()??``),s=co.arrayAt(a,0)??``,c=i.getAttribute(`type`)===`dynamic`,l=i.getAttribute(`availabilityStartTime`),u=i.getAttribute(`publishTime`),d=i.getElementsByTagName(`vk:Attrs`)[0],f=d?.getElementsByTagName(`vk:XLatestSegmentPublishTime`)[0].textContent,p=d?.getElementsByTagName(`vk:XStreamIsLive`)[0].textContent,m=d?.getElementsByTagName(`vk:XStreamIsUnpublished`)[0].textContent,h=d?.getElementsByTagName(`vk:XPlaybackDuration`)[0].textContent,g;c&&(g={availabilityStartTime:l?new Date(l).getTime():0,publishTime:u?new Date(u).getTime():0,latestSegmentPublishTime:f?new Date(f).getTime():0,streamIsAlive:p===`yes`,streamIsUnpublished:m===`yes`});let _,v=i.getAttribute(`mediaPresentationDuration`),y=[...i.getElementsByTagName(`Period`)],b=y.reduce((e,t)=>o(o({},e),{},{[t.id]:t.children}),{}),x=y.reduce((e,t)=>o(o({},e),{},{[t.id]:t.getAttribute(`duration`)}),{});v?_=yo(v):lo.objectValues(x).filter(e=>e).length&&!c?_=lo.objectValues(x).reduce((e,t)=>e+(yo(t)??0),0):h&&(_=parseInt(h,10));let S=0,C=i.getAttribute(`profiles`)?.split(`,`)??[];for(let e of y.map(e=>e.id))for(let n of b[e]){var w;let e=n.getAttribute(`id`)??`id`+(S++).toString(10),i=n.getAttribute(`mimeType`)??``,a=n.getAttribute(`codecs`)??``,c=n.getAttribute(`contentType`)??i?.split(`/`)[0],l=n.getAttribute(`profiles`)?.split(`,`)??[],u=_o(n.getAttribute(`lang`)??``)??{},d=((w=n.querySelector(`Label`))==null||(w=w.textContent)==null?void 0:w.trim())??void 0,f=n.querySelectorAll(`Representation`),p=n.querySelector(`SegmentTemplate`),m=n.querySelector(`Role`)?.getAttribute(`value`)??void 0,h=n.querySelector(`AudioChannelConfiguration`)?.getAttribute(`value`),g=mo.isNonNullable(h)?parseInt(h,10):void 0,v=c,y={id:e,language:u.language,isDefault:m===`main`,label:d,codecs:a,hdr:v===`video`&&po(a),mime:i,channels:g,representations:[]};for(let e of f){var T;let r=e.getAttribute(`lang`)??void 0,f=d??n.getAttribute(`label`)??e.getAttribute(`label`)??void 0,m=((T=e.querySelector(`BaseURL`))==null||(T=T.textContent)==null?void 0:T.trim())??``,h=new URL(m||s,t).toString(),g=e.getAttribute(`mimeType`)??i,b=e.getAttribute(`codecs`)??a??``,x;if(c===`text`){let t=e.getAttribute(`id`)||``,n=(u.privateuse==null?void 0:uo.arrayIncludes(u.privateuse,`x-auto`))||uo.arrayIncludes(t,`_auto`),r=e.querySelector(`SegmentTemplate`);if(r){let i={representationId:e.getAttribute(`id`)??void 0,bandwidth:e.getAttribute(`bandwidth`)??void 0},a=parseInt(e.getAttribute(`bandwidth`)??``,10)/1e3,s=parseInt(r.getAttribute(`startNumber`)??``,10)??1,c=parseInt(r.getAttribute(`timescale`)??``,10),l=r.querySelectorAll(`SegmentTimeline S`)??[],u=r.getAttribute(`media`);if(!u)continue;let d=[],f=0,p=``,m=0,g=s,v=0;for(let e of l){let t=parseInt(e.getAttribute(`d`)??``,10),n=parseInt(e.getAttribute(`r`)??``,10)||0,r=parseInt(e.getAttribute(`t`)??``,10);v=Number.isFinite(r)?r:v;let a=t/c*1e3,s=v/c*1e3;for(let e=0;e<n+1;e++){let n=bo(u,o(o({},i),{},{segmentNumber:g.toString(10),segmentTime:(v+e*t).toString(10)})),r=(s??0)+e*a,c=r+a;g++,d.push({time:{from:r,to:c},url:n})}v+=(n+1)*t,f+=(n+1)*a}m=v/c*1e3,p=bo(u,o(o({},i),{},{segmentNumber:g.toString(10),segmentTime:v.toString(10)})),x={id:t,kind:`text`,segmentReference:{type:`template`,baseUrl:h,segmentTemplateUrl:u,initUrl:``,totalSegmentsDurationMs:f,segments:d,nextSegmentBeyondManifest:{time:{from:m,to:1/0},url:p},timescale:c},profiles:[],duration:_,bitrate:a,mime:``,codecs:``,width:0,height:0,isAuto:n}}else x={id:t,isAuto:n,kind:`text`,url:h}}else{let t=e.getAttribute(`contentType`)??g?.split(`/`)[0]??c,r=n.getAttribute(`profiles`)?.split(`,`)??[],i=parseInt(e.getAttribute(`width`)??``,10),a=parseInt(e.getAttribute(`height`)??``,10),s=parseInt(e.getAttribute(`bandwidth`)??``,10)/1e3,u=e.getAttribute(`frameRate`)??``,d=e.getAttribute(`quality`)??void 0,f=u?go(u):void 0,m=`${e.getAttribute(`id`)??`id`+(S++).toString(10)}@${t===`video`?`${a}p`:t===`audio`?`${s}Kbps`:b}`,y=[...C,...l,...r],w,T=e.querySelector(`SegmentBase`),E=e.querySelector(`SegmentTemplate`)??p;if(T){let[t,n]=(e.querySelector(`SegmentBase Initialization`)?.getAttribute(`range`)??``).split(`-`).map(e=>parseInt(e,10)),r={from:t,to:n},i=e.querySelector(`SegmentBase`)?.getAttribute(`indexRange`),[a,o]=i?i.split(`-`).map(e=>parseInt(e,10)):[];w={type:`byteRange`,url:h,initRange:r,indexRange:i?{from:a,to:o}:void 0}}else if(E){let t={representationId:e.getAttribute(`id`)??void 0,bandwidth:e.getAttribute(`bandwidth`)??void 0},n=parseInt(E.getAttribute(`timescale`)??``,10),r=E.getAttribute(`initialization`)??``,i=E.getAttribute(`media`),a=parseInt(E.getAttribute(`startNumber`)??``,10)??1,s=bo(r,t);if(!i)throw ReferenceError(`No media attribute in SegmentTemplate`);let c=E.querySelectorAll(`SegmentTimeline S`)??[],l=[],u=0,d=``,f=0;if(c.length){let e=a,r=0;for(let a of c){let s=parseInt(a.getAttribute(`d`)??``,10),c=parseInt(a.getAttribute(`r`)??``,10)||0,d=parseInt(a.getAttribute(`t`)??``,10);r=Number.isFinite(d)?d:r;let f=s/n*1e3,p=r/n*1e3;for(let n=0;n<c+1;n++){let a=bo(i,o(o({},t),{},{segmentNumber:e.toString(10),segmentTime:(r+n*s).toString(10)})),c=(p??0)+n*f,u=c+f;e++,l.push({time:{from:c,to:u},url:a})}r+=(c+1)*s,u+=(c+1)*f}f=r/n*1e3,d=bo(i,o(o({},t),{},{segmentNumber:e.toString(10),segmentTime:r.toString(10)}))}else if(mo.isNonNullable(_)){let e=parseInt(E.getAttribute(`duration`)??``,10)/n*1e3,r=Math.ceil(_/e),a=0;for(let n=1;n<r;n++){let r=bo(i,o(o({},t),{},{segmentNumber:n.toString(10),segmentTime:a.toString(10)}));l.push({time:{from:a,to:a+e},url:r}),a+=e}f=a,d=bo(i,o(o({},t),{},{segmentNumber:r.toString(10),segmentTime:a.toString(10)}))}w={type:`template`,baseUrl:h,segmentTemplateUrl:i,initUrl:s,totalSegmentsDurationMs:u,segments:l,nextSegmentBeyondManifest:{time:{from:f,to:1/0},url:d},timescale:n}}else throw ReferenceError(`Unknown MPD segment referencing type`);if(!t||!g)continue;let ee={video:`video`,audio:`audio`,text:`text`}[t];if(!ee)continue;v||=ee,x={id:m,kind:ee,segmentReference:w,profiles:y,duration:_,bitrate:s,mime:g,codecs:b,width:i,height:a,fps:f,quality:d}}y.language||=r,y.label||=f,y.mime||=g,y.codecs||=b,y.hdr||=v===`video`&&po(b),y.representations.push(x)}if(v){let e=r[v].find(e=>e.id===y.id);if(e&&y.representations.every(e=>e.segmentReference.type===`template`))for(let t of e.representations){let e=y.representations.find(e=>e.id===t.id);if(!e)continue;let n=e.segmentReference,r=t.segmentReference;r.segments.push(...n.segments),r.nextSegmentBeyondManifest=n.nextSegmentBeyondManifest}else r[v].push(y)}}return{duration:_,streams:r,baseUrls:a,live:g}},So=require(`@vkontakte/videoplayer-shared`),Co=require(`@vkontakte/videoplayer-shared`),wo=require(`@vkontakte/videoplayer-shared`),U=require(`@vkontakte/videoplayer-shared`),To=require(`@vkontakte/videoplayer-shared`),Eo=e=>e.valid;class Do{get id(){return this.type}constructor(e,t){i(this,`source`,void 0),i(this,`boxParser`,void 0),i(this,`type`,void 0),i(this,`size`,void 0),i(this,`content`,void 0),i(this,`valid`,void 0),i(this,`children`,void 0),i(this,`cursor`,0),this.source=e,this.boxParser=t,this.children=[];let n=this.readUint32();this.type=this.readString(4),n===1&&(this.cursor+=8);let r=e.byteOffset+this.cursor,a;n===0||n===1?(this.size=void 0,this.valid=!1,a=void 0):n>e.byteLength?(this.size=n,this.valid=!1,a=Math.min(n-this.cursor,e.byteLength-this.cursor)):(this.size=n,this.valid=!0,a=n-this.cursor),this.content=new DataView(e.buffer,r,a)}scanForBoxes(e){return this.boxParser.parse(e)}readString(e,t=`ascii`){let n=new TextDecoder(t).decode(new DataView(this.source.buffer,this.source.byteOffset+this.cursor,e));return this.cursor+=e,n}readUint8(){let e=this.source.getUint8(this.cursor);return this.cursor+=1,e}readUint16(){let e=this.source.getUint16(this.cursor);return this.cursor+=2,e}readUint32(){let e=this.source.getUint32(this.cursor);return this.cursor+=4,e}readUint64(){let e=this.source.getBigInt64(this.cursor);return this.cursor+=8,e}}class Oo extends Do{}var ko=require(`@vkontakte/videoplayer-shared`);class Ao extends Do{constructor(e,t){if(super(e,t),i(this,`userData`,void 0),!this.valid)return;let n=this.readString(16),r=new DataView(this.content.buffer,this.content.byteOffset+16,this.content.byteLength-16);this.userData=this.parseData(n,r)}parseData(e,t){switch(e){case`ondemandlivejson`:{let e=new TextDecoder(`ascii`).decode(t),n=JSON.parse(e);return{received:n[`t-in`],prepared:n[`t-out`]}}default:ko.assertNever(e)}}}class jo extends Do{constructor(e,t){if(super(e,t),i(this,`majorBrand`,void 0),i(this,`minorVersion`,void 0),i(this,`compatibleBrands`,void 0),!this.valid)return;this.compatibleBrands=[],this.majorBrand=this.readString(4),this.minorVersion=this.readUint32();let n=new DataView(this.content.buffer,this.content.byteOffset+8,this.content.byteLength-8);for(let e=0;e<n.byteLength;e+=4){let e=this.readString(4);this.compatibleBrands.push(e)}}}class Mo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class No extends Do{constructor(e,t){if(super(e,t),i(this,`version`,void 0),i(this,`flags`,void 0),!this.valid)return;let n=this.readUint32();this.version=n>>>24,this.flags=n&16777215,this.content=new DataView(this.content.buffer,this.content.byteOffset+4,this.content.byteLength-4)}}class Po extends No{constructor(e,t){super(e,t),i(this,`creationTime`,void 0),i(this,`modificationTime`,void 0),i(this,`timescale`,void 0),i(this,`duration`,void 0),i(this,`rate`,void 0),i(this,`volume`,void 0),this.valid&&(this.creationTime=this.readUint32(),this.modificationTime=this.readUint32(),this.timescale=this.readUint32(),this.duration=this.readUint32(),this.rate=this.readUint32(),this.volume=this.readUint16())}}class Fo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Io extends Do{constructor(e,t){super(e,t),i(this,`data`,void 0),this.data=this.content}}class Lo extends No{get earliestPresentationTime(){return this.earliestPresentationTime32}get firstOffset(){return this.firstOffset32}constructor(e,t){if(super(e,t),i(this,`referenceId`,void 0),i(this,`timescale`,void 0),i(this,`earliestPresentationTime32`,void 0),i(this,`firstOffset32`,void 0),i(this,`earliestPresentationTime64`,void 0),i(this,`firstOffset64`,void 0),i(this,`reserved`,void 0),i(this,`referenceCount`,void 0),i(this,`segments`,void 0),this.valid){this.segments=[],this.referenceId=this.readUint32(),this.timescale=this.readUint32(),this.earliestPresentationTime32=this.readUint32(),this.firstOffset32=this.readUint32(),this.earliestPresentationTime64=0,this.firstOffset64=0,this.referenceCount=this.readUint32()&65535;for(let e=0;e<this.referenceCount;e++){let e=this.readUint32(),t=e>>>31,n=e<<1>>>1,r=this.readUint32();e=this.readUint32();let i=e>>>28,a=e<<3>>>3;this.segments.push({referenceType:t,referencedSize:n,subsegmentDuration:r,SAPType:i,SAPDeltaTime:a})}}}}class Ro extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class zo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Bo extends No{constructor(e,t){if(super(e,t),i(this,`stereoMode`,void 0),this.valid){switch(this.readUint8()){case 0:this.stereoMode=0;break;case 1:this.stereoMode=1;break;case 2:this.stereoMode=2;break;case 3:this.stereoMode=3;break;case 4:this.stereoMode=4;break}this.cursor+=1}}}class Vo extends No{constructor(e,t){super(e,t),i(this,`poseYawDegrees`,void 0),i(this,`posePitchDegrees`,void 0),i(this,`poseRollDegrees`,void 0),this.valid&&(this.poseYawDegrees=this.readUint32(),this.posePitchDegrees=this.readUint32(),this.poseRollDegrees=this.readUint32())}}class Ho extends No{constructor(e,t){super(e,t),i(this,`projectionBoundsTop`,void 0),i(this,`projectionBoundsBottom`,void 0),i(this,`projectionBoundsLeft`,void 0),i(this,`projectionBoundsRight`,void 0),this.valid&&(this.projectionBoundsTop=this.readUint32(),this.projectionBoundsBottom=this.readUint32(),this.projectionBoundsLeft=this.readUint32(),this.projectionBoundsRight=this.readUint32())}}class Uo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Wo extends No{constructor(e,t){super(e,t),i(this,`creationTime`,void 0),i(this,`modificationTime`,void 0),i(this,`trackId`,void 0),i(this,`duration`,void 0),i(this,`layer`,void 0),i(this,`alternateGroup`,void 0),i(this,`volume`,void 0),i(this,`matrix`,void 0),i(this,`width`,void 0),i(this,`height`,void 0),this.creationTime=this.readUint32(),this.modificationTime=this.readUint32(),this.trackId=this.readUint32(),this.cursor+=4,this.duration=this.readUint32(),this.cursor+=8,this.layer=this.readUint16(),this.alternateGroup=this.readUint16(),this.cursor+=2,this.cursor+=2,this.matrix=[[this.readUint32(),this.readUint32(),this.readUint32()],[this.readUint32(),this.readUint32(),this.readUint32()],[this.readUint32(),this.readUint32(),this.readUint32()]],this.width=this.readUint32(),this.height=this.readUint32()}}class Go extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Ko extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class qo extends No{constructor(e,t){super(e,t),i(this,`sequenceNumber`,void 0),this.valid&&(this.sequenceNumber=this.readUint32())}}class Jo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Yo extends No{constructor(e,t){super(e,t),i(this,`trackId`,void 0),i(this,`baseDataOffset`,void 0),i(this,`sampleDescriptionIndex`,void 0),i(this,`defaultSampleDuration`,void 0),i(this,`defaultSampleSize`,void 0),i(this,`defaultSampleFlags`,void 0),this.trackId=this.readUint32(),this.flags&1&&(this.baseDataOffset=this.readUint64()),this.flags&2&&(this.sampleDescriptionIndex=this.readUint32()),this.flags&8&&(this.defaultSampleDuration=this.readUint32()),this.flags&16&&(this.defaultSampleSize=this.readUint32()),this.flags&32&&(this.defaultSampleFlags=this.readUint32())}}class Xo extends No{get baseMediaDecodeTime(){return this.version===1?this.baseMediaDecodeTime64:this.baseMediaDecodeTime32}constructor(e,t){super(e,t),i(this,`baseMediaDecodeTime32`,0),i(this,`baseMediaDecodeTime64`,BigInt(0)),this.version===1?this.baseMediaDecodeTime64=this.readUint64():this.baseMediaDecodeTime32=this.readUint32()}}class Zo extends No{constructor(e,t){super(e,t),i(this,`sampleCount`,void 0),i(this,`dataOffset`,void 0),i(this,`firstSampleFlags`,void 0),i(this,`sampleDuration`,[]),i(this,`sampleSize`,[]),i(this,`sampleFlags`,[]),i(this,`sampleCompositionTimeOffset`,[]),i(this,`optionalFields`,0),this.sampleCount=this.readUint32(),this.flags&1&&(this.dataOffset=this.readUint32()),this.flags&4&&(this.firstSampleFlags=this.readUint32());for(let e=0;e<this.sampleCount;e++)this.flags&256&&this.sampleDuration.push(this.readUint32()),this.flags&512&&this.sampleSize.push(this.readUint32()),this.flags&1024&&this.sampleFlags.push(this.readUint32()),this.flags&2048&&this.sampleCompositionTimeOffset.push(this.readUint32())}}class Qo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class $o extends No{constructor(e,t){super(e,t),i(this,`entryCount`,void 0),this.valid&&(this.entryCount=this.readUint32(),this.children=this.scanForBoxes(new DataView(this.content.buffer,this.content.byteOffset+4,this.content.byteLength-4)))}}class es extends Do{constructor(e,t){super(e,t),this.valid&&(this.children=this.scanForBoxes(new DataView(this.content.buffer,this.content.byteOffset+78,this.content.byteLength-78)))}}var ts={ftyp:jo,moov:Mo,mvhd:Po,moof:Fo,mdat:Io,sidx:Lo,trak:Ro,mdia:Uo,mfhd:qo,tkhd:Wo,traf:Jo,tfhd:Yo,tfdt:Xo,trun:Zo,minf:Go,sv3d:zo,st3d:Bo,prhd:Vo,proj:Ko,equi:Ho,uuid:Ao,stbl:Qo,stsd:$o,avc1:es,unknown:Oo};class ns{constructor(e={}){i(this,`options`,void 0),this.options=o({offset:0},e)}parse(e){let t=[],n=this.options.offset;for(;n<e.byteLength;){let r=new TextDecoder(`ascii`).decode(new DataView(e.buffer,e.byteOffset+n+4,4)),i;try{i=this.createBox(r,new DataView(e.buffer,e.byteOffset+n,e.byteLength-n))}catch(e){if(!(e instanceof RangeError))throw e}if(!i||!Eo(i))break;t.push(i),n+=i.size}return t}createBox(e,t){let n=ts[e];return n?new n(t,new ns):new Oo(t,new ns)}}class rs{constructor(e){i(this,`index`,void 0),this.index={},this.indexBoxLevel(e)}indexBoxLevel(e){e.forEach(e=>{var t,n;Eo(e)&&((t=this.index)[n=e.type]??(t[n]=[]),this.index[e.type].push(e),e.children.length>0&&this.indexBoxLevel(e.children))})}find(e){return this.index[e]&&this.index[e][0]?this.index[e][0]:null}findAll(e){return this.index[e]||[]}}var is=new TextDecoder(`ascii`),as={validateData:e=>is.decode(new DataView(e.buffer,e.byteOffset+4,4))===`ftyp`,parseInit:e=>{let t={is3dVideo:!1,stereoMode:0,projectionType:1,projectionData:{pose:{yaw:0,pitch:0,roll:0},bounds:{top:0,bottom:0,left:0,right:0}}},n=new rs(new ns().parse(e));if(n.find(`sv3d`)){t.is3dVideo=!0;let e=n.find(`st3d`);e&&(t.stereoMode=e.stereoMode);let r=n.find(`prhd`);r&&(t.projectionData.pose.yaw=r.poseYawDegrees,t.projectionData.pose.pitch=r.posePitchDegrees,t.projectionData.pose.roll=r.poseRollDegrees);let i=n.find(`equi`);i&&(t.projectionData.bounds.top=i.projectionBoundsTop,t.projectionData.bounds.right=i.projectionBoundsRight,t.projectionData.bounds.bottom=i.projectionBoundsBottom,t.projectionData.bounds.left=i.projectionBoundsLeft)}return t},getIndexRange:()=>{},parseSegments:e=>{let t=new Lo(e,new ns),n=t.earliestPresentationTime/t.timescale*1e3,r=e.byteOffset+e.byteLength+t.firstOffset;return t.segments.map(e=>{if(e.referenceType!==0)throw Error(`Unsupported multilevel sidx`);let i=r,a=r+e.referencedSize-1,o=e.subsegmentDuration/t.timescale*1e3,s={status:`none`,time:{from:n,to:n+o},byte:{from:i,to:a},size:a-i+1};return n+=o,r+=e.referencedSize,s})},parseFeedableSegmentChunk:(e,t)=>{let n=new rs(new ns().parse(e)),r=n.findAll(`moof`),i=t?n.findAll(`uuid`):n.findAll(`mdat`);if(!(i.length&&r.length))return null;let a=r[0],o=i[i.length-1],s=a.source.byteOffset,c=o.source.byteOffset-a.source.byteOffset+o.size;return new DataView(e.buffer,s,c)},getChunkEndTime:(e,t)=>{let n=new rs(new ns().parse(e)).findAll(`traf`),r=n[n.length-1].children.find(e=>e.type===`tfhd`),i=n[n.length-1].children.find(e=>e.type===`tfdt`),a=n[n.length-1].children.find(e=>e.type===`trun`),o=0;return o=a.sampleDuration.length?a.sampleDuration.reduce((e,t)=>e+t,0):r.defaultSampleDuration*a.sampleCount,(Number(i.baseMediaDecodeTime)+o)/t*1e3},getServerLatencyTimestamps:e=>{let t=new rs(new ns().parse(e)),n={},r=t.findAll(`uuid`),i=To.arrayAt(r,-1);return i?{serverDataReceivedTimestamp:i.userData.received,serverDataPreparedTime:i.userData.received}:n},getTimescaleFromIndex:e=>new rs(new ns().parse(e)).find(`sidx`)?.timescale},os=require(`@vkontakte/videoplayer-shared`),ss=require(`@vkontakte/videoplayer-shared`),cs=require(`@vkontakte/videoplayer-shared`),ls={440786851:{type:`master`},17030:{type:`uint`},17143:{type:`uint`},17138:{type:`uint`},17139:{type:`uint`},17026:{type:`string`},17031:{type:`uint`},17029:{type:`uint`},236:{type:`binary`},408125543:{type:`master`},290298740:{type:`master`},19899:{type:`master`},21419:{type:`binary`},21420:{type:`uint`},357149030:{type:`master`},2807729:{type:`uint`},17545:{type:`float`},374648427:{type:`master`},174:{type:`master`},224:{type:`master`},30320:{type:`master`},30321:{type:`uint`},30322:{type:`master`},272869232:{type:`master`},524531317:{type:`master`},231:{type:`uint`},22612:{type:`master`},22743:{type:`uint`},167:{type:`uint`},171:{type:`uint`},163:{type:`binary`},160:{type:`master`},175:{type:`binary`},423732329:{type:`master`},307544935:{type:`master`},475249515:{type:`master`},187:{type:`master`},179:{type:`uint`},183:{type:`master`},247:{type:`uint`},241:{type:`uint`},240:{type:`uint`},178:{type:`uint`},21368:{type:`uint`},234:{type:`uint`},219:{type:`master`},150:{type:`uint`}},us=e=>{let t=e.getUint8(0),n=0;t&128?n=1:t&64?n=2:t&32?n=3:t&16&&(n=4);let r=ds(e,n),i=r in ls,a=i?ls[r].type:`binary`,o=e.getUint8(n),s=0;o&128?s=1:o&64?s=2:o&32?s=3:o&16?s=4:o&8?s=5:o&4?s=6:o&2?s=7:o&1&&(s=8);let c=new DataView(e.buffer,e.byteOffset+n+1,s-1),l=o&255>>s,u=ds(c),d=l*2**((s-1)*8)+u,f=n+s,p;return p=f+d>e.byteLength?new DataView(e.buffer,e.byteOffset+f):new DataView(e.buffer,e.byteOffset+f,d),{tag:i?r:`0x`+r.toString(16).toUpperCase(),type:a,tagHeaderSize:f,tagSize:f+d,value:p,valueSize:d}},ds=(e,t=e.byteLength)=>{switch(t){case 1:return e.getUint8(0);case 2:return e.getUint16(0);case 3:return e.getUint8(0)*2**16+e.getUint16(1);case 4:return e.getUint32(0);case 5:return e.getUint8(0)*2**32+e.getUint32(1);case 6:return e.getUint16(0)*2**32+e.getUint32(2);case 7:{let t=e.getUint8(0)*2**48+e.getUint16(1)*2**32+e.getUint32(3);if(Number.isSafeInteger(t))return t}case 8:throw ReferenceError(`Int64 is not supported`)}return 0},fs=(e,t)=>{switch(t){case`int`:return e.getInt8(0);case`uint`:return ds(e);case`float`:return e.byteLength===4?e.getFloat32(0):e.getFloat64(0);case`string`:return new TextDecoder(`ascii`).decode(e);case`utf8`:return new TextDecoder(`utf-8`).decode(e);case`date`:return new Date(Date.UTC(2001,0)+e.getInt8(0)).getTime();case`master`:return e;case`binary`:return e;default:cs.assertNever(t)}},ps=(e,t)=>{let n=0;for(;n<e.byteLength;){let r=us(new DataView(e.buffer,e.byteOffset+n));if(!t(r))return;r.type===`master`&&ps(r.value,t),n=r.value.byteOffset-e.byteOffset+r.valueSize}},ms=e=>{if(e.getUint32(0)!==440786851)return!1;let t,n,r;return ps(us(e).value,({tag:e,type:i,value:a})=>(e===17143?t=fs(a,i):e===17026?n=fs(a,i):e===17029&&(r=fs(a,i)),!0)),(t===void 0||t<=1)&&n!==void 0&&n===`webm`&&(r===void 0||r<=2)},hs=[357149030,290298740,374648427,174,224,30320,30321,30322,272869232,524531317,475249515,423732329,307544935],gs=[231,22612,22743,167,171,163,160,175],_s={validateData:ms,parseInit:e=>{let t,n,r,i,a=!1,o=!1,s=!1,c,l,u=!1;return ps(e,({tag:e,type:d,value:f,valueSize:p})=>(e===21419?l=ds(fs(f,d)):e!==21420&&(l=void 0),e===408125543?(t=f.byteOffset,n=f.byteOffset+p):e===357149030?a=!0:e===290298740?o=!0:e===2807729?r=fs(f,d):e===17545?i=fs(f,d):e===21420&&l===475249515?c=fs(f,d):e===374648427?ps(f,({tag:e,type:t,value:n})=>e===30321?(u=fs(n,t)===1,!1):!0):a&&o&&os.arrayIncludes(hs,e)&&(s=!0),!s)),ss.assertNonNullable(t,`Failed to parse webm Segment start`),ss.assertNonNullable(n,`Failed to parse webm Segment end`),ss.assertNonNullable(i,`Failed to parse webm Segment duration`),r??=1e6,{segmentStart:Math.round(t/1e9*r*1e3),segmentEnd:Math.round(n/1e9*r*1e3),timeScale:r,segmentDuration:Math.round(i/1e9*r*1e3),cuesSeekPosition:c,is3dVideo:u,stereoMode:0,projectionType:1,projectionData:{pose:{yaw:0,pitch:0,roll:0},bounds:{top:0,bottom:0,left:0,right:0}}}},getIndexRange:e=>{if(ss.isNullable(e.cuesSeekPosition))return;let t=e.segmentStart+e.cuesSeekPosition;return{from:t,to:t+1048576}},parseSegments:(e,t)=>{let n=!1,r=!1,i=e=>ss.isNonNullable(e.time)&&ss.isNonNullable(e.position),a=[],o;return ps(e,({tag:e,type:t,value:s})=>{switch(e){case 475249515:n=!0;break;case 187:o&&i(o)&&a.push(o),o={};break;case 179:o&&(o.time=fs(s,t));break;case 183:break;case 241:o&&(o.position=fs(s,t));break;default:n&&os.arrayIncludes(hs,e)&&(r=!0)}return!(n&&r)}),o&&i(o)&&a.push(o),a.map((e,n)=>{let{time:r,position:i}=e,o=a[n+1],s=t.segmentStart+i,c=o?t.segmentStart+o.position-1:t.segmentEnd-1;return{status:`none`,time:{from:r,to:o?o.time:t.segmentDuration},byte:{from:s,to:c},size:c-s+1}})},parseFeedableSegmentChunk:e=>{let t=0,n=!1;try{ps(e,r=>r.tag===524531317?r.tagSize<=e.byteLength?(t=r.tagSize,!1):(t+=r.tagHeaderSize,!0):os.arrayIncludes(gs,r.tag)?(t+r.tagSize<=e.byteLength&&(t+=r.tagSize,n||=os.arrayIncludes([163,160,175],r.tag)),!0):!1)}catch{}return t>0&&t<=e.byteLength&&n?new DataView(e.buffer,e.byteOffset,t):null}},vs=e=>{let t=/^(.+)\/([^;]+)(?:;.*)?$/.exec(e);if(t){let[,e,n]=t;if(e===`audio`||e===`video`)switch(n){case`webm`:return _s;case`mp4`:return as}}throw ReferenceError(`Unsupported mime type ${e}`)},ys=require(`@vkontakte/videoplayer-shared`),bs=require(`@vkontakte/videoplayer-shared`),xs=({id:e,width:t,height:n,bitrate:r,fps:i,quality:a,streamId:o,tvDisabled:s})=>{let c=(a?Xt(a):void 0)??bs.videoSizeToQuality({width:t,height:n});return c&&{id:e,quality:c,bitrate:r,size:{width:t,height:n},fps:i,streamId:o,tvDisabled:s}},Ss=({id:e,bitrate:t})=>({id:e,bitrate:t}),Cs=({language:e,label:t},{id:n,url:r,isAuto:i})=>({id:n,url:r,isAuto:i,type:`internal`,language:e,label:t}),ws=({language:e,label:t,id:n,url:r,isAuto:i})=>({id:n,url:r,isAuto:i,type:`internal`,language:e,label:t}),Ts=({id:e,language:t,label:n,codecs:r,isDefault:i,channels:a})=>({id:e,language:t,label:n,codec:ys.stringAt(r.split(`.`),0),isDefault:i,channels:a}),Es=({id:e,language:t,label:n,hdr:r,codecs:i})=>({id:e,language:t,hdr:r,label:n,codec:ys.stringAt(i.split(`.`),0)}),Ds=e=>`url`in e,Os=e=>e.type===`template`;class ks{constructor(e,t,n,{fetcher:r,tracer:a,tuning:o,getCurrentPosition:s,getCurrentStallDuration:l,manifest:u}){i(this,`error$`,new U.Subject),i(this,`playingRepresentation$`,new U.ValueSubject(void 0)),i(this,`playingRepresentationInit$`,new U.ValueSubject(void 0)),i(this,`currentSegmentLength$`,new U.ValueSubject(0)),i(this,`onLastSegment$`,new U.ValueSubject(!1)),i(this,`fullyBuffered$`,new U.ValueSubject(!1)),i(this,`kind`,void 0),i(this,`nativeBufferManager`,void 0),i(this,`fetcher`,void 0),i(this,`tracer`,void 0),i(this,`tuning`,void 0),i(this,`representations`,void 0),i(this,`playingRepresentationId`,void 0),i(this,`downloadingRepresentationId`,void 0),i(this,`switchingRepresentationId`,void 0),i(this,`initData`,new Map),i(this,`initDataPromises`,new Map),i(this,`idleCallbacks`,new Map),i(this,`parsedInitData`,new Map),i(this,`forwardBufferRepresentations`,new Map),i(this,`segments`,new Map),i(this,`containerParser`,void 0),i(this,`bufferPlaybackQueue`,[]),i(this,`downloadingBufferItems`,[]),i(this,`preloadOnly`,!1),i(this,`forwardBufferTarget`,void 0),i(this,`failedDownloads`,0),i(this,`lastDataObtainedTimestampMs`,0),i(this,`loadByteRangeSegmentsTimeoutId`,0),i(this,`currentVirtualBufferSize`,0),i(this,`baseUrls`,[]),i(this,`baseUrlsIndex`,0),i(this,`maintainPlaybackBufferMutex`,!1),i(this,`maintainNativeBufferMutex`,!1),i(this,`bufferClearingMutex`,!1),i(this,`abortNativeBufferMutex`,!1),i(this,`switchMutex`,!1),i(this,`seekMutex`,!1),i(this,`destroyAbortController`,new So.AbortControllerPolyfilled),i(this,`switchAbortController`,new So.AbortControllerPolyfilled),i(this,`downloadAbortController`,new So.AbortControllerPolyfilled),i(this,`subscription`,new U.Subscription),i(this,`getCurrentPosition`,void 0),i(this,`getCurrentStallDuration`,void 0),i(this,`startWith`,U.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e){let t=this.representations.get(e);U.assertNonNullable(t,`Cannot find representation ${e}`);let n=this.tracer.createComponentTracer(`startWith`);n.log(`start representation`,U.flattenObject({id:e})),this.playingRepresentationId=e,this.downloadingRepresentationId=e,this.containerParser=vs(t.mime),this.nativeBufferManager.init(t.mime,t.codecs,this.tuning.dash.useAbortMSEFix),n.log(`started loadInitIfNeeded`),yield this.loadInitIfNeeded(t,`high`),n.log(`ended loadInitIfNeeded`);let r=this.initData.get(t.id),i=this.segments.get(t.id),a=this.parsedInitData.get(t.id);U.assertNonNullable(r,`No init buffer for starting representation`),U.assertNonNullable(i,`No segments for starting representation`),n.log(`started native buffer init segment append`),yield this.nativeBufferManager.addInitSegment(r),n.log(`ended native buffer init segment append`),this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(a),n.end()});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`waitExponentialDownloadDelay`,U.abortable(this.downloadAbortController.signal,c(function*(){let e=U.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>{let n=U.getWindow();this.loadByteRangeSegmentsTimeoutId=n.setTimeout(t,e),this.subscription.add(U.fromEvent(n,`online`).pipe(U.once()).subscribe(()=>{t(),n.clearTimeout(this.loadByteRangeSegmentsTimeoutId)}))})}).bind(this))),this.kind=e,this.nativeBufferManager=t,this.fetcher=r,this.tracer=a.createComponentTracer(`${this.kind} ${this.constructor.name}`),this.tuning=o,this.getCurrentPosition=s,this.getCurrentStallDuration=l,this.forwardBufferTarget=o.dash.forwardBufferTargetAuto,this.baseUrls=u?.baseUrls??[],this.representations=new Map(n.map(e=>[e.id,e]))}switchTo(e,t=`default`){var n=this;return a(function*(){if(e===n.downloadingRepresentationId||e===n.switchingRepresentationId)return;let r=n.tracer.createComponentTracer(`switchTo`);return r.log(`abort previous switchTo`),n.switchAbortController.abort(),n.switchMutex=!1,r.log(`switchMutex released`),n.switchAbortController=new So.AbortControllerPolyfilled,n.getSwitchWithAbort(r)(e,t)})()}getSwitchWithAbort(e){return U.abortable(this.switchAbortController.signal,function(){var t=c(function*(t,n){if(!U.isNullable(this.downloadingRepresentationId)){this.switchMutex=!0,e.log(`switchMutex captured`);try{e.log(`start`,U.flattenObject({newRepresentationId:t,mode:n})),this.switchingRepresentationId=t;let r=this.representations.get(this.downloadingRepresentationId),i=this.representations.get(t);U.assertNonNullable(i,`No such representation ${t}`),U.assertNonNullable(r,`No such representation ${this.downloadingRepresentationId}`),e.log(`abortDownload`),yield this.abortDownload(),e.log(`start loadInitIfNeeded`),yield this.loadInitIfNeeded(i,`high`),e.log(`ended loadInitIfNeeded`);let a=this.initData.get(i.id),o=this.segments.get(i.id);if(U.isNullable(a)||U.isNullable(o))return;let s=e=>e.segment.bufferStatus!==`fed`,c=e=>{let t=this.representations.get(e.representationId);return U.assertNonNullable(t,`No itemRepresentation for previous track before switch`),e.segment.networkStatus!==`downloaded`||this.forceSwitchCondition(t,i)},l=e=>{switch(n){case`lazy`:return s(e)&&c(e);case`force`:return!0;default:return s(e)}};e.log(`bufferPlaybackQueue before`,U.flattenObject({bufferPlaybackQueue:this.bufferPlaybackQueue})),this.bufferPlaybackQueue.filter(l).forEach(e=>e.segment.bufferStatus=`none`),this.bufferPlaybackQueue=this.bufferPlaybackQueue.filter(e=>!l(e)),e.log(`bufferPlaybackQueue after`,U.flattenObject({bufferPlaybackQueue:this.bufferPlaybackQueue})),this.downloadingRepresentationId=t,this.switchingRepresentationId=null,this.bufferPlaybackQueue.length?(e.log(`switchTo with maintain`),yield this.maintain()):(e.log(`switchTo with seek`),yield this.prepareSeek(),yield this.seek(this.getCurrentPosition()))}finally{this.switchMutex=!1,e.log(`switchMutex released`),e.end()}}});return function(e,n){return t.apply(this,arguments)}}().bind(this))}prepareSeek(){var e=this;return a(function*(){let t=e.tracer.createComponentTracer(`prepareSeek`);e.seekMutex=!0,t.log(`seekMutex captured`);try{t.log(`started abort`),yield e.abort(),t.log(`started clearBuffer`),yield e.clearBuffer(),t.log(`ended clearBuffer`)}catch{t.error(`seekMutex released`),e.seekMutex=!1}t.end()})()}seek(e){var t=this;return a(function*(){let n=t.tracer.createComponentTracer(`seek ${e}`);t.seekMutex=!1,n.log(`seekMutex released`),n.log(`maintain started`),yield t.maintain(e),n.log(`maintain ended`),n.end()})()}maintain(){var e=this;return a(function*(t=this.getCurrentPosition()){U.isNullable(t)||(yield e.maintainPlaybackBuffer(t),yield e.maintainNativeBuffer(),e.actualizeLastSegmentInfo(t))}).apply(this,arguments)}getForwardBufferRepresentations(e=this.getCurrentPosition()){if(this.forwardBufferRepresentations.clear(),U.isNonNullable(e))for(let[t,n]of this.segments.entries())this.forwardBufferRepresentations.set(t,n.filter(t=>t.time.from>=e&&t.time.to<=e+this.forwardBufferTarget));return this.forwardBufferRepresentations}getForwardPlaybackBufferDuration(e=this.getCurrentPosition()){let t=this.bufferPlaybackQueue.filter(e=>e.segment.networkStatus===`downloaded`),n=t[t.length-1],r=U.isNonNullable(e)&&U.isNonNullable(n)?n.segment.time.to-e:0;return Math.max(r,0)}getPlaybackBufferState(){return this.bufferPlaybackQueue.length?{from:this.bufferPlaybackQueue[0].segment.time.from,to:this.bufferPlaybackQueue[this.bufferPlaybackQueue.length-1].segment.time.to}:null}abort(){var e=this;return a(function*(){e.abortDownload(),yield e.abortNativeBuffer()})()}findSegmentStartTime(e){let t=this.downloadingRepresentationId??this.playingRepresentationId??``;return(this.segments.get(t)?.find(t=>t.time.from<=e&&t.time.to>=e))?.time.from}getRepresentationInitialTime(){return U.isNullable(this.playingRepresentationId)?0:(this.segments.get(this.playingRepresentationId)?.[0].time.from??0)/1e3}getMutexInfo(){let e=``;return this.seekMutex&&(e+=`seek `),this.abortNativeBufferMutex&&(e+=`abort `),this.maintainNativeBufferMutex&&(e+=`maintainNative `),this.maintainPlaybackBufferMutex&&(e+=`maintainPlayback `),this.bufferClearingMutex&&(e+=`bufferClear `),this.switchMutex&&(e+=`switch `),e}calculateDurationFromSegments(){if(!this.playingRepresentationId)return 0;let e=this.segments.get(this.playingRepresentationId);return(e?Co.arrayAt(e,-1)?.time.to:0)||0}getActiveSegmentProgress(){let e;for(let t of this.downloadingBufferItems)t.segment.networkStatus!==`downloading`||U.isNullable(t.startedAtMs)||(!e||t.segment.time.from<e.segment.time.from)&&(e=t);if(!(!e||U.isNullable(e.startedAtMs)))return{startedAtMs:e.startedAtMs,loadedBytes:e.segment.loadedBytes??0,totalBytes:U.isNonNullable(e.segment.size)&&Number.isFinite(e.segment.size)?e.segment.size:void 0,segmentDurationMs:e.segment.time.to-e.segment.time.from}}getMpdSegmentDuration(){for(let e of this.segments.values()){let t=e[0];if(t&&t.time.to>t.time.from)return t.time.to-t.time.from}}get lastDataObtainedTimestamp(){return this.lastDataObtainedTimestampMs}setTarget(e){this.forwardBufferTarget=e}setPreloadOnly(e){this.preloadOnly=e}destroy(){let e=U.getWindow();if(this.initData.clear(),this.initDataPromises.clear(),this.segments.clear(),this.parsedInitData.clear(),this.representations.clear(),this.downloadAbortController.abort(),this.switchAbortController.abort(),this.destroyAbortController.abort(),this.subscription.unsubscribe(),e.cancelIdleCallback)for(let t of this.idleCallbacks.values())e.cancelIdleCallback(t);this.idleCallbacks.clear(),e.clearTimeout(this.loadByteRangeSegmentsTimeoutId),this.tracer.log(`destroy`),this.tracer.end()}forceSwitchCondition(e,t){let n=!0;if(this.kind===`video`){let r=xs(e),i=xs(t);n=U.isNonNullable(r)&&U.isNonNullable(i)&&U.isHigher(i.quality,r.quality)}else if(this.kind===`audio`){let r=Ss(e),i=Ss(t);n=U.isNonNullable(r?.bitrate)&&U.isNonNullable(i?.bitrate)&&i.bitrate>r.bitrate}return n}clearBuffer(){var e=this;return a(function*(){let t=e.tracer.createComponentTracer(`clearBuffer`);e.bufferClearingMutex=!0,t.log(`bufferClearingMutex captured`);try{t.log(`clearBuffer`,U.flattenObject({queue:e.bufferPlaybackQueue.slice(0,5)})),yield e.nativeBufferManager.clear(e.destroyAbortController.signal),e.bufferPlaybackQueue.forEach(e=>e.segment.bufferStatus=`none`),e.bufferPlaybackQueue=[]}finally{e.bufferClearingMutex=!1,t.log(`bufferClearingMutex released`),t.end()}})()}abortDownload(){this.downloadAbortController.abort(),this.downloadAbortController=new So.AbortControllerPolyfilled,this.abortDownloadingItems(),this.maintainPlaybackBufferMutex=!1}abortDownloadingItems(){for(let e of this.downloadingBufferItems)e.segment.networkStatus===`downloading`&&(e.segment.networkStatus=`none`,e.segment.loadedBytes=0,e.segment.feedingBytes=0,e.segment.fedBytes=0,e.segment.data=null,e.startedAtMs=void 0);this.downloadingBufferItems=[]}abortNativeBuffer(){var e=this;return a(function*(){let t=e.tracer.createComponentTracer(`abortNativeBuffer`);t.log(`abortNativeBufferMutex captured`),e.abortNativeBufferMutex=!0;try{t.log(`abortNativeBuffer`,U.flattenObject({bufferState:e.nativeBufferManager.getBufferState()}));let n=e.playingRepresentationId&&e.initData.get(e.playingRepresentationId),r=n instanceof ArrayBuffer?n:void 0;return yield e.nativeBufferManager.abortBuffer(r)}finally{e.abortNativeBufferMutex=!1,t.log(`abortNativeBufferMutex released`),e.tuning.dash.useAbortResetNativeBufferMutex&&(e.maintainNativeBufferMutex=!1),t.end()}})()}loadInits(){var e=this;return a(function*(){for(let[t,n]of e.representations)e.idleCallbacks.set(n.id,wo.requestIdleCallbackPolyfilled(function(){var t=a(function*(t){return yield e.loadInitIfNeeded(n,`low`,!1)});return function(e){return t.apply(this,arguments)}}()))})()}loadInitIfNeeded(e,t=`auto`,n=!1){var r=this;return a(function*(){let i=r.initDataPromises.get(e.id),a;a=r.initData.has(e.id)&&r.segments.has(e.id)?Promise.resolve():U.isNonNullable(i)?i:r.loadInit(e,t,n),yield a})()}loadInit(e,t=`auto`,n=!1){var r=this;return a(function*(){try{let n=r.tuning.dash.useFetchPriorityHints?t:`auto`,i=r.fetcher.fetchRepresentation(e.segmentReference,r.containerParser,r.downloadAbortController.signal,n);r.initDataPromises.set(e.id,i);let{initMetadata:a,initDataView:o,segments:s}=(yield i)??{};if(r.initDataPromises.delete(e.id),U.isNullable(o)||U.isNullable(s))return;a&&r.parsedInitData.set(e.id,a);let c=o.buffer.slice(o.byteOffset,o.byteOffset+o.byteLength);r.initData.set(e.id,c),r.segments.set(e.id,s),r.failedDownloads=0}catch(e){n&&!U.isAbortError(e)&&r.error$.next({id:`LoadInits`,category:U.ErrorCategory.WTF,message:`loadInit threw`,thrown:e})}})()}maintainNativeBuffer(){var e=this;return a(function*(){let t=e.getCurrentPosition(),n=e.segments.get(e.downloadingRepresentationId??``),r=n?.[n?.length-1];if(U.isNullable(t)||U.isNullable(r)||e.maintainNativeBufferMutex||e.abortNativeBufferMutex||e.bufferClearingMutex||e.switchMutex||e.seekMutex||e.preloadOnly)return;let i;e.maintainNativeBufferMutex=!0;try{let n=e.bufferPlaybackQueue.find(n=>e.withinInterval(t,n.segment.time)),a=e.bufferPlaybackQueue.find(e=>e.segment.bufferStatus!==`fed`),o=e.initData.get(a?.representationId??``),s=e.bufferPlaybackQueue[0],c=e.destroyAbortController.signal,l=(e.getCurrentStallDuration()??0)>0;e.tuning.dash.useBufferHoldingOnlyOnStall&&(l&&=t>0);let u=Math.min(e.tuning.dash.minSafeBufferToPlay,r.time.to-t),d=l?e.getForwardPlaybackBufferDuration()>=u:!0;U.isNonNullable(o)&&U.isNonNullable(a)&&U.isNonNullable(n)&&e.playingRepresentationId!==a.representationId&&e.withinAppendInterval(t,a.segment.time)&&(a===n||n.segment.bufferStatus===`fed`)&&(i??=e.tracer.createComponentTracer(`nativeMaintain ${t}`),i.log(`abortNativeBuffer`),yield e.abortNativeBuffer(),i.log(`start addInitSegment`),yield e.nativeBufferManager.addInitSegment(o,c),i.log(`end addInitSegment`),e.playingRepresentationId=a.representationId,e.playingRepresentation$.next(e.playingRepresentationId),i.log(`playingRepresentationId`,U.flattenObject({id:a.representationId}))),U.isNonNullable(a)&&e.withinAppendInterval(t,a.segment.time)&&d&&(i??=e.tracer.createComponentTracer(`nativeMaintain ${t}`),a.segment.loadedBytes===a.segment.size&&a.segment.bufferStatus===`none`?(i.log(`started appendSegmentFully`),yield e.appendSegmentFully(a,c),i.log(`ended appendSegmentFully`)):(i.log(`started appendSegmentPartially`),yield e.appendSegmentPartially(a,c),i.log(`ended appendSegmentPartially`))),U.isNonNullable(s)&&U.isNonNullable(n)&&e.withinRemoveInterval(t,s.segment.time)&&s.segment.time.to<n.segment.time.from+1&&(i??=e.tracer.createComponentTracer(`nativeMaintain ${t}`),i.log(`started removeSegment`),yield e.removeSegment(s,c),i.log(`ended removeSegment`)),i?.log(`currentPosition`,U.flattenObject({currentPosition:t})),i?.log(`currentPlayingItem`,U.flattenObject(n)),i?.log(`nextPlayingItem`,U.flattenObject(a)),i?.log(`nextRemoveItem`,U.flattenObject(s)),i?.log(`queue`,U.flattenObject(e.bufferPlaybackQueue.slice(0,5))),i?.log(`buffer`,U.flattenObject(e.nativeBufferManager.getBufferState()??{})),e.pruneVirtualBuffer(t)}finally{e.maintainNativeBufferMutex=!1,i?.log(`maintainNativeBufferMutex released`),i?.end()}})()}maintainPlaybackBuffer(e){var t=this;return a(function*(){U.assertNonNullable(t.downloadingRepresentationId);let n=t.segments.get(t.downloadingRepresentationId),r=t.representations.get(t.downloadingRepresentationId);if(U.isNullable(n)||U.isNullable(r)||t.maintainPlaybackBufferMutex||t.abortNativeBufferMutex||t.bufferClearingMutex||t.switchMutex||t.seekMutex)return;let i;t.maintainPlaybackBufferMutex=!0;try{let a=n.find(t=>e>=t.time.from&&e<t.time.to);U.isNonNullable(a)&&isFinite(a.time.from)&&isFinite(a.time.to)&&t.currentSegmentLength$.next(a?.time.to-a.time.from),t.downloadingBufferItems.length||(t.downloadingBufferItems=t.selectDownloadingItems(e,n)),t.downloadingBufferItems.length&&(i=t.tracer.createComponentTracer(`playbackMaintain ${e}`)),i?.log(`maintainPlaybackBufferMutex captured`),i?.log(`currentSegment`,U.flattenObject(a)),i?.log(`downloadingBufferItems`,U.flattenObject(t.downloadingBufferItems)),i?.log(`processCachedItems`),yield t.processCachedItems();let o=t.selectItemsToLoad();i?.log(`itemsToLoad`,U.flattenObject(o)),yield t.loadItems(o,r),i?.log(`items downloaded`,U.flattenObject(o))}finally{t.maintainPlaybackBufferMutex=!1,i?.log(`maintainPlaybackBufferMutex released`),i?.end()}})()}actualizeLastSegmentInfo(e){let t=this.segments.get(this.downloadingRepresentationId??``);if(U.isNullable(t)||t.length===0)return;let n=t[t?.length-1];U.isNullable(n)||(this.fullyBuffered$.next(n.time.to-e-this.getForwardPlaybackBufferDuration(e)<this.tuning.dash.bufferTolerance),this.onLastSegment$.next(e-n.time.from>0))}selectDownloadingItems(e,t){U.assertNonNullable(this.downloadingRepresentationId);let n=this.getPlaybackBufferState(),r,i;U.isNonNullable(n)&&this.withinInterval(e,n)?(i=this.forwardBufferTarget-this.getForwardPlaybackBufferDuration(e),r=this.bufferPlaybackQueue[this.bufferPlaybackQueue.length-1].segmentIndex+1):(i=this.forwardBufferTarget,r=t.findIndex(t=>this.withinInterval(e,t.time))),r=r===-1?0:r;let a=[];for(;r<t.length&&i>0;){a.push({representationId:this.downloadingRepresentationId,segmentIndex:r,segment:t[r]});let{from:e,to:n}=t[r].time;i-=n-e,r++}return a}processCachedItems(){var e=this;return a(function*(){let t=[...e.downloadingBufferItems];for(;t.length&&t[0].segment.networkStatus===`downloaded`;)yield e.onDownloadItem(t[0]),t.shift()})()}withinInterval(e,{from:t,to:n},r=this.tuning.dash.bufferTolerance,i=0){return U.isNonNullable(e)?e+r>=t&&e-i<n:!1}withinAppendInterval(e,{from:t,to:n}){let{minNativeBufferSize:r,removeTimeShiftFromSegment:i}=this.tuning.dash;return this.withinInterval(e,{from:t,to:n},r,i)}withinRemoveInterval(e,{to:t}){let{removeTimeShiftFromSegment:n}=this.tuning.dash;return U.isNonNullable(e)?e-n>t:!1}appendSegmentFully(e,t){var n=this;return a(function*(){U.isNullable(e.segment.data)||(e.segment.feedingBytes=e.segment.size,(yield n.nativeBufferManager.append(e.segment.data,t))&&(e.segment.fedBytes=e.segment.size,n.onItemFullyAppended(e)))})()}appendSegmentPartially(e,t){var n=this;return a(function*(){if(U.isNullable(e.segment.data)||U.isNullable(e.segment.loadedBytes)||U.isNullable(e.segment.feedingBytes)||U.isNullable(e.segment.fedBytes)||U.isNullable(e.segment.size))return;let r=e.segment.data,i=new DataView(r.buffer,r.byteOffset+e.segment.feedingBytes,r.byteLength-e.segment.feedingBytes),a=e.segment.loadedBytes===e.segment.size?i:n.parseFeedableSegmentChunk(i);a?.byteLength&&(e.segment.bufferStatus=`partially_fed`,e.segment.feedingBytes+=a.byteLength,(yield n.nativeBufferManager.append(a,t))&&(e.segment.fedBytes+=a.byteLength,e.segment.fedBytes===e.segment.size&&n.onItemFullyAppended(e)))})()}parseFeedableSegmentChunk(e){return this.containerParser.parseFeedableSegmentChunk(e,!1)}onItemFullyDownloaded(e){e.segment.networkStatus=`downloaded`}onItemFullyAppended(e){e.segment.bufferStatus=`fed`}removeSegment(e,t){var n=this;return a(function*(){let{from:r,to:i}=e.segment.time,a=(i-r)/4;(yield n.nativeBufferManager.remove(0,i-a,t))&&(e.segment.fedBytes=0,e.segment.feedingBytes=0,e.segment.bufferStatus=`none`,n.bufferPlaybackQueue.shift())})()}onDownloadItem(e){var t=this;return a(function*(){if(!t.downloadingBufferItems.find(t=>t===e))return;let n=t.getCurrentPosition();return t.downloadingBufferItems=t.downloadingBufferItems.filter(t=>t!==e||t.segment.networkStatus!==`downloaded`),(t.preloadOnly||U.isNonNullable(n)&&!t.withinRemoveInterval(n,e.segment.time))&&!t.bufferPlaybackQueue.find(t=>t===e)&&t.bufferPlaybackQueue.push(e),t.maintainNativeBuffer()})()}pruneVirtualBuffer(e){let{maxVirtualBufferSize:t,virtualBufferPruneSize:n,bufferPruningSafeZone:r}=this.tuning.dash;if(this.currentVirtualBufferSize<t)return;let i=this.currentVirtualBufferSize-t+n;for(let t of this.segments.values())for(let n of t)U.isNonNullable(n.size)&&i>0&&n.time.to<=e-r&&n.bufferStatus===`none`&&n.networkStatus===`downloaded`&&(n.data=null,n.networkStatus=`none`,this.currentVirtualBufferSize-=n.size,i-=n.size);for(let t of this.segments.values())for(let n of[...t].reverse())U.isNonNullable(n.size)&&i>0&&n.time.from>=e+r&&n.bufferStatus===`none`&&n.networkStatus===`downloaded`&&!this.bufferPlaybackQueue.find(e=>e.segment===n)&&!this.downloadingBufferItems.find(e=>e.segment===n)&&(n.data=null,n.networkStatus=`none`,this.currentVirtualBufferSize-=n.size,i-=n.size)}updateRepresentationsBaseUrlIfNeeded(){if(!this.tuning.dash.enableBaseUrlSupport||!this.baseUrls.length||this.failedDownloads<=this.tuning.dash.maxSegmentRetryCount)return;this.baseUrlsIndex=(this.baseUrlsIndex+1)%this.baseUrls.length;let e=this.baseUrls[this.baseUrlsIndex];for(let t of this.representations.values())this.updateRepresentationBaseUrl(t,e)}}var As=require(`@vkontakte/videoplayer-shared`);class js extends ks{constructor(e,t,n,r){super(e,t,n,r)}loadItems(t,n,r=`auto`){var i=this;return a(function*(){let{signal:a}=i.downloadAbortController;if(a.aborted||!t.length)return;let s=i.prepareFetchParams(t,n),{url:c}=s,u=l(s,e);if(i.failedDownloads&&(yield i.waitExponentialDownloadDelay()),a.aborted)return;let d=As.getWindow().performance.now();for(let e of t)e.startedAtMs=d;try{yield i.fetcher.fetch(c,o(o({},u),{},{priority:r,urlCacheMechanismEnabled:!0})),i.lastDataObtainedTimestampMs=As.now(),i.failedDownloads=0}catch(e){i.abortDownloadingItems(),As.isAbortError(e)||(i.failedDownloads++,i.updateRepresentationsBaseUrlIfNeeded())}})()}selectItemsToLoad(){let e=0,t=0,n=[],r=this.preloadOnly?0:this.tuning.dash.segmentRequestSize,i=this.preloadOnly?this.forwardBufferTarget:0,a=0;for(;a<this.downloadingBufferItems.length&&this.downloadingBufferItems[a].segment.networkStatus===`none`&&(e<=r||t<=i);){let r=this.downloadingBufferItems[a],i=r.segment;i.networkStatus=`downloading`,i.loadedBytes=0,i.feedingBytes=0,i.fedBytes=0,n.push(r),e+=i.byte.to+1-i.byte.from,t+=i.time.to+1-i.time.from,a++}return n}prepareFetchParams(e,t){var n=this;if(Zr(t.segmentReference))throw Error(`Representation is not byte range type`);let{signal:r}=this.downloadAbortController,i=t.segmentReference.url,o={from:e[0].segment.byte.from,to:e[e.length-1].segment.byte.to};return{url:i,range:o,onProgress:function(){var i=a(function*(i,a){if(!r.aborted)try{n.lastDataObtainedTimestampMs=As.now(),yield n.onSomeDataLoaded({downloadingItems:e,dataView:i,loaded:a,signal:r,globalFrom:o?o.from:0,representationId:t.id})}catch(e){n.error$.next({id:`SegmentFeeding`,category:As.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}});return function(e,t){return i.apply(this,arguments)}}(),signal:r,bufferOptimisation:this.tuning.dash.fetcherBufferOptimisation}}onSomeDataLoaded({downloadingItems:e,dataView:t,representationId:n,globalFrom:r,loaded:i,signal:o}){var s=this;return a(function*(){let a=s.representations.get(n);if(!(!s.downloadingBufferItems.length||As.isNullable(a)||As.isNullable(r)||o.aborted))for(let n of e){let{segment:e}=n,a=e.byte.from-r,o=e.byte.to-r,c=a<i,l=o<=i;!c||As.isNullable(e.size)||(e.networkStatus===`downloading`&&e.bufferStatus===`none`&&l?(e.data=new DataView(t.buffer,t.byteOffset+a,e.size),s.currentVirtualBufferSize+=e.size,s.onItemFullyDownloaded(n),e.loadedBytes=Math.min(e.size,i-a),yield s.onDownloadItem(n)):As.isNonNullable(e.feedingBytes)&&s.tuning.dash.enableSubSegmentBufferFeeding&&e.networkStatus===`downloading`&&(e.loadedBytes=Math.min(e.size,i-a),l&&(s.currentVirtualBufferSize+=e.size,s.onItemFullyDownloaded(n)),e.loadedBytes>e.feedingBytes&&(e.data=new DataView(t.buffer,t.byteOffset+a,e.loadedBytes),yield s.onDownloadItem(n))))}})()}updateRepresentationBaseUrl(e,t){if(Zr(e.segmentReference))throw Error(`Representation is not byte range type`);e.segmentReference.url=t}}var Ms=require(`@vkontakte/videoplayer-shared`);class Ns extends ks{constructor(e,t,n,r){super(e,t,n,r)}loadItems(e,n,r=`auto`){var i=this;return a(function*(){let{signal:a}=i.downloadAbortController;if(a.aborted||!e.length)return;let s=i.prepareFetchParams(e,n),{url:c}=s,u=l(s,t);if(i.failedDownloads&&(yield i.waitExponentialDownloadDelay()),a.aborted)return;let d=Ms.getWindow().performance.now();for(let t of e)t.startedAtMs=d;try{let t=yield i.fetcher.fetch(c,o(o({},u),{},{priority:r}));if(i.lastDataObtainedTimestampMs=Ms.now(),Ms.isNullable(t))return;let n=e[0],a=new DataView(t);n.segment.size=a.byteLength,n.segment.loadedBytes=a.byteLength,n.segment.data=a,i.onItemFullyDownloaded(n),yield i.onDownloadItem(n),i.failedDownloads=0}catch(e){i.abortDownloadingItems(),Ms.isAbortError(e)||(i.failedDownloads++,i.updateRepresentationsBaseUrlIfNeeded())}})()}selectItemsToLoad(){let e=[];for(let t of this.downloadingBufferItems){let n=t.segment;n.networkStatus=`downloading`,n.size=1/0,n.loadedBytes=0,n.feedingBytes=0,n.fedBytes=0,e.push(t)}return e}prepareFetchParams(e,t){var n=this;let r=this.getFetchUrl(e,t).toString(),{signal:i}=this.downloadAbortController;return{url:r,onProgress:function(){var r=a(function*(r,a){if(!i.aborted)try{n.lastDataObtainedTimestampMs=Ms.now(),yield n.onSomeDataLoaded({downloadingItems:e,dataView:r,loaded:a,signal:i,representationId:t.id})}catch(e){n.error$.next({id:`SegmentFeeding`,category:Ms.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}});return function(e,t){return r.apply(this,arguments)}}(),signal:i,bufferOptimisation:this.tuning.dash.fetcherBufferOptimisation}}getFetchUrl(e,t){if(!Zr(t.segmentReference))throw Error(`Representation is not template type`);return new URL(e[0].segment.url,t.segmentReference.baseUrl)}onSomeDataLoaded({downloadingItems:e,dataView:t,representationId:n,loaded:r,signal:i}){var o=this;return a(function*(){let a=e[0],{segment:s}=a,c=o.representations.get(n);!o.downloadingBufferItems.length||Ms.isNullable(c)||Ms.isNullable(s.feedingBytes)||s.networkStatus!==`downloading`||i.aborted||(s.loadedBytes=r,s.loadedBytes>s.feedingBytes&&o.tuning.dash.enableSubSegmentBufferFeeding&&(s.data=new DataView(t.buffer,t.byteOffset,s.loadedBytes),yield o.onDownloadItem(a)))})()}updateRepresentationBaseUrl(e,t){if(!Zr(e.segmentReference))throw Error(`Representation is not template type`);e.segmentReference.baseUrl=t}}var Ps=require(`@vkontakte/videoplayer-shared`),Fs=require(`@vkontakte/videoplayer-shared`);class Is extends Ns{constructor(e,t,n,r){super(e,t,n,r),i(this,`currentLiveSegmentServerLatency$`,new Fs.ValueSubject(0)),i(this,`currentLowLatencySegmentLength$`,new Fs.ValueSubject(0)),i(this,`liveInitialAdditionalOffset`,0),i(this,`isSeekingLive`,!1),i(this,`isActiveLowLatency`,void 0),this.isActiveLowLatency=r.isActiveLowLatency}updateManifest(e){if(!e||[...this.segments.values()].every(e=>!e.length))return;let t=Ps.arrayFlatMap(e.streams[this.kind],e=>e.representations);for(let e of t){if(Fs.isNullable(e)||!Zr(e.segmentReference))return;let t=e.segmentReference.segments.map(e=>o(o({},e),{},{networkStatus:`none`,bufferStatus:`none`,size:void 0})),n=this.segments.get(e.id)??[],r=n.at(-1)?.time.to??0,i=t?.findIndex(e=>r>=e.time.from+100&&r<=e.time.to+100);if(i===-1){let t=this.getActualLiveStartingSegments(e.segmentReference);this.segments.set(e.id,t)}else{let r=t.slice(i+1);this.segments.set(e.id,[...n,...r])}this.representations.set(e.id,e)}}proceedLowLatencyLive(){let e=this.downloadingRepresentationId;Fs.assertNonNullable(e);let t=this.segments.get(e);if(t?.length){let n={representationId:e,segmentIndex:t.length-1,segment:t[t.length-1]};this.updateLowLatencyLive(n)}}getLiveSegmentsToLoadState(e){let t=e?.streams[this.kind],n=(t==null?void 0:Ps.arrayFlatMap(t,e=>e.representations)).find(e=>e.id===this.downloadingRepresentationId);if(Fs.isNullable(n))return;let r=this.segments.get(n.id);if(r?.length)return{from:r[0].time.from,to:r[r.length-1].time.to}}getRepresentationInitialTime(){if(Fs.isNullable(this.playingRepresentationId))return 0;let e=this.representations.get(this.playingRepresentationId)?.segmentReference;return Fs.isNullable(e)||!Zr(e)?0:this.getActualLiveStartingSegments(e)[0].time.from+this.tuning.dash.bufferTolerance}prepareFetchParams(e,t){return o(o({},super.prepareFetchParams(e,t)),{},{isLowLatency:this.isActiveLowLatency()})}onSomeDataLoaded(e){var t=()=>super.onSomeDataLoaded,r=this;return a(function*(){let{downloadingItems:i}=e,a=l(e,n);yield t().call(r,o({downloadingItems:i},a)),r.isActiveLowLatency()&&r.updateLowLatencyItemTime(i[0])})()}onItemFullyDownloaded(e){if(super.onItemFullyDownloaded(e),Fs.isNullable(e.segment.data)||!this.isActiveLowLatency())return;let t=e.segment.data,{serverDataReceivedTimestamp:n,serverDataPreparedTime:r}=this.containerParser.getServerLatencyTimestamps(t);n&&r&&this.currentLiveSegmentServerLatency$.next(r-n),this.updateLowLatencyItemTime(e),this.updateLowLatencyLive(e)}updateLowLatencyItemTime(e){let t=e.segment.data,n=this.representations.get(e.representationId)?.segmentReference;if(Fs.isNullable(e.segment.data)||Fs.isNullable(n)||!Zr(n))return;let r=this.containerParser;if(e.segment.isCurrentLowLatency){let{timescale:i}=n;e.segment.time.to=r.getChunkEndTime(t,i)}}updateLowLatencyLive(e){let t=0;for(let n of this.representations.values()){let r=n.segmentReference;if(!Zr(r))return;let i=this.segments.get(n.id)??[],a=i.find(t=>Math.floor(t.time.from)===Math.floor(e.segment.time.from));if(a?.isCurrentLowLatency&&(a.time.to=e.segment.time.to,t=a.time.to-a.time.from,a.isCurrentLowLatency=!1),!i.find(t=>Math.floor(t.time.from)===Math.floor(e.segment.time.to))&&this.isActiveLowLatency()){let t=Math.round(e.segment.time.to*r.timescale/1e3).toString(10),n=bo(r.segmentTemplateUrl,{segmentTime:t});i.push({networkStatus:`none`,bufferStatus:`none`,time:{from:e.segment.time.to,to:e.segment.time.to+this.tuning.dash.bufferTolerance},url:n,isCurrentLowLatency:!0})}}this.currentLowLatencySegmentLength$.next(t)}parseFeedableSegmentChunk(e){return this.containerParser.parseFeedableSegmentChunk(e,!0)}getFetchUrl(e,t){let n=super.getFetchUrl(e,t);return this.isActiveLowLatency()&&n.searchParams.set(`low-latency`,`yes`),n}loadInit(e,t=`auto`,n=!1){var r=this;return a(function*(){try{let n=r.tuning.dash.useFetchPriorityHints?t:`auto`,i=r.fetcher.fetchRepresentation(e.segmentReference,r.containerParser,r.downloadAbortController.signal,n);r.initDataPromises.set(e.id,i);let{initMetadata:a,initDataView:o,segments:s}=(yield i)??{};if(r.initDataPromises.delete(e.id),Fs.isNullable(o)||Fs.isNullable(s))return;a&&r.parsedInitData.set(e.id,a);let c=r.getActualLiveStartingSegments(e.segmentReference);r.segments.has(e.id)||r.segments.set(e.id,c);let l=o.buffer.slice(o.byteOffset,o.byteOffset+o.byteLength);r.initData.set(e.id,l),r.failedDownloads=0}catch(e){n&&r.error$.next({id:`LoadInits`,category:Fs.ErrorCategory.WTF,message:`loadInit threw`,thrown:e})}})()}getActualLiveStartingSegments(e){let t=e.segments,n=this.isActiveLowLatency()?this.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.tuning.dashCmafLive.maxActiveLiveOffset,r=[],i=0,a=t.length-1;do r.unshift(t[a]),i+=t[a].time.to-t[a].time.from,a--;while(i<n&&a>=0);return this.liveInitialAdditionalOffset=i-n,this.isActiveLowLatency()?[r[0]]:r}}class Ls{static getBufferManager(e,t,n,r){return r.manifest?.live?new Is(e,t,n,r):Zr(n[0].segmentReference)?new Ns(e,t,n,r):new js(e,t,n,r)}}var Rs=require(`@vkontakte/videoplayer-shared`),zs=require(`@vkontakte/videoplayer-shared`),Bs=18,Vs=!1;try{Vs=j.browser.isSafari&&!!j.browser.safariVersion&&j.browser.safariVersion<=Bs}catch(e){console.error(e)}class Hs{constructor(e,t=!1){i(this,`bufferFull$`,new zs.Subject),i(this,`error$`,new zs.Subject),i(this,`buffer`,void 0),i(this,`queue`,[]),i(this,`currentTask`,null),i(this,`destroyed`,!1),i(this,`abortRequested`,!1),i(this,`isAbortFixEnabled`,!1),i(this,`completeTask`,()=>{try{if(this.currentTask){let e=this.currentTask.signal?.aborted;this.currentTask.callback(!e),this.currentTask=null}this.queue.length&&this.pull()}catch(e){this.error$.next({id:`BufferTaskQueueUnknown`,category:zs.ErrorCategory.VIDEO_PIPELINE,message:`Buffer appending or removal failed`,thrown:e})}}),this.buffer=e,this.isAbortFixEnabled=t,this.buffer.addEventListener(`updateend`,this.completeTask)}append(e,t){var n=this;return a(function*(){return t&&t.aborted?!1:new Promise(r=>{let i={operation:`append`,data:e,signal:t,callback:r};n.queue.push(i),n.pull()})})()}remove(e,t,n){var r=this;return a(function*(){return n&&n.aborted?!1:new Promise(i=>{let a={operation:`remove`,from:e,to:t,signal:n,callback:i};r.queue.unshift(a),r.pull()})})()}abort(e){var t=this;return a(function*(){return new Promise(n=>{let r,i=e=>{t.abortRequested=!1,n(e)};r=Vs&&e?{operation:`safariAbort`,init:e,callback:i}:{operation:`abort`,callback:i},t.isAbortFixEnabled&&t.currentTask&&(t.currentTask.callback(!1),t.currentTask=null);for(let{callback:e}of t.queue)e(!1);t.abortRequested=!0,r&&(t.queue=[r]),t.pull()})})()}destroy(){this.destroyed=!0,this.buffer.removeEventListener(`updateend`,this.completeTask),this.queue=[],this.currentTask=null;try{this.buffer.abort()}catch(e){if(!(e instanceof DOMException&&e.name===`InvalidStateError`))throw e}}pull(){if((this.buffer.updating||this.currentTask||this.destroyed)&&!this.abortRequested)return;let e=this.queue.shift();if(!e)return;if(e.signal?.aborted){e.callback(!1),this.pull();return}this.currentTask=e;let{operation:t}=this.currentTask;try{this.execute(this.currentTask)}catch(e){e instanceof DOMException&&e.name===`QuotaExceededError`&&t===`append`?this.bufferFull$.next(this.currentTask.data.byteLength):e instanceof DOMException&&e.name===`InvalidStateError`||this.error$.next({id:`BufferTaskQueue:${t}`,category:zs.ErrorCategory.VIDEO_PIPELINE,message:`Buffer operation failed`,thrown:e}),this.currentTask.callback(!1),this.currentTask=null}this.currentTask&&this.currentTask.operation===`abort`&&this.completeTask()}execute(e){let{operation:t}=e;switch(t){case`append`:this.buffer.appendBuffer(e.data);break;case`remove`:this.buffer.remove(e.from/1e3,e.to/1e3);break;case`abort`:this.buffer.abort();break;case`safariAbort`:this.buffer.abort(),this.buffer.appendBuffer(e.init);break;default:zs.assertNever(t)}}}var Us=Hs,Ws=(e,t)=>{let n=0;for(let r=0;r<e.length;r++){let i=e.start(r)*1e3,a=e.end(r)*1e3;i<=t&&t<=a&&(n=a)}return Math.max(n-t,0)};class Gs{constructor(e){i(this,`error$`,new Rs.Subject),i(this,`updateEnd$`,new Rs.ValueSubject(void 0)),i(this,`mediaSource`,void 0),i(this,`sourceBuffer`,void 0),i(this,`sourceBufferTaskQueue`,void 0),i(this,`subscription`,new Rs.Subscription),this.mediaSource=e}init(e,t,n=!1){this.sourceBuffer=this.mediaSource.addSourceBuffer(`${e}; codecs="${t}"`),this.sourceBufferTaskQueue=new Us(this.sourceBuffer,n),this.subscription.add(this.sourceBufferTaskQueue.error$.subscribe(e=>this.error$.next(e))),this.subscription.add(Rs.fromEvent(this.sourceBuffer,`error`).subscribe(()=>this.error$.next({id:`SourceBuffer`,category:Rs.ErrorCategory.VIDEO_PIPELINE,message:`SourceBuffer Error event fired`}))),this.subscription.add(Rs.fromEvent(this.sourceBuffer,`updateend`).subscribe(this.updateEnd$))}addInitSegment(e,t){return this.sourceBufferTaskQueue.append(e,t)}append(e,t){return this.sourceBufferTaskQueue.append(e,t)}remove(e,t,n){return this.sourceBufferTaskQueue.remove(e,t,n)}clear(e){var t=this;return a(function*(){let n=t.getBufferState();if(Rs.isNullable(n))return Promise.resolve(!1);let r=!0;yield t.sourceBufferTaskQueue.abort();for(let i of n)r&&=yield t.sourceBufferTaskQueue.remove(i.from,i.to,e);return r})()}warmUpMediaSource(){!Rs.isNullable(this.sourceBuffer)&&!this.sourceBuffer.updating&&(this.sourceBuffer.mode=`segments`)}getBufferState(){if(Rs.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length)return null;let e=[];for(let t=0;t<this.sourceBuffer.buffered.length;t++)e.push({from:this.sourceBuffer.buffered.start(t)*1e3,to:this.sourceBuffer.buffered.end(t)*1e3});return e}getForwardBufferDuration(e){return Rs.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length||Rs.isNullable(e)?0:Ws(this.sourceBuffer.buffered,e)}abortBuffer(e){var t=this;return a(function*(){return Rs.isNullable(t.sourceBuffer)?!1:t.sourceBufferTaskQueue.abort(e)})()}destroy(){if(this.subscription.unsubscribe(),this.sourceBufferTaskQueue?.destroy(),this.sourceBuffer)try{this.mediaSource.removeSourceBuffer(this.sourceBuffer)}catch(e){if(!(e instanceof DOMException&&e.name===`NotFoundError`))throw e}this.sourceBuffer=null}}var Ks=require(`@vkontakte/videoplayer-shared`),qs=require(`@vkontakte/videoplayer-shared`),Js=e=>{switch(e){case`DASH_SEP`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_ONDEMAND`:case`DASH_STREAMS`:return!0;default:return!1}},Ys=Ks.objectValues(qs.VideoQuality).filter(e=>e!==qs.VideoQuality.INVARIANT).sort((e,t)=>qs.isHigher(e,t)?-1:1),Xs=e=>{if(!e||e===qs.VideoQuality.INVARIANT)return null;let t=Ys.find(t=>qs.isLower(t,e))??qs.VideoQuality.Q_1080P;return qs.isLowerOrEqual(t,qs.VideoQuality.Q_1080P)?qs.VideoQuality.Q_1080P:t},Zs=(e,t,n)=>e.category===qs.ErrorCategory.VIDEO_PIPELINE&&e.id.endsWith(`MediaError#${MediaError.MEDIA_ERR_DECODE}`)&&Js(t)?Xs(n):null,Qs=({height:e},t)=>{let n=`${e}p`;try{return qs.isHigher(n,t)}catch{return!1}},$s=(e,t)=>{e.video.forEach(e=>{e.representations.forEach(e=>{e.tvDisabled=e.tvDisabled||Qs(e,t)})})},ec=[`timeupdate`,`progress`,`play`,`seeked`,`stalled`,`waiting`],tc=[`timeupdate`,`progress`,`loadeddata`,`playing`,`seeked`];class nc{constructor(e){i(this,`element`,null),i(this,`manifestUrlString`,``),i(this,`source`,null),i(this,`manifest`,null),i(this,`tuning`,void 0),i(this,`tracer`,void 0),i(this,`stallTracer`,void 0),i(this,`forceVideoCodec`,void 0),i(this,`stallTimeInWaitingExitAttemptMade`,0),i(this,`videoBufferManager`,void 0),i(this,`audioBufferManager`,void 0),i(this,`bufferManagers`,[]),i(this,`videoNativeBufferManager`,void 0),i(this,`audioNativeBufferManager`,void 0),i(this,`nativeBufferManagers`,[]),i(this,`throughputEstimator`,void 0),i(this,`subscription`,new V.Subscription),i(this,`subscriptionRemovable`,new V.SubscriptionRemovable),i(this,`representationSubscription`,new V.Subscription),i(this,`fetcher`,void 0),i(this,`forceEnded$`,new V.Subject),i(this,`stallWatchdogSubscription`,void 0),i(this,`destroyController`,new ja.AbortControllerPolyfilled),i(this,`state$`,new st(`none`)),i(this,`currentVideoRepresentation$`,new V.ValueSubject(void 0)),i(this,`currentVideoRepresentationInit$`,new V.ValueSubject(void 0)),i(this,`currentAudioRepresentation$`,new V.ValueSubject(void 0)),i(this,`currentVideoSegmentLength$`,new V.ValueSubject(0)),i(this,`currentAudioSegmentLength$`,new V.ValueSubject(0)),i(this,`error$`,new V.Subject),i(this,`manifestRequested`,new V.Subject),i(this,`manifestReceived`,new V.Subject),i(this,`firstBytesRequested`,new V.Subject),i(this,`firstBytesReceived`,new V.Subject),i(this,`lastConnectionType$`,new V.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new V.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new V.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new V.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new V.ValueSubject(void 0)),i(this,`currentLiveTextRepresentation$`,new V.ValueSubject(null)),i(this,`timeoutSourceOpenId`,void 0),i(this,`isLive$`,new V.ValueSubject(!1)),i(this,`isActiveLive$`,new V.ValueSubject(!1)),i(this,`isLowLatency$`,new V.ValueSubject(!1)),i(this,`liveDuration$`,new V.ValueSubject(0)),i(this,`liveSeekableDuration$`,new V.ValueSubject(0)),i(this,`liveAvailabilityStartTime$`,new V.ValueSubject(0)),i(this,`liveStreamStatus$`,new V.ValueSubject(void 0)),i(this,`currentBuffer$`,new V.ValueSubject({from:0,to:0})),i(this,`bufferLength$`,new V.ValueSubject(0)),i(this,`nativeBufferLength$`,new V.ValueSubject(0)),i(this,`liveLatency$`,new V.ValueSubject(void 0)),i(this,`liveLoadBufferLength$`,new V.ValueSubject(0)),i(this,`livePositionFromPlayer$`,new V.ValueSubject(0)),i(this,`currentStallDuration$`,new V.ValueSubject(0)),i(this,`videoLastDataObtainedTimestamp$`,new V.ValueSubject(0)),i(this,`fetcherRecoverableError$`,new V.Subject),i(this,`fetcherError$`,new V.Subject),i(this,`updateDurationError$`,new V.Subject),i(this,`isOnDemand`,!1),i(this,`dashMaxTvVideoQuality`,void 0),i(this,`initRepresentations`,V.abortable(this.destroyController.signal,function(){var e=c(function*(e,t,n){this.representationSubscription.unsubscribe(),this.state$.startTransitionTo(`representations_ready`);let r={fetcher:this.fetcher,tracer:this.tracer,tuning:this.tuning,getCurrentPosition:()=>this.element?this.element.currentTime*1e3:void 0,getCurrentStallDuration:()=>this.currentStallDuration$.getValue(),isActiveLowLatency:()=>this.isActiveLive$.getValue()&&this.isLowLatency$.getValue(),manifest:this.manifest};this.createBuffers(r,e,t,n),this.initRepresentationSubscriptions(),yield this.waitStreamToOpen(),this.setSourceInitDuration(),V.assertNonNullable(this.videoBufferManager),yield Promise.all([this.videoBufferManager.startWith(e),t?this.audioBufferManager?.startWith(t):Promise.resolve()]),this.state$.setState(`representations_ready`)});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchManifest`,V.abortable(this.destroyController.signal,c(function*(){try{return yield this.fetcher.fetchManifest(this.manifestUrlString)}catch(e){V.isNullable(this.manifest)&&!this.bufferLength$.getValue()&&this.error$.next({id:`LoadManifest`,category:V.ErrorCategory.NETWORK,message:`Failed to load manifest`,thrown:e})}}).bind(this))),this.throughputEstimator=e.throughputEstimator,this.tuning=e.tuning,this.tracer=e.tracer.createComponentTracer(this.constructor.name),this.forceVideoCodec=e.forceVideoCodec,this.isOnDemand=e.isOnDemand||!1,this.dashMaxTvVideoQuality=e.dashMaxTvVideoQuality,this.fetcher=new io({throughputEstimator:this.throughputEstimator,requestQuic:this.tuning.requestQuick,compatibilityMode:e.compatibilityMode,tracer:this.tracer,useEnableSubtitlesParam:e.tuning.useEnableSubtitlesParam,measureNonSegmentRequests:e.tuning.throughputEstimator.measureNonSegmentRequests,handleExtendedNetworkErrorsSet:e.tuning.handleExtendedNetworkErrorsSet,useUrlCacheMechanism:e.tuning.useUrlCacheMechanism}),this.subscription.add(this.fetcher.recoverableError$.subscribe(this.fetcherRecoverableError$)),this.subscription.add(this.fetcher.error$.subscribe(this.fetcherError$)),this.initTracerSubscription()}initManifest(e,t,n){var r=this;return a(function*(){r.state$.startTransitionTo(`manifest_ready`),r.element=e,r.manifestUrlString=r.prepareManifestUrlString(t,n),r.manifest=yield r.updateManifest(),r.manifest?.streams.video.length?r.state$.setState(`manifest_ready`):r.error$.next({id:`NoRepresentations`,category:V.ErrorCategory.PARSER,message:`No playable video representations`})})()}initBuffer(){V.assertNonNullable(this.element),this.state$.setState(`running`),this.subscription.add(V.merge(...ec.map(e=>V.fromEvent(this.element,e)),V.fromEvent(V.getWindow(),`online`),V.interval(this.tuning.dash.tickMaintainInterval)).subscribe(()=>this.tick(),e=>this.error$.next({id:`DashVKPlayer`,category:V.ErrorCategory.WTF,message:`Internal logic error`,thrown:e})));let e=[...this.source?.activeSourceBuffers??[]];this.subscription.add(V.merge(...e.map(e=>V.fromEvent(e,`updateend`))).subscribe(e=>this.reinitDecoderIfNeeded())),this.subscription.add(V.fromEvent(this.element,`waiting`).subscribe(e=>{this.stallWatchdogSubscription&&(this.stallWatchdogSubscription.unsubscribe(),this.subscriptionRemovable.remove(this.stallWatchdogSubscription),this.stallTracer.end()),this.stallTracer=this.tracer.createComponentTracer(`stall`),this.stallWatchdogSubscription=V.interval(this.tuning.dash.stallWatchdogInterval).subscribe(()=>this.stallWatchdogIntervalCallback(),e=>this.error$.next({id:`StallWatchdogCallback`,category:V.ErrorCategory.NETWORK,message:`Can't restore DASH after stall.`,thrown:e})),this.subscriptionRemovable.add(this.stallWatchdogSubscription)}))}switchRepresentation(e,t,n){var r=this;return a(function*(){return{video:r.videoBufferManager,audio:r.audioBufferManager,text:null}[e]?.switchTo(t,n)})()}seek(e,t=!1){var n=this;return a(function*(){V.assertNonNullable(n.element),V.assertNonNullable(n.videoBufferManager);let r;r=t||n.element.duration*1e3<=n.tuning.dashSeekInSegmentDurationThreshold||Math.abs(n.element.currentTime*1e3-e)<=n.tuning.dashSeekInSegmentAlwaysSeekDelta?e:Math.max(n.videoBufferManager.findSegmentStartTime(e)??e,n.audioBufferManager?.findSegmentStartTime(e)??e),n.warmUpMediaSourceIfNeeded(r),yield Promise.all([n.videoBufferManager.prepareSeek(),n.audioBufferManager?.prepareSeek()]),n.element.currentTime=r/1e3,yield Promise.all([n.videoBufferManager.seek(r),n.audioBufferManager?.seek(r)]),yield n.reinitDecoderIfNeeded()})()}warmUpMediaSourceIfNeeded(e=this.element?.currentTime){V.isNonNullable(this.element)&&V.isNonNullable(this.source)&&V.isNonNullable(e)&&this.isStreamEnded&&this.element.duration*1e3-e>this.tuning.dash.seekBiasInTheEnd&&this.nativeBufferManagers.forEach(e=>e.warmUpMediaSource())}getForwardBufferRepresentations(e){return e===`video`?this.videoBufferManager?.getForwardBufferRepresentations():this.audioBufferManager?.getForwardBufferRepresentations()}getActiveVideoSegmentProgress(){return this.videoBufferManager?.getActiveSegmentProgress()}getMpdVideoSegmentDuration(){return this.videoBufferManager?.getMpdSegmentDuration()}get isStreamEnded(){return this.source?.readyState===`ended`}getStreams(){return this.manifest?.streams}getCodecs(){return this.manifest?.codecs}setBufferTarget(e){this.bufferManagers.forEach(t=>t.setTarget(e))}setPreloadOnly(e){this.bufferManagers.forEach(t=>t.setPreloadOnly(e))}stop(){this.tracer.log(`stop`),this.element?.querySelectorAll(`source`).forEach(e=>{URL.revokeObjectURL(e.src),e.remove()}),this.element=null,this.source=null,this.manifest=null,this.currentVideoRepresentation$.next(void 0),this.nativeBufferManagers.forEach(e=>e.destroy()),this.videoBufferManager?.destroy(),this.videoBufferManager=null,this.audioBufferManager?.destroy(),this.audioBufferManager=null,this.bufferManagers=[],this.state$.setState(`none`)}destroy(){this.subscription.unsubscribe(),this.subscriptionRemovable.unsubscribe(),this.representationSubscription.unsubscribe(),this.timeoutSourceOpenId&&V.getWindow().clearTimeout(this.timeoutSourceOpenId),this.destroyController.abort(),this.fetcher.destroy(),this.stop(),V.isNonNullable(this.source)&&this.isStreamNotOpen&&Array.from(this.source.sourceBuffers).every(e=>!e.updating)&&this.source.endOfStream(),this.source=null,this.tracer.end()}updateSourceDurationFromSegments(){if(!this.source||this.source.readyState!==`open`||this.isLive$.getValue()||!this.tuning.useDurationFromSegments)return;let e=e=>{this.updateDurationError$.next({id:`updateDuration`,category:V.ErrorCategory.VIDEO_PIPELINE,message:"Duration can`t be updated",thrown:e})};try{if(!this.isAnyBufferUpdating()){this.source.duration=this.calculateDurationFromBuffersSegments()/1e3;return}}catch(t){e(t);return}let t=new V.Subscription;t.add(V.merge(...this.nativeBufferManagers.map(e=>e.updateEnd$)).subscribe(()=>{if(!this.isAnyBufferUpdating()){t.unsubscribe();try{this.source&&(this.source.duration=this.calculateDurationFromBuffersSegments()/1e3)}catch(t){e(t)}}}))}calculateDurationFromBuffersSegments(){return Math.max(this.videoBufferManager?.calculateDurationFromSegments()||0,this.audioBufferManager?.calculateDurationFromSegments()||0)}isAnyBufferUpdating(){return!this.source||this.source.readyState!==`open`?!1:Array.from(this.source.sourceBuffers).some(e=>e.updating)}get isStreamNotOpen(){return this.source?.readyState!==`open`}reinitDecoderIfNeeded(e=!1){var t=this;return a(function*(){let n=t.videoNativeBufferManager?.getBufferState()??[];if(V.isNullable(t.element)||!n.length)return;let r=t.element.currentTime*1e3;t.element.readyState<3&&n.some(({from:e,to:n})=>r>=e&&r<=n&&n-e>t.tuning.dash.minNativeBufferSize/2)&&(e?yield t.seek(r):t.element.currentTime=t.element.currentTime)})()}stallWatchdogIntervalCallback(){var e=this;return a(function*(){V.assertNonNullable(e.element),V.assertNonNullable(e.source);let{stallWatchdogInterval:t}=e.tuning.dash;if(e.isStreamNotOpen)return;let n=e.currentStallDuration$.getValue()+t;if(e.currentStallDuration$.next(n),yield e.reinitDecoderIfNeeded(n%1e3==0),e.isStallExceeded(n)){let t=e.audioBufferManager?.getMutexInfo()??``,r=e.videoBufferManager?.getMutexInfo()??``;if(e.stallTracer.log(`stallExceeded`,V.flattenObject({timeInWaiting:n,audioMutexState:t,videoMutexState:r,mutexStallExitPolicy:e.tuning.dash.mutexStallExitPolicy,seekStallExitPolicy:e.tuning.dash.seekStallExitPolicy})),e.tuning.dash.mutexStallExitPolicy&&(t||r)){let i=`video: ${r} | audio: ${t}`;throw e.stallTracer.end(),Error(`Stall timeout exceeded: ${n} ms ${i}`)}else if(e.tuning.dash.seekStallExitPolicy)if(e.stallTimeInWaitingExitAttemptMade>0&&n-e.stallTimeInWaitingExitAttemptMade>e.tuning.dash.restoreBufferBeforeCrashTimeout){let i=`video: ${r} | audio: ${t}`;throw e.stallTracer.end(),Error(`Stall timeout exceeded: ${n} ms ${i}`)}else e.stallTimeInWaitingExitAttemptMade===0&&(e.stallTracer.log(`seek`),yield e.seek((e.element.currentTime+1)*1e3),e.stallTimeInWaitingExitAttemptMade=n);else{e.stallTracer.end();let i=`video: ${r} | audio: ${t}`;throw Error(`Stall timeout exceeded: ${n} ms ${i}`)}}yield e.restoreAfterDeepStall()})()}isStallExceeded(e){if(V.isNullable(this.element))return!1;let{crashOnStallTimeout:t,virtualBufferEmptinessTolerance:n}=this.tuning.dash,r=n,i=this.element?this.element.currentTime*1e3:0,a=i-r>0?this.tuning.dash.crashOnStallTWithoutDataTimeout:t,o=V.now(),s=this.videoBufferManager?.lastDataObtainedTimestamp??0;this.videoLastDataObtainedTimestamp$.next(s);let c=this.audioBufferManager?.lastDataObtainedTimestamp??0,l=this.videoNativeBufferManager?.getForwardBufferDuration(i)??0,u=this.audioNativeBufferManager?.getForwardBufferDuration(i)??0,d=V.isNonNullable(this.videoBufferManager)&&l<r&&o-s>a,f=V.isNonNullable(this.audioBufferManager)&&u<r&&o-c>a;return(d||f)&&e>a||e>=t}updateManifest(){var e=this;return a(function*(){e.tracer.log(`updateManifestStart`,{manifestUrl:e.manifestUrlString});let t=yield e.fetchManifest();if(V.isNullable(t))return null;let n=e.parseManifest(t);if(!n)return null;let r=e.getResultManifest(n);return e.tracer.log(`updateManifestEnd`,V.flattenObject(r)),r})()}parseManifest(e){try{return xo(e??``,this.manifestUrlString)}catch(t){let n=Pa(e)??{id:`ManifestParsing`,category:V.ErrorCategory.PARSER,message:`Failed to parse MPD manifest`,thrown:t};this.error$.next(n)}}getResultManifest(e){let t={text:e.streams.text,video:[],audio:[]},n=(e,t,n)=>{var r,i,a,o;return!!(!((r=this.element)==null||(i=r.canPlayType)==null)&&i.call(r,t)&&!((a=ke())==null||(o=a.isTypeSupported)==null)&&o.call(a,`${t}; codecs="${n}"`)||e===`text`)},r,i;for(let a of[`video`,`audio`]){let o=e.streams[a].filter(({mime:e,codecs:t})=>n(a,e,t));t[a]=o;let s,c;if(this.tuning.dash.codecsPrioritizeEnabled){if(a===`audio`)i=Dr(o.map(({codecs:e})=>e)),s=i[0],s&&(t[a]=o.filter(({codecs:e})=>Or(e)===s));else if(a===`video`){r=Tr(o,{preferHdr:this.tuning.preferHDR});let e=this.forceVideoCodec;c=(e?r.find(t=>t.name===e.name&&t.hdr===e.hdr):void 0)??r[0],c&&(t[a]=o.filter(e=>Or(e.codecs)===c.name&&!!e.hdr===c.hdr))}}else{let e=wr(new Set(o.map(({codecs:e})=>e)));e&&(t[a]=o.filter(({codecs:t})=>t.startsWith(e)))}if(a===`video`){if(!this.tuning.dash.codecsPrioritizeEnabled){let e=this.tuning.preferHDR,n=t.video.some(e=>e.hdr),r=t.video.some(e=>!e.hdr);j.display.isHDR&&e&&n?t.video=t.video.filter(e=>e.hdr):r&&(t.video=t.video.filter(e=>!e.hdr))}let{videoStreamRepresentaionsFilter:e}=this.tuning.dash;if(e.length&&jr(t,e),this.dashMaxTvVideoQuality&&$s(t,this.dashMaxTvVideoQuality),this.isOnDemand&&this.tuning.dash.filterOnDemandQualityList)for(let e of t.video)e.representations=e.representations.sort((e,t)=>t.height-e.height).filter((e,t)=>t%2==0)}}let a=o(o({},e),{},{streams:t});return this.tuning.dash.codecsPrioritizeEnabled&&(a.codecs={video:r,audio:i}),a}stopStallWatchdogSubscription(){this.stallWatchdogSubscription?.unsubscribe(),this.stallTimeInWaitingExitAttemptMade=0,this.currentStallDuration$.next(0),this.stallTracer.end()}createBuffers(e,t,n,r){V.assertNonNullable(this.manifest),V.assertNonNullable(this.element);let i=e=>{this.representationSubscription.add(V.fromEvent(e,`error`).pipe(V.filter(e=>!!this.element?.played.length)).subscribe(e=>{this.error$.next({id:`VideoSource`,category:V.ErrorCategory.VIDEO_PIPELINE,message:`Unexpected video source error`,thrown:e})}))};this.source=Me();let a=V.getWindow().document,o=a.createElement(`source`);if(i(o),o.src=URL.createObjectURL(this.source),this.element.appendChild(o),Ae())if(r){let e=a.createElement(`source`);i(e),e.type=`application/x-mpegurl`,e.src=r.url,this.element.appendChild(e)}else this.element.disableRemotePlayback=!0;let s=this.manifest.streams.video.reduce((e,t)=>[...e,...t.representations],[]);if(this.videoNativeBufferManager=new Gs(this.source),this.videoBufferManager=Ls.getBufferManager(`video`,this.videoNativeBufferManager,s,e),this.bufferManagers=[this.videoBufferManager],this.nativeBufferManagers=[this.videoNativeBufferManager],V.isNonNullable(n)){this.audioNativeBufferManager=new Gs(this.source);let t=this.manifest.streams.audio.reduce((e,t)=>[...e,...t.representations],[]);this.audioBufferManager=Ls.getBufferManager(`audio`,this.audioNativeBufferManager,t,e),this.bufferManagers.push(this.audioBufferManager),this.nativeBufferManagers.push(this.audioNativeBufferManager)}}waitStreamToOpen(){var e=this;return a(function*(){if(e.isStreamNotOpen){let t=e.tuning.dash.sourceOpenTimeout>=0;yield new Promise(n=>{t&&(e.timeoutSourceOpenId=V.getWindow().setTimeout(()=>{if(e.isStreamNotOpen){n();return}e.error$.next({id:`OpenOfStream`,category:V.ErrorCategory.VIDEO_PIPELINE,message:`Failed to open MediaSource`,thrown:Error(`Timeout reject when wait sourceopen event`),traceAsLog:!0})},e.tuning.dash.sourceOpenTimeout)),e.source?.addEventListener(`sourceopen`,()=>{e.timeoutSourceOpenId&&V.getWindow().clearTimeout(e.timeoutSourceOpenId),n()},{once:!0})})}})()}initRepresentationSubscriptions(){this.representationSubscription.add(this.fetcher.manifestRequested.subscribe(this.manifestRequested)),this.representationSubscription.add(this.fetcher.manifestReceived.subscribe(this.manifestReceived)),this.representationSubscription.add(this.fetcher.firstBytesRequested.subscribe(this.firstBytesRequested)),this.representationSubscription.add(this.fetcher.firstBytesReceived.subscribe(this.firstBytesReceived)),this.representationSubscription.add(this.fetcher.lastConnectionType$.subscribe(this.lastConnectionType$)),this.representationSubscription.add(this.fetcher.lastConnectionReused$.subscribe(this.lastConnectionReused$)),this.representationSubscription.add(this.fetcher.lastRequestFirstBytes$.subscribe(this.lastRequestFirstBytes$)),this.representationSubscription.add(this.fetcher.lastConnectionMetrics$.subscribe(this.lastConnectionMetrics$)),this.representationSubscription.add(this.fetcher.lastDownloadMetrics$.subscribe(this.lastDownloadMetrics$)),this.representationSubscription.add(V.merge(...this.bufferManagers.map(e=>e.error$)).subscribe(this.error$)),V.assertNonNullable(this.videoBufferManager),this.representationSubscription.add(this.videoBufferManager.playingRepresentation$.subscribe(this.currentVideoRepresentation$)),this.representationSubscription.add(this.videoBufferManager.playingRepresentationInit$.subscribe(this.currentVideoRepresentationInit$)),this.representationSubscription.add(this.videoBufferManager.currentSegmentLength$.subscribe(this.currentVideoSegmentLength$)),this.audioBufferManager&&(this.representationSubscription.add(this.audioBufferManager.playingRepresentation$.subscribe(this.currentAudioRepresentation$)),this.representationSubscription.add(this.audioBufferManager.currentSegmentLength$.subscribe(this.currentAudioSegmentLength$))),this.initBufferLengthSubscription()}initBufferLengthSubscription(){this.representationSubscription.add(V.merge(...tc.map(e=>V.fromEvent(this.element,e)),V.interval(this.tuning.dash.tickMaintainInterval)).pipe(V.map(e=>this.videoBufferManager?.getPlaybackBufferState()),V.filter(V.isNonNullable),V.map(({from:e,to:t})=>({from:e/1e3,to:t/1e3}))).subscribe(this.currentBuffer$)),this.representationSubscription.add(V.merge(...tc.map(e=>V.fromEvent(this.element,e)),V.interval(this.tuning.dash.tickMaintainInterval)).pipe(V.map(e=>Math.min(this.videoBufferManager?.getForwardPlaybackBufferDuration()??1/0,this.audioBufferManager?.getForwardPlaybackBufferDuration()??1/0)),V.filterChanged()).subscribe(this.bufferLength$)),this.representationSubscription.add(this.nativeBufferLength$.pipe(V.filter(e=>e>this.tuning.dash.virtualBufferEmptinessTolerance)).subscribe(()=>this.stopStallWatchdogSubscription()))}initTracerSubscription(){let e=V.getTraceSubscriptionMethod(this.tracer.error.bind(this.tracer));this.subscription.add(this.error$.subscribe(e(`error`)))}tick(){var e=this;return a(function*(){if(V.isNullable(e.element)||V.isNullable(e.videoBufferManager)||e.isStreamNotOpen)return;let t=e.element.currentTime*1e3,n=e.videoNativeBufferManager?.getBufferState()??[],r=e.audioNativeBufferManager?.getBufferState()??[],i=n.find(e=>t>=e.from&&t<=e.to),a=r.find(e=>t>=e.from&&t<=e.to),o=i?i.to-t:0,s=a?a.to-t:1/0;e.nativeBufferLength$.next(Math.min(o,s));let c=e.videoBufferManager?.lastDataObtainedTimestamp??0;e.videoLastDataObtainedTimestamp$.next(c),yield Promise.all([e.videoBufferManager.maintain(),e.audioBufferManager?.maintain()])})()}}var rc=require(`@vkontakte/videoplayer-shared`);class ic extends nc{constructor(e){super(e)}prepareManifestUrlString(e,t){return e}initRepresentationSubscriptions(){super.initRepresentationSubscriptions(),this.initDisableStallWatchdogSubscription(),this.initEndOfVideoSubscription()}setSourceInitDuration(){rc.assertNonNullable(this.manifest),rc.assertNonNullable(this.source);let e=[this.manifest.duration??0,...Aa.arrayFlatMap(Aa.arrayFlatMap([...this.manifest.streams.audio,...this.manifest.streams.video],e=>e.representations),e=>{let t=[];return e.duration&&t.push(e.duration),Zr(e.segmentReference)&&e.segmentReference.totalSegmentsDurationMs&&t.push(e.segmentReference.totalSegmentsDurationMs),t})];this.source.duration=Math.max(...e)/1e3}restoreAfterDeepStall(){var e=this;return a(function*(){rc.assertNonNullable(e.element);let t=e.element.currentTime*1e3;e.stallTracer.log(`restore maintain`,{position:t}),yield Promise.all([e.videoBufferManager?.maintain(t),e.audioBufferManager?.maintain(t)])})()}initDisableStallWatchdogSubscription(){rc.assertNonNullable(this.element);let e=rc.merge(rc.fromEvent(this.element,`ended`),this.forceEnded$),t=this.nativeBufferLength$.pipe(rc.filter(e=>e>this.tuning.dash.virtualBufferEmptinessTolerance));this.representationSubscription.add(rc.merge(e,t).subscribe(e=>this.stopStallWatchdogSubscription()))}initEndOfVideoSubscription(){let e=rc.merge(...this.bufferManagers.map(e=>e.fullyBuffered$)).pipe(rc.map(()=>this.bufferManagers.every(e=>e.fullyBuffered$.getValue()))),t=rc.merge(...this.bufferManagers.map(e=>e.onLastSegment$)).pipe(rc.map(()=>this.bufferManagers.some(e=>e.onLastSegment$.getValue()))),n=rc.combine({allBuffersFull:e,someBufferEnded:t}).pipe(rc.filterChanged(),rc.map(({allBuffersFull:e,someBufferEnded:t})=>e&&t),rc.filter(e=>e));this.representationSubscription.add(rc.merge(this.forceEnded$,n).pipe(rc.filter(e=>rc.isNonNullable(this.source)&&this.source.readyState===`open`&&Array.from(this.source.sourceBuffers).every(e=>!e.updating))).subscribe(()=>{try{this.source?.endOfStream()}catch(e){this.error$.next({id:`EndOfStream`,category:rc.ErrorCategory.VIDEO_PIPELINE,message:`Failed to end MediaSource stream`,thrown:e})}}))}}class ac extends ka{subscribe(){super.subscribe();let{output:e,observableVideo:t,connect:n,genericErrorListener:r}=this.getProviderSubscriptionInfo();n(t.timeUpdate$,e.position$),n(t.durationChange$,e.duration$),this.subscription.add(this.player.currentVideoRepresentation$.pipe(Hr.filterChanged(),Hr.filter(e=>Hr.isNonNullable(e))).subscribe(()=>{this.player.updateSourceDurationFromSegments()},r)),this.subscription.add(this.player.currentAudioRepresentation$.pipe(Hr.filterChanged(),Hr.filter(e=>Hr.isNonNullable(e))).subscribe(()=>{this.player.updateSourceDurationFromSegments()},r))}getPlayer(){return new ic({throughputEstimator:this.params.dependencies.throughputEstimator,tuning:this.params.tuning,compatibilityMode:this.params.source.compatibilityMode,tracer:this.tracer,forceVideoCodec:this.params.forceVideoCodec,isOnDemand:this.params.isOnDemand||!1,dashMaxTvVideoQuality:this.params.dashMaxTvVideoQuality})}seek(e,t){this.params.output.willSeekEvent$.next(),this.player.seek(e,t)}}var oc=require(`@vkontakte/videoplayer-shared`),sc=require(`@vkontakte/videoplayer-shared`);class cc{constructor(e){i(this,`prevReported`,void 0),i(this,`rawSeries$`,void 0),i(this,`smoothedSeries$`,void 0),i(this,`reportedSeries$`,void 0),i(this,`smoothed`,void 0),i(this,`pastMeasures`,[]),i(this,`takenMeasures`,0),i(this,`measuresCursor`,0),i(this,`params`,void 0),i(this,`smoothed$`,void 0),i(this,`debounced$`,void 0),i(this,`varianceCoefficient$`,void 0),this.params=e,this.pastMeasures=Array(e.deviationDepth),this.smoothed=this.prevReported=e.initial,this.smoothed$=new sc.ValueSubject(e.initial),this.debounced$=new sc.ValueSubject(e.initial),this.varianceCoefficient$=new sc.ValueSubject(0);let t=e.label??`value`+Math.random().toString(16).substring(2,6);this.rawSeries$=new sn(`raw_${t}`),this.smoothedSeries$=new sn(`smoothed_${t}`),this.reportedSeries$=new sn(`reported_${t}`),this.rawSeries$.next(e.initial),this.smoothedSeries$.next(e.initial),this.reportedSeries$.next(e.initial)}next(e){let t=0,n=0;for(let e=0;e<this.pastMeasures.length;e++)this.pastMeasures[e]!==void 0&&(t+=(this.pastMeasures[e]-this.smoothed)**2,n++);this.takenMeasures=n,t/=n;let r=Math.sqrt(t);n>=2&&this.smoothed>0&&this.varianceCoefficient$.next(r/this.smoothed);let i=this.smoothed+this.params.deviationFactor*r,a=this.smoothed-this.params.deviationFactor*r;this.pastMeasures[this.measuresCursor]=e,this.measuresCursor=(this.measuresCursor+1)%this.pastMeasures.length,this.rawSeries$.next(e),this.updateSmoothedValue(e),this.smoothed$.next(this.smoothed),this.smoothedSeries$.next(this.smoothed),!(this.smoothed>i||this.smoothed<a)&&(sc.isNullable(this.prevReported)||Math.abs(this.smoothed-this.prevReported)/this.prevReported>=this.params.changeThreshold)&&(this.prevReported=this.smoothed,this.debounced$.next(this.smoothed),this.reportedSeries$.next(this.smoothed))}}class lc extends cc{constructor(e){super(e),i(this,`slow`,void 0),i(this,`fast`,void 0),this.slow=this.fast=e.initial}updateSmoothedValue(e){this.slow=ii(this.slow,e,this.params.emaAlphaSlow),this.fast=ii(this.fast,e,this.params.emaAlphaFast),this.smoothed=(this.params.fastDirection>0?Math.max:Math.min)(this.slow,this.fast)}}class uc extends cc{constructor(e){super(e),i(this,`emaSmoothed`,void 0),this.emaSmoothed=e.initial}updateSmoothedValue(e){let t=ai(this.pastMeasures,this.takenMeasures);this.emaSmoothed=ii(this.emaSmoothed,e,this.params.emaAlpha),this.smoothed=oi(this.pastMeasures,this.takenMeasures,this.measuresCursor-1,this.params.basisTrendChangeCount)?this.emaSmoothed:t}}class dc extends cc{constructor(e){super(e),i(this,`extremumInterval`,void 0),i(this,`furtherValues`,[]),i(this,`currentTopExtremumValue`,0),this.extremumInterval=e.extremumInterval}next(e){this.currentTopExtremumValue<=e?(this.currentTopExtremumValue=e,this.furtherValues=[]):this.furtherValues.length===this.extremumInterval?(super.next(this.currentTopExtremumValue),this.currentTopExtremumValue=e,this.furtherValues=[]):this.furtherValues.push(e)}updateSmoothedValue(e){this.smoothed=this.smoothed?ii(this.smoothed,e,this.params.emaAlpha):e}}class fc{static getSmoothedValue(e,t,n){return n.type===`TwoEma`?new lc({initial:e,emaAlphaSlow:n.emaAlphaSlow,emaAlphaFast:n.emaAlphaFast,changeThreshold:n.changeThreshold,fastDirection:t,deviationDepth:n.deviationDepth,deviationFactor:n.deviationFactor,label:`throughput`}):new uc({initial:e,emaAlpha:n.emaAlpha,basisTrendChangeCount:n.basisTrendChangeCount,changeThreshold:n.changeThreshold,deviationDepth:n.deviationDepth,deviationFactor:n.deviationFactor,label:`throughput`})}static getLiveBufferSmoothedValue(e,t){return new dc(o({initial:e,label:`liveEdgeDelay`},t))}}var W=require(`@vkontakte/videoplayer-shared`),pc=(e,t)=>{e&&e.playbackRate!==t&&(e.playbackRate=t)},mc=require(`@vkontakte/videoplayer-shared`);class hc{constructor(e,t){i(this,`currentRepresentation$`,new mc.ValueSubject(null)),i(this,`maxRepresentations`,4),i(this,`representationsCursor`,0),i(this,`representations`,[]),i(this,`getCurrentPosition`,void 0),i(this,`currentSegment`,null),this.getCurrentPosition=t.getCurrentPosition,this.processStreams(e)}updateLive(e){this.processStreams(e?.streams.text)}seekLive(e){this.processStreams(e)}maintain(e=this.getCurrentPosition()){if(!mc.isNullable(e))for(let t of this.representations)for(let n of t){let t=n.segmentReference,r=t.segments.length,i=t.segments[0].time.from,a=t.segments[r-1].time.to;if(e<i||e>a)continue;let s=t.segments.find(t=>t.time.from<=e&&t.time.to>=e);!s||this.currentSegment?.time.from===s.time.from&&this.currentSegment.time.to===s.time.to||(this.currentSegment=s,this.currentRepresentation$.next(o(o({},n),{},{label:`Live Text`,language:`ru`,isAuto:!0,url:new URL(s.url,t.baseUrl).toString()})))}}destroy(){this.currentRepresentation$.next(null),this.currentSegment=null,this.representations=[]}processStreams(e){for(let t of e??[]){let e=hc.filterRepresentations(t.representations);if(e){this.representations[this.representationsCursor]=e,this.representationsCursor=(this.representationsCursor+1)%this.maxRepresentations;break}}}static isSupported(e){return!!e?.some(e=>hc.filterRepresentations(e.representations))}static filterRepresentations(e){return e?.filter(e=>e.kind===`text`&&`segmentReference`in e&&Zr(e.segmentReference))}}class gc extends nc{constructor(e){super(e),i(this,`liveTextManager`,void 0),i(this,`liveStreamEndTimestamp`,0),i(this,`liveBuffer`,void 0),i(this,`livePauseWatchdogSubscription`,void 0),i(this,`liveWasInterrupted`,!1),this.liveBuffer=fc.getLiveBufferSmoothedValue(this.tuning.dashCmafLive.lowLatency.maxTargetOffset,o({},e.tuning.dashCmafLive.lowLatency.bufferEstimator))}seek(e){var t=this;return a(function*(){W.assertNonNullable(t.element),t.updateManifestUrlWithTimeOffset(e),t.manifest=yield t.updateManifest(),yield t.forcePositionToRepresentationInitialTime()})()}initBuffer(){super.initBuffer(),this.forcePositionToRepresentationInitialTime()}forcePositionToRepresentationInitialTime(){var e=()=>super.seek,t=this;return a(function*(){let n=t.videoBufferManager?.getRepresentationInitialTime()??0;yield e().call(t,n,!1)})()}tick(){var e=()=>super.tick,t=this;return a(function*(){yield e().call(t);let n=(t.element?.currentTime??0)*1e3;t.liveTextManager?.maintain(n)})()}setSourceInitDuration(){W.assertNonNullable(this.source),this.source.duration=2**53-1}isStallExceeded(e){let{keepSilentStallWatchdogWhenNotActive:t}=this.tuning.dashCmafLive,n=this.liveStreamStatus$.getValue()===`active`;return(!t||n)&&super.isStallExceeded(e)}restoreAfterDeepStall(){var e=this;return a(function*(){let{liveStallReinitInterval:t}=e.tuning.dash,{keepSilentStallWatchdogWhenNotActive:n}=e.tuning.dashCmafLive,r=e.currentStallDuration$.getValue(),i=e.liveStreamStatus$.getValue()===`active`;if(r%t===0){let t=e.normalizeLiveOffset(-1*e.livePositionFromPlayer$.getValue()*1e3);!i&&n?(e.liveWasInterrupted=!0,e.updateManifestUrlWithTimeOffset(t),e.manifest=yield e.updateManifest(),yield e.forcePositionToRepresentationInitialTime()):e.seek(t).catch(t=>{e.error$.next({id:`stallIntervalCallback`,category:W.ErrorCategory.VIDEO_PIPELINE,message:`stallIntervalCallback failed`,thrown:t})})}})()}updateManifest(){var e=()=>super.updateManifest,t=this;return a(function*(){let n=yield e().call(t);if(W.isNullable(n))return null;if(W.isNullable(n.live))return t.error$.next({id:`ManifestParsing`,category:W.ErrorCategory.PARSER,message:`MPD doesnt contain live section for live stream`}),null;t.isLive$.next(!0);let{availabilityStartTime:r,latestSegmentPublishTime:i,streamIsUnpublished:a,streamIsAlive:o}=n.live,s=(n.duration??0)/1e3;t.liveSeekableDuration$.next(-1*s),t.liveDuration$.next((i-r)/1e3),t.liveAvailabilityStartTime$.next(n.live.availabilityStartTime);let c=`active`;if(o||(c=a?`unpublished`:`unexpectedly_down`),t.liveStreamStatus$.next(c),t.bufferManagers.forEach(e=>e.updateManifest(n)),t.liveTextManager?.updateLive(n),o&&t.liveWasInterrupted){t.liveWasInterrupted=!1,t.stopStallWatchdogSubscription();let e=t.normalizeLiveOffset(-1*t.livePositionFromPlayer$.getValue()*1e3);t.seek(e).catch(e=>{t.error$.next({id:`updateManifest`,category:W.ErrorCategory.VIDEO_PIPELINE,message:`seekLive after stream restore failed`,thrown:e})})}return n})()}prepareManifestUrlString(e,t){return ue(e,t,2)}updateManifestUrlWithTimeOffset(e){let t=this.liveStreamStatus$.getValue()===`active`?0:W.now()-this.liveStreamEndTimestamp,n=this.normalizeLiveOffset(e+t);this.isActiveLive$.next(n===0),this.manifestUrlString=ue(this.manifestUrlString,n,2)}createBuffers(e,t,n,r){W.assertNonNullable(this.manifest),super.createBuffers(e,t,n,r),hc.isSupported(this.manifest.streams.text)&&!this.isLowLatency$.getValue()&&(this.liveTextManager=new hc(this.manifest.streams.text,e))}initRepresentationSubscriptions(){W.assertNonNullable(this.element),W.assertNonNullable(this.videoBufferManager),this.isActiveLive$.next(this.isLive$.getValue()),super.initRepresentationSubscriptions();let e=this.videoBufferManager,t=this.bufferManagers;this.initStreamDurationOnPauseSubscription(),this.initLiveChangePlaybackRateSubscriptions(),this.initLiveDurationSubscriptions(e),this.initLiveBufferInfoSubscriptions(e,t),this.initLiveMaintainSubscription(t),W.isNonNullable(this.liveTextManager)&&this.representationSubscription.add(this.liveTextManager.currentRepresentation$.subscribe(this.currentLiveTextRepresentation$))}initStreamDurationOnPauseSubscription(){var e=this;W.assertNonNullable(this.element);let{liveUpdateInterval:t}=this.tuning.dash,n=()=>W.interval(t).subscribe(function(){var n=a(function*(n){let r=de(e.manifestUrlString,2);e.manifestUrlString=ue(e.manifestUrlString,r+t,2),e.liveStreamStatus$.getValue()===`active`&&(e.manifest=yield e.updateManifest())});return function(e){return n.apply(this,arguments)}}());this.representationSubscription.add(W.fromEvent(this.element,`pause`).subscribe(e=>{this.livePauseWatchdogSubscription=n(),this.representationSubscription.add(this.livePauseWatchdogSubscription)})),this.representationSubscription.add(W.fromEvent(this.element,`play`).subscribe(e=>this.livePauseWatchdogSubscription?.unsubscribe()))}initLiveDurationSubscriptions(e){this.representationSubscription.add(this.liveDuration$.pipe(W.filterChanged()).subscribe(e=>this.liveStreamEndTimestamp=W.now())),this.representationSubscription.add(e.currentLowLatencySegmentLength$.subscribe(e=>{if(!this.isActiveLive$.getValue()&&!this.isLowLatency$.getValue()&&!e)return;let t=this.liveSeekableDuration$.getValue()-e/1e3;this.liveSeekableDuration$.next(Math.max(t,-1*this.tuning.dashCmafLive.maxLiveDuration)),this.liveDuration$.next(this.liveDuration$.getValue()+e/1e3)}))}initLiveChangePlaybackRateSubscriptions(){this.representationSubscription.add(W.combine({isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(W.map(({isActiveLive:e,isLowLatency:t})=>e&&t),W.filterChanged(),W.filter(e=>!this.isManualDecreasePlaybackInLive())).subscribe(e=>pc(this.element,1))),this.representationSubscription.add(W.combine({liveBuffer:this.liveBuffer.smoothed$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(W.filter(e=>!this.isManualDecreasePlaybackInLive())).subscribe(({liveBuffer:e,isActiveLive:t,isLowLatency:n})=>{if(!n||!t)return;let r=this.tuning.dashCmafLive.lowLatency.maxTargetOffset,i=this.tuning.dashCmafLive.lowLatency.maxTargetOffsetDeviation,a=this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup,o=e-r,s=1;Math.abs(o)>i&&(s=1+Math.sign(o)*a),pc(this.element,s)}))}initLiveBufferInfoSubscriptions(e,t){this.representationSubscription.add(W.combine({bufferLength:this.bufferLength$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(W.filter(({bufferLength:e,isActiveLive:t,isLowLatency:n})=>t&&n&&!!e),W.map(({bufferLength:e})=>e)).subscribe(this.liveBuffer)),this.representationSubscription.add(this.bufferLength$.subscribe(e=>{let n=0;if(e){let e=(this.element?.currentTime??0)*1e3;n=Math.min(...t.map(t=>t.getLiveSegmentsToLoadState(this.manifest)?.to??e))-e}this.liveLoadBufferLength$.getValue()!==n&&this.liveLoadBufferLength$.next(n)})),this.representationSubscription.add(W.combine({isLive:this.isLive$,rtt:this.throughputEstimator.rtt$,bufferLength:this.bufferLength$,segmentServerLatency:e.currentLiveSegmentServerLatency$}).pipe(W.filter(({isLive:e})=>e),W.filterChanged((e,t)=>t.bufferLength<e.bufferLength),W.map(({rtt:e,bufferLength:t,segmentServerLatency:n})=>{let r=de(this.manifestUrlString,2);return(e/2+t+n+r)/1e3})).subscribe(this.liveLatency$))}initLiveMaintainSubscription(e){var t=this;let n=0;this.representationSubscription.add(W.combine({liveLoadBufferLength:this.liveLoadBufferLength$,bufferLength:this.bufferLength$}).pipe(W.throttle(this.tuning.dash.liveUpdateInterval)).subscribe(function(){var r=a(function*({liveLoadBufferLength:r,bufferLength:i}){W.assertNonNullable(t.element);let a=t.element.playbackRate,o=de(t.manifestUrlString,2),s=Math.abs(t.livePositionFromPlayer$.getValue())*1e3,c=Math.min(s,t.tuning.dashCmafLive.normalizedTargetMinBufferSize*a),l=t.tuning.dashCmafLive.normalizedActualBufferOffset*a,u=t.tuning.dashCmafLive.normalizedLiveMinBufferSize*a,d=isFinite(r)?r:i,f=t.isActiveLive$.getValue()&&t.isLowLatency$.getValue(),p=s<=t.tuning.live.activeLiveDelay;t.isActiveLive$.next(p);let m=`none`;if(f?m=`active_low_latency`:t.isLowLatency$.getValue()&&p?(e.forEach(e=>e.proceedLowLatencyLive()),m=`active_low_latency`):o!==0&&d<c?m=`live_forward_buffering`:d<c+u&&(m=`live_with_target_offset`),isFinite(r)&&(n=r>n?r:n),m===`live_forward_buffering`||m===`live_with_target_offset`){let e=n-(c+l),i=t.normalizeLiveOffset(Math.trunc(o+e/a)),s=Math.abs(i-o),u=0;!r||s<=t.tuning.dashCmafLive.offsetCalculationError?u=o:i>0&&s>t.tuning.dashCmafLive.offsetCalculationError&&(u=i),t.manifestUrlString=ue(t.manifestUrlString,u,2)}(m===`live_with_target_offset`||m===`live_forward_buffering`)&&(n=0,t.manifest=yield t.updateManifest())});return function(e){return r.apply(this,arguments)}}(),e=>{this.error$.next({id:`updateLive`,category:W.ErrorCategory.VIDEO_PIPELINE,thrown:e,message:`Failed to update live with subscription`})}))}isManualDecreasePlaybackInLive(){if(!this.element||!this.isLive$.getValue())return!1;let e=1-this.element.playbackRate;return Number(e.toFixed(2))>Number(this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup.toFixed(2))}normalizeLiveOffset(e){return Math.trunc(e/1e3)*1e3}}class _c extends ka{constructor(e){super(e),this.textTracksManager?.destroy()}getPlayer(){return new gc({throughputEstimator:this.params.dependencies.throughputEstimator,tuning:this.params.tuning,compatibilityMode:this.params.source.compatibilityMode,tracer:this.tracer,forceVideoCodec:this.params.forceVideoCodec})}subscribe(){super.subscribe();let e=!1,t=-1,{output:n,observableVideo:r,desiredState:i,connect:a}=this.getProviderSubscriptionInfo();this.params.output.position$.next(0),this.params.output.isLive$.next(!0),this.params.output.canPlayLiveTailBuffer$.next(!0);let o=new oc.ValueSubject(1);a(r.playbackRateState$,o),a(r.timeUpdate$,n.liveBufferTime$),a(this.player.liveSeekableDuration$,n.duration$),a(this.player.liveLatency$,n.liveLatency$),this.params.tuning.dashCmafLive.catchupLiveForMutedInactiveTab&&this.subscription.add(n.elementVisible$.pipe(oc.filterChanged()).subscribe(t=>{let r=n.position$.getValue(),i=n.volume$.getValue(),a=!i.volume||i.muted;!t&&!r&&a?e=!0:t&&e&&(this.seek(0),e=!1)})),this.subscription.add(this.params.output.position$.subscribe(this.player.livePositionFromPlayer$)).add(i.isLowLatency.stateChangeEnded$.pipe(oc.map(e=>e.to)).subscribe(this.player.isLowLatency$)).add(oc.combine({liveBufferTime:n.liveBufferTime$,liveAvailabilityStartTime:this.player.liveAvailabilityStartTime$}).pipe(oc.map(({liveBufferTime:e,liveAvailabilityStartTime:t})=>e&&t?e+t:void 0)).subscribe(n.liveTime$)).add(oc.combine({liveDuration:this.player.liveDuration$,liveStreamStatus:this.player.liveStreamStatus$,playbackRate:oc.merge(r.playbackRateState$,new oc.ValueSubject(1))}).pipe(oc.filter(({liveStreamStatus:e,liveDuration:t})=>e===`active`&&!!t)).subscribe(({liveDuration:e,playbackRate:r})=>{let i=n.liveBufferTime$.getValue(),a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;a||r<1-o||this.allocation.target.paused||oc.isNullable(i)||(t=e-i)})).add(oc.combine({time:n.liveBufferTime$,liveDuration:this.player.liveDuration$,playbackRate:oc.merge(r.playbackRateState$,new oc.ValueSubject(1))}).pipe(oc.filterChanged((e,t)=>this.player.liveStreamStatus$.getValue()===`active`?e.liveDuration===t.liveDuration:e.time===t.time)).subscribe(({time:e,liveDuration:r,playbackRate:i})=>{let a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;if(!a&&!this.allocation.target.paused&&i>=1-o||oc.isNullable(e)||oc.isNullable(r))return;let s=-1*(r-e-t);n.position$.next(Math.min(s,0))})).add(this.player.currentLiveTextRepresentation$.subscribe(e=>{if(e){let t=Jr(e);this.params.output.availableTextTracks$.next([t])}})),this.params.tuning.dashCmafLive.externalStopControl||this.subscription.add(this.player.liveStreamStatus$.pipe(oc.filter(e=>oc.isNonNullable(e))).subscribe(e=>n.isLiveEnded$.next(e===`unpublished`&&n.position$.getValue()===0)))}seek(e){this.params.output.willSeekEvent$.next();let t=-e,n=Math.trunc(t/1e3<=Math.abs(this.params.output.duration$.getValue())?t:0);this.player.seek(n).then(()=>{this.params.output.position$.next(e/1e3)})}}var G=require(`@vkontakte/videoplayer-shared`),vc=require(`@vkontakte/videoplayer-shared`),yc=require(`@vkontakte/videoplayer-shared`),bc=(e,t,n=0)=>{for(let r=0;r<e.length;r++)if(e.start(r)*1e3-n<=t&&e.end(r)*1e3+n>t)return!0;return!1},K=require(`@vkontakte/videoplayer-shared`),xc=require(`@vkontakte/videoplayer-shared`),Sc=require(`@vkontakte/videoplayer-shared`),Cc=require(`@vkontakte/videoplayer-shared`),wc=require(`@vkontakte/videoplayer-shared`),Tc=require(`@vkontakte/videoplayer-shared`),Ec=require(`@vkontakte/videoplayer-shared`),Dc=require(`@vkontakte/videoplayer-shared`),Oc=require(`@vkontakte/videoplayer-shared`),kc=18,Ac=!1;try{Ac=j.browser.isSafari&&!!j.browser.safariVersion&&j.browser.safariVersion<=kc}catch(e){console.error(e)}class jc{constructor(e,t=!1){i(this,`bufferFull$`,new Oc.Subject),i(this,`error$`,new Oc.Subject),i(this,`buffer`,void 0),i(this,`queue`,[]),i(this,`currentTask`,null),i(this,`destroyed`,!1),i(this,`abortRequested`,!1),i(this,`isAbortFixEnabled`,!1),i(this,`completeTask`,()=>{try{if(this.currentTask){let e=this.currentTask.signal?.aborted;this.currentTask.callback(!e),this.currentTask=null,this.isAbortFixEnabled&&this.queue.shift()}this.queue.length&&this.pull()}catch(e){this.error$.next({id:`BufferTaskQueueUnknown`,category:Oc.ErrorCategory.VIDEO_PIPELINE,message:`Buffer appending or removal failed`,thrown:e})}}),this.buffer=e,this.isAbortFixEnabled=t,this.buffer.addEventListener(`updateend`,this.completeTask)}append(e,t){var n=this;return a(function*(){return t&&t.aborted?!1:new Promise(r=>{let i={operation:`append`,data:e,signal:t,callback:r};n.queue.push(i),n.pull()})})()}remove(e,t,n){var r=this;return a(function*(){return n&&n.aborted?!1:new Promise(i=>{let a={operation:`remove`,from:e,to:t,signal:n,callback:i};r.queue.unshift(a),r.pull()})})()}abort(e){var t=this;return a(function*(){return new Promise(n=>{let r,i=e=>{t.abortRequested=!1,n(e)};r=Ac&&e?{operation:`safariAbort`,init:e,callback:i}:{operation:`abort`,callback:i};for(let{callback:e}of t.queue)e(!1);t.abortRequested=!0,r&&(t.queue=[r]),t.pull()})})()}destroy(){this.destroyed=!0,this.buffer.removeEventListener(`updateend`,this.completeTask),this.queue=[],this.currentTask=null;try{this.buffer.abort()}catch(e){if(!(e instanceof DOMException&&e.name===`InvalidStateError`))throw e}}pull(){if((this.buffer.updating||this.currentTask||this.destroyed)&&!this.abortRequested)return;let e=this.isAbortFixEnabled?this.queue[0]:this.queue.shift();if(!e)return;if(e.signal?.aborted){e.callback(!1),this.pull();return}this.currentTask=e;let{operation:t}=this.currentTask;try{this.execute(this.currentTask)}catch(e){e instanceof DOMException&&e.name===`QuotaExceededError`&&t===`append`?this.bufferFull$.next(this.currentTask.data.byteLength):e instanceof DOMException&&e.name===`InvalidStateError`||this.error$.next({id:`BufferTaskQueue:${t}`,category:Oc.ErrorCategory.VIDEO_PIPELINE,message:`Buffer operation failed`,thrown:e}),this.currentTask.callback(!1),this.currentTask=null}this.currentTask&&this.currentTask.operation===`abort`&&this.completeTask()}execute(e){let{operation:t}=e;switch(t){case`append`:this.buffer.appendBuffer(e.data);break;case`remove`:this.buffer.remove(e.from/1e3,e.to/1e3);break;case`abort`:this.buffer.abort();break;case`safariAbort`:this.buffer.abort(),this.buffer.appendBuffer(e.init);break;default:Oc.assertNever(t)}}}var Mc=jc,Nc=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t*1e3},q=require(`@vkontakte/videoplayer-shared`);class Pc{constructor(e,t,n,{fetcher:r,tuning:a,getCurrentPosition:o,isActiveLowLatency:l,compatibilityMode:u=!1,manifest:d}){i(this,`currentLiveSegmentServerLatency$`,new q.ValueSubject(0)),i(this,`currentLowLatencySegmentLength$`,new q.ValueSubject(0)),i(this,`currentSegmentLength$`,new q.ValueSubject(0)),i(this,`onLastSegment$`,new q.ValueSubject(!1)),i(this,`fullyBuffered$`,new q.ValueSubject(!1)),i(this,`playingRepresentation$`,new q.ValueSubject(void 0)),i(this,`playingRepresentationInit$`,new q.ValueSubject(void 0)),i(this,`error$`,new q.Subject),i(this,`gaps`,[]),i(this,`updateEnd$`,new q.ValueSubject(void 0)),i(this,`subscription`,new q.Subscription),i(this,`kind`,void 0),i(this,`initData`,void 0),i(this,`parsedInitData`,void 0),i(this,`representations`,void 0),i(this,`segments`,void 0),i(this,`allInitsLoaded`,!1),i(this,`activeSegments`,new Set),i(this,`forwardBufferRepresentations`,new Map),i(this,`mediaSource`,void 0),i(this,`playingRepresentationId`,void 0),i(this,`downloadingRepresentationId`,void 0),i(this,`switchingToRepresentationId`,void 0),i(this,`sourceBuffer`,void 0),i(this,`downloadAbortController`,new xc.AbortControllerPolyfilled),i(this,`switchAbortController`,new xc.AbortControllerPolyfilled),i(this,`destroyAbortController`,new xc.AbortControllerPolyfilled),i(this,`useSmartRepresentationSwitch`,!1),i(this,`getCurrentPosition`,void 0),i(this,`isActiveLowLatency`,void 0),i(this,`tuning`,void 0),i(this,`forwardBufferTarget`,void 0),i(this,`fetcher`,void 0),i(this,`bufferLimit`,1/0),i(this,`sourceBufferTaskQueue`,void 0),i(this,`gapDetectionIdleCallback`,void 0),i(this,`initLoadIdleCallback`,void 0),i(this,`failedDownloads`,0),i(this,`baseUrls`,[]),i(this,`baseUrlsIndex`,0),i(this,`compatibilityMode`,void 0),i(this,`preloadOnly`,void 0),i(this,`isLive`,!1),i(this,`liveUpdateSegmentIndex`,0),i(this,`liveInitialAdditionalOffset`,0),i(this,`isSeekingLive`,!1),i(this,`index`,0),i(this,`lastDataObtainedTimestampMs`,0),i(this,`loadByteRangeSegmentsTimeoutId`,0),i(this,`startWith`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e){let t=this.representations.get(e);q.assertNonNullable(t,`Cannot find representation ${e}`),this.playingRepresentationId=e,this.downloadingRepresentationId=e,this.sourceBuffer=this.mediaSource.addSourceBuffer(`${t.mime}; codecs="${t.codecs}"`),this.sourceBufferTaskQueue=new Mc(this.sourceBuffer,this.tuning.dash.useAbortMSEFix),this.subscription.add(q.fromEvent(this.sourceBuffer,`updateend`).subscribe(this.updateEnd$)),this.subscription.add(q.fromEvent(this.sourceBuffer,`updateend`).subscribe(()=>{this.checkEjectedSegments(),this.maintain()},e=>{let t,n=this.mediaSource.readyState;n!==`open`&&(t={id:`SegmentEjection_source_${n}`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when trying to clear segments ejected by browser`,thrown:e}),t??={id:`SegmentEjection`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when trying to clear segments ejected by browser`,thrown:e},this.error$.next(t)})),this.subscription.add(q.fromEvent(this.sourceBuffer,`error`).subscribe(()=>this.error$.next({id:`SourceBuffer`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`SourceBuffer Error event fired`}))),this.subscription.add(this.sourceBufferTaskQueue.bufferFull$.subscribe(e=>{let t=this.getCurrentPosition();if(!this.sourceBuffer||!t||!R(this.mediaSource,this.sourceBuffer))return;this.bufferLimit=Math.min(this.bufferLimit,Nc(this.sourceBuffer.buffered)*.8);let n=this.getForwardBufferDuration(t),r=Math.min(this.forwardBufferTarget,this.bufferLimit)*this.tuning.dash.minSafeBufferThreshold;this.pruneBuffer(t,e*2,n<r).catch(e=>{this.handleAsyncError(e,`pruneBuffer`)})})),this.subscription.add(this.sourceBufferTaskQueue.error$.subscribe(e=>this.error$.next(e))),yield this.loadInit(t,`high`,!0);let n=this.initData.get(t.id),r=this.segments.get(t.id),i=this.parsedInitData.get(t.id);q.assertNonNullable(n,`No init buffer for starting representation`),q.assertNonNullable(r,`No segments for starting representation`),n instanceof ArrayBuffer&&(this.searchGaps(r,t),yield this.sourceBufferTaskQueue.append(n,this.destroyAbortController.signal),this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(i))});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`switchTo`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e,t=!1){if(!R(this.mediaSource,this.sourceBuffer)||e===this.downloadingRepresentationId||e===this.switchingToRepresentationId)return;this.switchingToRepresentationId=e;let n=this.representations.get(e);q.assertNonNullable(n,`No such representation ${e}`);let r=this.segments.get(e),i=this.initData.get(e);if(q.isNullable(i)||q.isNullable(r)?yield this.loadInit(n,`high`,!1):i instanceof Promise&&(yield i),r=this.segments.get(e),q.assertNonNullable(r,`No segments for starting representation`),i=this.initData.get(e),!(!i||!(i instanceof ArrayBuffer)||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer))){if(yield this.abort(),yield this.sourceBufferTaskQueue.append(i,this.downloadAbortController.signal),t)this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e,yield this.dropBuffer();else{let t=this.getCurrentPosition();q.isNonNullable(t)&&!this.isLive&&(this.bufferLimit=1/0,yield s(this.pruneBuffer(t,1/0,!0))),this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e}this.maintain()}});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`switchToOld`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e,t=!1){if(!R(this.mediaSource,this.sourceBuffer)||e===this.downloadingRepresentationId||e===this.switchingToRepresentationId)return;this.switchingToRepresentationId=e;let n=this.representations.get(e);q.assertNonNullable(n,`No such representation ${e}`);let r=this.segments.get(e),i=this.initData.get(e);if(q.isNullable(i)||q.isNullable(r)?yield this.loadInit(n,`high`,!1):i instanceof Promise&&(yield i),r=this.segments.get(e),q.assertNonNullable(r,`No segments for starting representation`),i=this.initData.get(e),!(!i||!(i instanceof ArrayBuffer)||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)))if(yield this.abort(),yield this.sourceBufferTaskQueue.append(i,this.downloadAbortController.signal),t)this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e,yield this.dropBuffer(),this.maintain();else{let t=this.getCurrentPosition();q.isNonNullable(t)&&(this.isLive||(this.bufferLimit=1/0,yield s(this.pruneBuffer(t,1/0,!0))),this.maintain(t)),this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e}});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`seekLive`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e){let t=wc.arrayFlatMap(e,e=>e.representations);if(!this.downloadingRepresentationId||!t.length)return;this.isSeekingLive=!0;for(let e of this.representations.keys()){let n=t.find(t=>t.id===e);n&&this.representations.set(e,n);let r=this.representations.get(e);if(!r||!Os(r.segmentReference)){this.isSeekingLive=!1;return}let i=this.getActualLiveStartingSegments(r.segmentReference);this.segments.set(r.id,i)}let n=this.switchingToRepresentationId??this.downloadingRepresentationId,r=this.representations.get(n);q.assertNonNullable(r,`Representation not found by id ${n}`);let i=this.segments.get(n);q.assertNonNullable(i,`No segments for starting representation`);let a=this.initData.get(n);if(q.assertNonNullable(a,`No init buffer for starting representation`),!(a instanceof ArrayBuffer)){this.isSeekingLive=!1;return}let o=this.getDebugBufferState();this.liveUpdateSegmentIndex=0,yield this.abort(),o&&(yield this.sourceBufferTaskQueue.remove(o.from*1e3,o.to*1e3,this.destroyAbortController.signal)),this.searchGaps(i,r),yield this.sourceBufferTaskQueue.append(a,this.destroyAbortController.signal),this.isSeekingLive=!1});return function(t){return e.apply(this,arguments)}}().bind(this))),this.fetcher=r,this.tuning=a,this.compatibilityMode=u,this.forwardBufferTarget=a.dash.forwardBufferTargetAuto,this.getCurrentPosition=o,this.isActiveLowLatency=l,this.isLive=!!d?.live,this.baseUrls=d?.baseUrls??[],this.initData=new Map(n.map(e=>[e.id,null])),this.segments=new Map,this.parsedInitData=new Map,this.representations=new Map(n.map(e=>[e.id,e])),this.kind=e,this.mediaSource=t,this.sourceBuffer=null}switchToWithPreviousAbort(e,t=!1){if(!R(this.mediaSource,this.sourceBuffer)||e===this.downloadingRepresentationId||e===this.switchingToRepresentationId)return Promise.resolve();this.switchAbortController.abort(),this.switchAbortController=new xc.AbortControllerPolyfilled;let n=this.switchAbortController.signal;return n.addEventListener(`abort`,()=>{this.switchingToRepresentationId===e&&(this.switchingToRepresentationId=void 0)},{once:!0}),q.abortable(n,function(){var e=c(function*(e,t=!1){this.switchingToRepresentationId=e;let n=this.representations.get(e);q.assertNonNullable(n,`No such representation ${e}`);let r=this.segments.get(e),i=this.initData.get(e);if(q.isNullable(i)||q.isNullable(r)?yield this.loadInit(n,`high`,!1):i instanceof Promise&&(yield i),r=this.segments.get(e),q.assertNonNullable(r,`No segments for starting representation`),i=this.initData.get(e),!(i instanceof ArrayBuffer)||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)){this.switchingToRepresentationId===e&&(this.switchingToRepresentationId=void 0);return}if(yield this.abort(),yield this.sourceBufferTaskQueue.append(i,this.downloadAbortController.signal),t)this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e,yield this.dropBuffer();else{let t=this.getCurrentPosition();q.isNonNullable(t)&&!this.isLive&&(this.bufferLimit=1/0,yield this.pruneBuffer(t,1/0,!0)),this.downloadingRepresentationId=e,this.switchingToRepresentationId=void 0}this.maintain()});return function(t){return e.apply(this,arguments)}}().bind(this))(e,t)}warmUpMediaSource(){!q.isNullable(this.sourceBuffer)&&!this.sourceBuffer.updating&&(this.sourceBuffer.mode=`segments`)}abort(){var e=this;return a(function*(){for(let t of e.activeSegments)e.abortSegment(t.segment);return e.activeSegments.clear(),e.downloadAbortController.abort(),e.downloadAbortController=new xc.AbortControllerPolyfilled,e.abortBuffer()})()}maintain(e=this.getCurrentPosition()){if(q.isNullable(e)||q.isNullable(this.downloadingRepresentationId)||q.isNullable(this.playingRepresentationId)||q.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||q.isNonNullable(this.switchingToRepresentationId)||this.isSeekingLive)return;let t=this.representations.get(this.downloadingRepresentationId),n=this.representations.get(this.playingRepresentationId),r=this.segments.get(this.downloadingRepresentationId),i=this.segments.get(this.playingRepresentationId);if(q.assertNonNullable(t,`No such representation ${this.downloadingRepresentationId}`),q.assertNonNullable(n,`No such representation ${this.playingRepresentationId}`),q.isNullable(r)||q.isNullable(i))return;let a=r.find(t=>e>=t.time.from&&e<t.time.to);q.isNonNullable(a)&&isFinite(a.time.from)&&isFinite(a.time.to)&&this.currentSegmentLength$.next(a?.time.to-a.time.from);let o=e;if(this.playingRepresentationId!==this.downloadingRepresentationId){let r=this.getForwardBufferDuration(e),i=xs(n),s=xs(t),c=this.useSmartRepresentationSwitch&&this.tuning.dash.useNewRepresentationSwitch&&this.tuning.dash.useSmartRepresentationSwitch&&q.isNonNullable(i)&&q.isNonNullable(s)&&q.isHigher(i.quality,s.quality),l=this.useSmartRepresentationSwitch&&this.tuning.dash.useNewRepresentationSwitch&&this.tuning.dash.useDelayedRepresentationSwitch;if(c||l?o+=Math.min(r,this.tuning.dash.representationSwitchForwardBufferGap):a&&a.time.to-e<this.tuning.dash.maxSegmentDurationLeftToSelectNextSegment&&r>=a.time.to-e+100&&(o=a?a.time.to+100:-1/0),this.tuning.dash.useNewRepresentationSwitch){let t=[...this.segments.entries()].map(([t,n])=>({representationId:t,status:n.find(t=>e>=t.time.from&&e<t.time.to)?.status})).find(e=>e.status===`fed`)?.representationId;t&&(this.playingRepresentationId=t,this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(this.parsedInitData.get(this.playingRepresentationId)))}}if(isFinite(this.bufferLimit)&&Nc(this.sourceBuffer.buffered)>=this.bufferLimit){let t=this.getForwardBufferDuration(e),n=Math.min(this.forwardBufferTarget,this.bufferLimit)*this.tuning.dash.minSafeBufferThreshold;this.pruneBuffer(e,1/0,t<n).catch(e=>{this.handleAsyncError(e,`pruneBuffer`)});return}let s=[];if(!this.activeSegments.size&&(s=this.selectForwardBufferSegments(r,t.segmentReference.type,o),s.length)){let e=`auto`;if(this.tuning.dash.useFetchPriorityHints&&a)if(Sc.arrayIncludes(s,a))e=`high`;else{let t=Cc.arrayAt(s,0);t&&t.time.from-a.time.to>=this.forwardBufferTarget/2&&(e=`low`)}this.loadSegments(s,t,e).catch(e=>{this.handleAsyncError(e,`loadSegments`)})}(!this.preloadOnly&&!this.allInitsLoaded&&a&&a.status===`fed`&&!s.length&&this.getForwardBufferDuration(e)>3e3||this.isActiveLowLatency())&&this.loadNextInit();let c=Cc.arrayAt(r,-1);!this.isLive&&c&&(this.fullyBuffered$.next(c.time.to-e-this.getForwardBufferDuration(e)<100),this.onLastSegment$.next(e-c.time.from>0))}get lastDataObtainedTimestamp(){return this.lastDataObtainedTimestampMs}searchGaps(e,t){this.gaps=[];let n=0,r=this.isLive?this.liveInitialAdditionalOffset:0;for(let i of e)Math.trunc(i.time.from-n)>0&&this.gaps.push({representation:t.id,from:n,to:i.time.from+r,persistent:!0}),n=i.time.to;q.isNonNullable(t.duration)&&t.duration-n>0&&!this.isLive&&this.gaps.push({representation:t.id,from:n,to:t.duration,persistent:!0})}getActualLiveStartingSegments(e){let t=e.segments,n=this.isActiveLowLatency()?this.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.tuning.dashCmafLive.maxActiveLiveOffset,r=[],i=0,a=t.length-1;do r.unshift(t[a]),i+=t[a].time.to-t[a].time.from,a--;while(i<n&&a>=0);return this.liveInitialAdditionalOffset=i-n,this.isActiveLowLatency()?[r[0]]:r}getLiveSegmentsToLoadState(e){let t=e?.streams[this.kind];if(!t)return;let n=wc.arrayFlatMap(t,e=>e.representations).find(e=>e.id===this.downloadingRepresentationId);if(!n)return;let r=this.segments.get(n.id);if(r?.length)return{from:r[0].time.from,to:r[r.length-1].time.to}}updateLive(e){if(!e||[...this.segments.values()].every(e=>!e.length))return;let t=wc.arrayFlatMap(e.streams[this.kind],e=>e.representations);for(let e of t){if(!e||!Os(e.segmentReference))return;let t=e.segmentReference.segments.map(e=>o(o({},e),{},{status:`none`,size:void 0})),n=this.segments.get(e.id)??[],r=n.at(-1)?.time.to??0,i=t?.findIndex(e=>r>=e.time.from+100&&r<=e.time.to+100);if(i===-1){this.liveUpdateSegmentIndex=0;let t=this.getActualLiveStartingSegments(e.segmentReference);this.segments.set(e.id,t)}else{let r=t.slice(i+1);this.segments.set(e.id,[...n,...r])}}}proceedLowLatencyLive(){let e=this.downloadingRepresentationId;q.assertNonNullable(e);let t=this.segments.get(e);if(t?.length){let e=t[t.length-1];this.updateLowLatencyLiveIfNeeded(e)}}calculateDurationFromSegments(){if(!this.playingRepresentationId)return 0;let e=this.segments.get(this.playingRepresentationId);return(e?Cc.arrayAt(e,-1)?.time.to:0)||0}setSmartRepresentationSwitch(e){this.useSmartRepresentationSwitch=e}updateLowLatencyLiveIfNeeded(e){let t=0;for(let n of this.representations.values()){let r=n.segmentReference;if(!Os(r))return;let i=this.segments.get(n.id)??[],a=i.find(t=>Math.floor(t.time.from)===Math.floor(e.time.from));if(a&&!isFinite(a.time.to)&&(a.time.to=e.time.to,t=a.time.to-a.time.from),!i.find(t=>Math.floor(t.time.from)===Math.floor(e.time.to))&&this.isActiveLowLatency()){let t=Math.round(e.time.to*r.timescale/1e3).toString(10),n=bo(r.segmentTemplateUrl,{segmentTime:t});i.push({status:`none`,time:{from:e.time.to,to:1/0},url:n})}}this.currentLowLatencySegmentLength$.next(t)}findSegmentStartTime(e){let t=this.switchingToRepresentationId??this.downloadingRepresentationId??this.playingRepresentationId;if(!t)return;let n=this.segments.get(t);return n?n.find(t=>t.time.from<=e&&t.time.to>=e)?.time.from??void 0:void 0}setTarget(e){this.forwardBufferTarget=e}setPreloadOnly(e){this.preloadOnly=e}destroy(){if(this.initData.clear(),this.segments.clear(),this.parsedInitData.clear(),this.representations.clear(),this.sourceBufferTaskQueue?.destroy(),this.gapDetectionIdleCallback&&Tc.cancelIdleCallbackPolyfilled&&Tc.cancelIdleCallbackPolyfilled(this.gapDetectionIdleCallback),this.initLoadIdleCallback&&Tc.cancelIdleCallbackPolyfilled&&Tc.cancelIdleCallbackPolyfilled(this.initLoadIdleCallback),this.subscription.unsubscribe(),this.sourceBuffer)try{this.mediaSource.removeSourceBuffer(this.sourceBuffer)}catch(e){if(!(e instanceof DOMException&&e.name===`NotFoundError`))throw e}this.sourceBuffer=null,this.downloadAbortController.abort(),this.switchAbortController.abort(),this.destroyAbortController.abort(),window.clearTimeout(this.loadByteRangeSegmentsTimeoutId)}selectForwardBufferSegments(e,t,n){return this.isLive?this.selectForwardBufferSegmentsLive(e,n):this.selectForwardBufferSegmentsRecord(e,t,n)}selectForwardBufferSegmentsLive(e,t){let n=e.findIndex(e=>t>=e.time.from&&t<e.time.to);return this.playingRepresentationId!==this.downloadingRepresentationId&&(this.liveUpdateSegmentIndex=n),this.liveUpdateSegmentIndex<e.length?e.slice(this.liveUpdateSegmentIndex++):[]}selectForwardBufferSegmentsRecord(e,t,n){let r=this.getForwardBufferDuration(n),i=e.findIndex(({status:e,time:{from:t,to:i}},a)=>{let o=t>n||t<=n&&i>=n||a===0&&n===0,s=Math.min(this.forwardBufferTarget,this.bufferLimit),c=this.preloadOnly&&t<=n+s||r<s&&i-t>=s||i<=n+s;return(e===`none`||e===`partially_ejected`&&o&&c&&this.sourceBuffer&&R(this.mediaSource,this.sourceBuffer)&&!(bc(this.sourceBuffer.buffered,t)&&bc(this.sourceBuffer.buffered,i)))&&o&&c});if(i===-1)return[];if(t!==`byteRange`)return e.slice(i,i+1);let a=e,o=0,s=0,c=[],l=this.preloadOnly?0:this.tuning.dash.segmentRequestSize,u=this.preloadOnly?this.forwardBufferTarget:0;for(let e=i;e<a.length&&(o<=l||s<=u);e++){let t=a[e];if(o+=t.byte.to+1-t.byte.from,s+=t.time.to+1-t.time.from,t.status===`none`||t.status===`partially_ejected`)c.push(t);else break}return c}loadSegments(e,t,n=`auto`){var r=this;return a(function*(){Os(t.segmentReference)?yield r.loadTemplateSegment(e[0],t,n):yield r.loadByteRangeSegments(e,t,n)})()}loadTemplateSegment(e,t,n=`auto`){var r=this;return a(function*(){e.status=`downloading`;let i={segment:e,loadedBytes:0,feedingBytes:0,fedBytes:0,representationId:t.id,startedAtMs:void 0};r.activeSegments.add(i);let{range:a,url:o,signal:s,onProgress:l,onProgressTasks:u}=r.prepareTemplateFetchSegmentParams(e,t);r.failedDownloads&&s&&(yield q.abortable(s,c(function*(){let e=q.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>setTimeout(t,e))}).bind(r))(),s.aborted&&r.abortActiveSegments([e])),i.startedAtMs=q.getWindow().performance.now();try{let e=yield r.fetcher.fetch(o,{range:a,signal:s,onProgress:l,priority:n,isLowLatency:r.isActiveLowLatency(),bufferOptimisation:r.tuning.dash.fetcherBufferOptimisation});if(r.lastDataObtainedTimestampMs=q.now(),!e)return;let c=new DataView(e),d=vs(t.mime);if(!isFinite(i.segment.time.to)){let e=t.segmentReference.timescale;i.segment.time.to=d.getChunkEndTime(c,e)}l&&i.feedingBytes&&u?yield Promise.all(u):yield r.sourceBufferTaskQueue.append(c,s);let{serverDataReceivedTimestamp:f,serverDataPreparedTime:p}=d.getServerLatencyTimestamps(c);f&&p&&r.currentLiveSegmentServerLatency$.next(p-f),i.segment.status=`downloaded`,r.onSegmentFullyAppended(i,t.id),r.failedDownloads=0}catch(t){r.abortActiveSegments([e]),q.isAbortError(t)||(r.failedDownloads++,r.updateRepresentationsBaseUrlIfNeeded())}})()}updateRepresentationsBaseUrlIfNeeded(){if(!this.tuning.dash.enableBaseUrlSupport||!this.baseUrls.length||this.failedDownloads<=this.tuning.dash.maxSegmentRetryCount)return;this.baseUrlsIndex=(this.baseUrlsIndex+1)%this.baseUrls.length;let e=this.baseUrls[this.baseUrlsIndex];for(let t of this.representations.values())Os(t.segmentReference)?t.segmentReference.baseUrl=e:t.segmentReference.url=e}loadByteRangeSegments(e,t,n=`auto`){var r=this;return a(function*(){if(!e.length)return;let i=[];for(let n of e){n.status=`downloading`;let e={segment:n,loadedBytes:0,feedingBytes:0,fedBytes:0,representationId:t.id,startedAtMs:void 0};r.activeSegments.add(e),i.push(e)}let{range:a,url:o,signal:s,onProgress:l}=r.prepareByteRangeFetchSegmentParams(e,t);r.failedDownloads&&s&&(yield q.abortable(s,c(function*(){let e=q.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>{this.loadByteRangeSegmentsTimeoutId=window.setTimeout(t,e),q.fromEvent(window,`online`).pipe(q.once()).subscribe(()=>{t(),window.clearTimeout(this.loadByteRangeSegmentsTimeoutId)})})}).bind(r))(),s.aborted&&r.abortActiveSegments(e));let u=q.getWindow().performance.now();for(let e of i)e.startedAtMs=u;try{yield r.fetcher.fetch(o,{range:a,onProgress:l,signal:s,priority:n,bufferOptimisation:r.tuning.dash.fetcherBufferOptimisation,urlCacheMechanismEnabled:!Os(t.segmentReference)}),r.lastDataObtainedTimestampMs=q.now(),r.failedDownloads=0}catch(t){r.abortActiveSegments(e),q.isAbortError(t)||(r.failedDownloads++,r.updateRepresentationsBaseUrlIfNeeded())}})()}prepareByteRangeFetchSegmentParams(e,t){var n=this;if(Os(t.segmentReference))throw Error(`Representation is not byte range type`);let r=t.segmentReference.url,i={from:Cc.arrayAt(e,0).byte.from,to:Cc.arrayAt(e,-1).byte.to},{signal:o}=this.downloadAbortController;return{url:r,range:i,signal:o,onProgress:function(){var e=a(function*(e,r){if(!o.aborted)try{n.lastDataObtainedTimestampMs=q.now(),yield n.onSomeByteRangesDataLoaded({dataView:e,loaded:r,signal:o,onSegmentAppendFailed:()=>n.abort(),globalFrom:i?i.from:0,representationId:t.id})}catch(e){n.error$.next({id:`SegmentFeeding`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}});return function(t,n){return e.apply(this,arguments)}}()}}prepareTemplateFetchSegmentParams(e,t){if(!Os(t.segmentReference))throw Error(`Representation is not template type`);let n=new URL(e.url,t.segmentReference.baseUrl);this.isActiveLowLatency()&&n.searchParams.set(`low-latency`,`yes`);let r=n.toString(),{signal:i}=this.downloadAbortController,a=[];return{url:r,signal:i,onProgress:this.isActiveLowLatency()||this.tuning.dash.enableSubSegmentBufferFeeding&&this.liveUpdateSegmentIndex<3?(e,n)=>{if(!i.aborted)try{this.lastDataObtainedTimestampMs=q.now();let r=this.onSomeTemplateDataLoaded({dataView:e,loaded:n,signal:i,onSegmentAppendFailed:()=>this.abort(),representationId:t.id});a.push(r)}catch(e){this.error$.next({id:`SegmentFeeding`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}}:void 0,onProgressTasks:a}}abortActiveSegments(e){for(let t of this.activeSegments)Sc.arrayIncludes(e,t.segment)&&this.abortSegment(t.segment)}onSomeTemplateDataLoaded({dataView:e,representationId:t,loaded:n,onSegmentAppendFailed:r,signal:i}){var o=this;return a(function*(){if(!o.activeSegments.size||!R(o.mediaSource,o.sourceBuffer))return;let a=o.representations.get(t);if(a)for(let s of o.activeSegments){let{segment:c}=s;if(s.representationId===t){if(i.aborted){r();continue}if(s.loadedBytes=n,s.loadedBytes>s.feedingBytes){let t=new DataView(e.buffer,e.byteOffset+s.feedingBytes,s.loadedBytes-s.feedingBytes),n=vs(a.mime).parseFeedableSegmentChunk(t,o.isLive);n?.byteLength&&(c.status=`partially_fed`,s.feedingBytes+=n.byteLength,yield o.sourceBufferTaskQueue.append(n),s.fedBytes+=n.byteLength)}}}})()}onSomeByteRangesDataLoaded({dataView:e,representationId:t,globalFrom:n,loaded:r,signal:i,onSegmentAppendFailed:o}){var s=this;return a(function*(){if(!s.activeSegments.size||!R(s.mediaSource,s.sourceBuffer))return;let a=s.representations.get(t);if(a)for(let c of s.activeSegments){let{segment:l}=c;if(c.representationId!==t)continue;if(i.aborted){yield o();continue}let u=l.byte.from-n,d=l.byte.to-n,f=d-u+1,p=u<r,m=d<=r;if(!p)continue;let h=vs(a.mime);if(l.status===`downloading`&&m){l.status=`downloaded`;let n=new DataView(e.buffer,e.byteOffset+u,f);(yield s.sourceBufferTaskQueue.append(n,i))&&!i.aborted?s.onSegmentFullyAppended(c,t):yield o()}else if(s.tuning.dash.enableSubSegmentBufferFeeding&&(l.status===`downloading`||l.status===`partially_fed`)&&(c.loadedBytes=Math.min(f,r-u),c.loadedBytes>c.feedingBytes)){let n=new DataView(e.buffer,e.byteOffset+u+c.feedingBytes,c.loadedBytes-c.feedingBytes),r=c.loadedBytes===f?n:h.parseFeedableSegmentChunk(n);r?.byteLength&&(l.status=`partially_fed`,c.feedingBytes+=r.byteLength,(yield s.sourceBufferTaskQueue.append(r,i))&&!i.aborted?(c.fedBytes+=r.byteLength,c.fedBytes===f&&s.onSegmentFullyAppended(c,t)):yield o())}}})()}onSegmentFullyAppended(e,t){if(!(q.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer))){!this.isLive&&j.browser.isSafari&&this.tuning.useSafariEndlessRequestBugfix&&(bc(this.sourceBuffer.buffered,e.segment.time.from,100)&&bc(this.sourceBuffer.buffered,e.segment.time.to,100)||this.error$.next({id:`EmptyAppendBuffer`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Browser stuck on empty result of adding segment to source buffer`})),this.tuning.dash.useNewRepresentationSwitch||(this.playingRepresentationId=t,this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(this.parsedInitData.get(this.playingRepresentationId))),e.segment.status=`fed`,Ds(e.segment)&&(e.segment.size=e.fedBytes);for(let n of this.representations.values())if(n.id!==t)for(let t of this.segments.get(n.id)??[])t.status===`fed`&&Math.round(t.time.from)===Math.round(e.segment.time.from)&&Math.round(t.time.to)===Math.round(e.segment.time.to)&&(t.status=`none`);this.updateLowLatencyLiveIfNeeded(e.segment),this.activeSegments.delete(e),this.detectGapsWhenIdle(t,[e.segment])}}abortSegment(e){e.status===`partially_fed`?e.status=`partially_ejected`:e.status!==`partially_ejected`&&(e.status=`none`);for(let t of this.activeSegments.values())if(t.segment===e){this.activeSegments.delete(t);break}}loadNextInit(){if(this.allInitsLoaded||this.initLoadIdleCallback)return;let e=null,t=!1;for(let[n,r]of this.initData.entries()){let i=r instanceof Promise;t||=i,r===null&&(e=n)}if(!e){this.allInitsLoaded=!0;return}if(t)return;let n=this.representations.get(e);n&&(this.initLoadIdleCallback=Ec.requestIdleCallbackPolyfilled(()=>Dc.promiseFinally(this.loadInit(n,`low`,!1),()=>this.initLoadIdleCallback=null)))}loadInit(e,t=`auto`,n=!1){var r=this;return a(function*(){let i=r.tuning.dash.useFetchPriorityHints?t:`auto`,o=!n&&r.tuning.dash.ignoreNetworkErrorsOnLoadInit,s=(!n&&r.failedDownloads>0?q.abortable(r.destroyAbortController.signal,c(function*(){let e=q.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>setTimeout(t,e))}).bind(r))():Promise.resolve()).then(()=>r.fetcher.fetchRepresentation(e.segmentReference,vs(e.mime),{priority:i,ignoreNetworkErrors:o})).then(function(){var t=a(function*(t){if(!t)return;let{init:n,dataView:i,segments:a}=t,o=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength);r.initData.set(e.id,o);let s=a;r.isLive&&Os(e.segmentReference)&&(s=r.getActualLiveStartingSegments(e.segmentReference)),(!r.isLive||!r.segments.has(e.id))&&r.segments.set(e.id,s),n&&r.parsedInitData.set(e.id,n)});return function(e){return t.apply(this,arguments)}}()).then(()=>r.failedDownloads=0,t=>{o||r.initData.set(e.id,null),n&&r.error$.next({id:`LoadInits`,category:q.ErrorCategory.WTF,message:`loadInit threw`,thrown:t})});return r.initData.set(e.id,s),s})()}dropBuffer(){var e=this;return a(function*(){for(let t of e.segments.values())for(let e of t)e.status=`none`;yield e.pruneBuffer(0,1/0,!0)})()}pruneBuffer(e,t,n=!1){var r=this;return a(function*(){if(!r.sourceBuffer||!R(r.mediaSource,r.sourceBuffer)||!r.playingRepresentationId||q.isNullable(e))return!1;let i=[],a=0,s=e=>{e.sort((e,t)=>e.from-t.from);let t=[e[0]];for(let n=1;n<e.length;n++){let{from:r,to:i}=e[n],a=t[t.length-1];a.to>=r?a.to=Math.max(a.to,i):t.push(e[n])}return t},c=e=>{if(a>=t)return i;i.push(o({},e.time)),i=s(i);let n=Ds(e)?e.size??0:e.byte.to-e.byte.from;a+=n};for(let t of r.segments.values())for(let n of t){let t=n.time.to<=e-r.tuning.dash.bufferPruningSafeZone,i=n.time.from>=e+Math.min(r.forwardBufferTarget,r.bufferLimit);(t||i)&&n.status===`fed`&&c(n)}for(let e=0;e<r.sourceBuffer.buffered.length;e++){let t=r.sourceBuffer.buffered.start(e)*1e3,n=r.sourceBuffer.buffered.end(e)*1e3,i=0;for(let e of r.segments.values())for(let r of e)Sc.arrayIncludes([`none`,`partially_ejected`],r.status)&&Math.round(r.time.from)<=Math.round(t)&&Math.round(r.time.to)>=Math.round(n)&&i++;i===r.segments.size&&c({time:{from:t,to:n},url:``,status:`none`})}if(i.length&&n){let t=Math.min(r.forwardBufferTarget,r.bufferLimit)*r.tuning.dash.minSafeBufferThreshold;for(let n of r.segments.values())for(let r of n)r.time.from>=e+t&&r.status===`fed`&&c(r)}return i.length?(yield Promise.all(i.map(e=>r.sourceBufferTaskQueue.remove(e.from,e.to)))).reduce((e,t)=>e||t,!1):!1})()}abortBuffer(){var e=this;return a(function*(){if(!e.sourceBuffer||!R(e.mediaSource,e.sourceBuffer))return!1;let t=e.playingRepresentationId&&e.initData.get(e.playingRepresentationId),n=t instanceof ArrayBuffer?t:void 0;return e.sourceBufferTaskQueue.abort(n)})()}getDebugBufferState(){if(!(!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length))return{from:this.sourceBuffer.buffered.start(0),to:this.sourceBuffer.buffered.end(this.sourceBuffer.buffered.length-1)}}getForwardBufferDuration(e=this.getCurrentPosition()){return!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length||q.isNullable(e)?0:Ws(this.sourceBuffer.buffered,e)}getForwardBufferRepresentations(e=this.getCurrentPosition()){if(this.forwardBufferRepresentations.clear(),q.isNonNullable(e))for(let[t,n]of this.segments.entries())this.forwardBufferRepresentations.set(t,n.filter(t=>t.time.from>=e&&t.time.to<=e+this.forwardBufferTarget));return this.forwardBufferRepresentations}getMpdSegmentDuration(){for(let e of this.segments.values()){let t=e[0];if(t&&t.time.to>t.time.from)return t.time.to-t.time.from}}getActiveSegmentProgress(){let e;for(let t of this.activeSegments)q.isNullable(t.startedAtMs)||(!e||t.segment.time.from<e.segment.time.from)&&(e=t);if(!q.isNullable(e?.startedAtMs))return{startedAtMs:e.startedAtMs,loadedBytes:e.loadedBytes,totalBytes:e.segment.size??void 0,segmentDurationMs:e.segment.time.to-e.segment.time.from}}detectGaps(e,t){if(!(!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)))for(let n of t){let t={representation:e,from:n.time.from,to:n.time.to,persistent:!1},{buffered:r}=this.sourceBuffer;for(let e=0;e<r.length;e++){let i=r.start(e)*1e3,a=r.end(e)*1e3;if(!(a<=n.time.from||i>=n.time.to)){if(i<=n.time.from&&a>=n.time.to){t=void 0;break}a>n.time.from&&a<n.time.to&&(t.from=a),i<n.time.to&&i>n.time.from&&(t.to=i)}}t&&t.to-t.from>1&&!this.gaps.some(e=>t&&e.from===t.from&&e.to===t.to)&&this.gaps.push(t)}}detectGapsWhenIdle(e,t){if(this.gapDetectionIdleCallback||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer))return;let{buffered:n}=this.sourceBuffer,{usePersistentGaps:r}=this.tuning.dash;this.gaps=this.gaps.filter(e=>{if(r&&e.persistent)return!0;let t=Math.round(e.from),i=Math.round(e.to);for(let e=0;e<n.length;e++)if(t>=Math.round(n.start(e)*1e3)&&i<=Math.round(n.end(e)*1e3))return!1;return!0}),this.gapDetectionIdleCallback=Ec.requestIdleCallbackPolyfilled(()=>{try{this.detectGaps(e,t)}catch(e){this.error$.next({id:`GapDetection`,category:q.ErrorCategory.WTF,message:`detectGaps threw`,thrown:e})}finally{this.gapDetectionIdleCallback=null}})}checkEjectedSegments(){if(q.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||q.isNullable(this.playingRepresentationId))return;let e=[];for(let t=0;t<this.sourceBuffer.buffered.length;t++){let n=Math.floor(this.sourceBuffer.buffered.start(t)*1e3),r=Math.ceil(this.sourceBuffer.buffered.end(t)*1e3);e.push({from:n,to:r})}for(let t of this.segments.values())for(let n of t){let{status:t}=n;if(t!==`fed`&&t!==`partially_ejected`)continue;let r=Math.floor(n.time.from),i=Math.ceil(n.time.to),a=e.some(e=>e.from-100<=r&&e.to+100>=i),o=e.filter(e=>r>=e.from&&r<e.to-100||i>e.from+100&&i<=e.to);a||(o.length===1||this.gaps.some(e=>e.from===n.time.from||e.to===n.time.to)?n.status=`partially_ejected`:n.status=`none`)}}handleAsyncError(e,t){this.error$.next({id:t,category:q.ErrorCategory.VIDEO_PIPELINE,thrown:e,message:`Something went wrong`})}}var Fc=require(`@vkontakte/videoplayer-shared`),Ic=require(`@vkontakte/videoplayer-shared`),J=require(`@vkontakte/videoplayer-shared`),Lc=require(`@vkontakte/videoplayer-shared`),Rc=new Set([2,3,4,5,6,9,19]),zc=new Set([1,8,18,21]),Bc=new Set([10,11,12,13,14,15,16]),Vc=({txtCode:e,error$:t,recoverableError$:n,httpCode:r})=>{let i=parseInt(e);if(isNaN(i))return;let a=o(o({},Hc(i)),{},{httpCode:r,UVBackendErrorCode:e});if(Rc.has(i)){t.next(o(o({},a),{},{category:Lc.ErrorCategory.NETWORK}));return}if(zc.has(i)){n.next(o(o({},a),{},{category:Lc.ErrorCategory.FATAL}));return}if(Bc.has(i)){t.next(o(o({},a),{},{category:Lc.ErrorCategory.FATAL}));return}},Hc=e=>{switch(e){case 1:return{id:`VideoDataLinkExpiredError`,message:`Video data links have expired`};case 5:return{id:`VideoServerError`,message:`Server error`};case 8:return{id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`};case 10:return{id:`UserAgentChange`,message:`User agent changed`};case 11:return{id:`forbiddenReferer`,message:`Forbidden referer`};case 12:case 13:case 14:case 15:case 16:return{id:`OKerror`,message:`Error #${e}`};case 18:return{id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`};case 21:return{id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`};default:return Uc(e)}};function Uc(e){return{id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${e})`}}var Wc=require(`@vkontakte/videoplayer-shared`),Gc=`vk_player_cached_fetches`,Kc=[`fromCache`,`expires`,`sig`],qc=300*1e3,Jc=`x-cache-expires`,Yc=function(){var e=a(function*(e){let t=Zc(e),n=yield Wc.getWindow().caches.open(Gc);return{get:function(){var e=a(function*(){let e=yield n.match(t);return e&&!Qc(e)?(Wc.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_hit`]}),e):(e&&(yield n.delete(t),Wc.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_missed`,`expired`]})),null)});return function(){return e.apply(this,arguments)}}(),set:r=>{n.put(t,$c(r,e))}}});return function(t){return e.apply(this,arguments)}}();function Xc(){return typeof caches<`u`}function Zc(e){try{let t=new URL(e);return t.hostname=`cache.local`,Kc.forEach(e=>t.searchParams.delete(e)),t.toString()}catch{return e}}function Qc(e){let t=e.headers.get(Jc);if(!t)return!0;let n=Number(t);return isNaN(n)||n<=Date.now()}function $c(e,t){let n=e.clone(),r=new Headers(n.headers);return r.set(Jc,el(t).toString()),new Response(n.body,{status:n.status,statusText:n.statusText,headers:r})}function el(e){try{let t=new URL(e).searchParams.get(`expires`);if(t&&!isNaN(Number(t)))return Number(t)}catch{return 0}return Date.now()+qc}var tl=function(){var e=a(function*(){yield Wc.getWindow().caches.delete(Gc)});return function(){return e.apply(this,arguments)}}();class nl{constructor({throughputEstimator:e,requestQuic:t,tracer:n,compatibilityMode:r=!1,useEnableSubtitlesParam:a=!1,handleExtendedNetworkErrorsSet:l=!1,useUrlCacheMechanism:u=!1,measureNonSegmentRequests:d=!1}){i(this,`throughputEstimator`,void 0),i(this,`requestQuic`,void 0),i(this,`tracer`,void 0),i(this,`manifestRequested$`,new J.Subject),i(this,`firstBytesManifest$`,new J.Subject),i(this,`firstBytesRequested$`,new J.Subject),i(this,`firstBytesReceived$`,new J.Subject),i(this,`lastConnectionType$`,new J.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new J.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new J.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new J.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new J.ValueSubject(void 0)),i(this,`recoverableError$`,new J.Subject),i(this,`error$`,new J.Subject),i(this,`abortAllController`,new Fc.AbortControllerPolyfilled),i(this,`subscription`,new J.SubscriptionRemovable),i(this,`compatibilityMode`,void 0),i(this,`useEnableSubtitlesParam`,void 0),i(this,`useUrlCacheMechanism`,void 0),i(this,`measureNonSegmentRequests`,void 0),i(this,`startupPhase`,!0),i(this,`performanceObserver`,null),i(this,`pendingConnectionMetrics`,new Map),i(this,`handleExtendedNetworkErrorsSet`,!1),i(this,`fetchManifest`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e){let t=this.tracer.createComponentTracer(`FetchManifest`),n=e;this.requestQuic&&(n=La(n)),!this.compatibilityMode&&this.useEnableSubtitlesParam&&(n=za(n)),this.trackRequestStart(n,performance.now());let r=J.now();this.manifestRequested$.next();let i=yield this.doFetch(n,{signal:this.abortAllController.signal}).catch(J.suppressAbort);if(i){let a=J.now();t.log(`success`,J.flattenObject({url:n,message:`Request successfully executed`})),t.end(),this.onHeadersReceived(i.headers),this.firstBytesManifest$.next();let o=i.headers.get(`content-length`),c=0;o&&(c=parseInt(o,10));let l=yield s(i.text());if((!o||isNaN(c)||c<=0)&&(c=new TextEncoder().encode(l).length),c>0){let t=a-r,n=c/(t/1e3)*8/1024,i={bytes:c,speed:n,url:e};this.lastDownloadMetrics$.next(i)}if(this.measureNonSegmentRequests&&this.startupPhase&&(this.throughputEstimator?.addRawRtt(a-r),o&&c>0)){let e=J.now();this.throughputEstimator?.addRawSpeed(c,e-r)}return l}else return t.error(`error`,J.flattenObject({url:n,message:`No data in request manifest`})),t.end(),null});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetch`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e,{rangeMethod:t=this.compatibilityMode?0:1,range:n,onProgress:r,priority:i=`auto`,signal:a,measureThroughput:o=!0,isLowLatency:s=!1,bufferOptimisation:l=!1,ignoreNetworkErrors:u=!1,urlCacheMechanismEnabled:d=!1}={}){let f=e,p=new Headers,m=this.tracer.createComponentTracer(`Fetch`);if(n)switch(t){case 0:p.append(`Range`,`bytes=${n.from}-${n.to}`);break;case 1:{let e=new URL(f,J.getWindow().location.href);e.searchParams.append(`bytes`,`${n.from}-${n.to}`),f=e.toString();break}default:J.assertNever(t)}this.requestQuic&&(f=La(f));let h=this.abortAllController.signal,g;if(a){let e=new Fc.AbortControllerPolyfilled;if(g=J.merge(J.fromEvent(this.abortAllController.signal,`abort`),J.fromEvent(a,`abort`)).subscribe(()=>{try{e.abort()}catch(e){J.suppressAbort(e)}}),this.subscription.add(g),this.abortAllController.signal.aborted||a.aborted)try{e.abort()}catch(e){J.suppressAbort(e)}h=e.signal}let _=0,v=J.now();m.log(`startRequest`,J.flattenObject({url:f,priority:i,rangeMethod:t,range:n,isLowLatency:s,requestStartedAt:v})),this.trackRequestStart(f,performance.now()),this.firstBytesRequested$.next();let y=yield this.doFetch(f,{priority:i,headers:p,signal:h},{ignoreNetworkErrors:u,urlCacheMechanismEnabled:d}),b=J.now();if(!y)return m.error(`error`,{message:`No response in request`}),m.end(),this.unsubscribeAbortSubscription(g),null;if(this.throughputEstimator?.addRawRtt(b-v),!y.ok||!y.body){this.unsubscribeAbortSubscription(g);let e=`Fetch error ${y.status}: ${y.statusText}`;return m.error(`error`,{message:e}),m.end(),Promise.reject(Error(`Fetch error ${y.status}: ${y.statusText}`))}if(this.onHeadersReceived(y.headers),!r&&!o){this.unsubscribeAbortSubscription(g);let e=yield y.arrayBuffer(),t=J.now();if(this.measureNonSegmentRequests&&this.startupPhase){let e=y.headers.get(`content-length`),n=e?parseInt(e,10):NaN;Number.isFinite(n)&&n>0&&this.throughputEstimator?.addRawSpeed(n,t-v)}let n={requestStartedAt:v,requestEndedAt:t,duration:t-v};return m.log(`endRequest`,J.flattenObject(n)),m.end(),e}let x=y.body;if(o){this.startupPhase=!1;let e;[x,e]=y.body.tee(),this.throughputEstimator?.trackStream(e,s)}let S=x.getReader(),C,w=parseInt(y.headers.get(`content-length`)??``,10);Number.isFinite(w)&&(C=w),!C&&n&&(C=n.to-n.from+1);let T=C?new Uint8Array(C):new Uint8Array,E=!1,ee=e=>{this.unsubscribeAbortSubscription(g),E=!0,J.suppressAbort(e)},te=J.abortable(h,function(){var e=c(function*({done:e,value:t}){if(_===0&&(this.lastRequestFirstBytes$.next(J.now()-v),this.firstBytesReceived$.next()),h.aborted){this.unsubscribeAbortSubscription(g);return}if(!e&&t){if(l&&C)T.set(t,_),_+=t.byteLength;else{let e=new Uint8Array(T.length+t.length);e.set(T),e.set(t,T.length),T=e,_+=t.byteLength}r?.(new DataView(T.buffer),_),yield S?.read().then(te,ee)}});return function(t){return e.apply(this,arguments)}}().bind(this));yield S?.read().then(te,ee),this.unsubscribeAbortSubscription(g);let ne=J.now(),re={failed:E,requestStartedAt:v,requestEndedAt:ne,duration:ne-v};if(E)return m.error(`endRequest`,J.flattenObject(re)),m.end(),null;if(_>0){let t=ne-v,n=_/(t/1e3)*8/1024,r={bytes:_,speed:n,url:e};this.lastDownloadMetrics$.next(r)}return m.log(`endRequest`,J.flattenObject(re)),m.end(),T.buffer});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchByteRangeRepresentation`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t,n){if(e.type!==`byteRange`)return null;let{from:r,to:i}=e.initRange,a=r,s=i,c=!1,l,u;e.indexRange&&(l=e.indexRange.from,u=e.indexRange.to,c=i+1===l,c&&(a=Math.min(l,r),s=Math.max(u,i))),a=Math.min(a,0);let d=yield this.fetch(e.url,o({range:{from:a,to:s},measureThroughput:!1,urlCacheMechanismEnabled:!0},n));if(!d)return null;let f=new DataView(d,r-a,i-a+1);if(!t.validateData(f))throw Error(`Invalid media file`);let p=t.parseInit(f),m=e.indexRange??t.getIndexRange(p);if(!m)throw ReferenceError(`No way to load representation index`);let h;if(c)h=new DataView(d,m.from-a,m.to-m.from+1);else{let t=yield this.fetch(e.url,{range:m,measureThroughput:!1,urlCacheMechanismEnabled:!0});if(!t)return null;h=new DataView(t)}let g=t.parseSegments(h,p,m);return{init:p,dataView:new DataView(d),segments:g}});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchTemplateRepresentation`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t){if(e.type!==`template`)return null;let n=new URL(e.initUrl,e.baseUrl).toString(),r=yield this.fetch(n,o({measureThroughput:!1},t));return r?{init:null,segments:e.segments.map(e=>o(o({},e),{},{status:`none`,size:void 0})),dataView:new DataView(r)}:null});return function(t,n){return e.apply(this,arguments)}}().bind(this))),this.throughputEstimator=e,this.requestQuic=t,this.compatibilityMode=r,this.tracer=n.createComponentTracer(`Fetcher`),this.useEnableSubtitlesParam=a,this.handleExtendedNetworkErrorsSet=l,this.measureNonSegmentRequests=d,J.getWindow().PerformanceObserver&&this.setupPerformanceObserver(),this.useUrlCacheMechanism=u}onHeadersReceived(e){let{type:t,reused:n}=Ra(e);this.lastConnectionType$.next(t),this.lastConnectionReused$.next(n)}setupPerformanceObserver(){this.performanceObserver=new(J.getWindow()).PerformanceObserver(e=>{e.getEntriesByType(`resource`).forEach(e=>{this.processPerformanceResourceTiming(e)})}),this.performanceObserver.observe({entryTypes:[`resource`]})}processPerformanceResourceTiming(e){let t=this.findMatchingRequest(e);if(!t||!this.pendingConnectionMetrics.get(t))return;this.pendingConnectionMetrics.delete(t);let n=this.extractConnectionMetrics(e);n&&this.lastConnectionMetrics$.next(n)}estimateNetworkType(){if(!(`connection`in J.getWindow().navigator))return`unknown`;let e=J.getWindow().navigator.connection;return e.effectiveType?{"slow-2g":`2g`,"2g":`2g`,"3g":`3g`,"4g":`lte`}[e.effectiveType]||e.effectiveType:e.downlink?e.downlink<1?`2g`:e.downlink<5?`3g`:e.downlink<50?`lte`:`wifi`:e.rtt?e.rtt>500?`2g`:e.rtt>250?`3g`:e.rtt>50?`lte`:`wifi`:`unknown`}extractConnectionMetrics(e){let t=0,n=0,r=0,i=0;return e.domainLookupStart>0&&e.domainLookupEnd>0&&(t=e.domainLookupEnd-e.domainLookupStart),e.connectStart>0&&e.connectEnd>0&&(i=e.connectEnd-e.connectStart,e.secureConnectionStart>0?(r=e.connectEnd-e.secureConnectionStart,n=e.secureConnectionStart-e.connectStart):n=i),{dnsResolveTime:Math.max(0,t),tcpHandshakeTime:Math.max(0,n),tlsHandshakeTime:Math.max(0,r),totalConnectTime:Math.max(0,i),networkType:this.estimateNetworkType(),url:e.name}}findMatchingRequest(e){try{for(let[t,n]of this.pendingConnectionMetrics.entries()){let r=new URL(e.name),i=r.origin+r.pathname,a=new URL(n.url);if(i===a.origin+a.pathname&&e.startTime>=n.startTime-10&&e.startTime<=n.startTime+1e3)return t}}catch{this.recoverableError$.next({id:`VideoDataFetchError`,message:`Video data fetch error with getting download metrics`,category:J.ErrorCategory.WTF})}return null}trackRequestStart(e,t){let n=`${e}_${t}_${Math.random().toString(36).substr(2,9)}`;this.pendingConnectionMetrics.set(n,{url:e,startTime:t})}fetchRepresentation(e,t,n){var r=this;return a(function*(){let{type:i}=e;switch(i){case`byteRange`:return(yield r.fetchByteRangeRepresentation(e,t,n))??null;case`template`:return(yield r.fetchTemplateRepresentation(e,n))??null;default:J.assertNever(i)}})()}destroy(){this.abortAllController.abort(),this.subscription.unsubscribe(),this.performanceObserver&&=(this.performanceObserver.disconnect(),null),this.pendingConnectionMetrics.clear(),this.tracer.end()}doFetch(e,t,n){var r=this;return a(function*(){let i;if(r.useUrlCacheMechanism&&n?.urlCacheMechanismEnabled&&Xc()){i=yield Yc(e);let t=yield i.get();if(t)return t}let a=yield Ic.fetchPolyfilled(e,i?o(o({},t),{},{cache:`no-store`}):t);if(a.ok)return i?.set(a),a;if(n?.ignoreNetworkErrors)return;let s=yield a.text();if(r.handleExtendedNetworkErrorsSet){Vc({txtCode:s,httpCode:a.status,error$:r.error$,recoverableError$:r.recoverableError$});return}let c=parseInt(s);if(!isNaN(c))switch(c){case 1:r.recoverableError$.next({id:`VideoDataLinkExpiredError`,message:`Video data links have expired`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;case 8:r.recoverableError$.next({id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;case 18:r.recoverableError$.next({id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;case 21:r.recoverableError$.next({id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;default:r.error$.next({id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${c})`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s})}})()}unsubscribeAbortSubscription(e){e&&(e.unsubscribe(),this.subscription.remove(e))}}var rl=require(`@vkontakte/videoplayer-shared`);class il{constructor(e,t){i(this,`currentRepresentation$`,new rl.ValueSubject(null)),i(this,`maxRepresentations`,4),i(this,`representationsCursor`,0),i(this,`representations`,[]),i(this,`getCurrentPosition`,void 0),i(this,`currentSegment`,null),this.getCurrentPosition=t.getCurrentPosition,this.processStreams(e)}updateLive(e){this.processStreams(e?.streams.text)}seekLive(e){this.processStreams(e)}maintain(e=this.getCurrentPosition()){if(!rl.isNullable(e))for(let t of this.representations)for(let n of t){let t=n.segmentReference,r=t.segments.length,i=t.segments[0].time.from,a=t.segments[r-1].time.to;if(e<i||e>a)continue;let s=t.segments.find(t=>t.time.from<=e&&t.time.to>=e);!s||this.currentSegment?.time.from===s.time.from&&this.currentSegment.time.to===s.time.to||(this.currentSegment=s,this.currentRepresentation$.next(o(o({},n),{},{label:`Live Text`,language:`ru`,isAuto:!0,url:new URL(s.url,t.baseUrl).toString()})))}}destroy(){this.currentRepresentation$.next(null),this.currentSegment=null,this.representations=[]}processStreams(e){for(let t of e??[]){let e=il.filterRepresentations(t.representations);if(e){this.representations[this.representationsCursor]=e,this.representationsCursor=(this.representationsCursor+1)%this.maxRepresentations;break}}}static isSupported(e){return!!e?.some(e=>il.filterRepresentations(e.representations))}static filterRepresentations(e){return e?.filter(e=>e.kind===`text`&&`segmentReference`in e&&Os(e.segmentReference))}}var al=[`timeupdate`,`progress`,`play`,`seeked`,`stalled`,`waiting`],ol=[`timeupdate`,`progress`,`loadeddata`,`playing`,`seeked`];class sl{constructor(e){i(this,`element`,null),i(this,`manifestUrlString`,``),i(this,`source`,null),i(this,`manifest`,null),i(this,`tuning`,void 0),i(this,`tracer`,void 0),i(this,`forceVideoCodec`,void 0),i(this,`videoBufferManager`,void 0),i(this,`audioBufferManager`,void 0),i(this,`bufferManagers`,[]),i(this,`liveTextManager`,void 0),i(this,`throughputEstimator`,void 0),i(this,`subscription`,new K.Subscription),i(this,`subscriptionRemovable`,new K.SubscriptionRemovable),i(this,`representationSubscription`,new K.Subscription),i(this,`fetcher`,void 0),i(this,`state$`,new st(`none`)),i(this,`currentVideoRepresentation$`,new K.ValueSubject(void 0)),i(this,`currentVideoRepresentationInit$`,new K.ValueSubject(void 0)),i(this,`currentAudioRepresentation$`,new K.ValueSubject(void 0)),i(this,`currentVideoSegmentLength$`,new K.ValueSubject(0)),i(this,`currentAudioSegmentLength$`,new K.ValueSubject(0)),i(this,`error$`,new K.Subject),i(this,`manifestRequested$`,new K.Subject),i(this,`firstBytesManifest$`,new K.Subject),i(this,`manifestReceived$`,new K.Subject),i(this,`firstBytesRequested$`,new K.Subject),i(this,`firstBytesReceived$`,new K.Subject),i(this,`lastConnectionType$`,new K.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new K.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new K.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new K.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new K.ValueSubject(void 0)),i(this,`currentLiveTextRepresentation$`,new K.ValueSubject(null)),i(this,`timeoutSourceOpenId`,void 0),i(this,`isLive$`,new K.ValueSubject(!1)),i(this,`isActiveLive$`,new K.ValueSubject(!1)),i(this,`isLowLatency$`,new K.ValueSubject(!1)),i(this,`liveDuration$`,new K.ValueSubject(0)),i(this,`liveSeekableDuration$`,new K.ValueSubject(0)),i(this,`liveAvailabilityStartTime$`,new K.ValueSubject(0)),i(this,`liveStreamStatus$`,new K.ValueSubject(void 0)),i(this,`bufferLength$`,new K.ValueSubject(0)),i(this,`liveLatency$`,new K.ValueSubject(void 0)),i(this,`liveLoadBufferLength$`,new K.ValueSubject(0)),i(this,`livePositionFromPlayer$`,new K.ValueSubject(0)),i(this,`currentStallDuration$`,new K.ValueSubject(0)),i(this,`videoLastDataObtainedTimestamp$`,new K.ValueSubject(0)),i(this,`fetcherRecoverableError$`,new K.Subject),i(this,`fetcherError$`,new K.Subject),i(this,`updateDurationError$`,new K.Subject),i(this,`liveStreamEndTimestamp`,0),i(this,`liveBuffer`,void 0),i(this,`isUpdatingLive`,!1),i(this,`isJumpGapAfterSeekLive`,!1),i(this,`forceEnded$`,new K.Subject),i(this,`gapWatchdogActive`,!1),i(this,`gapWatchdogSubscription`,void 0),i(this,`stallWatchdogSubscription`,void 0),i(this,`livePauseWatchdogSubscription`,void 0),i(this,`liveWasInterrupted`,!1),i(this,`isOnDemand`,!1),i(this,`dashMaxTvVideoQuality`,void 0),i(this,`destroyController`,new vc.AbortControllerPolyfilled),i(this,`initManifest`,K.abortable(this.destroyController.signal,function(){var e=c(function*(e,t,n){this.tracer.log(`initManifest`),this.element=e,this.manifestUrlString=ue(t,n,2),this.state$.startTransitionTo(`manifest_ready`),this.manifest=yield this.updateManifest(),this.manifest?.streams.video.length?this.state$.setState(`manifest_ready`):this.error$.next({id:`NoRepresentations`,category:K.ErrorCategory.PARSER,message:`No playable video representations`})});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`updateManifest`,K.abortable(this.destroyController.signal,c(function*(){this.tracer.log(`updateManifestStart`,{manifestUrl:this.manifestUrlString});let e=yield this.fetcher.fetchManifest(this.manifestUrlString).catch(e=>{!this.manifest&&!this.bufferLength$.getValue()&&this.error$.next({id:`LoadManifest`,category:K.ErrorCategory.NETWORK,message:`Failed to load manifest`,thrown:e})});if(!e)return null;let t=null;try{t=xo(e??``,this.manifestUrlString),this.manifestReceived$.next()}catch(t){let n=Pa(e)??{id:`ManifestParsing`,category:K.ErrorCategory.PARSER,message:`Failed to parse MPD manifest`,thrown:t};this.error$.next(n)}if(!t)return null;let n=(e,t,n)=>{var r,i,a,o;return!!(!((r=this.element)==null||(i=r.canPlayType)==null)&&i.call(r,t)&&!((a=ke())==null||(o=a.isTypeSupported)==null)&&o.call(a,`${t}; codecs="${n}"`)||e===`text`)};if(t.live){this.isLive$.next(!0);let{availabilityStartTime:e,latestSegmentPublishTime:n,streamIsUnpublished:r,streamIsAlive:i}=t.live,a=(t.duration??0)/1e3;this.liveSeekableDuration$.next(-1*a),this.liveDuration$.next((n-e)/1e3),this.liveAvailabilityStartTime$.next(t.live.availabilityStartTime);let o=`active`;if(i||(o=r?`unpublished`:`unexpectedly_down`),this.liveStreamStatus$.next(o),i&&this.liveWasInterrupted){this.liveWasInterrupted=!1,this.stopStallWatchdogSubscription();let e=this.normalizeLiveOffset(-1*this.livePositionFromPlayer$.getValue()*1e3);this.seekLive(e).catch(e=>{this.error$.next({id:`updateManifest`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`seekLive after stream restore failed`,thrown:e})})}}let r={text:t.streams.text,video:[],audio:[]},i,a;for(let e of[`video`,`audio`]){let o=t.streams[e].filter(({mime:t,codecs:r})=>n(e,t,r));r[e]=o;let s,c;if(this.tuning.dash.codecsPrioritizeEnabled){if(e===`audio`)a=Dr(o.map(({codecs:e})=>e)),s=a[0],s&&(r[e]=o.filter(({codecs:e})=>Or(e)===s));else if(e===`video`){i=Tr(o,{preferHdr:this.tuning.preferHDR});let t=this.forceVideoCodec;c=(t?i.find(e=>e.name===t.name&&e.hdr===t.hdr):void 0)??i[0],c&&(r[e]=o.filter(e=>Or(e.codecs)===c.name&&!!e.hdr===c.hdr))}}else{let t=wr(new Set(o.map(({codecs:e})=>e)));t&&(r[e]=o.filter(({codecs:e})=>e.startsWith(t)))}if(e===`video`){if(!this.tuning.dash.codecsPrioritizeEnabled){let e=this.tuning.preferHDR,t=r.video.some(e=>e.hdr),n=r.video.some(e=>!e.hdr);j.display.isHDR&&e&&t?r.video=r.video.filter(e=>e.hdr):n&&(r.video=r.video.filter(e=>!e.hdr))}let{videoStreamRepresentaionsFilter:e}=this.tuning.dash;if(e.length&&jr(r,e),this.dashMaxTvVideoQuality&&$s(r,this.dashMaxTvVideoQuality),this.isOnDemand&&this.tuning.dash.filterOnDemandQualityList)for(let e of r.video)e.representations=e.representations.sort((e,t)=>t.height-e.height).filter((e,t)=>t%2==0)}}let s=o(o({},t),{},{streams:r});return this.tuning.dash.codecsPrioritizeEnabled&&(s.codecs={video:i,audio:a}),this.tracer.log(`updateManifestEnd`,K.flattenObject(s)),s}).bind(this))),i(this,`initRepresentations`,K.abortable(this.destroyController.signal,function(){var e=c(function*(e,t,n){var r=this;this.tracer.log(`initRepresentationsStart`,K.flattenObject({initialVideo:e,initialAudio:t,sourceHls:n})),K.assertNonNullable(this.manifest),K.assertNonNullable(this.element),this.representationSubscription.unsubscribe(),this.state$.startTransitionTo(`representations_ready`);let i=e=>{this.representationSubscription.add(K.fromEvent(e,`error`).pipe(K.filter(e=>!!this.element?.played.length)).subscribe(e=>{this.error$.next({id:`VideoSource`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`Unexpected video source error`,thrown:e})}))};this.source=Me();let o=document.createElement(`source`);if(i(o),o.src=URL.createObjectURL(this.source),this.element.appendChild(o),Ae())if(n){let e=document.createElement(`source`);i(e),e.type=`application/x-mpegurl`,e.src=n.url,this.element.appendChild(e)}else this.element.disableRemotePlayback=!0;this.isActiveLive$.next(this.isLive$.getValue());let s={fetcher:this.fetcher,tuning:this.tuning,getCurrentPosition:()=>this.element?this.element.currentTime*1e3:void 0,isActiveLowLatency:()=>this.isActiveLive$.getValue()&&this.isLowLatency$.getValue(),manifest:this.manifest},c=this.manifest.streams.video.reduce((e,t)=>[...e,...t.representations],[]);if(this.videoBufferManager=new Pc(`video`,this.source,c,s),this.bufferManagers=[this.videoBufferManager],K.isNonNullable(t)){let e=this.manifest.streams.audio.reduce((e,t)=>[...e,...t.representations],[]);this.audioBufferManager=new Pc(`audio`,this.source,e,s),this.bufferManagers.push(this.audioBufferManager)}if(il.isSupported(this.manifest.streams.text)&&!this.isLowLatency$.getValue()&&(this.liveTextManager=new il(this.manifest.streams.text,s)),this.representationSubscription.add(this.fetcher.lastRequestFirstBytes$.subscribe(this.lastRequestFirstBytes$)),this.representationSubscription.add(K.merge(...ol.map(e=>K.fromEvent(this.element,e))).pipe(K.map(e=>this.element?Ws(this.element.buffered,this.element.currentTime*1e3):0),K.filterChanged(),K.tap(e=>{e>this.tuning.dash.bufferEmptinessTolerance&&this.stopStallWatchdogSubscription()})).subscribe(this.bufferLength$)),this.representationSubscription.add(K.merge(K.fromEvent(this.element,`ended`),this.forceEnded$).subscribe(()=>{this.stopStallWatchdogSubscription()})),this.isLive$.getValue()){this.subscription.add(this.liveDuration$.pipe(K.filterChanged()).subscribe(e=>this.liveStreamEndTimestamp=K.now())),this.subscription.add(K.fromEvent(this.element,`pause`).subscribe(()=>{let{liveUpdateInterval:e}=this.tuning.dash;this.livePauseWatchdogSubscription=K.interval(e).subscribe(t=>{let n=de(this.manifestUrlString,2);this.manifestUrlString=ue(this.manifestUrlString,n+e,2),this.liveStreamStatus$.getValue()===`active`&&this.updateManifest()}),this.subscription.add(this.livePauseWatchdogSubscription)})).add(K.fromEvent(this.element,`play`).subscribe(e=>this.livePauseWatchdogSubscription?.unsubscribe())),this.representationSubscription.add(K.combine({isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(K.map(({isActiveLive:e,isLowLatency:t})=>e&&t),K.filterChanged()).subscribe(e=>{this.isManualDecreasePlaybackInLive()||pc(this.element,1)})),this.representationSubscription.add(K.combine({bufferLength:this.bufferLength$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(K.filter(({bufferLength:e,isActiveLive:t,isLowLatency:n})=>t&&n&&!!e)).subscribe(({bufferLength:e})=>this.liveBuffer.next(e))),this.representationSubscription.add(this.videoBufferManager.currentLowLatencySegmentLength$.subscribe(e=>{if(!this.isActiveLive$.getValue()&&!this.isLowLatency$.getValue()&&!e)return;let t=this.liveSeekableDuration$.getValue()-e/1e3;this.liveSeekableDuration$.next(Math.max(t,-1*this.tuning.dashCmafLive.maxLiveDuration)),this.liveDuration$.next(this.liveDuration$.getValue()+e/1e3)})),this.representationSubscription.add(K.combine({isLive:this.isLive$,rtt:this.throughputEstimator.rtt$,bufferLength:this.bufferLength$,segmentServerLatency:this.videoBufferManager.currentLiveSegmentServerLatency$}).pipe(K.filter(({isLive:e})=>e),K.filterChanged((e,t)=>t.bufferLength<e.bufferLength),K.map(({rtt:e,bufferLength:t,segmentServerLatency:n})=>{let r=de(this.manifestUrlString,2);return(e/2+t+n+r)/1e3})).subscribe(this.liveLatency$)),this.representationSubscription.add(K.combine({liveBuffer:this.liveBuffer.smoothed$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).subscribe(({liveBuffer:e,isActiveLive:t,isLowLatency:n})=>{if(!n||!t)return;let r=this.tuning.dashCmafLive.lowLatency.maxTargetOffset,i=this.tuning.dashCmafLive.lowLatency.maxTargetOffsetDeviation,a=this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup,o=e-r;if(this.isManualDecreasePlaybackInLive())return;let s=1;Math.abs(o)>i&&(s=1+Math.sign(o)*a),pc(this.element,s)})),this.representationSubscription.add(this.bufferLength$.subscribe(e=>{let t=0;if(e){let e=(this.element?.currentTime??0)*1e3;t=Math.min(...this.bufferManagers.map(t=>t.getLiveSegmentsToLoadState(this.manifest)?.to??e))-e}this.liveLoadBufferLength$.getValue()!==t&&this.liveLoadBufferLength$.next(t)}));let e=0;this.representationSubscription.add(K.combine({liveLoadBufferLength:this.liveLoadBufferLength$,bufferLength:this.bufferLength$}).pipe(K.throttle(this.tuning.dash.liveUpdateInterval)).subscribe(function(){var t=a(function*({liveLoadBufferLength:t,bufferLength:n}){if(!r.element||r.isUpdatingLive)return;let i=r.element.playbackRate,a=de(r.manifestUrlString,2),o=Math.abs(r.livePositionFromPlayer$.getValue())*1e3,s=Math.min(o,r.tuning.dashCmafLive.normalizedTargetMinBufferSize*i),c=r.tuning.dashCmafLive.normalizedActualBufferOffset*i,l=r.tuning.dashCmafLive.normalizedLiveMinBufferSize*i,u=isFinite(t)?t:n,d=r.isActiveLive$.getValue()&&r.isLowLatency$.getValue(),f=o<=r.tuning.live.activeLiveDelay;r.isActiveLive$.next(f);let p=`none`;if(d?p=`active_low_latency`:r.isLowLatency$.getValue()&&f?(r.bufferManagers.forEach(e=>e.proceedLowLatencyLive()),p=`active_low_latency`):a!==0&&u<s?p=`live_forward_buffering`:u<s+l&&(p=`live_with_target_offset`),isFinite(t)&&(e=t>e?t:e),p===`live_forward_buffering`||p===`live_with_target_offset`){let n=e-(s+c),o=r.normalizeLiveOffset(Math.trunc(a+n/i)),l=Math.abs(o-a),u=0;!t||l<=r.tuning.dashCmafLive.offsetCalculationError?u=a:o>0&&l>r.tuning.dashCmafLive.offsetCalculationError&&(u=o),r.manifestUrlString=ue(r.manifestUrlString,u,2)}(p===`live_with_target_offset`||p===`live_forward_buffering`)&&(e=0,yield r.updateLive())});return function(e){return t.apply(this,arguments)}}(),e=>{this.error$.next({id:`updateLive`,category:K.ErrorCategory.VIDEO_PIPELINE,thrown:e,message:`Failed to update live with subscription`})}))}let l=K.merge(...this.bufferManagers.map(e=>e.fullyBuffered$)).pipe(K.map(()=>this.bufferManagers.every(e=>e.fullyBuffered$.getValue()))),u=K.merge(...this.bufferManagers.map(e=>e.onLastSegment$)).pipe(K.map(()=>this.bufferManagers.some(e=>e.onLastSegment$.getValue()))),d=K.combine({allBuffersFull:l,someBufferEnded:u}).pipe(K.filterChanged(),K.map(({allBuffersFull:e,someBufferEnded:t})=>e&&t),K.filter(e=>e));if(this.representationSubscription.add(K.merge(this.forceEnded$,d).subscribe(()=>{if(this.source&&this.source.readyState===`open`&&Array.from(this.source.sourceBuffers).every(e=>!e.updating))try{this.source?.endOfStream()}catch(e){this.error$.next({id:`EndOfStream`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`Failed to end MediaSource stream`,thrown:e})}})),this.representationSubscription.add(K.merge(...this.bufferManagers.map(e=>e.error$)).subscribe(this.error$)),this.representationSubscription.add(this.videoBufferManager.playingRepresentation$.subscribe(this.currentVideoRepresentation$)),this.representationSubscription.add(this.videoBufferManager.playingRepresentationInit$.subscribe(this.currentVideoRepresentationInit$)),this.representationSubscription.add(this.videoBufferManager.currentSegmentLength$.subscribe(this.currentVideoSegmentLength$)),this.audioBufferManager&&(this.representationSubscription.add(this.audioBufferManager.playingRepresentation$.subscribe(this.currentAudioRepresentation$)),this.representationSubscription.add(this.audioBufferManager.currentSegmentLength$.subscribe(this.currentAudioSegmentLength$))),this.liveTextManager&&this.representationSubscription.add(this.liveTextManager.currentRepresentation$.subscribe(this.currentLiveTextRepresentation$)),this.source.readyState!==`open`){let e=this.tuning.dash.sourceOpenTimeout>=0;yield new Promise(t=>{e&&(this.timeoutSourceOpenId=setTimeout(()=>{if(this.source?.readyState===`open`){t();return}this.error$.next({id:`OpenOfStream`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`Failed to open MediaSource`,thrown:Error(`Timeout reject when wait sourceopen event`),traceAsLog:!0})},this.tuning.dash.sourceOpenTimeout)),this.source?.addEventListener(`sourceopen`,()=>{this.timeoutSourceOpenId&&clearTimeout(this.timeoutSourceOpenId),t()},{once:!0})})}if(!this.isLive$.getValue()){let e=[this.manifest.duration??0,...yc.arrayFlatMap(yc.arrayFlatMap([...this.manifest.streams.audio,...this.manifest.streams.video],e=>e.representations),e=>{let t=[];return e.duration&&t.push(e.duration),Os(e.segmentReference)&&e.segmentReference.totalSegmentsDurationMs&&t.push(e.segmentReference.totalSegmentsDurationMs),t})];this.source.duration=Math.max(...e)/1e3}this.audioBufferManager&&K.isNonNullable(t)?yield Promise.all([this.videoBufferManager.startWith(e),this.audioBufferManager.startWith(t)]):yield this.videoBufferManager.startWith(e),this.state$.setState(`representations_ready`),this.tracer.log(`initRepresentationsEnd`)});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`tick`,()=>{if(!this.element||!this.videoBufferManager||this.source?.readyState!==`open`)return;let e=this.element.currentTime*1e3;this.videoBufferManager.maintain(e),this.audioBufferManager?.maintain(e),this.liveTextManager?.maintain(e),(this.videoBufferManager.gaps.length||this.audioBufferManager?.gaps.length)&&!this.gapWatchdogActive&&(this.gapWatchdogActive=!0,this.gapWatchdogSubscription=K.interval(this.tuning.gapWatchdogInterval).subscribe(()=>this.jumpGap(),e=>{this.error$.next({id:`GapWatchdog`,category:K.ErrorCategory.WTF,message:`Error handling gaps`,thrown:e})}),this.subscription.add(this.gapWatchdogSubscription))}),this.throughputEstimator=e.throughputEstimator,this.tuning=e.tuning,this.tracer=e.tracer.createComponentTracer(this.constructor.name),this.forceVideoCodec=e.forceVideoCodec,this.isOnDemand=e.isOnDemand,this.dashMaxTvVideoQuality=e.dashMaxTvVideoQuality,this.fetcher=new nl({throughputEstimator:this.throughputEstimator,requestQuic:this.tuning.requestQuick,compatibilityMode:e.compatibilityMode,tracer:this.tracer,useEnableSubtitlesParam:e.tuning.useEnableSubtitlesParam,handleExtendedNetworkErrorsSet:e.tuning.handleExtendedNetworkErrorsSet,useUrlCacheMechanism:this.tuning.useUrlCacheMechanism,measureNonSegmentRequests:e.tuning.throughputEstimator.measureNonSegmentRequests}),this.subscription.add(this.fetcher.recoverableError$.subscribe(this.fetcherRecoverableError$)),this.subscription.add(this.fetcher.error$.subscribe(this.fetcherError$)),this.subscription.add(this.fetcher.manifestRequested$.subscribe(this.manifestRequested$)),this.subscription.add(this.fetcher.firstBytesManifest$.subscribe(this.firstBytesManifest$)),this.subscription.add(this.fetcher.firstBytesRequested$.subscribe(this.firstBytesRequested$)),this.subscription.add(this.fetcher.firstBytesReceived$.subscribe(this.firstBytesReceived$)),this.subscription.add(this.fetcher.lastConnectionType$.subscribe(this.lastConnectionType$)),this.subscription.add(this.fetcher.lastConnectionReused$.subscribe(this.lastConnectionReused$)),this.subscription.add(this.fetcher.lastConnectionMetrics$.subscribe(this.lastConnectionMetrics$)),this.subscription.add(this.fetcher.lastDownloadMetrics$.subscribe(this.lastDownloadMetrics$)),this.liveBuffer=fc.getLiveBufferSmoothedValue(this.tuning.dashCmafLive.lowLatency.maxTargetOffset,o({},e.tuning.dashCmafLive.lowLatency.bufferEstimator)),this.initTracerSubscription()}setSmartRepresentationSwitch(e){this.bufferManagers.forEach(t=>t.setSmartRepresentationSwitch(e))}seekLive(e){var t=this;return a(function*(){K.assertNonNullable(t.element),t.updateManifestUrlWithTimeOffset(e),t.manifest=yield t.updateManifest(),t.manifest&&(t.isJumpGapAfterSeekLive=!0,yield t.updateLiveBuffersFromManifest(t.manifest))})()}updateManifestUrlWithTimeOffset(e){let t=this.liveStreamStatus$.getValue()===`active`?0:K.now()-this.liveStreamEndTimestamp,n=this.normalizeLiveOffset(e+t);this.isActiveLive$.next(n===0),this.manifestUrlString=ue(this.manifestUrlString,n,2)}updateLiveBuffersFromManifest(e){var t=this;return a(function*(){yield t.videoBufferManager?.seekLive(e.streams.video),yield t.audioBufferManager?.seekLive(e.streams.audio),t.liveTextManager?.seekLive(e.streams.text)})()}stopStallWatchdogSubscription(){this.stallWatchdogSubscription?.unsubscribe(),this.currentStallDuration$.next(0)}initBuffer(){K.assertNonNullable(this.element),this.state$.setState(`running`),this.subscription.add(K.merge(...al.map(e=>K.fromEvent(this.element,e)),K.fromEvent(window,`online`)).subscribe(()=>this.tick(),e=>{this.error$.next({id:`DashVKPlayer`,category:K.ErrorCategory.WTF,message:`Internal logic error`,thrown:e})})),this.subscription.add(K.fromEvent(this.element,`progress`).subscribe(()=>{this.element&&this.element.readyState===2&&!this.element.seeking&&(this.element.currentTime=this.element.currentTime)})),this.subscription.add(K.fromEvent(this.element,`waiting`).subscribe(()=>{this.tuning.dash.useVideoElementWaitingCurrentTimeReassign&&this.element&&this.element.readyState===2&&!this.element.seeking&&bc(this.element.buffered,this.element.currentTime*1e3)&&(this.element.currentTime=this.element.currentTime),this.stallWatchdogSubscription&&(this.stallWatchdogSubscription.unsubscribe(),this.subscriptionRemovable.remove(this.stallWatchdogSubscription)),this.stallWatchdogSubscription=K.interval(this.tuning.dash.stallWatchdogInterval).subscribe(()=>{let{keepSilentStallWatchdogWhenNotActive:e}=this.tuning.dashCmafLive,{crashOnStallTimeout:t,crashOnStallTWithoutDataTimeout:n,liveStallReinitInterval:r,stallWatchdogInterval:i}=this.tuning.dash,a=this.isLive$.getValue(),o=this.liveStreamStatus$.getValue()===`active`;if(!this.element||this.source?.readyState!==`open`)return;let s=this.currentStallDuration$.getValue();s+=i,this.currentStallDuration$.next(s);let c={timeInWaiting:s},l=K.now(),u=this.videoBufferManager?.lastDataObtainedTimestamp??0;this.videoLastDataObtainedTimestamp$.next(u);let d=this.audioBufferManager?.lastDataObtainedTimestamp??0,f=this.videoBufferManager?.getForwardBufferDuration()??0,p=this.audioBufferManager?.getForwardBufferDuration()??0,m=f<100&&l-u>n,h=this.audioBufferManager&&p<100&&l-d>n;if((!e||o)&&((m||h)&&s>n||s>=t))throw Error(`Stall timeout exceeded: ${s} ms`);if(a&&s%r===0){let t=this.normalizeLiveOffset(-1*this.livePositionFromPlayer$.getValue()*1e3);!o&&e?(this.liveWasInterrupted=!0,this.updateManifestUrlWithTimeOffset(t),this.updateManifest()):this.seekLive(t).catch(e=>{this.error$.next({id:`stallIntervalCallback`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`stallIntervalCallback failed`,thrown:e})}),c.liveLastOffset=t}else{let e=this.element.currentTime*1e3;this.videoBufferManager?.maintain(e),this.audioBufferManager?.maintain(e),c.position=e}this.tracer.log(`stallIntervalCallback`,K.flattenObject(c))},e=>{this.error$.next({id:`StallWatchdogCallback`,category:K.ErrorCategory.NETWORK,message:`Can't restore DASH after stall.`,thrown:e})}),this.subscriptionRemovable.add(this.stallWatchdogSubscription)})),this.tick()}switchRepresentation(e,t,n=!1){var r=this;return a(function*(){let i={video:r.videoBufferManager,audio:r.audioBufferManager,text:null}[e];return r.tuning.alwaysAbortPreviousSwitch?i?.switchToWithPreviousAbort(t,n):r.tuning.useNewSwitchTo?r.currentStallDuration$.getValue()>0?i?.switchToWithPreviousAbort(t,n):i?.switchTo(t,n):i?.switchToOld(t,n)})()}seek(e,t){var n=this;return a(function*(){K.assertNonNullable(n.element),K.assertNonNullable(n.videoBufferManager);let r;r=t||n.element.duration*1e3<=n.tuning.dashSeekInSegmentDurationThreshold||Math.abs(n.element.currentTime*1e3-e)<=n.tuning.dashSeekInSegmentAlwaysSeekDelta?e:Math.max(n.videoBufferManager.findSegmentStartTime(e)??e,n.audioBufferManager?.findSegmentStartTime(e)??e),n.warmUpMediaSourceIfNeeded(r),!bc(n.element.buffered,r)&&(yield Promise.all([n.videoBufferManager.abort(),n.audioBufferManager?.abort()])),K.isNullable(n.element)||K.isNullable(n.videoBufferManager)||(n.videoBufferManager.maintain(r),n.audioBufferManager?.maintain(r),n.element.currentTime=r/1e3,n.tracer.log(`seek`,K.flattenObject({requestedPosition:e,forcePrecise:t,position:r})))})()}warmUpMediaSourceIfNeeded(e=this.element?.currentTime){K.isNonNullable(this.element)&&K.isNonNullable(this.source)&&K.isNonNullable(e)&&this.source?.readyState===`ended`&&this.element.duration*1e3-e>this.tuning.dash.seekBiasInTheEnd&&this.bufferManagers.forEach(e=>e.warmUpMediaSource())}get isStreamEnded(){return this.source?.readyState===`ended`}stop(){this.tracer.log(`stop`),this.element?.querySelectorAll(`source`).forEach(e=>{URL.revokeObjectURL(e.src),e.remove()}),this.element=null,this.source=null,this.manifest=null,this.currentVideoRepresentation$.next(void 0),this.videoBufferManager?.destroy(),this.videoBufferManager=null,this.audioBufferManager?.destroy(),this.audioBufferManager=null,this.bufferManagers=[],this.state$.setState(`none`)}getForwardBufferRepresentations(e){return e===`video`?this.videoBufferManager?.getForwardBufferRepresentations():this.audioBufferManager?.getForwardBufferRepresentations()}getActiveVideoSegmentProgress(){return this.videoBufferManager?.getActiveSegmentProgress()}getMpdVideoSegmentDuration(){return this.videoBufferManager?.getMpdSegmentDuration()}setBufferTarget(e){for(let t of this.bufferManagers)t.setTarget(e)}getStreams(){return this.manifest?.streams}getCodecs(){return this.manifest?.codecs}setPreloadOnly(e){for(let t of this.bufferManagers)t.setPreloadOnly(e)}destroy(){this.subscription.unsubscribe(),this.subscriptionRemovable.unsubscribe(),this.representationSubscription.unsubscribe(),this.timeoutSourceOpenId&&clearTimeout(this.timeoutSourceOpenId),this.destroyController.abort(),this.fetcher.destroy(),this.stop(),this.source?.readyState===`open`&&Array.from(this.source.sourceBuffers).every(e=>!e.updating)&&this.source.endOfStream(),this.source=null,this.tracer.end()}initTracerSubscription(){let e=K.getTraceSubscriptionMethod(this.tracer.error.bind(this.tracer));this.subscription.add(this.error$.subscribe(e(`error`)))}isManualDecreasePlaybackInLive(){if(!this.element||!this.isLive$.getValue())return!1;let e=1-this.element.playbackRate;return Number(e.toFixed(2))>Number(this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup.toFixed(2))}normalizeLiveOffset(e){return Math.trunc(e/1e3)*1e3}updateLive(){var e=this;return a(function*(){e.isUpdatingLive=!0,e.manifest=yield e.updateManifest(),e.manifest&&(e.bufferManagers.forEach(t=>t.updateLive(e.manifest)),e.liveTextManager?.updateLive(e.manifest)),e.isUpdatingLive=!1})()}jumpGap(){if(!this.element||!this.videoBufferManager)return;let e=this.videoBufferManager.getDebugBufferState();if(!e)return;let t=this.isActiveLive$.getValue()&&this.isLowLatency$.getValue(),n={isJumpGapAfterSeekLive:this.isJumpGapAfterSeekLive,isActiveLowLatency:t,initialCurrentTime:this.element.currentTime},{usePersistentGaps:r}=this.tuning.dash;this.isJumpGapAfterSeekLive&&!t&&this.element.currentTime>e.to&&(this.isJumpGapAfterSeekLive=!1,this.element.currentTime=0);let i=this.element.currentTime*1e3,a=[],s=this.element.readyState===1?this.tuning.endGapTolerance:0;for(let e of this.bufferManagers)for(let t of e.gaps)(r&&t.persistent||e.playingRepresentation$.getValue()===t.representation)&&t.from-s<=i&&t.to+s>i&&(this.element.duration*1e3-t.to<this.tuning.endGapTolerance?a.push(1/0):a.push(t.to));if(a.length){let e=Math.max(...a)+10;this.gapWatchdogSubscription.unsubscribe(),this.gapWatchdogActive=!1,e===1/0?this.forceEnded$.next():(this.element.currentTime=e/1e3,n=o(o({},n),{},{gapEnds:a,jumpTo:e,resultCurrentTime:this.element.currentTime}),this.tracer.log(`jumpGap`,K.flattenObject(n)))}}calculateDurationFromSegments(){return Math.max(this.videoBufferManager?.calculateDurationFromSegments()||0,this.audioBufferManager?.calculateDurationFromSegments()||0)}isAnyBufferUpdating(){return!this.source||this.source.readyState!==`open`?!1:Array.from(this.source.sourceBuffers).some(e=>e.updating)}updateSourceDurationFromSegments(){if(!this.source||this.source.readyState!==`open`||this.isLive$.getValue()||!this.tuning.useDurationFromSegments)return;let e=e=>{this.updateDurationError$.next({id:`updateDuration`,category:K.ErrorCategory.VIDEO_PIPELINE,message:"Duration can`t be updated",thrown:e})};try{if(!this.isAnyBufferUpdating()){this.source.duration=this.calculateDurationFromSegments()/1e3;return}}catch(t){e(t);return}let t=new K.Subscription;t.add(K.merge(...this.bufferManagers.map(e=>e.updateEnd$)).subscribe(()=>{if(!this.isAnyBufferUpdating()){t.unsubscribe();try{this.source&&(this.source.duration=this.calculateDurationFromSegments()/1e3)}catch(t){e(t)}}}))}}class cl{constructor(e){i(this,`scene3D`,void 0),i(this,`subscription`,new G.Subscription),i(this,`volumeSubscription`,new G.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`allocation`,void 0),i(this,`observableVideo`,null),i(this,`player`,void 0),i(this,`params`,void 0),i(this,`tracer`,void 0),i(this,`textTracksManager`,null),i(this,`droppedFramesManager`,new dr),i(this,`stallsManager`,new di),i(this,`elementSizeManager`,new pi),i(this,`abrManager`,new Oa),i(this,`failedVideoTrack`,void 0),i(this,`videoTracksMap`,new Map),i(this,`audioTracksMap`,new Map),i(this,`textTracksMap`,new Map),i(this,`videoStreamsMap`,new Map),i(this,`audioStreamsMap`,new Map),i(this,`videoTrackSwitchHistory`,new hn),i(this,`audioTrackSwitchHistory`,new hn),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(!this.videoState.getTransition()){if(r.state===`requested`&&n?.to!==`paused`&&e!==`stopped`&&t!==`stopped`&&this.seek(r.position,r.forcePrecise),t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.player.stop(),this.allocation.target.load(),this.params.output.position$.next(0),this.params.output.duration$.next(1/0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}switch(e){case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();return;case`ready`:t===`paused`?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`ready`&&k(this.params.desiredState.playbackState,`ready`);return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):t===`playing`&&this.allocation.target.paused?this.playIfAllowed():n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`paused`&&k(this.params.desiredState.playbackState,`paused`);return;default:return G.assertNever(e)}}}),i(this,`init3DScene`,e=>{if(this.scene3D)return;let t=this.params.allocation.parent,n=this.allocation.video;if(!t||!n)return;this.scene3D=new ni(t,n,{fov:this.params.tuning.spherical.fov,orientation:this.params.tuning.spherical.orientation||{x:e.projectionData?.pose.yaw||0,y:e.projectionData?.pose.pitch||0,z:e.projectionData?.pose.roll||0},rotationSpeed:this.params.tuning.spherical.rotationSpeed,maxYawAngle:this.params.tuning.spherical.maxYawAngle,rotationSpeedCorrection:this.params.tuning.spherical.rotationSpeedCorrection,degreeToPixelCorrection:this.params.tuning.spherical.degreeToPixelCorrection,speedFadeTime:this.params.tuning.spherical.speedFadeTime,speedFadeThreshold:this.params.tuning.spherical.speedFadeThreshold});let r=this.elementSizeManager.getValue();r&&this.scene3D.setViewportSize(r.width,r.height)}),i(this,`destroy3DScene`,()=>{this.scene3D&&=(this.scene3D.destroy(),void 0)}),e.tuning.disableSubtitles||(this.textTracksManager=new Bt(e.source.url)),this.params=e,this.allocation=Lr(e.allocation,e.tuning),this.tracer=e.dependencies.tracer.createComponentTracer(this.constructor.name),this.params.output.element$.next(this.allocation.video??void 0),this.params.output.availableVideoTracks$.next([]),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.output.hostname$.next(jn(this.params.source.url)),this.params.output.isLive$.next(!1),this.params.output.autoVideoTrackLimitingAvailable$.next(!0),this.params.output.availableTextTracks$.next([]),this.params.desiredState.internalTextTracks.setState([]),this.player=new sl({throughputEstimator:this.params.dependencies.throughputEstimator,tuning:this.params.tuning,compatibilityMode:this.params.source.compatibilityMode,tracer:this.tracer,forceVideoCodec:this.params.forceVideoCodec,isOnDemand:this.params.isOnDemand||!1,dashMaxTvVideoQuality:this.params.dashMaxTvVideoQuality}),this.subscribe()}getProviderSubscriptionInfo(){let{output:e,desiredState:t}=this.params;G.isNullable(this.observableVideo)&&(this.observableVideo=Jt(this.allocation.target),this.subscription.add(()=>this.observableVideo?.destroy()));let n=this.constructor.name,r=t=>{e.error$.next({id:n,category:G.ErrorCategory.WTF,message:`${n} internal logic error`,thrown:t})};return{output:e,desiredState:t,observableVideo:this.observableVideo,genericErrorListener:r,connect:(e,t)=>this.subscription.add(e.subscribe(t,r))}}subscribe(){var e=this;let{output:t,desiredState:n,observableVideo:r,genericErrorListener:i,connect:s}=this.getProviderSubscriptionInfo();G.isNonNullable(this.params.failedVideoTrack)&&(this.failedVideoTrack=this.params.failedVideoTrack,this.subscription.add(G.timeout(this.params.tuning.dash.videoTrackBanAfterProviderFail).subscribe(()=>this.failedVideoTrack=null)));let c=this.allocation.video;c&&this.subscription.add(this.params.output.availableVideoTracks$.pipe(G.filter(e=>!!e.length),G.once()).subscribe(e=>{this.droppedFramesManager.connect({logger:this.params.dependencies.logger,video:c,droppedFramesChecker:this.params.tuning.droppedFramesChecker,isAuto:this.params.desiredState.autoVideoTrackSwitching,playing$:r.playing$,pause$:r.pause$,tracks:e})}));let l=this.params.desiredState.seekState.stateChangeEnded$.pipe(G.map(e=>e.to.state!==`none`),G.filterChanged());this.abrManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,throughputVariance$:this.params.dependencies.throughputEstimator.throughputVariance$,tuning:this.params.tuning,failedVideoTrack:this.params.failedVideoTrack,element:this.allocation.target,abrLogger:this.params.dependencies.abrLogger}),this.stallsManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,tuning:this.params.tuning.stallsManager,abrParams:this.params.tuning.autoTrackSelection,isBuffering$:r.isBuffering$,looped$:r.looped$,playing$:r.playing$,duration:this.allocation.target.duration}),s(r.ended$,t.endedEvent$),s(r.looped$,t.loopedEvent$),s(r.error$,t.error$),s(r.isBuffering$,t.isBuffering$),s(r.currentBuffer$,t.currentBuffer$),s(r.currentBuffer$,t.currentNativeBuffer$),s(r.playing$,t.firstFrameEvent$),s(r.canplay$,t.canplay$),s(r.playedTime$,t.playedTime$),s(r.inPiP$,t.inPiP$),s(r.inFullscreen$,t.inFullscreen$),s(r.loadedMetadata$,t.loadedMetadataEvent$),s(this.player.error$,t.error$),s(this.player.fetcherRecoverableError$,t.fetcherRecoverableError$),s(this.player.updateDurationError$,t.updateDurationError$),s(this.player.fetcherError$,t.fetcherError$),s(this.player.videoLastDataObtainedTimestamp$,t.videoLastDataObtainedTimestamp$),s(this.player.manifestRequested$,t.manifestRequested$),s(this.player.firstBytesManifest$,t.firstBytesManifest$),s(this.player.manifestReceived$,t.manifestReceived$),s(this.player.firstBytesRequested$,t.firstBytesRequested$),s(this.player.firstBytesReceived$,t.firstBytesReceived$),s(this.player.lastConnectionType$,t.httpConnectionType$),s(this.player.lastConnectionReused$,t.httpConnectionReused$),s(this.player.lastConnectionMetrics$,t.httpConnectionMetrics$),s(this.player.lastDownloadMetrics$,t.httpDownloadMetrics$),s(this.player.isLive$,t.isLive$),s(this.player.lastRequestFirstBytes$.pipe(G.filter(G.isNonNullable),G.once()),t.firstBytesEvent$),s(this.stallsManager.severeStallOccurred$,t.severeStallOccurred$),s(this.videoState.stateChangeEnded$.pipe(G.map(e=>e.to)),this.params.output.playbackState$),this.subscription.add(r.looped$.subscribe(()=>this.player.warmUpMediaSourceIfNeeded(),i)),this.subscription.add(r.seeked$.subscribe(t.seekedEvent$,i)),this.subscription.add(Nt(this.allocation.target,n.isLooped,i)),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(e=>{this.volumeSubscription.unsubscribe(),e?this.volumeSubscription.add(n.volume.stateChangeStarted$.subscribe(({to:e})=>this.params.output.volume$.next(e),i)):this.volumeSubscription.add(r.volumeState$.subscribe(this.params.output.volume$,i))})),hi({subscription:this.subscription,desiredState:n,videoElement$:this.params.output.element$,observableVideo:r}),this.subscription.add(Pt(this.allocation.target,n.volume,r.volumeState$,i,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.subscription.add(Ft(this.allocation.target,n.playbackRate,r.playbackRateState$,i)),this.allocation.video&&this.elementSizeManager.connect({video:this.allocation.video,observableVideo:r}),s(hr(this.allocation.target,{threshold:this.params.tuning.autoTrackSelection.activeVideoAreaThreshold}),t.elementVisible$),this.subscription.add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`),k(n.playbackState,`playing`),this.scene3D&&this.scene3D.play()},i)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)},i)).add(r.canplay$.subscribe(()=>{this.videoState.getState()===`playing`&&!this.allocation.target.ended&&this.playIfAllowed()},i)),this.params.tuning.changePlaybackStateToPausedWhenEnded&&this.subscription.add(r.ended$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)})),this.subscription.add(this.player.state$.stateChangeEnded$.subscribe(({to:e})=>{if(e===`manifest_ready`){this.videoTracksMap=new Map,this.audioTracksMap=new Map,this.textTracksMap=new Map;let e=this.player.getStreams(),t=this.player.getCodecs();if(G.assertNonNullable(e,`Manifest not loaded or empty`),!this.params.tuning.isAudioDisabled){let t=[];for(let n of e.audio){t.push(Ts(n));let e=[];for(let t of n.representations){let r=Ss(t);e.push(r),this.audioTracksMap.set(r,{stream:n,representation:t})}this.audioStreamsMap.set(n,e)}this.params.output.availableAudioStreams$.next(t)}let n=[];for(let t of e.video){n.push(Es(t));let e=[];for(let n of t.representations){let r=xs(o(o({},n),{},{streamId:t.id}));r&&(e.push(r),this.videoTracksMap.set(r,{stream:t,representation:n}))}this.videoStreamsMap.set(t,e)}this.params.output.availableVideoStreams$.next(n);for(let t of e.text)for(let e of t.representations){let n=Cs(t,e);this.textTracksMap.set(n,{stream:t,representation:e})}this.params.output.availableVideoTracks$.next(Array.from(this.videoTracksMap.keys())),this.params.output.availableAudioTracks$.next(Array.from(this.audioTracksMap.keys())),this.params.output.isAudioAvailable$.next(!!this.audioTracksMap.size),t?.video&&this.params.output.availableVideoCodecs$.next(t.video),t?.audio&&this.params.output.availableAudioCodecs$.next(t.audio),this.audioTracksMap.size&&this.textTracksMap.size&&this.params.desiredState.internalTextTracks.startTransitionTo(Array.from(this.textTracksMap.keys()))}else e===`representations_ready`&&(this.videoState.setState(`ready`),this.player.initBuffer())},i));let u=G.merge(this.player.currentStallDuration$,this.player.state$.stateChangeEnded$,n.videoTrack.stateChangeStarted$,n.autoVideoTrackSwitching.transitionStarted$,this.params.dependencies.throughputEstimator.rttAdjustedThroughput$,n.autoVideoTrackLimits.stateChangeStarted$,this.elementSizeManager.getObservable(),this.params.output.elementVisible$,this.droppedFramesManager.onDroopedVideoFramesLimit$,G.fromEvent(this.allocation.target,`progress`)).pipe(G.filter(()=>this.videoTracksMap.size>0)),{abrThrottle:d}=this.params.tuning.dash;d&&(u=u.pipe(G.throttle(d))),this.subscription.add(u.subscribe(a(function*(){let t=e.player.state$.getState(),r=e.player.state$.getTransition();if(t!==`manifest_ready`&&t!==`running`||r)return;n.autoVideoTrackSwitching.getTransition()&&n.autoVideoTrackSwitching.setState(n.autoVideoTrackSwitching.getState());let i=e.selectVideoAudioRepresentations();if(!i)return;let[a,o]=i,s=[...e.videoTracksMap.keys()].find(t=>e.videoTracksMap.get(t)?.representation.id===a.id);G.isNonNullable(s)&&(e.stallsManager.lastVideoTrackSelected=s);let c=e.params.desiredState.autoVideoTrackLimits.getTransition();if(c&&e.params.output.autoVideoTrackLimits$.next(c.to),t===`manifest_ready`)yield e.player.initRepresentations(a.id,o?.id,e.params.sourceHls);else if(yield e.player.switchRepresentation(`video`,a.id),o){let t=!!n.audioStream.getTransition();yield e.player.switchRepresentation(`audio`,o.id,t)}}),i)),this.subscription.add(G.combine({videoState:this.videoState.stateChangeEnded$,autoVideoTrackState:G.merge(G.observableFrom([n.autoVideoTrackSwitching.getState()]),n.autoVideoTrackSwitching.stateChangeEnded$.pipe(G.map(e=>e.to)))}).pipe(G.map(({videoState:e,autoVideoTrackState:t})=>e.to!==`stopped`&&t),G.filterChanged()).subscribe(e=>this.player.setSmartRepresentationSwitch(e))),this.subscription.add(n.cameraOrientation.stateChangeEnded$.subscribe(({to:e})=>{this.scene3D&&e&&this.scene3D.pointCameraTo(e.x,e.y)})),this.subscription.add(this.elementSizeManager.subscribe(e=>{this.scene3D&&e&&this.scene3D.setViewportSize(e.width,e.height)})),this.subscription.add(this.player.currentVideoRepresentation$.pipe(G.filterChanged()).subscribe(e=>{let n=[...this.videoTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentVideoTrack$.next(void 0),t.currentVideoStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.videoStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.videoStream.setState(a.to),t.currentVideoTrack$.next(r),t.currentVideoStream$.next(Es(i)),this.player.updateSourceDurationFromSegments()},i)),this.subscription.add(this.player.currentAudioRepresentation$.pipe(G.filterChanged()).subscribe(e=>{let n=[...this.audioTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentAudioStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.audioStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.audioStream.setState(a.to),t.currentAudioStream$.next(Ts(i)),this.player.updateSourceDurationFromSegments()},i)),this.subscription.add(this.player.currentVideoRepresentationInit$.subscribe(e=>{if(e?.is3dVideo&&this.params.tuning.spherical?.enabled)try{this.init3DScene(e),t.is3DVideo$.next(!0)}catch(e){t.warning$.next({id:`DashProvider`,message:`DashProvider could not initialize 3D-scene: ${e}`})}else this.destroy3DScene(),this.params.tuning.spherical?.enabled&&t.is3DVideo$.next(!1)},i)),this.subscription.add(this.player.currentVideoSegmentLength$.subscribe(t.currentVideoSegmentLength$,i)),this.subscription.add(this.player.currentAudioSegmentLength$.subscribe(t.currentAudioSegmentLength$,i)),this.allocation.video&&this.textTracksManager?.connect(this.allocation.video,n,t);let f=n.playbackState.stateChangeStarted$.pipe(G.map(({to:e})=>e===`ready`),G.filterChanged());this.subscription.add(G.merge(f,n.autoVideoTrackSwitching.stateChangeStarted$,this.player.state$.stateChangeEnded$,G.observableFrom([`init`])).subscribe(()=>{let e=n.autoVideoTrackSwitching.getState(),t=n.playbackState.getState()===`ready`?this.params.tuning.dash.forwardBufferTargetPreload:e?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;this.player.setBufferTarget(t)})),this.subscription.add(G.merge(f,this.player.state$.stateChangeEnded$,G.observableFrom([`init`])).subscribe(()=>this.player.setPreloadOnly(n.playbackState.getState()===`ready`)));let p=G.merge(n.playbackState.stateChangeStarted$,n.videoTrack.stateChangeStarted$,n.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,G.observableFrom([`init`])).pipe(G.debounce(0));this.subscription.add(p.subscribe(this.syncPlayback,i))}selectVideoAudioRepresentations(){if(this.player.isStreamEnded)return;let e=this.params.tuning.useNewAutoSelectVideoTrack?xn:bn,t=this.params.tuning.useNewAutoSelectVideoTrack?An:kn,n=this.params.tuning.useNewAutoSelectVideoTrack?Dn:On,{desiredState:r,output:i}=this.params,a=r.autoVideoTrackSwitching.getState(),s=r.videoTrack.getState()?.id,c=[...this.videoTracksMap.keys()].find(({id:e})=>e===s),l=i.currentVideoTrack$.getValue(),u=r.videoStream.getState()??(c&&this.videoTracksMap.get(c)?.stream)??this.videoStreamsMap.size===1?this.videoStreamsMap.keys().next().value:void 0;if(!u)return;let d=[...this.videoStreamsMap.keys()].find(({id:e})=>e===u.id),f=d&&this.videoStreamsMap.get(d);if(!f)return;let p=Ws(this.allocation.target.buffered,this.allocation.target.currentTime*1e3),m;m=this.player.isActiveLive$.getValue()?this.player.isLowLatency$.getValue()?this.params.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.params.tuning.dashCmafLive.normalizedLiveMinBufferSize:this.player.isLive$.getValue()?this.params.tuning.dashCmafLive.normalizedTargetMinBufferSize:a?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;let h=(this.allocation.target.duration*1e3||1/0)-this.allocation.target.currentTime*1e3,g=Math.min(p/Math.min(m,h||1/0),1),_=r.audioStream.getState()??(this.audioStreamsMap.size===1?this.audioStreamsMap.keys().next().value:void 0),v=[...this.audioStreamsMap.keys()].find(({id:e})=>e===_?.id)??this.audioStreamsMap.keys().next().value,y=0;if(v){if(c&&!a){let t=e(c,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}if(l){let t=e(l,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}}let b=this.player.isLive$.getValue(),x=this.allocation.target.duration*1e3,S=!b&&Number.isFinite(x)&&x>0?Math.max(0,x-this.allocation.target.currentTime*1e3):void 0,C=this.params.tuning.dash.useAbrPhases?{isLive:b,remainingDurationMs:S,mpdSegmentDurationMs:this.player.getMpdVideoSegmentDuration()}:{};this.abrManager.updateContext(o({isAuto:a,videoTracks:f,audioTracks:v?this.audioStreamsMap.get(v)??[]:[],currentVideoTrack:l,desiredVideoTrack:c,limits:this.params.desiredState.autoVideoTrackLimits.getState(),forwardBufferHealth:g,forwardBufferDuration:p,forwardVideoBufferRepresentations:this.player.getForwardBufferRepresentations(`video`),forwardAudioBufferRepresentations:this.player.getForwardBufferRepresentations(`audio`),videoSegmentLoadProgress:this.player.getActiveVideoSegmentProgress()},C));let w=c,T;this.params.tuning.dash.useNewAbr?(w=this.abrManager.autoSelectTrack(`video`),T=v&&this.abrManager.autoSelectTrack(`audio`)):((a||!w)&&(w=n(f,{container:this.elementSizeManager.getValue(),panelSize:this.params.panelSize,estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),tuning:this.stallsManager.abrTuningParams,limits:this.params.desiredState.autoVideoTrackLimits.getState(),reserve:y,forwardBufferHealth:g,current:l,failedVideoTrack:this.failedVideoTrack,visible:this.params.output.elementVisible$.getValue(),history:this.videoTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,droppedVideoMaxQualityLimit:this.droppedFramesManager.droppedVideoMaxQualityLimit,stallsVideoMaxQualityLimit:this.stallsManager.videoMaxQualityLimit,stallsPredictedThroughput:this.stallsManager.predictedThroughput,abrLogger:this.params.dependencies.abrLogger})),T=v&&t(w,f,this.audioStreamsMap.get(v)??[],{estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),stallsPredictedThroughput:this.stallsManager.predictedThroughput,tuning:this.stallsManager.abrTuningParams,forwardBufferHealth:g,history:this.audioTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,abrLogger:this.params.dependencies.abrLogger}));let E=this.videoTracksMap.get(w)?.representation,ee=T&&this.audioTracksMap.get(T)?.representation;if(E&&ee)return[E,ee];if(E&&!ee&&this.audioTracksMap.size===0)return[E,void 0]}prepare(e=0){this.player.initManifest(this.allocation.target,this.params.source.url,e)}playIfAllowed(){let e=Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}),t=e=>{e||(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`,!0))},n=e=>{this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:G.ErrorCategory.DOM,thrown:e})};this.params.tuning.ignoreForcePlayResultWhenProviderChanged?this.subscription.add(G.observableFrom(e).subscribe(t,n)):e.then(t,n)}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.droppedFramesManager.destroy(),this.stallsManager.destroy(),this.abrManager.destroy(),this.elementSizeManager.destroy(),this.destroy3DScene(),this.textTracksManager?.destroy(),this.player.destroy(),this.params.output.element$.next(void 0),this.params.output.currentVideoStream$.next(void 0),Dt(this.allocation.target,this.params.tuning),this.tracer.end()}}class ll extends cl{subscribe(){super.subscribe();let{output:e,observableVideo:t,connect:n}=this.getProviderSubscriptionInfo();n(t.timeUpdate$,e.position$),n(t.durationChange$,e.duration$)}seek(e,t){this.params.output.willSeekEvent$.next(),this.player.seek(e,t)}}var ul=require(`@vkontakte/videoplayer-shared`);class dl extends cl{constructor(e){super(e),this.textTracksManager?.destroy()}subscribe(){super.subscribe();let e=!1,t=-1,{output:n,observableVideo:r,desiredState:i,connect:a}=this.getProviderSubscriptionInfo();this.params.output.position$.next(0),this.params.output.isLive$.next(!0),this.params.output.canPlayLiveTailBuffer$.next(!0),a(r.timeUpdate$,n.liveBufferTime$),a(this.player.liveSeekableDuration$,n.duration$),a(this.player.liveLatency$,n.liveLatency$);let o=new ul.ValueSubject(1);a(r.playbackRateState$,o),(this.params.tuning.dashCmafLive.catchupLiveForMutedInactiveTab||this.params.tuning.live.catchupLiveForMutedInactiveTab)&&this.subscription.add(n.elementVisible$.pipe(ul.filterChanged()).subscribe(t=>{let r=n.position$.getValue(),i=n.volume$.getValue(),a=!i.volume||i.muted;!t&&!r&&a?e=!0:t&&e&&(this.seek(0),e=!1)})),this.subscription.add(this.params.output.position$.subscribe(this.player.livePositionFromPlayer$)).add(i.isLowLatency.stateChangeEnded$.pipe(ul.map(e=>e.to)).subscribe(this.player.isLowLatency$)).add(ul.combine({liveBufferTime:n.liveBufferTime$,liveAvailabilityStartTime:this.player.liveAvailabilityStartTime$}).pipe(ul.map(({liveBufferTime:e,liveAvailabilityStartTime:n})=>e&&n?e*1e3+n+t:void 0)).subscribe(n.liveTime$)).add(ul.combine({liveDuration:this.player.liveDuration$,liveStreamStatus:this.player.liveStreamStatus$,playbackRate:ul.merge(r.playbackRateState$,new ul.ValueSubject(1))}).pipe(ul.filter(({liveStreamStatus:e,liveDuration:t})=>e===`active`&&!!t)).subscribe(({liveDuration:e,playbackRate:r})=>{let i=n.liveBufferTime$.getValue(),a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;a||r<1-o||this.allocation.target.paused||ul.isNullable(i)||(t=e-i)})).add(ul.combine({time:n.liveBufferTime$,liveDuration:this.player.liveDuration$,playbackRate:ul.merge(r.playbackRateState$,new ul.ValueSubject(1))}).pipe(ul.filterChanged((e,t)=>this.player.liveStreamStatus$.getValue()===`active`?e.liveDuration===t.liveDuration:e.time===t.time)).subscribe(({time:e,liveDuration:r,playbackRate:i})=>{let a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;if(!a&&!this.allocation.target.paused&&i>=1-o||ul.isNullable(e)||ul.isNullable(r))return;let s=-1*(r-e-t);n.position$.next(Math.min(s,0))})).add(this.player.currentLiveTextRepresentation$.subscribe(e=>{if(e){let t=ws(e);this.params.output.availableTextTracks$.next([t])}})),this.params.tuning.dashCmafLive.externalStopControl||this.subscription.add(this.player.liveStreamStatus$.pipe(ul.filter(e=>ul.isNonNullable(e))).subscribe(e=>n.isLiveEnded$.next(e===`unpublished`&&n.position$.getValue()===0)))}seek(e){this.params.output.willSeekEvent$.next();let t=-e,n=Math.trunc(t/1e3<=Math.abs(this.params.output.duration$.getValue())?t:0);this.player.seekLive(n).then(()=>{this.params.output.position$.next(e/1e3)})}}var fl=require(`@vkontakte/videoplayer-shared`),pl=require(`@vkontakte/videoplayer-shared`),ml=`X-Playback-Duration`,hl=function(){var e=a(function*(e){let t=yield pl.fetchPolyfilled(e),n=yield t.text(),r=/#EXT-X-VK-PLAYBACK-DURATION:(\d+)/m.exec(n)?.[1];return r?parseInt(r,10):t.headers.has(ml)?parseInt(t.headers.get(ml),10):void 0});return function(t){return e.apply(this,arguments)}}(),Y=require(`@vkontakte/videoplayer-shared`),gl=require(`@vkontakte/videoplayer-shared`),_l=require(`@vkontakte/videoplayer-shared`),vl=require(`@vkontakte/videoplayer-shared`),yl=e=>{let t=null;if(e.QUALITY&&(t=Xt(e.QUALITY)),!t&&e.RESOLUTION){let[n,r]=e.RESOLUTION.split(`x`).map(e=>parseInt(e,10));t=vl.videoSizeToQuality({width:n,height:r})}return t??null},bl=(e,t)=>{let n=e.split(`
|
|
246
|
-
`),r=[],i=[];for(let e=0;e<n.length;e++){let
|
|
245
|
+
`})|(?<privateuse2>${e}))$`.replace(/[\s\t\n]/g,``);return new RegExp(t,`i`)}var yo=e=>{if(!e?.startsWith(`P`))return;let t=(e,t)=>{let n=e?parseFloat(e.replace(`,`,`.`)):NaN;return(isNaN(n)?0:n)*t},n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/.exec(e),r=n?.[1]===`-`?-1:1,i={days:t(n?.[5],r),hours:t(n?.[6],r),minutes:t(n?.[7],r),seconds:t(n?.[8],r)};return i.days*24*60*60*1e3+i.hours*60*60*1e3+i.minutes*60*1e3+i.seconds*1e3},bo=(e,t)=>{let n=e;n=ao.stringReplaceAll(n,`$$`,`$`);let r={RepresentationID:t.representationId,Number:t.segmentNumber,Bandwidth:t.bandwidth,Time:t.segmentTime};for(let[e,t]of oo.objectEntries(r)){let r=RegExp(`\\$${e}(?:%0(\\d+)d)?\\$`,`g`);n=ao.stringReplaceAll(n,r,(e,n)=>mo.isNullable(t)?e:mo.isNullable(n)?t:so.stringPadStart(t,parseInt(n,10),`0`))}return n},xo=(e,t)=>{let n=new DOMParser().parseFromString(e,`application/xml`),r={video:[],audio:[],text:[]},i=n.children[0],a=Array.from(i.querySelectorAll(`MPD > BaseURL`).values()).map(e=>e.textContent?.trim()??``),s=co.arrayAt(a,0)??``,c=i.getAttribute(`type`)===`dynamic`,l=i.getAttribute(`availabilityStartTime`),u=i.getAttribute(`publishTime`),d=i.getElementsByTagName(`vk:Attrs`)[0],f=d?.getElementsByTagName(`vk:XLatestSegmentPublishTime`)[0].textContent,p=d?.getElementsByTagName(`vk:XStreamIsLive`)[0].textContent,m=d?.getElementsByTagName(`vk:XStreamIsUnpublished`)[0].textContent,h=d?.getElementsByTagName(`vk:XPlaybackDuration`)[0].textContent,g;c&&(g={availabilityStartTime:l?new Date(l).getTime():0,publishTime:u?new Date(u).getTime():0,latestSegmentPublishTime:f?new Date(f).getTime():0,streamIsAlive:p===`yes`,streamIsUnpublished:m===`yes`});let _,v=i.getAttribute(`mediaPresentationDuration`),y=[...i.getElementsByTagName(`Period`)],b=y.reduce((e,t)=>o(o({},e),{},{[t.id]:t.children}),{}),x=y.reduce((e,t)=>o(o({},e),{},{[t.id]:t.getAttribute(`duration`)}),{});v?_=yo(v):lo.objectValues(x).filter(e=>e).length&&!c?_=lo.objectValues(x).reduce((e,t)=>e+(yo(t)??0),0):h&&(_=parseInt(h,10));let S=0,C=i.getAttribute(`profiles`)?.split(`,`)??[];for(let e of y.map(e=>e.id))for(let n of b[e]){var w;let e=n.getAttribute(`id`)??`id`+(S++).toString(10),i=n.getAttribute(`mimeType`)??``,a=n.getAttribute(`codecs`)??``,c=n.getAttribute(`contentType`)??i?.split(`/`)[0],l=n.getAttribute(`profiles`)?.split(`,`)??[],u=_o(n.getAttribute(`lang`)??``)??{},d=((w=n.querySelector(`Label`))==null||(w=w.textContent)==null?void 0:w.trim())??void 0,f=n.querySelectorAll(`Representation`),p=n.querySelector(`SegmentTemplate`),m=n.querySelector(`Role`)?.getAttribute(`value`)??void 0,h=n.querySelector(`AudioChannelConfiguration`)?.getAttribute(`value`),g=mo.isNonNullable(h)?parseInt(h,10):void 0,v=c,y={id:e,language:u.language,isDefault:m===`main`,label:d,codecs:a,hdr:v===`video`&&po(a),mime:i,channels:g,representations:[]};for(let e of f){var T;let r=e.getAttribute(`lang`)??void 0,f=d??n.getAttribute(`label`)??e.getAttribute(`label`)??void 0,m=((T=e.querySelector(`BaseURL`))==null||(T=T.textContent)==null?void 0:T.trim())??``,h=new URL(m||s,t).toString(),g=e.getAttribute(`mimeType`)??i,b=e.getAttribute(`codecs`)??a??``,x;if(c===`text`){let t=e.getAttribute(`id`)||``,n=(u.privateuse==null?void 0:uo.arrayIncludes(u.privateuse,`x-auto`))||uo.arrayIncludes(t,`_auto`),r=e.querySelector(`SegmentTemplate`);if(r){let i={representationId:e.getAttribute(`id`)??void 0,bandwidth:e.getAttribute(`bandwidth`)??void 0},a=parseInt(e.getAttribute(`bandwidth`)??``,10)/1e3,s=parseInt(r.getAttribute(`startNumber`)??``,10)??1,c=parseInt(r.getAttribute(`timescale`)??``,10),l=r.querySelectorAll(`SegmentTimeline S`)??[],u=r.getAttribute(`media`);if(!u)continue;let d=[],f=0,p=``,m=0,g=s,v=0;for(let e of l){let t=parseInt(e.getAttribute(`d`)??``,10),n=parseInt(e.getAttribute(`r`)??``,10)||0,r=parseInt(e.getAttribute(`t`)??``,10);v=Number.isFinite(r)?r:v;let a=t/c*1e3,s=v/c*1e3;for(let e=0;e<n+1;e++){let n=bo(u,o(o({},i),{},{segmentNumber:g.toString(10),segmentTime:(v+e*t).toString(10)})),r=(s??0)+e*a,c=r+a;g++,d.push({time:{from:r,to:c},url:n})}v+=(n+1)*t,f+=(n+1)*a}m=v/c*1e3,p=bo(u,o(o({},i),{},{segmentNumber:g.toString(10),segmentTime:v.toString(10)})),x={id:t,kind:`text`,segmentReference:{type:`template`,baseUrl:h,segmentTemplateUrl:u,initUrl:``,totalSegmentsDurationMs:f,segments:d,nextSegmentBeyondManifest:{time:{from:m,to:1/0},url:p},timescale:c},profiles:[],duration:_,bitrate:a,mime:``,codecs:``,width:0,height:0,isAuto:n}}else x={id:t,isAuto:n,kind:`text`,url:h}}else{let t=e.getAttribute(`contentType`)??g?.split(`/`)[0]??c,r=n.getAttribute(`profiles`)?.split(`,`)??[],i=parseInt(e.getAttribute(`width`)??``,10),a=parseInt(e.getAttribute(`height`)??``,10),s=parseInt(e.getAttribute(`bandwidth`)??``,10)/1e3,u=e.getAttribute(`frameRate`)??``,d=e.getAttribute(`quality`)??void 0,f=u?go(u):void 0,m=`${e.getAttribute(`id`)??`id`+(S++).toString(10)}@${t===`video`?`${a}p`:t===`audio`?`${s}Kbps`:b}`,y=[...C,...l,...r],w,T=e.querySelector(`SegmentBase`),E=e.querySelector(`SegmentTemplate`)??p;if(T){let[t,n]=(e.querySelector(`SegmentBase Initialization`)?.getAttribute(`range`)??``).split(`-`).map(e=>parseInt(e,10)),r={from:t,to:n},i=e.querySelector(`SegmentBase`)?.getAttribute(`indexRange`),[a,o]=i?i.split(`-`).map(e=>parseInt(e,10)):[];w={type:`byteRange`,url:h,initRange:r,indexRange:i?{from:a,to:o}:void 0}}else if(E){let t={representationId:e.getAttribute(`id`)??void 0,bandwidth:e.getAttribute(`bandwidth`)??void 0},n=parseInt(E.getAttribute(`timescale`)??``,10),r=E.getAttribute(`initialization`)??``,i=E.getAttribute(`media`),a=parseInt(E.getAttribute(`startNumber`)??``,10)??1,s=bo(r,t);if(!i)throw ReferenceError(`No media attribute in SegmentTemplate`);let c=E.querySelectorAll(`SegmentTimeline S`)??[],l=[],u=0,d=``,f=0;if(c.length){let e=a,r=0;for(let a of c){let s=parseInt(a.getAttribute(`d`)??``,10),c=parseInt(a.getAttribute(`r`)??``,10)||0,d=parseInt(a.getAttribute(`t`)??``,10);r=Number.isFinite(d)?d:r;let f=s/n*1e3,p=r/n*1e3;for(let n=0;n<c+1;n++){let a=bo(i,o(o({},t),{},{segmentNumber:e.toString(10),segmentTime:(r+n*s).toString(10)})),c=(p??0)+n*f,u=c+f;e++,l.push({time:{from:c,to:u},url:a})}r+=(c+1)*s,u+=(c+1)*f}f=r/n*1e3,d=bo(i,o(o({},t),{},{segmentNumber:e.toString(10),segmentTime:r.toString(10)}))}else if(mo.isNonNullable(_)){let e=parseInt(E.getAttribute(`duration`)??``,10)/n*1e3,r=Math.ceil(_/e),a=0;for(let n=1;n<r;n++){let r=bo(i,o(o({},t),{},{segmentNumber:n.toString(10),segmentTime:a.toString(10)}));l.push({time:{from:a,to:a+e},url:r}),a+=e}f=a,d=bo(i,o(o({},t),{},{segmentNumber:r.toString(10),segmentTime:a.toString(10)}))}w={type:`template`,baseUrl:h,segmentTemplateUrl:i,initUrl:s,totalSegmentsDurationMs:u,segments:l,nextSegmentBeyondManifest:{time:{from:f,to:1/0},url:d},timescale:n}}else throw ReferenceError(`Unknown MPD segment referencing type`);if(!t||!g)continue;let ee={video:`video`,audio:`audio`,text:`text`}[t];if(!ee)continue;v||=ee,x={id:m,kind:ee,segmentReference:w,profiles:y,duration:_,bitrate:s,mime:g,codecs:b,width:i,height:a,fps:f,quality:d}}y.language||=r,y.label||=f,y.mime||=g,y.codecs||=b,y.hdr||=v===`video`&&po(b),y.representations.push(x)}if(v){let e=r[v].find(e=>e.id===y.id);if(e&&y.representations.every(e=>e.segmentReference.type===`template`))for(let t of e.representations){let e=y.representations.find(e=>e.id===t.id);if(!e)continue;let n=e.segmentReference,r=t.segmentReference;r.segments.push(...n.segments),r.nextSegmentBeyondManifest=n.nextSegmentBeyondManifest}else r[v].push(y)}}return{duration:_,streams:r,baseUrls:a,live:g}},So=require(`@vkontakte/videoplayer-shared`),Co=require(`@vkontakte/videoplayer-shared`),wo=require(`@vkontakte/videoplayer-shared`),U=require(`@vkontakte/videoplayer-shared`),To=require(`@vkontakte/videoplayer-shared`),Eo=e=>e.valid;class Do{get id(){return this.type}constructor(e,t){i(this,`source`,void 0),i(this,`boxParser`,void 0),i(this,`type`,void 0),i(this,`size`,void 0),i(this,`content`,void 0),i(this,`valid`,void 0),i(this,`children`,void 0),i(this,`cursor`,0),this.source=e,this.boxParser=t,this.children=[];let n=this.readUint32();this.type=this.readString(4),n===1&&(this.cursor+=8);let r=e.byteOffset+this.cursor,a;n===0||n===1?(this.size=void 0,this.valid=!1,a=void 0):n>e.byteLength?(this.size=n,this.valid=!1,a=Math.min(n-this.cursor,e.byteLength-this.cursor)):(this.size=n,this.valid=!0,a=n-this.cursor),this.content=new DataView(e.buffer,r,a)}scanForBoxes(e){return this.boxParser.parse(e)}readString(e,t=`ascii`){let n=new TextDecoder(t).decode(new DataView(this.source.buffer,this.source.byteOffset+this.cursor,e));return this.cursor+=e,n}readUint8(){let e=this.source.getUint8(this.cursor);return this.cursor+=1,e}readUint16(){let e=this.source.getUint16(this.cursor);return this.cursor+=2,e}readUint32(){let e=this.source.getUint32(this.cursor);return this.cursor+=4,e}readUint64(){let e=this.source.getBigInt64(this.cursor);return this.cursor+=8,e}}class Oo extends Do{}var ko=require(`@vkontakte/videoplayer-shared`);class Ao extends Do{constructor(e,t){if(super(e,t),i(this,`userData`,void 0),!this.valid)return;let n=this.readString(16),r=new DataView(this.content.buffer,this.content.byteOffset+16,this.content.byteLength-16);this.userData=this.parseData(n,r)}parseData(e,t){switch(e){case`ondemandlivejson`:{let e=new TextDecoder(`ascii`).decode(t),n=JSON.parse(e);return{received:n[`t-in`],prepared:n[`t-out`]}}default:ko.assertNever(e)}}}class jo extends Do{constructor(e,t){if(super(e,t),i(this,`majorBrand`,void 0),i(this,`minorVersion`,void 0),i(this,`compatibleBrands`,void 0),!this.valid)return;this.compatibleBrands=[],this.majorBrand=this.readString(4),this.minorVersion=this.readUint32();let n=new DataView(this.content.buffer,this.content.byteOffset+8,this.content.byteLength-8);for(let e=0;e<n.byteLength;e+=4){let e=this.readString(4);this.compatibleBrands.push(e)}}}class Mo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class No extends Do{constructor(e,t){if(super(e,t),i(this,`version`,void 0),i(this,`flags`,void 0),!this.valid)return;let n=this.readUint32();this.version=n>>>24,this.flags=n&16777215,this.content=new DataView(this.content.buffer,this.content.byteOffset+4,this.content.byteLength-4)}}class Po extends No{constructor(e,t){super(e,t),i(this,`creationTime`,void 0),i(this,`modificationTime`,void 0),i(this,`timescale`,void 0),i(this,`duration`,void 0),i(this,`rate`,void 0),i(this,`volume`,void 0),this.valid&&(this.creationTime=this.readUint32(),this.modificationTime=this.readUint32(),this.timescale=this.readUint32(),this.duration=this.readUint32(),this.rate=this.readUint32(),this.volume=this.readUint16())}}class Fo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Io extends Do{constructor(e,t){super(e,t),i(this,`data`,void 0),this.data=this.content}}class Lo extends No{get earliestPresentationTime(){return this.earliestPresentationTime32}get firstOffset(){return this.firstOffset32}constructor(e,t){if(super(e,t),i(this,`referenceId`,void 0),i(this,`timescale`,void 0),i(this,`earliestPresentationTime32`,void 0),i(this,`firstOffset32`,void 0),i(this,`earliestPresentationTime64`,void 0),i(this,`firstOffset64`,void 0),i(this,`reserved`,void 0),i(this,`referenceCount`,void 0),i(this,`segments`,void 0),this.valid){this.segments=[],this.referenceId=this.readUint32(),this.timescale=this.readUint32(),this.earliestPresentationTime32=this.readUint32(),this.firstOffset32=this.readUint32(),this.earliestPresentationTime64=0,this.firstOffset64=0,this.referenceCount=this.readUint32()&65535;for(let e=0;e<this.referenceCount;e++){let e=this.readUint32(),t=e>>>31,n=e<<1>>>1,r=this.readUint32();e=this.readUint32();let i=e>>>28,a=e<<3>>>3;this.segments.push({referenceType:t,referencedSize:n,subsegmentDuration:r,SAPType:i,SAPDeltaTime:a})}}}}class Ro extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class zo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Bo extends No{constructor(e,t){if(super(e,t),i(this,`stereoMode`,void 0),this.valid){switch(this.readUint8()){case 0:this.stereoMode=0;break;case 1:this.stereoMode=1;break;case 2:this.stereoMode=2;break;case 3:this.stereoMode=3;break;case 4:this.stereoMode=4;break}this.cursor+=1}}}class Vo extends No{constructor(e,t){super(e,t),i(this,`poseYawDegrees`,void 0),i(this,`posePitchDegrees`,void 0),i(this,`poseRollDegrees`,void 0),this.valid&&(this.poseYawDegrees=this.readUint32(),this.posePitchDegrees=this.readUint32(),this.poseRollDegrees=this.readUint32())}}class Ho extends No{constructor(e,t){super(e,t),i(this,`projectionBoundsTop`,void 0),i(this,`projectionBoundsBottom`,void 0),i(this,`projectionBoundsLeft`,void 0),i(this,`projectionBoundsRight`,void 0),this.valid&&(this.projectionBoundsTop=this.readUint32(),this.projectionBoundsBottom=this.readUint32(),this.projectionBoundsLeft=this.readUint32(),this.projectionBoundsRight=this.readUint32())}}class Uo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Wo extends No{constructor(e,t){super(e,t),i(this,`creationTime`,void 0),i(this,`modificationTime`,void 0),i(this,`trackId`,void 0),i(this,`duration`,void 0),i(this,`layer`,void 0),i(this,`alternateGroup`,void 0),i(this,`volume`,void 0),i(this,`matrix`,void 0),i(this,`width`,void 0),i(this,`height`,void 0),this.creationTime=this.readUint32(),this.modificationTime=this.readUint32(),this.trackId=this.readUint32(),this.cursor+=4,this.duration=this.readUint32(),this.cursor+=8,this.layer=this.readUint16(),this.alternateGroup=this.readUint16(),this.cursor+=2,this.cursor+=2,this.matrix=[[this.readUint32(),this.readUint32(),this.readUint32()],[this.readUint32(),this.readUint32(),this.readUint32()],[this.readUint32(),this.readUint32(),this.readUint32()]],this.width=this.readUint32(),this.height=this.readUint32()}}class Go extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Ko extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class qo extends No{constructor(e,t){super(e,t),i(this,`sequenceNumber`,void 0),this.valid&&(this.sequenceNumber=this.readUint32())}}class Jo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class Yo extends No{constructor(e,t){super(e,t),i(this,`trackId`,void 0),i(this,`baseDataOffset`,void 0),i(this,`sampleDescriptionIndex`,void 0),i(this,`defaultSampleDuration`,void 0),i(this,`defaultSampleSize`,void 0),i(this,`defaultSampleFlags`,void 0),this.trackId=this.readUint32(),this.flags&1&&(this.baseDataOffset=this.readUint64()),this.flags&2&&(this.sampleDescriptionIndex=this.readUint32()),this.flags&8&&(this.defaultSampleDuration=this.readUint32()),this.flags&16&&(this.defaultSampleSize=this.readUint32()),this.flags&32&&(this.defaultSampleFlags=this.readUint32())}}class Xo extends No{get baseMediaDecodeTime(){return this.version===1?this.baseMediaDecodeTime64:this.baseMediaDecodeTime32}constructor(e,t){super(e,t),i(this,`baseMediaDecodeTime32`,0),i(this,`baseMediaDecodeTime64`,BigInt(0)),this.version===1?this.baseMediaDecodeTime64=this.readUint64():this.baseMediaDecodeTime32=this.readUint32()}}class Zo extends No{constructor(e,t){super(e,t),i(this,`sampleCount`,void 0),i(this,`dataOffset`,void 0),i(this,`firstSampleFlags`,void 0),i(this,`sampleDuration`,[]),i(this,`sampleSize`,[]),i(this,`sampleFlags`,[]),i(this,`sampleCompositionTimeOffset`,[]),i(this,`optionalFields`,0),this.sampleCount=this.readUint32(),this.flags&1&&(this.dataOffset=this.readUint32()),this.flags&4&&(this.firstSampleFlags=this.readUint32());for(let e=0;e<this.sampleCount;e++)this.flags&256&&this.sampleDuration.push(this.readUint32()),this.flags&512&&this.sampleSize.push(this.readUint32()),this.flags&1024&&this.sampleFlags.push(this.readUint32()),this.flags&2048&&this.sampleCompositionTimeOffset.push(this.readUint32())}}class Qo extends Do{constructor(e,t){super(e,t),this.children=this.scanForBoxes(this.content)}}class $o extends No{constructor(e,t){super(e,t),i(this,`entryCount`,void 0),this.valid&&(this.entryCount=this.readUint32(),this.children=this.scanForBoxes(new DataView(this.content.buffer,this.content.byteOffset+4,this.content.byteLength-4)))}}class es extends Do{constructor(e,t){super(e,t),this.valid&&(this.children=this.scanForBoxes(new DataView(this.content.buffer,this.content.byteOffset+78,this.content.byteLength-78)))}}var ts={ftyp:jo,moov:Mo,mvhd:Po,moof:Fo,mdat:Io,sidx:Lo,trak:Ro,mdia:Uo,mfhd:qo,tkhd:Wo,traf:Jo,tfhd:Yo,tfdt:Xo,trun:Zo,minf:Go,sv3d:zo,st3d:Bo,prhd:Vo,proj:Ko,equi:Ho,uuid:Ao,stbl:Qo,stsd:$o,avc1:es,unknown:Oo};class ns{constructor(e={}){i(this,`options`,void 0),this.options=o({offset:0},e)}parse(e){let t=[],n=this.options.offset;for(;n<e.byteLength;){let r=new TextDecoder(`ascii`).decode(new DataView(e.buffer,e.byteOffset+n+4,4)),i;try{i=this.createBox(r,new DataView(e.buffer,e.byteOffset+n,e.byteLength-n))}catch(e){if(!(e instanceof RangeError))throw e}if(!i||!Eo(i))break;t.push(i),n+=i.size}return t}createBox(e,t){let n=ts[e];return n?new n(t,new ns):new Oo(t,new ns)}}class rs{constructor(e){i(this,`index`,void 0),this.index={},this.indexBoxLevel(e)}indexBoxLevel(e){e.forEach(e=>{var t,n;Eo(e)&&((t=this.index)[n=e.type]??(t[n]=[]),this.index[e.type].push(e),e.children.length>0&&this.indexBoxLevel(e.children))})}find(e){return this.index[e]&&this.index[e][0]?this.index[e][0]:null}findAll(e){return this.index[e]||[]}}var is=new TextDecoder(`ascii`),as={validateData:e=>is.decode(new DataView(e.buffer,e.byteOffset+4,4))===`ftyp`,parseInit:e=>{let t={is3dVideo:!1,stereoMode:0,projectionType:1,projectionData:{pose:{yaw:0,pitch:0,roll:0},bounds:{top:0,bottom:0,left:0,right:0}}},n=new rs(new ns().parse(e));if(n.find(`sv3d`)){t.is3dVideo=!0;let e=n.find(`st3d`);e&&(t.stereoMode=e.stereoMode);let r=n.find(`prhd`);r&&(t.projectionData.pose.yaw=r.poseYawDegrees,t.projectionData.pose.pitch=r.posePitchDegrees,t.projectionData.pose.roll=r.poseRollDegrees);let i=n.find(`equi`);i&&(t.projectionData.bounds.top=i.projectionBoundsTop,t.projectionData.bounds.right=i.projectionBoundsRight,t.projectionData.bounds.bottom=i.projectionBoundsBottom,t.projectionData.bounds.left=i.projectionBoundsLeft)}return t},getIndexRange:()=>{},parseSegments:e=>{let t=new Lo(e,new ns),n=t.earliestPresentationTime/t.timescale*1e3,r=e.byteOffset+e.byteLength+t.firstOffset;return t.segments.map(e=>{if(e.referenceType!==0)throw Error(`Unsupported multilevel sidx`);let i=r,a=r+e.referencedSize-1,o=e.subsegmentDuration/t.timescale*1e3,s={status:`none`,time:{from:n,to:n+o},byte:{from:i,to:a},size:a-i+1};return n+=o,r+=e.referencedSize,s})},parseFeedableSegmentChunk:(e,t)=>{let n=new rs(new ns().parse(e)),r=n.findAll(`moof`),i=t?n.findAll(`uuid`):n.findAll(`mdat`);if(!(i.length&&r.length))return null;let a=r[0],o=i[i.length-1],s=a.source.byteOffset,c=o.source.byteOffset-a.source.byteOffset+o.size;return new DataView(e.buffer,s,c)},getChunkEndTime:(e,t)=>{let n=new rs(new ns().parse(e)).findAll(`traf`),r=n[n.length-1].children.find(e=>e.type===`tfhd`),i=n[n.length-1].children.find(e=>e.type===`tfdt`),a=n[n.length-1].children.find(e=>e.type===`trun`),o=0;return o=a.sampleDuration.length?a.sampleDuration.reduce((e,t)=>e+t,0):r.defaultSampleDuration*a.sampleCount,(Number(i.baseMediaDecodeTime)+o)/t*1e3},getServerLatencyTimestamps:e=>{let t=new rs(new ns().parse(e)),n={},r=t.findAll(`uuid`),i=To.arrayAt(r,-1);return i?{serverDataReceivedTimestamp:i.userData.received,serverDataPreparedTime:i.userData.received}:n},getTimescaleFromIndex:e=>new rs(new ns().parse(e)).find(`sidx`)?.timescale},os=require(`@vkontakte/videoplayer-shared`),ss=require(`@vkontakte/videoplayer-shared`),cs=require(`@vkontakte/videoplayer-shared`),ls={440786851:{type:`master`},17030:{type:`uint`},17143:{type:`uint`},17138:{type:`uint`},17139:{type:`uint`},17026:{type:`string`},17031:{type:`uint`},17029:{type:`uint`},236:{type:`binary`},408125543:{type:`master`},290298740:{type:`master`},19899:{type:`master`},21419:{type:`binary`},21420:{type:`uint`},357149030:{type:`master`},2807729:{type:`uint`},17545:{type:`float`},374648427:{type:`master`},174:{type:`master`},224:{type:`master`},30320:{type:`master`},30321:{type:`uint`},30322:{type:`master`},272869232:{type:`master`},524531317:{type:`master`},231:{type:`uint`},22612:{type:`master`},22743:{type:`uint`},167:{type:`uint`},171:{type:`uint`},163:{type:`binary`},160:{type:`master`},175:{type:`binary`},423732329:{type:`master`},307544935:{type:`master`},475249515:{type:`master`},187:{type:`master`},179:{type:`uint`},183:{type:`master`},247:{type:`uint`},241:{type:`uint`},240:{type:`uint`},178:{type:`uint`},21368:{type:`uint`},234:{type:`uint`},219:{type:`master`},150:{type:`uint`}},us=e=>{let t=e.getUint8(0),n=0;t&128?n=1:t&64?n=2:t&32?n=3:t&16&&(n=4);let r=ds(e,n),i=r in ls,a=i?ls[r].type:`binary`,o=e.getUint8(n),s=0;o&128?s=1:o&64?s=2:o&32?s=3:o&16?s=4:o&8?s=5:o&4?s=6:o&2?s=7:o&1&&(s=8);let c=new DataView(e.buffer,e.byteOffset+n+1,s-1),l=o&255>>s,u=ds(c),d=l*2**((s-1)*8)+u,f=n+s,p;return p=f+d>e.byteLength?new DataView(e.buffer,e.byteOffset+f):new DataView(e.buffer,e.byteOffset+f,d),{tag:i?r:`0x`+r.toString(16).toUpperCase(),type:a,tagHeaderSize:f,tagSize:f+d,value:p,valueSize:d}},ds=(e,t=e.byteLength)=>{switch(t){case 1:return e.getUint8(0);case 2:return e.getUint16(0);case 3:return e.getUint8(0)*2**16+e.getUint16(1);case 4:return e.getUint32(0);case 5:return e.getUint8(0)*2**32+e.getUint32(1);case 6:return e.getUint16(0)*2**32+e.getUint32(2);case 7:{let t=e.getUint8(0)*2**48+e.getUint16(1)*2**32+e.getUint32(3);if(Number.isSafeInteger(t))return t}case 8:throw ReferenceError(`Int64 is not supported`)}return 0},fs=(e,t)=>{switch(t){case`int`:return e.getInt8(0);case`uint`:return ds(e);case`float`:return e.byteLength===4?e.getFloat32(0):e.getFloat64(0);case`string`:return new TextDecoder(`ascii`).decode(e);case`utf8`:return new TextDecoder(`utf-8`).decode(e);case`date`:return new Date(Date.UTC(2001,0)+e.getInt8(0)).getTime();case`master`:return e;case`binary`:return e;default:cs.assertNever(t)}},ps=(e,t)=>{let n=0;for(;n<e.byteLength;){let r=us(new DataView(e.buffer,e.byteOffset+n));if(!t(r))return;r.type===`master`&&ps(r.value,t),n=r.value.byteOffset-e.byteOffset+r.valueSize}},ms=e=>{if(e.getUint32(0)!==440786851)return!1;let t,n,r;return ps(us(e).value,({tag:e,type:i,value:a})=>(e===17143?t=fs(a,i):e===17026?n=fs(a,i):e===17029&&(r=fs(a,i)),!0)),(t===void 0||t<=1)&&n!==void 0&&n===`webm`&&(r===void 0||r<=2)},hs=[357149030,290298740,374648427,174,224,30320,30321,30322,272869232,524531317,475249515,423732329,307544935],gs=[231,22612,22743,167,171,163,160,175],_s={validateData:ms,parseInit:e=>{let t,n,r,i,a=!1,o=!1,s=!1,c,l,u=!1;return ps(e,({tag:e,type:d,value:f,valueSize:p})=>(e===21419?l=ds(fs(f,d)):e!==21420&&(l=void 0),e===408125543?(t=f.byteOffset,n=f.byteOffset+p):e===357149030?a=!0:e===290298740?o=!0:e===2807729?r=fs(f,d):e===17545?i=fs(f,d):e===21420&&l===475249515?c=fs(f,d):e===374648427?ps(f,({tag:e,type:t,value:n})=>e===30321?(u=fs(n,t)===1,!1):!0):a&&o&&os.arrayIncludes(hs,e)&&(s=!0),!s)),ss.assertNonNullable(t,`Failed to parse webm Segment start`),ss.assertNonNullable(n,`Failed to parse webm Segment end`),ss.assertNonNullable(i,`Failed to parse webm Segment duration`),r??=1e6,{segmentStart:Math.round(t/1e9*r*1e3),segmentEnd:Math.round(n/1e9*r*1e3),timeScale:r,segmentDuration:Math.round(i/1e9*r*1e3),cuesSeekPosition:c,is3dVideo:u,stereoMode:0,projectionType:1,projectionData:{pose:{yaw:0,pitch:0,roll:0},bounds:{top:0,bottom:0,left:0,right:0}}}},getIndexRange:e=>{if(ss.isNullable(e.cuesSeekPosition))return;let t=e.segmentStart+e.cuesSeekPosition;return{from:t,to:t+1048576}},parseSegments:(e,t)=>{let n=!1,r=!1,i=e=>ss.isNonNullable(e.time)&&ss.isNonNullable(e.position),a=[],o;return ps(e,({tag:e,type:t,value:s})=>{switch(e){case 475249515:n=!0;break;case 187:o&&i(o)&&a.push(o),o={};break;case 179:o&&(o.time=fs(s,t));break;case 183:break;case 241:o&&(o.position=fs(s,t));break;default:n&&os.arrayIncludes(hs,e)&&(r=!0)}return!(n&&r)}),o&&i(o)&&a.push(o),a.map((e,n)=>{let{time:r,position:i}=e,o=a[n+1],s=t.segmentStart+i,c=o?t.segmentStart+o.position-1:t.segmentEnd-1;return{status:`none`,time:{from:r,to:o?o.time:t.segmentDuration},byte:{from:s,to:c},size:c-s+1}})},parseFeedableSegmentChunk:e=>{let t=0,n=!1;try{ps(e,r=>r.tag===524531317?r.tagSize<=e.byteLength?(t=r.tagSize,!1):(t+=r.tagHeaderSize,!0):os.arrayIncludes(gs,r.tag)?(t+r.tagSize<=e.byteLength&&(t+=r.tagSize,n||=os.arrayIncludes([163,160,175],r.tag)),!0):!1)}catch{}return t>0&&t<=e.byteLength&&n?new DataView(e.buffer,e.byteOffset,t):null}},vs=e=>{let t=/^(.+)\/([^;]+)(?:;.*)?$/.exec(e);if(t){let[,e,n]=t;if(e===`audio`||e===`video`)switch(n){case`webm`:return _s;case`mp4`:return as}}throw ReferenceError(`Unsupported mime type ${e}`)},ys=require(`@vkontakte/videoplayer-shared`),bs=require(`@vkontakte/videoplayer-shared`),xs=({id:e,width:t,height:n,bitrate:r,fps:i,quality:a,streamId:o,tvDisabled:s})=>{let c=(a?Xt(a):void 0)??bs.videoSizeToQuality({width:t,height:n});return c&&{id:e,quality:c,bitrate:r,size:{width:t,height:n},fps:i,streamId:o,tvDisabled:s}},Ss=({id:e,bitrate:t})=>({id:e,bitrate:t}),Cs=({language:e,label:t},{id:n,url:r,isAuto:i})=>({id:n,url:r,isAuto:i,type:`internal`,language:e,label:t}),ws=({language:e,label:t,id:n,url:r,isAuto:i})=>({id:n,url:r,isAuto:i,type:`internal`,language:e,label:t}),Ts=({id:e,language:t,label:n,codecs:r,isDefault:i,channels:a})=>({id:e,language:t,label:n,codec:ys.stringAt(r.split(`.`),0),isDefault:i,channels:a}),Es=({id:e,language:t,label:n,hdr:r,codecs:i})=>({id:e,language:t,hdr:r,label:n,codec:ys.stringAt(i.split(`.`),0)}),Ds=e=>`url`in e,Os=e=>e.type===`template`;class ks{constructor(e,t,n,{fetcher:r,tracer:a,tuning:o,getCurrentPosition:s,getCurrentStallDuration:l,manifest:u}){i(this,`error$`,new U.Subject),i(this,`playingRepresentation$`,new U.ValueSubject(void 0)),i(this,`playingRepresentationInit$`,new U.ValueSubject(void 0)),i(this,`currentSegmentLength$`,new U.ValueSubject(0)),i(this,`onLastSegment$`,new U.ValueSubject(!1)),i(this,`fullyBuffered$`,new U.ValueSubject(!1)),i(this,`kind`,void 0),i(this,`nativeBufferManager`,void 0),i(this,`fetcher`,void 0),i(this,`tracer`,void 0),i(this,`tuning`,void 0),i(this,`representations`,void 0),i(this,`playingRepresentationId`,void 0),i(this,`downloadingRepresentationId`,void 0),i(this,`switchingRepresentationId`,void 0),i(this,`initData`,new Map),i(this,`initDataPromises`,new Map),i(this,`idleCallbacks`,new Map),i(this,`parsedInitData`,new Map),i(this,`forwardBufferRepresentations`,new Map),i(this,`segments`,new Map),i(this,`containerParser`,void 0),i(this,`bufferPlaybackQueue`,[]),i(this,`downloadingBufferItems`,[]),i(this,`preloadOnly`,!1),i(this,`forwardBufferTarget`,void 0),i(this,`failedDownloads`,0),i(this,`lastDataObtainedTimestampMs`,0),i(this,`loadByteRangeSegmentsTimeoutId`,0),i(this,`currentVirtualBufferSize`,0),i(this,`baseUrls`,[]),i(this,`baseUrlsIndex`,0),i(this,`maintainPlaybackBufferMutex`,!1),i(this,`maintainNativeBufferMutex`,!1),i(this,`bufferClearingMutex`,!1),i(this,`abortNativeBufferMutex`,!1),i(this,`switchMutex`,!1),i(this,`seekMutex`,!1),i(this,`destroyAbortController`,new So.AbortControllerPolyfilled),i(this,`switchAbortController`,new So.AbortControllerPolyfilled),i(this,`downloadAbortController`,new So.AbortControllerPolyfilled),i(this,`subscription`,new U.Subscription),i(this,`getCurrentPosition`,void 0),i(this,`getCurrentStallDuration`,void 0),i(this,`startWith`,U.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e){let t=this.representations.get(e);U.assertNonNullable(t,`Cannot find representation ${e}`);let n=this.tracer.createComponentTracer(`startWith`);n.log(`start representation`,U.flattenObject({id:e})),this.playingRepresentationId=e,this.downloadingRepresentationId=e,this.containerParser=vs(t.mime),this.nativeBufferManager.init(t.mime,t.codecs,this.tuning.dash.useAbortMSEFix),n.log(`started loadInitIfNeeded`),yield this.loadInitIfNeeded(t,`high`),n.log(`ended loadInitIfNeeded`);let r=this.initData.get(t.id),i=this.segments.get(t.id),a=this.parsedInitData.get(t.id);U.assertNonNullable(r,`No init buffer for starting representation`),U.assertNonNullable(i,`No segments for starting representation`),n.log(`started native buffer init segment append`),yield this.nativeBufferManager.addInitSegment(r),n.log(`ended native buffer init segment append`),this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(a),n.end()});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`waitExponentialDownloadDelay`,U.abortable(this.downloadAbortController.signal,c(function*(){let e=U.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>{let n=U.getWindow();this.loadByteRangeSegmentsTimeoutId=n.setTimeout(t,e),this.subscription.add(U.fromEvent(n,`online`).pipe(U.once()).subscribe(()=>{t(),n.clearTimeout(this.loadByteRangeSegmentsTimeoutId)}))})}).bind(this))),this.kind=e,this.nativeBufferManager=t,this.fetcher=r,this.tracer=a.createComponentTracer(`${this.kind} ${this.constructor.name}`),this.tuning=o,this.getCurrentPosition=s,this.getCurrentStallDuration=l,this.forwardBufferTarget=o.dash.forwardBufferTargetAuto,this.baseUrls=u?.baseUrls??[],this.representations=new Map(n.map(e=>[e.id,e]))}switchTo(e,t=`default`){var n=this;return a(function*(){if(e===n.downloadingRepresentationId||e===n.switchingRepresentationId)return;let r=n.tracer.createComponentTracer(`switchTo`);return r.log(`abort previous switchTo`),n.switchAbortController.abort(),n.switchMutex=!1,r.log(`switchMutex released`),n.switchAbortController=new So.AbortControllerPolyfilled,n.getSwitchWithAbort(r)(e,t)})()}getSwitchWithAbort(e){return U.abortable(this.switchAbortController.signal,function(){var t=c(function*(t,n){if(!U.isNullable(this.downloadingRepresentationId)){this.switchMutex=!0,e.log(`switchMutex captured`);try{e.log(`start`,U.flattenObject({newRepresentationId:t,mode:n})),this.switchingRepresentationId=t;let r=this.representations.get(this.downloadingRepresentationId),i=this.representations.get(t);U.assertNonNullable(i,`No such representation ${t}`),U.assertNonNullable(r,`No such representation ${this.downloadingRepresentationId}`),e.log(`abortDownload`),yield this.abortDownload(),e.log(`start loadInitIfNeeded`),yield this.loadInitIfNeeded(i,`high`),e.log(`ended loadInitIfNeeded`);let a=this.initData.get(i.id),o=this.segments.get(i.id);if(U.isNullable(a)||U.isNullable(o))return;let s=e=>e.segment.bufferStatus!==`fed`,c=e=>{let t=this.representations.get(e.representationId);return U.assertNonNullable(t,`No itemRepresentation for previous track before switch`),e.segment.networkStatus!==`downloaded`||this.forceSwitchCondition(t,i)},l=e=>{switch(n){case`lazy`:return s(e)&&c(e);case`force`:return!0;default:return s(e)}};e.log(`bufferPlaybackQueue before`,U.flattenObject({bufferPlaybackQueue:this.bufferPlaybackQueue})),this.bufferPlaybackQueue.filter(l).forEach(e=>e.segment.bufferStatus=`none`),this.bufferPlaybackQueue=this.bufferPlaybackQueue.filter(e=>!l(e)),e.log(`bufferPlaybackQueue after`,U.flattenObject({bufferPlaybackQueue:this.bufferPlaybackQueue})),this.downloadingRepresentationId=t,this.switchingRepresentationId=null,this.bufferPlaybackQueue.length?(e.log(`switchTo with maintain`),yield this.maintain()):(e.log(`switchTo with seek`),yield this.prepareSeek(),yield this.seek(this.getCurrentPosition()))}finally{this.switchMutex=!1,e.log(`switchMutex released`),e.end()}}});return function(e,n){return t.apply(this,arguments)}}().bind(this))}prepareSeek(){var e=this;return a(function*(){let t=e.tracer.createComponentTracer(`prepareSeek`);e.seekMutex=!0,t.log(`seekMutex captured`);try{t.log(`started abort`),yield e.abort(),t.log(`started clearBuffer`),yield e.clearBuffer(),t.log(`ended clearBuffer`)}catch{t.error(`seekMutex released`),e.seekMutex=!1}t.end()})()}seek(e){var t=this;return a(function*(){let n=t.tracer.createComponentTracer(`seek ${e}`);t.seekMutex=!1,n.log(`seekMutex released`),n.log(`maintain started`),yield t.maintain(e),n.log(`maintain ended`),n.end()})()}maintain(){var e=this;return a(function*(t=this.getCurrentPosition()){U.isNullable(t)||(yield e.maintainPlaybackBuffer(t),yield e.maintainNativeBuffer(),e.actualizeLastSegmentInfo(t))}).apply(this,arguments)}getForwardBufferRepresentations(e=this.getCurrentPosition()){if(this.forwardBufferRepresentations.clear(),U.isNonNullable(e))for(let[t,n]of this.segments.entries())this.forwardBufferRepresentations.set(t,n.filter(t=>t.time.from>=e&&t.time.to<=e+this.forwardBufferTarget));return this.forwardBufferRepresentations}getForwardPlaybackBufferDuration(e=this.getCurrentPosition()){let t=this.bufferPlaybackQueue.filter(e=>e.segment.networkStatus===`downloaded`),n=t[t.length-1],r=U.isNonNullable(e)&&U.isNonNullable(n)?n.segment.time.to-e:0;return Math.max(r,0)}getPlaybackBufferState(){return this.bufferPlaybackQueue.length?{from:this.bufferPlaybackQueue[0].segment.time.from,to:this.bufferPlaybackQueue[this.bufferPlaybackQueue.length-1].segment.time.to}:null}abort(){var e=this;return a(function*(){e.abortDownload(),yield e.abortNativeBuffer()})()}findSegmentStartTime(e){let t=this.downloadingRepresentationId??this.playingRepresentationId??``;return(this.segments.get(t)?.find(t=>t.time.from<=e&&t.time.to>=e))?.time.from}getRepresentationInitialTime(){return U.isNullable(this.playingRepresentationId)?0:(this.segments.get(this.playingRepresentationId)?.[0].time.from??0)/1e3}getMutexInfo(){let e=``;return this.seekMutex&&(e+=`seek `),this.abortNativeBufferMutex&&(e+=`abort `),this.maintainNativeBufferMutex&&(e+=`maintainNative `),this.maintainPlaybackBufferMutex&&(e+=`maintainPlayback `),this.bufferClearingMutex&&(e+=`bufferClear `),this.switchMutex&&(e+=`switch `),e}calculateDurationFromSegments(){if(!this.playingRepresentationId)return 0;let e=this.segments.get(this.playingRepresentationId);return(e?Co.arrayAt(e,-1)?.time.to:0)||0}getActiveSegmentProgress(){let e;for(let t of this.downloadingBufferItems)t.segment.networkStatus!==`downloading`||U.isNullable(t.startedAtMs)||(!e||t.segment.time.from<e.segment.time.from)&&(e=t);if(!(!e||U.isNullable(e.startedAtMs)))return{startedAtMs:e.startedAtMs,loadedBytes:e.segment.loadedBytes??0,totalBytes:U.isNonNullable(e.segment.size)&&Number.isFinite(e.segment.size)?e.segment.size:void 0,segmentDurationMs:e.segment.time.to-e.segment.time.from}}getMpdSegmentDuration(){for(let e of this.segments.values()){let t=e[0];if(t&&t.time.to>t.time.from)return t.time.to-t.time.from}}get lastDataObtainedTimestamp(){return this.lastDataObtainedTimestampMs}setTarget(e){this.forwardBufferTarget=e}setPreloadOnly(e){this.preloadOnly=e}destroy(){let e=U.getWindow();if(this.initData.clear(),this.initDataPromises.clear(),this.segments.clear(),this.parsedInitData.clear(),this.representations.clear(),this.downloadAbortController.abort(),this.switchAbortController.abort(),this.destroyAbortController.abort(),this.subscription.unsubscribe(),e.cancelIdleCallback)for(let t of this.idleCallbacks.values())e.cancelIdleCallback(t);this.idleCallbacks.clear(),e.clearTimeout(this.loadByteRangeSegmentsTimeoutId),this.tracer.log(`destroy`),this.tracer.end()}forceSwitchCondition(e,t){let n=!0;if(this.kind===`video`){let r=xs(e),i=xs(t);n=U.isNonNullable(r)&&U.isNonNullable(i)&&U.isHigher(i.quality,r.quality)}else if(this.kind===`audio`){let r=Ss(e),i=Ss(t);n=U.isNonNullable(r?.bitrate)&&U.isNonNullable(i?.bitrate)&&i.bitrate>r.bitrate}return n}clearBuffer(){var e=this;return a(function*(){let t=e.tracer.createComponentTracer(`clearBuffer`);e.bufferClearingMutex=!0,t.log(`bufferClearingMutex captured`);try{t.log(`clearBuffer`,U.flattenObject({queue:e.bufferPlaybackQueue.slice(0,5)})),yield e.nativeBufferManager.clear(e.destroyAbortController.signal),e.bufferPlaybackQueue.forEach(e=>e.segment.bufferStatus=`none`),e.bufferPlaybackQueue=[]}finally{e.bufferClearingMutex=!1,t.log(`bufferClearingMutex released`),t.end()}})()}abortDownload(){this.downloadAbortController.abort(),this.downloadAbortController=new So.AbortControllerPolyfilled,this.abortDownloadingItems(),this.maintainPlaybackBufferMutex=!1}abortDownloadingItems(){for(let e of this.downloadingBufferItems)e.segment.networkStatus===`downloading`&&(e.segment.networkStatus=`none`,e.segment.loadedBytes=0,e.segment.feedingBytes=0,e.segment.fedBytes=0,e.segment.data=null,e.startedAtMs=void 0);this.downloadingBufferItems=[]}abortNativeBuffer(){var e=this;return a(function*(){let t=e.tracer.createComponentTracer(`abortNativeBuffer`);t.log(`abortNativeBufferMutex captured`),e.abortNativeBufferMutex=!0;try{t.log(`abortNativeBuffer`,U.flattenObject({bufferState:e.nativeBufferManager.getBufferState()}));let n=e.playingRepresentationId&&e.initData.get(e.playingRepresentationId),r=n instanceof ArrayBuffer?n:void 0;return yield e.nativeBufferManager.abortBuffer(r)}finally{e.abortNativeBufferMutex=!1,t.log(`abortNativeBufferMutex released`),e.tuning.dash.useAbortResetNativeBufferMutex&&(e.maintainNativeBufferMutex=!1),t.end()}})()}loadInits(){var e=this;return a(function*(){for(let[t,n]of e.representations)e.idleCallbacks.set(n.id,wo.requestIdleCallbackPolyfilled(function(){var t=a(function*(t){return yield e.loadInitIfNeeded(n,`low`,!1)});return function(e){return t.apply(this,arguments)}}()))})()}loadInitIfNeeded(e,t=`auto`,n=!1){var r=this;return a(function*(){let i=r.initDataPromises.get(e.id),a;a=r.initData.has(e.id)&&r.segments.has(e.id)?Promise.resolve():U.isNonNullable(i)?i:r.loadInit(e,t,n),yield a})()}loadInit(e,t=`auto`,n=!1){var r=this;return a(function*(){try{let n=r.tuning.dash.useFetchPriorityHints?t:`auto`,i=r.fetcher.fetchRepresentation(e.segmentReference,r.containerParser,r.downloadAbortController.signal,n);r.initDataPromises.set(e.id,i);let{initMetadata:a,initDataView:o,segments:s}=(yield i)??{};if(r.initDataPromises.delete(e.id),U.isNullable(o)||U.isNullable(s))return;a&&r.parsedInitData.set(e.id,a);let c=o.buffer.slice(o.byteOffset,o.byteOffset+o.byteLength);r.initData.set(e.id,c),r.segments.set(e.id,s),r.failedDownloads=0}catch(e){n&&!U.isAbortError(e)&&r.error$.next({id:`LoadInits`,category:U.ErrorCategory.WTF,message:`loadInit threw`,thrown:e})}})()}maintainNativeBuffer(){var e=this;return a(function*(){let t=e.getCurrentPosition(),n=e.segments.get(e.downloadingRepresentationId??``),r=n?.[n?.length-1];if(U.isNullable(t)||U.isNullable(r)||e.maintainNativeBufferMutex||e.abortNativeBufferMutex||e.bufferClearingMutex||e.switchMutex||e.seekMutex||e.preloadOnly)return;let i;e.maintainNativeBufferMutex=!0;try{let n=e.bufferPlaybackQueue.find(n=>e.withinInterval(t,n.segment.time)),a=e.bufferPlaybackQueue.find(e=>e.segment.bufferStatus!==`fed`),o=e.initData.get(a?.representationId??``),s=e.bufferPlaybackQueue[0],c=e.destroyAbortController.signal,l=(e.getCurrentStallDuration()??0)>0;e.tuning.dash.useBufferHoldingOnlyOnStall&&(l&&=t>0);let u=Math.min(e.tuning.dash.minSafeBufferToPlay,r.time.to-t),d=l?e.getForwardPlaybackBufferDuration()>=u:!0;U.isNonNullable(o)&&U.isNonNullable(a)&&U.isNonNullable(n)&&e.playingRepresentationId!==a.representationId&&e.withinAppendInterval(t,a.segment.time)&&(a===n||n.segment.bufferStatus===`fed`)&&(i??=e.tracer.createComponentTracer(`nativeMaintain ${t}`),i.log(`abortNativeBuffer`),yield e.abortNativeBuffer(),i.log(`start addInitSegment`),yield e.nativeBufferManager.addInitSegment(o,c),i.log(`end addInitSegment`),e.playingRepresentationId=a.representationId,e.playingRepresentation$.next(e.playingRepresentationId),i.log(`playingRepresentationId`,U.flattenObject({id:a.representationId}))),U.isNonNullable(a)&&e.withinAppendInterval(t,a.segment.time)&&d&&(i??=e.tracer.createComponentTracer(`nativeMaintain ${t}`),a.segment.loadedBytes===a.segment.size&&a.segment.bufferStatus===`none`?(i.log(`started appendSegmentFully`),yield e.appendSegmentFully(a,c),i.log(`ended appendSegmentFully`)):(i.log(`started appendSegmentPartially`),yield e.appendSegmentPartially(a,c),i.log(`ended appendSegmentPartially`))),U.isNonNullable(s)&&U.isNonNullable(n)&&e.withinRemoveInterval(t,s.segment.time)&&s.segment.time.to<n.segment.time.from+1&&(i??=e.tracer.createComponentTracer(`nativeMaintain ${t}`),i.log(`started removeSegment`),yield e.removeSegment(s,c),i.log(`ended removeSegment`)),i?.log(`currentPosition`,U.flattenObject({currentPosition:t})),i?.log(`currentPlayingItem`,U.flattenObject(n)),i?.log(`nextPlayingItem`,U.flattenObject(a)),i?.log(`nextRemoveItem`,U.flattenObject(s)),i?.log(`queue`,U.flattenObject(e.bufferPlaybackQueue.slice(0,5))),i?.log(`buffer`,U.flattenObject(e.nativeBufferManager.getBufferState()??{})),e.pruneVirtualBuffer(t)}finally{e.maintainNativeBufferMutex=!1,i?.log(`maintainNativeBufferMutex released`),i?.end()}})()}maintainPlaybackBuffer(e){var t=this;return a(function*(){U.assertNonNullable(t.downloadingRepresentationId);let n=t.segments.get(t.downloadingRepresentationId),r=t.representations.get(t.downloadingRepresentationId);if(U.isNullable(n)||U.isNullable(r)||t.maintainPlaybackBufferMutex||t.abortNativeBufferMutex||t.bufferClearingMutex||t.switchMutex||t.seekMutex)return;let i;t.maintainPlaybackBufferMutex=!0;try{let a=n.find(t=>e>=t.time.from&&e<t.time.to);U.isNonNullable(a)&&isFinite(a.time.from)&&isFinite(a.time.to)&&t.currentSegmentLength$.next(a?.time.to-a.time.from),t.downloadingBufferItems.length||(t.downloadingBufferItems=t.selectDownloadingItems(e,n)),t.downloadingBufferItems.length&&(i=t.tracer.createComponentTracer(`playbackMaintain ${e}`)),i?.log(`maintainPlaybackBufferMutex captured`),i?.log(`currentSegment`,U.flattenObject(a)),i?.log(`downloadingBufferItems`,U.flattenObject(t.downloadingBufferItems)),i?.log(`processCachedItems`),yield t.processCachedItems();let o=t.selectItemsToLoad();i?.log(`itemsToLoad`,U.flattenObject(o)),yield t.loadItems(o,r),i?.log(`items downloaded`,U.flattenObject(o))}finally{t.maintainPlaybackBufferMutex=!1,i?.log(`maintainPlaybackBufferMutex released`),i?.end()}})()}actualizeLastSegmentInfo(e){let t=this.segments.get(this.downloadingRepresentationId??``);if(U.isNullable(t)||t.length===0)return;let n=t[t?.length-1];U.isNullable(n)||(this.fullyBuffered$.next(n.time.to-e-this.getForwardPlaybackBufferDuration(e)<this.tuning.dash.bufferTolerance),this.onLastSegment$.next(e-n.time.from>0))}selectDownloadingItems(e,t){U.assertNonNullable(this.downloadingRepresentationId);let n=this.getPlaybackBufferState(),r,i;U.isNonNullable(n)&&this.withinInterval(e,n)?(i=this.forwardBufferTarget-this.getForwardPlaybackBufferDuration(e),r=this.bufferPlaybackQueue[this.bufferPlaybackQueue.length-1].segmentIndex+1):(i=this.forwardBufferTarget,r=t.findIndex(t=>this.withinInterval(e,t.time))),r=r===-1?0:r;let a=[];for(;r<t.length&&i>0;){a.push({representationId:this.downloadingRepresentationId,segmentIndex:r,segment:t[r]});let{from:e,to:n}=t[r].time;i-=n-e,r++}return a}processCachedItems(){var e=this;return a(function*(){let t=[...e.downloadingBufferItems];for(;t.length&&t[0].segment.networkStatus===`downloaded`;)yield e.onDownloadItem(t[0]),t.shift()})()}withinInterval(e,{from:t,to:n},r=this.tuning.dash.bufferTolerance,i=0){return U.isNonNullable(e)?e+r>=t&&e-i<n:!1}withinAppendInterval(e,{from:t,to:n}){let{minNativeBufferSize:r,removeTimeShiftFromSegment:i}=this.tuning.dash;return this.withinInterval(e,{from:t,to:n},r,i)}withinRemoveInterval(e,{to:t}){let{removeTimeShiftFromSegment:n}=this.tuning.dash;return U.isNonNullable(e)?e-n>t:!1}appendSegmentFully(e,t){var n=this;return a(function*(){U.isNullable(e.segment.data)||(e.segment.feedingBytes=e.segment.size,(yield n.nativeBufferManager.append(e.segment.data,t))&&(e.segment.fedBytes=e.segment.size,n.onItemFullyAppended(e)))})()}appendSegmentPartially(e,t){var n=this;return a(function*(){if(U.isNullable(e.segment.data)||U.isNullable(e.segment.loadedBytes)||U.isNullable(e.segment.feedingBytes)||U.isNullable(e.segment.fedBytes)||U.isNullable(e.segment.size))return;let r=e.segment.data,i=new DataView(r.buffer,r.byteOffset+e.segment.feedingBytes,r.byteLength-e.segment.feedingBytes),a=e.segment.loadedBytes===e.segment.size?i:n.parseFeedableSegmentChunk(i);a?.byteLength&&(e.segment.bufferStatus=`partially_fed`,e.segment.feedingBytes+=a.byteLength,(yield n.nativeBufferManager.append(a,t))&&(e.segment.fedBytes+=a.byteLength,e.segment.fedBytes===e.segment.size&&n.onItemFullyAppended(e)))})()}parseFeedableSegmentChunk(e){return this.containerParser.parseFeedableSegmentChunk(e,!1)}onItemFullyDownloaded(e){e.segment.networkStatus=`downloaded`}onItemFullyAppended(e){e.segment.bufferStatus=`fed`}removeSegment(e,t){var n=this;return a(function*(){let{from:r,to:i}=e.segment.time,a=(i-r)/4;(yield n.nativeBufferManager.remove(0,i-a,t))&&(e.segment.fedBytes=0,e.segment.feedingBytes=0,e.segment.bufferStatus=`none`,n.bufferPlaybackQueue.shift())})()}onDownloadItem(e){var t=this;return a(function*(){if(!t.downloadingBufferItems.find(t=>t===e))return;let n=t.getCurrentPosition();return t.downloadingBufferItems=t.downloadingBufferItems.filter(t=>t!==e||t.segment.networkStatus!==`downloaded`),(t.preloadOnly||U.isNonNullable(n)&&!t.withinRemoveInterval(n,e.segment.time))&&!t.bufferPlaybackQueue.find(t=>t===e)&&t.bufferPlaybackQueue.push(e),t.maintainNativeBuffer()})()}pruneVirtualBuffer(e){let{maxVirtualBufferSize:t,virtualBufferPruneSize:n,bufferPruningSafeZone:r}=this.tuning.dash;if(this.currentVirtualBufferSize<t)return;let i=this.currentVirtualBufferSize-t+n;for(let t of this.segments.values())for(let n of t)U.isNonNullable(n.size)&&i>0&&n.time.to<=e-r&&n.bufferStatus===`none`&&n.networkStatus===`downloaded`&&(n.data=null,n.networkStatus=`none`,this.currentVirtualBufferSize-=n.size,i-=n.size);for(let t of this.segments.values())for(let n of[...t].reverse())U.isNonNullable(n.size)&&i>0&&n.time.from>=e+r&&n.bufferStatus===`none`&&n.networkStatus===`downloaded`&&!this.bufferPlaybackQueue.find(e=>e.segment===n)&&!this.downloadingBufferItems.find(e=>e.segment===n)&&(n.data=null,n.networkStatus=`none`,this.currentVirtualBufferSize-=n.size,i-=n.size)}updateRepresentationsBaseUrlIfNeeded(){if(!this.tuning.dash.enableBaseUrlSupport||!this.baseUrls.length||this.failedDownloads<=this.tuning.dash.maxSegmentRetryCount)return;this.baseUrlsIndex=(this.baseUrlsIndex+1)%this.baseUrls.length;let e=this.baseUrls[this.baseUrlsIndex];for(let t of this.representations.values())this.updateRepresentationBaseUrl(t,e)}}var As=require(`@vkontakte/videoplayer-shared`);class js extends ks{constructor(e,t,n,r){super(e,t,n,r)}loadItems(t,n,r=`auto`){var i=this;return a(function*(){let{signal:a}=i.downloadAbortController;if(a.aborted||!t.length)return;let s=i.prepareFetchParams(t,n),{url:c}=s,u=l(s,e);if(i.failedDownloads&&(yield i.waitExponentialDownloadDelay()),a.aborted)return;let d=As.getWindow().performance.now();for(let e of t)e.startedAtMs=d;try{yield i.fetcher.fetch(c,o(o({},u),{},{priority:r,urlCacheMechanismEnabled:!0})),i.lastDataObtainedTimestampMs=As.now(),i.failedDownloads=0}catch(e){i.abortDownloadingItems(),As.isAbortError(e)||(i.failedDownloads++,i.updateRepresentationsBaseUrlIfNeeded())}})()}selectItemsToLoad(){let e=0,t=0,n=[],r=this.preloadOnly?0:this.tuning.dash.segmentRequestSize,i=this.preloadOnly?this.forwardBufferTarget:0,a=0;for(;a<this.downloadingBufferItems.length&&this.downloadingBufferItems[a].segment.networkStatus===`none`&&(e<=r||t<=i);){let r=this.downloadingBufferItems[a],i=r.segment;i.networkStatus=`downloading`,i.loadedBytes=0,i.feedingBytes=0,i.fedBytes=0,n.push(r),e+=i.byte.to+1-i.byte.from,t+=i.time.to+1-i.time.from,a++}return n}prepareFetchParams(e,t){var n=this;if(Zr(t.segmentReference))throw Error(`Representation is not byte range type`);let{signal:r}=this.downloadAbortController,i=t.segmentReference.url,o={from:e[0].segment.byte.from,to:e[e.length-1].segment.byte.to};return{url:i,range:o,onProgress:function(){var i=a(function*(i,a){if(!r.aborted)try{n.lastDataObtainedTimestampMs=As.now(),yield n.onSomeDataLoaded({downloadingItems:e,dataView:i,loaded:a,signal:r,globalFrom:o?o.from:0,representationId:t.id})}catch(e){n.error$.next({id:`SegmentFeeding`,category:As.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}});return function(e,t){return i.apply(this,arguments)}}(),signal:r,bufferOptimisation:this.tuning.dash.fetcherBufferOptimisation}}onSomeDataLoaded({downloadingItems:e,dataView:t,representationId:n,globalFrom:r,loaded:i,signal:o}){var s=this;return a(function*(){let a=s.representations.get(n);if(!(!s.downloadingBufferItems.length||As.isNullable(a)||As.isNullable(r)||o.aborted))for(let n of e){let{segment:e}=n,a=e.byte.from-r,o=e.byte.to-r,c=a<i,l=o<=i;!c||As.isNullable(e.size)||(e.networkStatus===`downloading`&&e.bufferStatus===`none`&&l?(e.data=new DataView(t.buffer,t.byteOffset+a,e.size),s.currentVirtualBufferSize+=e.size,s.onItemFullyDownloaded(n),e.loadedBytes=Math.min(e.size,i-a),yield s.onDownloadItem(n)):As.isNonNullable(e.feedingBytes)&&s.tuning.dash.enableSubSegmentBufferFeeding&&e.networkStatus===`downloading`&&(e.loadedBytes=Math.min(e.size,i-a),l&&(s.currentVirtualBufferSize+=e.size,s.onItemFullyDownloaded(n)),e.loadedBytes>e.feedingBytes&&(e.data=new DataView(t.buffer,t.byteOffset+a,e.loadedBytes),yield s.onDownloadItem(n))))}})()}updateRepresentationBaseUrl(e,t){if(Zr(e.segmentReference))throw Error(`Representation is not byte range type`);e.segmentReference.url=t}}var Ms=require(`@vkontakte/videoplayer-shared`);class Ns extends ks{constructor(e,t,n,r){super(e,t,n,r)}loadItems(e,n,r=`auto`){var i=this;return a(function*(){let{signal:a}=i.downloadAbortController;if(a.aborted||!e.length)return;let s=i.prepareFetchParams(e,n),{url:c}=s,u=l(s,t);if(i.failedDownloads&&(yield i.waitExponentialDownloadDelay()),a.aborted)return;let d=Ms.getWindow().performance.now();for(let t of e)t.startedAtMs=d;try{let t=yield i.fetcher.fetch(c,o(o({},u),{},{priority:r}));if(i.lastDataObtainedTimestampMs=Ms.now(),Ms.isNullable(t))return;let n=e[0],a=new DataView(t);n.segment.size=a.byteLength,n.segment.loadedBytes=a.byteLength,n.segment.data=a,i.onItemFullyDownloaded(n),yield i.onDownloadItem(n),i.failedDownloads=0}catch(e){i.abortDownloadingItems(),Ms.isAbortError(e)||(i.failedDownloads++,i.updateRepresentationsBaseUrlIfNeeded())}})()}selectItemsToLoad(){let e=[];for(let t of this.downloadingBufferItems){let n=t.segment;n.networkStatus=`downloading`,n.size=1/0,n.loadedBytes=0,n.feedingBytes=0,n.fedBytes=0,e.push(t)}return e}prepareFetchParams(e,t){var n=this;let r=this.getFetchUrl(e,t).toString(),{signal:i}=this.downloadAbortController;return{url:r,onProgress:function(){var r=a(function*(r,a){if(!i.aborted)try{n.lastDataObtainedTimestampMs=Ms.now(),yield n.onSomeDataLoaded({downloadingItems:e,dataView:r,loaded:a,signal:i,representationId:t.id})}catch(e){n.error$.next({id:`SegmentFeeding`,category:Ms.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}});return function(e,t){return r.apply(this,arguments)}}(),signal:i,bufferOptimisation:this.tuning.dash.fetcherBufferOptimisation}}getFetchUrl(e,t){if(!Zr(t.segmentReference))throw Error(`Representation is not template type`);return new URL(e[0].segment.url,t.segmentReference.baseUrl)}onSomeDataLoaded({downloadingItems:e,dataView:t,representationId:n,loaded:r,signal:i}){var o=this;return a(function*(){let a=e[0],{segment:s}=a,c=o.representations.get(n);!o.downloadingBufferItems.length||Ms.isNullable(c)||Ms.isNullable(s.feedingBytes)||s.networkStatus!==`downloading`||i.aborted||(s.loadedBytes=r,s.loadedBytes>s.feedingBytes&&o.tuning.dash.enableSubSegmentBufferFeeding&&(s.data=new DataView(t.buffer,t.byteOffset,s.loadedBytes),yield o.onDownloadItem(a)))})()}updateRepresentationBaseUrl(e,t){if(!Zr(e.segmentReference))throw Error(`Representation is not template type`);e.segmentReference.baseUrl=t}}var Ps=require(`@vkontakte/videoplayer-shared`),Fs=require(`@vkontakte/videoplayer-shared`);class Is extends Ns{constructor(e,t,n,r){super(e,t,n,r),i(this,`currentLiveSegmentServerLatency$`,new Fs.ValueSubject(0)),i(this,`currentLowLatencySegmentLength$`,new Fs.ValueSubject(0)),i(this,`liveInitialAdditionalOffset`,0),i(this,`isSeekingLive`,!1),i(this,`isActiveLowLatency`,void 0),this.isActiveLowLatency=r.isActiveLowLatency}updateManifest(e){if(!e||[...this.segments.values()].every(e=>!e.length))return;let t=Ps.arrayFlatMap(e.streams[this.kind],e=>e.representations);for(let e of t){if(Fs.isNullable(e)||!Zr(e.segmentReference))return;let t=e.segmentReference.segments.map(e=>o(o({},e),{},{networkStatus:`none`,bufferStatus:`none`,size:void 0})),n=this.segments.get(e.id)??[],r=n.at(-1)?.time.to??0,i=t?.findIndex(e=>r>=e.time.from+100&&r<=e.time.to+100);if(i===-1){let t=this.getActualLiveStartingSegments(e.segmentReference);this.segments.set(e.id,t)}else{let r=t.slice(i+1);this.segments.set(e.id,[...n,...r])}this.representations.set(e.id,e)}}proceedLowLatencyLive(){let e=this.downloadingRepresentationId;Fs.assertNonNullable(e);let t=this.segments.get(e);if(t?.length){let n={representationId:e,segmentIndex:t.length-1,segment:t[t.length-1]};this.updateLowLatencyLive(n)}}getLiveSegmentsToLoadState(e){let t=e?.streams[this.kind],n=(t==null?void 0:Ps.arrayFlatMap(t,e=>e.representations)).find(e=>e.id===this.downloadingRepresentationId);if(Fs.isNullable(n))return;let r=this.segments.get(n.id);if(r?.length)return{from:r[0].time.from,to:r[r.length-1].time.to}}getRepresentationInitialTime(){if(Fs.isNullable(this.playingRepresentationId))return 0;let e=this.representations.get(this.playingRepresentationId)?.segmentReference;return Fs.isNullable(e)||!Zr(e)?0:this.getActualLiveStartingSegments(e)[0].time.from+this.tuning.dash.bufferTolerance}prepareFetchParams(e,t){return o(o({},super.prepareFetchParams(e,t)),{},{isLowLatency:this.isActiveLowLatency()})}onSomeDataLoaded(e){var t=()=>super.onSomeDataLoaded,r=this;return a(function*(){let{downloadingItems:i}=e,a=l(e,n);yield t().call(r,o({downloadingItems:i},a)),r.isActiveLowLatency()&&r.updateLowLatencyItemTime(i[0])})()}onItemFullyDownloaded(e){if(super.onItemFullyDownloaded(e),Fs.isNullable(e.segment.data)||!this.isActiveLowLatency())return;let t=e.segment.data,{serverDataReceivedTimestamp:n,serverDataPreparedTime:r}=this.containerParser.getServerLatencyTimestamps(t);n&&r&&this.currentLiveSegmentServerLatency$.next(r-n),this.updateLowLatencyItemTime(e),this.updateLowLatencyLive(e)}updateLowLatencyItemTime(e){let t=e.segment.data,n=this.representations.get(e.representationId)?.segmentReference;if(Fs.isNullable(e.segment.data)||Fs.isNullable(n)||!Zr(n))return;let r=this.containerParser;if(e.segment.isCurrentLowLatency){let{timescale:i}=n;e.segment.time.to=r.getChunkEndTime(t,i)}}updateLowLatencyLive(e){let t=0;for(let n of this.representations.values()){let r=n.segmentReference;if(!Zr(r))return;let i=this.segments.get(n.id)??[],a=i.find(t=>Math.floor(t.time.from)===Math.floor(e.segment.time.from));if(a?.isCurrentLowLatency&&(a.time.to=e.segment.time.to,t=a.time.to-a.time.from,a.isCurrentLowLatency=!1),!i.find(t=>Math.floor(t.time.from)===Math.floor(e.segment.time.to))&&this.isActiveLowLatency()){let t=Math.round(e.segment.time.to*r.timescale/1e3).toString(10),n=bo(r.segmentTemplateUrl,{segmentTime:t});i.push({networkStatus:`none`,bufferStatus:`none`,time:{from:e.segment.time.to,to:e.segment.time.to+this.tuning.dash.bufferTolerance},url:n,isCurrentLowLatency:!0})}}this.currentLowLatencySegmentLength$.next(t)}parseFeedableSegmentChunk(e){return this.containerParser.parseFeedableSegmentChunk(e,!0)}getFetchUrl(e,t){let n=super.getFetchUrl(e,t);return this.isActiveLowLatency()&&n.searchParams.set(`low-latency`,`yes`),n}loadInit(e,t=`auto`,n=!1){var r=this;return a(function*(){try{let n=r.tuning.dash.useFetchPriorityHints?t:`auto`,i=r.fetcher.fetchRepresentation(e.segmentReference,r.containerParser,r.downloadAbortController.signal,n);r.initDataPromises.set(e.id,i);let{initMetadata:a,initDataView:o,segments:s}=(yield i)??{};if(r.initDataPromises.delete(e.id),Fs.isNullable(o)||Fs.isNullable(s))return;a&&r.parsedInitData.set(e.id,a);let c=r.getActualLiveStartingSegments(e.segmentReference);r.segments.has(e.id)||r.segments.set(e.id,c);let l=o.buffer.slice(o.byteOffset,o.byteOffset+o.byteLength);r.initData.set(e.id,l),r.failedDownloads=0}catch(e){n&&r.error$.next({id:`LoadInits`,category:Fs.ErrorCategory.WTF,message:`loadInit threw`,thrown:e})}})()}getActualLiveStartingSegments(e){let t=e.segments,n=this.isActiveLowLatency()?this.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.tuning.dashCmafLive.maxActiveLiveOffset,r=[],i=0,a=t.length-1;do r.unshift(t[a]),i+=t[a].time.to-t[a].time.from,a--;while(i<n&&a>=0);return this.liveInitialAdditionalOffset=i-n,this.isActiveLowLatency()?[r[0]]:r}}class Ls{static getBufferManager(e,t,n,r){return r.manifest?.live?new Is(e,t,n,r):Zr(n[0].segmentReference)?new Ns(e,t,n,r):new js(e,t,n,r)}}var Rs=require(`@vkontakte/videoplayer-shared`),zs=require(`@vkontakte/videoplayer-shared`),Bs=18,Vs=!1;try{Vs=j.browser.isSafari&&!!j.browser.safariVersion&&j.browser.safariVersion<=Bs}catch(e){console.error(e)}class Hs{constructor(e,t=!1){i(this,`bufferFull$`,new zs.Subject),i(this,`error$`,new zs.Subject),i(this,`buffer`,void 0),i(this,`queue`,[]),i(this,`currentTask`,null),i(this,`destroyed`,!1),i(this,`abortRequested`,!1),i(this,`isAbortFixEnabled`,!1),i(this,`completeTask`,()=>{try{if(this.currentTask){let e=this.currentTask.signal?.aborted;this.currentTask.callback(!e),this.currentTask=null}this.queue.length&&this.pull()}catch(e){this.error$.next({id:`BufferTaskQueueUnknown`,category:zs.ErrorCategory.VIDEO_PIPELINE,message:`Buffer appending or removal failed`,thrown:e})}}),this.buffer=e,this.isAbortFixEnabled=t,this.buffer.addEventListener(`updateend`,this.completeTask)}append(e,t){var n=this;return a(function*(){return t&&t.aborted?!1:new Promise(r=>{let i={operation:`append`,data:e,signal:t,callback:r};n.queue.push(i),n.pull()})})()}remove(e,t,n){var r=this;return a(function*(){return n&&n.aborted?!1:new Promise(i=>{let a={operation:`remove`,from:e,to:t,signal:n,callback:i};r.queue.unshift(a),r.pull()})})()}abort(e){var t=this;return a(function*(){return new Promise(n=>{let r,i=e=>{t.abortRequested=!1,n(e)};r=Vs&&e?{operation:`safariAbort`,init:e,callback:i}:{operation:`abort`,callback:i},t.isAbortFixEnabled&&t.currentTask&&(t.currentTask.callback(!1),t.currentTask=null);for(let{callback:e}of t.queue)e(!1);t.abortRequested=!0,r&&(t.queue=[r]),t.pull()})})()}destroy(){this.destroyed=!0,this.buffer.removeEventListener(`updateend`,this.completeTask),this.queue=[],this.currentTask=null;try{this.buffer.abort()}catch(e){if(!(e instanceof DOMException&&e.name===`InvalidStateError`))throw e}}pull(){if((this.buffer.updating||this.currentTask||this.destroyed)&&!this.abortRequested)return;let e=this.queue.shift();if(!e)return;if(e.signal?.aborted){e.callback(!1),this.pull();return}this.currentTask=e;let{operation:t}=this.currentTask;try{this.execute(this.currentTask)}catch(e){e instanceof DOMException&&e.name===`QuotaExceededError`&&t===`append`?this.bufferFull$.next(this.currentTask.data.byteLength):e instanceof DOMException&&e.name===`InvalidStateError`||this.error$.next({id:`BufferTaskQueue:${t}`,category:zs.ErrorCategory.VIDEO_PIPELINE,message:`Buffer operation failed`,thrown:e}),this.currentTask.callback(!1),this.currentTask=null}this.currentTask&&this.currentTask.operation===`abort`&&this.completeTask()}execute(e){let{operation:t}=e;switch(t){case`append`:this.buffer.appendBuffer(e.data);break;case`remove`:this.buffer.remove(e.from/1e3,e.to/1e3);break;case`abort`:this.buffer.abort();break;case`safariAbort`:this.buffer.abort(),this.buffer.appendBuffer(e.init);break;default:zs.assertNever(t)}}}var Us=Hs,Ws=(e,t)=>{let n=0;for(let r=0;r<e.length;r++){let i=e.start(r)*1e3,a=e.end(r)*1e3;i<=t&&t<=a&&(n=a)}return Math.max(n-t,0)};class Gs{constructor(e){i(this,`error$`,new Rs.Subject),i(this,`updateEnd$`,new Rs.ValueSubject(void 0)),i(this,`mediaSource`,void 0),i(this,`sourceBuffer`,void 0),i(this,`sourceBufferTaskQueue`,void 0),i(this,`subscription`,new Rs.Subscription),this.mediaSource=e}init(e,t,n=!1){this.sourceBuffer=this.mediaSource.addSourceBuffer(`${e}; codecs="${t}"`),this.sourceBufferTaskQueue=new Us(this.sourceBuffer,n),this.subscription.add(this.sourceBufferTaskQueue.error$.subscribe(e=>this.error$.next(e))),this.subscription.add(Rs.fromEvent(this.sourceBuffer,`error`).subscribe(()=>this.error$.next({id:`SourceBuffer`,category:Rs.ErrorCategory.VIDEO_PIPELINE,message:`SourceBuffer Error event fired`}))),this.subscription.add(Rs.fromEvent(this.sourceBuffer,`updateend`).subscribe(this.updateEnd$))}addInitSegment(e,t){return this.sourceBufferTaskQueue.append(e,t)}append(e,t){return this.sourceBufferTaskQueue.append(e,t)}remove(e,t,n){return this.sourceBufferTaskQueue.remove(e,t,n)}clear(e){var t=this;return a(function*(){let n=t.getBufferState();if(Rs.isNullable(n))return Promise.resolve(!1);let r=!0;yield t.sourceBufferTaskQueue.abort();for(let i of n)r&&=yield t.sourceBufferTaskQueue.remove(i.from,i.to,e);return r})()}warmUpMediaSource(){!Rs.isNullable(this.sourceBuffer)&&!this.sourceBuffer.updating&&(this.sourceBuffer.mode=`segments`)}getBufferState(){if(Rs.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length)return null;let e=[];for(let t=0;t<this.sourceBuffer.buffered.length;t++)e.push({from:this.sourceBuffer.buffered.start(t)*1e3,to:this.sourceBuffer.buffered.end(t)*1e3});return e}getForwardBufferDuration(e){return Rs.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length||Rs.isNullable(e)?0:Ws(this.sourceBuffer.buffered,e)}abortBuffer(e){var t=this;return a(function*(){return Rs.isNullable(t.sourceBuffer)?!1:t.sourceBufferTaskQueue.abort(e)})()}destroy(){if(this.subscription.unsubscribe(),this.sourceBufferTaskQueue?.destroy(),this.sourceBuffer)try{this.mediaSource.removeSourceBuffer(this.sourceBuffer)}catch(e){if(!(e instanceof DOMException&&e.name===`NotFoundError`))throw e}this.sourceBuffer=null}}var Ks=require(`@vkontakte/videoplayer-shared`),qs=require(`@vkontakte/videoplayer-shared`),Js=e=>{switch(e){case`DASH_SEP`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_ONDEMAND`:case`DASH_STREAMS`:return!0;default:return!1}},Ys=Ks.objectValues(qs.VideoQuality).filter(e=>e!==qs.VideoQuality.INVARIANT).sort((e,t)=>qs.isHigher(e,t)?-1:1),Xs=e=>{if(!e||e===qs.VideoQuality.INVARIANT)return null;let t=Ys.find(t=>qs.isLower(t,e))??qs.VideoQuality.Q_1080P;return qs.isLowerOrEqual(t,qs.VideoQuality.Q_1080P)?qs.VideoQuality.Q_1080P:t},Zs=(e,t,n)=>e.category===qs.ErrorCategory.VIDEO_PIPELINE&&e.id.endsWith(`MediaError#${MediaError.MEDIA_ERR_DECODE}`)&&Js(t)?Xs(n):null,Qs=({height:e},t)=>{let n=`${e}p`;try{return qs.isHigher(n,t)}catch{return!1}},$s=(e,t)=>{e.video.forEach(e=>{e.representations.forEach(e=>{e.tvDisabled=e.tvDisabled||Qs(e,t)})})},ec=[`timeupdate`,`progress`,`play`,`seeked`,`stalled`,`waiting`],tc=[`timeupdate`,`progress`,`loadeddata`,`playing`,`seeked`];class nc{constructor(e){i(this,`element`,null),i(this,`manifestUrlString`,``),i(this,`source`,null),i(this,`manifest`,null),i(this,`tuning`,void 0),i(this,`tracer`,void 0),i(this,`stallTracer`,void 0),i(this,`forceVideoCodec`,void 0),i(this,`stallTimeInWaitingExitAttemptMade`,0),i(this,`videoBufferManager`,void 0),i(this,`audioBufferManager`,void 0),i(this,`bufferManagers`,[]),i(this,`videoNativeBufferManager`,void 0),i(this,`audioNativeBufferManager`,void 0),i(this,`nativeBufferManagers`,[]),i(this,`throughputEstimator`,void 0),i(this,`subscription`,new V.Subscription),i(this,`subscriptionRemovable`,new V.SubscriptionRemovable),i(this,`representationSubscription`,new V.Subscription),i(this,`fetcher`,void 0),i(this,`forceEnded$`,new V.Subject),i(this,`stallWatchdogSubscription`,void 0),i(this,`destroyController`,new ja.AbortControllerPolyfilled),i(this,`state$`,new st(`none`)),i(this,`currentVideoRepresentation$`,new V.ValueSubject(void 0)),i(this,`currentVideoRepresentationInit$`,new V.ValueSubject(void 0)),i(this,`currentAudioRepresentation$`,new V.ValueSubject(void 0)),i(this,`currentVideoSegmentLength$`,new V.ValueSubject(0)),i(this,`currentAudioSegmentLength$`,new V.ValueSubject(0)),i(this,`error$`,new V.Subject),i(this,`manifestRequested`,new V.Subject),i(this,`manifestReceived`,new V.Subject),i(this,`firstBytesRequested`,new V.Subject),i(this,`firstBytesReceived`,new V.Subject),i(this,`lastConnectionType$`,new V.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new V.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new V.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new V.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new V.ValueSubject(void 0)),i(this,`currentLiveTextRepresentation$`,new V.ValueSubject(null)),i(this,`timeoutSourceOpenId`,void 0),i(this,`isLive$`,new V.ValueSubject(!1)),i(this,`isActiveLive$`,new V.ValueSubject(!1)),i(this,`isLowLatency$`,new V.ValueSubject(!1)),i(this,`liveDuration$`,new V.ValueSubject(0)),i(this,`liveSeekableDuration$`,new V.ValueSubject(0)),i(this,`liveAvailabilityStartTime$`,new V.ValueSubject(0)),i(this,`liveStreamStatus$`,new V.ValueSubject(void 0)),i(this,`currentBuffer$`,new V.ValueSubject({from:0,to:0})),i(this,`bufferLength$`,new V.ValueSubject(0)),i(this,`nativeBufferLength$`,new V.ValueSubject(0)),i(this,`liveLatency$`,new V.ValueSubject(void 0)),i(this,`liveLoadBufferLength$`,new V.ValueSubject(0)),i(this,`livePositionFromPlayer$`,new V.ValueSubject(0)),i(this,`currentStallDuration$`,new V.ValueSubject(0)),i(this,`videoLastDataObtainedTimestamp$`,new V.ValueSubject(0)),i(this,`fetcherRecoverableError$`,new V.Subject),i(this,`fetcherError$`,new V.Subject),i(this,`updateDurationError$`,new V.Subject),i(this,`isOnDemand`,!1),i(this,`dashMaxTvVideoQuality`,void 0),i(this,`initRepresentations`,V.abortable(this.destroyController.signal,function(){var e=c(function*(e,t,n){this.representationSubscription.unsubscribe(),this.state$.startTransitionTo(`representations_ready`);let r={fetcher:this.fetcher,tracer:this.tracer,tuning:this.tuning,getCurrentPosition:()=>this.element?this.element.currentTime*1e3:void 0,getCurrentStallDuration:()=>this.currentStallDuration$.getValue(),isActiveLowLatency:()=>this.isActiveLive$.getValue()&&this.isLowLatency$.getValue(),manifest:this.manifest};this.createBuffers(r,e,t,n),this.initRepresentationSubscriptions(),yield this.waitStreamToOpen(),this.setSourceInitDuration(),V.assertNonNullable(this.videoBufferManager??this.audioBufferManager);let i=[];e&&i.push(this.videoBufferManager?.startWith(e)??Promise.resolve()),t&&i.push(this.audioBufferManager?.startWith(t)??Promise.resolve()),yield Promise.all(i),this.state$.setState(`representations_ready`)});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchManifest`,V.abortable(this.destroyController.signal,c(function*(){try{return yield this.fetcher.fetchManifest(this.manifestUrlString)}catch(e){V.isNullable(this.manifest)&&!this.bufferLength$.getValue()&&this.error$.next({id:`LoadManifest`,category:V.ErrorCategory.NETWORK,message:`Failed to load manifest`,thrown:e})}}).bind(this))),this.throughputEstimator=e.throughputEstimator,this.tuning=e.tuning,this.tracer=e.tracer.createComponentTracer(this.constructor.name),this.forceVideoCodec=e.forceVideoCodec,this.isOnDemand=e.isOnDemand||!1,this.dashMaxTvVideoQuality=e.dashMaxTvVideoQuality,this.fetcher=new io({throughputEstimator:this.throughputEstimator,requestQuic:this.tuning.requestQuick,compatibilityMode:e.compatibilityMode,tracer:this.tracer,useEnableSubtitlesParam:e.tuning.useEnableSubtitlesParam,measureNonSegmentRequests:e.tuning.throughputEstimator.measureNonSegmentRequests,handleExtendedNetworkErrorsSet:e.tuning.handleExtendedNetworkErrorsSet,useUrlCacheMechanism:e.tuning.useUrlCacheMechanism}),this.subscription.add(this.fetcher.recoverableError$.subscribe(this.fetcherRecoverableError$)),this.subscription.add(this.fetcher.error$.subscribe(this.fetcherError$)),this.initTracerSubscription()}initManifest(e,t,n){var r=this;return a(function*(){r.state$.startTransitionTo(`manifest_ready`),r.element=e,r.manifestUrlString=r.prepareManifestUrlString(t,n),r.manifest=yield r.updateManifest(),!r.manifest?.streams.video.length&&!r.manifest?.streams.audio.length?r.error$.next({id:`NoRepresentations`,category:V.ErrorCategory.PARSER,message:`No playable video representations`}):r.state$.setState(`manifest_ready`)})()}initBuffer(){V.assertNonNullable(this.element),this.state$.setState(`running`),this.subscription.add(V.merge(...ec.map(e=>V.fromEvent(this.element,e)),V.fromEvent(V.getWindow(),`online`),V.interval(this.tuning.dash.tickMaintainInterval)).subscribe(()=>this.tick(),e=>this.error$.next({id:`DashVKPlayer`,category:V.ErrorCategory.WTF,message:`Internal logic error`,thrown:e})));let e=[...this.source?.activeSourceBuffers??[]];this.subscription.add(V.merge(...e.map(e=>V.fromEvent(e,`updateend`))).subscribe(e=>this.reinitDecoderIfNeeded())),this.subscription.add(V.fromEvent(this.element,`waiting`).subscribe(e=>{this.stallWatchdogSubscription&&(this.stallWatchdogSubscription.unsubscribe(),this.subscriptionRemovable.remove(this.stallWatchdogSubscription),this.stallTracer?.end()),this.stallTracer=this.tracer.createComponentTracer(`stall`),this.stallWatchdogSubscription=V.interval(this.tuning.dash.stallWatchdogInterval).subscribe(()=>this.stallWatchdogIntervalCallback(),e=>this.error$.next({id:`StallWatchdogCallback`,category:V.ErrorCategory.NETWORK,message:`Can't restore DASH after stall.`,thrown:e})),this.subscriptionRemovable.add(this.stallWatchdogSubscription)}))}switchRepresentation(e,t,n){var r=this;return a(function*(){return{video:r.videoBufferManager,audio:r.audioBufferManager,text:null}[e]?.switchTo(t,n)})()}seek(e,t=!1){var n=this;return a(function*(){V.assertNonNullable(n.element);let r;r=t||n.element.duration*1e3<=n.tuning.dashSeekInSegmentDurationThreshold||Math.abs(n.element.currentTime*1e3-e)<=n.tuning.dashSeekInSegmentAlwaysSeekDelta?e:Math.max(n.videoBufferManager?.findSegmentStartTime(e)??e,n.audioBufferManager?.findSegmentStartTime(e)??e),n.warmUpMediaSourceIfNeeded(r),yield Promise.all([n.videoBufferManager?.prepareSeek(),n.audioBufferManager?.prepareSeek()]),n.element.currentTime=r/1e3,yield Promise.all([n.videoBufferManager?.seek(r),n.audioBufferManager?.seek(r)]),yield n.reinitDecoderIfNeeded()})()}warmUpMediaSourceIfNeeded(e=this.element?.currentTime){V.isNonNullable(this.element)&&V.isNonNullable(this.source)&&V.isNonNullable(e)&&this.isStreamEnded&&this.element.duration*1e3-e>this.tuning.dash.seekBiasInTheEnd&&this.nativeBufferManagers.forEach(e=>e.warmUpMediaSource())}getForwardBufferRepresentations(e){return e===`video`?this.videoBufferManager?.getForwardBufferRepresentations():this.audioBufferManager?.getForwardBufferRepresentations()}getActiveVideoSegmentProgress(){return this.videoBufferManager?.getActiveSegmentProgress()}getMpdVideoSegmentDuration(){return this.videoBufferManager?.getMpdSegmentDuration()}get isStreamEnded(){return this.source?.readyState===`ended`}getStreams(){return this.manifest?.streams}getCodecs(){return this.manifest?.codecs}setBufferTarget(e){this.bufferManagers.forEach(t=>t.setTarget(e))}setPreloadOnly(e){this.bufferManagers.forEach(t=>t.setPreloadOnly(e))}stop(){this.tracer.log(`stop`),this.element?.querySelectorAll(`source`).forEach(e=>{URL.revokeObjectURL(e.src),e.remove()}),this.element=null,this.source=null,this.manifest=null,this.currentVideoRepresentation$.next(void 0),this.nativeBufferManagers.forEach(e=>e.destroy()),this.videoBufferManager?.destroy(),this.videoBufferManager=null,this.audioBufferManager?.destroy(),this.audioBufferManager=null,this.bufferManagers=[],this.state$.setState(`none`)}destroy(){this.subscription.unsubscribe(),this.subscriptionRemovable.unsubscribe(),this.representationSubscription.unsubscribe(),this.timeoutSourceOpenId&&V.getWindow().clearTimeout(this.timeoutSourceOpenId),this.destroyController.abort(),this.fetcher.destroy(),this.stop(),V.isNonNullable(this.source)&&this.isStreamNotOpen&&Array.from(this.source.sourceBuffers).every(e=>!e.updating)&&this.source.endOfStream(),this.source=null,this.tracer.end()}updateSourceDurationFromSegments(){if(!this.source||this.source.readyState!==`open`||this.isLive$.getValue()||!this.tuning.useDurationFromSegments)return;let e=e=>{this.updateDurationError$.next({id:`updateDuration`,category:V.ErrorCategory.VIDEO_PIPELINE,message:"Duration can`t be updated",thrown:e})};try{if(!this.isAnyBufferUpdating()){this.source.duration=this.calculateDurationFromBuffersSegments()/1e3;return}}catch(t){e(t);return}let t=new V.Subscription;t.add(V.merge(...this.nativeBufferManagers.map(e=>e.updateEnd$)).subscribe(()=>{if(!this.isAnyBufferUpdating()){t.unsubscribe();try{this.source&&(this.source.duration=this.calculateDurationFromBuffersSegments()/1e3)}catch(t){e(t)}}}))}calculateDurationFromBuffersSegments(){return Math.max(this.videoBufferManager?.calculateDurationFromSegments()||0,this.audioBufferManager?.calculateDurationFromSegments()||0)}isAnyBufferUpdating(){return!this.source||this.source.readyState!==`open`?!1:Array.from(this.source.sourceBuffers).some(e=>e.updating)}get isStreamNotOpen(){return this.source?.readyState!==`open`}reinitDecoderIfNeeded(e=!1){var t=this;return a(function*(){let n=t.videoNativeBufferManager?.getBufferState()??t.audioNativeBufferManager?.getBufferState()??[];if(V.isNullable(t.element)||!n.length)return;let r=t.element.currentTime*1e3;t.element.readyState<3&&n.some(({from:e,to:n})=>r>=e&&r<=n&&n-e>t.tuning.dash.minNativeBufferSize/2)&&(e?yield t.seek(r):t.element.currentTime=t.element.currentTime)})()}stallWatchdogIntervalCallback(){var e=this;return a(function*(){V.assertNonNullable(e.element),V.assertNonNullable(e.source);let{stallWatchdogInterval:t}=e.tuning.dash;if(e.isStreamNotOpen)return;let n=e.currentStallDuration$.getValue()+t;if(e.currentStallDuration$.next(n),yield e.reinitDecoderIfNeeded(n%1e3==0),e.isStallExceeded(n)){let t=e.audioBufferManager?.getMutexInfo()??``,r=e.videoBufferManager?.getMutexInfo()??``;if(e.stallTracer?.log(`stallExceeded`,V.flattenObject({timeInWaiting:n,audioMutexState:t,videoMutexState:r,mutexStallExitPolicy:e.tuning.dash.mutexStallExitPolicy,seekStallExitPolicy:e.tuning.dash.seekStallExitPolicy})),e.tuning.dash.mutexStallExitPolicy&&(t||r)){let i=`video: ${r} | audio: ${t}`;throw e.stallTracer?.end(),Error(`Stall timeout exceeded: ${n} ms ${i}`)}else if(e.tuning.dash.seekStallExitPolicy)if(e.stallTimeInWaitingExitAttemptMade>0&&n-e.stallTimeInWaitingExitAttemptMade>e.tuning.dash.restoreBufferBeforeCrashTimeout){let i=`video: ${r} | audio: ${t}`;throw e.stallTracer?.end(),Error(`Stall timeout exceeded: ${n} ms ${i}`)}else e.stallTimeInWaitingExitAttemptMade===0&&(e.stallTracer?.log(`seek`),yield e.seek((e.element.currentTime+1)*1e3),e.stallTimeInWaitingExitAttemptMade=n);else{e.stallTracer?.end();let i=`video: ${r} | audio: ${t}`;throw Error(`Stall timeout exceeded: ${n} ms ${i}`)}}yield e.restoreAfterDeepStall()})()}isStallExceeded(e){if(V.isNullable(this.element))return!1;let{crashOnStallTimeout:t,virtualBufferEmptinessTolerance:n}=this.tuning.dash,r=n,i=this.element?this.element.currentTime*1e3:0,a=i-r>0?this.tuning.dash.crashOnStallTWithoutDataTimeout:t,o=V.now(),s=this.videoBufferManager?.lastDataObtainedTimestamp??0;this.videoLastDataObtainedTimestamp$.next(s);let c=this.audioBufferManager?.lastDataObtainedTimestamp??0,l=this.videoNativeBufferManager?.getForwardBufferDuration(i)??0,u=this.audioNativeBufferManager?.getForwardBufferDuration(i)??0,d=V.isNonNullable(this.videoBufferManager)&&l<r&&o-s>a,f=V.isNonNullable(this.audioBufferManager)&&u<r&&o-c>a;return(d||f)&&e>a||e>=t}updateManifest(){var e=this;return a(function*(){e.tracer.log(`updateManifestStart`,{manifestUrl:e.manifestUrlString});let t=yield e.fetchManifest();if(V.isNullable(t))return null;let n=e.parseManifest(t);if(!n)return null;let r=e.getResultManifest(n);return e.tracer.log(`updateManifestEnd`,V.flattenObject(r)),r})()}parseManifest(e){try{return xo(e??``,this.manifestUrlString)}catch(t){let n=Pa(e)??{id:`ManifestParsing`,category:V.ErrorCategory.PARSER,message:`Failed to parse MPD manifest`,thrown:t};this.error$.next(n)}}getResultManifest(e){let t={text:e.streams.text,video:[],audio:[]},n=(e,t,n)=>{var r,i,a,o;return!!(!((r=this.element)==null||(i=r.canPlayType)==null)&&i.call(r,t)&&!((a=ke())==null||(o=a.isTypeSupported)==null)&&o.call(a,`${t}; codecs="${n}"`)||e===`text`)},r,i;for(let a of[`video`,`audio`]){let o=e.streams[a].filter(({mime:e,codecs:t})=>n(a,e,t));t[a]=o;let s,c;if(this.tuning.dash.codecsPrioritizeEnabled){if(a===`audio`)i=Dr(o.map(({codecs:e})=>e)),s=i[0],s&&(t[a]=o.filter(({codecs:e})=>Or(e)===s));else if(a===`video`){r=Tr(o,{preferHdr:this.tuning.preferHDR});let e=this.forceVideoCodec;c=(e?r.find(t=>t.name===e.name&&t.hdr===e.hdr):void 0)??r[0],c&&(t[a]=o.filter(e=>Or(e.codecs)===c.name&&!!e.hdr===c.hdr))}}else{let e=wr(new Set(o.map(({codecs:e})=>e)));e&&(t[a]=o.filter(({codecs:t})=>t.startsWith(e)))}if(a===`video`){if(!this.tuning.dash.codecsPrioritizeEnabled){let e=this.tuning.preferHDR,n=t.video.some(e=>e.hdr),r=t.video.some(e=>!e.hdr);j.display.isHDR&&e&&n?t.video=t.video.filter(e=>e.hdr):r&&(t.video=t.video.filter(e=>!e.hdr))}let{videoStreamRepresentaionsFilter:e}=this.tuning.dash;if(e.length&&jr(t,e),this.dashMaxTvVideoQuality&&$s(t,this.dashMaxTvVideoQuality),this.isOnDemand&&this.tuning.dash.filterOnDemandQualityList)for(let e of t.video)e.representations=e.representations.sort((e,t)=>t.height-e.height).filter((e,t)=>t%2==0)}}let a=o(o({},e),{},{streams:t});return this.tuning.dash.codecsPrioritizeEnabled&&(a.codecs={video:r,audio:i}),a}stopStallWatchdogSubscription(){this.stallWatchdogSubscription?.unsubscribe(),this.stallTimeInWaitingExitAttemptMade=0,this.currentStallDuration$.next(0),this.stallTracer?.end()}createBuffers(e,t,n,r){V.assertNonNullable(this.manifest),V.assertNonNullable(this.element);let i=e=>{this.representationSubscription.add(V.fromEvent(e,`error`).pipe(V.filter(e=>!!this.element?.played.length)).subscribe(e=>{this.error$.next({id:`VideoSource`,category:V.ErrorCategory.VIDEO_PIPELINE,message:`Unexpected video source error`,thrown:e})}))};this.source=Me();let a=V.getWindow().document,o=a.createElement(`source`);if(i(o),o.src=URL.createObjectURL(this.source),this.element.appendChild(o),Ae())if(r){let e=a.createElement(`source`);i(e),e.type=`application/x-mpegurl`,e.src=r.url,this.element.appendChild(e)}else this.element.disableRemotePlayback=!0;if(V.isNonNullable(t)){let t=this.manifest.streams.video.reduce((e,t)=>[...e,...t.representations],[]);t.length&&(this.videoNativeBufferManager=new Gs(this.source),this.videoBufferManager=Ls.getBufferManager(`video`,this.videoNativeBufferManager,t,e),this.bufferManagers.push(this.videoBufferManager),this.nativeBufferManagers.push(this.videoNativeBufferManager))}if(V.isNonNullable(n)){this.audioNativeBufferManager=new Gs(this.source);let t=this.manifest.streams.audio.reduce((e,t)=>[...e,...t.representations],[]);this.audioBufferManager=Ls.getBufferManager(`audio`,this.audioNativeBufferManager,t,e),this.bufferManagers.push(this.audioBufferManager),this.nativeBufferManagers.push(this.audioNativeBufferManager)}}waitStreamToOpen(){var e=this;return a(function*(){if(e.isStreamNotOpen){let t=e.tuning.dash.sourceOpenTimeout>=0;yield new Promise(n=>{t&&(e.timeoutSourceOpenId=V.getWindow().setTimeout(()=>{if(e.isStreamNotOpen){n();return}e.error$.next({id:`OpenOfStream`,category:V.ErrorCategory.VIDEO_PIPELINE,message:`Failed to open MediaSource`,thrown:Error(`Timeout reject when wait sourceopen event`),traceAsLog:!0})},e.tuning.dash.sourceOpenTimeout)),e.source?.addEventListener(`sourceopen`,()=>{e.timeoutSourceOpenId&&V.getWindow().clearTimeout(e.timeoutSourceOpenId),n()},{once:!0})})}})()}initRepresentationSubscriptions(){this.representationSubscription.add(this.fetcher.manifestRequested.subscribe(this.manifestRequested)),this.representationSubscription.add(this.fetcher.manifestReceived.subscribe(this.manifestReceived)),this.representationSubscription.add(this.fetcher.firstBytesRequested.subscribe(this.firstBytesRequested)),this.representationSubscription.add(this.fetcher.firstBytesReceived.subscribe(this.firstBytesReceived)),this.representationSubscription.add(this.fetcher.lastConnectionType$.subscribe(this.lastConnectionType$)),this.representationSubscription.add(this.fetcher.lastConnectionReused$.subscribe(this.lastConnectionReused$)),this.representationSubscription.add(this.fetcher.lastRequestFirstBytes$.subscribe(this.lastRequestFirstBytes$)),this.representationSubscription.add(this.fetcher.lastConnectionMetrics$.subscribe(this.lastConnectionMetrics$)),this.representationSubscription.add(this.fetcher.lastDownloadMetrics$.subscribe(this.lastDownloadMetrics$)),this.representationSubscription.add(V.merge(...this.bufferManagers.map(e=>e.error$)).subscribe(this.error$)),this.videoBufferManager&&(this.representationSubscription.add(this.videoBufferManager.playingRepresentation$.subscribe(this.currentVideoRepresentation$)),this.representationSubscription.add(this.videoBufferManager.playingRepresentationInit$.subscribe(this.currentVideoRepresentationInit$)),this.representationSubscription.add(this.videoBufferManager.currentSegmentLength$.subscribe(this.currentVideoSegmentLength$))),this.audioBufferManager&&(this.representationSubscription.add(this.audioBufferManager.playingRepresentation$.subscribe(this.currentAudioRepresentation$)),this.representationSubscription.add(this.audioBufferManager.currentSegmentLength$.subscribe(this.currentAudioSegmentLength$))),this.initBufferLengthSubscription()}initBufferLengthSubscription(){this.representationSubscription.add(V.merge(...tc.map(e=>V.fromEvent(this.element,e)),V.interval(this.tuning.dash.tickMaintainInterval)).pipe(V.map(e=>this.videoBufferManager?.getPlaybackBufferState()),V.filter(V.isNonNullable),V.map(({from:e,to:t})=>({from:e/1e3,to:t/1e3}))).subscribe(this.currentBuffer$)),this.representationSubscription.add(V.merge(...tc.map(e=>V.fromEvent(this.element,e)),V.interval(this.tuning.dash.tickMaintainInterval)).pipe(V.map(e=>Math.min(this.videoBufferManager?.getForwardPlaybackBufferDuration()??1/0,this.audioBufferManager?.getForwardPlaybackBufferDuration()??1/0)),V.filterChanged()).subscribe(this.bufferLength$)),this.representationSubscription.add(this.nativeBufferLength$.pipe(V.filter(e=>e>this.tuning.dash.virtualBufferEmptinessTolerance)).subscribe(()=>this.stopStallWatchdogSubscription()))}initTracerSubscription(){let e=V.getTraceSubscriptionMethod(this.tracer.error.bind(this.tracer));this.subscription.add(this.error$.subscribe(e(`error`)))}tick(){var e=this;return a(function*(){if(V.isNullable(e.element)||e.isStreamNotOpen)return;let t=e.element.currentTime*1e3,n=e.videoNativeBufferManager?.getBufferState()??[],r=e.audioNativeBufferManager?.getBufferState()??[],i=n.find(e=>t>=e.from&&t<=e.to),a=r.find(e=>t>=e.from&&t<=e.to),o=i?i.to-t:0,s=a?a.to-t:1/0;V.isNonNullable(e.videoBufferManager)?e.nativeBufferLength$.next(Math.min(o,s)):V.isNonNullable(e.audioBufferManager)&&e.nativeBufferLength$.next(s);let c=e.videoBufferManager?.lastDataObtainedTimestamp??0;e.videoLastDataObtainedTimestamp$.next(c),yield Promise.all([e.videoBufferManager?.maintain(),e.audioBufferManager?.maintain()])})()}}var rc=require(`@vkontakte/videoplayer-shared`);class ic extends nc{constructor(e){super(e)}prepareManifestUrlString(e,t){return e}initRepresentationSubscriptions(){super.initRepresentationSubscriptions(),this.initDisableStallWatchdogSubscription(),this.initEndOfVideoSubscription()}setSourceInitDuration(){rc.assertNonNullable(this.manifest),rc.assertNonNullable(this.source);let e=[this.manifest.duration??0,...Aa.arrayFlatMap(Aa.arrayFlatMap([...this.manifest.streams.audio,...this.manifest.streams.video],e=>e.representations),e=>{let t=[];return e.duration&&t.push(e.duration),Zr(e.segmentReference)&&e.segmentReference.totalSegmentsDurationMs&&t.push(e.segmentReference.totalSegmentsDurationMs),t})];this.source.duration=Math.max(...e)/1e3}restoreAfterDeepStall(){var e=this;return a(function*(){rc.assertNonNullable(e.element);let t=e.element.currentTime*1e3;e.stallTracer?.log(`restore maintain`,{position:t}),yield Promise.all([e.videoBufferManager?.maintain(t),e.audioBufferManager?.maintain(t)])})()}initDisableStallWatchdogSubscription(){rc.assertNonNullable(this.element);let e=rc.merge(rc.fromEvent(this.element,`ended`),this.forceEnded$),t=this.nativeBufferLength$.pipe(rc.filter(e=>e>this.tuning.dash.virtualBufferEmptinessTolerance));this.representationSubscription.add(rc.merge(e,t).subscribe(e=>this.stopStallWatchdogSubscription()))}initEndOfVideoSubscription(){let e=rc.merge(...this.bufferManagers.map(e=>e.fullyBuffered$)).pipe(rc.map(()=>this.bufferManagers.every(e=>e.fullyBuffered$.getValue()))),t=rc.merge(...this.bufferManagers.map(e=>e.onLastSegment$)).pipe(rc.map(()=>this.bufferManagers.some(e=>e.onLastSegment$.getValue()))),n=rc.combine({allBuffersFull:e,someBufferEnded:t}).pipe(rc.filterChanged(),rc.map(({allBuffersFull:e,someBufferEnded:t})=>e&&t),rc.filter(e=>e));this.representationSubscription.add(rc.merge(this.forceEnded$,n).pipe(rc.filter(e=>rc.isNonNullable(this.source)&&this.source.readyState===`open`&&Array.from(this.source.sourceBuffers).every(e=>!e.updating))).subscribe(()=>{try{this.source?.endOfStream()}catch(e){this.error$.next({id:`EndOfStream`,category:rc.ErrorCategory.VIDEO_PIPELINE,message:`Failed to end MediaSource stream`,thrown:e})}}))}}class ac extends ka{subscribe(){super.subscribe();let{output:e,observableVideo:t,connect:n,genericErrorListener:r}=this.getProviderSubscriptionInfo();n(t.timeUpdate$,e.position$),n(t.durationChange$,e.duration$),this.subscription.add(this.player.currentVideoRepresentation$.pipe(Hr.filterChanged(),Hr.filter(e=>Hr.isNonNullable(e))).subscribe(()=>{this.player.updateSourceDurationFromSegments()},r)),this.subscription.add(this.player.currentAudioRepresentation$.pipe(Hr.filterChanged(),Hr.filter(e=>Hr.isNonNullable(e))).subscribe(()=>{this.player.updateSourceDurationFromSegments()},r))}getPlayer(){return new ic({throughputEstimator:this.params.dependencies.throughputEstimator,tuning:this.params.tuning,compatibilityMode:this.params.source.compatibilityMode,tracer:this.tracer,forceVideoCodec:this.params.forceVideoCodec,isOnDemand:this.params.isOnDemand||!1,dashMaxTvVideoQuality:this.params.dashMaxTvVideoQuality})}seek(e,t){this.params.output.willSeekEvent$.next(),this.player.seek(e,t)}}var oc=require(`@vkontakte/videoplayer-shared`),sc=require(`@vkontakte/videoplayer-shared`);class cc{constructor(e){i(this,`prevReported`,void 0),i(this,`rawSeries$`,void 0),i(this,`smoothedSeries$`,void 0),i(this,`reportedSeries$`,void 0),i(this,`smoothed`,void 0),i(this,`pastMeasures`,[]),i(this,`takenMeasures`,0),i(this,`measuresCursor`,0),i(this,`params`,void 0),i(this,`smoothed$`,void 0),i(this,`debounced$`,void 0),i(this,`varianceCoefficient$`,void 0),this.params=e,this.pastMeasures=Array(e.deviationDepth),this.smoothed=this.prevReported=e.initial,this.smoothed$=new sc.ValueSubject(e.initial),this.debounced$=new sc.ValueSubject(e.initial),this.varianceCoefficient$=new sc.ValueSubject(0);let t=e.label??`value`+Math.random().toString(16).substring(2,6);this.rawSeries$=new sn(`raw_${t}`),this.smoothedSeries$=new sn(`smoothed_${t}`),this.reportedSeries$=new sn(`reported_${t}`),this.rawSeries$.next(e.initial),this.smoothedSeries$.next(e.initial),this.reportedSeries$.next(e.initial)}next(e){let t=0,n=0;for(let e=0;e<this.pastMeasures.length;e++)this.pastMeasures[e]!==void 0&&(t+=(this.pastMeasures[e]-this.smoothed)**2,n++);this.takenMeasures=n,t/=n;let r=Math.sqrt(t);n>=2&&this.smoothed>0&&this.varianceCoefficient$.next(r/this.smoothed);let i=this.smoothed+this.params.deviationFactor*r,a=this.smoothed-this.params.deviationFactor*r;this.pastMeasures[this.measuresCursor]=e,this.measuresCursor=(this.measuresCursor+1)%this.pastMeasures.length,this.rawSeries$.next(e),this.updateSmoothedValue(e),this.smoothed$.next(this.smoothed),this.smoothedSeries$.next(this.smoothed),!(this.smoothed>i||this.smoothed<a)&&(sc.isNullable(this.prevReported)||Math.abs(this.smoothed-this.prevReported)/this.prevReported>=this.params.changeThreshold)&&(this.prevReported=this.smoothed,this.debounced$.next(this.smoothed),this.reportedSeries$.next(this.smoothed))}}class lc extends cc{constructor(e){super(e),i(this,`slow`,void 0),i(this,`fast`,void 0),this.slow=this.fast=e.initial}updateSmoothedValue(e){this.slow=ii(this.slow,e,this.params.emaAlphaSlow),this.fast=ii(this.fast,e,this.params.emaAlphaFast),this.smoothed=(this.params.fastDirection>0?Math.max:Math.min)(this.slow,this.fast)}}class uc extends cc{constructor(e){super(e),i(this,`emaSmoothed`,void 0),this.emaSmoothed=e.initial}updateSmoothedValue(e){let t=ai(this.pastMeasures,this.takenMeasures);this.emaSmoothed=ii(this.emaSmoothed,e,this.params.emaAlpha),this.smoothed=oi(this.pastMeasures,this.takenMeasures,this.measuresCursor-1,this.params.basisTrendChangeCount)?this.emaSmoothed:t}}class dc extends cc{constructor(e){super(e),i(this,`extremumInterval`,void 0),i(this,`furtherValues`,[]),i(this,`currentTopExtremumValue`,0),this.extremumInterval=e.extremumInterval}next(e){this.currentTopExtremumValue<=e?(this.currentTopExtremumValue=e,this.furtherValues=[]):this.furtherValues.length===this.extremumInterval?(super.next(this.currentTopExtremumValue),this.currentTopExtremumValue=e,this.furtherValues=[]):this.furtherValues.push(e)}updateSmoothedValue(e){this.smoothed=this.smoothed?ii(this.smoothed,e,this.params.emaAlpha):e}}class fc{static getSmoothedValue(e,t,n){return n.type===`TwoEma`?new lc({initial:e,emaAlphaSlow:n.emaAlphaSlow,emaAlphaFast:n.emaAlphaFast,changeThreshold:n.changeThreshold,fastDirection:t,deviationDepth:n.deviationDepth,deviationFactor:n.deviationFactor,label:`throughput`}):new uc({initial:e,emaAlpha:n.emaAlpha,basisTrendChangeCount:n.basisTrendChangeCount,changeThreshold:n.changeThreshold,deviationDepth:n.deviationDepth,deviationFactor:n.deviationFactor,label:`throughput`})}static getLiveBufferSmoothedValue(e,t){return new dc(o({initial:e,label:`liveEdgeDelay`},t))}}var W=require(`@vkontakte/videoplayer-shared`),pc=(e,t)=>{e&&e.playbackRate!==t&&(e.playbackRate=t)},mc=require(`@vkontakte/videoplayer-shared`);class hc{constructor(e,t){i(this,`currentRepresentation$`,new mc.ValueSubject(null)),i(this,`maxRepresentations`,4),i(this,`representationsCursor`,0),i(this,`representations`,[]),i(this,`getCurrentPosition`,void 0),i(this,`currentSegment`,null),this.getCurrentPosition=t.getCurrentPosition,this.processStreams(e)}updateLive(e){this.processStreams(e?.streams.text)}seekLive(e){this.processStreams(e)}maintain(e=this.getCurrentPosition()){if(!mc.isNullable(e))for(let t of this.representations)for(let n of t){let t=n.segmentReference,r=t.segments.length,i=t.segments[0].time.from,a=t.segments[r-1].time.to;if(e<i||e>a)continue;let s=t.segments.find(t=>t.time.from<=e&&t.time.to>=e);!s||this.currentSegment?.time.from===s.time.from&&this.currentSegment.time.to===s.time.to||(this.currentSegment=s,this.currentRepresentation$.next(o(o({},n),{},{label:`Live Text`,language:`ru`,isAuto:!0,url:new URL(s.url,t.baseUrl).toString()})))}}destroy(){this.currentRepresentation$.next(null),this.currentSegment=null,this.representations=[]}processStreams(e){for(let t of e??[]){let e=hc.filterRepresentations(t.representations);if(e){this.representations[this.representationsCursor]=e,this.representationsCursor=(this.representationsCursor+1)%this.maxRepresentations;break}}}static isSupported(e){return!!e?.some(e=>hc.filterRepresentations(e.representations))}static filterRepresentations(e){return e?.filter(e=>e.kind===`text`&&`segmentReference`in e&&Zr(e.segmentReference))}}class gc extends nc{constructor(e){super(e),i(this,`liveTextManager`,void 0),i(this,`liveStreamEndTimestamp`,0),i(this,`liveBuffer`,void 0),i(this,`livePauseWatchdogSubscription`,void 0),i(this,`liveWasInterrupted`,!1),this.liveBuffer=fc.getLiveBufferSmoothedValue(this.tuning.dashCmafLive.lowLatency.maxTargetOffset,o({},e.tuning.dashCmafLive.lowLatency.bufferEstimator))}seek(e){var t=this;return a(function*(){W.assertNonNullable(t.element),t.updateManifestUrlWithTimeOffset(e),t.manifest=yield t.updateManifest(),yield t.forcePositionToRepresentationInitialTime()})()}initBuffer(){super.initBuffer(),this.forcePositionToRepresentationInitialTime()}forcePositionToRepresentationInitialTime(){var e=()=>super.seek,t=this;return a(function*(){let n=t.videoBufferManager?.getRepresentationInitialTime()??0;yield e().call(t,n,!1)})()}tick(){var e=()=>super.tick,t=this;return a(function*(){yield e().call(t);let n=(t.element?.currentTime??0)*1e3;t.liveTextManager?.maintain(n)})()}setSourceInitDuration(){W.assertNonNullable(this.source),this.source.duration=2**53-1}isStallExceeded(e){let{keepSilentStallWatchdogWhenNotActive:t}=this.tuning.dashCmafLive,n=this.liveStreamStatus$.getValue()===`active`;return(!t||n)&&super.isStallExceeded(e)}restoreAfterDeepStall(){var e=this;return a(function*(){let{liveStallReinitInterval:t}=e.tuning.dash,{keepSilentStallWatchdogWhenNotActive:n}=e.tuning.dashCmafLive,r=e.currentStallDuration$.getValue(),i=e.liveStreamStatus$.getValue()===`active`;if(r%t===0){let t=e.normalizeLiveOffset(-1*e.livePositionFromPlayer$.getValue()*1e3);!i&&n?(e.liveWasInterrupted=!0,e.updateManifestUrlWithTimeOffset(t),e.manifest=yield e.updateManifest(),yield e.forcePositionToRepresentationInitialTime()):e.seek(t).catch(t=>{e.error$.next({id:`stallIntervalCallback`,category:W.ErrorCategory.VIDEO_PIPELINE,message:`stallIntervalCallback failed`,thrown:t})})}})()}updateManifest(){var e=()=>super.updateManifest,t=this;return a(function*(){let n=yield e().call(t);if(W.isNullable(n))return null;if(W.isNullable(n.live))return t.error$.next({id:`ManifestParsing`,category:W.ErrorCategory.PARSER,message:`MPD doesnt contain live section for live stream`}),null;t.isLive$.next(!0);let{availabilityStartTime:r,latestSegmentPublishTime:i,streamIsUnpublished:a,streamIsAlive:o}=n.live,s=(n.duration??0)/1e3;t.liveSeekableDuration$.next(-1*s),t.liveDuration$.next((i-r)/1e3),t.liveAvailabilityStartTime$.next(n.live.availabilityStartTime);let c=`active`;if(o||(c=a?`unpublished`:`unexpectedly_down`),t.liveStreamStatus$.next(c),t.bufferManagers.forEach(e=>e.updateManifest(n)),t.liveTextManager?.updateLive(n),o&&t.liveWasInterrupted){t.liveWasInterrupted=!1,t.stopStallWatchdogSubscription();let e=t.normalizeLiveOffset(-1*t.livePositionFromPlayer$.getValue()*1e3);t.seek(e).catch(e=>{t.error$.next({id:`updateManifest`,category:W.ErrorCategory.VIDEO_PIPELINE,message:`seekLive after stream restore failed`,thrown:e})})}return n})()}prepareManifestUrlString(e,t){return ue(e,t,2)}updateManifestUrlWithTimeOffset(e){let t=this.liveStreamStatus$.getValue()===`active`?0:W.now()-this.liveStreamEndTimestamp,n=this.normalizeLiveOffset(e+t);this.isActiveLive$.next(n===0),this.manifestUrlString=ue(this.manifestUrlString,n,2)}createBuffers(e,t,n,r){W.assertNonNullable(this.manifest),super.createBuffers(e,t,n,r),hc.isSupported(this.manifest.streams.text)&&!this.isLowLatency$.getValue()&&(this.liveTextManager=new hc(this.manifest.streams.text,e))}initRepresentationSubscriptions(){W.assertNonNullable(this.element),W.assertNonNullable(this.videoBufferManager),this.isActiveLive$.next(this.isLive$.getValue()),super.initRepresentationSubscriptions();let e=this.videoBufferManager,t=this.bufferManagers;this.initStreamDurationOnPauseSubscription(),this.initLiveChangePlaybackRateSubscriptions(),this.initLiveDurationSubscriptions(e),this.initLiveBufferInfoSubscriptions(e,t),this.initLiveMaintainSubscription(t),W.isNonNullable(this.liveTextManager)&&this.representationSubscription.add(this.liveTextManager.currentRepresentation$.subscribe(this.currentLiveTextRepresentation$))}initStreamDurationOnPauseSubscription(){var e=this;W.assertNonNullable(this.element);let{liveUpdateInterval:t}=this.tuning.dash,n=()=>W.interval(t).subscribe(function(){var n=a(function*(n){let r=de(e.manifestUrlString,2);e.manifestUrlString=ue(e.manifestUrlString,r+t,2),e.liveStreamStatus$.getValue()===`active`&&(e.manifest=yield e.updateManifest())});return function(e){return n.apply(this,arguments)}}());this.representationSubscription.add(W.fromEvent(this.element,`pause`).subscribe(e=>{this.livePauseWatchdogSubscription=n(),this.representationSubscription.add(this.livePauseWatchdogSubscription)})),this.representationSubscription.add(W.fromEvent(this.element,`play`).subscribe(e=>this.livePauseWatchdogSubscription?.unsubscribe()))}initLiveDurationSubscriptions(e){this.representationSubscription.add(this.liveDuration$.pipe(W.filterChanged()).subscribe(e=>this.liveStreamEndTimestamp=W.now())),this.representationSubscription.add(e.currentLowLatencySegmentLength$.subscribe(e=>{if(!this.isActiveLive$.getValue()&&!this.isLowLatency$.getValue()&&!e)return;let t=this.liveSeekableDuration$.getValue()-e/1e3;this.liveSeekableDuration$.next(Math.max(t,-1*this.tuning.dashCmafLive.maxLiveDuration)),this.liveDuration$.next(this.liveDuration$.getValue()+e/1e3)}))}initLiveChangePlaybackRateSubscriptions(){this.representationSubscription.add(W.combine({isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(W.map(({isActiveLive:e,isLowLatency:t})=>e&&t),W.filterChanged(),W.filter(e=>!this.isManualDecreasePlaybackInLive())).subscribe(e=>pc(this.element,1))),this.representationSubscription.add(W.combine({liveBuffer:this.liveBuffer.smoothed$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(W.filter(e=>!this.isManualDecreasePlaybackInLive())).subscribe(({liveBuffer:e,isActiveLive:t,isLowLatency:n})=>{if(!n||!t)return;let r=this.tuning.dashCmafLive.lowLatency.maxTargetOffset,i=this.tuning.dashCmafLive.lowLatency.maxTargetOffsetDeviation,a=this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup,o=e-r,s=1;Math.abs(o)>i&&(s=1+Math.sign(o)*a),pc(this.element,s)}))}initLiveBufferInfoSubscriptions(e,t){this.representationSubscription.add(W.combine({bufferLength:this.bufferLength$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(W.filter(({bufferLength:e,isActiveLive:t,isLowLatency:n})=>t&&n&&!!e),W.map(({bufferLength:e})=>e)).subscribe(this.liveBuffer)),this.representationSubscription.add(this.bufferLength$.subscribe(e=>{let n=0;if(e){let e=(this.element?.currentTime??0)*1e3;n=Math.min(...t.map(t=>t.getLiveSegmentsToLoadState(this.manifest)?.to??e))-e}this.liveLoadBufferLength$.getValue()!==n&&this.liveLoadBufferLength$.next(n)})),this.representationSubscription.add(W.combine({isLive:this.isLive$,rtt:this.throughputEstimator.rtt$,bufferLength:this.bufferLength$,segmentServerLatency:e.currentLiveSegmentServerLatency$}).pipe(W.filter(({isLive:e})=>e),W.filterChanged((e,t)=>t.bufferLength<e.bufferLength),W.map(({rtt:e,bufferLength:t,segmentServerLatency:n})=>{let r=de(this.manifestUrlString,2);return(e/2+t+n+r)/1e3})).subscribe(this.liveLatency$))}initLiveMaintainSubscription(e){var t=this;let n=0;this.representationSubscription.add(W.combine({liveLoadBufferLength:this.liveLoadBufferLength$,bufferLength:this.bufferLength$}).pipe(W.throttle(this.tuning.dash.liveUpdateInterval)).subscribe(function(){var r=a(function*({liveLoadBufferLength:r,bufferLength:i}){W.assertNonNullable(t.element);let a=t.element.playbackRate,o=de(t.manifestUrlString,2),s=Math.abs(t.livePositionFromPlayer$.getValue())*1e3,c=Math.min(s,t.tuning.dashCmafLive.normalizedTargetMinBufferSize*a),l=t.tuning.dashCmafLive.normalizedActualBufferOffset*a,u=t.tuning.dashCmafLive.normalizedLiveMinBufferSize*a,d=isFinite(r)?r:i,f=t.isActiveLive$.getValue()&&t.isLowLatency$.getValue(),p=s<=t.tuning.live.activeLiveDelay;t.isActiveLive$.next(p);let m=`none`;if(f?m=`active_low_latency`:t.isLowLatency$.getValue()&&p?(e.forEach(e=>e.proceedLowLatencyLive()),m=`active_low_latency`):o!==0&&d<c?m=`live_forward_buffering`:d<c+u&&(m=`live_with_target_offset`),isFinite(r)&&(n=r>n?r:n),m===`live_forward_buffering`||m===`live_with_target_offset`){let e=n-(c+l),i=t.normalizeLiveOffset(Math.trunc(o+e/a)),s=Math.abs(i-o),u=0;!r||s<=t.tuning.dashCmafLive.offsetCalculationError?u=o:i>0&&s>t.tuning.dashCmafLive.offsetCalculationError&&(u=i),t.manifestUrlString=ue(t.manifestUrlString,u,2)}(m===`live_with_target_offset`||m===`live_forward_buffering`)&&(n=0,t.manifest=yield t.updateManifest())});return function(e){return r.apply(this,arguments)}}(),e=>{this.error$.next({id:`updateLive`,category:W.ErrorCategory.VIDEO_PIPELINE,thrown:e,message:`Failed to update live with subscription`})}))}isManualDecreasePlaybackInLive(){if(!this.element||!this.isLive$.getValue())return!1;let e=1-this.element.playbackRate;return Number(e.toFixed(2))>Number(this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup.toFixed(2))}normalizeLiveOffset(e){return Math.trunc(e/1e3)*1e3}}class _c extends ka{constructor(e){super(e),this.textTracksManager?.destroy()}getPlayer(){return new gc({throughputEstimator:this.params.dependencies.throughputEstimator,tuning:this.params.tuning,compatibilityMode:this.params.source.compatibilityMode,tracer:this.tracer,forceVideoCodec:this.params.forceVideoCodec})}subscribe(){super.subscribe();let e=!1,t=-1,{output:n,observableVideo:r,desiredState:i,connect:a}=this.getProviderSubscriptionInfo();this.params.output.position$.next(0),this.params.output.isLive$.next(!0),this.params.output.canPlayLiveTailBuffer$.next(!0);let o=new oc.ValueSubject(1);a(r.playbackRateState$,o),a(r.timeUpdate$,n.liveBufferTime$),a(this.player.liveSeekableDuration$,n.duration$),a(this.player.liveLatency$,n.liveLatency$),this.params.tuning.dashCmafLive.catchupLiveForMutedInactiveTab&&this.subscription.add(n.elementVisible$.pipe(oc.filterChanged()).subscribe(t=>{let r=n.position$.getValue(),i=n.volume$.getValue(),a=!i.volume||i.muted;!t&&!r&&a?e=!0:t&&e&&(this.seek(0),e=!1)})),this.subscription.add(this.params.output.position$.subscribe(this.player.livePositionFromPlayer$)).add(i.isLowLatency.stateChangeEnded$.pipe(oc.map(e=>e.to)).subscribe(this.player.isLowLatency$)).add(oc.combine({liveBufferTime:n.liveBufferTime$,liveAvailabilityStartTime:this.player.liveAvailabilityStartTime$}).pipe(oc.map(({liveBufferTime:e,liveAvailabilityStartTime:t})=>e&&t?e+t:void 0)).subscribe(n.liveTime$)).add(oc.combine({liveDuration:this.player.liveDuration$,liveStreamStatus:this.player.liveStreamStatus$,playbackRate:oc.merge(r.playbackRateState$,new oc.ValueSubject(1))}).pipe(oc.filter(({liveStreamStatus:e,liveDuration:t})=>e===`active`&&!!t)).subscribe(({liveDuration:e,playbackRate:r})=>{let i=n.liveBufferTime$.getValue(),a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;a||r<1-o||this.allocation.target.paused||oc.isNullable(i)||(t=e-i)})).add(oc.combine({time:n.liveBufferTime$,liveDuration:this.player.liveDuration$,playbackRate:oc.merge(r.playbackRateState$,new oc.ValueSubject(1))}).pipe(oc.filterChanged((e,t)=>this.player.liveStreamStatus$.getValue()===`active`?e.liveDuration===t.liveDuration:e.time===t.time)).subscribe(({time:e,liveDuration:r,playbackRate:i})=>{let a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;if(!a&&!this.allocation.target.paused&&i>=1-o||oc.isNullable(e)||oc.isNullable(r))return;let s=-1*(r-e-t);n.position$.next(Math.min(s,0))})).add(this.player.currentLiveTextRepresentation$.subscribe(e=>{if(e){let t=Jr(e);this.params.output.availableTextTracks$.next([t])}})),this.params.tuning.dashCmafLive.externalStopControl||this.subscription.add(this.player.liveStreamStatus$.pipe(oc.filter(e=>oc.isNonNullable(e))).subscribe(e=>n.isLiveEnded$.next(e===`unpublished`&&n.position$.getValue()===0)))}seek(e){this.params.output.willSeekEvent$.next();let t=-e,n=Math.trunc(t/1e3<=Math.abs(this.params.output.duration$.getValue())?t:0);this.player.seek(n).then(()=>{this.params.output.position$.next(e/1e3)})}}var G=require(`@vkontakte/videoplayer-shared`),vc=require(`@vkontakte/videoplayer-shared`),yc=require(`@vkontakte/videoplayer-shared`),bc=(e,t,n=0)=>{for(let r=0;r<e.length;r++)if(e.start(r)*1e3-n<=t&&e.end(r)*1e3+n>t)return!0;return!1},K=require(`@vkontakte/videoplayer-shared`),xc=require(`@vkontakte/videoplayer-shared`),Sc=require(`@vkontakte/videoplayer-shared`),Cc=require(`@vkontakte/videoplayer-shared`),wc=require(`@vkontakte/videoplayer-shared`),Tc=require(`@vkontakte/videoplayer-shared`),Ec=require(`@vkontakte/videoplayer-shared`),Dc=require(`@vkontakte/videoplayer-shared`),Oc=require(`@vkontakte/videoplayer-shared`),kc=18,Ac=!1;try{Ac=j.browser.isSafari&&!!j.browser.safariVersion&&j.browser.safariVersion<=kc}catch(e){console.error(e)}class jc{constructor(e,t=!1){i(this,`bufferFull$`,new Oc.Subject),i(this,`error$`,new Oc.Subject),i(this,`buffer`,void 0),i(this,`queue`,[]),i(this,`currentTask`,null),i(this,`destroyed`,!1),i(this,`abortRequested`,!1),i(this,`isAbortFixEnabled`,!1),i(this,`completeTask`,()=>{try{if(this.currentTask){let e=this.currentTask.signal?.aborted;this.currentTask.callback(!e),this.currentTask=null,this.isAbortFixEnabled&&this.queue.shift()}this.queue.length&&this.pull()}catch(e){this.error$.next({id:`BufferTaskQueueUnknown`,category:Oc.ErrorCategory.VIDEO_PIPELINE,message:`Buffer appending or removal failed`,thrown:e})}}),this.buffer=e,this.isAbortFixEnabled=t,this.buffer.addEventListener(`updateend`,this.completeTask)}append(e,t){var n=this;return a(function*(){return t&&t.aborted?!1:new Promise(r=>{let i={operation:`append`,data:e,signal:t,callback:r};n.queue.push(i),n.pull()})})()}remove(e,t,n){var r=this;return a(function*(){return n&&n.aborted?!1:new Promise(i=>{let a={operation:`remove`,from:e,to:t,signal:n,callback:i};r.queue.unshift(a),r.pull()})})()}abort(e){var t=this;return a(function*(){return new Promise(n=>{let r,i=e=>{t.abortRequested=!1,n(e)};r=Ac&&e?{operation:`safariAbort`,init:e,callback:i}:{operation:`abort`,callback:i};for(let{callback:e}of t.queue)e(!1);t.abortRequested=!0,r&&(t.queue=[r]),t.pull()})})()}destroy(){this.destroyed=!0,this.buffer.removeEventListener(`updateend`,this.completeTask),this.queue=[],this.currentTask=null;try{this.buffer.abort()}catch(e){if(!(e instanceof DOMException&&e.name===`InvalidStateError`))throw e}}pull(){if((this.buffer.updating||this.currentTask||this.destroyed)&&!this.abortRequested)return;let e=this.isAbortFixEnabled?this.queue[0]:this.queue.shift();if(!e)return;if(e.signal?.aborted){e.callback(!1),this.pull();return}this.currentTask=e;let{operation:t}=this.currentTask;try{this.execute(this.currentTask)}catch(e){e instanceof DOMException&&e.name===`QuotaExceededError`&&t===`append`?this.bufferFull$.next(this.currentTask.data.byteLength):e instanceof DOMException&&e.name===`InvalidStateError`||this.error$.next({id:`BufferTaskQueue:${t}`,category:Oc.ErrorCategory.VIDEO_PIPELINE,message:`Buffer operation failed`,thrown:e}),this.currentTask.callback(!1),this.currentTask=null}this.currentTask&&this.currentTask.operation===`abort`&&this.completeTask()}execute(e){let{operation:t}=e;switch(t){case`append`:this.buffer.appendBuffer(e.data);break;case`remove`:this.buffer.remove(e.from/1e3,e.to/1e3);break;case`abort`:this.buffer.abort();break;case`safariAbort`:this.buffer.abort(),this.buffer.appendBuffer(e.init);break;default:Oc.assertNever(t)}}}var Mc=jc,Nc=e=>{let t=0;for(let n=0;n<e.length;n++)t+=e.end(n)-e.start(n);return t*1e3},q=require(`@vkontakte/videoplayer-shared`);class Pc{constructor(e,t,n,{fetcher:r,tuning:a,getCurrentPosition:o,isActiveLowLatency:l,compatibilityMode:u=!1,manifest:d}){i(this,`currentLiveSegmentServerLatency$`,new q.ValueSubject(0)),i(this,`currentLowLatencySegmentLength$`,new q.ValueSubject(0)),i(this,`currentSegmentLength$`,new q.ValueSubject(0)),i(this,`onLastSegment$`,new q.ValueSubject(!1)),i(this,`fullyBuffered$`,new q.ValueSubject(!1)),i(this,`playingRepresentation$`,new q.ValueSubject(void 0)),i(this,`playingRepresentationInit$`,new q.ValueSubject(void 0)),i(this,`error$`,new q.Subject),i(this,`gaps`,[]),i(this,`updateEnd$`,new q.ValueSubject(void 0)),i(this,`subscription`,new q.Subscription),i(this,`kind`,void 0),i(this,`initData`,void 0),i(this,`parsedInitData`,void 0),i(this,`representations`,void 0),i(this,`segments`,void 0),i(this,`allInitsLoaded`,!1),i(this,`activeSegments`,new Set),i(this,`forwardBufferRepresentations`,new Map),i(this,`mediaSource`,void 0),i(this,`playingRepresentationId`,void 0),i(this,`downloadingRepresentationId`,void 0),i(this,`switchingToRepresentationId`,void 0),i(this,`sourceBuffer`,void 0),i(this,`downloadAbortController`,new xc.AbortControllerPolyfilled),i(this,`switchAbortController`,new xc.AbortControllerPolyfilled),i(this,`destroyAbortController`,new xc.AbortControllerPolyfilled),i(this,`useSmartRepresentationSwitch`,!1),i(this,`getCurrentPosition`,void 0),i(this,`isActiveLowLatency`,void 0),i(this,`tuning`,void 0),i(this,`forwardBufferTarget`,void 0),i(this,`fetcher`,void 0),i(this,`bufferLimit`,1/0),i(this,`sourceBufferTaskQueue`,void 0),i(this,`gapDetectionIdleCallback`,void 0),i(this,`initLoadIdleCallback`,void 0),i(this,`failedDownloads`,0),i(this,`baseUrls`,[]),i(this,`baseUrlsIndex`,0),i(this,`compatibilityMode`,void 0),i(this,`preloadOnly`,void 0),i(this,`isLive`,!1),i(this,`liveUpdateSegmentIndex`,0),i(this,`liveInitialAdditionalOffset`,0),i(this,`isSeekingLive`,!1),i(this,`index`,0),i(this,`lastDataObtainedTimestampMs`,0),i(this,`loadByteRangeSegmentsTimeoutId`,0),i(this,`startWith`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e){let t=this.representations.get(e);q.assertNonNullable(t,`Cannot find representation ${e}`),this.playingRepresentationId=e,this.downloadingRepresentationId=e,this.sourceBuffer=this.mediaSource.addSourceBuffer(`${t.mime}; codecs="${t.codecs}"`),this.sourceBufferTaskQueue=new Mc(this.sourceBuffer,this.tuning.dash.useAbortMSEFix),this.subscription.add(q.fromEvent(this.sourceBuffer,`updateend`).subscribe(this.updateEnd$)),this.subscription.add(q.fromEvent(this.sourceBuffer,`updateend`).subscribe(()=>{this.checkEjectedSegments(),this.maintain()},e=>{let t,n=this.mediaSource.readyState;n!==`open`&&(t={id:`SegmentEjection_source_${n}`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when trying to clear segments ejected by browser`,thrown:e}),t??={id:`SegmentEjection`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when trying to clear segments ejected by browser`,thrown:e},this.error$.next(t)})),this.subscription.add(q.fromEvent(this.sourceBuffer,`error`).subscribe(()=>this.error$.next({id:`SourceBuffer`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`SourceBuffer Error event fired`}))),this.subscription.add(this.sourceBufferTaskQueue.bufferFull$.subscribe(e=>{let t=this.getCurrentPosition();if(!this.sourceBuffer||!t||!R(this.mediaSource,this.sourceBuffer))return;this.bufferLimit=Math.min(this.bufferLimit,Nc(this.sourceBuffer.buffered)*.8);let n=this.getForwardBufferDuration(t),r=Math.min(this.forwardBufferTarget,this.bufferLimit)*this.tuning.dash.minSafeBufferThreshold;this.pruneBuffer(t,e*2,n<r).catch(e=>{this.handleAsyncError(e,`pruneBuffer`)})})),this.subscription.add(this.sourceBufferTaskQueue.error$.subscribe(e=>this.error$.next(e))),yield this.loadInit(t,`high`,!0);let n=this.initData.get(t.id),r=this.segments.get(t.id),i=this.parsedInitData.get(t.id);q.assertNonNullable(n,`No init buffer for starting representation`),q.assertNonNullable(r,`No segments for starting representation`),n instanceof ArrayBuffer&&(this.searchGaps(r,t),yield this.sourceBufferTaskQueue.append(n,this.destroyAbortController.signal),this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(i))});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`switchTo`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e,t=!1){if(!R(this.mediaSource,this.sourceBuffer)||e===this.downloadingRepresentationId||e===this.switchingToRepresentationId)return;this.switchingToRepresentationId=e;let n=this.representations.get(e);q.assertNonNullable(n,`No such representation ${e}`);let r=this.segments.get(e),i=this.initData.get(e);if(q.isNullable(i)||q.isNullable(r)?yield this.loadInit(n,`high`,!1):i instanceof Promise&&(yield i),r=this.segments.get(e),q.assertNonNullable(r,`No segments for starting representation`),i=this.initData.get(e),!(!i||!(i instanceof ArrayBuffer)||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer))){if(yield this.abort(),yield this.sourceBufferTaskQueue.append(i,this.downloadAbortController.signal),t)this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e,yield this.dropBuffer();else{let t=this.getCurrentPosition();q.isNonNullable(t)&&!this.isLive&&(this.bufferLimit=1/0,yield s(this.pruneBuffer(t,1/0,!0))),this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e}this.maintain()}});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`switchToOld`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e,t=!1){if(!R(this.mediaSource,this.sourceBuffer)||e===this.downloadingRepresentationId||e===this.switchingToRepresentationId)return;this.switchingToRepresentationId=e;let n=this.representations.get(e);q.assertNonNullable(n,`No such representation ${e}`);let r=this.segments.get(e),i=this.initData.get(e);if(q.isNullable(i)||q.isNullable(r)?yield this.loadInit(n,`high`,!1):i instanceof Promise&&(yield i),r=this.segments.get(e),q.assertNonNullable(r,`No segments for starting representation`),i=this.initData.get(e),!(!i||!(i instanceof ArrayBuffer)||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)))if(yield this.abort(),yield this.sourceBufferTaskQueue.append(i,this.downloadAbortController.signal),t)this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e,yield this.dropBuffer(),this.maintain();else{let t=this.getCurrentPosition();q.isNonNullable(t)&&(this.isLive||(this.bufferLimit=1/0,yield s(this.pruneBuffer(t,1/0,!0))),this.maintain(t)),this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e}});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`seekLive`,q.abortable(this.destroyAbortController.signal,function(){var e=c(function*(e){let t=wc.arrayFlatMap(e,e=>e.representations);if(!this.downloadingRepresentationId||!t.length)return;this.isSeekingLive=!0;for(let e of this.representations.keys()){let n=t.find(t=>t.id===e);n&&this.representations.set(e,n);let r=this.representations.get(e);if(!r||!Os(r.segmentReference)){this.isSeekingLive=!1;return}let i=this.getActualLiveStartingSegments(r.segmentReference);this.segments.set(r.id,i)}let n=this.switchingToRepresentationId??this.downloadingRepresentationId,r=this.representations.get(n);q.assertNonNullable(r,`Representation not found by id ${n}`);let i=this.segments.get(n);q.assertNonNullable(i,`No segments for starting representation`);let a=this.initData.get(n);if(q.assertNonNullable(a,`No init buffer for starting representation`),!(a instanceof ArrayBuffer)){this.isSeekingLive=!1;return}let o=this.getDebugBufferState();this.liveUpdateSegmentIndex=0,yield this.abort(),o&&(yield this.sourceBufferTaskQueue.remove(o.from*1e3,o.to*1e3,this.destroyAbortController.signal)),this.searchGaps(i,r),yield this.sourceBufferTaskQueue.append(a,this.destroyAbortController.signal),this.isSeekingLive=!1});return function(t){return e.apply(this,arguments)}}().bind(this))),this.fetcher=r,this.tuning=a,this.compatibilityMode=u,this.forwardBufferTarget=a.dash.forwardBufferTargetAuto,this.getCurrentPosition=o,this.isActiveLowLatency=l,this.isLive=!!d?.live,this.baseUrls=d?.baseUrls??[],this.initData=new Map(n.map(e=>[e.id,null])),this.segments=new Map,this.parsedInitData=new Map,this.representations=new Map(n.map(e=>[e.id,e])),this.kind=e,this.mediaSource=t,this.sourceBuffer=null}switchToWithPreviousAbort(e,t=!1){if(!R(this.mediaSource,this.sourceBuffer)||e===this.downloadingRepresentationId||e===this.switchingToRepresentationId)return Promise.resolve();this.switchAbortController.abort(),this.switchAbortController=new xc.AbortControllerPolyfilled;let n=this.switchAbortController.signal;return n.addEventListener(`abort`,()=>{this.switchingToRepresentationId===e&&(this.switchingToRepresentationId=void 0)},{once:!0}),q.abortable(n,function(){var e=c(function*(e,t=!1){this.switchingToRepresentationId=e;let n=this.representations.get(e);q.assertNonNullable(n,`No such representation ${e}`);let r=this.segments.get(e),i=this.initData.get(e);if(q.isNullable(i)||q.isNullable(r)?yield this.loadInit(n,`high`,!1):i instanceof Promise&&(yield i),r=this.segments.get(e),q.assertNonNullable(r,`No segments for starting representation`),i=this.initData.get(e),!(i instanceof ArrayBuffer)||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)){this.switchingToRepresentationId===e&&(this.switchingToRepresentationId=void 0);return}if(yield this.abort(),yield this.sourceBufferTaskQueue.append(i,this.downloadAbortController.signal),t)this.switchingToRepresentationId=void 0,this.downloadingRepresentationId=e,yield this.dropBuffer();else{let t=this.getCurrentPosition();q.isNonNullable(t)&&!this.isLive&&(this.bufferLimit=1/0,yield this.pruneBuffer(t,1/0,!0)),this.downloadingRepresentationId=e,this.switchingToRepresentationId=void 0}this.maintain()});return function(t){return e.apply(this,arguments)}}().bind(this))(e,t)}warmUpMediaSource(){!q.isNullable(this.sourceBuffer)&&!this.sourceBuffer.updating&&(this.sourceBuffer.mode=`segments`)}abort(){var e=this;return a(function*(){for(let t of e.activeSegments)e.abortSegment(t.segment);return e.activeSegments.clear(),e.downloadAbortController.abort(),e.downloadAbortController=new xc.AbortControllerPolyfilled,e.abortBuffer()})()}maintain(e=this.getCurrentPosition()){if(q.isNullable(e)||q.isNullable(this.downloadingRepresentationId)||q.isNullable(this.playingRepresentationId)||q.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||q.isNonNullable(this.switchingToRepresentationId)||this.isSeekingLive)return;let t=this.representations.get(this.downloadingRepresentationId),n=this.representations.get(this.playingRepresentationId),r=this.segments.get(this.downloadingRepresentationId),i=this.segments.get(this.playingRepresentationId);if(q.assertNonNullable(t,`No such representation ${this.downloadingRepresentationId}`),q.assertNonNullable(n,`No such representation ${this.playingRepresentationId}`),q.isNullable(r)||q.isNullable(i))return;let a=r.find(t=>e>=t.time.from&&e<t.time.to);q.isNonNullable(a)&&isFinite(a.time.from)&&isFinite(a.time.to)&&this.currentSegmentLength$.next(a?.time.to-a.time.from);let o=e;if(this.playingRepresentationId!==this.downloadingRepresentationId){let r=this.getForwardBufferDuration(e),i=xs(n),s=xs(t),c=this.useSmartRepresentationSwitch&&this.tuning.dash.useNewRepresentationSwitch&&this.tuning.dash.useSmartRepresentationSwitch&&q.isNonNullable(i)&&q.isNonNullable(s)&&q.isHigher(i.quality,s.quality),l=this.useSmartRepresentationSwitch&&this.tuning.dash.useNewRepresentationSwitch&&this.tuning.dash.useDelayedRepresentationSwitch;if(c||l?o+=Math.min(r,this.tuning.dash.representationSwitchForwardBufferGap):a&&a.time.to-e<this.tuning.dash.maxSegmentDurationLeftToSelectNextSegment&&r>=a.time.to-e+100&&(o=a?a.time.to+100:-1/0),this.tuning.dash.useNewRepresentationSwitch){let t=[...this.segments.entries()].map(([t,n])=>({representationId:t,status:n.find(t=>e>=t.time.from&&e<t.time.to)?.status})).find(e=>e.status===`fed`)?.representationId;t&&(this.playingRepresentationId=t,this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(this.parsedInitData.get(this.playingRepresentationId)))}}if(isFinite(this.bufferLimit)&&Nc(this.sourceBuffer.buffered)>=this.bufferLimit){let t=this.getForwardBufferDuration(e),n=Math.min(this.forwardBufferTarget,this.bufferLimit)*this.tuning.dash.minSafeBufferThreshold;this.pruneBuffer(e,1/0,t<n).catch(e=>{this.handleAsyncError(e,`pruneBuffer`)});return}let s=[];if(!this.activeSegments.size&&(s=this.selectForwardBufferSegments(r,t.segmentReference.type,o),s.length)){let e=`auto`;if(this.tuning.dash.useFetchPriorityHints&&a)if(Sc.arrayIncludes(s,a))e=`high`;else{let t=Cc.arrayAt(s,0);t&&t.time.from-a.time.to>=this.forwardBufferTarget/2&&(e=`low`)}this.loadSegments(s,t,e).catch(e=>{this.handleAsyncError(e,`loadSegments`)})}(!this.preloadOnly&&!this.allInitsLoaded&&a&&a.status===`fed`&&!s.length&&this.getForwardBufferDuration(e)>3e3||this.isActiveLowLatency())&&this.loadNextInit();let c=Cc.arrayAt(r,-1);!this.isLive&&c&&(this.fullyBuffered$.next(c.time.to-e-this.getForwardBufferDuration(e)<100),this.onLastSegment$.next(e-c.time.from>0))}get lastDataObtainedTimestamp(){return this.lastDataObtainedTimestampMs}searchGaps(e,t){this.gaps=[];let n=0,r=this.isLive?this.liveInitialAdditionalOffset:0;for(let i of e)Math.trunc(i.time.from-n)>0&&this.gaps.push({representation:t.id,from:n,to:i.time.from+r,persistent:!0}),n=i.time.to;q.isNonNullable(t.duration)&&t.duration-n>0&&!this.isLive&&this.gaps.push({representation:t.id,from:n,to:t.duration,persistent:!0})}getActualLiveStartingSegments(e){let t=e.segments,n=this.isActiveLowLatency()?this.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.tuning.dashCmafLive.maxActiveLiveOffset,r=[],i=0,a=t.length-1;do r.unshift(t[a]),i+=t[a].time.to-t[a].time.from,a--;while(i<n&&a>=0);return this.liveInitialAdditionalOffset=i-n,this.isActiveLowLatency()?[r[0]]:r}getLiveSegmentsToLoadState(e){let t=e?.streams[this.kind];if(!t)return;let n=wc.arrayFlatMap(t,e=>e.representations).find(e=>e.id===this.downloadingRepresentationId);if(!n)return;let r=this.segments.get(n.id);if(r?.length)return{from:r[0].time.from,to:r[r.length-1].time.to}}updateLive(e){if(!e||[...this.segments.values()].every(e=>!e.length))return;let t=wc.arrayFlatMap(e.streams[this.kind],e=>e.representations);for(let e of t){if(!e||!Os(e.segmentReference))return;let t=e.segmentReference.segments.map(e=>o(o({},e),{},{status:`none`,size:void 0})),n=this.segments.get(e.id)??[],r=n.at(-1)?.time.to??0,i=t?.findIndex(e=>r>=e.time.from+100&&r<=e.time.to+100);if(i===-1){this.liveUpdateSegmentIndex=0;let t=this.getActualLiveStartingSegments(e.segmentReference);this.segments.set(e.id,t)}else{let r=t.slice(i+1);this.segments.set(e.id,[...n,...r])}}}proceedLowLatencyLive(){let e=this.downloadingRepresentationId;q.assertNonNullable(e);let t=this.segments.get(e);if(t?.length){let e=t[t.length-1];this.updateLowLatencyLiveIfNeeded(e)}}calculateDurationFromSegments(){if(!this.playingRepresentationId)return 0;let e=this.segments.get(this.playingRepresentationId);return(e?Cc.arrayAt(e,-1)?.time.to:0)||0}setSmartRepresentationSwitch(e){this.useSmartRepresentationSwitch=e}updateLowLatencyLiveIfNeeded(e){let t=0;for(let n of this.representations.values()){let r=n.segmentReference;if(!Os(r))return;let i=this.segments.get(n.id)??[],a=i.find(t=>Math.floor(t.time.from)===Math.floor(e.time.from));if(a&&!isFinite(a.time.to)&&(a.time.to=e.time.to,t=a.time.to-a.time.from),!i.find(t=>Math.floor(t.time.from)===Math.floor(e.time.to))&&this.isActiveLowLatency()){let t=Math.round(e.time.to*r.timescale/1e3).toString(10),n=bo(r.segmentTemplateUrl,{segmentTime:t});i.push({status:`none`,time:{from:e.time.to,to:1/0},url:n})}}this.currentLowLatencySegmentLength$.next(t)}findSegmentStartTime(e){let t=this.switchingToRepresentationId??this.downloadingRepresentationId??this.playingRepresentationId;if(!t)return;let n=this.segments.get(t);return n?n.find(t=>t.time.from<=e&&t.time.to>=e)?.time.from??void 0:void 0}setTarget(e){this.forwardBufferTarget=e}setPreloadOnly(e){this.preloadOnly=e}destroy(){if(this.initData.clear(),this.segments.clear(),this.parsedInitData.clear(),this.representations.clear(),this.sourceBufferTaskQueue?.destroy(),this.gapDetectionIdleCallback&&Tc.cancelIdleCallbackPolyfilled&&Tc.cancelIdleCallbackPolyfilled(this.gapDetectionIdleCallback),this.initLoadIdleCallback&&Tc.cancelIdleCallbackPolyfilled&&Tc.cancelIdleCallbackPolyfilled(this.initLoadIdleCallback),this.subscription.unsubscribe(),this.sourceBuffer)try{this.mediaSource.removeSourceBuffer(this.sourceBuffer)}catch(e){if(!(e instanceof DOMException&&e.name===`NotFoundError`))throw e}this.sourceBuffer=null,this.downloadAbortController.abort(),this.switchAbortController.abort(),this.destroyAbortController.abort(),window.clearTimeout(this.loadByteRangeSegmentsTimeoutId)}selectForwardBufferSegments(e,t,n){return this.isLive?this.selectForwardBufferSegmentsLive(e,n):this.selectForwardBufferSegmentsRecord(e,t,n)}selectForwardBufferSegmentsLive(e,t){let n=e.findIndex(e=>t>=e.time.from&&t<e.time.to);return this.playingRepresentationId!==this.downloadingRepresentationId&&(this.liveUpdateSegmentIndex=n),this.liveUpdateSegmentIndex<e.length?e.slice(this.liveUpdateSegmentIndex++):[]}selectForwardBufferSegmentsRecord(e,t,n){let r=this.getForwardBufferDuration(n),i=e.findIndex(({status:e,time:{from:t,to:i}},a)=>{let o=t>n||t<=n&&i>=n||a===0&&n===0,s=Math.min(this.forwardBufferTarget,this.bufferLimit),c=this.preloadOnly&&t<=n+s||r<s&&i-t>=s||i<=n+s;return(e===`none`||e===`partially_ejected`&&o&&c&&this.sourceBuffer&&R(this.mediaSource,this.sourceBuffer)&&!(bc(this.sourceBuffer.buffered,t)&&bc(this.sourceBuffer.buffered,i)))&&o&&c});if(i===-1)return[];if(t!==`byteRange`)return e.slice(i,i+1);let a=e,o=0,s=0,c=[],l=this.preloadOnly?0:this.tuning.dash.segmentRequestSize,u=this.preloadOnly?this.forwardBufferTarget:0;for(let e=i;e<a.length&&(o<=l||s<=u);e++){let t=a[e];if(o+=t.byte.to+1-t.byte.from,s+=t.time.to+1-t.time.from,t.status===`none`||t.status===`partially_ejected`)c.push(t);else break}return c}loadSegments(e,t,n=`auto`){var r=this;return a(function*(){Os(t.segmentReference)?yield r.loadTemplateSegment(e[0],t,n):yield r.loadByteRangeSegments(e,t,n)})()}loadTemplateSegment(e,t,n=`auto`){var r=this;return a(function*(){e.status=`downloading`;let i={segment:e,loadedBytes:0,feedingBytes:0,fedBytes:0,representationId:t.id,startedAtMs:void 0};r.activeSegments.add(i);let{range:a,url:o,signal:s,onProgress:l,onProgressTasks:u}=r.prepareTemplateFetchSegmentParams(e,t);r.failedDownloads&&s&&(yield q.abortable(s,c(function*(){let e=q.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>setTimeout(t,e))}).bind(r))(),s.aborted&&r.abortActiveSegments([e])),i.startedAtMs=q.getWindow().performance.now();try{let e=yield r.fetcher.fetch(o,{range:a,signal:s,onProgress:l,priority:n,isLowLatency:r.isActiveLowLatency(),bufferOptimisation:r.tuning.dash.fetcherBufferOptimisation});if(r.lastDataObtainedTimestampMs=q.now(),!e)return;let c=new DataView(e),d=vs(t.mime);if(!isFinite(i.segment.time.to)){let e=t.segmentReference.timescale;i.segment.time.to=d.getChunkEndTime(c,e)}l&&i.feedingBytes&&u?yield Promise.all(u):yield r.sourceBufferTaskQueue.append(c,s);let{serverDataReceivedTimestamp:f,serverDataPreparedTime:p}=d.getServerLatencyTimestamps(c);f&&p&&r.currentLiveSegmentServerLatency$.next(p-f),i.segment.status=`downloaded`,r.onSegmentFullyAppended(i,t.id),r.failedDownloads=0}catch(t){r.abortActiveSegments([e]),q.isAbortError(t)||(r.failedDownloads++,r.updateRepresentationsBaseUrlIfNeeded())}})()}updateRepresentationsBaseUrlIfNeeded(){if(!this.tuning.dash.enableBaseUrlSupport||!this.baseUrls.length||this.failedDownloads<=this.tuning.dash.maxSegmentRetryCount)return;this.baseUrlsIndex=(this.baseUrlsIndex+1)%this.baseUrls.length;let e=this.baseUrls[this.baseUrlsIndex];for(let t of this.representations.values())Os(t.segmentReference)?t.segmentReference.baseUrl=e:t.segmentReference.url=e}loadByteRangeSegments(e,t,n=`auto`){var r=this;return a(function*(){if(!e.length)return;let i=[];for(let n of e){n.status=`downloading`;let e={segment:n,loadedBytes:0,feedingBytes:0,fedBytes:0,representationId:t.id,startedAtMs:void 0};r.activeSegments.add(e),i.push(e)}let{range:a,url:o,signal:s,onProgress:l}=r.prepareByteRangeFetchSegmentParams(e,t);r.failedDownloads&&s&&(yield q.abortable(s,c(function*(){let e=q.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>{this.loadByteRangeSegmentsTimeoutId=window.setTimeout(t,e),q.fromEvent(window,`online`).pipe(q.once()).subscribe(()=>{t(),window.clearTimeout(this.loadByteRangeSegmentsTimeoutId)})})}).bind(r))(),s.aborted&&r.abortActiveSegments(e));let u=q.getWindow().performance.now();for(let e of i)e.startedAtMs=u;try{yield r.fetcher.fetch(o,{range:a,onProgress:l,signal:s,priority:n,bufferOptimisation:r.tuning.dash.fetcherBufferOptimisation,urlCacheMechanismEnabled:!Os(t.segmentReference)}),r.lastDataObtainedTimestampMs=q.now(),r.failedDownloads=0}catch(t){r.abortActiveSegments(e),q.isAbortError(t)||(r.failedDownloads++,r.updateRepresentationsBaseUrlIfNeeded())}})()}prepareByteRangeFetchSegmentParams(e,t){var n=this;if(Os(t.segmentReference))throw Error(`Representation is not byte range type`);let r=t.segmentReference.url,i={from:Cc.arrayAt(e,0).byte.from,to:Cc.arrayAt(e,-1).byte.to},{signal:o}=this.downloadAbortController;return{url:r,range:i,signal:o,onProgress:function(){var e=a(function*(e,r){if(!o.aborted)try{n.lastDataObtainedTimestampMs=q.now(),yield n.onSomeByteRangesDataLoaded({dataView:e,loaded:r,signal:o,onSegmentAppendFailed:()=>n.abort(),globalFrom:i?i.from:0,representationId:t.id})}catch(e){n.error$.next({id:`SegmentFeeding`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}});return function(t,n){return e.apply(this,arguments)}}()}}prepareTemplateFetchSegmentParams(e,t){if(!Os(t.segmentReference))throw Error(`Representation is not template type`);let n=new URL(e.url,t.segmentReference.baseUrl);this.isActiveLowLatency()&&n.searchParams.set(`low-latency`,`yes`);let r=n.toString(),{signal:i}=this.downloadAbortController,a=[];return{url:r,signal:i,onProgress:this.isActiveLowLatency()||this.tuning.dash.enableSubSegmentBufferFeeding&&this.liveUpdateSegmentIndex<3?(e,n)=>{if(!i.aborted)try{this.lastDataObtainedTimestampMs=q.now();let r=this.onSomeTemplateDataLoaded({dataView:e,loaded:n,signal:i,onSegmentAppendFailed:()=>this.abort(),representationId:t.id});a.push(r)}catch(e){this.error$.next({id:`SegmentFeeding`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Error when feeding segments`,thrown:e})}}:void 0,onProgressTasks:a}}abortActiveSegments(e){for(let t of this.activeSegments)Sc.arrayIncludes(e,t.segment)&&this.abortSegment(t.segment)}onSomeTemplateDataLoaded({dataView:e,representationId:t,loaded:n,onSegmentAppendFailed:r,signal:i}){var o=this;return a(function*(){if(!o.activeSegments.size||!R(o.mediaSource,o.sourceBuffer))return;let a=o.representations.get(t);if(a)for(let s of o.activeSegments){let{segment:c}=s;if(s.representationId===t){if(i.aborted){r();continue}if(s.loadedBytes=n,s.loadedBytes>s.feedingBytes){let t=new DataView(e.buffer,e.byteOffset+s.feedingBytes,s.loadedBytes-s.feedingBytes),n=vs(a.mime).parseFeedableSegmentChunk(t,o.isLive);n?.byteLength&&(c.status=`partially_fed`,s.feedingBytes+=n.byteLength,yield o.sourceBufferTaskQueue.append(n),s.fedBytes+=n.byteLength)}}}})()}onSomeByteRangesDataLoaded({dataView:e,representationId:t,globalFrom:n,loaded:r,signal:i,onSegmentAppendFailed:o}){var s=this;return a(function*(){if(!s.activeSegments.size||!R(s.mediaSource,s.sourceBuffer))return;let a=s.representations.get(t);if(a)for(let c of s.activeSegments){let{segment:l}=c;if(c.representationId!==t)continue;if(i.aborted){yield o();continue}let u=l.byte.from-n,d=l.byte.to-n,f=d-u+1,p=u<r,m=d<=r;if(!p)continue;let h=vs(a.mime);if(l.status===`downloading`&&m){l.status=`downloaded`;let n=new DataView(e.buffer,e.byteOffset+u,f);(yield s.sourceBufferTaskQueue.append(n,i))&&!i.aborted?s.onSegmentFullyAppended(c,t):yield o()}else if(s.tuning.dash.enableSubSegmentBufferFeeding&&(l.status===`downloading`||l.status===`partially_fed`)&&(c.loadedBytes=Math.min(f,r-u),c.loadedBytes>c.feedingBytes)){let n=new DataView(e.buffer,e.byteOffset+u+c.feedingBytes,c.loadedBytes-c.feedingBytes),r=c.loadedBytes===f?n:h.parseFeedableSegmentChunk(n);r?.byteLength&&(l.status=`partially_fed`,c.feedingBytes+=r.byteLength,(yield s.sourceBufferTaskQueue.append(r,i))&&!i.aborted?(c.fedBytes+=r.byteLength,c.fedBytes===f&&s.onSegmentFullyAppended(c,t)):yield o())}}})()}onSegmentFullyAppended(e,t){if(!(q.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer))){!this.isLive&&j.browser.isSafari&&this.tuning.useSafariEndlessRequestBugfix&&(bc(this.sourceBuffer.buffered,e.segment.time.from,100)&&bc(this.sourceBuffer.buffered,e.segment.time.to,100)||this.error$.next({id:`EmptyAppendBuffer`,category:q.ErrorCategory.VIDEO_PIPELINE,message:`Browser stuck on empty result of adding segment to source buffer`})),this.tuning.dash.useNewRepresentationSwitch||(this.playingRepresentationId=t,this.playingRepresentation$.next(this.playingRepresentationId),this.playingRepresentationInit$.next(this.parsedInitData.get(this.playingRepresentationId))),e.segment.status=`fed`,Ds(e.segment)&&(e.segment.size=e.fedBytes);for(let n of this.representations.values())if(n.id!==t)for(let t of this.segments.get(n.id)??[])t.status===`fed`&&Math.round(t.time.from)===Math.round(e.segment.time.from)&&Math.round(t.time.to)===Math.round(e.segment.time.to)&&(t.status=`none`);this.updateLowLatencyLiveIfNeeded(e.segment),this.activeSegments.delete(e),this.detectGapsWhenIdle(t,[e.segment])}}abortSegment(e){e.status===`partially_fed`?e.status=`partially_ejected`:e.status!==`partially_ejected`&&(e.status=`none`);for(let t of this.activeSegments.values())if(t.segment===e){this.activeSegments.delete(t);break}}loadNextInit(){if(this.allInitsLoaded||this.initLoadIdleCallback)return;let e=null,t=!1;for(let[n,r]of this.initData.entries()){let i=r instanceof Promise;t||=i,r===null&&(e=n)}if(!e){this.allInitsLoaded=!0;return}if(t)return;let n=this.representations.get(e);n&&(this.initLoadIdleCallback=Ec.requestIdleCallbackPolyfilled(()=>Dc.promiseFinally(this.loadInit(n,`low`,!1),()=>this.initLoadIdleCallback=null)))}loadInit(e,t=`auto`,n=!1){var r=this;return a(function*(){let i=r.tuning.dash.useFetchPriorityHints?t:`auto`,o=!n&&r.tuning.dash.ignoreNetworkErrorsOnLoadInit,s=(!n&&r.failedDownloads>0?q.abortable(r.destroyAbortController.signal,c(function*(){let e=q.getExponentialDelay(this.failedDownloads,this.tuning.downloadBackoff);yield new Promise(t=>setTimeout(t,e))}).bind(r))():Promise.resolve()).then(()=>r.fetcher.fetchRepresentation(e.segmentReference,vs(e.mime),{priority:i,ignoreNetworkErrors:o})).then(function(){var t=a(function*(t){if(!t)return;let{init:n,dataView:i,segments:a}=t,o=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength);r.initData.set(e.id,o);let s=a;r.isLive&&Os(e.segmentReference)&&(s=r.getActualLiveStartingSegments(e.segmentReference)),(!r.isLive||!r.segments.has(e.id))&&r.segments.set(e.id,s),n&&r.parsedInitData.set(e.id,n)});return function(e){return t.apply(this,arguments)}}()).then(()=>r.failedDownloads=0,t=>{o||r.initData.set(e.id,null),n&&r.error$.next({id:`LoadInits`,category:q.ErrorCategory.WTF,message:`loadInit threw`,thrown:t})});return r.initData.set(e.id,s),s})()}dropBuffer(){var e=this;return a(function*(){for(let t of e.segments.values())for(let e of t)e.status=`none`;yield e.pruneBuffer(0,1/0,!0)})()}pruneBuffer(e,t,n=!1){var r=this;return a(function*(){if(!r.sourceBuffer||!R(r.mediaSource,r.sourceBuffer)||!r.playingRepresentationId||q.isNullable(e))return!1;let i=[],a=0,s=e=>{e.sort((e,t)=>e.from-t.from);let t=[e[0]];for(let n=1;n<e.length;n++){let{from:r,to:i}=e[n],a=t[t.length-1];a.to>=r?a.to=Math.max(a.to,i):t.push(e[n])}return t},c=e=>{if(a>=t)return i;i.push(o({},e.time)),i=s(i);let n=Ds(e)?e.size??0:e.byte.to-e.byte.from;a+=n};for(let t of r.segments.values())for(let n of t){let t=n.time.to<=e-r.tuning.dash.bufferPruningSafeZone,i=n.time.from>=e+Math.min(r.forwardBufferTarget,r.bufferLimit);(t||i)&&n.status===`fed`&&c(n)}for(let e=0;e<r.sourceBuffer.buffered.length;e++){let t=r.sourceBuffer.buffered.start(e)*1e3,n=r.sourceBuffer.buffered.end(e)*1e3,i=0;for(let e of r.segments.values())for(let r of e)Sc.arrayIncludes([`none`,`partially_ejected`],r.status)&&Math.round(r.time.from)<=Math.round(t)&&Math.round(r.time.to)>=Math.round(n)&&i++;i===r.segments.size&&c({time:{from:t,to:n},url:``,status:`none`})}if(i.length&&n){let t=Math.min(r.forwardBufferTarget,r.bufferLimit)*r.tuning.dash.minSafeBufferThreshold;for(let n of r.segments.values())for(let r of n)r.time.from>=e+t&&r.status===`fed`&&c(r)}return i.length?(yield Promise.all(i.map(e=>r.sourceBufferTaskQueue.remove(e.from,e.to)))).reduce((e,t)=>e||t,!1):!1})()}abortBuffer(){var e=this;return a(function*(){if(!e.sourceBuffer||!R(e.mediaSource,e.sourceBuffer))return!1;let t=e.playingRepresentationId&&e.initData.get(e.playingRepresentationId),n=t instanceof ArrayBuffer?t:void 0;return e.sourceBufferTaskQueue.abort(n)})()}getDebugBufferState(){if(!(!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length))return{from:this.sourceBuffer.buffered.start(0),to:this.sourceBuffer.buffered.end(this.sourceBuffer.buffered.length-1)}}getForwardBufferDuration(e=this.getCurrentPosition()){return!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)||!this.sourceBuffer.buffered.length||q.isNullable(e)?0:Ws(this.sourceBuffer.buffered,e)}getForwardBufferRepresentations(e=this.getCurrentPosition()){if(this.forwardBufferRepresentations.clear(),q.isNonNullable(e))for(let[t,n]of this.segments.entries())this.forwardBufferRepresentations.set(t,n.filter(t=>t.time.from>=e&&t.time.to<=e+this.forwardBufferTarget));return this.forwardBufferRepresentations}getMpdSegmentDuration(){for(let e of this.segments.values()){let t=e[0];if(t&&t.time.to>t.time.from)return t.time.to-t.time.from}}getActiveSegmentProgress(){let e;for(let t of this.activeSegments)q.isNullable(t.startedAtMs)||(!e||t.segment.time.from<e.segment.time.from)&&(e=t);if(!q.isNullable(e?.startedAtMs))return{startedAtMs:e.startedAtMs,loadedBytes:e.loadedBytes,totalBytes:e.segment.size??void 0,segmentDurationMs:e.segment.time.to-e.segment.time.from}}detectGaps(e,t){if(!(!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer)))for(let n of t){let t={representation:e,from:n.time.from,to:n.time.to,persistent:!1},{buffered:r}=this.sourceBuffer;for(let e=0;e<r.length;e++){let i=r.start(e)*1e3,a=r.end(e)*1e3;if(!(a<=n.time.from||i>=n.time.to)){if(i<=n.time.from&&a>=n.time.to){t=void 0;break}a>n.time.from&&a<n.time.to&&(t.from=a),i<n.time.to&&i>n.time.from&&(t.to=i)}}t&&t.to-t.from>1&&!this.gaps.some(e=>t&&e.from===t.from&&e.to===t.to)&&this.gaps.push(t)}}detectGapsWhenIdle(e,t){if(this.gapDetectionIdleCallback||!this.sourceBuffer||!R(this.mediaSource,this.sourceBuffer))return;let{buffered:n}=this.sourceBuffer,{usePersistentGaps:r}=this.tuning.dash;this.gaps=this.gaps.filter(e=>{if(r&&e.persistent)return!0;let t=Math.round(e.from),i=Math.round(e.to);for(let e=0;e<n.length;e++)if(t>=Math.round(n.start(e)*1e3)&&i<=Math.round(n.end(e)*1e3))return!1;return!0}),this.gapDetectionIdleCallback=Ec.requestIdleCallbackPolyfilled(()=>{try{this.detectGaps(e,t)}catch(e){this.error$.next({id:`GapDetection`,category:q.ErrorCategory.WTF,message:`detectGaps threw`,thrown:e})}finally{this.gapDetectionIdleCallback=null}})}checkEjectedSegments(){if(q.isNullable(this.sourceBuffer)||!R(this.mediaSource,this.sourceBuffer)||q.isNullable(this.playingRepresentationId))return;let e=[];for(let t=0;t<this.sourceBuffer.buffered.length;t++){let n=Math.floor(this.sourceBuffer.buffered.start(t)*1e3),r=Math.ceil(this.sourceBuffer.buffered.end(t)*1e3);e.push({from:n,to:r})}for(let t of this.segments.values())for(let n of t){let{status:t}=n;if(t!==`fed`&&t!==`partially_ejected`)continue;let r=Math.floor(n.time.from),i=Math.ceil(n.time.to),a=e.some(e=>e.from-100<=r&&e.to+100>=i),o=e.filter(e=>r>=e.from&&r<e.to-100||i>e.from+100&&i<=e.to);a||(o.length===1||this.gaps.some(e=>e.from===n.time.from||e.to===n.time.to)?n.status=`partially_ejected`:n.status=`none`)}}handleAsyncError(e,t){this.error$.next({id:t,category:q.ErrorCategory.VIDEO_PIPELINE,thrown:e,message:`Something went wrong`})}}var Fc=require(`@vkontakte/videoplayer-shared`),Ic=require(`@vkontakte/videoplayer-shared`),J=require(`@vkontakte/videoplayer-shared`),Lc=require(`@vkontakte/videoplayer-shared`),Rc=new Set([2,3,4,5,6,9,19]),zc=new Set([1,8,18,21]),Bc=new Set([10,11,12,13,14,15,16]),Vc=({txtCode:e,error$:t,recoverableError$:n,httpCode:r})=>{let i=parseInt(e);if(isNaN(i))return;let a=o(o({},Hc(i)),{},{httpCode:r,UVBackendErrorCode:e});if(Rc.has(i)){t.next(o(o({},a),{},{category:Lc.ErrorCategory.NETWORK}));return}if(zc.has(i)){n.next(o(o({},a),{},{category:Lc.ErrorCategory.FATAL}));return}if(Bc.has(i)){t.next(o(o({},a),{},{category:Lc.ErrorCategory.FATAL}));return}},Hc=e=>{switch(e){case 1:return{id:`VideoDataLinkExpiredError`,message:`Video data links have expired`};case 5:return{id:`VideoServerError`,message:`Server error`};case 8:return{id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`};case 10:return{id:`UserAgentChange`,message:`User agent changed`};case 11:return{id:`forbiddenReferer`,message:`Forbidden referer`};case 12:case 13:case 14:case 15:case 16:return{id:`OKerror`,message:`Error #${e}`};case 18:return{id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`};case 21:return{id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`};default:return Uc(e)}};function Uc(e){return{id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${e})`}}var Wc=require(`@vkontakte/videoplayer-shared`),Gc=`vk_player_cached_fetches`,Kc=[`fromCache`,`expires`,`sig`],qc=300*1e3,Jc=`x-cache-expires`,Yc=function(){var e=a(function*(e){let t=Zc(e),n=yield Wc.getWindow().caches.open(Gc);return{get:function(){var e=a(function*(){let e=yield n.match(t);return e&&!Qc(e)?(Wc.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_hit`]}),e):(e&&(yield n.delete(t),Wc.devNull.push(`core`,{key:`videoplayer_url_cache`,strings:[`cache_missed`,`expired`]})),null)});return function(){return e.apply(this,arguments)}}(),set:r=>{n.put(t,$c(r,e))}}});return function(t){return e.apply(this,arguments)}}();function Xc(){return typeof caches<`u`}function Zc(e){try{let t=new URL(e);return t.hostname=`cache.local`,Kc.forEach(e=>t.searchParams.delete(e)),t.toString()}catch{return e}}function Qc(e){let t=e.headers.get(Jc);if(!t)return!0;let n=Number(t);return isNaN(n)||n<=Date.now()}function $c(e,t){let n=e.clone(),r=new Headers(n.headers);return r.set(Jc,el(t).toString()),new Response(n.body,{status:n.status,statusText:n.statusText,headers:r})}function el(e){try{let t=new URL(e).searchParams.get(`expires`);if(t&&!isNaN(Number(t)))return Number(t)}catch{return 0}return Date.now()+qc}var tl=function(){var e=a(function*(){yield Wc.getWindow().caches.delete(Gc)});return function(){return e.apply(this,arguments)}}();class nl{constructor({throughputEstimator:e,requestQuic:t,tracer:n,compatibilityMode:r=!1,useEnableSubtitlesParam:a=!1,handleExtendedNetworkErrorsSet:l=!1,useUrlCacheMechanism:u=!1,measureNonSegmentRequests:d=!1}){i(this,`throughputEstimator`,void 0),i(this,`requestQuic`,void 0),i(this,`tracer`,void 0),i(this,`manifestRequested$`,new J.Subject),i(this,`firstBytesManifest$`,new J.Subject),i(this,`firstBytesRequested$`,new J.Subject),i(this,`firstBytesReceived$`,new J.Subject),i(this,`lastConnectionType$`,new J.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new J.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new J.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new J.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new J.ValueSubject(void 0)),i(this,`recoverableError$`,new J.Subject),i(this,`error$`,new J.Subject),i(this,`abortAllController`,new Fc.AbortControllerPolyfilled),i(this,`subscription`,new J.SubscriptionRemovable),i(this,`compatibilityMode`,void 0),i(this,`useEnableSubtitlesParam`,void 0),i(this,`useUrlCacheMechanism`,void 0),i(this,`measureNonSegmentRequests`,void 0),i(this,`startupPhase`,!0),i(this,`performanceObserver`,null),i(this,`pendingConnectionMetrics`,new Map),i(this,`handleExtendedNetworkErrorsSet`,!1),i(this,`fetchManifest`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e){let t=this.tracer.createComponentTracer(`FetchManifest`),n=e;this.requestQuic&&(n=La(n)),!this.compatibilityMode&&this.useEnableSubtitlesParam&&(n=za(n)),this.trackRequestStart(n,performance.now());let r=J.now();this.manifestRequested$.next();let i=yield this.doFetch(n,{signal:this.abortAllController.signal}).catch(J.suppressAbort);if(i){let a=J.now();t.log(`success`,J.flattenObject({url:n,message:`Request successfully executed`})),t.end(),this.onHeadersReceived(i.headers),this.firstBytesManifest$.next();let o=i.headers.get(`content-length`),c=0;o&&(c=parseInt(o,10));let l=yield s(i.text());if((!o||isNaN(c)||c<=0)&&(c=new TextEncoder().encode(l).length),c>0){let t=a-r,n=c/(t/1e3)*8/1024,i={bytes:c,speed:n,url:e};this.lastDownloadMetrics$.next(i)}if(this.measureNonSegmentRequests&&this.startupPhase&&(this.throughputEstimator?.addRawRtt(a-r),o&&c>0)){let e=J.now();this.throughputEstimator?.addRawSpeed(c,e-r)}return l}else return t.error(`error`,J.flattenObject({url:n,message:`No data in request manifest`})),t.end(),null});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetch`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e,{rangeMethod:t=this.compatibilityMode?0:1,range:n,onProgress:r,priority:i=`auto`,signal:a,measureThroughput:o=!0,isLowLatency:s=!1,bufferOptimisation:l=!1,ignoreNetworkErrors:u=!1,urlCacheMechanismEnabled:d=!1}={}){let f=e,p=new Headers,m=this.tracer.createComponentTracer(`Fetch`);if(n)switch(t){case 0:p.append(`Range`,`bytes=${n.from}-${n.to}`);break;case 1:{let e=new URL(f,J.getWindow().location.href);e.searchParams.append(`bytes`,`${n.from}-${n.to}`),f=e.toString();break}default:J.assertNever(t)}this.requestQuic&&(f=La(f));let h=this.abortAllController.signal,g;if(a){let e=new Fc.AbortControllerPolyfilled;if(g=J.merge(J.fromEvent(this.abortAllController.signal,`abort`),J.fromEvent(a,`abort`)).subscribe(()=>{try{e.abort()}catch(e){J.suppressAbort(e)}}),this.subscription.add(g),this.abortAllController.signal.aborted||a.aborted)try{e.abort()}catch(e){J.suppressAbort(e)}h=e.signal}let _=0,v=J.now();m.log(`startRequest`,J.flattenObject({url:f,priority:i,rangeMethod:t,range:n,isLowLatency:s,requestStartedAt:v})),this.trackRequestStart(f,performance.now()),this.firstBytesRequested$.next();let y=yield this.doFetch(f,{priority:i,headers:p,signal:h},{ignoreNetworkErrors:u,urlCacheMechanismEnabled:d}),b=J.now();if(!y)return m.error(`error`,{message:`No response in request`}),m.end(),this.unsubscribeAbortSubscription(g),null;if(this.throughputEstimator?.addRawRtt(b-v),!y.ok||!y.body){this.unsubscribeAbortSubscription(g);let e=`Fetch error ${y.status}: ${y.statusText}`;return m.error(`error`,{message:e}),m.end(),Promise.reject(Error(`Fetch error ${y.status}: ${y.statusText}`))}if(this.onHeadersReceived(y.headers),!r&&!o){this.unsubscribeAbortSubscription(g);let e=yield y.arrayBuffer(),t=J.now();if(this.measureNonSegmentRequests&&this.startupPhase){let e=y.headers.get(`content-length`),n=e?parseInt(e,10):NaN;Number.isFinite(n)&&n>0&&this.throughputEstimator?.addRawSpeed(n,t-v)}let n={requestStartedAt:v,requestEndedAt:t,duration:t-v};return m.log(`endRequest`,J.flattenObject(n)),m.end(),e}let x=y.body;if(o){this.startupPhase=!1;let e;[x,e]=y.body.tee(),this.throughputEstimator?.trackStream(e,s)}let S=x.getReader(),C,w=parseInt(y.headers.get(`content-length`)??``,10);Number.isFinite(w)&&(C=w),!C&&n&&(C=n.to-n.from+1);let T=C?new Uint8Array(C):new Uint8Array,E=!1,ee=e=>{this.unsubscribeAbortSubscription(g),E=!0,J.suppressAbort(e)},te=J.abortable(h,function(){var e=c(function*({done:e,value:t}){if(_===0&&(this.lastRequestFirstBytes$.next(J.now()-v),this.firstBytesReceived$.next()),h.aborted){this.unsubscribeAbortSubscription(g);return}if(!e&&t){if(l&&C)T.set(t,_),_+=t.byteLength;else{let e=new Uint8Array(T.length+t.length);e.set(T),e.set(t,T.length),T=e,_+=t.byteLength}r?.(new DataView(T.buffer),_),yield S?.read().then(te,ee)}});return function(t){return e.apply(this,arguments)}}().bind(this));yield S?.read().then(te,ee),this.unsubscribeAbortSubscription(g);let ne=J.now(),re={failed:E,requestStartedAt:v,requestEndedAt:ne,duration:ne-v};if(E)return m.error(`endRequest`,J.flattenObject(re)),m.end(),null;if(_>0){let t=ne-v,n=_/(t/1e3)*8/1024,r={bytes:_,speed:n,url:e};this.lastDownloadMetrics$.next(r)}return m.log(`endRequest`,J.flattenObject(re)),m.end(),T.buffer});return function(t){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchByteRangeRepresentation`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t,n){if(e.type!==`byteRange`)return null;let{from:r,to:i}=e.initRange,a=r,s=i,c=!1,l,u;e.indexRange&&(l=e.indexRange.from,u=e.indexRange.to,c=i+1===l,c&&(a=Math.min(l,r),s=Math.max(u,i))),a=Math.min(a,0);let d=yield this.fetch(e.url,o({range:{from:a,to:s},measureThroughput:!1,urlCacheMechanismEnabled:!0},n));if(!d)return null;let f=new DataView(d,r-a,i-a+1);if(!t.validateData(f))throw Error(`Invalid media file`);let p=t.parseInit(f),m=e.indexRange??t.getIndexRange(p);if(!m)throw ReferenceError(`No way to load representation index`);let h;if(c)h=new DataView(d,m.from-a,m.to-m.from+1);else{let t=yield this.fetch(e.url,{range:m,measureThroughput:!1,urlCacheMechanismEnabled:!0});if(!t)return null;h=new DataView(t)}let g=t.parseSegments(h,p,m);return{init:p,dataView:new DataView(d),segments:g}});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`fetchTemplateRepresentation`,J.abortable(this.abortAllController.signal,function(){var e=c(function*(e,t){if(e.type!==`template`)return null;let n=new URL(e.initUrl,e.baseUrl).toString(),r=yield this.fetch(n,o({measureThroughput:!1},t));return r?{init:null,segments:e.segments.map(e=>o(o({},e),{},{status:`none`,size:void 0})),dataView:new DataView(r)}:null});return function(t,n){return e.apply(this,arguments)}}().bind(this))),this.throughputEstimator=e,this.requestQuic=t,this.compatibilityMode=r,this.tracer=n.createComponentTracer(`Fetcher`),this.useEnableSubtitlesParam=a,this.handleExtendedNetworkErrorsSet=l,this.measureNonSegmentRequests=d,J.getWindow().PerformanceObserver&&this.setupPerformanceObserver(),this.useUrlCacheMechanism=u}onHeadersReceived(e){let{type:t,reused:n}=Ra(e);this.lastConnectionType$.next(t),this.lastConnectionReused$.next(n)}setupPerformanceObserver(){this.performanceObserver=new(J.getWindow()).PerformanceObserver(e=>{e.getEntriesByType(`resource`).forEach(e=>{this.processPerformanceResourceTiming(e)})}),this.performanceObserver.observe({entryTypes:[`resource`]})}processPerformanceResourceTiming(e){let t=this.findMatchingRequest(e);if(!t||!this.pendingConnectionMetrics.get(t))return;this.pendingConnectionMetrics.delete(t);let n=this.extractConnectionMetrics(e);n&&this.lastConnectionMetrics$.next(n)}estimateNetworkType(){if(!(`connection`in J.getWindow().navigator))return`unknown`;let e=J.getWindow().navigator.connection;return e.effectiveType?{"slow-2g":`2g`,"2g":`2g`,"3g":`3g`,"4g":`lte`}[e.effectiveType]||e.effectiveType:e.downlink?e.downlink<1?`2g`:e.downlink<5?`3g`:e.downlink<50?`lte`:`wifi`:e.rtt?e.rtt>500?`2g`:e.rtt>250?`3g`:e.rtt>50?`lte`:`wifi`:`unknown`}extractConnectionMetrics(e){let t=0,n=0,r=0,i=0;return e.domainLookupStart>0&&e.domainLookupEnd>0&&(t=e.domainLookupEnd-e.domainLookupStart),e.connectStart>0&&e.connectEnd>0&&(i=e.connectEnd-e.connectStart,e.secureConnectionStart>0?(r=e.connectEnd-e.secureConnectionStart,n=e.secureConnectionStart-e.connectStart):n=i),{dnsResolveTime:Math.max(0,t),tcpHandshakeTime:Math.max(0,n),tlsHandshakeTime:Math.max(0,r),totalConnectTime:Math.max(0,i),networkType:this.estimateNetworkType(),url:e.name}}findMatchingRequest(e){try{for(let[t,n]of this.pendingConnectionMetrics.entries()){let r=new URL(e.name),i=r.origin+r.pathname,a=new URL(n.url);if(i===a.origin+a.pathname&&e.startTime>=n.startTime-10&&e.startTime<=n.startTime+1e3)return t}}catch{this.recoverableError$.next({id:`VideoDataFetchError`,message:`Video data fetch error with getting download metrics`,category:J.ErrorCategory.WTF})}return null}trackRequestStart(e,t){let n=`${e}_${t}_${Math.random().toString(36).substr(2,9)}`;this.pendingConnectionMetrics.set(n,{url:e,startTime:t})}fetchRepresentation(e,t,n){var r=this;return a(function*(){let{type:i}=e;switch(i){case`byteRange`:return(yield r.fetchByteRangeRepresentation(e,t,n))??null;case`template`:return(yield r.fetchTemplateRepresentation(e,n))??null;default:J.assertNever(i)}})()}destroy(){this.abortAllController.abort(),this.subscription.unsubscribe(),this.performanceObserver&&=(this.performanceObserver.disconnect(),null),this.pendingConnectionMetrics.clear(),this.tracer.end()}doFetch(e,t,n){var r=this;return a(function*(){let i;if(r.useUrlCacheMechanism&&n?.urlCacheMechanismEnabled&&Xc()){i=yield Yc(e);let t=yield i.get();if(t)return t}let a=yield Ic.fetchPolyfilled(e,i?o(o({},t),{},{cache:`no-store`}):t);if(a.ok)return i?.set(a),a;if(n?.ignoreNetworkErrors)return;let s=yield a.text();if(r.handleExtendedNetworkErrorsSet){Vc({txtCode:s,httpCode:a.status,error$:r.error$,recoverableError$:r.recoverableError$});return}let c=parseInt(s);if(!isNaN(c))switch(c){case 1:r.recoverableError$.next({id:`VideoDataLinkExpiredError`,message:`Video data links have expired`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;case 8:r.recoverableError$.next({id:`VideoDataLinkBlockedForFloodError`,message:`Url blocked for flood`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;case 18:r.recoverableError$.next({id:`VideoDataLinkIllegalIpChangeError`,message:`Client IP has changed`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;case 21:r.recoverableError$.next({id:`VideoDataLinkIllegalHostChangeError`,message:`Request HOST has changed`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s});break;default:r.error$.next({id:`GeneralVideoDataFetchError`,message:`Generic video data fetch error (${c})`,category:J.ErrorCategory.FATAL,httpCode:a.status,UVBackendErrorCode:s})}})()}unsubscribeAbortSubscription(e){e&&(e.unsubscribe(),this.subscription.remove(e))}}var rl=require(`@vkontakte/videoplayer-shared`);class il{constructor(e,t){i(this,`currentRepresentation$`,new rl.ValueSubject(null)),i(this,`maxRepresentations`,4),i(this,`representationsCursor`,0),i(this,`representations`,[]),i(this,`getCurrentPosition`,void 0),i(this,`currentSegment`,null),this.getCurrentPosition=t.getCurrentPosition,this.processStreams(e)}updateLive(e){this.processStreams(e?.streams.text)}seekLive(e){this.processStreams(e)}maintain(e=this.getCurrentPosition()){if(!rl.isNullable(e))for(let t of this.representations)for(let n of t){let t=n.segmentReference,r=t.segments.length,i=t.segments[0].time.from,a=t.segments[r-1].time.to;if(e<i||e>a)continue;let s=t.segments.find(t=>t.time.from<=e&&t.time.to>=e);!s||this.currentSegment?.time.from===s.time.from&&this.currentSegment.time.to===s.time.to||(this.currentSegment=s,this.currentRepresentation$.next(o(o({},n),{},{label:`Live Text`,language:`ru`,isAuto:!0,url:new URL(s.url,t.baseUrl).toString()})))}}destroy(){this.currentRepresentation$.next(null),this.currentSegment=null,this.representations=[]}processStreams(e){for(let t of e??[]){let e=il.filterRepresentations(t.representations);if(e){this.representations[this.representationsCursor]=e,this.representationsCursor=(this.representationsCursor+1)%this.maxRepresentations;break}}}static isSupported(e){return!!e?.some(e=>il.filterRepresentations(e.representations))}static filterRepresentations(e){return e?.filter(e=>e.kind===`text`&&`segmentReference`in e&&Os(e.segmentReference))}}var al=[`timeupdate`,`progress`,`play`,`seeked`,`stalled`,`waiting`],ol=[`timeupdate`,`progress`,`loadeddata`,`playing`,`seeked`];class sl{constructor(e){i(this,`element`,null),i(this,`manifestUrlString`,``),i(this,`source`,null),i(this,`manifest`,null),i(this,`tuning`,void 0),i(this,`tracer`,void 0),i(this,`forceVideoCodec`,void 0),i(this,`videoBufferManager`,void 0),i(this,`audioBufferManager`,void 0),i(this,`bufferManagers`,[]),i(this,`liveTextManager`,void 0),i(this,`throughputEstimator`,void 0),i(this,`subscription`,new K.Subscription),i(this,`subscriptionRemovable`,new K.SubscriptionRemovable),i(this,`representationSubscription`,new K.Subscription),i(this,`fetcher`,void 0),i(this,`state$`,new st(`none`)),i(this,`currentVideoRepresentation$`,new K.ValueSubject(void 0)),i(this,`currentVideoRepresentationInit$`,new K.ValueSubject(void 0)),i(this,`currentAudioRepresentation$`,new K.ValueSubject(void 0)),i(this,`currentVideoSegmentLength$`,new K.ValueSubject(0)),i(this,`currentAudioSegmentLength$`,new K.ValueSubject(0)),i(this,`error$`,new K.Subject),i(this,`manifestRequested$`,new K.Subject),i(this,`firstBytesManifest$`,new K.Subject),i(this,`manifestReceived$`,new K.Subject),i(this,`firstBytesRequested$`,new K.Subject),i(this,`firstBytesReceived$`,new K.Subject),i(this,`lastConnectionType$`,new K.ValueSubject(void 0)),i(this,`lastConnectionReused$`,new K.ValueSubject(void 0)),i(this,`lastRequestFirstBytes$`,new K.ValueSubject(void 0)),i(this,`lastConnectionMetrics$`,new K.ValueSubject(void 0)),i(this,`lastDownloadMetrics$`,new K.ValueSubject(void 0)),i(this,`currentLiveTextRepresentation$`,new K.ValueSubject(null)),i(this,`timeoutSourceOpenId`,void 0),i(this,`isLive$`,new K.ValueSubject(!1)),i(this,`isActiveLive$`,new K.ValueSubject(!1)),i(this,`isLowLatency$`,new K.ValueSubject(!1)),i(this,`liveDuration$`,new K.ValueSubject(0)),i(this,`liveSeekableDuration$`,new K.ValueSubject(0)),i(this,`liveAvailabilityStartTime$`,new K.ValueSubject(0)),i(this,`liveStreamStatus$`,new K.ValueSubject(void 0)),i(this,`bufferLength$`,new K.ValueSubject(0)),i(this,`liveLatency$`,new K.ValueSubject(void 0)),i(this,`liveLoadBufferLength$`,new K.ValueSubject(0)),i(this,`livePositionFromPlayer$`,new K.ValueSubject(0)),i(this,`currentStallDuration$`,new K.ValueSubject(0)),i(this,`videoLastDataObtainedTimestamp$`,new K.ValueSubject(0)),i(this,`fetcherRecoverableError$`,new K.Subject),i(this,`fetcherError$`,new K.Subject),i(this,`updateDurationError$`,new K.Subject),i(this,`liveStreamEndTimestamp`,0),i(this,`liveBuffer`,void 0),i(this,`isUpdatingLive`,!1),i(this,`isJumpGapAfterSeekLive`,!1),i(this,`forceEnded$`,new K.Subject),i(this,`gapWatchdogActive`,!1),i(this,`gapWatchdogSubscription`,void 0),i(this,`stallWatchdogSubscription`,void 0),i(this,`livePauseWatchdogSubscription`,void 0),i(this,`liveWasInterrupted`,!1),i(this,`isOnDemand`,!1),i(this,`dashMaxTvVideoQuality`,void 0),i(this,`destroyController`,new vc.AbortControllerPolyfilled),i(this,`initManifest`,K.abortable(this.destroyController.signal,function(){var e=c(function*(e,t,n){this.tracer.log(`initManifest`),this.element=e,this.manifestUrlString=ue(t,n,2),this.state$.startTransitionTo(`manifest_ready`),this.manifest=yield this.updateManifest(),!this.manifest?.streams.video.length&&!this.manifest?.streams.audio.length?this.error$.next({id:`NoRepresentations`,category:K.ErrorCategory.PARSER,message:`No playable video representations`}):this.state$.setState(`manifest_ready`)});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`updateManifest`,K.abortable(this.destroyController.signal,c(function*(){this.tracer.log(`updateManifestStart`,{manifestUrl:this.manifestUrlString});let e=yield this.fetcher.fetchManifest(this.manifestUrlString).catch(e=>{!this.manifest&&!this.bufferLength$.getValue()&&this.error$.next({id:`LoadManifest`,category:K.ErrorCategory.NETWORK,message:`Failed to load manifest`,thrown:e})});if(!e)return null;let t=null;try{t=xo(e??``,this.manifestUrlString),this.manifestReceived$.next()}catch(t){let n=Pa(e)??{id:`ManifestParsing`,category:K.ErrorCategory.PARSER,message:`Failed to parse MPD manifest`,thrown:t};this.error$.next(n)}if(!t)return null;let n=(e,t,n)=>{var r,i,a,o;return!!(!((r=this.element)==null||(i=r.canPlayType)==null)&&i.call(r,t)&&!((a=ke())==null||(o=a.isTypeSupported)==null)&&o.call(a,`${t}; codecs="${n}"`)||e===`text`)};if(t.live){this.isLive$.next(!0);let{availabilityStartTime:e,latestSegmentPublishTime:n,streamIsUnpublished:r,streamIsAlive:i}=t.live,a=(t.duration??0)/1e3;this.liveSeekableDuration$.next(-1*a),this.liveDuration$.next((n-e)/1e3),this.liveAvailabilityStartTime$.next(t.live.availabilityStartTime);let o=`active`;if(i||(o=r?`unpublished`:`unexpectedly_down`),this.liveStreamStatus$.next(o),i&&this.liveWasInterrupted){this.liveWasInterrupted=!1,this.stopStallWatchdogSubscription();let e=this.normalizeLiveOffset(-1*this.livePositionFromPlayer$.getValue()*1e3);this.seekLive(e).catch(e=>{this.error$.next({id:`updateManifest`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`seekLive after stream restore failed`,thrown:e})})}}let r={text:t.streams.text,video:[],audio:[]},i,a;for(let e of[`video`,`audio`]){let o=t.streams[e].filter(({mime:t,codecs:r})=>n(e,t,r));r[e]=o;let s,c;if(this.tuning.dash.codecsPrioritizeEnabled){if(e===`audio`)a=Dr(o.map(({codecs:e})=>e)),s=a[0],s&&(r[e]=o.filter(({codecs:e})=>Or(e)===s));else if(e===`video`){i=Tr(o,{preferHdr:this.tuning.preferHDR});let t=this.forceVideoCodec;c=(t?i.find(e=>e.name===t.name&&e.hdr===t.hdr):void 0)??i[0],c&&(r[e]=o.filter(e=>Or(e.codecs)===c.name&&!!e.hdr===c.hdr))}}else{let t=wr(new Set(o.map(({codecs:e})=>e)));t&&(r[e]=o.filter(({codecs:e})=>e.startsWith(t)))}if(e===`video`){if(!this.tuning.dash.codecsPrioritizeEnabled){let e=this.tuning.preferHDR,t=r.video.some(e=>e.hdr),n=r.video.some(e=>!e.hdr);j.display.isHDR&&e&&t?r.video=r.video.filter(e=>e.hdr):n&&(r.video=r.video.filter(e=>!e.hdr))}let{videoStreamRepresentaionsFilter:e}=this.tuning.dash;if(e.length&&jr(r,e),this.dashMaxTvVideoQuality&&$s(r,this.dashMaxTvVideoQuality),this.isOnDemand&&this.tuning.dash.filterOnDemandQualityList)for(let e of r.video)e.representations=e.representations.sort((e,t)=>t.height-e.height).filter((e,t)=>t%2==0)}}let s=o(o({},t),{},{streams:r});return this.tuning.dash.codecsPrioritizeEnabled&&(s.codecs={video:i,audio:a}),this.tracer.log(`updateManifestEnd`,K.flattenObject(s)),s}).bind(this))),i(this,`initRepresentations`,K.abortable(this.destroyController.signal,function(){var e=c(function*(e,t,n){var r=this;this.tracer.log(`initRepresentationsStart`,K.flattenObject({initialVideo:e,initialAudio:t,sourceHls:n})),K.assertNonNullable(this.manifest),K.assertNonNullable(this.element),this.representationSubscription.unsubscribe(),this.state$.startTransitionTo(`representations_ready`);let i=e=>{this.representationSubscription.add(K.fromEvent(e,`error`).pipe(K.filter(e=>!!this.element?.played.length)).subscribe(e=>{this.error$.next({id:`VideoSource`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`Unexpected video source error`,thrown:e})}))};this.source=Me();let o=document.createElement(`source`);if(i(o),o.src=URL.createObjectURL(this.source),this.element.appendChild(o),Ae())if(n){let e=document.createElement(`source`);i(e),e.type=`application/x-mpegurl`,e.src=n.url,this.element.appendChild(e)}else this.element.disableRemotePlayback=!0;this.isActiveLive$.next(this.isLive$.getValue());let s={fetcher:this.fetcher,tuning:this.tuning,getCurrentPosition:()=>this.element?this.element.currentTime*1e3:void 0,isActiveLowLatency:()=>this.isActiveLive$.getValue()&&this.isLowLatency$.getValue(),manifest:this.manifest};if(this.bufferManagers=[],K.isNonNullable(e)){let e=this.manifest.streams.video.reduce((e,t)=>[...e,...t.representations],[]);e.length&&(this.videoBufferManager=new Pc(`video`,this.source,e,s),this.bufferManagers.push(this.videoBufferManager))}if(K.isNonNullable(t)){let e=this.manifest.streams.audio.reduce((e,t)=>[...e,...t.representations],[]);this.audioBufferManager=new Pc(`audio`,this.source,e,s),this.bufferManagers.push(this.audioBufferManager)}if(il.isSupported(this.manifest.streams.text)&&!this.isLowLatency$.getValue()&&(this.liveTextManager=new il(this.manifest.streams.text,s)),this.representationSubscription.add(this.fetcher.lastRequestFirstBytes$.subscribe(this.lastRequestFirstBytes$)),this.representationSubscription.add(K.merge(...ol.map(e=>K.fromEvent(this.element,e))).pipe(K.map(e=>this.element?Ws(this.element.buffered,this.element.currentTime*1e3):0),K.filterChanged(),K.tap(e=>{e>this.tuning.dash.bufferEmptinessTolerance&&this.stopStallWatchdogSubscription()})).subscribe(this.bufferLength$)),this.representationSubscription.add(K.merge(K.fromEvent(this.element,`ended`),this.forceEnded$).subscribe(()=>{this.stopStallWatchdogSubscription()})),this.isLive$.getValue()){this.subscription.add(this.liveDuration$.pipe(K.filterChanged()).subscribe(e=>this.liveStreamEndTimestamp=K.now())),this.subscription.add(K.fromEvent(this.element,`pause`).subscribe(()=>{let{liveUpdateInterval:e}=this.tuning.dash;this.livePauseWatchdogSubscription=K.interval(e).subscribe(t=>{let n=de(this.manifestUrlString,2);this.manifestUrlString=ue(this.manifestUrlString,n+e,2),this.liveStreamStatus$.getValue()===`active`&&this.updateManifest()}),this.subscription.add(this.livePauseWatchdogSubscription)})).add(K.fromEvent(this.element,`play`).subscribe(e=>this.livePauseWatchdogSubscription?.unsubscribe())),this.representationSubscription.add(K.combine({isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(K.map(({isActiveLive:e,isLowLatency:t})=>e&&t),K.filterChanged()).subscribe(e=>{this.isManualDecreasePlaybackInLive()||pc(this.element,1)})),this.representationSubscription.add(K.combine({bufferLength:this.bufferLength$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).pipe(K.filter(({bufferLength:e,isActiveLive:t,isLowLatency:n})=>t&&n&&!!e)).subscribe(({bufferLength:e})=>this.liveBuffer.next(e))),this.videoBufferManager&&(this.representationSubscription.add(this.videoBufferManager.currentLowLatencySegmentLength$.subscribe(e=>{if(!this.isActiveLive$.getValue()&&!this.isLowLatency$.getValue()&&!e)return;let t=this.liveSeekableDuration$.getValue()-e/1e3;this.liveSeekableDuration$.next(Math.max(t,-1*this.tuning.dashCmafLive.maxLiveDuration)),this.liveDuration$.next(this.liveDuration$.getValue()+e/1e3)})),this.representationSubscription.add(K.combine({isLive:this.isLive$,rtt:this.throughputEstimator.rtt$,bufferLength:this.bufferLength$,segmentServerLatency:this.videoBufferManager.currentLiveSegmentServerLatency$}).pipe(K.filter(({isLive:e})=>e),K.filterChanged((e,t)=>t.bufferLength<e.bufferLength),K.map(({rtt:e,bufferLength:t,segmentServerLatency:n})=>{let r=de(this.manifestUrlString,2);return(e/2+t+n+r)/1e3})).subscribe(this.liveLatency$))),this.representationSubscription.add(K.combine({liveBuffer:this.liveBuffer.smoothed$,isActiveLive:this.isActiveLive$,isLowLatency:this.isLowLatency$}).subscribe(({liveBuffer:e,isActiveLive:t,isLowLatency:n})=>{if(!n||!t)return;let r=this.tuning.dashCmafLive.lowLatency.maxTargetOffset,i=this.tuning.dashCmafLive.lowLatency.maxTargetOffsetDeviation,a=this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup,o=e-r;if(this.isManualDecreasePlaybackInLive())return;let s=1;Math.abs(o)>i&&(s=1+Math.sign(o)*a),pc(this.element,s)})),this.representationSubscription.add(this.bufferLength$.subscribe(e=>{let t=0;if(e){let e=(this.element?.currentTime??0)*1e3;t=Math.min(...this.bufferManagers.map(t=>t.getLiveSegmentsToLoadState(this.manifest)?.to??e))-e}this.liveLoadBufferLength$.getValue()!==t&&this.liveLoadBufferLength$.next(t)}));let e=0;this.representationSubscription.add(K.combine({liveLoadBufferLength:this.liveLoadBufferLength$,bufferLength:this.bufferLength$}).pipe(K.throttle(this.tuning.dash.liveUpdateInterval)).subscribe(function(){var t=a(function*({liveLoadBufferLength:t,bufferLength:n}){if(!r.element||r.isUpdatingLive)return;let i=r.element.playbackRate,a=de(r.manifestUrlString,2),o=Math.abs(r.livePositionFromPlayer$.getValue())*1e3,s=Math.min(o,r.tuning.dashCmafLive.normalizedTargetMinBufferSize*i),c=r.tuning.dashCmafLive.normalizedActualBufferOffset*i,l=r.tuning.dashCmafLive.normalizedLiveMinBufferSize*i,u=isFinite(t)?t:n,d=r.isActiveLive$.getValue()&&r.isLowLatency$.getValue(),f=o<=r.tuning.live.activeLiveDelay;r.isActiveLive$.next(f);let p=`none`;if(d?p=`active_low_latency`:r.isLowLatency$.getValue()&&f?(r.bufferManagers.forEach(e=>e.proceedLowLatencyLive()),p=`active_low_latency`):a!==0&&u<s?p=`live_forward_buffering`:u<s+l&&(p=`live_with_target_offset`),isFinite(t)&&(e=t>e?t:e),p===`live_forward_buffering`||p===`live_with_target_offset`){let n=e-(s+c),o=r.normalizeLiveOffset(Math.trunc(a+n/i)),l=Math.abs(o-a),u=0;!t||l<=r.tuning.dashCmafLive.offsetCalculationError?u=a:o>0&&l>r.tuning.dashCmafLive.offsetCalculationError&&(u=o),r.manifestUrlString=ue(r.manifestUrlString,u,2)}(p===`live_with_target_offset`||p===`live_forward_buffering`)&&(e=0,yield r.updateLive())});return function(e){return t.apply(this,arguments)}}(),e=>{this.error$.next({id:`updateLive`,category:K.ErrorCategory.VIDEO_PIPELINE,thrown:e,message:`Failed to update live with subscription`})}))}let c=K.merge(...this.bufferManagers.map(e=>e.fullyBuffered$)).pipe(K.map(()=>this.bufferManagers.every(e=>e.fullyBuffered$.getValue()))),l=K.merge(...this.bufferManagers.map(e=>e.onLastSegment$)).pipe(K.map(()=>this.bufferManagers.some(e=>e.onLastSegment$.getValue()))),u=K.combine({allBuffersFull:c,someBufferEnded:l}).pipe(K.filterChanged(),K.map(({allBuffersFull:e,someBufferEnded:t})=>e&&t),K.filter(e=>e));if(this.representationSubscription.add(K.merge(this.forceEnded$,u).subscribe(()=>{if(this.source&&this.source.readyState===`open`&&Array.from(this.source.sourceBuffers).every(e=>!e.updating))try{this.source?.endOfStream()}catch(e){this.error$.next({id:`EndOfStream`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`Failed to end MediaSource stream`,thrown:e})}})),this.representationSubscription.add(K.merge(...this.bufferManagers.map(e=>e.error$)).subscribe(this.error$)),this.videoBufferManager&&(this.representationSubscription.add(this.videoBufferManager.playingRepresentation$.subscribe(this.currentVideoRepresentation$)),this.representationSubscription.add(this.videoBufferManager.playingRepresentationInit$.subscribe(this.currentVideoRepresentationInit$)),this.representationSubscription.add(this.videoBufferManager.currentSegmentLength$.subscribe(this.currentVideoSegmentLength$))),this.audioBufferManager&&(this.representationSubscription.add(this.audioBufferManager.playingRepresentation$.subscribe(this.currentAudioRepresentation$)),this.representationSubscription.add(this.audioBufferManager.currentSegmentLength$.subscribe(this.currentAudioSegmentLength$))),this.liveTextManager&&this.representationSubscription.add(this.liveTextManager.currentRepresentation$.subscribe(this.currentLiveTextRepresentation$)),this.source.readyState!==`open`){let e=this.tuning.dash.sourceOpenTimeout>=0;yield new Promise(t=>{e&&(this.timeoutSourceOpenId=setTimeout(()=>{if(this.source?.readyState===`open`){t();return}this.error$.next({id:`OpenOfStream`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`Failed to open MediaSource`,thrown:Error(`Timeout reject when wait sourceopen event`),traceAsLog:!0})},this.tuning.dash.sourceOpenTimeout)),this.source?.addEventListener(`sourceopen`,()=>{this.timeoutSourceOpenId&&clearTimeout(this.timeoutSourceOpenId),t()},{once:!0})})}if(!this.isLive$.getValue()){let e=[this.manifest.duration??0,...yc.arrayFlatMap(yc.arrayFlatMap([...this.manifest.streams.audio,...this.manifest.streams.video],e=>e.representations),e=>{let t=[];return e.duration&&t.push(e.duration),Os(e.segmentReference)&&e.segmentReference.totalSegmentsDurationMs&&t.push(e.segmentReference.totalSegmentsDurationMs),t})];this.source.duration=Math.max(...e)/1e3}let d=[];this.videoBufferManager&&K.isNonNullable(e)&&d.push(this.videoBufferManager.startWith(e)),this.audioBufferManager&&K.isNonNullable(t)&&d.push(this.audioBufferManager.startWith(t)),yield Promise.all(d),this.state$.setState(`representations_ready`),this.tracer.log(`initRepresentationsEnd`)});return function(t,n,r){return e.apply(this,arguments)}}().bind(this))),i(this,`tick`,()=>{if(!this.element||this.source?.readyState!==`open`)return;let e=this.element.currentTime*1e3;this.videoBufferManager?.maintain(e),this.audioBufferManager?.maintain(e),this.liveTextManager?.maintain(e),(this.videoBufferManager?.gaps.length||this.audioBufferManager?.gaps.length)&&!this.gapWatchdogActive&&(this.gapWatchdogActive=!0,this.gapWatchdogSubscription=K.interval(this.tuning.gapWatchdogInterval).subscribe(()=>this.jumpGap(),e=>{this.error$.next({id:`GapWatchdog`,category:K.ErrorCategory.WTF,message:`Error handling gaps`,thrown:e})}),this.subscription.add(this.gapWatchdogSubscription))}),this.throughputEstimator=e.throughputEstimator,this.tuning=e.tuning,this.tracer=e.tracer.createComponentTracer(this.constructor.name),this.forceVideoCodec=e.forceVideoCodec,this.isOnDemand=e.isOnDemand,this.dashMaxTvVideoQuality=e.dashMaxTvVideoQuality,this.fetcher=new nl({throughputEstimator:this.throughputEstimator,requestQuic:this.tuning.requestQuick,compatibilityMode:e.compatibilityMode,tracer:this.tracer,useEnableSubtitlesParam:e.tuning.useEnableSubtitlesParam,handleExtendedNetworkErrorsSet:e.tuning.handleExtendedNetworkErrorsSet,useUrlCacheMechanism:this.tuning.useUrlCacheMechanism,measureNonSegmentRequests:e.tuning.throughputEstimator.measureNonSegmentRequests}),this.subscription.add(this.fetcher.recoverableError$.subscribe(this.fetcherRecoverableError$)),this.subscription.add(this.fetcher.error$.subscribe(this.fetcherError$)),this.subscription.add(this.fetcher.manifestRequested$.subscribe(this.manifestRequested$)),this.subscription.add(this.fetcher.firstBytesManifest$.subscribe(this.firstBytesManifest$)),this.subscription.add(this.fetcher.firstBytesRequested$.subscribe(this.firstBytesRequested$)),this.subscription.add(this.fetcher.firstBytesReceived$.subscribe(this.firstBytesReceived$)),this.subscription.add(this.fetcher.lastConnectionType$.subscribe(this.lastConnectionType$)),this.subscription.add(this.fetcher.lastConnectionReused$.subscribe(this.lastConnectionReused$)),this.subscription.add(this.fetcher.lastConnectionMetrics$.subscribe(this.lastConnectionMetrics$)),this.subscription.add(this.fetcher.lastDownloadMetrics$.subscribe(this.lastDownloadMetrics$)),this.liveBuffer=fc.getLiveBufferSmoothedValue(this.tuning.dashCmafLive.lowLatency.maxTargetOffset,o({},e.tuning.dashCmafLive.lowLatency.bufferEstimator)),this.initTracerSubscription()}setSmartRepresentationSwitch(e){this.bufferManagers.forEach(t=>t.setSmartRepresentationSwitch(e))}seekLive(e){var t=this;return a(function*(){K.assertNonNullable(t.element),t.updateManifestUrlWithTimeOffset(e),t.manifest=yield t.updateManifest(),t.manifest&&(t.isJumpGapAfterSeekLive=!0,yield t.updateLiveBuffersFromManifest(t.manifest))})()}updateManifestUrlWithTimeOffset(e){let t=this.liveStreamStatus$.getValue()===`active`?0:K.now()-this.liveStreamEndTimestamp,n=this.normalizeLiveOffset(e+t);this.isActiveLive$.next(n===0),this.manifestUrlString=ue(this.manifestUrlString,n,2)}updateLiveBuffersFromManifest(e){var t=this;return a(function*(){yield t.videoBufferManager?.seekLive(e.streams.video),yield t.audioBufferManager?.seekLive(e.streams.audio),t.liveTextManager?.seekLive(e.streams.text)})()}stopStallWatchdogSubscription(){this.stallWatchdogSubscription?.unsubscribe(),this.currentStallDuration$.next(0)}initBuffer(){K.assertNonNullable(this.element),this.state$.setState(`running`),this.subscription.add(K.merge(...al.map(e=>K.fromEvent(this.element,e)),K.fromEvent(window,`online`)).subscribe(()=>this.tick(),e=>{this.error$.next({id:`DashVKPlayer`,category:K.ErrorCategory.WTF,message:`Internal logic error`,thrown:e})})),this.subscription.add(K.fromEvent(this.element,`progress`).subscribe(()=>{this.element&&this.element.readyState===2&&!this.element.seeking&&(this.element.currentTime=this.element.currentTime)})),this.subscription.add(K.fromEvent(this.element,`waiting`).subscribe(()=>{this.tuning.dash.useVideoElementWaitingCurrentTimeReassign&&this.element&&this.element.readyState===2&&!this.element.seeking&&bc(this.element.buffered,this.element.currentTime*1e3)&&(this.element.currentTime=this.element.currentTime),this.stallWatchdogSubscription&&(this.stallWatchdogSubscription.unsubscribe(),this.subscriptionRemovable.remove(this.stallWatchdogSubscription)),this.stallWatchdogSubscription=K.interval(this.tuning.dash.stallWatchdogInterval).subscribe(()=>{let{keepSilentStallWatchdogWhenNotActive:e}=this.tuning.dashCmafLive,{crashOnStallTimeout:t,crashOnStallTWithoutDataTimeout:n,liveStallReinitInterval:r,stallWatchdogInterval:i}=this.tuning.dash,a=this.isLive$.getValue(),o=this.liveStreamStatus$.getValue()===`active`;if(!this.element||this.source?.readyState!==`open`)return;let s=this.currentStallDuration$.getValue();s+=i,this.currentStallDuration$.next(s);let c={timeInWaiting:s},l=K.now(),u=this.videoBufferManager?.lastDataObtainedTimestamp??0;this.videoLastDataObtainedTimestamp$.next(u);let d=this.audioBufferManager?.lastDataObtainedTimestamp??0,f=this.videoBufferManager?.getForwardBufferDuration()??0,p=this.audioBufferManager?.getForwardBufferDuration()??0,m=this.videoBufferManager&&f<100&&l-u>n,h=this.audioBufferManager&&p<100&&l-d>n;if((!e||o)&&((m||h)&&s>n||s>=t))throw Error(`Stall timeout exceeded: ${s} ms`);if(a&&s%r===0){let t=this.normalizeLiveOffset(-1*this.livePositionFromPlayer$.getValue()*1e3);!o&&e?(this.liveWasInterrupted=!0,this.updateManifestUrlWithTimeOffset(t),this.updateManifest()):this.seekLive(t).catch(e=>{this.error$.next({id:`stallIntervalCallback`,category:K.ErrorCategory.VIDEO_PIPELINE,message:`stallIntervalCallback failed`,thrown:e})}),c.liveLastOffset=t}else{let e=this.element.currentTime*1e3;this.videoBufferManager?.maintain(e),this.audioBufferManager?.maintain(e),c.position=e}this.tracer.log(`stallIntervalCallback`,K.flattenObject(c))},e=>{this.error$.next({id:`StallWatchdogCallback`,category:K.ErrorCategory.NETWORK,message:`Can't restore DASH after stall.`,thrown:e})}),this.subscriptionRemovable.add(this.stallWatchdogSubscription)})),this.tick()}switchRepresentation(e,t,n=!1){var r=this;return a(function*(){let i={video:r.videoBufferManager,audio:r.audioBufferManager,text:null}[e];return r.tuning.alwaysAbortPreviousSwitch?i?.switchToWithPreviousAbort(t,n):r.tuning.useNewSwitchTo?r.currentStallDuration$.getValue()>0?i?.switchToWithPreviousAbort(t,n):i?.switchTo(t,n):i?.switchToOld(t,n)})()}seek(e,t){var n=this;return a(function*(){K.assertNonNullable(n.element),K.assertNonNullable(n.videoBufferManager??n.audioBufferManager);let r;r=t||n.element.duration*1e3<=n.tuning.dashSeekInSegmentDurationThreshold||Math.abs(n.element.currentTime*1e3-e)<=n.tuning.dashSeekInSegmentAlwaysSeekDelta?e:Math.max(n.videoBufferManager?.findSegmentStartTime(e)??e,n.audioBufferManager?.findSegmentStartTime(e)??e),n.warmUpMediaSourceIfNeeded(r),!bc(n.element.buffered,r)&&(yield Promise.all([n.videoBufferManager?.abort(),n.audioBufferManager?.abort()])),K.isNullable(n.element)||(n.videoBufferManager?.maintain(r),n.audioBufferManager?.maintain(r),n.element.currentTime=r/1e3,n.tracer.log(`seek`,K.flattenObject({requestedPosition:e,forcePrecise:t,position:r})))})()}warmUpMediaSourceIfNeeded(e=this.element?.currentTime){K.isNonNullable(this.element)&&K.isNonNullable(this.source)&&K.isNonNullable(e)&&this.source?.readyState===`ended`&&this.element.duration*1e3-e>this.tuning.dash.seekBiasInTheEnd&&this.bufferManagers.forEach(e=>e.warmUpMediaSource())}get isStreamEnded(){return this.source?.readyState===`ended`}stop(){this.tracer.log(`stop`),this.element?.querySelectorAll(`source`).forEach(e=>{URL.revokeObjectURL(e.src),e.remove()}),this.element=null,this.source=null,this.manifest=null,this.currentVideoRepresentation$.next(void 0),this.videoBufferManager?.destroy(),this.videoBufferManager=null,this.audioBufferManager?.destroy(),this.audioBufferManager=null,this.bufferManagers=[],this.state$.setState(`none`)}getForwardBufferRepresentations(e){return e===`video`?this.videoBufferManager?.getForwardBufferRepresentations():this.audioBufferManager?.getForwardBufferRepresentations()}getActiveVideoSegmentProgress(){return this.videoBufferManager?.getActiveSegmentProgress()}getMpdVideoSegmentDuration(){return this.videoBufferManager?.getMpdSegmentDuration()}setBufferTarget(e){for(let t of this.bufferManagers)t.setTarget(e)}getStreams(){return this.manifest?.streams}getCodecs(){return this.manifest?.codecs}setPreloadOnly(e){for(let t of this.bufferManagers)t.setPreloadOnly(e)}destroy(){this.subscription.unsubscribe(),this.subscriptionRemovable.unsubscribe(),this.representationSubscription.unsubscribe(),this.timeoutSourceOpenId&&clearTimeout(this.timeoutSourceOpenId),this.destroyController.abort(),this.fetcher.destroy(),this.stop(),this.source?.readyState===`open`&&Array.from(this.source.sourceBuffers).every(e=>!e.updating)&&this.source.endOfStream(),this.source=null,this.tracer.end()}initTracerSubscription(){let e=K.getTraceSubscriptionMethod(this.tracer.error.bind(this.tracer));this.subscription.add(this.error$.subscribe(e(`error`)))}isManualDecreasePlaybackInLive(){if(!this.element||!this.isLive$.getValue())return!1;let e=1-this.element.playbackRate;return Number(e.toFixed(2))>Number(this.tuning.dashCmafLive.lowLatency.playbackCatchupSpeedup.toFixed(2))}normalizeLiveOffset(e){return Math.trunc(e/1e3)*1e3}updateLive(){var e=this;return a(function*(){e.isUpdatingLive=!0,e.manifest=yield e.updateManifest(),e.manifest&&(e.bufferManagers.forEach(t=>t.updateLive(e.manifest)),e.liveTextManager?.updateLive(e.manifest)),e.isUpdatingLive=!1})()}jumpGap(){if(!this.element||!this.videoBufferManager)return;let e=this.videoBufferManager.getDebugBufferState();if(!e)return;let t=this.isActiveLive$.getValue()&&this.isLowLatency$.getValue(),n={isJumpGapAfterSeekLive:this.isJumpGapAfterSeekLive,isActiveLowLatency:t,initialCurrentTime:this.element.currentTime},{usePersistentGaps:r}=this.tuning.dash;this.isJumpGapAfterSeekLive&&!t&&this.element.currentTime>e.to&&(this.isJumpGapAfterSeekLive=!1,this.element.currentTime=0);let i=this.element.currentTime*1e3,a=[],s=this.element.readyState===1?this.tuning.endGapTolerance:0;for(let e of this.bufferManagers)for(let t of e.gaps)(r&&t.persistent||e.playingRepresentation$.getValue()===t.representation)&&t.from-s<=i&&t.to+s>i&&(this.element.duration*1e3-t.to<this.tuning.endGapTolerance?a.push(1/0):a.push(t.to));if(a.length){let e=Math.max(...a)+10;this.gapWatchdogSubscription.unsubscribe(),this.gapWatchdogActive=!1,e===1/0?this.forceEnded$.next():(this.element.currentTime=e/1e3,n=o(o({},n),{},{gapEnds:a,jumpTo:e,resultCurrentTime:this.element.currentTime}),this.tracer.log(`jumpGap`,K.flattenObject(n)))}}calculateDurationFromSegments(){return Math.max(this.videoBufferManager?.calculateDurationFromSegments()||0,this.audioBufferManager?.calculateDurationFromSegments()||0)}isAnyBufferUpdating(){return!this.source||this.source.readyState!==`open`?!1:Array.from(this.source.sourceBuffers).some(e=>e.updating)}updateSourceDurationFromSegments(){if(!this.source||this.source.readyState!==`open`||this.isLive$.getValue()||!this.tuning.useDurationFromSegments)return;let e=e=>{this.updateDurationError$.next({id:`updateDuration`,category:K.ErrorCategory.VIDEO_PIPELINE,message:"Duration can`t be updated",thrown:e})};try{if(!this.isAnyBufferUpdating()){this.source.duration=this.calculateDurationFromSegments()/1e3;return}}catch(t){e(t);return}let t=new K.Subscription;t.add(K.merge(...this.bufferManagers.map(e=>e.updateEnd$)).subscribe(()=>{if(!this.isAnyBufferUpdating()){t.unsubscribe();try{this.source&&(this.source.duration=this.calculateDurationFromSegments()/1e3)}catch(t){e(t)}}}))}}class cl{constructor(e){i(this,`scene3D`,void 0),i(this,`subscription`,new G.Subscription),i(this,`volumeSubscription`,new G.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`allocation`,void 0),i(this,`observableVideo`,null),i(this,`player`,void 0),i(this,`params`,void 0),i(this,`tracer`,void 0),i(this,`textTracksManager`,null),i(this,`droppedFramesManager`,new dr),i(this,`stallsManager`,new di),i(this,`elementSizeManager`,new pi),i(this,`abrManager`,new Oa),i(this,`failedVideoTrack`,void 0),i(this,`videoTracksMap`,new Map),i(this,`audioTracksMap`,new Map),i(this,`textTracksMap`,new Map),i(this,`videoStreamsMap`,new Map),i(this,`audioStreamsMap`,new Map),i(this,`videoTrackSwitchHistory`,new hn),i(this,`audioTrackSwitchHistory`,new hn),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.seekState.getState();if(!this.videoState.getTransition()){if(r.state===`requested`&&n?.to!==`paused`&&e!==`stopped`&&t!==`stopped`&&this.seek(r.position,r.forcePrecise),t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.player.stop(),this.allocation.target.load(),this.params.output.position$.next(0),this.params.output.duration$.next(1/0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}switch(e){case`stopped`:this.videoState.startTransitionTo(`ready`),this.prepare();return;case`ready`:t===`paused`?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`ready`&&k(this.params.desiredState.playbackState,`ready`);return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):t===`playing`&&this.allocation.target.paused?this.playIfAllowed():n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`paused`&&k(this.params.desiredState.playbackState,`paused`);return;default:return G.assertNever(e)}}}),i(this,`init3DScene`,e=>{if(this.scene3D)return;let t=this.params.allocation.parent,n=this.allocation.video;if(!t||!n)return;this.scene3D=new ni(t,n,{fov:this.params.tuning.spherical.fov,orientation:this.params.tuning.spherical.orientation||{x:e.projectionData?.pose.yaw||0,y:e.projectionData?.pose.pitch||0,z:e.projectionData?.pose.roll||0},rotationSpeed:this.params.tuning.spherical.rotationSpeed,maxYawAngle:this.params.tuning.spherical.maxYawAngle,rotationSpeedCorrection:this.params.tuning.spherical.rotationSpeedCorrection,degreeToPixelCorrection:this.params.tuning.spherical.degreeToPixelCorrection,speedFadeTime:this.params.tuning.spherical.speedFadeTime,speedFadeThreshold:this.params.tuning.spherical.speedFadeThreshold});let r=this.elementSizeManager.getValue();r&&this.scene3D.setViewportSize(r.width,r.height)}),i(this,`destroy3DScene`,()=>{this.scene3D&&=(this.scene3D.destroy(),void 0)}),e.tuning.disableSubtitles||(this.textTracksManager=new Bt(e.source.url)),this.params=e,this.allocation=Lr(e.allocation,e.tuning),this.tracer=e.dependencies.tracer.createComponentTracer(this.constructor.name),this.params.output.element$.next(this.allocation.video??void 0),this.params.output.availableVideoTracks$.next([]),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.output.hostname$.next(jn(this.params.source.url)),this.params.output.isLive$.next(!1),this.params.output.autoVideoTrackLimitingAvailable$.next(!0),this.params.output.availableTextTracks$.next([]),this.params.desiredState.internalTextTracks.setState([]),this.player=new sl({throughputEstimator:this.params.dependencies.throughputEstimator,tuning:this.params.tuning,compatibilityMode:this.params.source.compatibilityMode,tracer:this.tracer,forceVideoCodec:this.params.forceVideoCodec,isOnDemand:this.params.isOnDemand||!1,dashMaxTvVideoQuality:this.params.dashMaxTvVideoQuality}),this.subscribe()}getProviderSubscriptionInfo(){let{output:e,desiredState:t}=this.params;G.isNullable(this.observableVideo)&&(this.observableVideo=Jt(this.allocation.target),this.subscription.add(()=>this.observableVideo?.destroy()));let n=this.constructor.name,r=t=>{e.error$.next({id:n,category:G.ErrorCategory.WTF,message:`${n} internal logic error`,thrown:t})};return{output:e,desiredState:t,observableVideo:this.observableVideo,genericErrorListener:r,connect:(e,t)=>this.subscription.add(e.subscribe(t,r))}}subscribe(){var e=this;let{output:t,desiredState:n,observableVideo:r,genericErrorListener:i,connect:s}=this.getProviderSubscriptionInfo();G.isNonNullable(this.params.failedVideoTrack)&&(this.failedVideoTrack=this.params.failedVideoTrack,this.subscription.add(G.timeout(this.params.tuning.dash.videoTrackBanAfterProviderFail).subscribe(()=>this.failedVideoTrack=null)));let c=this.allocation.video;c&&this.subscription.add(this.params.output.availableVideoTracks$.pipe(G.filter(e=>!!e.length),G.once()).subscribe(e=>{this.droppedFramesManager.connect({logger:this.params.dependencies.logger,video:c,droppedFramesChecker:this.params.tuning.droppedFramesChecker,isAuto:this.params.desiredState.autoVideoTrackSwitching,playing$:r.playing$,pause$:r.pause$,tracks:e})}));let l=this.params.desiredState.seekState.stateChangeEnded$.pipe(G.map(e=>e.to.state!==`none`),G.filterChanged());this.abrManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,throughputVariance$:this.params.dependencies.throughputEstimator.throughputVariance$,tuning:this.params.tuning,failedVideoTrack:this.params.failedVideoTrack,element:this.allocation.target,abrLogger:this.params.dependencies.abrLogger}),this.stallsManager.init({isSeeked$:l,currentStallDuration$:this.player.currentStallDuration$,videoLastDataObtainedTimestamp$:this.player.videoLastDataObtainedTimestamp$,throughput$:this.params.dependencies.throughputEstimator.throughput$,rtt$:this.params.dependencies.throughputEstimator.rtt$,tuning:this.params.tuning.stallsManager,abrParams:this.params.tuning.autoTrackSelection,isBuffering$:r.isBuffering$,looped$:r.looped$,playing$:r.playing$,duration:this.allocation.target.duration}),s(r.ended$,t.endedEvent$),s(r.looped$,t.loopedEvent$),s(r.error$,t.error$),s(r.isBuffering$,t.isBuffering$),s(r.currentBuffer$,t.currentBuffer$),s(r.currentBuffer$,t.currentNativeBuffer$),s(r.playing$,t.firstFrameEvent$),s(r.canplay$,t.canplay$),s(r.playedTime$,t.playedTime$),s(r.inPiP$,t.inPiP$),s(r.inFullscreen$,t.inFullscreen$),s(r.loadedMetadata$,t.loadedMetadataEvent$),s(this.player.error$,t.error$),s(this.player.fetcherRecoverableError$,t.fetcherRecoverableError$),s(this.player.updateDurationError$,t.updateDurationError$),s(this.player.fetcherError$,t.fetcherError$),s(this.player.videoLastDataObtainedTimestamp$,t.videoLastDataObtainedTimestamp$),s(this.player.manifestRequested$,t.manifestRequested$),s(this.player.firstBytesManifest$,t.firstBytesManifest$),s(this.player.manifestReceived$,t.manifestReceived$),s(this.player.firstBytesRequested$,t.firstBytesRequested$),s(this.player.firstBytesReceived$,t.firstBytesReceived$),s(this.player.lastConnectionType$,t.httpConnectionType$),s(this.player.lastConnectionReused$,t.httpConnectionReused$),s(this.player.lastConnectionMetrics$,t.httpConnectionMetrics$),s(this.player.lastDownloadMetrics$,t.httpDownloadMetrics$),s(this.player.isLive$,t.isLive$),s(this.player.lastRequestFirstBytes$.pipe(G.filter(G.isNonNullable),G.once()),t.firstBytesEvent$),s(this.stallsManager.severeStallOccurred$,t.severeStallOccurred$),s(this.videoState.stateChangeEnded$.pipe(G.map(e=>e.to)),this.params.output.playbackState$),this.subscription.add(r.looped$.subscribe(()=>this.player.warmUpMediaSourceIfNeeded(),i)),this.subscription.add(r.seeked$.subscribe(t.seekedEvent$,i)),this.subscription.add(Nt(this.allocation.target,n.isLooped,i)),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(e=>{this.volumeSubscription.unsubscribe(),e?this.volumeSubscription.add(n.volume.stateChangeStarted$.subscribe(({to:e})=>this.params.output.volume$.next(e),i)):this.volumeSubscription.add(r.volumeState$.subscribe(this.params.output.volume$,i))})),hi({subscription:this.subscription,desiredState:n,videoElement$:this.params.output.element$,observableVideo:r}),this.subscription.add(Pt(this.allocation.target,n.volume,r.volumeState$,i,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.subscription.add(Ft(this.allocation.target,n.playbackRate,r.playbackRateState$,i)),this.allocation.video&&this.elementSizeManager.connect({video:this.allocation.video,observableVideo:r}),s(hr(this.allocation.target,{threshold:this.params.tuning.autoTrackSelection.activeVideoAreaThreshold}),t.elementVisible$),this.subscription.add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`),k(n.playbackState,`playing`),this.scene3D&&this.scene3D.play()},i)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)},i)).add(r.canplay$.subscribe(()=>{this.videoState.getState()===`playing`&&!this.allocation.target.ended&&this.playIfAllowed()},i)),this.params.tuning.changePlaybackStateToPausedWhenEnded&&this.subscription.add(r.ended$.subscribe(()=>{this.videoState.setState(`paused`),k(n.playbackState,`paused`)})),this.subscription.add(this.player.state$.stateChangeEnded$.subscribe(({to:e})=>{if(e===`manifest_ready`){this.videoTracksMap=new Map,this.audioTracksMap=new Map,this.textTracksMap=new Map;let e=this.player.getStreams(),t=this.player.getCodecs();if(G.assertNonNullable(e,`Manifest not loaded or empty`),!this.params.tuning.isAudioDisabled){let t=[];for(let n of e.audio){t.push(Ts(n));let e=[];for(let t of n.representations){let r=Ss(t);e.push(r),this.audioTracksMap.set(r,{stream:n,representation:t})}this.audioStreamsMap.set(n,e)}this.params.output.availableAudioStreams$.next(t)}let n=[];for(let t of e.video){n.push(Es(t));let e=[];for(let n of t.representations){let r=xs(o(o({},n),{},{streamId:t.id}));r&&(e.push(r),this.videoTracksMap.set(r,{stream:t,representation:n}))}this.videoStreamsMap.set(t,e)}this.params.output.availableVideoStreams$.next(n);for(let t of e.text)for(let e of t.representations){let n=Cs(t,e);this.textTracksMap.set(n,{stream:t,representation:e})}this.params.output.availableVideoTracks$.next(Array.from(this.videoTracksMap.keys())),this.params.output.availableAudioTracks$.next(Array.from(this.audioTracksMap.keys())),this.params.output.isAudioAvailable$.next(!!this.audioTracksMap.size),t?.video&&this.params.output.availableVideoCodecs$.next(t.video),t?.audio&&this.params.output.availableAudioCodecs$.next(t.audio),this.audioTracksMap.size&&this.textTracksMap.size&&this.params.desiredState.internalTextTracks.startTransitionTo(Array.from(this.textTracksMap.keys()))}else e===`representations_ready`&&(this.videoState.setState(`ready`),this.player.initBuffer())},i));let u=G.merge(this.player.currentStallDuration$,this.player.state$.stateChangeEnded$,n.videoTrack.stateChangeStarted$,n.autoVideoTrackSwitching.transitionStarted$,this.params.dependencies.throughputEstimator.rttAdjustedThroughput$,n.autoVideoTrackLimits.stateChangeStarted$,this.elementSizeManager.getObservable(),this.params.output.elementVisible$,this.droppedFramesManager.onDroopedVideoFramesLimit$,G.fromEvent(this.allocation.target,`progress`)).pipe(G.filter(()=>this.videoTracksMap.size>0||this.audioTracksMap.size>0)),{abrThrottle:d}=this.params.tuning.dash;d&&(u=u.pipe(G.throttle(d))),this.subscription.add(u.subscribe(a(function*(){let t=e.player.state$.getState(),r=e.player.state$.getTransition();if(t!==`manifest_ready`&&t!==`running`||r)return;n.autoVideoTrackSwitching.getTransition()&&n.autoVideoTrackSwitching.setState(n.autoVideoTrackSwitching.getState());let i=e.selectVideoAudioRepresentations();if(!i){if(e.audioStreamsMap.size){let[,[n]]=e.audioStreamsMap.entries().next().value;t===`manifest_ready`&&(yield e.player.initRepresentations(void 0,n.id,e.params.sourceHls))}return}let[a,o]=i,s=[...e.videoTracksMap.keys()].find(t=>e.videoTracksMap.get(t)?.representation.id===a.id);G.isNonNullable(s)&&(e.stallsManager.lastVideoTrackSelected=s);let c=e.params.desiredState.autoVideoTrackLimits.getTransition();if(c&&e.params.output.autoVideoTrackLimits$.next(c.to),t===`manifest_ready`)yield e.player.initRepresentations(a.id,o?.id,e.params.sourceHls);else if(yield e.player.switchRepresentation(`video`,a.id),o){let t=!!n.audioStream.getTransition();yield e.player.switchRepresentation(`audio`,o.id,t)}}),i)),this.subscription.add(G.combine({videoState:this.videoState.stateChangeEnded$,autoVideoTrackState:G.merge(G.observableFrom([n.autoVideoTrackSwitching.getState()]),n.autoVideoTrackSwitching.stateChangeEnded$.pipe(G.map(e=>e.to)))}).pipe(G.map(({videoState:e,autoVideoTrackState:t})=>e.to!==`stopped`&&t),G.filterChanged()).subscribe(e=>this.player.setSmartRepresentationSwitch(e))),this.subscription.add(n.cameraOrientation.stateChangeEnded$.subscribe(({to:e})=>{this.scene3D&&e&&this.scene3D.pointCameraTo(e.x,e.y)})),this.subscription.add(this.elementSizeManager.subscribe(e=>{this.scene3D&&e&&this.scene3D.setViewportSize(e.width,e.height)})),this.subscription.add(this.player.currentVideoRepresentation$.pipe(G.filterChanged()).subscribe(e=>{let n=[...this.videoTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentVideoTrack$.next(void 0),t.currentVideoStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.videoStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.videoStream.setState(a.to),t.currentVideoTrack$.next(r),t.currentVideoStream$.next(Es(i)),this.player.updateSourceDurationFromSegments()},i)),this.subscription.add(this.player.currentAudioRepresentation$.pipe(G.filterChanged()).subscribe(e=>{let n=[...this.audioTracksMap.entries()].find(([,{representation:t}])=>t.id===e);if(!n){t.currentAudioStream$.next(void 0);return}let[r,{stream:i}]=n,a=this.params.desiredState.audioStream.getTransition();a&&a.to&&a.to.id===i.id&&this.params.desiredState.audioStream.setState(a.to),t.currentAudioStream$.next(Ts(i)),this.player.updateSourceDurationFromSegments()},i)),this.subscription.add(this.player.currentVideoRepresentationInit$.subscribe(e=>{if(e?.is3dVideo&&this.params.tuning.spherical?.enabled)try{this.init3DScene(e),t.is3DVideo$.next(!0)}catch(e){t.warning$.next({id:`DashProvider`,message:`DashProvider could not initialize 3D-scene: ${e}`})}else this.destroy3DScene(),this.params.tuning.spherical?.enabled&&t.is3DVideo$.next(!1)},i)),this.subscription.add(this.player.currentVideoSegmentLength$.subscribe(t.currentVideoSegmentLength$,i)),this.subscription.add(this.player.currentAudioSegmentLength$.subscribe(t.currentAudioSegmentLength$,i)),this.allocation.video&&this.textTracksManager?.connect(this.allocation.video,n,t);let f=n.playbackState.stateChangeStarted$.pipe(G.map(({to:e})=>e===`ready`),G.filterChanged());this.subscription.add(G.merge(f,n.autoVideoTrackSwitching.stateChangeStarted$,this.player.state$.stateChangeEnded$,G.observableFrom([`init`])).subscribe(()=>{let e=n.autoVideoTrackSwitching.getState(),t=n.playbackState.getState()===`ready`?this.params.tuning.dash.forwardBufferTargetPreload:e?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;this.player.setBufferTarget(t)})),this.subscription.add(G.merge(f,this.player.state$.stateChangeEnded$,G.observableFrom([`init`])).subscribe(()=>this.player.setPreloadOnly(n.playbackState.getState()===`ready`)));let p=G.merge(n.playbackState.stateChangeStarted$,n.videoTrack.stateChangeStarted$,n.seekState.stateChangeEnded$,this.videoState.stateChangeEnded$,G.observableFrom([`init`])).pipe(G.debounce(0));this.subscription.add(p.subscribe(this.syncPlayback,i))}selectVideoAudioRepresentations(){if(this.player.isStreamEnded)return;let e=this.params.tuning.useNewAutoSelectVideoTrack?xn:bn,t=this.params.tuning.useNewAutoSelectVideoTrack?An:kn,n=this.params.tuning.useNewAutoSelectVideoTrack?Dn:On,{desiredState:r,output:i}=this.params,a=r.autoVideoTrackSwitching.getState(),s=r.videoTrack.getState()?.id,c=[...this.videoTracksMap.keys()].find(({id:e})=>e===s),l=i.currentVideoTrack$.getValue(),u=r.videoStream.getState()??(c&&this.videoTracksMap.get(c)?.stream)??this.videoStreamsMap.size===1?this.videoStreamsMap.keys().next().value:void 0;if(!u)return;let d=[...this.videoStreamsMap.keys()].find(({id:e})=>e===u.id),f=d&&this.videoStreamsMap.get(d);if(!f)return;let p=Ws(this.allocation.target.buffered,this.allocation.target.currentTime*1e3),m;m=this.player.isActiveLive$.getValue()?this.player.isLowLatency$.getValue()?this.params.tuning.dashCmafLive.lowLatency.maxTargetOffset:this.params.tuning.dashCmafLive.normalizedLiveMinBufferSize:this.player.isLive$.getValue()?this.params.tuning.dashCmafLive.normalizedTargetMinBufferSize:a?this.params.tuning.dash.forwardBufferTargetAuto:this.params.tuning.dash.forwardBufferTargetManual;let h=(this.allocation.target.duration*1e3||1/0)-this.allocation.target.currentTime*1e3,g=Math.min(p/Math.min(m,h||1/0),1),_=r.audioStream.getState()??(this.audioStreamsMap.size===1?this.audioStreamsMap.keys().next().value:void 0),v=[...this.audioStreamsMap.keys()].find(({id:e})=>e===_?.id)??this.audioStreamsMap.keys().next().value,y=0;if(v){if(c&&!a){let t=e(c,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}if(l){let t=e(l,f,this.audioStreamsMap.get(v)??[],this.params.tuning.autoTrackSelection.minVideoAudioRatio);y=Math.max(y,t?.bitrate??-1/0)}}let b=this.player.isLive$.getValue(),x=this.allocation.target.duration*1e3,S=!b&&Number.isFinite(x)&&x>0?Math.max(0,x-this.allocation.target.currentTime*1e3):void 0,C=this.params.tuning.dash.useAbrPhases?{isLive:b,remainingDurationMs:S,mpdSegmentDurationMs:this.player.getMpdVideoSegmentDuration()}:{};this.abrManager.updateContext(o({isAuto:a,videoTracks:f,audioTracks:v?this.audioStreamsMap.get(v)??[]:[],currentVideoTrack:l,desiredVideoTrack:c,limits:this.params.desiredState.autoVideoTrackLimits.getState(),forwardBufferHealth:g,forwardBufferDuration:p,forwardVideoBufferRepresentations:this.player.getForwardBufferRepresentations(`video`),forwardAudioBufferRepresentations:this.player.getForwardBufferRepresentations(`audio`),videoSegmentLoadProgress:this.player.getActiveVideoSegmentProgress()},C));let w=c,T;this.params.tuning.dash.useNewAbr?(w=this.abrManager.autoSelectTrack(`video`),T=v&&this.abrManager.autoSelectTrack(`audio`)):((a||!w)&&(w=n(f,{container:this.elementSizeManager.getValue(),panelSize:this.params.panelSize,estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),tuning:this.stallsManager.abrTuningParams,limits:this.params.desiredState.autoVideoTrackLimits.getState(),reserve:y,forwardBufferHealth:g,current:l,failedVideoTrack:this.failedVideoTrack,visible:this.params.output.elementVisible$.getValue(),history:this.videoTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,droppedVideoMaxQualityLimit:this.droppedFramesManager.droppedVideoMaxQualityLimit,stallsVideoMaxQualityLimit:this.stallsManager.videoMaxQualityLimit,stallsPredictedThroughput:this.stallsManager.predictedThroughput,abrLogger:this.params.dependencies.abrLogger})),T=v&&t(w,f,this.audioStreamsMap.get(v)??[],{estimatedThroughput:this.params.dependencies.throughputEstimator.rttAdjustedThroughput$.getValue(),stallsPredictedThroughput:this.stallsManager.predictedThroughput,tuning:this.stallsManager.abrTuningParams,forwardBufferHealth:g,history:this.audioTrackSwitchHistory,playbackRate:this.allocation.target.playbackRate,abrLogger:this.params.dependencies.abrLogger}));let E=this.videoTracksMap.get(w)?.representation,ee=T&&this.audioTracksMap.get(T)?.representation;if(E&&ee)return[E,ee];if(E&&!ee&&this.audioTracksMap.size===0)return[E,void 0]}prepare(e=0){this.player.initManifest(this.allocation.target,this.params.source.url,e)}playIfAllowed(){let e=Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}),t=e=>{e||(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`,!0))},n=e=>{this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:G.ErrorCategory.DOM,thrown:e})};this.params.tuning.ignoreForcePlayResultWhenProviderChanged?this.subscription.add(G.observableFrom(e).subscribe(t,n)):e.then(t,n)}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.droppedFramesManager.destroy(),this.stallsManager.destroy(),this.abrManager.destroy(),this.elementSizeManager.destroy(),this.destroy3DScene(),this.textTracksManager?.destroy(),this.player.destroy(),this.params.output.element$.next(void 0),this.params.output.currentVideoStream$.next(void 0),Dt(this.allocation.target,this.params.tuning),this.tracer.end()}}class ll extends cl{subscribe(){super.subscribe();let{output:e,observableVideo:t,connect:n}=this.getProviderSubscriptionInfo();n(t.timeUpdate$,e.position$),n(t.durationChange$,e.duration$)}seek(e,t){this.params.output.willSeekEvent$.next(),this.player.seek(e,t)}}var ul=require(`@vkontakte/videoplayer-shared`);class dl extends cl{constructor(e){super(e),this.textTracksManager?.destroy()}subscribe(){super.subscribe();let e=!1,t=-1,{output:n,observableVideo:r,desiredState:i,connect:a}=this.getProviderSubscriptionInfo();this.params.output.position$.next(0),this.params.output.isLive$.next(!0),this.params.output.canPlayLiveTailBuffer$.next(!0),a(r.timeUpdate$,n.liveBufferTime$),a(this.player.liveSeekableDuration$,n.duration$),a(this.player.liveLatency$,n.liveLatency$);let o=new ul.ValueSubject(1);a(r.playbackRateState$,o),(this.params.tuning.dashCmafLive.catchupLiveForMutedInactiveTab||this.params.tuning.live.catchupLiveForMutedInactiveTab)&&this.subscription.add(n.elementVisible$.pipe(ul.filterChanged()).subscribe(t=>{let r=n.position$.getValue(),i=n.volume$.getValue(),a=!i.volume||i.muted;!t&&!r&&a?e=!0:t&&e&&(this.seek(0),e=!1)})),this.subscription.add(this.params.output.position$.subscribe(this.player.livePositionFromPlayer$)).add(i.isLowLatency.stateChangeEnded$.pipe(ul.map(e=>e.to)).subscribe(this.player.isLowLatency$)).add(ul.combine({liveBufferTime:n.liveBufferTime$,liveAvailabilityStartTime:this.player.liveAvailabilityStartTime$}).pipe(ul.map(({liveBufferTime:e,liveAvailabilityStartTime:n})=>e&&n?e*1e3+n+t:void 0)).subscribe(n.liveTime$)).add(ul.combine({liveDuration:this.player.liveDuration$,liveStreamStatus:this.player.liveStreamStatus$,playbackRate:ul.merge(r.playbackRateState$,new ul.ValueSubject(1))}).pipe(ul.filter(({liveStreamStatus:e,liveDuration:t})=>e===`active`&&!!t)).subscribe(({liveDuration:e,playbackRate:r})=>{let i=n.liveBufferTime$.getValue(),a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;a||r<1-o||this.allocation.target.paused||ul.isNullable(i)||(t=e-i)})).add(ul.combine({time:n.liveBufferTime$,liveDuration:this.player.liveDuration$,playbackRate:ul.merge(r.playbackRateState$,new ul.ValueSubject(1))}).pipe(ul.filterChanged((e,t)=>this.player.liveStreamStatus$.getValue()===`active`?e.liveDuration===t.liveDuration:e.time===t.time)).subscribe(({time:e,liveDuration:r,playbackRate:i})=>{let a=n.position$.getValue(),{playbackCatchupSpeedup:o}=this.params.tuning.dashCmafLive.lowLatency;if(!a&&!this.allocation.target.paused&&i>=1-o||ul.isNullable(e)||ul.isNullable(r))return;let s=-1*(r-e-t);n.position$.next(Math.min(s,0))})).add(this.player.currentLiveTextRepresentation$.subscribe(e=>{if(e){let t=ws(e);this.params.output.availableTextTracks$.next([t])}})),this.params.tuning.dashCmafLive.externalStopControl||this.subscription.add(this.player.liveStreamStatus$.pipe(ul.filter(e=>ul.isNonNullable(e))).subscribe(e=>n.isLiveEnded$.next(e===`unpublished`&&n.position$.getValue()===0)))}seek(e){this.params.output.willSeekEvent$.next();let t=-e,n=Math.trunc(t/1e3<=Math.abs(this.params.output.duration$.getValue())?t:0);this.player.seekLive(n).then(()=>{this.params.output.position$.next(e/1e3)})}}var fl=require(`@vkontakte/videoplayer-shared`),pl=require(`@vkontakte/videoplayer-shared`),ml=`X-Playback-Duration`,hl=function(){var e=a(function*(e){let t=yield pl.fetchPolyfilled(e),n=yield t.text(),r=/#EXT-X-VK-PLAYBACK-DURATION:(\d+)/m.exec(n)?.[1];return r?parseInt(r,10):t.headers.has(ml)?parseInt(t.headers.get(ml),10):void 0});return function(t){return e.apply(this,arguments)}}(),Y=require(`@vkontakte/videoplayer-shared`),gl=require(`@vkontakte/videoplayer-shared`),_l=require(`@vkontakte/videoplayer-shared`),vl=require(`@vkontakte/videoplayer-shared`),yl=e=>{let t=null;if(e.QUALITY&&(t=Xt(e.QUALITY)),!t&&e.RESOLUTION){let[n,r]=e.RESOLUTION.split(`x`).map(e=>parseInt(e,10));t=vl.videoSizeToQuality({width:n,height:r})}return t??null},bl=(e,t)=>{let n=e.split(`
|
|
246
|
+
`),r=[],i=[],a=[];for(let e=0;e<n.length;e++){let o=n[e],s=o.match(/^#EXT-X-STREAM-INF:(.+)/),c=o.match(/^#EXT-X-MEDIA:TYPE=SUBTITLES,(.+)/),l=o.match(/^#EXT-X-MEDIA:TYPE=AUDIO,(.+)/);if(!(!s&&!c&&!l)){if(s){let i=gl.objectFromEntries(s[1].split(`,`).map(e=>e.split(`=`))),a=i.QUALITY??`stream-${i.BANDWIDTH}`,o=yl(i),c;i.BANDWIDTH&&(c=parseInt(i.BANDWIDTH,10)/1e3||void 0),!c&&i[`AVERAGE-BANDWIDTH`]&&(c=parseInt(i[`AVERAGE-BANDWIDTH`],10)/1e3||void 0);let l=i[`FRAME-RATE`]?parseFloat(i[`FRAME-RATE`]):void 0,u;if(i.RESOLUTION){let[e,t]=i.RESOLUTION.split(`x`).map(e=>parseInt(e,10));e&&t&&(u={width:e,height:t})}let d=new URL(n[++e],t).toString();o&&r.push({id:a,quality:o,url:d,bandwidth:c,size:u,fps:l})}if(c){let e=gl.objectFromEntries(c[1].split(`,`).map(e=>{let t=e.indexOf(`=`);return[e.substring(0,t),e.substring(t+1)]}).map(([e,t])=>[e,t.replace(/^"|"$/g,``)])),t=e.URI?.replace(/playlist$/,`subtitles.vtt`),n=e.LANGUAGE,r=e.NAME;t&&n&&i.push({type:`internal`,id:n,label:r,language:n,url:t,isAuto:!1})}if(l){let e=gl.objectFromEntries(l[1].split(`,`).map(e=>{let t=e.indexOf(`=`);return[e.substring(0,t),e.substring(t+1)]}).map(([e,t])=>[e,t.replace(/^"|"$/g,``)])),n=e.URI?new URL(e.URI,t).toString():void 0,r=e.LANGUAGE,i=e.NAME,o=e[`GROUP-ID`],s=e.DEFAULT===`YES`,c=e.CHANNELS?parseInt(e.CHANNELS,10):void 0;n&&r&&a.push({type:`internal`,id:o??r,url:n,language:r,label:i,isDefault:s,channels:c})}}}if(!r.length&&!a.length)throw Error(`Empty manifest`);return{qualityManifests:r,textTracks:i,audioStreams:a}},xl=e=>new Promise(t=>{setTimeout(()=>{t()},e)}),Sl=0,Cl=function(){var e=a(function*(e,t=e,n,r){let i=yield(yield _l.fetchPolyfilled(e,r)).text();Sl+=1;try{let{qualityManifests:e,textTracks:n,audioStreams:r}=bl(i,t);return{qualityManifests:e,textTracks:n,audioStreams:r}}catch{if(Sl<=n.manifestRetryMaxCount)return yield xl(vl.getExponentialDelay(Sl-1,{start:n.manifestRetryInterval,max:n.manifestRetryMaxInterval})),Cl(e,t,n)}return{qualityManifests:[],textTracks:[],audioStreams:[]}});return function(t){return e.apply(this,arguments)}}(),wl=Cl,Tl=require(`@vkontakte/videoplayer-shared`),El=require(`@vkontakte/videoplayer-shared`),Dl=require(`@vkontakte/videoplayer-shared`);class Ol{constructor(e,t,n,r,a){i(this,`params`,void 0),i(this,`subscription`,new Dl.Subscription),i(this,`abortControllers`,{destroy:new Tl.AbortControllerPolyfilled,nextManifest:null}),i(this,`prepareUrl`,void 0),i(this,`currentTextTrackData`,null),i(this,`availableTextTracks$`,new Dl.ValueSubject(null)),i(this,`getCurrentTime$`,new Dl.ValueSubject(null)),i(this,`error$`,new Dl.Subject),this.params={fetchManifestData:n,sourceUrl:r,downloadThreshold:a},this.subscription.add(e.pipe(Dl.throttle(1e3)).subscribe(e=>{this.processLiveTime(e)})),this.getCurrentTime$.next(()=>this.currentTextTrackData?this.currentTextTrackData.playlist.segmentStartTime/1e3+t.currentTime:0)}destroy(){this.subscription.unsubscribe(),this.abortControllers.destroy.abort()}prepare(e){var t=this;return a(function*(){try{let n=new URL(e);n.searchParams.set(`enable-subtitles`,`yes`),t.prepareUrl=n.toString();let{textTracks:r}=yield t.fetchManifestData();yield t.processTextTracks(r,t.params.sourceUrl)}catch(e){t.error(`prepare`,e)}})()}processTextTracks(e,t){var n=this;return a(function*(){try{let r=yield n.parseTextTracks(e,t);r&&(n.currentTextTrackData=r)}catch(e){n.error(`processTextTracks`,e)}})()}parseTextTracks(e,t){var n=this;return a(function*(){for(let r of e){let e=new URL(r.url,t).toString(),i=yield(yield El.fetchPolyfilled(e,{signal:n.abortControllers.destroy.signal})).text();return{textTrack:r,playlist:n.parsePlaylist(i,e)}}})()}parsePlaylist(e,t){let n={mediaSequence:0,programDateTime:``,segments:[],targetDuration:0,vkPlaybackDuration:0,segmentStartTime:0,vkStartTime:``},r=e.split(`
|
|
247
247
|
`),i=0;for(let e=0;e<r.length;++e){let a=r[e];switch(!0){case a.startsWith(`#EXTINF:`):{let o=r[++e],s=new URL(o,t).toString(),c=Number(this.extractPlaylistRowValue(`#EXTINF:`,a))*1e3;if(n.segments.push({time:{from:i,to:i+c},url:s}),i+=c,!n.segmentStartTime){let e=new Date(n.vkStartTime).valueOf();n.segmentStartTime=new Date(n.programDateTime).valueOf()-e}break}case a.startsWith(`#EXT-X-TARGETDURATION:`):n.targetDuration=Number(this.extractPlaylistRowValue(`#EXT-X-TARGETDURATION:`,a));break;case a.startsWith(`#EXT-X-MEDIA-SEQUENCE:`):n.mediaSequence=Number(this.extractPlaylistRowValue(`#EXT-X-MEDIA-SEQUENCE:`,a));break;case a.startsWith(`#EXT-X-VK-PLAYBACK-DURATION:`):n.vkPlaybackDuration=Number(this.extractPlaylistRowValue(`#EXT-X-VK-PLAYBACK-DURATION:`,a));break;case a.startsWith(`#EXT-X-PROGRAM-DATE-TIME:`):{let e=this.extractPlaylistRowValue(`#EXT-X-PROGRAM-DATE-TIME:`,a);n.programDateTime=e;let t=new Date(e);t.setMilliseconds(0),i=t.valueOf();break}case a.startsWith(`#EXT-X-VK-START-TIME:`):n.vkStartTime=this.extractPlaylistRowValue(`#EXT-X-VK-START-TIME:`,a);break}}return n}extractPlaylistRowValue(e,t){switch(e){case`#EXTINF:`:return t.substring(e.length,t.length-1);default:return t.substring(e.length)}}processLiveTime(e){if(Dl.isNonNullable(e)&&this.currentTextTrackData){let{segments:t}=this.currentTextTrackData.playlist,{from:n}=t[0].time,{to:r}=t[t.length-1].time;if(e<n||e>r)return;r-e<this.params.downloadThreshold&&this.fetchNextManifestData();for(let n of t)if(n.time.from<=e&&n.time.to>=e){this.availableTextTracks$.next([o(o({},this.currentTextTrackData.textTrack),{},{url:n.url,isAuto:!0})]);break}}}fetchNextManifestData(){var e=this;return a(function*(){try{if(e.abortControllers.nextManifest)return;e.abortControllers.nextManifest=new Tl.AbortControllerPolyfilled;let{textTracks:t}=yield e.fetchManifestData(),n=yield e.parseTextTracks(t,e.params.sourceUrl);e.currentTextTrackData&&n&&(e.currentTextTrackData.playlist.segments=n.playlist.segments)}catch(t){e.error(`fetchNextManifestData`,t)}finally{e.abortControllers.nextManifest=null}})()}fetchManifestData(){var e=this;return a(function*(){let t=e.prepareUrl??e.params.sourceUrl;return yield e.params.fetchManifestData(t,{signal:e.abortControllers.destroy.signal})})()}error(e,t){this.error$.next({id:`[LiveTextManager][HLS_LIVE_CMAF]`,category:Dl.ErrorCategory.WTF,thrown:t,message:e})}}class kl{constructor(e){i(this,`subscription`,new Y.Subscription),i(this,`volumeSubscription`,new Y.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`allocation`,void 0),i(this,`params`,void 0),i(this,`textTracksManager`,null),i(this,`liveTextManager`,null),i(this,`masterManifest`,void 0),i(this,`manifests$`,new Y.ValueSubject([])),i(this,`maxSeekBackTime$`,void 0),i(this,`liveOffset`,new Vt),i(this,`manifestStartTime$`,new Y.ValueSubject(void 0)),i(this,`syncPlayback`,()=>{if(!this.manifests$.getValue().length)return;let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.videoTrack.getTransition(),i=this.params.desiredState.autoVideoTrackSwitching.getTransition(),a=this.params.desiredState.autoVideoTrackLimits.getTransition();if(t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.allocation.target.removeAttribute(`src`),this.allocation.target.load(),this.params.output.position$.next(0),this.params.output.duration$.next(1/0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}if(this.videoState.getTransition())return;let o=this.params.desiredState.seekState.getState();if(e===`stopped`){this.videoState.startTransitionTo(`ready`),this.prepare();return}if(r||i||a){let e=this.videoState.getState();this.videoState.setState(`changing_manifest`),this.videoState.startTransitionTo(e),this.prepare(),a&&this.params.output.autoVideoTrackLimits$.next(a.to),o.state===`none`&&this.params.desiredState.seekState.setState({state:`requested`,position:-this.liveOffset.getTotalOffset(),forcePrecise:!0});return}if(n?.to!==`paused`&&o.state===`requested`){this.videoState.startTransitionTo(`ready`),this.seek(o.position&&o.position-this.liveOffset.getTotalPausedTime()),this.prepare();return}switch(e){case`ready`:t===`ready`?k(this.params.desiredState.playbackState,`ready`):t===`paused`?(this.videoState.setState(`paused`),this.liveOffset.pause(),k(this.params.desiredState.playbackState,`paused`)):t===`playing`&&(this.videoState.startTransitionTo(`playing`),this.playIfAllowed());return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.liveOffset.pause(),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:if(t===`playing`)if(this.videoState.startTransitionTo(`playing`),this.liveOffset.getTotalPausedTime()<this.params.config.maxPausedTime&&this.liveOffset.getTotalOffset()<this.maxSeekBackTime$.getValue())this.liveOffset.resume(),this.playIfAllowed(),this.params.output.position$.next(-this.liveOffset.getTotalOffset()/1e3);else{let e=this.liveOffset.getTotalOffset();e>=this.maxSeekBackTime$.getValue()&&(e=0,this.liveOffset.resetTo(e)),this.liveOffset.resume(),this.params.output.position$.next(-e/1e3),this.prepare()}else n?.to===`paused`&&(k(this.params.desiredState.playbackState,`paused`),this.liveOffset.pause());return;case`changing_manifest`:break;default:return Y.assertNever(e)}}),this.params=e,this.allocation=Lr(e.allocation,e.tuning),this.params.output.element$.next(this.allocation.video??void 0),this.masterManifest={id:`master`,quality:Y.VideoQuality.INVARIANT,url:this.params.source.url};let t=(e,t)=>wl(e,this.params.source.url,{manifestRetryInterval:this.params.tuning.manifestRetryInterval,manifestRetryMaxInterval:this.params.tuning.manifestRetryMaxInterval,manifestRetryMaxCount:this.params.tuning.manifestRetryMaxCount},t);this.allocation.video&&!e.tuning.disableSubtitles&&(this.params.tuning.useHlsLiveNewTextManager?this.liveTextManager=new Ol(this.params.output.liveTime$,this.allocation.video,t,this.params.source.url,this.params.tuning.hlsLiveNewTextManagerDownloadThreshold):this.textTracksManager=new Bt(e.source.url)),t(this.generateLiveUrl()).then(({qualityManifests:e,textTracks:t})=>{e.length===0&&this.params.output.error$.next({id:`HlsLiveProviderInternal:empty_manifest`,category:Y.ErrorCategory.WTF,message:`HlsLiveProvider: there are no qualities in manifest`}),this.liveTextManager?.processTextTracks(t,this.params.source.url),this.manifests$.next([this.masterManifest,...e])}).catch(e=>{this.params.output.error$.next({id:`ExtractHlsQualities`,category:Y.ErrorCategory.NETWORK,message:`Error fetching manifest and extracting qualities`,thrown:e})}),this.params.output.isLive$.next(!0),this.params.output.canChangePlaybackSpeed$.next(!1),this.params.output.availableVideoTracks$.next([]),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.output.hostname$.next(jn(this.params.source.url)),this.params.output.availableTextTracks$.next([]),this.params.desiredState.internalTextTracks.setState([]),this.maxSeekBackTime$=new Y.ValueSubject(e.source.maxSeekBackTime??1/0),this.subscribe()}selectManifest(){var e;let{autoVideoTrackSwitching:t,videoTrack:n}=this.params.desiredState,r=t.getState(),i=n.getTransition(),a=(i==null||(e=i.to)==null?void 0:e.id)??n.getState()?.id??`master`,o=this.manifests$.getValue();if(!o.length)return;let s=r?`master`:a;return r&&!i&&n.startTransitionTo(this.masterManifest),o.find(e=>e.id===s)}subscribe(){let{output:e,desiredState:t}=this.params,n=t=>{e.error$.next({id:`HlsLiveProvider`,category:Y.ErrorCategory.WTF,message:`HlsLiveProvider internal logic error`,thrown:t})},r=Jt(this.allocation.target);this.subscription.add(()=>r.destroy());let i=(e,t)=>this.subscription.add(e.subscribe(t,n));i(r.ended$,e.endedEvent$),i(r.error$,e.error$),i(r.isBuffering$,e.isBuffering$),i(r.currentBuffer$,e.currentBuffer$),i(r.currentBuffer$,e.currentNativeBuffer$),i(r.loadedMetadata$,e.firstBytesEvent$),i(r.loadedMetadata$,e.loadedMetadataEvent$),i(r.playing$,e.firstFrameEvent$),i(r.canplay$,e.canplay$),i(r.playedTime$,e.playedTime$),i(r.inPiP$,e.inPiP$),i(r.inFullscreen$,e.inFullscreen$),this.subscription.add(t.isLooped.stateChangeStarted$.subscribe(()=>t.isLooped.setState(!1),n)),this.subscription.add(Pt(this.allocation.target,t.volume,r.volumeState$,n,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(e=>{this.volumeSubscription.unsubscribe(),e?this.volumeSubscription.add(t.volume.stateChangeStarted$.subscribe(({to:e})=>this.params.output.volume$.next(e),n)):this.volumeSubscription.add(r.volumeState$.subscribe(this.params.output.volume$,n))})),this.subscription.add(Ft(this.allocation.target,t.playbackRate,r.playbackRateState$,n)),i(hr(this.allocation.target),e.elementVisible$),this.liveTextManager?(i(this.liveTextManager.getCurrentTime$,this.params.output.getCurrentTime$),i(this.liveTextManager.error$,this.params.output.error$)):this.textTracksManager&&this.allocation.video&&this.textTracksManager.connect(this.allocation.video,t,e),this.subscription.add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`),k(t.playbackState,`playing`)},n)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`),k(t.playbackState,`paused`)},n)).add(r.canplay$.subscribe(()=>{this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.videoState.getState()===`playing`&&this.playIfAllowed()},n)),this.liveTextManager&&this.subscription.add(this.liveTextManager.availableTextTracks$.subscribe(e=>{e&&this.params.output.availableTextTracks$.next(e)})),this.subscription.add(this.maxSeekBackTime$.pipe(Y.filterChanged(),Y.map(e=>-e/1e3)).subscribe(this.params.output.duration$,n)),this.subscription.add(r.loadedMetadata$.subscribe(()=>{let e=this.params.desiredState.seekState.getState(),t=this.videoState.getTransition(),n=this.params.desiredState.videoTrack.getTransition(),r=this.params.desiredState.autoVideoTrackSwitching.getTransition();if(n&&Y.isNonNullable(n.to)){let e=n.to.id;this.params.desiredState.videoTrack.setState(n.to);let t=this.manifests$.getValue().find(t=>t.id===e);t&&(this.params.output.currentVideoTrack$.next(t),this.params.output.hostname$.next(jn(t.url)))}r&&this.params.desiredState.autoVideoTrackSwitching.setState(r.to),t&&t.from===`changing_manifest`&&this.videoState.setState(t.to),e&&e.state===`requested`&&this.seek(e.position)},n)),this.subscription.add(r.loadedData$.subscribe(()=>{var e,t;let n=(e=this.allocation.target)==null||(t=e.getStartDate)==null||(t=t.call(e))==null?void 0:t.getTime();this.manifestStartTime$.next(n||void 0)},n)),this.subscription.add(Y.combine({startTime:this.manifestStartTime$.pipe(Y.filter(Y.isNonNullable)),currentTime:r.timeUpdate$}).subscribe(({startTime:e,currentTime:t})=>this.params.output.liveTime$.next(e+t*1e3),n)),this.subscription.add(this.manifests$.pipe(Y.map(e=>e.map(({id:e,quality:t,size:n,bandwidth:r,fps:i})=>({id:e,quality:t,size:n,fps:i,bitrate:r})))).subscribe(this.params.output.availableVideoTracks$,n));let a=Y.merge(t.playbackState.stateChangeStarted$,t.seekState.stateChangeEnded$,t.videoTrack.stateChangeStarted$,t.autoVideoTrackSwitching.stateChangeStarted$,t.autoVideoTrackLimits.stateChangeStarted$,this.videoState.stateChangeEnded$,this.manifests$,Y.observableFrom([`init`])).pipe(Y.debounce(0));this.subscription.add(a.subscribe(this.syncPlayback,n));let o=!1;this.params.tuning.live.catchupLiveForMutedInactiveTab&&this.subscription.add(e.elementVisible$.pipe(Y.filterChanged()).subscribe(t=>{let n=e.position$.getValue(),r=e.volume$.getValue(),i=!r.volume||r.muted;!t&&!n&&i?o=!0:t&&o&&(this.seek(0),o=!1)}))}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.textTracksManager?.destroy(),this.liveTextManager?.destroy(),this.params.output.element$.next(void 0),Dt(this.allocation.target,this.params.tuning)}prepare(){let e=this.selectManifest();if(Y.isNullable(e))return;let t=this.params.desiredState.autoVideoTrackLimits.getTransition(),n=this.params.desiredState.autoVideoTrackLimits.getState(),r=new URL(e.url);if((t||n)&&e.id===this.masterManifest.id){let{max:e,min:i}=t?.to??n??{};for(let[t,n]of[[e,`mq`],[i,`lq`]]){let e=String(parseFloat(t||``));n&&t&&r.searchParams.set(n,e)}}let i=this.params.format===`HLS_LIVE_CMAF`?2:0,a=ue(r.toString(),this.liveOffset.getTotalOffset(),i);this.liveTextManager?.prepare(a),this.allocation.target.setAttribute(`src`,a),this.allocation.target.load(),hl(a).then(e=>{if(!Y.isNullable(e))this.maxSeekBackTime$.next(e);else{let e=this.params.source.maxSeekBackTime??this.maxSeekBackTime$.getValue();(Y.isNullable(e)||!isFinite(e))&&fl.fetchPolyfilled(a).then(e=>e.text()).then(e=>{let t=/#EXT-X-STREAM-INF[^\n]+\n(.+)/m.exec(e)?.[1];t&&hl(new URL(t,a).toString()).then(e=>{Y.isNullable(e)||this.maxSeekBackTime$.next(e)})}).catch(()=>{})}})}playIfAllowed(){Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}).then(e=>{e||(this.videoState.setState(`paused`),this.liveOffset.pause(),k(this.params.desiredState.playbackState,`paused`,!0))},e=>this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:Y.ErrorCategory.DOM,thrown:e}))}seek(e){this.params.output.willSeekEvent$.next();let t=-e,n=t<this.maxSeekBackTime$.getValue()?t:0;this.liveOffset.resetTo(n),this.params.output.position$.next(-n/1e3),this.params.output.seekedEvent$.next()}generateLiveUrl(){let e=ue(this.params.source.url);if(this.params.tuning.useHlsLiveNewTextManager){let t=new URL(e);t.searchParams.set(`enable-subtitles`,`yes`),e=t.toString()}return e}}var X=require(`@vkontakte/videoplayer-shared`);class Al{constructor(e){i(this,`subscription`,new X.Subscription),i(this,`volumeSubscription`,new X.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`allocation`,void 0),i(this,`params`,void 0),i(this,`textTracksManager`,null),i(this,`masterManifest`,void 0),i(this,`manifests$`,new X.ValueSubject([])),i(this,`unmuteAfterBrowserResetsHappened`,new X.ValueSubject(!1)),i(this,`syncPlayback`,()=>{if(!this.manifests$.getValue().length)return;let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition(),r=this.params.desiredState.videoTrack.getTransition(),i=this.params.desiredState.autoVideoTrackSwitching.getTransition(),a=this.params.desiredState.autoVideoTrackLimits.getTransition();if(t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.allocation.target.removeAttribute(`src`),this.allocation.target.load(),this.params.output.position$.next(0),this.params.output.duration$.next(1/0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}if(this.videoState.getTransition())return;let o=this.params.desiredState.seekState.getState();if(e===`stopped`){this.videoState.startTransitionTo(`ready`),this.prepare();return}if(r||i||a){let e=this.videoState.getState();this.videoState.setState(`changing_manifest`),this.videoState.startTransitionTo(e);let{currentTime:t}=this.allocation.target;this.prepare(),a&&this.params.output.autoVideoTrackLimits$.next(a.to),o.state===`none`&&this.params.desiredState.seekState.setState({state:`requested`,position:t*1e3,forcePrecise:!0});return}switch(n?.to!==`paused`&&o.state===`requested`&&this.seek(o.position),e){case`ready`:t===`ready`?k(this.params.desiredState.playbackState,`ready`):t===`paused`?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):t===`playing`&&(this.videoState.startTransitionTo(`playing`),this.playIfAllowed());return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`paused`&&k(this.params.desiredState.playbackState,`paused`);return;case`changing_manifest`:break;default:return X.assertNever(e)}}),e.tuning.disableSubtitles||(this.textTracksManager=new Bt(e.source.url)),this.params=e,this.allocation=Lr(e.allocation,e.tuning),this.params.output.element$.next(this.allocation.video??void 0),this.masterManifest={id:`master`,quality:X.VideoQuality.INVARIANT,url:this.params.source.url},this.params.output.isLive$.next(!1),this.params.output.availableVideoTracks$.next([]),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.output.hostname$.next(jn(this.params.source.url)),this.params.output.autoVideoTrackLimitingAvailable$.next(!0),this.params.output.manifestRequested$.next(),wl(ue(this.params.source.url),this.params.source.url,{manifestRetryInterval:this.params.tuning.manifestRetryInterval,manifestRetryMaxInterval:this.params.tuning.manifestRetryMaxInterval,manifestRetryMaxCount:this.params.tuning.manifestRetryMaxCount}).then(({qualityManifests:e,textTracks:t})=>{this.params.isOnDemand&&this.params.tuning.hls.filterOnDemandQualityList&&(e=e.sort((e,t)=>{let n=e.size?e.size.height:0;return(t.size?t.size.height:0)-n}).filter((e,t)=>t%2==0)),this.params.output.firstBytesManifest$.next(),this.manifests$.next([this.masterManifest,...e]),this.params.output.manifestReceived$.next(),this.params.tuning.useNativeHLSTextTracks||this.params.desiredState.internalTextTracks.startTransitionTo(t)},e=>this.params.output.error$.next({id:`ExtractHlsQualities`,category:X.ErrorCategory.NETWORK,message:`Error fetching manifest and extracting qualities`,thrown:e})),this.subscribe()}selectManifest(){var e;let{autoVideoTrackSwitching:t,videoTrack:n}=this.params.desiredState,r=t.getState(),i=n.getTransition(),a=(i==null||(e=i.to)==null?void 0:e.id)??n.getState()?.id??`master`,o=this.manifests$.getValue();if(!o.length)return;let s=r?`master`:a;return r&&(!i||!i.from)&&n.startTransitionTo(this.masterManifest),o.find(e=>e.id===s)}subscribe(){let{output:e,desiredState:t}=this.params,n=t=>{e.error$.next({id:`HlsProvider`,category:X.ErrorCategory.WTF,message:`HlsProvider internal logic error`,thrown:t})},r=Jt(this.allocation.target);this.subscription.add(()=>r.destroy());let i=(e,t)=>this.subscription.add(e.subscribe(t));if(i(r.timeUpdate$,e.position$),i(r.durationChange$,e.duration$),i(r.ended$,e.endedEvent$),i(r.looped$,e.loopedEvent$),i(r.error$,e.error$),i(r.isBuffering$,e.isBuffering$),i(r.currentBuffer$,e.currentBuffer$),i(r.currentBuffer$,e.currentNativeBuffer$),i(r.loadedMetadata$,e.firstBytesEvent$),i(r.loadedMetadata$,e.loadedMetadataEvent$),i(r.playing$,e.firstFrameEvent$),i(r.canplay$,e.canplay$),i(r.seeked$,e.seekedEvent$),i(r.playedTime$,e.playedTime$),i(r.inPiP$,e.inPiP$),i(r.inFullscreen$,e.inFullscreen$),i(this.videoState.stateChangeEnded$.pipe(X.map(e=>e.to)),this.params.output.playbackState$),this.subscription.add(Nt(this.allocation.target,t.isLooped,n)),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(e=>{this.volumeSubscription.unsubscribe(),e?this.volumeSubscription.add(t.volume.stateChangeStarted$.subscribe(({to:e})=>this.params.output.volume$.next(e),n)):this.volumeSubscription.add(r.volumeState$.subscribe(this.params.output.volume$,n))})),this.subscription.add(Ft(this.allocation.target,t.playbackRate,r.playbackRateState$,n)),hi({subscription:this.subscription,desiredState:t,videoElement$:this.params.output.element$,observableVideo:r}),this.subscription.add(Pt(this.allocation.target,t.volume,r.volumeState$,n,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.allocation.video&&this.textTracksManager?.connect(this.allocation.video,t,e),this.subscription.add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`),k(t.playbackState,`playing`)},n)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`),k(t.playbackState,`paused`)},n)).add(r.canplay$.subscribe(()=>{this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`),this.videoState.getState()===`playing`&&this.playIfAllowed()},n).add(r.loadedMetadata$.subscribe(()=>{let e=this.params.desiredState.seekState.getState(),t=this.videoState.getTransition(),n=this.params.desiredState.videoTrack.getTransition(),r=this.params.desiredState.autoVideoTrackSwitching.getTransition();if(n&&X.isNonNullable(n.to)){let e=n.to.id;this.params.desiredState.videoTrack.setState(n.to);let t=this.manifests$.getValue().find(t=>t.id===e);t&&(this.params.output.currentVideoTrack$.next(t),this.params.output.hostname$.next(jn(t.url)))}let i=this.params.desiredState.playbackRate.getState();if(i!==this.params.output.element$.getValue()?.playbackRate){let e=this.params.output.element$.getValue();e&&(this.params.desiredState.playbackRate.setState(i),e.playbackRate=i)}r&&this.params.desiredState.autoVideoTrackSwitching.setState(r.to),t&&t.from===`changing_manifest`&&this.videoState.setState(t.to),e.state===`requested`&&this.seek(e.position)},n))),this.params.tuning.changePlaybackStateToPausedWhenEnded&&this.subscription.add(r.ended$.subscribe(()=>{this.videoState.setState(`paused`),k(t.playbackState,`paused`)})),this.subscription.add(this.manifests$.pipe(X.map(e=>e.map(({id:e,quality:t,size:n,bandwidth:r,fps:i})=>({id:e,quality:t,size:n,fps:i,bitrate:r})))).subscribe(this.params.output.availableVideoTracks$,n)),this.allocation.video&&(!j.device.isIOS||!this.params.tuning.useNativeHLSTextTracks)){let{textTracks:e}=this.allocation.video;this.subscription.add(X.merge(X.fromEvent(e,`addtrack`),X.fromEvent(e,`removetrack`),X.fromEvent(e,`change`),X.observableFrom([`init`])).subscribe(()=>{for(let t=0;t<e.length;t++)e[t].mode=`hidden`},n))}let a=X.merge(t.playbackState.stateChangeStarted$,t.seekState.stateChangeEnded$,t.videoTrack.stateChangeStarted$,t.autoVideoTrackSwitching.stateChangeStarted$,t.autoVideoTrackLimits.stateChangeStarted$,this.videoState.stateChangeEnded$,this.manifests$,X.observableFrom([`init`])).pipe(X.debounce(0));this.subscription.add(a.subscribe(this.syncPlayback,n))}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.textTracksManager?.destroy(),this.params.output.element$.next(void 0),Dt(this.allocation.target,this.params.tuning)}prepare(){let e=this.selectManifest();if(X.isNullable(e))return;let t=this.params.desiredState.autoVideoTrackLimits.getTransition(),n=this.params.desiredState.autoVideoTrackLimits.getState(),r=new URL(e.url);if((t||n)&&e.id===this.masterManifest.id){let{max:e,min:i}=t?.to??n??{};for(let[t,n]of[[e,`mq`],[i,`lq`]]){let e=String(parseFloat(t||``));n&&t&&r.searchParams.set(n,e)}}this.allocation.target.setAttribute(`src`,r.toString()),this.allocation.target.load()}playIfAllowed(){let e=Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}),t=e=>{e||(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`,!0))},n=e=>{this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:X.ErrorCategory.DOM,thrown:e})};this.params.tuning.ignoreForcePlayResultWhenProviderChanged?this.subscription.add(X.observableFrom(e).subscribe(t,n)):e.then(t,n)}seek(e){this.params.output.willSeekEvent$.next(),this.allocation.target.currentTime=e/1e3}}var jl=require(`@vkontakte/videoplayer-shared`),Ml=require(`@vkontakte/videoplayer-shared`),Nl=require(`@vkontakte/videoplayer-shared`),Pl=require(`@vkontakte/videoplayer-shared`);class Fl{constructor(e){i(this,`subscription`,new Pl.Subscription),i(this,`volumeSubscription`,new Pl.Subscription),i(this,`videoState`,new st(`stopped`)),i(this,`allocation`,void 0),i(this,`trackUrls`,{}),i(this,`params`,void 0),i(this,`textTracksManager`,null),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition();if(t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.allocation.target.removeAttribute(`src`),this.allocation.target.load(),this.params.output.position$.next(0),this.params.output.duration$.next(1/0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}if(this.videoState.getTransition())return;let r=this.params.desiredState.autoVideoTrackLimits.getTransition(),i=this.params.desiredState.videoTrack.getTransition(),a=this.params.desiredState.seekState.getState();if(r&&e!==`ready`&&!i){this.handleQualityLimitTransition(r.to);return}if(e===`stopped`){this.videoState.startTransitionTo(`ready`),this.prepare();return}if(i){let{currentTime:e}=this.allocation.target;this.prepare(),a.state===`none`&&this.params.desiredState.seekState.setState({state:`requested`,position:e*1e3,forcePrecise:!0});return}switch(n?.to!==`paused`&&a.state===`requested`&&this.seek(a.position),e){case`ready`:t===`ready`?k(this.params.desiredState.playbackState,`ready`):t===`paused`?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):t===`playing`&&(this.videoState.startTransitionTo(`playing`),this.playIfAllowed());return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`paused`&&k(this.params.desiredState.playbackState,`paused`);return;default:return Pl.assertNever(e)}}),e.tuning.disableSubtitles||(this.textTracksManager=new Bt),this.params=e,this.allocation=Lr(e.allocation,e.tuning),this.params.output.element$.next(this.allocation.video??void 0),jl.objectEntries(this.params.source).reverse().forEach(([e,t],n)=>{let r=n.toString(10);this.trackUrls[r]={track:{quality:e,id:r},url:t}}),this.params.output.isLive$.next(!1),this.params.output.availableVideoTracks$.next(Ml.objectValues(this.trackUrls).map(({track:e})=>e)),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.desiredState.autoVideoTrackSwitching.setState(!1),this.params.output.autoVideoTrackLimitingAvailable$.next(!0),this.subscribe()}subscribe(){let{output:e,desiredState:t}=this.params,n=t=>{e.error$.next({id:`MpegProvider`,category:Pl.ErrorCategory.WTF,message:`MpegProvider internal logic error`,thrown:t})},r=Jt(this.allocation.target);this.subscription.add(()=>r.destroy());let i=(e,t)=>this.subscription.add(e.subscribe(t,n));i(r.timeUpdate$,e.position$),i(r.durationChange$,e.duration$),i(r.ended$,e.endedEvent$),i(r.looped$,e.loopedEvent$),i(r.error$,e.error$),i(r.isBuffering$,e.isBuffering$),i(r.currentBuffer$,e.currentNativeBuffer$),i(r.currentBuffer$,e.currentBuffer$),i(r.loadedMetadata$,e.firstBytesEvent$),i(r.loadedMetadata$,e.loadedMetadataEvent$),i(r.playing$,e.firstFrameEvent$),i(r.canplay$,e.canplay$),i(r.seeked$,e.seekedEvent$),i(r.playedTime$,e.playedTime$),i(r.inPiP$,e.inPiP$),i(r.inFullscreen$,e.inFullscreen$),i(this.videoState.stateChangeEnded$.pipe(Pl.map(e=>e.to)),this.params.output.playbackState$),this.subscription.add(Nt(this.allocation.target,t.isLooped,n)),hi({subscription:this.subscription,desiredState:t,videoElement$:this.params.output.element$,observableVideo:r}),this.subscription.add(Pt(this.allocation.target,t.volume,r.volumeState$,n,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(e=>{this.volumeSubscription.unsubscribe(),e?this.volumeSubscription.add(t.volume.stateChangeStarted$.subscribe(({to:e})=>this.params.output.volume$.next(e),n)):this.volumeSubscription.add(r.volumeState$.subscribe(this.params.output.volume$,n))})),this.subscription.add(Ft(this.allocation.target,t.playbackRate,r.playbackRateState$,n)),i(hr(this.allocation.target),e.elementVisible$),this.subscription.add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`),k(t.playbackState,`playing`)},n)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`),k(t.playbackState,`paused`)},n)).add(r.canplay$.subscribe(()=>{this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`);let e=this.params.desiredState.videoTrack.getTransition();if(e&&Pl.isNonNullable(e.to)){this.params.desiredState.videoTrack.setState(e.to),this.params.output.currentVideoTrack$.next(this.trackUrls[e.to.id].track);let t=this.params.desiredState.playbackRate.getState();if(t!==this.params.output.element$.getValue()?.playbackRate){let e=this.params.output.element$.getValue();e&&(this.params.desiredState.playbackRate.setState(t),e.playbackRate=t)}}this.videoState.getState()===`playing`&&!this.allocation.target.ended&&this.playIfAllowed()},n)),this.params.tuning.changePlaybackStateToPausedWhenEnded&&this.subscription.add(r.ended$.subscribe(()=>{this.videoState.setState(`paused`),k(t.playbackState,`paused`)})),this.allocation.video&&this.textTracksManager?.connect(this.allocation.video,t,e);let a=Pl.merge(t.playbackState.stateChangeStarted$,t.videoTrack.stateChangeStarted$,t.seekState.stateChangeEnded$,t.autoVideoTrackLimits.stateChangeStarted$,this.videoState.stateChangeEnded$,Pl.observableFrom([`init`])).pipe(Pl.debounce(0));this.subscription.add(a.subscribe(this.syncPlayback,n))}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.textTracksManager?.destroy(),this.trackUrls={},this.params.output.element$.next(void 0),Dt(this.allocation.target,this.params.tuning)}prepare(){let e=this.params.desiredState.videoTrack.getState()?.id;Pl.assertNonNullable(e,`MpegProvider: track is not selected`);let{url:t}=this.trackUrls[e];Pl.assertNonNullable(t,`MpegProvider: No url for ${e}`),this.params.tuning.requestQuick&&(t=La(t)),this.allocation.target.setAttribute(`src`,t),this.allocation.target.load(),this.params.output.hostname$.next(jn(t))}playIfAllowed(){let e=Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}),t=e=>{e||(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`,!0))},n=e=>{this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:Pl.ErrorCategory.DOM,thrown:e})};this.params.tuning.ignoreForcePlayResultWhenProviderChanged?this.subscription.add(Pl.observableFrom(e).subscribe(t,n)):e.then(t,n)}seek(e){this.params.output.willSeekEvent$.next(),this.allocation.target.currentTime=e/1e3}handleQualityLimitTransition(e){this.params.output.autoVideoTrackLimits$.next(e);let t=e=>{this.params.output.currentVideoTrack$.next(e),this.params.desiredState.videoTrack.startTransitionTo(e)},n=e=>{t(Dn(a,{container:this.allocation.video?.getBoundingClientRect(),panelSize:this.params.panelSize,estimatedThroughput:this.params.dependencies.throughputEstimator.throughput$.getValue(),tuning:this.params.tuning.autoTrackSelection,forwardBufferHealth:0,limits:e,abrLogger:this.params.dependencies.abrLogger}))},r=this.params.output.currentVideoTrack$.getValue()?.quality,i=!!(e.max||e.min),a=Ml.objectValues(this.trackUrls).map(e=>e.track);if(!r||!i||un(e,a[0].quality,Nl.arrayAt(a,-1)?.quality)){n();return}let o=e.max?Pl.isLowerOrEqual(r,e.max):!0,s=e.min?Pl.isHigherOrEqual(r,e.min):!0;o&&s||n(e)}}var Il=require(`@vkontakte/videoplayer-shared`),Ll=require(`@vkontakte/videoplayer-shared`),Rl=[`stun:videostun.mycdn.me:80`],zl=1e3,Bl=3,Vl=()=>null;class Hl{constructor(e,t){i(this,`options`,void 0),i(this,`ws`,null),i(this,`peerConnection`,null),i(this,`serverUrl`,``),i(this,`streamKey`,``),i(this,`stream`,null),i(this,`signalingType`,`JOIN`),i(this,`retryTimeout`,void 0),i(this,`retryCount`,0),i(this,`externalStartCallback`,Vl),i(this,`externalStopCallback`,Vl),i(this,`externalErrorCallback`,Vl),this.options=this.normalizeOptions(t);let n=e.split(`/`);this.serverUrl=n.slice(0,n.length-1).join(`/`),this.streamKey=n[n.length-1]}onStart(e){try{this.externalStartCallback=e}catch(e){this.handleSystemError(e)}}onStop(e){try{this.externalStopCallback=e}catch(e){this.handleSystemError(e)}}onError(e){try{this.externalErrorCallback=e}catch(e){this.handleSystemError(e)}}connect(){this.connectWS()}disconnect(){try{this.externalStopCallback(),this.closeConnections()}catch(e){this.handleSystemError(e)}}connectWS(){this.ws||(this.ws=new WebSocket(this.serverUrl),this.ws.onopen=this.onSocketOpen.bind(this),this.ws.onmessage=this.onSocketMessage.bind(this),this.ws.onclose=this.onSocketClose.bind(this),this.ws.onerror=this.onSocketError.bind(this))}onSocketOpen(){this.handleLogin()}onSocketClose(e){try{if(!this.ws)return;this.ws=null,e.code>1e3?(this.retryCount++,this.retryCount>this.options.maxRetryNumber?this.handleNetworkError():this.scheduleRetry()):this.externalStopCallback()}catch(e){this.handleRTCError(e)}}onSocketError(e){try{this.externalErrorCallback(Error(e.toString()))}catch(e){this.handleRTCError(e)}}onSocketMessage(e){try{let t=this.parseMessage(e.data);switch(t.type){case`JOIN`:case`CALL_JOIN`:this.handleJoinMessage(t);break;case`UPDATE`:this.handleUpdateMessage(t);break;case`STATUS`:this.handleStatusMessage(t);break}}catch(e){this.handleRTCError(e)}}handleJoinMessage(e){switch(e.inviteType){case`ANSWER`:this.handleAnswer(e.sdp);break;case`CANDIDATE`:this.handleCandidate(e.candidate);break}}handleStatusMessage(e){switch(e.status){case`UNPUBLISHED`:this.handleUnpublished();break}}handleUpdateMessage(e){var t=this;return a(function*(){try{let n=yield t.createOffer();t.peerConnection&&(yield t.peerConnection.setLocalDescription(n)),t.handleAnswer(e.sdp)}catch(e){t.handleRTCError(e)}})()}handleLogin(){var e=this;return a(function*(){try{let t={iceServers:[{urls:Rl}]};e.peerConnection=new RTCPeerConnection(t),e.peerConnection.ontrack=e.onPeerConnectionStream.bind(e),e.peerConnection.onicecandidate=e.onPeerConnectionIceCandidate.bind(e),e.peerConnection.oniceconnectionstatechange=e.onPeerConnectionIceConnectionStateChange.bind(e);let n=yield e.createOffer();yield e.peerConnection.setLocalDescription(n),e.send({type:e.signalingType,inviteType:`OFFER`,streamKey:e.streamKey,sdp:n.sdp,callSupport:!1})}catch(t){e.handleRTCError(t)}})()}handleAnswer(e){var t=this;return a(function*(){try{t.peerConnection&&(yield t.peerConnection.setRemoteDescription(new RTCSessionDescription({type:`answer`,sdp:e})))}catch(e){t.handleRTCError(e)}})()}handleCandidate(e){var t=this;return a(function*(){if(e)try{t.peerConnection&&(yield t.peerConnection.addIceCandidate(e))}catch(e){t.handleRTCError(e)}})()}handleUnpublished(){try{this.closeConnections(),this.externalStopCallback()}catch(e){this.handleRTCError(e)}}handleSystemError(e){this.options.errorChanel&&this.options.errorChanel.next({id:`webrtc-provider-error`,category:Ll.ErrorCategory.WTF,message:e.message})}onPeerConnectionStream(e){var t=this;return a(function*(){let n=e.streams[0];t.stream&&t.stream.id===n.id||(t.stream=n,t.externalStartCallback(t.stream))})()}onPeerConnectionIceCandidate(e){e.candidate&&this.send({type:this.signalingType,inviteType:`CANDIDATE`,candidate:e.candidate})}onPeerConnectionIceConnectionStateChange(){if(this.peerConnection){let e=this.peerConnection.iceConnectionState;[`failed`,`closed`].indexOf(e)>-1&&(this.retryCount++,this.retryCount>this.options.maxRetryNumber?this.handleNetworkError():(this.closeConnections(),this.scheduleRetry()))}}createOffer(){var e=this;return a(function*(){let t={offerToReceiveAudio:!0,offerToReceiveVideo:!0,voiceActivityDetection:!1};if(!e.peerConnection)throw Error(`Can not create offer - no peer connection instance `);let n=yield e.peerConnection.createOffer(t),r=n.sdp||``;if(!/^a=rtpmap:\d+ H264\/\d+$/m.test(r))throw Error(`No h264 codec support error`);return n})()}handleRTCError(e){try{this.externalErrorCallback(e||Error(`RTC connection error`))}catch(e){this.handleSystemError(e)}}handleNetworkError(){try{this.externalErrorCallback(Error(`Network error`))}catch(e){this.handleSystemError(e)}}send(e){this.ws&&this.ws.send(JSON.stringify(e))}parseMessage(e){try{return JSON.parse(e)}catch{throw Error(`Can not parse socket message`)}}closeConnections(){let e=this.ws;e&&(this.ws=null,e.close(1e3)),this.removePeerConnection()}removePeerConnection(){let e=this.peerConnection;e&&=(this.peerConnection=null,e.close(),e.ontrack=null,e.onicecandidate=null,e.oniceconnectionstatechange=null,null)}scheduleRetry(){this.retryTimeout=setTimeout(this.connectWS.bind(this),zl)}normalizeOptions(e={}){let t={stunServerList:Rl,maxRetryNumber:Bl,errorChanel:null};return e.stunServerList&&(t.stunServerList=e.stunServerList),e.maxRetryNumber&&e.maxRetryNumber>0&&(t.maxRetryNumber=e.maxRetryNumber),t}}class Ul{constructor(e){i(this,`subscription`,void 0),i(this,`volumeSubscription`,void 0),i(this,`params`,void 0),i(this,`log`,void 0),i(this,`allocation`,void 0),i(this,`videoState`,new st(`stopped`)),i(this,`liveStreamClient`,void 0),i(this,`maxSeekBackTime$`,new Il.ValueSubject(0)),i(this,`syncPlayback`,()=>{let e=this.videoState.getState(),t=this.params.desiredState.playbackState.getState(),n=this.params.desiredState.playbackState.getTransition();if(t===`stopped`){e!==`stopped`&&(this.videoState.startTransitionTo(`stopped`),this.allocation.target.pause(),this.allocation.target.srcObject=null,this.params.output.position$.next(0),this.params.output.duration$.next(0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.videoState.setState(`stopped`),k(this.params.desiredState.playbackState,`stopped`,!0));return}if(this.videoState.getTransition())return;let r=this.params.desiredState.videoTrack.getTransition();if(e===`stopped`){this.videoState.startTransitionTo(`ready`),this.prepare();return}if(r){this.prepare();return}switch(e){case`ready`:t===`paused`?(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`)):t===`playing`&&(this.videoState.startTransitionTo(`playing`),this.playIfAllowed());return;case`playing`:t===`paused`?(this.videoState.startTransitionTo(`paused`),this.allocation.target.paused?this.videoState.setState(`paused`):this.allocation.target.pause()):n?.to===`playing`&&k(this.params.desiredState.playbackState,`playing`);return;case`paused`:t===`playing`?(this.videoState.startTransitionTo(`playing`),this.playIfAllowed()):n?.to===`paused`&&k(this.params.desiredState.playbackState,`paused`);return;default:return Il.assertNever(e)}}),this.subscription=new Il.Subscription,this.volumeSubscription=new Il.Subscription,this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`WebRTCLiveProvider`),this.allocation=Lr(e.allocation,e.tuning),this.liveStreamClient=new Hl(this.params.source.url,{maxRetryNumber:this.params.tuning.webrtc.connectionRetryMaxNumber,errorChanel:this.params.output.error$}),this.liveStreamClient.onStart(this.onLiveStreamStart.bind(this)),this.liveStreamClient.onStop(this.onLiveStreamStop.bind(this)),this.liveStreamClient.onError(this.onLiveStreamError.bind(this)),this.params.output.availableTextTracks$.next([]),this.params.desiredState.internalTextTracks.setState([]),this.subscribe()}destroy(){this.subscription.unsubscribe(),this.volumeSubscription.unsubscribe(),this.liveStreamClient.disconnect(),this.params.output.element$.next(void 0),Dt(this.allocation.target,this.params.tuning)}subscribe(){let{output:e,desiredState:t}=this.params,n=t=>{e.error$.next({id:`WebRTCLiveProvider`,category:Il.ErrorCategory.WTF,message:`WebRTCLiveProvider internal logic error`,thrown:t})};this.subscription.add(Il.merge(this.videoState.stateChangeStarted$.pipe(Il.map(e=>({transition:e,type:`start`}))),this.videoState.stateChangeEnded$.pipe(Il.map(e=>({transition:e,type:`end`})))).subscribe(({transition:e,type:t})=>{this.log({message:`[videoState change] ${t}: ${JSON.stringify(e)}`})}));let r=Jt(this.allocation.target);this.subscription.add(()=>r.destroy());let i=(e,t)=>this.subscription.add(e.subscribe(t,n));i(r.timeUpdate$,e.liveTime$),i(r.ended$,e.endedEvent$),i(r.looped$,e.loopedEvent$),i(r.playedTime$,e.playedTime$),i(r.error$,e.error$),i(r.isBuffering$,e.isBuffering$),i(r.currentBuffer$,e.currentBuffer$),i(r.currentBuffer$,e.currentNativeBuffer$),i(hr(this.allocation.target),this.params.output.elementVisible$),this.subscription.add(r.durationChange$.subscribe(t=>{e.duration$.next(t===1/0?0:t)})).add(r.canplay$.subscribe(()=>{this.videoState.getTransition()?.to===`ready`&&this.videoState.setState(`ready`)},n)).add(r.pause$.subscribe(()=>{this.videoState.setState(`paused`)},n)).add(r.playing$.subscribe(()=>{this.videoState.setState(`playing`)},n)).add(r.error$.subscribe(e.error$)).add(this.maxSeekBackTime$.subscribe(this.params.output.duration$)).add(Pt(this.allocation.target,t.volume,r.volumeState$,n,{skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})),this.subscription.add(this.params.skipVideoElVolumeSync$.subscribe(i=>{this.volumeSubscription.unsubscribe(),i?this.volumeSubscription.add(t.volume.stateChangeStarted$.subscribe(({to:t})=>e.volume$.next(t),n)):this.volumeSubscription.add(r.volumeState$.subscribe(e.volume$,n))})),this.subscription.add(this.videoState.stateChangeEnded$.subscribe(n=>{switch(n.to){case`stopped`:e.position$.next(0),e.duration$.next(0),t.playbackState.setState(`stopped`);break;case`ready`:break;case`paused`:t.playbackState.setState(`paused`);break;case`playing`:t.playbackState.setState(`playing`);break;default:return Il.assertNever(n.to)}},n)).add(Il.merge(t.playbackState.stateChangeStarted$,this.videoState.stateChangeEnded$,Il.observableFrom([`init`])).pipe(Il.debounce(0)).subscribe(this.syncPlayback.bind(this),n)),this.subscription.add(t.isLooped.stateChangeStarted$.subscribe(()=>t.isLooped.setState(!1),n)),this.subscription.add(t.autoVideoTrackSwitching.stateChangeStarted$.subscribe(()=>t.autoVideoTrackSwitching.setState(!1),n))}onLiveStreamStart(e){this.params.output.element$.next(this.allocation.video??void 0),this.params.output.duration$.next(0),this.params.output.position$.next(0),this.params.output.isLive$.next(!0),this.params.output.canChangePlaybackSpeed$.next(!1),this.params.output.hostname$.next(jn(this.params.source.url)),this.params.output.autoVideoTrackLimitingAvailable$.next(!1),this.params.output.availableVideoTracks$.next([]),this.params.output.availableAudioTracks$.next([]),this.params.output.isAudioAvailable$.next(!0),this.params.output.currentVideoTrack$.next({id:`webrtc`,quality:Il.VideoQuality.INVARIANT}),this.allocation.target.srcObject=e,k(this.params.desiredState.playbackState,`playing`)}onLiveStreamStop(){this.videoState.startTransitionTo(`stopped`),this.syncPlayback(),this.params.output.position$.next(0),this.params.output.duration$.next(0),this.params.output.currentBuffer$.next(void 0),this.params.output.currentNativeBuffer$.next(void 0),this.params.output.hostname$.next(void 0),this.params.output.endedEvent$.next()}onLiveStreamError(e){this.onLiveStreamStop(),this.params.output.error$.next({id:`WebRTC stream runtime error`,category:Il.ErrorCategory.EXTERNAL_API,message:e.message,thrown:e})}playIfAllowed(){Pn(this.allocation.target,()=>{this.params.output.soundProhibitedEvent$.next()}).then(e=>{e||(this.videoState.setState(`paused`),k(this.params.desiredState.playbackState,`paused`,!0))},e=>this.params.output.error$.next({id:`ForcePlay`,message:`play() failed even with workarounds`,category:Il.ErrorCategory.DOM,thrown:e}))}prepare(){this.liveStreamClient.connect()}}class Wl{constructor(e){i(this,`length`,void 0),i(this,`array`,void 0),i(this,`index`,void 0),i(this,`iterator`,void 0),i(this,`current`,void 0),this.array=e,this.length=e.length,this.iterator=e[Symbol.iterator](),this.next()}next(){this.current=this.iterator.next(),this.index=this.index===void 0?0:this.index+1}getValue(){if(this.current.done)throw Error(`Iterable is completed`);return this.current.value}isCompleted(){return!!this.current.done}isLast(){return this.index===this.length-1}all(){return this.array}}var Z=require(`@vkontakte/videoplayer-shared`),Gl=require(`@vkontakte/videoplayer-shared`),Kl=e=>new Gl.Observable(t=>{let n=new Gl.Subscription,r=e.desiredPlaybackState$.stateChangeStarted$.pipe(Gl.map(({from:e,to:t})=>`${e}-${t}`)),i=e.desiredPlaybackState$.stateChangeEnded$,a=e.providerChanged$.pipe(Gl.map(({type:e})=>e!==void 0)),o=Gl.combine({providerChanged:e.providerChanged$.pipe(Gl.map(({type:e})=>e!==void 0)),videoLastDataObtainedTimestamp:e.videoLastDataObtainedTimestamp$.pipe(Gl.map(e=>e??0)),stateChangeStarted:e.desiredPlaybackState$.stateChangeStarted$}).pipe(Gl.map(({providerChanged:t,videoLastDataObtainedTimestamp:n,stateChangeStarted:r})=>{let i=Gl.now()-n;return t||r?.to!==`playing`||i<e.playbackHangupNoDataThreshold})),s=e.useDelayedPlaybackHangupWithData?o:a,c=new Gl.Subject,l=0,u=`unknown`;return n.add(r.subscribe(t=>{l&&window.clearTimeout(l),u=t,l=window.setTimeout(()=>c.next(t),e.maxTransitionInterval),z({m:`hangup.set`,l:t,id:l})})),n.add(i.subscribe(()=>{z({m:`hangup.cl`,id:l}),window.clearTimeout(l),u=`unknown`,l=0})),n.add(s.subscribe(t=>{l&&(z({m:`hangup.rs.0`,id:l}),window.clearTimeout(l),l=0,t&&(l=window.setTimeout(()=>c.next(u),e.maxTransitionInterval),z({m:`hangup.rs.1`,id:l})))})),n.add(c.subscribe(t)),()=>{window.clearTimeout(l),n.unsubscribe()}}),ql=require(`@vkontakte/videoplayer-shared`),Jl=require(`@vkontakte/videoplayer-shared`),Yl=require(`@vkontakte/videoplayer-shared`);function Xl(){let e=Yl.getWindow();return new(e.AudioContext||e.webkitAudioContext)}class Zl{constructor(e,t,n,r){i(this,`providerOutput`,void 0),i(this,`provider$`,void 0),i(this,`volumeMultiplierError$`,void 0),i(this,`volumeMultiplier`,void 0),i(this,`destroyController`,new ql.AbortControllerPolyfilled),i(this,`subscriptions`,new Jl.Subscription),i(this,`audioContext`,null),i(this,`gainNode`,null),i(this,`mediaElementSource`,null),this.providerOutput=e,this.provider$=t,this.volumeMultiplierError$=n,this.volumeMultiplier=r,this.subscriptions.add(this.provider$.pipe(Jl.filter(e=>!!e.type),Jl.once()).subscribe(({type:e})=>this.subscribe(e)))}subscribe(e){j.browser.isSafari&&e!==`MPEG`||this.subscriptions.add(Jl.combine({video:this.providerOutput.element$,playbackState:this.providerOutput.playbackState$,volume:this.providerOutput.volume$}).pipe(Jl.filter(({playbackState:e,video:t,volume:{muted:n,volume:r}})=>e===`playing`&&!!t&&!n&&!!r),Jl.once()).subscribe(({video:e})=>{this.initAudioContextOnce(e).then(e=>{e||this.destroy()}).catch(e=>{this.handleError(e),this.destroy()})}))}static isSupported(){return`AudioContext`in window&&`GainNode`in window&&`MediaElementAudioSourceNode`in window}initAudioContextOnce(e){var t=this;return a(function*(){let{volumeMultiplier:n}=t,r=Xl();t.audioContext=r;let i=r.createGain();if(t.gainNode=i,i.gain.value=n,i.connect(r.destination),r.state===`suspended`&&(yield r.resume(),t.destroyController.signal.aborted))return!1;let a=r.createMediaElementSource(e);return t.mediaElementSource=a,a.connect(i),!0})()}cleanup(){this.mediaElementSource&&=(this.mediaElementSource.disconnect(),null),this.gainNode&&=(this.gainNode.disconnect(),null),this.audioContext&&=(this.audioContext.state!==`closed`&&this.audioContext.close(),null)}destroy(){this.destroyController.abort(),this.subscriptions.unsubscribe(),this.cleanup()}handleError(e){this.volumeMultiplierError$.next({id:Zl.errorId,category:Jl.ErrorCategory.VIDEO_PIPELINE,message:e?.message??`${Zl.errorId} exception`,thrown:e})}}i(Zl,`errorId`,`VolumeMultiplierManager`);var Ql={chunkDuration:5e3,maxParallelRequests:5};class $l{constructor(e){i(this,`current$`,new Z.ValueSubject({type:void 0})),i(this,`providerError$`,new Z.Subject),i(this,`noAvailableProvidersError$`,new Z.Subject),i(this,`volumeMultiplierError$`,new Z.Subject),i(this,`providerOutput`,{position$:new Z.ValueSubject(0),duration$:new Z.ValueSubject(1/0),playedTime$:new Z.ValueSubject(0),volume$:new Z.ValueSubject({muted:!1,volume:1}),availableVideoStreams$:new Z.ValueSubject([]),currentVideoStream$:new Z.ValueSubject(void 0),availableVideoTracks$:new Z.ValueSubject([]),currentVideoTrack$:new Z.ValueSubject(void 0),availableVideoCodecs$:new Z.ValueSubject([]),availableAudioStreams$:new Z.ValueSubject([]),currentAudioStream$:new Z.ValueSubject(void 0),availableAudioTracks$:new Z.ValueSubject([]),availableAudioCodecs$:new Z.ValueSubject([]),currentVideoSegmentLength$:new Z.ValueSubject(0),currentAudioSegmentLength$:new Z.ValueSubject(0),isAudioAvailable$:new Z.ValueSubject(!0),autoVideoTrackLimitingAvailable$:new Z.ValueSubject(!1),autoVideoTrackLimits$:new Z.ValueSubject(void 0),currentBuffer$:new Z.ValueSubject(void 0),currentNativeBuffer$:new Z.ValueSubject(void 0),videoLastDataObtainedTimestamp$:new Z.ValueSubject(void 0),isBuffering$:new Z.ValueSubject(!0),updateDurationError$:new Z.Subject,error$:new Z.Subject,fetcherError$:new Z.Subject,fetcherRecoverableError$:new Z.Subject,warning$:new Z.Subject,willSeekEvent$:new Z.Subject,soundProhibitedEvent$:new Z.Subject,seekedEvent$:new Z.Subject,loopedEvent$:new Z.Subject,endedEvent$:new Z.Subject,manifestRequested$:new Z.Subject,firstBytesManifest$:new Z.Subject,manifestReceived$:new Z.Subject,firstBytesRequested$:new Z.Subject,firstBytesReceived$:new Z.Subject,firstBytesEvent$:new Z.Subject,loadedMetadataEvent$:new Z.Subject,firstFrameEvent$:new Z.Subject,canplay$:new Z.Subject,isLive$:new Z.ValueSubject(void 0),isLiveEnded$:new Z.ValueSubject(null),canPlayLiveTailBuffer$:new Z.ValueSubject(!1),isLowLatency$:new Z.ValueSubject(!1),canChangePlaybackSpeed$:new Z.ValueSubject(!0),liveTime$:new Z.ValueSubject(void 0),liveBufferTime$:new Z.ValueSubject(void 0),liveLatency$:new Z.ValueSubject(void 0),severeStallOccurred$:new Z.Subject,availableTextTracks$:new Z.ValueSubject([]),currentTextTrack$:new Z.ValueSubject(void 0),hostname$:new Z.ValueSubject(void 0),httpConnectionType$:new Z.ValueSubject(void 0),httpConnectionReused$:new Z.ValueSubject(void 0),httpConnectionMetrics$:new Z.ValueSubject(void 0),httpDownloadMetrics$:new Z.ValueSubject(void 0),inPiP$:new Z.ValueSubject(!1),inFullscreen$:new Z.ValueSubject(!1),element$:new Z.ValueSubject(void 0),elementVisible$:new Z.ValueSubject(!0),availableSources$:new Z.ValueSubject(void 0),is3DVideo$:new Z.ValueSubject(!1),playbackState$:new Z.ValueSubject(``),getCurrentTime$:new Z.ValueSubject(null)}),i(this,`subscription`,new Z.Subscription),i(this,`screenFormatsIterator`,void 0),i(this,`chromecastFormatsIterator`,void 0),i(this,`videoCodecsIterator`,void 0),i(this,`log`,void 0),i(this,`tracer`,void 0),i(this,`params`,void 0),i(this,`failoverIndex`,void 0),i(this,`currentFailedVideoTrack`,null),i(this,`volumeMultiplierManager`,null),i(this,`dashMaxTvVideoQuality`,null),this.params=e,this.log=this.params.dependencies.logger.createComponentLog(`ProviderContainer`),this.tracer=e.dependencies.tracer.createComponentTracer(this.constructor.name);let t=Ke([...Sr(this.params.tuning),...xr(this.params.tuning)],this.params.tuning.disableHlsOnDesktop).filter(t=>Z.isNonNullable(e.sources[t])),{forceFormat:n,formatsToAvoid:r}=this.params.tuning,a=[];a=n?[n]:r.length?[...t.filter(e=>!tt.arrayIncludes(r,e)),...t.filter(e=>tt.arrayIncludes(r,e))]:t,this.log({message:`Selected formats: ${a.join(` > `)}`}),this.tracer.log(`Selected formats`,Z.flattenObject(a)),this.screenFormatsIterator=new Wl(a),this.chromecastFormatsIterator=new Wl([...Cr(!0),...Cr(!1)].filter(t=>Z.isNonNullable(e.sources[t]))),this.providerOutput.availableSources$.next(e.sources);let{volumeMultiplier:o=1,tuning:{useVolumeMultiplier:s}}=this.params;s&&o!==1&&Zl.isSupported()&&(this.volumeMultiplierManager=new Zl(this.providerOutput,this.current$,this.volumeMultiplierError$,o))}init(){z.reset(),this.subscription.add(this.initProviderErrorHandling()).add(this.params.dependencies.chromecastInitializer.connection$.subscribe(()=>{this.reinitProvider()})).add(this.providerOutput.availableVideoCodecs$.subscribe(e=>{!this.videoCodecsIterator&&e.length>1&&(this.videoCodecsIterator=new Wl(e))}))}destroy(){this.destroyProvider(),this.current$.next({type:void 0}),this.subscription.unsubscribe(),this.volumeMultiplierManager?.destroy(),this.volumeMultiplierManager=null,this.tracer.end()}initProvider(){let e=this.chooseDestination(),t=this.chooseFormat(e);if(Z.isNullable(t)){this.handleNoFormatsError(e);return}let n;try{n=this.createProvider(e,t),this.currentFailedVideoTrack=null}catch(e){this.providerError$.next({id:`ProviderNotConstructed`,category:Z.ErrorCategory.WTF,message:`Failed to create provider`,thrown:e})}n?this.current$.next({type:t,provider:n,destination:e}):this.current$.next({type:void 0})}reinitProvider(){this.tracer.log(`reinitProvider`),this.destroyProvider(),this.initProvider()}switchToNextProvider(e){this.tracer.log(`switchToNextProvider`,{destination:e}),this.destroyProvider(),this.failoverIndex=void 0,this.skipFormat(e),this.initProvider()}switchToNextVideoCodec(){this.params.tuning.dash.codecsPrioritizeEnabled&&!this.videoCodecsIterator.isLast()&&(this.tracer.log(`switchToNextVideoCodec`),this.destroyProvider(),this.videoCodecsIterator.next(),this.initProvider())}destroyProvider(){let e=this.current$.getValue().provider;if(!e)return;this.log({message:`destroyProvider`}),this.tracer.log(`destroyProvider`),e.destroy();let t=this.providerOutput.position$.getValue()*1e3,n=this.params.desiredState.seekState.getState(),r=n.state!==`none`;if(this.params.desiredState.seekState.setState({state:`requested`,position:r?n.position:t,forcePrecise:r?n.forcePrecise:!1}),e.scene3D){let t=e.scene3D.getCameraRotation();this.params.desiredState.cameraOrientation.setState({x:t.x,y:t.y})}let i=this.providerOutput.isBuffering$;i.getValue()||i.next(!0)}createProvider(e,t){switch(this.log({message:`createProvider: ${e}:${t}`}),this.tracer.log(`createProvider`,{destination:e,format:t}),e){case`SCREEN`:return this.createScreenProvider(t);case`CHROMECAST`:return this.createChromecastProvider(t);default:return Z.assertNever(e)}}createScreenProvider(e){let{sources:t,allocation:n,desiredState:r,panelSize:i}=this.params,a=this.providerOutput,s={allocation:n,source:null,desiredState:r,output:a,dependencies:this.params.dependencies,tuning:this.params.tuning,panelSize:i,skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$};switch(e){case`DASH_SEP`:case`DASH_WEBM`:case`DASH_WEBM_AV1`:case`DASH_ONDEMAND`:case`DASH_STREAMS`:{let n=this.applyFailoverHost(t[e]),r=this.applyFailoverHost(t.HLS_ONDEMAND||t.HLS);Z.assertNonNullable(n);let{useDashProviderVirtual:i,useDashProviderVirtualMobile:a}=this.params.tuning,{isMobile:c}=j.device;return!c&&i||c&&a?new ac(o(o({},s),{},{failedVideoTrack:this.currentFailedVideoTrack,source:n,sourceHls:r,forceVideoCodec:this.videoCodecsIterator?.getValue(),isOnDemand:e===`DASH_ONDEMAND`,dashMaxTvVideoQuality:this.dashMaxTvVideoQuality})):new ll(o(o({},s),{},{failedVideoTrack:this.currentFailedVideoTrack,source:n,sourceHls:r,forceVideoCodec:this.videoCodecsIterator?.getValue(),isOnDemand:e===`DASH_ONDEMAND`,dashMaxTvVideoQuality:this.dashMaxTvVideoQuality}))}case`DASH_LIVE_CMAF`:{let n=this.applyFailoverHost(t[e]);return Z.assertNonNullable(n),this.params.tuning.useDashProviderVirtual&&!j.device.isMobile||this.params.tuning.useDashProviderVirtualMobile&&j.device.isMobile?new _c(o(o({},s),{},{source:n})):new dl(o(o({},s),{},{source:n}))}case`HLS`:case`HLS_ONDEMAND`:case`HLS_FMP4`:{let n=this.applyFailoverHost(t[e]);return Z.assertNonNullable(n),new Al(o(o({},s),{},{source:n,isOnDemand:e===`HLS_ONDEMAND`}))}case`HLS_LIVE`:case`HLS_LIVE_CMAF`:{let n=this.applyFailoverHost(t[e]);return Z.assertNonNullable(n),new kl(o(o({},s),{},{source:n,config:{maxPausedTime:this.params.tuning.live.maxPausedTime},format:e}))}case`MPEG`:{let n=this.applyFailoverHost(t[e]);return Z.assertNonNullable(n),new Fl(o(o({},s),{},{source:n}))}case`DASH_LIVE`:{let n=this.applyFailoverHost(t[e]);return Z.assertNonNullable(n),new Vr(o(o({},s),{},{source:n,config:o(o({},Ql),{},{maxPausedTime:this.params.tuning.live.maxPausedTime})}))}case`WEB_RTC_LIVE`:{let i=this.applyFailoverHost(t[e]);return Z.assertNonNullable(i),new Ul({allocation:n,source:i,desiredState:r,output:a,dependencies:this.params.dependencies,tuning:this.params.tuning,skipVideoElVolumeSync$:this.params.skipVideoElVolumeSync$})}case`DASH`:case`DASH_LIVE_WEBM`:throw Error(`${e} is no longer supported`);default:return Z.assertNever(e)}}createChromecastProvider(e){let{sources:t,desiredState:n,meta:r}=this.params,i={meta:r,source:t,format:e,desiredState:n,output:this.providerOutput,dependencies:this.params.dependencies,tuning:this.params.tuning};if(this.params.tuning.chromecastPresentationApi&&this.params.dependencies.chromecastInitializer instanceof et){let{chromecastConnector:e}=this.params.dependencies.chromecastInitializer;return Z.assertNonNullable(e),new Ye(o(o({},i),{},{chromecastConnector:e}))}let a=this.params.dependencies.chromecastInitializer.connection$.getValue();return Z.assertNonNullable(a),new ft(o(o({},i),{},{connection:a}))}chooseDestination(){return this.params.dependencies.chromecastInitializer.connection$.getValue()?`CHROMECAST`:`SCREEN`}chooseFormat(e){switch(e){case`SCREEN`:return this.screenFormatsIterator.isCompleted()?void 0:this.screenFormatsIterator.getValue();case`CHROMECAST`:return this.chromecastFormatsIterator.isCompleted()?void 0:this.chromecastFormatsIterator.getValue();default:return Z.assertNever(e)}}skipFormat(e){switch(e){case`SCREEN`:return this.screenFormatsIterator.next();case`CHROMECAST`:return this.chromecastFormatsIterator.next();default:return Z.assertNever(e)}}handleNoFormatsError(e){switch(e){case`SCREEN`:this.noAvailableProvidersError$.next({forced:this.params.tuning.forceFormat,input:Object.keys(this.params.sources),supported:this.screenFormatsIterator.all()}),this.current$.next({type:void 0});return;case`CHROMECAST`:this.params.dependencies.chromecastInitializer.disconnect();return;default:return Z.assertNever(e)}}applyFailoverHost(e){if(this.failoverIndex===void 0)return e;let t=this.params.failoverHosts[this.failoverIndex];if(!t)return e;let n=e=>{let n=new URL(e);return n.host=t,n.toString()};if(e===void 0)return e;if(`type`in e){if(e.type===`raw`)return e;if(e.type===`url`)return o(o({},e),{},{url:n(e.url)})}return rt.objectFromEntries(nt.objectEntries(e).map(([e,t])=>[e,n(t)]))}initProviderErrorHandling(){let e=new Z.Subscription,t=!1,n=0;e.add(Z.merge(this.providerOutput.error$.pipe(Z.filter(e=>!this.params.tuning.ignoreAudioRendererError||!e.message||!/AUDIO_RENDERER_ERROR/gi.test(e.message))),Kl({desiredPlaybackState$:this.params.desiredState.playbackState,maxTransitionInterval:this.params.tuning.maxPlaybackTransitionInterval,playbackHangupNoDataThreshold:this.params.tuning.playbackHangupNoDataThreshold,useDelayedPlaybackHangupWithData:this.params.tuning.useDelayedPlaybackHangupWithData,position$:this.providerOutput.position$,videoLastDataObtainedTimestamp$:this.providerOutput.videoLastDataObtainedTimestamp$,providerChanged$:this.current$}).pipe(Z.map(e=>({id:`ProviderHangup:${e}`,category:Z.ErrorCategory.WTF,message:`A ${e} transition failed to complete within reasonable time`})))).subscribe(this.providerError$)),e.add(this.providerOutput.fetcherError$.subscribe(this.providerError$)),this.params.handleNetworkRecoverableErrorAsProviderError&&e.add(this.providerOutput.fetcherRecoverableError$.subscribe(this.providerError$)),e.add(this.current$.subscribe(()=>{t=!1;let n=this.params.desiredState.playbackState.transitionEnded$.pipe(Z.filter(({to:e})=>e===`playing`),Z.once()).subscribe(()=>t=!0);e.add(n)}));let r=()=>{let e=z.drain(),{logDashLiveDebug:t,sendDashLiveDebug:n}=this.params.tuning;if(t&&Z.getWindow().console.log(`===== DASH_LIVE DEBUG START ====
|
|
248
248
|
`,e.map(({time:e,data:t,stack:n})=>`${e}: ${JSON.stringify(t)}${n?`
|
|
249
249
|
`+n:``}`).join(`
|