UNPKG

@hakit/components

Version:
1 lines 1.35 MB
{"version":3,"file":"hls.light-Dw1fLTC3.cjs","sources":["../../../node_modules/hls.js/dist/hls.light.mjs"],"sourcesContent":["// https://caniuse.com/mdn-javascript_builtins_number_isfinite\nconst isFiniteNumber = Number.isFinite || function (value) {\n return typeof value === 'number' && isFinite(value);\n};\n\n// https://caniuse.com/mdn-javascript_builtins_number_issafeinteger\nconst isSafeInteger = Number.isSafeInteger || function (value) {\n return typeof value === 'number' && Math.abs(value) <= MAX_SAFE_INTEGER;\n};\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\nlet ErrorTypes = /*#__PURE__*/function (ErrorTypes) {\n // Identifier for a network error (loading error / timeout ...)\n ErrorTypes[\"NETWORK_ERROR\"] = \"networkError\";\n // Identifier for a media Error (video/parsing/mediasource error)\n ErrorTypes[\"MEDIA_ERROR\"] = \"mediaError\";\n // EME (encrypted media extensions) errors\n ErrorTypes[\"KEY_SYSTEM_ERROR\"] = \"keySystemError\";\n // Identifier for a mux Error (demuxing/remuxing)\n ErrorTypes[\"MUX_ERROR\"] = \"muxError\";\n // Identifier for all other errors\n ErrorTypes[\"OTHER_ERROR\"] = \"otherError\";\n return ErrorTypes;\n}({});\nlet ErrorDetails = /*#__PURE__*/function (ErrorDetails) {\n ErrorDetails[\"KEY_SYSTEM_NO_KEYS\"] = \"keySystemNoKeys\";\n ErrorDetails[\"KEY_SYSTEM_NO_ACCESS\"] = \"keySystemNoAccess\";\n ErrorDetails[\"KEY_SYSTEM_NO_SESSION\"] = \"keySystemNoSession\";\n ErrorDetails[\"KEY_SYSTEM_NO_CONFIGURED_LICENSE\"] = \"keySystemNoConfiguredLicense\";\n ErrorDetails[\"KEY_SYSTEM_LICENSE_REQUEST_FAILED\"] = \"keySystemLicenseRequestFailed\";\n ErrorDetails[\"KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED\"] = \"keySystemServerCertificateRequestFailed\";\n ErrorDetails[\"KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED\"] = \"keySystemServerCertificateUpdateFailed\";\n ErrorDetails[\"KEY_SYSTEM_SESSION_UPDATE_FAILED\"] = \"keySystemSessionUpdateFailed\";\n ErrorDetails[\"KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED\"] = \"keySystemStatusOutputRestricted\";\n ErrorDetails[\"KEY_SYSTEM_STATUS_INTERNAL_ERROR\"] = \"keySystemStatusInternalError\";\n ErrorDetails[\"KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR\"] = \"keySystemDestroyMediaKeysError\";\n ErrorDetails[\"KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR\"] = \"keySystemDestroyCloseSessionError\";\n ErrorDetails[\"KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR\"] = \"keySystemDestroyRemoveSessionError\";\n // Identifier for a manifest load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"MANIFEST_LOAD_ERROR\"] = \"manifestLoadError\";\n // Identifier for a manifest load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"MANIFEST_LOAD_TIMEOUT\"] = \"manifestLoadTimeOut\";\n // Identifier for a manifest parsing error - data: { url : faulty URL, reason : error reason}\n ErrorDetails[\"MANIFEST_PARSING_ERROR\"] = \"manifestParsingError\";\n // Identifier for a manifest with only incompatible codecs error - data: { url : faulty URL, reason : error reason}\n ErrorDetails[\"MANIFEST_INCOMPATIBLE_CODECS_ERROR\"] = \"manifestIncompatibleCodecsError\";\n // Identifier for a level which contains no fragments - data: { url: faulty URL, reason: \"no fragments found in level\", level: index of the bad level }\n ErrorDetails[\"LEVEL_EMPTY_ERROR\"] = \"levelEmptyError\";\n // Identifier for a level load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"LEVEL_LOAD_ERROR\"] = \"levelLoadError\";\n // Identifier for a level load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"LEVEL_LOAD_TIMEOUT\"] = \"levelLoadTimeOut\";\n // Identifier for a level parse error - data: { url : faulty URL, error: Error, reason: error message }\n ErrorDetails[\"LEVEL_PARSING_ERROR\"] = \"levelParsingError\";\n // Identifier for a level switch error - data: { level : faulty level Id, event : error description}\n ErrorDetails[\"LEVEL_SWITCH_ERROR\"] = \"levelSwitchError\";\n // Identifier for an audio track load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"AUDIO_TRACK_LOAD_ERROR\"] = \"audioTrackLoadError\";\n // Identifier for an audio track load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"AUDIO_TRACK_LOAD_TIMEOUT\"] = \"audioTrackLoadTimeOut\";\n // Identifier for a subtitle track load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"SUBTITLE_LOAD_ERROR\"] = \"subtitleTrackLoadError\";\n // Identifier for a subtitle track load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n ErrorDetails[\"SUBTITLE_TRACK_LOAD_TIMEOUT\"] = \"subtitleTrackLoadTimeOut\";\n // Identifier for fragment load error - data: { frag : fragment object, response : { code: error code, text: error text }}\n ErrorDetails[\"FRAG_LOAD_ERROR\"] = \"fragLoadError\";\n // Identifier for fragment load timeout error - data: { frag : fragment object}\n ErrorDetails[\"FRAG_LOAD_TIMEOUT\"] = \"fragLoadTimeOut\";\n // Identifier for a fragment decryption error event - data: {id : demuxer Id,frag: fragment object, reason : parsing error description }\n ErrorDetails[\"FRAG_DECRYPT_ERROR\"] = \"fragDecryptError\";\n // Identifier for a fragment parsing error event - data: { id : demuxer Id, reason : parsing error description }\n // will be renamed DEMUX_PARSING_ERROR and switched to MUX_ERROR in the next major release\n ErrorDetails[\"FRAG_PARSING_ERROR\"] = \"fragParsingError\";\n // Identifier for a fragment or part load skipped because of a GAP tag or attribute\n ErrorDetails[\"FRAG_GAP\"] = \"fragGap\";\n // Identifier for a remux alloc error event - data: { id : demuxer Id, frag : fragment object, bytes : nb of bytes on which allocation failed , reason : error text }\n ErrorDetails[\"REMUX_ALLOC_ERROR\"] = \"remuxAllocError\";\n // Identifier for decrypt key load error - data: { frag : fragment object, response : { code: error code, text: error text }}\n ErrorDetails[\"KEY_LOAD_ERROR\"] = \"keyLoadError\";\n // Identifier for decrypt key load timeout error - data: { frag : fragment object}\n ErrorDetails[\"KEY_LOAD_TIMEOUT\"] = \"keyLoadTimeOut\";\n // Triggered when an exception occurs while adding a sourceBuffer to MediaSource - data : { error : exception , mimeType : mimeType }\n ErrorDetails[\"BUFFER_ADD_CODEC_ERROR\"] = \"bufferAddCodecError\";\n // Triggered when source buffer(s) could not be created using level (manifest CODECS attribute), parsed media, or best guess codec(s) - data: { reason : error reason }\n ErrorDetails[\"BUFFER_INCOMPATIBLE_CODECS_ERROR\"] = \"bufferIncompatibleCodecsError\";\n // Identifier for a buffer append error - data: append error description\n ErrorDetails[\"BUFFER_APPEND_ERROR\"] = \"bufferAppendError\";\n // Identifier for a buffer appending error event - data: appending error description\n ErrorDetails[\"BUFFER_APPENDING_ERROR\"] = \"bufferAppendingError\";\n // Identifier for a buffer stalled error event\n ErrorDetails[\"BUFFER_STALLED_ERROR\"] = \"bufferStalledError\";\n // Identifier for a buffer full event\n ErrorDetails[\"BUFFER_FULL_ERROR\"] = \"bufferFullError\";\n // Identifier for a buffer seek over hole event\n ErrorDetails[\"BUFFER_SEEK_OVER_HOLE\"] = \"bufferSeekOverHole\";\n // Identifier for a buffer nudge on stall (playback is stuck although currentTime is in a buffered area)\n ErrorDetails[\"BUFFER_NUDGE_ON_STALL\"] = \"bufferNudgeOnStall\";\n // Identifier for a Interstitial Asset List load error - data: { url: faulty URL, response: { code: error code, text: error text } }\n ErrorDetails[\"ASSET_LIST_LOAD_ERROR\"] = \"assetListLoadError\";\n // Identifier for a Interstitial Asset List load timeout - data: { url: faulty URL, response: { code: error code, text: error text } }\n ErrorDetails[\"ASSET_LIST_LOAD_TIMEOUT\"] = \"assetListLoadTimeout\";\n // Identifier for a Interstitial Asset List parsing error - data: { url : faulty URL, reason : error reason, response : { code: error code, text: error text }}\n ErrorDetails[\"ASSET_LIST_PARSING_ERROR\"] = \"assetListParsingError\";\n // Identifier for a Interstitial Asset List parsing error - data: { url : faulty URL, reason : error reason, response : { code: error code, text: error text }}\n ErrorDetails[\"INTERSTITIAL_ASSET_ITEM_ERROR\"] = \"interstitialAssetItemError\";\n // Identifier for an internal exception happening inside hls.js while handling an event\n ErrorDetails[\"INTERNAL_EXCEPTION\"] = \"internalException\";\n // Identifier for an internal call to abort a loader\n ErrorDetails[\"INTERNAL_ABORTED\"] = \"aborted\";\n // Triggered when attachMedia fails\n ErrorDetails[\"ATTACH_MEDIA_ERROR\"] = \"attachMediaError\";\n // Uncategorized error\n ErrorDetails[\"UNKNOWN\"] = \"unknown\";\n return ErrorDetails;\n}({});\n\nlet Events = /*#__PURE__*/function (Events) {\n // Fired before MediaSource is attaching to media element\n Events[\"MEDIA_ATTACHING\"] = \"hlsMediaAttaching\";\n // Fired when MediaSource has been successfully attached to media element\n Events[\"MEDIA_ATTACHED\"] = \"hlsMediaAttached\";\n // Fired before detaching MediaSource from media element\n Events[\"MEDIA_DETACHING\"] = \"hlsMediaDetaching\";\n // Fired when MediaSource has been detached from media element\n Events[\"MEDIA_DETACHED\"] = \"hlsMediaDetached\";\n // Fired when HTMLMediaElement dispatches \"ended\" event, or stalls at end of VOD program\n Events[\"MEDIA_ENDED\"] = \"hlsMediaEnded\";\n // Fired after playback stall is resolved with playing, seeked, or ended event following BUFFER_STALLED_ERROR\n Events[\"STALL_RESOLVED\"] = \"hlsStallResolved\";\n // Fired when the buffer is going to be reset\n Events[\"BUFFER_RESET\"] = \"hlsBufferReset\";\n // Fired when we know about the codecs that we need buffers for to push into - data: {tracks : { container, codec, levelCodec, initSegment, metadata }}\n Events[\"BUFFER_CODECS\"] = \"hlsBufferCodecs\";\n // fired when sourcebuffers have been created - data: { tracks : tracks }\n Events[\"BUFFER_CREATED\"] = \"hlsBufferCreated\";\n // fired when we append a segment to the buffer - data: { segment: segment object }\n Events[\"BUFFER_APPENDING\"] = \"hlsBufferAppending\";\n // fired when we are done with appending a media segment to the buffer - data : { parent : segment parent that triggered BUFFER_APPENDING, pending : nb of segments waiting for appending for this segment parent}\n Events[\"BUFFER_APPENDED\"] = \"hlsBufferAppended\";\n // fired when the stream is finished and we want to notify the media buffer that there will be no more data - data: { }\n Events[\"BUFFER_EOS\"] = \"hlsBufferEos\";\n // fired when all buffers are full to the end of the program, after calling MediaSource.endOfStream() (unless restricted)\n Events[\"BUFFERED_TO_END\"] = \"hlsBufferedToEnd\";\n // fired when the media buffer should be flushed - data { startOffset, endOffset }\n Events[\"BUFFER_FLUSHING\"] = \"hlsBufferFlushing\";\n // fired when the media buffer has been flushed - data: { }\n Events[\"BUFFER_FLUSHED\"] = \"hlsBufferFlushed\";\n // fired to signal that a manifest loading starts - data: { url : manifestURL}\n Events[\"MANIFEST_LOADING\"] = \"hlsManifestLoading\";\n // fired after manifest has been loaded - data: { levels : [available quality levels], audioTracks : [ available audio tracks ], url : manifestURL, stats : LoaderStats }\n Events[\"MANIFEST_LOADED\"] = \"hlsManifestLoaded\";\n // fired after manifest has been parsed - data: { levels : [available quality levels], firstLevel : index of first quality level appearing in Manifest}\n Events[\"MANIFEST_PARSED\"] = \"hlsManifestParsed\";\n // fired when a level switch is requested - data: { level : id of new level }\n Events[\"LEVEL_SWITCHING\"] = \"hlsLevelSwitching\";\n // fired when a level switch is effective - data: { level : id of new level }\n Events[\"LEVEL_SWITCHED\"] = \"hlsLevelSwitched\";\n // fired when a level playlist loading starts - data: { url : level URL, level : id of level being loaded}\n Events[\"LEVEL_LOADING\"] = \"hlsLevelLoading\";\n // fired when a level playlist loading finishes - data: { details : levelDetails object, level : id of loaded level, stats : LoaderStats }\n Events[\"LEVEL_LOADED\"] = \"hlsLevelLoaded\";\n // fired when a level's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, level : id of updated level }\n Events[\"LEVEL_UPDATED\"] = \"hlsLevelUpdated\";\n // fired when a level's PTS information has been updated after parsing a fragment - data: { details : levelDetails object, level : id of updated level, drift: PTS drift observed when parsing last fragment }\n Events[\"LEVEL_PTS_UPDATED\"] = \"hlsLevelPtsUpdated\";\n // fired to notify that levels have changed after removing a level - data: { levels : [available quality levels] }\n Events[\"LEVELS_UPDATED\"] = \"hlsLevelsUpdated\";\n // fired to notify that audio track lists has been updated - data: { audioTracks : audioTracks }\n Events[\"AUDIO_TRACKS_UPDATED\"] = \"hlsAudioTracksUpdated\";\n // fired when an audio track switching is requested - data: { id : audio track id }\n Events[\"AUDIO_TRACK_SWITCHING\"] = \"hlsAudioTrackSwitching\";\n // fired when an audio track switch actually occurs - data: { id : audio track id }\n Events[\"AUDIO_TRACK_SWITCHED\"] = \"hlsAudioTrackSwitched\";\n // fired when an audio track loading starts - data: { url : audio track URL, id : audio track id }\n Events[\"AUDIO_TRACK_LOADING\"] = \"hlsAudioTrackLoading\";\n // fired when an audio track loading finishes - data: { details : levelDetails object, id : audio track id, stats : LoaderStats }\n Events[\"AUDIO_TRACK_LOADED\"] = \"hlsAudioTrackLoaded\";\n // fired when an audio tracks's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, id : track id }\n Events[\"AUDIO_TRACK_UPDATED\"] = \"hlsAudioTrackUpdated\";\n // fired to notify that subtitle track lists has been updated - data: { subtitleTracks : subtitleTracks }\n Events[\"SUBTITLE_TRACKS_UPDATED\"] = \"hlsSubtitleTracksUpdated\";\n // fired to notify that subtitle tracks were cleared as a result of stopping the media\n Events[\"SUBTITLE_TRACKS_CLEARED\"] = \"hlsSubtitleTracksCleared\";\n // fired when an subtitle track switch occurs - data: { id : subtitle track id }\n Events[\"SUBTITLE_TRACK_SWITCH\"] = \"hlsSubtitleTrackSwitch\";\n // fired when a subtitle track loading starts - data: { url : subtitle track URL, id : subtitle track id }\n Events[\"SUBTITLE_TRACK_LOADING\"] = \"hlsSubtitleTrackLoading\";\n // fired when a subtitle track loading finishes - data: { details : levelDetails object, id : subtitle track id, stats : LoaderStats }\n Events[\"SUBTITLE_TRACK_LOADED\"] = \"hlsSubtitleTrackLoaded\";\n // fired when a subtitle racks's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, id : track id }\n Events[\"SUBTITLE_TRACK_UPDATED\"] = \"hlsSubtitleTrackUpdated\";\n // fired when a subtitle fragment has been processed - data: { success : boolean, frag : the processed frag }\n Events[\"SUBTITLE_FRAG_PROCESSED\"] = \"hlsSubtitleFragProcessed\";\n // fired when a set of VTTCues to be managed externally has been parsed - data: { type: string, track: string, cues: [ VTTCue ] }\n Events[\"CUES_PARSED\"] = \"hlsCuesParsed\";\n // fired when a text track to be managed externally is found - data: { tracks: [ { label: string, kind: string, default: boolean } ] }\n Events[\"NON_NATIVE_TEXT_TRACKS_FOUND\"] = \"hlsNonNativeTextTracksFound\";\n // fired when the first timestamp is found - data: { id : demuxer id, initPTS: initPTS, timescale: timescale, frag : fragment object }\n Events[\"INIT_PTS_FOUND\"] = \"hlsInitPtsFound\";\n // fired when a fragment loading starts - data: { frag : fragment object }\n Events[\"FRAG_LOADING\"] = \"hlsFragLoading\";\n // fired when a fragment loading is progressing - data: { frag : fragment object, { trequest, tfirst, loaded } }\n // FRAG_LOAD_PROGRESS = 'hlsFragLoadProgress',\n // Identifier for fragment load aborting for emergency switch down - data: { frag : fragment object }\n Events[\"FRAG_LOAD_EMERGENCY_ABORTED\"] = \"hlsFragLoadEmergencyAborted\";\n // fired when a fragment loading is completed - data: { frag : fragment object, payload : fragment payload, stats : LoaderStats }\n Events[\"FRAG_LOADED\"] = \"hlsFragLoaded\";\n // fired when a fragment has finished decrypting - data: { id : demuxer id, frag: fragment object, payload : fragment payload, stats : { tstart, tdecrypt } }\n Events[\"FRAG_DECRYPTED\"] = \"hlsFragDecrypted\";\n // fired when Init Segment has been extracted from fragment - data: { id : demuxer id, frag: fragment object, moov : moov MP4 box, codecs : codecs found while parsing fragment }\n Events[\"FRAG_PARSING_INIT_SEGMENT\"] = \"hlsFragParsingInitSegment\";\n // fired when parsing sei text is completed - data: { id : demuxer id, frag: fragment object, samples : [ sei samples pes ] }\n Events[\"FRAG_PARSING_USERDATA\"] = \"hlsFragParsingUserdata\";\n // fired when parsing id3 is completed - data: { id : demuxer id, frag: fragment object, samples : [ id3 samples pes ] }\n Events[\"FRAG_PARSING_METADATA\"] = \"hlsFragParsingMetadata\";\n // fired when data have been extracted from fragment - data: { id : demuxer id, frag: fragment object, data1 : moof MP4 box or TS fragments, data2 : mdat MP4 box or null}\n // FRAG_PARSING_DATA = 'hlsFragParsingData',\n // fired when fragment parsing is completed - data: { id : demuxer id, frag: fragment object }\n Events[\"FRAG_PARSED\"] = \"hlsFragParsed\";\n // fired when fragment remuxed MP4 boxes have all been appended into SourceBuffer - data: { id : demuxer id, frag : fragment object, stats : LoaderStats }\n Events[\"FRAG_BUFFERED\"] = \"hlsFragBuffered\";\n // fired when fragment matching with current media position is changing - data : { id : demuxer id, frag : fragment object }\n Events[\"FRAG_CHANGED\"] = \"hlsFragChanged\";\n // Identifier for a FPS drop event - data: { currentDropped, currentDecoded, totalDroppedFrames }\n Events[\"FPS_DROP\"] = \"hlsFpsDrop\";\n // triggered when FPS drop triggers auto level capping - data: { level, droppedLevel }\n Events[\"FPS_DROP_LEVEL_CAPPING\"] = \"hlsFpsDropLevelCapping\";\n // triggered when maxAutoLevel changes - data { autoLevelCapping, levels, maxAutoLevel, minAutoLevel, maxHdcpLevel }\n Events[\"MAX_AUTO_LEVEL_UPDATED\"] = \"hlsMaxAutoLevelUpdated\";\n // Identifier for an error event - data: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data }\n Events[\"ERROR\"] = \"hlsError\";\n // fired when hls.js instance starts destroying. Different from MEDIA_DETACHED as one could want to detach and reattach a media to the instance of hls.js to handle mid-rolls for example - data: { }\n Events[\"DESTROYING\"] = \"hlsDestroying\";\n // fired when a decrypt key loading starts - data: { frag : fragment object }\n Events[\"KEY_LOADING\"] = \"hlsKeyLoading\";\n // fired when a decrypt key loading is completed - data: { frag : fragment object, keyInfo : KeyLoaderInfo }\n Events[\"KEY_LOADED\"] = \"hlsKeyLoaded\";\n // deprecated; please use BACK_BUFFER_REACHED - data : { bufferEnd: number }\n Events[\"LIVE_BACK_BUFFER_REACHED\"] = \"hlsLiveBackBufferReached\";\n // fired when the back buffer is reached as defined by the backBufferLength config option - data : { bufferEnd: number }\n Events[\"BACK_BUFFER_REACHED\"] = \"hlsBackBufferReached\";\n // fired after steering manifest has been loaded - data: { steeringManifest: SteeringManifest object, url: steering manifest URL }\n Events[\"STEERING_MANIFEST_LOADED\"] = \"hlsSteeringManifestLoaded\";\n // fired when asset list has begun loading\n Events[\"ASSET_LIST_LOADING\"] = \"hlsAssetListLoading\";\n // fired when a valid asset list is loaded\n Events[\"ASSET_LIST_LOADED\"] = \"hlsAssetListLoaded\";\n // fired when the list of Interstitial Events and Interstitial Schedule is updated\n Events[\"INTERSTITIALS_UPDATED\"] = \"hlsInterstitialsUpdated\";\n // fired when the buffer reaches an Interstitial Schedule boundary (both Primary segments and Interstitial Assets)\n Events[\"INTERSTITIALS_BUFFERED_TO_BOUNDARY\"] = \"hlsInterstitialsBufferedToBoundary\";\n // fired when a player instance for an Interstitial Asset has been created\n Events[\"INTERSTITIAL_ASSET_PLAYER_CREATED\"] = \"hlsInterstitialAssetPlayerCreated\";\n // Interstitial playback started\n Events[\"INTERSTITIAL_STARTED\"] = \"hlsInterstitialStarted\";\n // InterstitialAsset playback started\n Events[\"INTERSTITIAL_ASSET_STARTED\"] = \"hlsInterstitialAssetStarted\";\n // InterstitialAsset playback ended\n Events[\"INTERSTITIAL_ASSET_ENDED\"] = \"hlsInterstitialAssetEnded\";\n // InterstitialAsset playback errored\n Events[\"INTERSTITIAL_ASSET_ERROR\"] = \"hlsInterstitialAssetError\";\n // Interstitial playback ended\n Events[\"INTERSTITIAL_ENDED\"] = \"hlsInterstitialEnded\";\n // Interstitial schedule resumed primary playback\n Events[\"INTERSTITIALS_PRIMARY_RESUMED\"] = \"hlsInterstitialsPrimaryResumed\";\n // Interstitial players dispatch this event when playout limit is reached\n Events[\"PLAYOUT_LIMIT_REACHED\"] = \"hlsPlayoutLimitReached\";\n // Event DateRange cue \"enter\" event dispatched\n Events[\"EVENT_CUE_ENTER\"] = \"hlsEventCueEnter\";\n return Events;\n}({});\n\n/**\n * Defines each Event type and payload by Event name. Used in {@link hls.js#HlsEventEmitter} to strongly type the event listener API.\n */\n\nvar PlaylistContextType = {\n MANIFEST: \"manifest\",\n LEVEL: \"level\",\n AUDIO_TRACK: \"audioTrack\",\n SUBTITLE_TRACK: \"subtitleTrack\"\n};\nvar PlaylistLevelType = {\n MAIN: \"main\",\n AUDIO: \"audio\",\n SUBTITLE: \"subtitle\"\n};\n\n/*\n * compute an Exponential Weighted moving average\n * - https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average\n * - heavily inspired from shaka-player\n */\n\nclass EWMA {\n // About half of the estimated value will be from the last |halfLife| samples by weight.\n constructor(halfLife, estimate = 0, weight = 0) {\n this.halfLife = void 0;\n this.alpha_ = void 0;\n this.estimate_ = void 0;\n this.totalWeight_ = void 0;\n this.halfLife = halfLife;\n // Larger values of alpha expire historical data more slowly.\n this.alpha_ = halfLife ? Math.exp(Math.log(0.5) / halfLife) : 0;\n this.estimate_ = estimate;\n this.totalWeight_ = weight;\n }\n sample(weight, value) {\n const adjAlpha = Math.pow(this.alpha_, weight);\n this.estimate_ = value * (1 - adjAlpha) + adjAlpha * this.estimate_;\n this.totalWeight_ += weight;\n }\n getTotalWeight() {\n return this.totalWeight_;\n }\n getEstimate() {\n if (this.alpha_) {\n const zeroFactor = 1 - Math.pow(this.alpha_, this.totalWeight_);\n if (zeroFactor) {\n return this.estimate_ / zeroFactor;\n }\n }\n return this.estimate_;\n }\n}\n\n/*\n * EWMA Bandwidth Estimator\n * - heavily inspired from shaka-player\n * Tracks bandwidth samples and estimates available bandwidth.\n * Based on the minimum of two exponentially-weighted moving averages with\n * different half-lives.\n */\n\nclass EwmaBandWidthEstimator {\n constructor(slow, fast, defaultEstimate, defaultTTFB = 100) {\n this.defaultEstimate_ = void 0;\n this.minWeight_ = void 0;\n this.minDelayMs_ = void 0;\n this.slow_ = void 0;\n this.fast_ = void 0;\n this.defaultTTFB_ = void 0;\n this.ttfb_ = void 0;\n this.defaultEstimate_ = defaultEstimate;\n this.minWeight_ = 0.001;\n this.minDelayMs_ = 50;\n this.slow_ = new EWMA(slow);\n this.fast_ = new EWMA(fast);\n this.defaultTTFB_ = defaultTTFB;\n this.ttfb_ = new EWMA(slow);\n }\n update(slow, fast) {\n const {\n slow_,\n fast_,\n ttfb_\n } = this;\n if (slow_.halfLife !== slow) {\n this.slow_ = new EWMA(slow, slow_.getEstimate(), slow_.getTotalWeight());\n }\n if (fast_.halfLife !== fast) {\n this.fast_ = new EWMA(fast, fast_.getEstimate(), fast_.getTotalWeight());\n }\n if (ttfb_.halfLife !== slow) {\n this.ttfb_ = new EWMA(slow, ttfb_.getEstimate(), ttfb_.getTotalWeight());\n }\n }\n sample(durationMs, numBytes) {\n durationMs = Math.max(durationMs, this.minDelayMs_);\n const numBits = 8 * numBytes;\n // weight is duration in seconds\n const durationS = durationMs / 1000;\n // value is bandwidth in bits/s\n const bandwidthInBps = numBits / durationS;\n this.fast_.sample(durationS, bandwidthInBps);\n this.slow_.sample(durationS, bandwidthInBps);\n }\n sampleTTFB(ttfb) {\n // weight is frequency curve applied to TTFB in seconds\n // (longer times have less weight with expected input under 1 second)\n const seconds = ttfb / 1000;\n const weight = Math.sqrt(2) * Math.exp(-Math.pow(seconds, 2) / 2);\n this.ttfb_.sample(weight, Math.max(ttfb, 5));\n }\n canEstimate() {\n return this.fast_.getTotalWeight() >= this.minWeight_;\n }\n getEstimate() {\n if (this.canEstimate()) {\n // console.log('slow estimate:'+ Math.round(this.slow_.getEstimate()));\n // console.log('fast estimate:'+ Math.round(this.fast_.getEstimate()));\n // Take the minimum of these two estimates. This should have the effect of\n // adapting down quickly, but up more slowly.\n return Math.min(this.fast_.getEstimate(), this.slow_.getEstimate());\n } else {\n return this.defaultEstimate_;\n }\n }\n getEstimateTTFB() {\n if (this.ttfb_.getTotalWeight() >= this.minWeight_) {\n return this.ttfb_.getEstimate();\n } else {\n return this.defaultTTFB_;\n }\n }\n get defaultEstimate() {\n return this.defaultEstimate_;\n }\n destroy() {}\n}\n\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n}\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), true).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\n\nclass Logger {\n constructor(label, logger) {\n this.trace = void 0;\n this.debug = void 0;\n this.log = void 0;\n this.warn = void 0;\n this.info = void 0;\n this.error = void 0;\n const lb = `[${label}]:`;\n this.trace = noop;\n this.debug = logger.debug.bind(null, lb);\n this.log = logger.log.bind(null, lb);\n this.warn = logger.warn.bind(null, lb);\n this.info = logger.info.bind(null, lb);\n this.error = logger.error.bind(null, lb);\n }\n}\nconst noop = function noop() {};\nconst fakeLogger = {\n trace: noop,\n debug: noop,\n log: noop,\n warn: noop,\n info: noop,\n error: noop\n};\nfunction createLogger() {\n return _extends({}, fakeLogger);\n}\n\n// let lastCallTime;\n// function formatMsgWithTimeInfo(type, msg) {\n// const now = Date.now();\n// const diff = lastCallTime ? '+' + (now - lastCallTime) : '0';\n// lastCallTime = now;\n// msg = (new Date(now)).toISOString() + ' | [' + type + '] > ' + msg + ' ( ' + diff + ' ms )';\n// return msg;\n// }\n\nfunction consolePrintFn(type, id) {\n const func = self.console[type];\n return func ? func.bind(self.console, `${id ? '[' + id + '] ' : ''}[${type}] >`) : noop;\n}\nfunction getLoggerFn(key, debugConfig, id) {\n return debugConfig[key] ? debugConfig[key].bind(debugConfig) : consolePrintFn(key, id);\n}\nconst exportedLogger = createLogger();\nfunction enableLogs(debugConfig, context, id) {\n // check that console is available\n const newLogger = createLogger();\n if (typeof console === 'object' && debugConfig === true || typeof debugConfig === 'object') {\n const keys = [\n // Remove out from list here to hard-disable a log-level\n // 'trace',\n 'debug', 'log', 'info', 'warn', 'error'];\n keys.forEach(key => {\n newLogger[key] = getLoggerFn(key, debugConfig, id);\n });\n // Some browsers don't allow to use bind on console object anyway\n // fallback to default if needed\n try {\n newLogger.log(`Debug logs enabled for \"${context}\" in hls.js version ${\"1.6.13\"}`);\n } catch (e) {\n /* log fn threw an exception. All logger methods are no-ops. */\n return createLogger();\n }\n // global exported logger uses the same functions as new logger without `id`\n keys.forEach(key => {\n exportedLogger[key] = getLoggerFn(key, debugConfig);\n });\n } else {\n // Reset global exported logger\n _extends(exportedLogger, newLogger);\n }\n return newLogger;\n}\nconst logger = exportedLogger;\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar emptyEs;\nvar hasRequiredEmptyEs;\nfunction requireEmptyEs() {\n if (hasRequiredEmptyEs) return emptyEs;\n hasRequiredEmptyEs = 1;\n // This file is inserted as a shim for modules which we do not want to include into the distro.\n // This replacement is done in the \"alias\" plugin of the rollup config.\n // Use a ES dedicated file as Rollup assigns an object in the output\n // For example: \"var KeySystemFormats = emptyEs.KeySystemFormats;\"\n emptyEs = {};\n return emptyEs;\n}\n\nvar emptyEsExports = requireEmptyEs();\nvar Cues = /*@__PURE__*/getDefaultExportFromCjs(emptyEsExports);\n\nfunction getMediaSource(preferManagedMediaSource = true) {\n if (typeof self === 'undefined') return undefined;\n const mms = (preferManagedMediaSource || !self.MediaSource) && self.ManagedMediaSource;\n return mms || self.MediaSource || self.WebKitMediaSource;\n}\nfunction isManagedMediaSource(source) {\n return typeof self !== 'undefined' && source === self.ManagedMediaSource;\n}\nfunction isCompatibleTrackChange(currentTracks, requiredTracks) {\n const trackNames = Object.keys(currentTracks);\n const requiredTrackNames = Object.keys(requiredTracks);\n const trackCount = trackNames.length;\n const requiredTrackCount = requiredTrackNames.length;\n return !trackCount || !requiredTrackCount || trackCount === requiredTrackCount && !trackNames.some(name => requiredTrackNames.indexOf(name) === -1);\n}\n\n// http://stackoverflow.com/questions/8936984/uint8array-to-string-in-javascript/22373197\n// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt\n/* utf.js - UTF-8 <=> UTF-16 convertion\n *\n * Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>\n * Version: 1.0\n * LastModified: Dec 25 1999\n * This library is free. You can redistribute it and/or modify it.\n */\n/**\n * Converts a UTF-8 array to a string.\n *\n * @param array - The UTF-8 array to convert\n *\n * @returns The string\n *\n * @group Utils\n *\n * @beta\n */\nfunction utf8ArrayToStr(array, exitOnNull = false) {\n if (typeof TextDecoder !== 'undefined') {\n const decoder = new TextDecoder('utf-8');\n const decoded = decoder.decode(array);\n if (exitOnNull) {\n // grab up to the first null\n const idx = decoded.indexOf('\\0');\n return idx !== -1 ? decoded.substring(0, idx) : decoded;\n }\n // remove any null characters\n return decoded.replace(/\\0/g, '');\n }\n const len = array.length;\n let c;\n let char2;\n let char3;\n let out = '';\n let i = 0;\n while (i < len) {\n c = array[i++];\n if (c === 0x00 && exitOnNull) {\n return out;\n } else if (c === 0x00 || c === 0x03) {\n // If the character is 3 (END_OF_TEXT) or 0 (NULL) then skip it\n continue;\n }\n switch (c >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n // 0xxxxxxx\n out += String.fromCharCode(c);\n break;\n case 12:\n case 13:\n // 110x xxxx 10xx xxxx\n char2 = array[i++];\n out += String.fromCharCode((c & 0x1f) << 6 | char2 & 0x3f);\n break;\n case 14:\n // 1110 xxxx 10xx xxxx 10xx xxxx\n char2 = array[i++];\n char3 = array[i++];\n out += String.fromCharCode((c & 0x0f) << 12 | (char2 & 0x3f) << 6 | (char3 & 0x3f) << 0);\n break;\n }\n }\n return out;\n}\n\n/**\n * hex dump helper class\n */\n\nfunction arrayToHex(array) {\n let str = '';\n for (let i = 0; i < array.length; i++) {\n let h = array[i].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n str += h;\n }\n return str;\n}\nfunction hexToArrayBuffer(str) {\n return Uint8Array.from(str.replace(/^0x/, '').replace(/([\\da-fA-F]{2}) ?/g, '0x$1 ').replace(/ +$/, '').split(' ')).buffer;\n}\n\nvar urlToolkit = {exports: {}};\n\nvar hasRequiredUrlToolkit;\n\nfunction requireUrlToolkit () {\n\tif (hasRequiredUrlToolkit) return urlToolkit.exports;\n\thasRequiredUrlToolkit = 1;\n\t(function (module, exports) {\n\t\t// see https://tools.ietf.org/html/rfc1808\n\n\t\t(function (root) {\n\t\t var URL_REGEX =\n\t\t /^(?=((?:[a-zA-Z0-9+\\-.]+:)?))\\1(?=((?:\\/\\/[^\\/?#]*)?))\\2(?=((?:(?:[^?#\\/]*\\/)*[^;?#\\/]*)?))\\3((?:;[^?#]*)?)(\\?[^#]*)?(#[^]*)?$/;\n\t\t var FIRST_SEGMENT_REGEX = /^(?=([^\\/?#]*))\\1([^]*)$/;\n\t\t var SLASH_DOT_REGEX = /(?:\\/|^)\\.(?=\\/)/g;\n\t\t var SLASH_DOT_DOT_REGEX = /(?:\\/|^)\\.\\.\\/(?!\\.\\.\\/)[^\\/]*(?=\\/)/g;\n\n\t\t var URLToolkit = {\n\t\t // If opts.alwaysNormalize is true then the path will always be normalized even when it starts with / or //\n\t\t // E.g\n\t\t // With opts.alwaysNormalize = false (default, spec compliant)\n\t\t // http://a.com/b/cd + /e/f/../g => http://a.com/e/f/../g\n\t\t // With opts.alwaysNormalize = true (not spec compliant)\n\t\t // http://a.com/b/cd + /e/f/../g => http://a.com/e/g\n\t\t buildAbsoluteURL: function (baseURL, relativeURL, opts) {\n\t\t opts = opts || {};\n\t\t // remove any remaining space and CRLF\n\t\t baseURL = baseURL.trim();\n\t\t relativeURL = relativeURL.trim();\n\t\t if (!relativeURL) {\n\t\t // 2a) If the embedded URL is entirely empty, it inherits the\n\t\t // entire base URL (i.e., is set equal to the base URL)\n\t\t // and we are done.\n\t\t if (!opts.alwaysNormalize) {\n\t\t return baseURL;\n\t\t }\n\t\t var basePartsForNormalise = URLToolkit.parseURL(baseURL);\n\t\t if (!basePartsForNormalise) {\n\t\t throw new Error('Error trying to parse base URL.');\n\t\t }\n\t\t basePartsForNormalise.path = URLToolkit.normalizePath(\n\t\t basePartsForNormalise.path\n\t\t );\n\t\t return URLToolkit.buildURLFromParts(basePartsForNormalise);\n\t\t }\n\t\t var relativeParts = URLToolkit.parseURL(relativeURL);\n\t\t if (!relativeParts) {\n\t\t throw new Error('Error trying to parse relative URL.');\n\t\t }\n\t\t if (relativeParts.scheme) {\n\t\t // 2b) If the embedded URL starts with a scheme name, it is\n\t\t // interpreted as an absolute URL and we are done.\n\t\t if (!opts.alwaysNormalize) {\n\t\t return relativeURL;\n\t\t }\n\t\t relativeParts.path = URLToolkit.normalizePath(relativeParts.path);\n\t\t return URLToolkit.buildURLFromParts(relativeParts);\n\t\t }\n\t\t var baseParts = URLToolkit.parseURL(baseURL);\n\t\t if (!baseParts) {\n\t\t throw new Error('Error trying to parse base URL.');\n\t\t }\n\t\t if (!baseParts.netLoc && baseParts.path && baseParts.path[0] !== '/') {\n\t\t // If netLoc missing and path doesn't start with '/', assume everthing before the first '/' is the netLoc\n\t\t // This causes 'example.com/a' to be handled as '//example.com/a' instead of '/example.com/a'\n\t\t var pathParts = FIRST_SEGMENT_REGEX.exec(baseParts.path);\n\t\t baseParts.netLoc = pathParts[1];\n\t\t baseParts.path = pathParts[2];\n\t\t }\n\t\t if (baseParts.netLoc && !baseParts.path) {\n\t\t baseParts.path = '/';\n\t\t }\n\t\t var builtParts = {\n\t\t // 2c) Otherwise, the embedded URL inherits the scheme of\n\t\t // the base URL.\n\t\t scheme: baseParts.scheme,\n\t\t netLoc: relativeParts.netLoc,\n\t\t path: null,\n\t\t params: relativeParts.params,\n\t\t query: relativeParts.query,\n\t\t fragment: relativeParts.fragment,\n\t\t };\n\t\t if (!relativeParts.netLoc) {\n\t\t // 3) If the embedded URL's <net_loc> is non-empty, we skip to\n\t\t // Step 7. Otherwise, the embedded URL inherits the <net_loc>\n\t\t // (if any) of the base URL.\n\t\t builtParts.netLoc = baseParts.netLoc;\n\t\t // 4) If the embedded URL path is preceded by a slash \"/\", the\n\t\t // path is not relative and we skip to Step 7.\n\t\t if (relativeParts.path[0] !== '/') {\n\t\t if (!relativeParts.path) {\n\t\t // 5) If the embedded URL path is empty (and not preceded by a\n\t\t // slash), then the embedded URL inherits the base URL path\n\t\t builtParts.path = baseParts.path;\n\t\t // 5a) if the embedded URL's <params> is non-empty, we skip to\n\t\t // step 7; otherwise, it inherits the <params> of the base\n\t\t // URL (if any) and\n\t\t if (!relativeParts.params) {\n\t\t builtParts.params = baseParts.params;\n\t\t // 5b) if the embedded URL's <query> is non-empty, we skip to\n\t\t // step 7; otherwise, it inherits the <query> of the base\n\t\t // URL (if any) and we skip to step 7.\n\t\t if (!relativeParts.query) {\n\t\t builtParts.query = baseParts.query;\n\t\t }\n\t\t }\n\t\t } else {\n\t\t // 6) The last segment of the base URL's path (anything\n\t\t // following the rightmost slash \"/\", or the entire path if no\n\t\t // slash is present) is removed and the embedded URL's path is\n\t\t // appended in its place.\n\t\t var baseURLPath = baseParts.path;\n\t\t var newPath =\n\t\t baseURLPath.substring(0, baseURLPath.lastIndexOf('/') + 1) +\n\t\t relativeParts.path;\n\t\t builtParts.path = URLToolkit.normalizePath(newPath);\n\t\t }\n\t\t }\n\t\t }\n\t\t if (builtParts.path === null) {\n\t\t builtParts.path = opts.alwaysNormalize\n\t\t ? URLToolkit.normalizePath(relativeParts.path)\n\t\t : relativeParts.path;\n\t\t }\n\t\t return URLToolkit.buildURLFromParts(builtParts);\n\t\t },\n\t\t parseURL: function (url) {\n\t\t var parts = URL_REGEX.exec(url);\n\t\t if (!parts) {\n\t\t return null;\n\t\t }\n\t\t return {\n\t\t scheme: parts[1] || '',\n\t\t netLoc: parts[2] || '',\n\t\t path: parts[3] || '',\n\t\t params: parts[4] || '',\n\t\t query: parts[5] || '',\n\t\t fragment: parts[6] || '',\n\t\t };\n\t\t },\n\t\t normalizePath: function (path) {\n\t\t // The following operations are\n\t\t // then applied, in order, to the new path:\n\t\t // 6a) All occurrences of \"./\", where \".\" is a complete path\n\t\t // segment, are removed.\n\t\t // 6b) If the path ends with \".\" as a complete path segment,\n\t\t // that \".\" is removed.\n\t\t path = path.split('').reverse().join('').replace(SLASH_DOT_REGEX, '');\n\t\t // 6c) All occurrences of \"<segment>/../\", where <segment> is a\n\t\t // complete path segment not equal to \"..\", are removed.\n\t\t // Removal of these path segments is performed iteratively,\n\t\t // removing the leftmost matching pattern on each iteration,\n\t\t // until no matching pattern remains.\n\t\t // 6d) If the path ends with \"<segment>/..\", where <segment> is a\n\t\t // complete path segment not equal to \"..\", that\n\t\t // \"<segment>/..\" is removed.\n\t\t while (\n\t\t path.length !== (path = path.replace(SLASH_DOT_DOT_REGEX, '')).length\n\t\t ) {}\n\t\t return path.split('').reverse().join('');\n\t\t },\n\t\t buildURLFromParts: function (parts) {\n\t\t return (\n\t\t parts.scheme +\n\t\t parts.netLoc +\n\t\t parts.path +\n\t\t parts.params +\n\t\t parts.query +\n\t\t parts.fragment\n\t\t );\n\t\t },\n\t\t };\n\n\t\t module.exports = URLToolkit;\n\t\t})(); \n\t} (urlToolkit));\n\treturn urlToolkit.exports;\n}\n\nvar urlToolkitExports = requireUrlToolkit();\n\nclass LoadStats {\n constructor() {\n this.aborted = false;\n this.loaded = 0;\n this.retry = 0;\n this.total = 0;\n this.chunkCount = 0;\n this.bwEstimate = 0;\n this.loading = {\n start: 0,\n first: 0,\n end: 0\n };\n this.parsing = {\n start: 0,\n end: 0\n };\n this.buffering = {\n start: 0,\n first: 0,\n end: 0\n };\n }\n}\n\nvar ElementaryStreamTypes = {\n AUDIO: \"audio\",\n VIDEO: \"video\",\n AUDIOVIDEO: \"audiovideo\"\n};\nclass BaseSegment {\n constructor(base) {\n this._byteRange = null;\n this._url = null;\n this._stats = null;\n this._streams = null;\n // baseurl is the URL to the playlist\n this.base = void 0;\n // relurl is the portion of the URL that comes from inside the playlist.\n this.relurl = void 0;\n if (typeof base === 'string') {\n base = {\n url: base\n };\n }\n this.base = base;\n makeEnumerable(this, 'stats');\n }\n\n // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array\n setByteRange(value, previous) {\n const params = value.split('@', 2);\n let start;\n if (params.length === 1) {\n start = (previous == null ? void 0 : previous.byteRangeEndOffset) || 0;\n } else {\n start = parseInt(params[1]);\n }\n this._byteRange = [start, parseInt(params[0]) + start];\n }\n get baseurl() {\n return this.base.url;\n }\n get byteRange() {\n if (this._byteRange === null) {\n return [];\n }\n return this._byteRange;\n }\n get byteRangeStartOffset() {\n return this.byteRange[0];\n }\n get byteRangeEndOffset() {\n return this.byteRange[1];\n }\n get elementaryStreams() {\n if (this._streams === null) {\n this._streams = {\n [ElementaryStreamTypes.AUDIO]: null,\n [ElementaryStreamTypes.VIDEO]: null,\n [ElementaryStreamTypes.AUDIOVIDEO]: null\n };\n }\n return this._streams;\n }\n set elementaryStreams(value) {\n this._streams = value;\n }\n get hasStats() {\n return this._stats !== null;\n }\n get hasStreams() {\n return this._streams !== null;\n }\n get stats() {\n if (this._stats === null) {\n this._stats = new LoadStats();\n }\n return this._stats;\n }\n set stats(value) {\n this._stats = value;\n }\n get url() {\n if (!this._url && this.baseurl && this.relurl) {\n this._url = urlToolkitExports.buildAbsoluteURL(this.baseurl, this.relurl, {\n alwaysNormalize: true\n });\n }\n return this._url || '';\n }\n set url(value) {\n this._url = value;\n }\n clearElementaryStreamInfo() {\n const {\n elementaryStreams\n } = this;\n elementaryStreams[ElementaryStreamTypes.AUDIO] = null;\n elementaryStreams[ElementaryStreamTypes.VIDEO] = null;\n elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;\n }\n}\nfunction isMediaFragment(frag) {\n return frag.sn !== 'initSegment';\n}\n\n/**\n * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.\n */\nclass Fragment extends BaseSegment {\n constructor(type, base) {\n super(base);\n this._decryptdata = null;\n this._programDateTime = null;\n this._ref = null;\n // Approximate bit rate of the fragment expressed in bits per second (bps) as indicated by the last EXT-X-BITRATE (kbps) tag\n this._bitrate = void 0;\n this.rawProgramDateTime = null;\n this.tagList = [];\n // EXTINF has to be present for a m3u8 to be considered valid\n this.duration = 0;\n // sn notates the sequence number for a segment, and if set to a string can be 'initSegment'\n this.sn = 0;\n // levelkeys are the EXT-X-KEY tags that apply to this segment for decryption\n // core difference from the private field _decryptdata is the lack of the initialized IV\n // _decryptdata will set the IV for this segment based on the segment number in the fragment\n this.levelkeys = void 0;\n // A string representing the fragment type\n this.type = void 0;\n // A reference to the loader. Set while the fragment is loading, and removed afterwards. Used to abort fragment loading\n this.loader = null;\n // A reference to the key loader. Set while the key is loading, and removed afterwards. Used to abort key loading\n this.keyLoader = null;\n // The level/track index to which the fragment belongs\n this.level = -1;\n // The continuity counter of the fragment\n this.cc = 0;\n // The starting Presentation Time Stamp (PTS) of the fragment. Set after transmux complete.\n this.startPTS = void 0;\n // The ending Presentation Time Stamp (PTS) of the fragment. Set after transmux complete.\n this.endPTS = void 0;\n // The starting Decode Time Stamp (DTS) of the fragment. Set after transmux complete.\n this.startDTS = void 0;\n // The ending Decode Time Stamp (DTS) of the fragment. Set after transmux complete.\n this.endDTS = void 0;\n // The start time of the fragment, as listed in the manifest. Updated after transmux complete.\n this.start = 0;\n // The offset time (seconds) of the fragment from the start of the Playlist\n this.playlistOffset = 0;\n // Set by `updateFragPTSDTS` in level-helper\n this.deltaPTS = void 0;\n // The maximum starting Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.\n this.maxStartPTS = void 0;\n // The minimum ending Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.\n this.minEndPTS = void 0;\n // Init Segment bytes (unset for media segments)\n this.data = void 0;\n // A flag indicating whether the segment was downloaded in order to test bitrate, and was not buffered\n this.bitrateTest = false;\n // #EXTINF segment title\n this.title = null;\n // The Media Initialization Section for this segment\n this.initSegment = null;\n // Fragment is the last fragment in the media playlist\n this.endList = void 0;\n // Fragment is marked by an EXT-X-GAP tag indicating that it does not contain media data and should not be loaded\n this.gap = void 0;\n // Deprecated\n this.urlId = 0;\n this.type = type;\n }\n get byteLength() {\n if (this.hasStats) {\n const total = this.stats.total;\n if (total) {\n return total;\n }\n }\n if (this.byteRange.length) {\n const start = this.byteRange[0];\n const end = this.byteRange[1];\n if (isFiniteNumber(start) && isFiniteNumber(end)) {\n return end - start;\n }\n }\n return null;\n }\n get bitrate() {\n if (this.byteLength) {\n return this.byteLength * 8 / this.duration;\n }\n if (this._bitrate) {\n return this._bitrate;\n }\n return null;\n }\n set bitrate(value) {\n this._bitrate = value;\n }\n get decryptdata() {\n var _this$_decryptdata;\n const {\n levelkeys\n } = this;\n if (!levelkeys || levelkeys.NONE) {\n return null;\n }\n if (levelkeys.identity) {\n if (!this._decryptdata) {\n this._decryptdata = levelkeys.identity.getDecryptData(this.sn);\n }\n } else if (!((_this$_decryptdata =