{"version":3,"sources":["plyr.polyfilled.js","node_modules/.pnpm/custom-event-polyfill@1.0.7/node_modules/custom-event-polyfill/polyfill.js","node_modules/.pnpm/rangetouch@2.0.1/node_modules/rangetouch/dist/rangetouch.mjs","node_modules/.pnpm/url-polyfill@1.1.12/node_modules/url-polyfill/url-polyfill.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/arrays.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/load-sprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/load-image.js","src/js/ui.js","src/js/listeners.js","node_modules/.pnpm/loadjs@4.2.0/node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/utils/numbers.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js"],"names":["navigator","global","factory","exports","module","define","amd","globalThis","self","Plyr","this","window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","document","createEvent","initCustomEvent","detail","call","Object","defineProperty","get","prototype","Event","commonjsGlobal","_defineProperty$1","obj","key","value","arg","input","hint","prim","Symbol","toPrimitive","undefined","res","TypeError","String","Number","_toPrimitive","_toPropertyKey","enumerable","configurable","writable","_defineProperties","t","n","length","r","_defineProperty","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","forEach","getOwnPropertyDescriptors","defineProperties","iteratorSupported","iterator","error","checkIfIteratorIsSupported","createIterator","items","next","shift","done","serializeParam","encodeURIComponent","replace","deserializeParam","decodeURIComponent","URLSearchParams","toString","set","entries","checkIfURLSearchParamsSupported","searchString","typeofSearchString","_fromString","_this","name","append","i","entry","hasOwnProperty","proto","_entries","delete","getAll","slice","has","callback","thisArg","values","searchArray","join","polyfillURLSearchParams","sort","a","b","attribute","attributes","split","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","baseElement","doc","location","toLowerCase","implementation","createHTMLDocument","createElement","head","appendChild","indexOf","err","anchorElement","body","inputElement","type","protocol","test","checkValidity","search","enableSearchUpdate","enableSearchParamsUpdate","methodName","method","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","origin","expectedPort","addPortToOrigin","port","hostname","password","username","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","setInterval","defaults","addCSS","thumbWidth","watch","getConstructor","constructor","instanceOf","isNullOrUndefined","isObject","isString","isArray","Array","isNodeList","NodeList","is","nullOrUndefined","object","number","isNaN","string","boolean","Boolean","function","Function","array","nodeList","element","Element","empty","round","concat","match","Math","max","getDecimalPlaces","parseFloat","toFixed","RangeTouch","_classCallCheck","querySelector","rangeTouch","config","init","_createClass","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","target","changedTouches","o","getAttribute","s","c","getBoundingClientRect","width","clientX","left","disabled","dispatchEvent","trigger","from","querySelectorAll","MutationObserver","addedNodes","includes","matches","observe","childList","subtree","map","documentElement","isFunction","isEmpty","weakMap","WeakMap","nodeType","ownerDocument","textNode","Text","keyboardEvent","KeyboardEvent","cue","TextTrackCue","VTTCue","track","TextTrack","kind","promise","Promise","then","startsWith","_","transitionEndEvent","events","WebkitTransition","MozTransition","OTransition","transition","find","repaint","delay","setTimeout","hidden","offsetHeight","browser","isIE","documentMode","isEdge","userAgent","isWebKit","isIPhone","maxTouchPoints","isIPadOS","platform","isIos","getDeep","path","reduce","extend","sources","source","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","insertBefore","setAttributes","setAttribute","text","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","focusVisible","focus","preventScroll","defaultCodecs","support","audio","video","check","provider","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","playsinline","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","addEventListener","removeEventListener","toggleListener","toggle","passive","capture","eventListeners","on","off","once","onceCallback","args","triggerEvent","plyr","unbindListeners","item","ready","resolve","silencePromise","dedupe","closest","prev","curr","abs","supportsCSS","declaration","CSS","supports","standardRatios","out","x","y","validateAspectRatio","every","reduceAspectRatio","ratio","height","getDivider","w","h","divider","getAspectRatio","parse","embed","videoWidth","videoHeight","setAspectRatio","isVideo","padding","aspectRatio","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","add","classNames","videoFixedRatio","roundAspectRatio","tolerance","closestRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","format","replaceAll","RegExp","toTitleCase","toUpperCase","toCamelCase","toPascalCase","getHTML","innerHTML","resources","youtube","i18n","seekTime","title","k","v","Storage","store","localStorage","getItem","json","JSON","storage","setItem","stringify","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","status","open","send","loadSprite","prefix","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","host","top","cors","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","children","node","bind","currentTrack","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","val","getElementsByTagName","nodeValue","current","buffered","percent","setProperty","updateSeekTooltip","_this$config$markers","_this$config$markers$","tooltips","tipElement","visible","show","clientRect","pageX","point","markers","points","insertAdjacentHTML","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","setMarkers","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","minimumSpeed","maximumSpeed","popup","p","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","size","restore","propertyName","setDownloadUrl","download","create","defaultAttributes","progressContainer","inner","home","backButton","urls","isEmbed","inject","floor","random","seektime","addProperty","controlPressed","labels","setMediaMetadata","mediaSession","metadata","MediaMetadata","mediaMetadata","artist","album","artwork","_this$config$markers2","_this$config$markers3","containerFragment","createDocumentFragment","pointsFragment","tipVisible","toggleTip","markerElement","marker","tip","parseUrl","safe","parser","buildUrlParams","isYouTube","languages","userLanguage","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","hash","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","noop","Console","console","Fullscreen","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","part","activeElement","first","last","shiftKey","forceFallback","nativeSupported","requestFullscreen","webkitEnterFullscreen","toggleFallback","navigationUI","action","cancelFullScreen","exit","enter","el","parentElement","proxy","trapFocus","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","useNative","pre","getRootNode","fullscreenElement","shadowRoot","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","handleKey","firstTouch","setGutter","useNativeAspectRatio","maxWidth","margin","viewportWidth","viewportHeight","clientWidth","innerWidth","clientHeight","innerHeight","resized","isAudio","ended","togglePlay","proxyEvents","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","rect","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","increaseVolume","lastKey","focusTimer","lastKeyDown","altKey","ctrlKey","metaKey","repeat","increment","decreaseVolume","usingNative","loadjs_umd","fn","createCommonjsModule","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","q","splice","executeCallbacks","success","loadFile","numTries","isLegacyIECss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","code","loadFiles","paths","loadjs","arg1","arg2","loadFn","returnPromise","deps","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","found","parseHash","hashParam","sidedock","gesture","$2","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","setMuted","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","fragment","firstChild","stripHTML","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","onPlaybackRateChange","instance","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","google","ima","manager","destroy","displayContainer","remove","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","clamp","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","_this$player$config$m","_this$player$config$m2","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","ceil","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","scrubberRect","containerRect","right","clamped","multiplier","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","crossorigin","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","getProviderByUrl","truthy","inputIsValid","fauxDuration","realDuration","Infinity","hasAudio","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","setPreviewThumbnails","thumbnailSource","static"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n})(this, (function () { 'use strict';\n\n // Polyfill for creating CustomEvents on IE9/10/11\n\n // code pulled from:\n // https://github.com/d4tocchini/customevent-polyfill\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n (function () {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function (event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n })();\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n (function (global) {\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\n\n var checkIfIteratorIsSupported = function () {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n var iteratorSupported = checkIfIteratorIsSupported();\n var createIterator = function (items) {\n var iterator = {\n next: function () {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n return iterator;\n };\n\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\n var serializeParam = function (value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n var deserializeParam = function (value) {\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n };\n var polyfillURLSearchParams = function () {\n var URLSearchParams = function (searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n var typeofSearchString = typeof searchString;\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n var proto = URLSearchParams.prototype;\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n proto.delete = function (name) {\n delete this._entries[name];\n };\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n proto.has = function (name) {\n return name in this._entries;\n };\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n proto.forEach = function (callback, thisArg) {\n var entries;\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n global.URLSearchParams = URLSearchParams;\n };\n var checkIfURLSearchParamsSupported = function () {\n try {\n var URLSearchParams = global.URLSearchParams;\n return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function' && typeof URLSearchParams.prototype.entries === 'function';\n } catch (e) {\n return false;\n }\n };\n if (!checkIfURLSearchParamsSupported()) {\n polyfillURLSearchParams();\n }\n var proto = global.URLSearchParams.prototype;\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function (searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n }\n\n // HTMLAnchorElement\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n (function (global) {\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\n\n var checkIfURLIsSupported = function () {\n try {\n var u = new global.URL('b', 'http://a');\n u.pathname = 'c d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n var polyfillURL = function () {\n var _URL = global.URL;\n var URL = function (url, base) {\n if (typeof url !== 'string') url = String(url);\n if (base && typeof base !== 'string') base = String(base);\n\n // Only create another document if the base is different from current location.\n var doc = document,\n baseElement;\n if (base && (global.location === void 0 || base !== global.location.href)) {\n base = base.toLowerCase();\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n var inputElement = doc.createElement('input');\n inputElement.type = 'url';\n inputElement.value = url;\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || !inputElement.checkValidity() && !base) {\n throw new TypeError('Invalid URL');\n }\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n });\n\n // create a linked searchParams which reflect its changes on URL\n var searchParams = new global.URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n var _this = this;\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function () {\n if (this.search !== search) {\n search = this.search;\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n this.searchParams._fromString(this.search);\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n var proto = URL.prototype;\n var linkURLWithAnchorAttribute = function (attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function () {\n return this._anchorElement[attributeName];\n },\n set: function (value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function () {\n return this._anchorElement['search'];\n },\n set: function (value) {\n this._anchorElement['search'] = value;\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function () {\n var _this = this;\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function () {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function (value) {\n this._anchorElement.href = value;\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function () {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function (value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function () {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol];\n // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function () {\n return '';\n },\n set: function (value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function () {\n return '';\n },\n set: function (value) {},\n enumerable: true\n }\n });\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n global.URL = URL;\n };\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function () {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n function _defineProperty$1(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n function _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n }\n function _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return typeof key === \"symbol\" ? key : String(key);\n }\n\n function _classCallCheck(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n function _defineProperties(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n function _createClass(e, t, n) {\n return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e;\n }\n function _defineProperty(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n function ownKeys(e, t) {\n var n = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n return n;\n }\n function _objectSpread2(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys(Object(n), !0).forEach(function (t) {\n _defineProperty(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n return e;\n }\n var defaults$1 = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n function matches$1(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n var getConstructor$1 = function (e) {\n return null != e ? e.constructor : null;\n },\n instanceOf$1 = function (e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined$1 = function (e) {\n return null == e;\n },\n isObject$1 = function (e) {\n return getConstructor$1(e) === Object;\n },\n isNumber$1 = function (e) {\n return getConstructor$1(e) === Number && !Number.isNaN(e);\n },\n isString$1 = function (e) {\n return getConstructor$1(e) === String;\n },\n isBoolean$1 = function (e) {\n return getConstructor$1(e) === Boolean;\n },\n isFunction$1 = function (e) {\n return getConstructor$1(e) === Function;\n },\n isArray$1 = function (e) {\n return Array.isArray(e);\n },\n isNodeList$1 = function (e) {\n return instanceOf$1(e, NodeList);\n },\n isElement$1 = function (e) {\n return instanceOf$1(e, Element);\n },\n isEvent$1 = function (e) {\n return instanceOf$1(e, Event);\n },\n isEmpty$1 = function (e) {\n return isNullOrUndefined$1(e) || (isString$1(e) || isArray$1(e) || isNodeList$1(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n },\n is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n nodeList: isNodeList$1,\n element: isElement$1,\n event: isEvent$1,\n empty: isEmpty$1\n };\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n return Math.round(e / t) * t;\n }\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2({}, defaults$1, {}, n), this.init());\n }\n return _createClass(e, [{\n key: \"init\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function (e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function (t) {\n if (!e.enabled || !is$1.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function (t) {\n e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function (t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type=\"range\"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null;\n var i = _objectSpread2({}, defaults$1, {}, n);\n if (is$1.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is$1.element(n) && matches$1(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function () {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n\n const getConstructor = input => input !== null && typeof input !== 'undefined' ? input.constructor : null;\n const instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n const isNullOrUndefined = input => input === null || typeof input === 'undefined';\n const isObject = input => getConstructor(input) === Object;\n const isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\n const isString = input => getConstructor(input) === String;\n const isBoolean = input => getConstructor(input) === Boolean;\n const isFunction = input => typeof input === 'function';\n const isArray = input => Array.isArray(input);\n const isWeakMap = input => instanceOf(input, WeakMap);\n const isNodeList = input => instanceOf(input, NodeList);\n const isTextNode = input => getConstructor(input) === Text;\n const isEvent = input => instanceOf(input, Event);\n const isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\n const isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n const isTrack = input => instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);\n const isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\n const isElement = input => input !== null && typeof input === 'object' && input.nodeType === 1 && typeof input.style === 'object' && typeof input.ownerDocument === 'object';\n const isEmpty = input => isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n const isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (_) {\n return false;\n }\n };\n var is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty\n };\n\n // ==========================================================================\n const transitionEndEvent = (() => {\n const element = document.createElement('span');\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n return is.string(type) ? events[type] : false;\n })();\n\n // Force repaint of element\n function repaint(element, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (_) {\n // Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n\n const isIE = Boolean(window.document.documentMode);\n const isEdge = /Edge/g.test(navigator.userAgent);\n const isWebKit = 'WebkitAppearance' in document.documentElement.style && !/Edge/g.test(navigator.userAgent);\n const isIPhone = /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n // navigator.platform may be deprecated but this check is still required\n const isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n const isIos = /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n var browser = {\n isIE,\n isEdge,\n isWebKit,\n isIPhone,\n isIPadOS,\n isIos\n };\n\n // ==========================================================================\n\n // Clone nested objects\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n // Get a nested value in an object\n function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n }\n\n // Deep extend destination object with N more objects\n function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (!is.object(source)) {\n return target;\n }\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, {\n [key]: {}\n });\n }\n extend(target[key], source[key]);\n } else {\n Object.assign(target, {\n [key]: source[key]\n });\n }\n });\n return extend(target, ...sources);\n }\n\n // ==========================================================================\n\n // Wrap an element\n function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets).reverse().forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n }\n\n // Set attributes\n function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) return;\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes).filter(([, value]) => !is.nullOrUndefined(value)).forEach(([key, value]) => element.setAttribute(key, value));\n }\n\n // Create a DocumentFragment\n function createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n }\n\n // Insert an element after another\n function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) return;\n target.parentNode.insertBefore(element, target.nextSibling);\n }\n\n // Insert a DocumentFragment\n function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) return;\n parent.appendChild(createElement(type, attributes, text));\n }\n\n // Remove element(s)\n function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n element.parentNode.removeChild(element);\n }\n\n // Remove all child elements\n function emptyElement(element) {\n if (!is.element(element)) return;\n let {\n length\n } = element.childNodes;\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n }\n\n // Replace element\n function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) return null;\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n }\n\n // Get an attribute object from a string selector\n function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) return {};\n const attributes = {};\n const existing = extend({}, existingAttributes);\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n // Get the first character\n const start = selector.charAt(0);\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\n break;\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n }\n });\n return extend(existing, attributes);\n }\n\n // Toggle hidden\n function toggleHidden(element, hidden) {\n if (!is.element(element)) return;\n let hide = hidden;\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\n }\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n element.classList[method](className);\n return element.classList.contains(className);\n }\n return false;\n }\n\n // Has class name\n function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n }\n\n // Element matches selector\n function matches(element, selector) {\n const {\n prototype\n } = Element;\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n const method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n }\n\n // Closest ancestor element matching selector (also tests element itself)\n function closest$1(element, selector) {\n const {\n prototype\n } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n const method = prototype.closest || closestElement;\n return method.call(element, selector);\n }\n\n // Find all elements\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n }\n\n // Find a single element\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n }\n\n // Set focus and tab focus class\n function setFocus(element = null, focusVisible = false) {\n if (!is.element(element)) return;\n\n // Set regular focus\n element.focus({\n preventScroll: true,\n focusVisible\n });\n }\n\n // ==========================================================================\n\n // Default codecs for checking mimetype support\n const defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n };\n\n // Check for feature support\n const support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check(type, provider) {\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput;\n return {\n api,\n ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n // While iPhone's support picture-in-picture for some apps, seemingly Safari isn't one of them\n // It will throw the following error when trying to enter picture-in-picture\n // `NotSupportedError: The Picture-in-Picture mode is not supported.`\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n return false;\n })(),\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (_) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n };\n\n // ==========================================================================\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n const supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (_) {\n // Do nothing\n }\n return supported;\n })();\n\n // Toggle event listener\n function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({\n element,\n type,\n callback,\n options\n });\n }\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n }\n\n // Bind event handler\n function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n }\n\n // Unbind event handler\n function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n }\n\n // Bind once-only event handler\n function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n }\n\n // Trigger event\n function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: {\n ...detail,\n plyr: this\n }\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n }\n\n // Unbind all cached event listeners\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const {\n element,\n type,\n callback,\n options\n } = item;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n }\n\n // Run method when / if player is ready\n function ready() {\n return new Promise(resolve => this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)).then(() => {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n }\n\n // ==========================================================================\n\n // Remove duplicates in an array\n function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n return array.filter((item, index) => array.indexOf(item) === index);\n }\n\n // Get the closest value in an array\n function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n return array.reduce((prev, curr) => Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev);\n }\n\n // ==========================================================================\n\n // Check support for a CSS declaration\n function supportsCSS(declaration) {\n if (!window || !window.CSS) {\n return false;\n }\n return window.CSS.supports(declaration);\n }\n\n // Standard/common aspect ratios\n const standardRatios = [[1, 1], [4, 3], [3, 4], [5, 4], [4, 5], [3, 2], [2, 3], [16, 10], [10, 16], [16, 9], [9, 16], [21, 9], [9, 21], [32, 9], [9, 32]].reduce((out, [x, y]) => ({\n ...out,\n [x / y]: [x, y]\n }), {});\n\n // Validate an aspect ratio\n function validateAspectRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n const ratio = is.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is.number);\n }\n\n // Reduce an aspect ratio to it's lowest form\n function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n const [width, height] = ratio;\n const getDivider = (w, h) => h === 0 ? w : getDivider(h, w % h);\n const divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n\n // Calculate an aspect ratio\n function getAspectRatio(input) {\n const parse = ratio => validateAspectRatio(ratio) ? ratio.split(':').map(Number) : null;\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({\n ratio\n } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const {\n videoWidth,\n videoHeight\n } = this.media;\n ratio = [videoWidth, videoHeight];\n }\n return reduceAspectRatio(ratio);\n }\n\n // Set aspect ratio for responsive container\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n const {\n wrapper\n } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n if (!is.array(ratio)) {\n return {};\n }\n const [x, y] = reduceAspectRatio(ratio);\n const useNative = supportsCSS(`aspect-ratio: ${x}/${y}`);\n const padding = 100 / x * y;\n if (useNative) {\n wrapper.style.aspectRatio = `${x}/${y}`;\n } else {\n wrapper.style.paddingBottom = `${padding}%`;\n }\n\n // For Vimeo we have an extra
to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.add(this.config.classNames.videoFixedRatio);\n }\n return {\n padding,\n ratio\n };\n }\n\n // Round an aspect ratio to closest standard ratio\n function roundAspectRatio(x, y, tolerance = 0.05) {\n const ratio = x / y;\n const closestRatio = closest(Object.keys(standardRatios), ratio);\n\n // Check match is within tolerance\n if (Math.abs(closestRatio - ratio) <= tolerance) {\n return standardRatios[closestRatio];\n }\n\n // No match\n return [x, y];\n }\n\n // Get the size of the viewport\n // https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions\n function getViewportSize() {\n const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n return [width, height];\n }\n\n // ==========================================================================\n const html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n if (is.empty(type)) {\n return true;\n }\n return support.mime.call(this, type);\n });\n },\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\n // Get sizes from elements\n return html5.getSources.call(this).map(source => Number(source.getAttribute('size'))).filter(Boolean);\n },\n setup() {\n if (!this.isHTML5) {\n return;\n }\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(s => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find(s => Number(s.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const {\n currentTime,\n paused,\n preload,\n readyState,\n playbackRate\n } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n\n // Generate a random ID\n function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n }\n\n // Format string\n function format(input, ...args) {\n if (is.empty(input)) return input;\n return input.toString().replace(/{(\\d+)}/g, (_, i) => args[i].toString());\n }\n\n // Get percentage\n function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n return (current / max * 100).toFixed(2);\n }\n\n // Replace all occurrences of a string in a string\n const replaceAll = (input = '', find = '', replace = '') => input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n // Convert to title case\n const toTitleCase = (input = '') => input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n\n // Convert string to pascalCase\n function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n }\n\n // Convert string to pascalCase\n function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n }\n\n // Remove HTML from a string\n function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n }\n\n // Like outerHTML, but also works for DocumentFragment\n function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n // ==========================================================================\n\n // Skip i18n for abbreviations and brand names\n const resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n const i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n let string = getDeep(config.i18n, key);\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n return '';\n }\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n class Storage {\n constructor(player) {\n _defineProperty$1(this, \"get\", key => {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n const store = window.localStorage.getItem(this.key);\n if (is.empty(store)) {\n return null;\n }\n const json = JSON.parse(store);\n return is.string(key) && key.length ? json[key] : json;\n });\n _defineProperty$1(this, \"set\", object => {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n try {\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n } catch (_) {\n // Do nothing\n }\n });\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (_) {\n return false;\n }\n }\n }\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n\n function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (_) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n request.send();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ==========================================================================\n\n // Load an external SVG sprite\n function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n const exists = () => document.getElementById(id) !== null;\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url).then(result => {\n if (is.empty(result)) {\n return;\n }\n if (useStorage) {\n try {\n window.localStorage.setItem(`${prefix}-${id}`, JSON.stringify({\n content: result\n }));\n } catch (_) {\n // Do nothing\n }\n }\n update(container, result);\n }).catch(() => {});\n }\n }\n\n // ==========================================================================\n\n // Time helpers\n const getHours = value => Math.trunc(value / 60 / 60 % 60, 10);\n const getMinutes = value => Math.trunc(value / 60 % 60, 10);\n const getSeconds = value => Math.trunc(value % 60, 10);\n\n // Format time to UI friendly string\n function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n }\n\n // ==========================================================================\n\n // TODO: Don't export a massive object - break down and create class\n const controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const host = window.location.host ? window.location.host : window.top.location.host;\n const cors = url.host !== host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors\n };\n },\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n }));\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add to \n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = {\n ...attr,\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n };\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n const badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a
`);\n }\n\n // Set position\n tipElement.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n if (this.config.markers.enabled) {\n controls.setMarkers.call(this);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n if (is.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n if (!label.length) {\n return `${value}p`;\n }\n return label;\n }\n return toTitleCase(value);\n case 'captions':\n return captions.getLabel.call(this);\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n if (!label.length) {\n return null;\n }\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality.sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language'\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language'\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Filter out invalid speeds\n this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const {\n buttons\n } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, focusVisible = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n let target = pane;\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(p => !p.hidden);\n }\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, focusVisible);\n },\n // Show/hide menu\n toggleMenu(input) {\n const {\n popup\n } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const {\n hidden\n } = popup;\n let show = hidden;\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.key === 'Escape') {\n show = false;\n } else if (is.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n return {\n width,\n height\n };\n },\n // Show a panel in the menu\n showMenuPanel(type = '', focusVisible = false) {\n const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, focusVisible);\n },\n // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = {\n class: 'plyr__controls__item'\n };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach(control => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`\n });\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`\n }));\n\n // Buffer progress\n progress.appendChild(createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n this.elements.progress = progress;\n progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let {\n volume\n } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim()\n }));\n this.elements.volume = volume;\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos && !browser.isIPadOS) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n };\n\n // Create the volume range slider\n volume.appendChild(createRange.call(this, 'volume', extend(attributes, {\n id: `plyr-volume-${data.id}`\n })));\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false\n }));\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: ''\n });\n const inner = createElement('div');\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement('button', extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n }));\n\n // Bind menu shortcuts for keyboard users\n bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n showMenuPanel.call(this, type, false);\n });\n const flex = createElement('span', null, i18n.get(type, this.config));\n const value = createElement('span', {\n class: this.config.classNames.menu.value\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: ''\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`\n });\n\n // Visible label\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, this.config)));\n\n // Screen reader label\n backButton.appendChild(createElement('span', {\n class: this.config.classNames.hidden\n }, i18n.get('menuBack', this.config)));\n\n // Go back via keyboard\n on.call(this, pane, 'keydown', event => {\n if (event.key !== 'ArrowLeft') return;\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n showMenuPanel.call(this, 'home', true);\n }, false);\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank'\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n const {\n download\n } = this.config.urls;\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider\n });\n }\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this)\n // TODO: Looping\n // loop: 'None',\n });\n\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n button.setAttribute('aria-pressed', 'false');\n Object.defineProperty(button, 'pressed', {\n configurable: true,\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n }\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons).filter(Boolean).forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const {\n classNames,\n selectors\n } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n // Set media metadata\n setMediaMetadata() {\n try {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new window.MediaMetadata({\n title: this.config.mediaMetadata.title,\n artist: this.config.mediaMetadata.artist,\n album: this.config.mediaMetadata.album,\n artwork: this.config.mediaMetadata.artwork\n });\n }\n } catch (_) {\n // Do nothing\n }\n },\n // Add markers\n setMarkers() {\n var _this$config$markers2, _this$config$markers3;\n if (!this.duration || this.elements.markers) return;\n\n // Get valid points\n const points = (_this$config$markers2 = this.config.markers) === null || _this$config$markers2 === void 0 ? void 0 : (_this$config$markers3 = _this$config$markers2.points) === null || _this$config$markers3 === void 0 ? void 0 : _this$config$markers3.filter(({\n time\n }) => time > 0 && time < this.duration);\n if (!(points !== null && points !== void 0 && points.length)) return;\n const containerFragment = document.createDocumentFragment();\n const pointsFragment = document.createDocumentFragment();\n let tipElement = null;\n const tipVisible = `${this.config.classNames.tooltip}--visible`;\n const toggleTip = show => toggleClass(tipElement, tipVisible, show);\n\n // Inject markers to progress container\n points.forEach(point => {\n const markerElement = createElement('span', {\n class: this.config.classNames.marker\n }, '');\n const left = `${point.time / this.duration * 100}%`;\n if (tipElement) {\n // Show on hover\n markerElement.addEventListener('mouseenter', () => {\n if (point.label) return;\n tipElement.style.left = left;\n tipElement.innerHTML = point.label;\n toggleTip(true);\n });\n\n // Hide on leave\n markerElement.addEventListener('mouseleave', () => {\n toggleTip(false);\n });\n }\n markerElement.addEventListener('click', () => {\n this.currentTime = point.time;\n });\n markerElement.style.left = left;\n pointsFragment.appendChild(markerElement);\n });\n containerFragment.appendChild(pointsFragment);\n\n // Inject a tooltip if needed\n if (!this.config.tooltips.seek) {\n tipElement = createElement('span', {\n class: this.config.classNames.tooltip\n }, '');\n containerFragment.appendChild(tipElement);\n }\n this.elements.markers = {\n points: pointsFragment,\n tip: tipElement\n };\n this.elements.progress.appendChild(containerFragment);\n }\n };\n\n // ==========================================================================\n\n /**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n function parseUrl(input, safe = true) {\n let url = input;\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n try {\n return new URL(url);\n } catch (_) {\n return null;\n }\n }\n\n // Convert object to URLSearchParams\n function buildUrlParams(input) {\n const params = new URLSearchParams();\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n return params;\n }\n\n // ==========================================================================\n const captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n this.elements.captions.setAttribute('dir', 'auto');\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({\n active\n } = this.config.captions);\n }\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const {\n active,\n language,\n meta,\n currentTrackNode\n } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing'\n });\n\n // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n if (this.elements) {\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n }\n\n // Update available languages in list\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n const {\n toggled\n } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n\n // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\n });\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const {\n language\n } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language\n });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks.filter(track => !this.isHTML5 || update || this.captions.meta.has(track)).filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(t => t.language === language);\n return !track; // Break iteration if there is a match\n });\n\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n return i18n.get('enabled', this.config);\n }\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(cue => cue.getCueAsHTML()).map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n\n const defaults = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.7.8/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress', 'current-time',\n // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay',\n // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',\n // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',\n // YouTube\n 'statechange',\n // Quality\n 'qualitychange',\n // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n marker: 'plyr__progress__marker',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n hash: 'data-plyr-embed-hash'\n }\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n },\n\n // Media Metadata\n mediaMetadata: {\n title: '',\n artist: '',\n album: '',\n artwork: []\n },\n // Markers\n markers: {\n enabled: false,\n points: []\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n\n const pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n\n const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n const types = {\n audio: 'audio',\n video: 'video'\n };\n\n /**\n * Get provider by URL\n * @param {String} url\n */\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n\n const noop = () => {};\n class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }\n\n class Fullscreen {\n constructor(player) {\n _defineProperty$1(this, \"onChange\", () => {\n if (!this.supported) return;\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n _defineProperty$1(this, \"toggleFallback\", (toggle = false) => {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX ?? 0,\n y: window.scrollY ?? 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n if (!hasProperty) viewport.content += `,${property}`;\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(part => part.trim() !== property).join(',');\n }\n }\n\n // Toggle button and fire events\n this.onChange();\n });\n // Trap focus inside container\n _defineProperty$1(this, \"trapFocus\", event => {\n // Bail if iOS/iPadOS, not active, not the tab key\n if (browser.isIos || browser.isIPadOS || !this.active || event.key !== 'Tab') return;\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n });\n // Update UI\n _defineProperty$1(this, \"update\", () => {\n if (this.supported) {\n let mode;\n if (this.forceFallback) mode = 'Fallback (forced)';else if (Fullscreen.nativeSupported) mode = 'Native';else mode = 'Fallback';\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.supported);\n });\n // Make an element fullscreen\n _defineProperty$1(this, \"enter\", () => {\n if (!this.supported) return;\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n });\n // Bail from fullscreen\n _defineProperty$1(this, \"exit\", () => {\n if (!this.supported) return;\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.exitFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n silencePromise(this.player.play());\n } else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n });\n // Toggle state\n _defineProperty$1(this, \"toggle\", () => {\n if (!this.active) this.enter();else this.exit();\n });\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = {\n x: 0,\n y: 0\n };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen = player.config.fullscreen.container && closest$1(this.player.elements.container, player.config.fullscreen.container);\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n this.onChange();\n });\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n this.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', event => this.trapFocus(event));\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get nativeSupported() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // If we're actually using native\n get useNative() {\n return Fullscreen.nativeSupported && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) return '';\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n return false;\n });\n return value;\n }\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is supported\n get supported() {\n return [\n // Fullscreen is enabled in config\n this.player.config.fullscreen.enabled,\n // Must be a video\n this.player.isVideo,\n // Either native is supported or fallback enabled\n Fullscreen.nativeSupported || this.player.config.fullscreen.fallback,\n // YouTube has no way to trigger fullscreen, so on devices with no native support, playsinline\n // must be enabled and iosNative fullscreen must be disabled to offer the fullscreen fallback\n !this.player.isYouTube || Fullscreen.nativeSupported || !browser.isIos || this.player.config.playsinline && !this.player.config.fullscreen.iosNative].every(Boolean);\n }\n\n // Get active state\n get active() {\n if (!this.supported) return false;\n\n // Fallback using classname\n if (!Fullscreen.nativeSupported || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n const element = !this.prefix ? this.target.getRootNode().fullscreenElement : this.target.getRootNode()[`${this.prefix}${this.property}Element`];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen ?? this.player.elements.container;\n }\n }\n\n // ==========================================================================\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n // By default it checks if it is at least 1px, but you can add a second argument to change this\n // ==========================================================================\n\n function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src\n });\n });\n }\n\n // ==========================================================================\n const ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Reset duration display\n controls.durationUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n\n // Media metadata\n if (this.config.mediaMetadata) {\n controls.setMediaMetadata.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\n\n // Wait until ui is ready\n return ready.call(this)\n // Load image\n .then(() => loadImage(poster)).catch(error => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw error;\n }).then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n Object.assign(target, {\n pressed: this.playing\n });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const {\n controls: controlsElement\n } = this.elements;\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({\n ...this.media.style\n })\n // We're only fussed about Plyr specific properties\n .filter(key => !is.empty(key) && is.string(key) && key.startsWith('--plyr')).forEach(key => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n class Listeners {\n constructor(_player) {\n // Device is touch enabled\n _defineProperty$1(this, \"firstTouch\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n // Global window & document listeners\n _defineProperty$1(this, \"global\", (toggle = true) => {\n const {\n player\n } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n });\n // Container listeners\n _defineProperty$1(this, \"container\", () => {\n const {\n player\n } = this;\n const {\n config,\n elements,\n timers\n } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const {\n controls: controlsElement\n } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n let delay = 0;\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Set a gutter for Vimeo\n const setGutter = () => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n const target = elements.wrapper;\n const {\n active\n } = player.fullscreen;\n const [videoWidth, videoHeight] = getAspectRatio.call(player);\n const useNativeAspectRatio = supportsCSS(`aspect-ratio: ${videoWidth} / ${videoHeight}`);\n\n // If not active, remove styles\n if (!active) {\n if (useNativeAspectRatio) {\n target.style.width = null;\n target.style.height = null;\n } else {\n target.style.maxWidth = null;\n target.style.margin = null;\n }\n return;\n }\n\n // Determine which dimension will overflow and constrain view\n const [viewportWidth, viewportHeight] = getViewportSize();\n const overflow = viewportWidth / viewportHeight > videoWidth / videoHeight;\n if (useNativeAspectRatio) {\n target.style.width = overflow ? 'auto' : '100%';\n target.style.height = overflow ? '100%' : 'auto';\n } else {\n target.style.maxWidth = overflow ? `${viewportHeight / videoHeight * videoWidth}px` : null;\n target.style.margin = overflow ? '0 auto' : null;\n }\n };\n\n // Handle resizing\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setGutter, 50);\n };\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const {\n target\n } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n // Set Vimeo gutter\n setGutter();\n\n // Watch for resizes\n const method = event.type === 'enterfullscreen' ? on : off;\n method.call(player, window, 'resize', resized);\n });\n });\n // Listen for media events\n _defineProperty$1(this, \"media\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(player, event));\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n\n // Call pause otherwise IE11 will start playing the video again\n player.pause();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(player, event));\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(player, event));\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, () => {\n silencePromise(player.play());\n }, 'play');\n } else {\n this.proxy(event, () => {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', event => {\n event.preventDefault();\n }, false);\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({\n speed: player.speed\n });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, event => {\n let {\n detail = {}\n } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n });\n // Run default and custom handlers\n _defineProperty$1(this, \"proxy\", (event, defaultHandler, customHandlerKey) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned !== false && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n // Trigger custom and default handlers\n _defineProperty$1(this, \"bind\", (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n on.call(player, element, type, event => this.proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n });\n // Listen for control events\n _defineProperty$1(this, \"controls\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', () => {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward');\n\n // Mute toggle\n this.bind(elements.buttons.mute, 'click', () => {\n player.muted = !player.muted;\n }, 'mute');\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(elements.buttons.download, 'click', () => {\n triggerEvent.call(player, player.media, 'download');\n }, 'download');\n\n // Fullscreen toggle\n this.bind(elements.buttons.fullscreen, 'click', () => {\n player.fullscreen.toggle();\n }, 'fullscreen');\n\n // Picture-in-Picture\n this.bind(elements.buttons.pip, 'click', () => {\n player.pip = 'toggle';\n }, 'pip');\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(elements.buttons.settings, 'keyup', event => {\n if (![' ', 'Enter'].includes(event.key)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (event.key === 'Enter') {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.key === 'Escape') {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const attribute = 'play-on-seeked';\n if (is.keyboardEvent(event) && !['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an ,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(elements.inputs.seek, inputEvent, event => {\n const seek = event.currentTarget;\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek');\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(player, event));\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebKit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n player.config.invertTime = !player.config.invertTime;\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(elements.inputs.volume, inputEvent, event => {\n player.volume = event.target.value;\n }, 'volume');\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(c => !c.contains(elements.container)).forEach(child => {\n this.bind(child, 'mouseenter mouseleave', event => {\n if (elements.controls) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }\n });\n });\n }\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const {\n config,\n timers\n } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(elements.inputs.volume, 'wheel', event => {\n // Detect \"natural\" scroll - supported on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => inverted ? -value : value);\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const {\n volume\n } = player.media;\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n const {\n key,\n type,\n altKey,\n ctrlKey,\n metaKey,\n shiftKey\n } = event;\n const pressed = type === 'keydown';\n const repeat = pressed && key === this.lastKey;\n\n // Bail if a modifier key is set\n if (altKey || ctrlKey || metaKey || shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the key for whatever reason\n if (!key) {\n return;\n }\n\n // Seek by increment\n const seekByIncrement = increment => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * increment;\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const {\n editable\n } = player.config.selectors;\n const {\n seek\n } = elements.inputs;\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n if (event.key === ' ' && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keys should we prevent default\n const preventDefault = [' ', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'c', 'f', 'k', 'l', 'm'];\n\n // If the key is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(key)) {\n event.preventDefault();\n event.stopPropagation();\n }\n switch (key) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n if (!repeat) {\n seekByIncrement(parseInt(key, 10));\n }\n break;\n case ' ':\n case 'k':\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\n break;\n case 'ArrowUp':\n player.increaseVolume(0.1);\n break;\n case 'ArrowDown':\n player.decreaseVolume(0.1);\n break;\n case 'm':\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n case 'ArrowRight':\n player.forward();\n break;\n case 'ArrowLeft':\n player.rewind();\n break;\n case 'f':\n player.fullscreen.toggle();\n break;\n case 'c':\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n case 'l':\n player.loop = !player.loop;\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (key === 'Escape' && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last key for next cycle\n this.lastKey = key;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n }\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\n var devnull = function () {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n };\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function (path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i = 0; i < x; i++) loadFile(paths[i], fn, args);\n }\n\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n function loadjs(paths, arg1, arg2) {\n var bundleId, args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // resolve Promise\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\n }\n\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n\n /**\n * Reset loadjs dependencies statuses\n */\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n };\n\n // export\n return loadjs;\n });\n });\n\n // ==========================================================================\n function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n // ==========================================================================\n\n // Parse Vimeo ID from URL\n function parseId$1(url) {\n if (is.empty(url)) {\n return null;\n }\n if (is.number(Number(url))) {\n return url;\n }\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Try to extract a hash for private videos from the URL\n function parseHash(url) {\n /* This regex matches a hexadecimal hash if given in any of these forms:\n * - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n * - [https://player.]vimeo.com/video/{id}?h={hash}[¶ms]\n * - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n * - video/{id}/{hash}\n * If matched, the hash is available in capture group 4\n */\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*&*h=|\\/)+([\\d,a-f]+)/;\n const found = url.match(regex);\n return found && found.length === 5 ? found[4] : null;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n const vimeo = {\n setup() {\n const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(() => {\n vimeo.ready.call(player);\n }).catch(error => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const {\n premium,\n referrerPolicy,\n ...frameParams\n } = config;\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n let hash = '';\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n // hash can also be set as attribute on the
\n hash = player.media.getAttribute(player.config.attributes.embed.hash);\n } else {\n hash = parseHash(source);\n }\n const hashParam = hash ? {\n h: hash\n } : {};\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: player.config.playsinline,\n // hash has to be added to iframe-URL\n ...hashParam,\n ...frameParams\n });\n const id = parseId$1(source);\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture', 'encrypted-media', 'accelerometer', 'gyroscope'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(response => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\n }\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState$1.call(player, true);\n return player.embed.play();\n };\n player.media.pause = () => {\n assurePlaybackState$1.call(player, false);\n return player.embed.pause();\n };\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let {\n currentTime\n } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const {\n embed,\n media,\n paused,\n volume\n } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume)).catch(() => {\n // Do nothing\n });\n }\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed.setPlaybackRate(input).then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n });\n\n // Volume\n let {\n volume\n } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Muted\n let {\n muted\n } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n player.embed.setMuted(toggle ? true : player.config.muted).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Loop\n let {\n loop\n } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n }\n });\n\n // Source\n let currentSrc;\n player.embed.getVideoUrl().then(value => {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(error => {\n this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n }\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n }\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = roundAspectRatio(width, height);\n setAspectRatio.call(this);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', ({\n cues = []\n }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState$1.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', () => {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', () => {\n assurePlaybackState$1.call(player, false);\n });\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\n }\n };\n\n // ==========================================================================\n\n // Parse YouTube ID from URL\n function parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n function getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n }\n const youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(data => {\n if (is.object(data)) {\n const {\n title,\n height,\n width\n } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = roundAspectRatio(width, height);\n }\n setAspectRatio.call(this);\n }).catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the